📄 ibg2.cxx
字号:
extern int ibg2ColDoubleBoundary; /* above regions are selected */
extern int ibg2ColSingleBoundary; /* one region is selected */
extern int ibg2Col_OutsideBoundary; /* one region is _outside */
typedef enum{
ibg2ColModZero, /* zero color value */
ibg2ColModMax, /* the maximum of left and right */
ibg2ColModMin, /* the minimum of left and right */
ibg2ColModSelf, /* the selected region */
ibg2ColModOther, /* the region which is not selected */
ibg2ColModBC, /* the boundary condition */
ibg2ColMod_Nothing
}ibg2ColModType;
/*
static const int ibg2ColBackground = 0;
static const int ibg2ColError = 1;
static const int ibg2ColForeground = 2;
static const int ibg2ColDefaultNode = 3;
static const int ibg2ColDefaultEdge = 4;
static const int ibg2ColDefaultFace = 5;
static const int ibg2ColDefaultBCondition = 5; /* 6,7,8 for std. BC
static const int ibg2ColDefaultRegion = 9;
static const int ibg2ColDefaultMaterial = 9;
static const int ibg2FileModNone = 0;
static const int ibg2FileModSimplex = 1;
extern wzGrid *ibg2gCurrent;
extern int (*(ibg2FileOutput[ibg2FileModMAX]))(wzGrid *g, FILE *file);
int ibg2ToSimplex(wzGrid *gg, FILE *file);
wzGrid *ibg2OtSimplex(FILE *file);
void ibg2OutputInit();
void ibg2Output(wzGrid*);
*/
wzGrid* ibg2NoGrid=0;
wzName ibg2NoName=0;
wzPoints ibg2gExternaePoints;
/*
int ibg2gFace;
int ibg2gEdge;
int ibg2gNode;
wzFloat ibg2gDmin[wzPointDim];
wzFloat ibg2gBLWait,ibg2gBLHalf,ibg2gBLObtuse,ibg2gBctg;
wzFloat ibg2gOref,ibg2gOinv,ibg2gOref2,ibg2gOmax;
wzFloat ibg2gBV;
wzFloat ibg2gPref;
int ibg2gPrefL;
*/
static wzPoint p0;
/*
void ibgOldOutput(wzGrid* grid, char* file)
{
wzNameFile = file;
ibg2Output(grid);
fflush(stdout);
}
*/
int ibg2OtSimplex(wzGrid* gg, FILE *file);
wzGrid *ibg2OtSimplex(FILE *file)
{
wzGrid* gg=(wzGrid*) malloc(sizeof(wzGrid));
ibg2OtSimplex(gg,file);
return gg;
}
#define buflen 200
int ibg2OtSimplex(wzGrid* gg, FILE *file)
{
return 0;
/*
int ccn,ccs,cc,cb,c,cl,cr,u,ul,ur,n,nn,rc,i,j,k;
int points,rpoints,fpoints,cells,rcells,fcells;
int t,cpoints,csides,num[9],gdim,xdim,fcellsguess;
ibg2CellType ftyp,rtyp;
float x,y,z;
wzFloat xmin = big1,xmax = -big1;
wzFloat ymin = big1,ymax = -big1;
wzFloat zmin = big1,zmax = -big1;
wzPoint *point;
char buffer[buflen];
fgets(buffer,buflen,file);
if(!strcmp(buffer,"SimplexGrid 2.0")) return ibg2Error;
fgets(buffer,buflen,file);
while(buffer[0]=='#') fgets(buffer,buflen,file);
if(!strcmp(buffer,"DIMENSION")) return ibg2Error;
fgets(buffer,buflen,file);
rc = sscanf(buffer,"%d",&gdim); // the grid dimension
if(rc != 1) return ibg2Error;
fgets(buffer,buflen,file);
if(!strcmp(buffer,"NODES")) return ibg2Error;
fgets(buffer,buflen,file);
xdim = wzPointDim;
rc = sscanf(buffer,"%d %d",&points,&xdim); // the number of points
if(rc <= 1) return ibg2Error;
gg->xdim() = wzPointDim;
gg->gdim() = gdim;
gg->maxPoint = gg->lastPoint = points;
gg->Point = (wzPoint*)malloc(sizeof(wzPoint)*(gg->maxPoint+10));
gg->firstRegion= gg->firstCell = gg->firstPoint = 1;
for(n=1;n<=points;n++){
fgets(buffer,buflen,file);
if(wzGridGDIM(*gg)==1){
rc = sscanf(buffer,"%f",&x); y=0; z=0;
if(rc != 1) goto readerror;
}else if(wzGridGDIM(*gg)==2){
rc = sscanf(buffer,"%f %f",&x,&y); z=0;
if(rc != 2) goto readerror;
}else if(wzGridGDIM(*gg)==3){
rc = sscanf(buffer,"%f %f %f",&x,&y,&z);
if(rc != 3) goto readerror;
}
point = &wzGridPoint(*gg,n);
if(x<xmin) xmin = x;
if(y<ymin) ymin = y;
if(z<zmin) zmin = z;
if(x>xmax) xmax = x;
if(y>ymax) ymax = y;
if(z>zmax) zmax = z;
ibg2pX(*point)[0] = x;
ibg2pX(*point)[1] = y;
ibg2pX(*point)[2] = z;
}
wzGridXMin(*gg,0) = xmin;
wzGridXMin(*gg,1) = ymin;
wzGridXMin(*gg,2) = zmin;
wzGridXMax(*gg,0) = xmax;
wzGridXMax(*gg,1) = ymax;
wzGridXMax(*gg,2) = zmax;
fgets(buffer,buflen,file);
if(!strcmp(buffer,"CELLS")) return ibg2Error;
fgets(buffer,buflen,file);
rc = sscanf(buffer,"%d",&rcells); // the number of region cells
if(rc != 1) return ibg2Error;
fcells = fcellsguess = rcells/2+30;
gg->lastRegion = rcells;
gg->firstFace = rcells+1;
gg->lastFace = gg->cells.last() = gg->maxCell = cells = rcells+fcells;
gg->firstEdge = gg->firstNode = 1;
gg->lastEdge = gg->lastNode = 0;
if(wzGridGDIM(*gg)==1){
cpoints = 2*rcells + 1;
csides = 2*rcells + 2*fcells + 1;
rtyp = wzCellType1Line; rpoints = 2;
ftyp = wzCellType1Node; fpoints = 1;
}else if(wzGridGDIM(*gg)==2){
cpoints = 3*rcells + 2*fcells + 1;
csides = 3*rcells + 4*fcells + 1;
rtyp = wzCellType2Triangle; rpoints = 3;
ftyp = wzCellType2Line; fpoints = 2;
}else if(wzGridGDIM(*gg)==3){
cpoints = 4*rcells + 3*fcells + 1;
csides = 4*rcells + 5*fcells + 1;
rtyp = wzCellType3Tetrahedron;rpoints = 4;
ftyp = wzCellType3Triangle; fpoints = 3;
}
gg->maxCPoint = cpoints;
gg->maxCSide = csides;
gg->CellType = (ibg2CellType*)malloc((cells+1)*sizeof(ibg2CellType));
gg->CellSegment = (ibg2Segment*)malloc((cells+1)*sizeof(ibg2Segment));
gg->CPointFirst = (int*)malloc((cells+1)*sizeof(int));
gg->CSideFirst = (int*)malloc((cells+1)*sizeof(int));
gg->CPoint = (int*)malloc((cpoints+1)*sizeof(int));
gg->CSide = (int*)malloc((csides+1)*sizeof(int));
gg->lastCOut = gg->maxCOut = 0;
ccn=0; ccs=0;
for(c=1;c<=rcells;c++){ // at first the rcells region cells:
fgets(buffer,buflen,file);
rc = sscanf(buffer,"%d %d %d %d %d %d %d %d %d ",
&num[0],&num[1],&num[2],&num[3],
&num[4],&num[5],&num[6],&num[7],&num[8]);
wzGridCellType(*gg,c) = rtyp;
gg->CPointFirst[c] = ccn;
gg->CSideFirst[c] = ccs;
for(i=0;i<rpoints;i++){
gg->CPoint[ccn++] = num[i]; // at first the points
}
wzGridCellSegment(*gg,c) = num[i++]; // now the segment
for(j=0;j<rpoints;i++,j++){ // now the neighbour cells:
if(num[i]>0) gg->CSide[ccs++] = num[i];
else if(num[i]<0) gg->CSide[ccs++] = rcells - num[i];
else gg->CSide[ccs++] = 0;
}
}
fgets(buffer,buflen,file);
if(!strcmp(buffer,"FACES")) return ibg2Error;
fgets(buffer,buflen,file);
rc = sscanf(buffer,"%d",&fcells); // the number of boundary face cells
if(rc != 1) return ibg2Error;
gg->lastFace = gg->cells.last() = gg->maxCell = cells = rcells+fcells;
gg->firstEdge = gg->firstNode = 1;
gg->lastEdge = gg->lastNode = 0;
if(wzGridGDIM(*gg)==1){
cpoints = 2*rcells + 1;
csides = 2*rcells + 2*fcells + 1;
}else if(wzGridGDIM(*gg)==2){
cpoints = 3*rcells + 2*fcells + 1;
csides = 3*rcells + 4*fcells + 1;
}else if(wzGridGDIM(*gg)==3){
cpoints = 4*rcells + 3*fcells + 1;
csides = 4*rcells + 5*fcells + 1;
}
gg->freeCPoint = cpoints-1;
gg->freeCSide = csides-1;
wzAssert(fcells<=fcellsguess);
wenn das fehlschlaegt, reallocieren:
gg->maxCPoint = cpoints;
gg->maxCSide = csides;
gg->CellType = (ibg2CellType*)malloc((cells+1)*sizeof(ibg2CellType));
gg->CellSegment = (ibg2Segment*)malloc((cells+1)*sizeof(ibg2Segment));
gg->CPointFirst = (int*)malloc((cells+1)*sizeof(int));
gg->CSideFirst = (int*)malloc((cells+1)*sizeof(int));
gg->CPoint = (int*)malloc((cpoints+1)*sizeof(int));
gg->CSide = (int*)malloc((csides+1)*sizeof(int));
--------
for(cb=1;cb<=fcells;c++,cb++){
for(i=0;i<9;i++) num[i]=0;
fgets(buffer,buflen,file);
rc = sscanf(buffer,"%d %d %d %d %d %d %d %d %d ",
&num[0],&num[1],&num[2],&num[3],
&num[4],&num[5],&num[6],&num[7],&num[8]);
gg->CellType[c] = ftyp;
wzAssert(gg->CellType[c] == ftyp);
gg->CPointFirst[c] = ccn; // begin of point list
gg->CSideFirst[c] = ccs; // begin of neighbour list
for(i=0;i<fpoints;i++){
gg->CPoint[ccn++] = num[i];
}
u = num[i++]; // segment number
cl = num[i++]; // left neighbour (cell or segment number)
cr = num[i++]; // right neighbour (cell or segment number)
for(j=0;j<fpoints;j++){
gg->CSide[ccs++] = rcells+num[i++];
}
gg->CSide[ccs++] = cl;
gg->CSide[ccs++] = cr;
if(u==0){ // automatical generation of boundary face segment number
if(cl>0) ul = wzGridCellSegment(*gg,cl);
else ul = -cl;
if(cr>0) ur = wzGridCellSegment(*gg,cr);
else ur = -cr;
u = ibg2DefaultFaceNr(ul,ur);
}
wzGridCellSegment(*gg,c) = u;
}
return ibg2Success;
readerror:
wzGridFree(gg);
return ibg2Error;
*/
}
void wzGridInit()
{wzCellTypeInit();}
wzName ibg2OSNoName=0;
/*
wzGrid ibg2g;
int ibg2g2find(wzFloat *xx, int c0);
*/
/*
int wzGridNRealloc(wzGrid *g)
{
wzAssert(0);
return 0;
if(g->lastPoint<g->maxPoint) return 1;
ibg2g = *g;
max=3*lastPoint/2 + 100;
if((adr=realloc(Point,max*sizeof(wzPoint)))==ibg2NULL){goto noverflow;}
Point = (wzPoint *) adr;
if(PointCell!=ibg2NULL){
if((adr=realloc(PointCell,max*sizeof(int)))==ibg2NULL)
{goto noverflow;}
PointCell = (int*)adr;
}
if(wzGridHasPointData(*this)){
if((adr=realloc(PointData,max*(NDataSize)))==ibg2NULL)
{goto noverflow;}
PointData = adr;
}
maxPoint=max-10;
*g = ibg2g;
return 1;
noverflow:
return 0;
}
*/
static int er1,er2;
/*
int wzDelaunayGenerator::gceleFace(int c, ibg2Segment m0, ibg2Segment m1)
{
int i,*cnn=ccn(c),b0,b1,first=1;
ibg2CellType t=cct(c);
wzPoint *n;
b0 = ibg2DefaultFaceNr(m0,m1);
if(m1==ibg2_OutsideRegionNr) return b0;
for(i=0;i<wzCellTypePoints(t);i++){
n = &(wzGridPoint(*this,cnn[i]));
if(ibg2pType(*n)==ibg2SRegion){
er1++;
return ibg2Error;
}else if(ibg2pType(*n)==ibg2SFace){
if((b1=ibg2pSegment(*n))!=b0){
if(first==0) {
er2++;
return ibg2Error;
}
if(b1>=ibg2SMAX){
er2++;
return ibg2Error;
}
b0=b1;
first=0; continue;
}
}
}
return b0;
return 0;
}
*/
/*
int wzDelaunayGenerator::gcellSetFace(int c, ibg2Segment m0, ibg2Segment m1)
{ibg2CellType t=cct(c);
return ibg2DefaultFaceNr(m0,m1);
}
void wzDelaunayGenerator::MaklFaces(cogeometry g)
{int c0,cl0,cs,cn,m,m1,s,i,b0;
int *cn0,*css,*csn,*cnn;
ibg2CellType t,ts,tn;
ibg2Geom = ibg2dCogeometry(g);
if(gdim()<1){
Grid.firstFace=1; Grid.lastFace=0;
return;
}
er1 = er2 = 0;
Grid.firstFace= Grid.cells.last()+1;
cl0=Grid.cells.last();
for(c0=1;c0<=cl0;c0++) if(ccdef(c0)){
if((m=ccu(c0))<=0) continue;
t=cct(c0);
for(s=0;s<wzCellTypeSides(t);s++){
cs=ccs(c0)[s];
if(ccout(cs)) m1=ibg2_OutsideRegionNr; /* Au"senrand
else if(wzCellTypeCODIM(cct(cs))!=ibg2SRegion) continue;
else if(m<=(m1=ccu(cs))) continue;
switch(wzCellTypeSSize(ts=cct(cs),s)){
case 1: tn=wzCellType1Node; break;
case 2: tn=wzCellType2Line; break;
case 3: tn=wzCellType3Triangle; break;
case 4: tn=wzCellType3Rectangle; break;
}
wzAssert(wzCellTypePoints(tn)==wzCellTypeSSize(t,s));
cn = createCell(tn);
cct(cn)=tn;
cnn=ccn(cn); csn=ccs(cn); css=ccs(cs); cn0=ccn(c0);
for(i=0;i<wzCellTypePoints(tn);i++){
cnn[i] = cn0[wzCellTypeSPoint1(t,s,i)];
}
for(i=0;i<wzCellTypeSides(tn);i++) csn[i]=0;
cnn[wzCellTypeSExtR(tn)]=c0;
cnn[wzCellTypeSExtL(tn)]=cs;
ccs(c0)[s]=cn;
for(i=0;i<wzCellTypeSides(ts);i++) if(css[i]==c0) {css[i]=cn; break;}
b0 = gceleFace(cn,m,m1);
if(b0<0){ccu(cn)=b0=gcellSetFace(cn,m,m1);}
else ccu(cn)=b0;
}
}
Grid.lastFace = Grid.cells.last();
}
void wzDelaunayGenerator::MakeEdges(cogeometry g)
{int c0,co,c1,c2,cl,m0,ni,n0,i;
int *cn0,*cno,*cn1,*cln,*cso,bs0,bs1,bso;
ibg2CellType tl,t0,t1,t2;
int s0,s1,s2,p1,p2,first;
if(gdim()<2){
Grid.firstFace=1; Grid.lastFace=0;
return;
}
ibg2Geom = ibg2dCogeometry(g);
Grid.firstEdge=Grid.cells.last()+1;
for(c0=Grid.firstFace;c0<=Grid.lastFace;c0++){t0=cct(c0);
for(s0=0;s0<wzCellTypeSides(t0);s0++){
if((ccs(c0))[s0]!=0) continue;
n0=(cn0=ccn(c0))[wzCellTypeSPoint1(t0,s0,0)];
/* search of the first (after c0) ibg2SFace-element c1:
co=c0; c1=cn0[wzCellTypeSExtR(t0)];
while(wzCellTypeCODIM(t1=cct(c1))==ibg2SRegion){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -