⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ibgt.c

📁 有限元学习研究用源代码(老外的),供科研人员参考
💻 C
字号:
/* last edit: Ilja Schmelzer -------------- 17-OCT-1994 19:09:59.45	*/
/************************************************************************/
/*                                                                      */
/*  <<< I B G >>> - Intersection - Based Grid generation package 	*/
/*                                                                      */
/*  Version 1.1 by Ilja Schmelzer   schmelzer@iaas-berlin.d400.de       */
/*                                                                      */
/*  to be distributed under IBG license conditions (see "readme.ibg")	*/
/*                                                                      */
/************************************************************************/
/* <<< Topology >>>
	Package for control of the status using only segment numbers:
*/
#include "ibg.h"
#include "ibgi.h"
#include "ibgd0.h"
#include "ibglib.h"

void ibgtNewFace(ibgTopology t, ibgSegment snew, ibgSegment old)
{ibgSegment u1,u2,*adr; int i,l;
 if(snew>=ibgSMAX)    	ibgfatal;
 if(snew<=0)	    	ibgfatal;
 if(old<=0)		return;
 if(old<ibgSMAX){
	for(i=0;i<t->fregs;i++){
		t->freg[i][snew] = t->freg[i][old];
	} return;
 }
 u1 = old/ibgSMAX;
 u2 = old%ibgSMAX;
 if(u1==u2) l=1; else l=2;
 while(t->fregs<l){
	adr = (ibgSegment*)calloc(ibgSMAX,sizeof(int));
	if(adr!=NULL){
		t->freg[t->fregs] = adr;
		t->fregs++;
	}else {ibgmessage(ibgMEOverflow); return;}
 }
 t->freg[0][snew] = u1;
 if(u1 != u2) t->freg[1][snew] = u2;
}

void ibgtAppendFRegion(ibgTopology t, ibgSegment face, ibgSegment reg)
{int i;ibgSegment *adr;
 if(face>=ibgSMAX)    	ibgfatal;
 if(face<=0)	    	ibgfatal;
 for(i=0;i<t->fregs;i++){
	if(t->freg[i][face]) continue;
	t->freg[i][face] = reg;
	return;
 }
 if(t->fregs >= IBGTMAXFREGS){ibgmessage(ibgMEMaxFRegs); return;}          
 adr = (ibgSegment*)calloc(ibgSMAX,sizeof(int));
 if(adr!=NULL){
 	t->freg[t->fregs] = adr;
 	t->freg[t->fregs][face] = reg;
 	t->fregs++;
 }else {ibgmessage(ibgMEOverflow); return;}          
}

int ibgtStatusRV(ibgTopology top, int u1, int u2){return ibgUnknown;}
int ibgtStatusFV(ibgTopology top, int u1, int u2){return ibgUnknown;}
int ibgtStatusLV(ibgTopology top, int u1, int u2){return ibgUnknown;}
int ibgtStatusVV(ibgTopology top, int u1, int u2){return ibgUnknown;}

int ibgtStatusRF(ibgTopology top, int u1, int u2)
{int i; ibgSegment r;
 if(u2<ibgSMAX){
	for(i=0;i<top->fregs;i++){
		if(r=top->freg[i][u2]){
			if(r==u1)	return ibgCorrect;
	 	}else			return ibgIncorrect;
	}
	return ibgIncorrect;
 }
 if(u1 == u2/ibgSMAX)	return ibgCorrect;
 if(u1 == u2%ibgSMAX)	return ibgCorrect;
			return ibgIncorrect;
}

int ibgtStatusFF(ibgTopology top, int u1, int u2)
{int m11,m12,m21,m22;
 if(u1<ibgSMAX)			return ibgUnknown;
 if(u2<ibgSMAX)			return ibgUnknown;
 m11 = u1/ibgSMAX;
 if(m11==(m21 = u2/ibgSMAX))	return ibgCorrect;
 if(m11==(m22 = u2%ibgSMAX))	return ibgCorrect;
 m12 = u1%ibgSMAX;
 if(m12==m21)			return ibgCorrect;
 if(m12==m22)			return ibgCorrect;
     				return ibgIncorrect;
}

int ibgtStatusRL(ibgTopology top, int u1, int u2)
{int u3;
 if((u3=u2/ibgSMAX)==0)		return ibgUnknown;
 if(u1 == u2%ibgSMAX)		return ibgCorrect;
 if(u1 == u3/ibgSMAX)		return ibgCorrect;
 if(u1 == u3%ibgSMAX)		return ibgCorrect;
				return ibgIncorrect;
}

