ibgoinit.cxx

来自「有限元学习研究用源代码(老外的),供科研人员参考」· CXX 代码 · 共 284 行

CXX
284
字号
#include "ibgoctree.hxx"

ibgIndex 		ibgOctreeData::maxFacesOnLine = 2;
const ibgInteger	ibgOctreeData::outside =  0;
const ibgInteger	ibgOctreeData::nothing = -999999999;

ibgOctreeData::ibgOctreeData(ibgIndex dim,
		     wztensorgrid coarse,
		     cogeometry g, wzmetric r, wzchart c)
:ibgOctreeType(dim)
,nodes(sizeof(ibgPoint))
  //,cells(Corners*sizeof(ibgIndex))
,cells((Corners?Corners+1:0)*sizeof(ibgIndex))
,bnodes(2*sizeof(ibgIndex))
,lines (5*sizeof(ibgIndex))
,planes(8*sizeof(ibgIndex))
,bcells((3+ibgMaxEdgesOnCube)*sizeof(ibgIndex))
,faces(3*sizeof(ibgPoint))
,edges(4*sizeof(ibgPoint))
,vertices(5*sizeof(ibgPoint))
,nPoint(nodes.base)
,nx(nodes.base,wzOffsetOf(ibgPoint,X)),ny(nx,1),nz(ny,1)
,nOld(nodes)
,nBoundary(nodes)
,nStackInitial(nodes)
,nStackMetric(nStackInitial)
,nStackOrthogonalRegularization(nStackInitial)
,nStackLinearRegularization(nStackInitial)
,nStackFace(nStackInitial)
,nStackTest(nStackInitial)
,nMetric(nodes)
,bnBase(bnodes.base)
,bnType(bnBase,1)
,lNodeUp(lines.base)
,lNodeDown(lNodeUp,1)
,lFaceUp(lNodeUp,2)
,lFaceDown(lNodeUp,3)
,lType(lNodeUp,4)
,pEdge(planes.base)
,pType(pEdge,1)
,fPoint(faces.base)
,fPointUp(fPoint,1)
,fPointDown(fPoint,2)
,fUp(faces,4*sizeof(ibgInteger))
,fDown(fUp,1)
,fLine(fUp,2)
,fType(fUp,3)
,fStackInitial(faces)
,fStackMetric(fStackInitial)
,fStackDoubleIntersection(fStackInitial)
,fStackRegularization(fStackInitial)
,fMetric(faces)
,ePoint(edges.base)
,ePointDown(ePoint,1)
,ePointUp(ePoint,2)
,ePointFace(ePoint,3)
,eFace(edges,6*sizeof(ibgInteger))
,ePlane(eFace,1)
,eNext(eFace,2)
,eIdent(eFace,3)
,bcBase(bcells.base)
,bcType(bcBase,1)
,bcVertex(bcBase,2)
,vPoint(vertices.base)
,vPointEdge(vPoint,1)
,vPointFace(vPoint,2)
,vPointUp(vPoint,3)
,vPointDown(vPoint,4)
,vEdge(vertices,4*sizeof(ibgInteger))
,vCell(vEdge,1)
,vNext(vEdge,2)
,vIdent(vEdge,3)
,geo(g)
,ref(r)
,chart(c)
{
 initialize(coarse);
}

void ibgOctreeData::initialize(wztensorgrid coarse)
{unsigned i,pp0;
 unsigned ix,jx,kx,lx,mx,ppx,iy,jy,ky,ly,my,ppy,iz,jz,kz,lz,mz,ppz;
 int ii,i0,i1,i2,k0,k1,k2,kk,jj,o,r,fx,fy,fz;
 ibgFloat xx,dx,yy,dy,zz,dz;
 // initialization of the arrays of type wzArray<>
 nX[0].reinitialize(nx,0);
 nX[1].reinitialize(ny,0);
 nX[2].reinitialize(nz,0);
 fFlag[0].reinitialize(fPoint,0);
 fFlag[1].reinitialize(fPointUp,0);
 fFlag[2].reinitialize(fPointDown,0);
 eFlag[0].reinitialize(ePoint,0);
 eFlag[1].reinitialize(ePointFace,0);
 eFlag[2].reinitialize(ePointUp,0);
 eFlag[3].reinitialize(ePointDown,0);
 eVertex[0].reinitialize(eFace,4);
 eVertex[1].reinitialize(eFace,5);
 vFlag[0].reinitialize(vPoint,0);
 vFlag[1].reinitialize(vPointEdge,0);
 vFlag[2].reinitialize(vPointFace,0);
 vFlag[3].reinitialize(vPointUp,0);
 vFlag[4].reinitialize(vPointDown,0);
 fNext[0].reinitialize(fUp,0);
 fNext[1].reinitialize(fDown,0);
 lNode[0].reinitialize(lNodeUp,0);
 lNode[1].reinitialize(lNodeDown,0);
 pNode[0].reinitialize(pEdge,2);
 pNode[1].reinitialize(pEdge,3);
 pNode[2].reinitialize(pEdge,4);
 pNode[3].reinitialize(pEdge,5);
 pCell[0].reinitialize(pEdge,6);
 pCell[1].reinitialize(pEdge,7);
 nNext[0].reinitialize(nodes,2*GridDim);
 bnNext[0].reinitialize(nodes,2*GridDim);
 for(i=0;i<ibgMaxEdgesOnCube;i++){
   bcEdge[i].reinitialize(bcBase,3+i);
 }
 for(i=0;i<GridDim;i++){
   if(i>0) nNext[i].reinitialize(nNext[0],i);
   nNext[GridDim+i].reinitialize(nNext[0],GridDim+i);
   nUp[i].reinitialize(nNext[0],i);
   nDown[i].reinitialize(nNext[0],GridDim+i);
   if(i>0) bnNext[i].reinitialize(bnNext[0],i);
   bnNext[GridDim+i].reinitialize(bnNext[0],GridDim+i);
   bnUp[i].reinitialize(bnNext[0],i);
   bnDown[i].reinitialize(bnNext[0],GridDim+i);
 }
 bnPlane[0].reinitialize(bnodes,Planes);
 for(i=1;i<Planes;i++){
   bnPlane[i].reinitialize(bnPlane[0],i);
 }
 fEdge[0].reinitialize(faces,LineSides);
 lPlane[0].reinitialize(lines,LineSides);
 for(i=1;i<LineSides;i++){
   fEdge[i].reinitialize(fEdge[0],i);
   lPlane[i].reinitialize(lPlane[0],i);
 }
 mx=coarse->dimension(0);	fx=coarse->refinement(0)+1;
 my=coarse->dimension(1);	fy=coarse->refinement(1)+1;
 mz=coarse->dimension(2);  	fz=coarse->refinement(2)+1;
 lz=fz*(mz-1);	ppz=1;		//if(lz>100) CoarseGridTooFine();
 ly=fy*(my-1);	ppy=lz+1;	//if(ly>100) CoarseGridTooFine();
 lx=fx*(mx-1);	ppx=ppy*(ly+1);	//if(lx>100) CoarseGridTooFine();
 i=1; 				pp0=ppx*(lx+1);
 nodes.available(pp0);
 iz=1; jz=0; kz=0; zz=coarse->x[2][iz]; if(mz>1) dz=(coarse->x[2][iz+1]-zz)/fz;
 iy=1; jy=0; ky=0; yy=coarse->x[1][iy]; if(my>1) dy=(coarse->x[1][iy+1]-yy)/fy;
 ix=1; jx=0; kx=0; xx=coarse->x[0][ix]; if(mx>1) dx=(coarse->x[0][ix+1]-xx)/fx;
 while(1){
	int i1 = nodes.create();
	nStackInitial.append(i);
	wzAssert(i1==i);
 	nx[i] = xx;	ny[i] = yy;	nz[i] = zz;
	geo->Point(nPoint[i]);
	nBoundary[i]=0;
#ifdef GLEVEL
	nLevel[0][i] =	nLevel[1][i] =	nLevel[2][i] = 0;
#endif
	switch(GridDim){
	case 3:
		if(kz<lz) nUp[2][i]	= i+ppz;
		else      nUp[2][i]	= outside;
		if(kz> 0) nDown[2][i]	= i-ppz;
		else      nDown[2][i]	= outside;
	case 2:
		if(ky<ly) nUp[1][i]	= i+ppy;
		else      nUp[1][i]	= outside;
		if(ky> 0) nDown[1][i]	= i-ppy;
		else      nDown[1][i]	= outside;
	case 1:
		if(kx<lx) nUp[0][i]	= i+ppx;
		else      nUp[0][i]	= outside;
		if(kx> 0) nDown[0][i]	= i-ppx;
		else      nDown[0][i]	= outside;
  	case 0: break;
	}
	if(kz==0){
		if(ky==0){
			if(kx==0)nOld[i] = 0;
			else	 nOld[i] = i-(ly+1)*(lz+1);
		}else		 nOld[i] = i-(lz+1);
	}else			 nOld[i] = i-1;
	i++;
	if(iz==mz){
		iz=1; jz=0; kz=0; zz=coarse->x[2][iz];
		if(mz>iz) dz=(coarse->x[2][iz+1]-zz)/fz;
		if(iy==my){
			iy=1; jy=0; ky=0; yy=coarse->x[1][iy];
			if(my>iy) dy=(coarse->x[1][iy+1]-yy)/fy;
			if(ix==mx) break;
			else if(jx==fx-1) {
				jx=0; kx++; ix++; xx=coarse->x[0][ix];
			        if(mx>ix) dx=(coarse->x[0][ix+1]-xx)/fx;
			}else{
				jx++; kx++; xx+=dx;
			}
		}else if(jy==fy-1) {
			jy=0; ky++; iy++; yy=coarse->x[1][iy];
			if(my>iy) dy=(coarse->x[1][iy+1]-yy)/fy;
		}else{
			jy++; ky++; yy+=dy;
		}
	}else if(jz==fz-1){
 		jz=0; iz++; kz++; zz=coarse->x[2][iz];
		if(mz>iz) dz=(coarse->x[2][iz+1]-zz)/fz;
	}else{
		jz++; kz++; zz+=dz;
	}
 }
 switch(GridDim){
 case 3:
   nCell[0].reinitialize(nodes,Corners);
   cNode[0].reinitialize(cells.base);
   for(o=1;o<Corners;o++){
     nCell[o].reinitialize(nCell[0],o);
     cNode[o].reinitialize(cNode[0],o);
   }
   cBoundary.reinitialize(cNode[0],Corners);
   cells.create(lx*ly*lz);
   for(ii=1,jj=1;ii<=pp0;ii++){
     for(r=0;r<Lines;r++){
       if(nNext[r][ii]==outside){
	 for(o=0;o<LineSides;o++) nCell[lsCell[r][o]][ii] = outside;
       }
     }
     if(is_undefined(i0=nNext[0][ii])) continue;
     if(is_undefined(i1=nNext[1][ii])) continue;
     if(is_undefined(i2=nNext[2][ii])) continue;
     k0=nNext[2][i1]; k1=nNext[0][i2]; k2=nNext[1][i0];
     kk=nNext[0][k0];
     cBoundary[jj] = 0;
     cNode[cdirnnn][jj] = ii; nCell[cdirppp][ii] = jj;
     cNode[cdirpnn][jj] = i0; nCell[cdirnpp][i0] = jj;
     cNode[cdirnpn][jj] = i1; nCell[cdirpnp][i1] = jj;
     cNode[cdirnnp][jj] = i2; nCell[cdirppn][i2] = jj;
     cNode[cdirnpp][jj] = k0; nCell[cdirpnn][k0] = jj;
     cNode[cdirpnp][jj] = k1; nCell[cdirnpn][k1] = jj;
     cNode[cdirppn][jj] = k2; nCell[cdirnnp][k2] = jj;
     cNode[cdirppp][jj] = kk; nCell[cdirnnn][kk] = jj;
     jj++;
   }
 default:break;
 }
}

ibgOctree0D::ibgOctree0D(wztensorgrid gr,cogeometry g,wzmetric r,wzchart c)
:ibgOctree(0,gr,g,r,c)
{;}
ibgOctree1D::ibgOctree1D(wztensorgrid gr,cogeometry g,wzmetric r,wzchart c)
:ibgOctree(1,gr,g,r,c)
{;}
ibgOctree2D::ibgOctree2D(wztensorgrid gr,cogeometry g,wzmetric r,wzchart c)
:ibgOctree(2,gr,g,r,c)
{;}
ibgOctree3D::ibgOctree3D(wztensorgrid gr,cogeometry g,wzmetric r,wzchart c)
:ibgOctree(3,gr,g,r,c)
{;}

ibgoctree ibgOctreeCreate(wztensorgrid gr,cogeometry g,wzmetric r,wzchart c)
{
  int i = gr->dimension();
  /*  switch(i){	// that fucked sgi compiler claims nonsense here:
  case 0:
    return new ibgOctree0D(gr,g,r,c);
  case 1:
    return new ibgOctree1D(gr,g,r,c);
  case 2:
    return new ibgOctree2D(gr,g,r,c);
  case 3:
    return new ibgOctree3D(gr,g,r,c);
  }
  return 0;
  */
  if(i==3) return new ibgOctree3D(gr,g,r,c);
  if(i==2) return new ibgOctree2D(gr,g,r,c);
  if(i==1) return new ibgOctree1D(gr,g,r,c);
  return new ibgOctree0D(gr,g,r,c);
}

ibgOctree::ibgOctree(ibgIndex dim,wztensorgrid coarse,
		     cogeometry g,wzmetric r,wzchart c)
  :ibgOctreeData(dim,coarse,g,r,c)
{;}

⌨️ 快捷键说明

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