int ibgtStatusFL(ibgTopology top, int u1, int u2)
{int m1,u3;
 if(u1<ibgSMAX)	 		return ibgUnknown;
 if((u3=u2/ibgSMAX)==0)		return ibgUnknown;
 m1 = u1/ibgSMAX;
 if(m1 == u2%ibgSMAX)		return ibgCorrect;
 if(m1 == u3/ibgSMAX)		return ibgCorrect;
 if(m1 == u3%ibgSMAX)		return ibgCorrect;
 m1 = u1%ibgSMAX;
 if(m1 == u2%ibgSMAX)		return ibgCorrect;
 if(m1 == u3/ibgSMAX)		return ibgCorrect;
 if(m1 == u3%ibgSMAX)		return ibgCorrect;
				return ibgIncorrect;
}

int ibgtStatusLL(ibgTopology top, int u1, int u2)
{int m0,m1,u3;
 if((m0=u1/ibgSMAX)==0)		return ibgUnknown;
 if((u3=u2/ibgSMAX)==0)		return ibgUnknown;
 m1 = m0%ibgSMAX;
 if(m1 == u2%ibgSMAX)		return ibgCorrect;
 if(m1 == u3/ibgSMAX)		return ibgCorrect;
 if(m1 == u3%ibgSMAX)		return ibgCorrect;
 m1 = u1%ibgSMAX;
 if(m1 == u2%ibgSMAX)		return ibgCorrect;
 if(m1 == u3/ibgSMAX)		return ibgCorrect;
 if(m1 == u3%ibgSMAX)		return ibgCorrect;
 m1 = m0/ibgSMAX;
 if(m1 == 0)			return ibgIncorrect;
 if(m1 == u2%ibgSMAX)		return ibgCorrect;
 if(m1 == u3/ibgSMAX)		return ibgCorrect;
 if(m1 == u3%ibgSMAX)		return ibgCorrect;
				return ibgIncorrect;
}

/* test of compatibility of the segments of the points of an edge */
int ibgiStatusOfEdge(ibGeometry geom, ibgPoint *n1, ibgPoint *n2)
{ibgSegment m1=ibgpSegment(*n1),m2=ibgpSegment(*n2);
 switch(ibgpType(*n1)){
 case ibgSRegion:
	switch(ibgpType(*n2)){
	case ibgSRegion:	if(m1==m2)	return ibgCorrect;
				else		return ibgIncorrect;
	case ibgSFace:		return ibgtStatusRF(&geom->top,m1,m2);
	case ibgSLine:		return ibgtStatusRL(&geom->top,m1,m2);
	case ibgSNode:	return ibgtStatusRV(&geom->top,m1,m2);
	}
 case ibgSFace:
	switch(ibgpType(*n2)){
	case ibgSRegion:	return ibgtStatusRF(&geom->top,m2,m1);
	case ibgSFace:		return ibgtStatusFF(&geom->top,m1,m2);
	case ibgSLine:		return ibgtStatusFL(&geom->top,m1,m2);
	case ibgSNode:	return ibgtStatusFV(&geom->top,m1,m2);
	}
 case ibgSLine:
	switch(ibgpType(*n2)){
	case ibgSRegion:	return ibgtStatusRL(&geom->top,m2,m1);
	case ibgSFace:		return ibgtStatusFL(&geom->top,m2,m1);
	case ibgSLine:		return ibgtStatusLL(&geom->top,m1,m2);
	case ibgSNode:	return ibgtStatusLV(&geom->top,m1,m2);
	}
 case ibgSNode:
	switch(ibgpType(*n2)){
	case ibgSRegion:	return ibgtStatusRV(&geom->top,m2,m1);
	case ibgSFace:		return ibgtStatusFV(&geom->top,m2,m1);
	case ibgSLine:		return ibgtStatusLV(&geom->top,m2,m1);
	case ibgSNode:	return ibgtStatusVV(&geom->top,m1,m2);
	}
 }
}

void	ibgtInit(ibgTopology t)
{
 t->fregs = 0;
}

void	ibgtCopy(ibgTopology tnew, ibgTopology told)
{
 *tnew = *told;
}

void	ibgtFree(ibgTopology t)
{
 ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -