10 OutPut(
"Example: cancer_exp_3d.h" << endl);
17 void Exact(
double x,
double y,
double z,
double *values)
23 void V_Exact(
double x,
double y,
double z,
double *values)
28 void W_Exact(
double x,
double y,
double z,
double *values)
34 void InitialCondition(
double x,
double y,
double z,
double *values)
59 values[0] = exp(-((x-240)*(x-240)+(y-50)*(y-50)+(z-147)*(z-147))/20);
70 void V_InitialCondition(
double x,
double y,
double z,
double *values)
95 values[0] = 1 - 0.5 * exp(-((x-240)*(x-240)+(y-50)*(y-50)+(z-147)*(z-147))/20);
103 void W_InitialCondition(
double x,
double y,
double z,
double *values)
129 values[0] = 0.5 * exp(-((x-240)*(x-240)+(y-50)*(y-50)+(z-147)*(z-147))/20);
138 void BoundCondition(
double x,
double y,
double z, BoundCond &cond)
143 void V_BoundCondition(
double x,
double y,
double z, BoundCond &cond)
149 void W_BoundCondition(
double x,
double y,
double z, BoundCond &cond)
155 void BoundValue(
double x,
double y,
double z,
double &value)
160 void V_BoundValue(
double x,
double y,
double z,
double &value)
165 void W_BoundValue(
double x,
double y,
double z,
double &value)
172 void BilinearCoeffs(
int n_points,
double *X,
double *Y,
double *Z,
173 double **parameters,
double **coeffs)
178 double x, y, z, c, a[3], b[3], s[3], h;
185 for(i=0;i<n_points;i++)
213 void V_BilinearCoeffs(
int n_points,
double *X,
double *Y,
double *Z,
214 double **parameters,
double **coeffs)
219 double x, y, z, c, a[3], b[3], s[3], h;
225 for(i=0;i<n_points;i++)
251 void W_BilinearCoeffs(
int n_points,
double *X,
double *Y,
double *Z,
252 double **parameters,
double **coeffs)
257 double x, y, z, c, a[3], b[3], s[3], h;
265 for(i=0;i<n_points;i++)
290 void ReadAdditionalNModes(
char *NODE, tetgenio &InAddPts)
292 int i, N_Vertices, index, N_Atribude, BDMarker;
294 std::ifstream dat(NODE);
298 cerr <<
"cannot open '" << NODE <<
"' for input" << endl;
302 dat.getline (line, 99);
303 dat >> N_Vertices >> N_Atribude >> BDMarker;
304 dat.getline (line, 99);
306 InAddPts.numberofpoints = N_Vertices;
307 InAddPts.pointlist =
new double[3*N_Vertices];
310 for(i=0;i<N_Vertices; i++)
312 dat.getline (line, 99);
313 dat >> index >> InAddPts.pointlist[3*i] >> InAddPts.pointlist[3*i+1] >> InAddPts.pointlist[3*i+2];
314 cout<< i <<
" vert X: " <<InAddPts.pointlist[3*i] <<
" vert Y: " <<InAddPts.pointlist[3*i+1] <<
" vert Z: " <<InAddPts.pointlist[3*i+2] <<endl;
328 void ReadMeditMeshWithCells(
char *SMESH, tetgenio &In)
330 int i, j, k, dimension, N_FVert, N_Faces, N_Vertices, N_CVert, N_Cells;
331 int BDComp_Min=10000000;
338 tetgenio::polygon *P;
340 std::ifstream dat(SMESH);
344 cerr <<
"cannot open '" << SMESH <<
"' for input" << endl;
353 if ( (!strcmp(line,
"Dimension")) || (!strcmp(line,
"dimension")) || (!strcmp(line,
"DIMENSION")))
355 dat.getline (line, 99);
360 dat.getline (line, 99);
365 cerr <<
"dimension: " << dimension << endl;
374 if ( (!strcmp(line,
"Vertices")) || (!strcmp(line,
"vertices")) || (!strcmp(line,
"VERTICES")) )
376 dat.getline (line, 99);
381 dat.getline (line, 99);
384 In.numberofpoints = N_Vertices;
385 In.pointlist =
new double[3*N_Vertices];
388 for(i=0;i<N_Vertices; i++)
390 dat.getline (line, 99);
391 dat >> x >> In.pointlist[3*i+1] >> In.pointlist[3*i+2];
393 In.pointlist[3*i] = x - 3.606596999999999830777142;
396 if(i==1062 || i==916 || i==341 || i==914 || i==162 || i==1063 || i==1061)
397 cout<< i <<
" vert X: " <<In.pointlist[3*i] <<
" vert Y: " <<In.pointlist[3*i+1] <<
" vert Z: " <<In.pointlist[3*i+2] <<endl;
406 if ( (!strcmp(line,
"Triangles")) || (!strcmp(line,
"triangles")) || (!strcmp(line,
"TRIANGLES")) )
409 dat.getline (line, 99);
413 else if ( (!strcmp(line,
"Quadrilaterals")) || (!strcmp(line,
"quadrilaterals")) || (!strcmp(line,
"QUADRILATERALS")) )
416 dat.getline (line, 99);
422 dat.getline (line, 99);
425 In.numberoffacets = N_Faces;
426 In.facetlist =
new tetgenio::facet[In.numberoffacets];
427 In.facetmarkerlist =
new int[In.numberoffacets];
429 for(i=0;i<N_Faces; i++)
431 dat.getline (line, 99);
433 F = &In.facetlist[i];
435 F->numberofpolygons = 1;
436 F->polygonlist =
new tetgenio::polygon[F->numberofpolygons];
437 F->numberofholes = 0;
439 P = &F->polygonlist[0];
441 P->numberofvertices = N_FVert;
442 P->vertexlist =
new int[P->numberofvertices];
444 for(j=0;j<N_FVert;j++)
447 P->vertexlist[j] = k-1;
450 dat >> In.facetmarkerlist[i];
452 if(BDComp_Min > In.facetmarkerlist[i])
453 BDComp_Min=In.facetmarkerlist[i];
460 for(i=0;i<N_Faces; i++)
461 In.facetmarkerlist[i] -= BDComp_Min;
469 if ( (!strcmp(line,
"Tetrahedron")) || (!strcmp(line,
"tetrahedron")) || (!strcmp(line,
"TETRAHEDRON")) )
472 dat.getline (line, 99);
477 dat.getline (line, 99);
480 In.numberoftetrahedra = N_Cells;
481 In.numberofcorners = N_CVert;
482 In.numberoftetrahedronattributes = 1;
483 In.tetrahedronlist =
new int[N_Cells * 4];
484 In.tetrahedronattributelist =
new REAL[N_Cells];
485 In.tetrahedronvolumelist =
new REAL[N_Cells];
487 for(i=0; i<N_Cells; i++)
489 dat.getline (line, 99);
490 plist = &(In.tetrahedronlist[i * 4]);
492 for(j=0;j<N_CVert;j++)
499 dat >> In.tetrahedronattributelist[i];
513 void ReadMeditMesh(
char *SMESH, tetgenio &In)
515 int i, j, k, dimension, N_FVert, N_Faces, N_Vertices;
516 int BDComp_Min=10000000;
520 tetgenio::polygon *P;
522 std::ifstream dat(SMESH);
526 cerr <<
"cannot open '" << SMESH <<
"' for input" << endl;
535 if ( (!strcmp(line,
"Dimension")) || (!strcmp(line,
"dimension")) || (!strcmp(line,
"DIMENSION")))
537 dat.getline (line, 99);
542 dat.getline (line, 99);
547 cerr <<
"dimension: " << dimension << endl;
556 if ( (!strcmp(line,
"Vertices")) || (!strcmp(line,
"vertices")) || (!strcmp(line,
"VERTICES")) )
558 dat.getline (line, 99);
563 dat.getline (line, 99);
566 In.numberofpoints = N_Vertices;
567 In.pointlist =
new double[3*N_Vertices];
570 for(i=0;i<N_Vertices; i++)
572 dat.getline (line, 99);
573 dat >> In.pointlist[3*i] >> In.pointlist[3*i+1] >> In.pointlist[3*i+2];
583 if ( (!strcmp(line,
"Triangles")) || (!strcmp(line,
"triangles")) || (!strcmp(line,
"TRIANGLES")) )
586 dat.getline (line, 99);
590 else if ( (!strcmp(line,
"Quadrilaterals")) || (!strcmp(line,
"quadrilaterals")) || (!strcmp(line,
"QUADRILATERALS")) )
593 dat.getline (line, 99);
599 dat.getline (line, 99);
602 In.numberoffacets = N_Faces;
603 In.facetlist =
new tetgenio::facet[In.numberoffacets];
604 In.facetmarkerlist =
new int[In.numberoffacets];
606 for(i=0;i<N_Faces; i++)
608 dat.getline (line, 99);
610 F = &In.facetlist[i];
612 F->numberofpolygons = 1;
613 F->polygonlist =
new tetgenio::polygon[F->numberofpolygons];
614 F->numberofholes = 0;
616 P = &F->polygonlist[0];
618 P->numberofvertices = N_FVert;
619 P->vertexlist =
new int[P->numberofvertices];
621 for(j=0;j<N_FVert;j++)
624 P->vertexlist[j] = k-1;
627 dat >> In.facetmarkerlist[i];
629 if(BDComp_Min > In.facetmarkerlist[i])
630 BDComp_Min=In.facetmarkerlist[i];
637 for(i=0;i<N_Faces; i++)
638 In.facetmarkerlist[i] -= BDComp_Min;
648 void DeleteDomain(
TDomain *&Domain)
650 int i, j, k, N_Cells, N_RootCells;
651 int CurrVertex, N_Faces, N_Vertices, ID;
653 TBaseCell **CellTree, **SurfCellTree, *cell;
666 VertexDel =
new TVertex*[8*N_RootCells];
669 for(i=0;i<N_Cells;i++)
674 for(j=0;j<N_Faces;j++)
678 VertexDel[CurrVertex++] = cell->
GetVertex(j);
683 for(k=0;k<CurrVertex;k++)
690 VertexDel[CurrVertex++] = cell->
GetVertex(j);
695 for(k=0;k<CurrVertex;k++)
696 if(VertexDel[k]==cell->
GetVertex((j+1)%N_Vertices))
702 VertexDel[CurrVertex++] = cell->
GetVertex((j+1)%N_Vertices);
706 for(k=0;k<CurrVertex;k++)
707 if(VertexDel[k]==cell->
GetVertex((j+2)%N_Vertices))
713 VertexDel[CurrVertex++] = cell->
GetVertex((j+2)%N_Vertices);
718 for(k=0;k<CurrVertex;k++)
719 if(VertexDel[k]==cell->
GetVertex((j+4)%N_Vertices))
725 VertexDel[CurrVertex++] = cell->
GetVertex((j+4)%N_Vertices);
731 for(i=0;i<CurrVertex;i++)
734 OutPut(CurrVertex<<
" vertices were deleted"<<endl);
738 for(i=0;i<N_RootCells;i++)
741 OutPut(N_RootCells<<
" cells were deleted"<<endl);
751 void TetrameshCreate(
TDomain *&Domain)
753 int i, j, k, l, dimension, N_Vertices;
754 int N_FVert, N_Faces, *Facemarkerlist, *Facelist, N_RootCells;
755 int v1, v2, v3, v4, CellMarker, RefLevel=0, *Tetrahedrals, *PointNeighb, maxEpV, *Tetrahedrals_loc;
756 int a, b, c, Neib[2], Neighb_tmp, CurrNeib, len1, len2, len3, CurrComp, N_Points ;
757 int N_Cells, MaxLen, jj, N_SourcePts;
758 const int *EdgeVertex, *TmpFV, *TmpLen;
760 double X, Y, Z, DispX, DispY, DispZ;
761 double Xmin = 1e10, Xmax = -1e10, Ymin = 1e10, Ymax = -1e10;
762 double Zmin = 1e10, Zmax = -1e10, T[4]={0,0,0,0}, S[4]={0,0,0,0};
763 double StartX, StartY, StartZ, BoundX, BoundY, BoundZ;
765 char *MESH, line[100];
779 MPI_Comm_rank(Comm, &rank);
780 MPI_Comm_size(Comm, &size);
785 DeleteDomain(Domain);
789 std::ifstream dat(MESH);
793 cerr <<
"cannot open '" << MESH <<
"' for input" << endl;
803 if ( (!strcmp(line,
"Dimension")) || (!strcmp(line,
"dimension")) || (!strcmp(line,
"DIMENSION")))
805 dat.getline (line, 99);
810 dat.getline (line, 99);
815 cerr <<
"dimension: " << dimension << endl;
824 if ( (!strcmp(line,
"Vertices")) || (!strcmp(line,
"vertices")) || (!strcmp(line,
"VERTICES")) )
826 dat.getline (line, 99);
831 dat.getline (line, 99);
835 NewVertices =
new TVertex*[N_Vertices];
838 for(i=0;i<N_Vertices; i++)
840 dat.getline (line, 99);
848 DispY = -1.8733333333333333;
858 DispY = 69.66666666666666;
867 NewVertices[i] =
new TVertex( (X - DispX), (Y - DispY), (Z- DispZ));
875 if (X > Xmax) Xmax = X;
876 if (X < Xmin) Xmin = X;
877 if (Y > Ymax) Ymax = Y;
878 if (Y < Ymin) Ymin = Y;
879 if (Z > Zmax) Zmax = Z;
880 if (Z < Zmin) Zmin = Z;
892 BoundX = Xmax - Xmin;
893 BoundY = Ymax - Ymin;
894 BoundZ = Zmax - Zmin;
897 Domain->SetBoundBox(StartX, StartY, StartZ, BoundX, BoundY, BoundZ);
911 if ( (!strcmp(line,
"Tetrahedron")) || (!strcmp(line,
"tetrahedron")) || (!strcmp(line,
"TETRAHEDRON")) )
913 dat.getline (line, 99);
918 dat.getline (line, 99);
923 Tetrahedrals =
new int[4*N_RootCells];
925 for (i=0;i<N_RootCells;i++)
927 dat.getline (line, 99);
928 dat >> v1 >> v2 >> v3 >> v4 >> CellMarker;
929 Tetrahedrals[4*i ] = v1 -1;
930 Tetrahedrals[4*i + 1] = v2 -1;
931 Tetrahedrals[4*i + 2] = v3 -1;
932 Tetrahedrals[4*i + 3] = v4 -1;
939 CellTree[i]->
SetVertex(0, NewVertices[Tetrahedrals[4*i ]]);
940 CellTree[i]->
SetVertex(1, NewVertices[Tetrahedrals[4*i + 1]]);
941 CellTree[i]->
SetVertex(2, NewVertices[Tetrahedrals[4*i + 2]]);
942 CellTree[i]->
SetVertex(3, NewVertices[Tetrahedrals[4*i + 3]]);
945 ((
TMacroCell *) CellTree[i])->SetSubGridID(0);
961 PointNeighb =
new int[N_Vertices];
965 cout<<
"Numberofpoints "<<N_Vertices<<endl;
966 memset(PointNeighb, 0, N_Vertices*SizeOfInt);
968 for (i=0;i<4*N_RootCells;i++)
969 PointNeighb[Tetrahedrals[i]]++;
972 for (i=0;i<N_Vertices;i++)
973 if (PointNeighb[i] > maxEpV) maxEpV = PointNeighb[i];
974 delete [] PointNeighb;
979 cout<<
"maxEpV "<< maxEpV<<endl;
981 PointNeighb =
new int[++maxEpV * N_Vertices];
983 memset(PointNeighb, 0, maxEpV*N_Vertices*SizeOfInt);
989 for(i=0;i<4*N_RootCells;i++)
991 j = Tetrahedrals[i]*maxEpV;
994 PointNeighb[j + PointNeighb[j]] = i / 4;
1002 for(i=0;i<N_Cells;i++)
1008 Tetrahedrals_loc = Tetrahedrals+4*i;
1011 for(jj=0;jj<N_Faces;jj++)
1014 N_Points = TmpLen[jj];
1018 cerr <<
"Only Tria faces are allowed!!! N_FVert: " << N_Points << endl;
1023 a = Tetrahedrals_loc[TmpFV[jj*MaxLen]];
1024 b = Tetrahedrals_loc[TmpFV[jj*MaxLen + 1]];
1025 c = Tetrahedrals_loc[TmpFV[jj*MaxLen + 2]];
1033 len1 = PointNeighb[a*maxEpV];
1034 len2 = PointNeighb[b*maxEpV];
1035 len3 = PointNeighb[c*maxEpV];
1038 for (j=1;j<=len1;j++)
1040 Neighb_tmp = PointNeighb[a*maxEpV + j];
1041 for (k=1;k<=len2;k++)
1043 if(Neighb_tmp == PointNeighb[b*maxEpV + k])
1045 for(l=1;l<=len3;l++)
1046 if(Neighb_tmp == PointNeighb[c*maxEpV + l])
1048 Neib[CurrNeib++] = Neighb_tmp;
1053 if (CurrNeib == 2)
break;
1063 NewVertices[a]->
GetY(), T[1], S[1]) ||
1065 NewVertices[b]->
GetY(), T[2], S[2]) ||
1067 NewVertices[c]->
GetY(), T[3], S[3]) )
1069 cerr<<
"Error: could not set parameter values"<<endl;
1070 OutPut(NewVertices[a]<<endl);
1071 OutPut(NewVertices[b]<<endl);
1072 OutPut(NewVertices[c]<<endl);
1097 cerr <<
"Error !!!!!!!! not enough neighbours!" << endl;
1099 Joint =
new TJointEqN(CellTree[Neib[0]], CellTree[Neib[1]]);
1105 if (Tetrahedrals[4*Neib[0]+j] == a)
break;
1109 if (Tetrahedrals[4*Neib[0]+k] == b)
break;
1113 if (Tetrahedrals[4*Neib[0]+l] == c)
break;
1115 l = l*100 + k*10 + j;
1121 case 210:
case 21:
case 102:
1122 case 120:
case 12:
case 201:
1125 case 310:
case 31:
case 103:
1126 case 130:
case 13:
case 301:
1129 case 321:
case 132:
case 213:
1130 case 231:
case 123:
case 312:
1133 case 230:
case 23:
case 302:
1134 case 320:
case 32:
case 203:
1139 Error(
"Unable to set the face !!!!!!!!!!!!" << endl);
1143 CellTree[Neib[0]]->
SetJoint(j, Joint);
1150 if (Tetrahedrals[4*Neib[1]+j] == a)
break;
1154 if (Tetrahedrals[4*Neib[1]+k] == b)
break;
1158 if (Tetrahedrals[4*Neib[1]+l] == c)
break;
1160 l = l*100 + k*10 + j;
1166 case 210:
case 21:
case 102:
1167 case 120:
case 12:
case 201:
1170 case 310:
case 31:
case 103:
1171 case 130:
case 13:
case 301:
1174 case 321:
case 132:
case 213:
1175 case 231:
case 123:
case 312:
1178 case 230:
case 23:
case 302:
1179 case 320:
case 32:
case 203:
1184 Error(
"Unable to set the face !!!!!!!!!!!!" << endl);
1187 CellTree[Neib[1]]->
SetJoint(j, Joint);
1191 if (Joint->
GetType() == InterfaceJoint3D ||
1192 Joint->
GetType() == IsoInterfaceJoint3D)
1198 if (Joint->
GetType() == JointEqN)
1204 delete [] PointNeighb;
1217 void TetrameshGen(
TDomain *&Domain)
1222 int i, j, k, l, N_Coord, *N_FVerts, N_Faces, *Facets;
1223 int N, N_RootCells, N_Cells, CurrVertex, N_Vertices, ID, N_G, RefLevel=0;
1224 int CurrNeib, len1, len2, len3, maxEpV = 0, a, b, c, Neib[2], Neighb_tmp, CurrComp;
1225 int *Tetrahedrals, *PointNeighb, dimension;
1226 int *Facelist, *Facemarkerlist;
1228 double *Coordinates, N_x, N_y, N_z;
1230 double Xmin = 1e10, Xmax = -1e10, Ymin = 1e10, Ymax = -1e10;
1231 double Zmin = 1e10, Zmax = -1e10, T[4]={0,0,0,0}, S[4]={0,0,0,0};
1232 double StartX, StartY, StartZ, BoundX, BoundY, BoundZ;
1238 TVertex **VertexDel, **NewVertices, **NewSurfVertices;
1247 char *SMESH, line[100];
1254 MPI_Comm_rank(Comm, &rank);
1255 MPI_Comm_size(Comm, &size);
1270 std::ostringstream opts;
1273 opts.seekp(std::ios::beg);
1294 ReadMeditMesh(SMESH, In);
1302 tetrahedralize((
char*)opts.str().c_str(), &In, &Out);
1317 VertexDel =
new TVertex*[8*N_RootCells];
1320 for(i=0;i<N_Cells;i++)
1325 for(j=0;j<N_Faces;j++)
1329 VertexDel[CurrVertex++] = cell->
GetVertex(j);
1334 for(k=0;k<CurrVertex;k++)
1341 VertexDel[CurrVertex++] = cell->
GetVertex(j);
1346 for(k=0;k<CurrVertex;k++)
1347 if(VertexDel[k]==cell->
GetVertex((j+1)%N_Vertices))
1353 VertexDel[CurrVertex++] = cell->
GetVertex((j+1)%N_Vertices);
1357 for(k=0;k<CurrVertex;k++)
1358 if(VertexDel[k]==cell->
GetVertex((j+2)%N_Vertices))
1364 VertexDel[CurrVertex++] = cell->
GetVertex((j+2)%N_Vertices);
1369 for(k=0;k<CurrVertex;k++)
1370 if(VertexDel[k]==cell->
GetVertex((j+4)%N_Vertices))
1376 VertexDel[CurrVertex++] = cell->
GetVertex((j+4)%N_Vertices);
1382 for(i=0;i<CurrVertex;i++)
1383 delete VertexDel[i];
1384 delete [] VertexDel;
1385 OutPut(CurrVertex<<
" vertices were deleted"<<endl);
1389 for(i=0;i<N_RootCells;i++)
1392 OutPut(N_RootCells<<
" cells were deleted"<<endl);
1399 N_RootCells = Out.numberoftetrahedra;
1400 N_G = Out.numberofpoints;
1403 Coordinates = Out.pointlist;
1404 Tetrahedrals = Out.tetrahedronlist;
1410 MPI_Bcast(&N_RootCells, 1, MPI_INT, 0, Comm);
1411 MPI_Bcast(&N_G, 1, MPI_INT, 0, Comm);
1416 Coordinates =
new double [3*N_G];
1417 Tetrahedrals =
new int[4*N_RootCells];
1420 MPI_Bcast(Coordinates, 3*N_G, MPI_DOUBLE, 0, Comm);
1421 MPI_Bcast(Tetrahedrals, 4*N_RootCells, MPI_INT, 0, Comm);
1425 NewVertices =
new TVertex*[N_G];
1429 NewVertices[i] =
new TVertex(Coordinates[3*i], Coordinates[3*i+1], Coordinates[3*i+2]);
1432 if (Coordinates[3*i] > Xmax) Xmax = Coordinates[3*i];
1433 if (Coordinates[3*i] < Xmin) Xmin = Coordinates[3*i];
1434 if (Coordinates[3*i+1] > Ymax) Ymax = Coordinates[3*i+1];
1435 if (Coordinates[3*i+1] < Ymin) Ymin = Coordinates[3*i+1];
1436 if (Coordinates[3*i+2] > Zmax) Zmax = Coordinates[3*i+2];
1437 if (Coordinates[3*i+2] < Zmin) Zmin = Coordinates[3*i+2];
1444 BoundX = Xmax - Xmin;
1445 BoundY = Ymax - Ymin;
1446 BoundZ = Zmax - Zmin;
1449 Domain->SetBoundBox(StartX, StartY, StartZ, BoundX, BoundY, BoundZ);
1460 for (i=0;i<N_RootCells;i++)
1465 CellTree[i]->
SetVertex(0, NewVertices[Tetrahedrals[4*i ]]);
1466 CellTree[i]->
SetVertex(1, NewVertices[Tetrahedrals[4*i + 1]]);
1467 CellTree[i]->
SetVertex(2, NewVertices[Tetrahedrals[4*i + 2]]);
1468 CellTree[i]->
SetVertex(3, NewVertices[Tetrahedrals[4*i + 3]]);
1471 ((
TMacroCell *) CellTree[i])->SetSubGridID(0);
1486 PointNeighb =
new int[N_G];
1490 cout<<
"numberofpoints "<<N_G<<endl;
1491 memset(PointNeighb, 0, N_G *SizeOfInt);
1493 for (i=0;i<4*N_RootCells;i++)
1494 PointNeighb[Tetrahedrals[i]]++;
1497 if (PointNeighb[i] > maxEpV) maxEpV = PointNeighb[i];
1498 delete [] PointNeighb;
1503 cout<<
"maxEpV "<< maxEpV<<endl;
1505 PointNeighb =
new int[++maxEpV * N_G];
1507 memset(PointNeighb, 0, maxEpV*N_G*SizeOfInt);
1514 for(i=0;i<4*N_RootCells;i++)
1516 j = Tetrahedrals[i]*maxEpV;
1519 PointNeighb[j + PointNeighb[j]] = i / 4;
1537 N_G = Out.numberoftrifaces;
1538 Facelist = Out.trifacelist;
1539 Facemarkerlist = Out.trifacemarkerlist;
1543 MPI_Bcast(&N_G, 1, MPI_INT, 0, Comm);
1547 Facelist =
new int [3*N_G];
1548 Facemarkerlist =
new int[N_G];
1552 MPI_Bcast(Facelist, 3*N_G, MPI_INT, 0, Comm);
1553 MPI_Bcast(Facemarkerlist, N_G, MPI_INT, 0, Comm);
1557 cout<<
"numberoftrifaces "<<N_G<<endl;
1562 b = Facelist[3*i+1];
1563 c = Facelist[3*i+2];
1571 len1 = PointNeighb[a*maxEpV];
1572 len2 = PointNeighb[b*maxEpV];
1573 len3 = PointNeighb[c*maxEpV];
1576 for (j=1;j<=len1;j++)
1578 Neighb_tmp = PointNeighb[a*maxEpV + j];
1579 for (k=1;k<=len2;k++)
1581 if (Neighb_tmp == PointNeighb[b*maxEpV + k])
1583 for (l=1;l<=len3;l++)
1584 if (Neighb_tmp == PointNeighb[c*maxEpV + l])
1586 Neib[CurrNeib++] = Neighb_tmp;
1591 if (CurrNeib == 2)
break;
1595 if (Facemarkerlist[i])
1598 CurrComp = Facemarkerlist[i] - 1;
1609 NewVertices[a]->
GetY(), T[1], S[1]) ||
1611 NewVertices[b]->
GetY(), T[2], S[2]) ||
1613 NewVertices[c]->
GetY(), T[3], S[3]) )
1615 cerr<<
"Error: could not set parameter values"<<endl;
1616 OutPut(NewVertices[a]<<endl);
1617 OutPut(NewVertices[b]<<endl);
1618 OutPut(NewVertices[c]<<endl);
1626 CellTree[Neib[0]], CellTree[Neib[1]] );
1629 CellTree[Neib[0]], CellTree[Neib[1]] );
1643 cerr <<
"Error !!!!!!!! not enough neighbours!" << endl;
1645 Joint =
new TJointEqN(CellTree[Neib[0]], CellTree[Neib[1]]);
1652 if (Tetrahedrals[4*Neib[0]+j] == a)
break;
1656 if (Tetrahedrals[4*Neib[0]+k] == b)
break;
1660 if (Tetrahedrals[4*Neib[0]+l] == c)
break;
1662 l = l*100 + k*10 + j;
1668 case 210:
case 21:
case 102:
1669 case 120:
case 12:
case 201:
1672 case 310:
case 31:
case 103:
1673 case 130:
case 13:
case 301:
1676 case 321:
case 132:
case 213:
1677 case 231:
case 123:
case 312:
1680 case 230:
case 23:
case 302:
1681 case 320:
case 32:
case 203:
1686 Error(
"Unable to set the face !!!!!!!!!!!!" << endl);
1689 CellTree[Neib[0]]->
SetJoint(j, Joint);
1695 if (Tetrahedrals[4*Neib[1]+j] == a)
break;
1699 if (Tetrahedrals[4*Neib[1]+k] == b)
break;
1703 if (Tetrahedrals[4*Neib[1]+l] == c)
break;
1705 l = l*100 + k*10 + j;
1711 case 210:
case 21:
case 102:
1712 case 120:
case 12:
case 201:
1715 case 310:
case 31:
case 103:
1716 case 130:
case 13:
case 301:
1719 case 321:
case 132:
case 213:
1720 case 231:
case 123:
case 312:
1723 case 230:
case 23:
case 302:
1724 case 320:
case 32:
case 203:
1729 Error(
"Unable to set the face !!!!!!!!!!!!" << endl);
1732 CellTree[Neib[1]]->
SetJoint(j, Joint);
1735 if (Joint->
GetType() == InterfaceJoint3D ||
1736 Joint->
GetType() == IsoInterfaceJoint3D)
1742 if (Joint->
GetType() == JointEqN)
1761 delete [] Tetrahedrals ;
1762 delete [] Coordinates;
1764 delete [] Facemarkerlist;
1768 delete [] PointNeighb;
1782 void TetraGen(
TDomain *&Domain)
1787 int i, j, k, l, N_Coord, *N_FVerts, N_Faces, *Facets;
1788 int N, N_RootCells, N_Cells, CurrVertex, N_Vertices, ID, N_G, RefLevel=0;
1789 int CurrNeib, len1, len2, len3, maxEpV = 0, a, b, c, Neib[2], Neighb_tmp, CurrComp;
1790 int *Tetrahedrals, *PointNeighb, dimension;
1791 int jj, N_Points, MaxLen, *Tetrahedrals_loc;
1792 const int *EdgeVertex, *TmpFV, *TmpLen;
1794 double *Coordinates, N_x, N_y, N_z;
1796 double Xmin = 1e10, Xmax = -1e10, Ymin = 1e10, Ymax = -1e10;
1797 double Zmin = 1e10, Zmax = -1e10, T[4]={0,0,0,0}, S[4]={0,0,0,0};
1798 double StartX, StartY, StartZ, BoundX, BoundY, BoundZ;
1804 TVertex **VertexDel, **NewVertices, **NewSurfVertices;
1814 char *SMESH, line[100];
1821 MPI_Comm_rank(Comm, &rank);
1822 MPI_Comm_size(Comm, &size);
1835 std::ostringstream opts;
1838 opts.seekp(std::ios::beg);
1859 ReadMeditMesh(SMESH, In);
1867 tetrahedralize((
char*)opts.str().c_str(), &In, &Out);
1876 DeleteDomain(Domain);
1883 N_RootCells = Out.numberoftetrahedra;
1884 N_G = Out.numberofpoints;
1887 Coordinates = Out.pointlist;
1888 Tetrahedrals = Out.tetrahedronlist;
1892 MPI_Bcast(&N_RootCells, 1, MPI_INT, 0, Comm);
1893 MPI_Bcast(&N_G, 1, MPI_INT, 0, Comm);
1898 Coordinates =
new double [3*N_G];
1899 Tetrahedrals =
new int[4*N_RootCells];
1902 MPI_Bcast(Coordinates, 3*N_G, MPI_DOUBLE, 0, Comm);
1903 MPI_Bcast(Tetrahedrals, 4*N_RootCells, MPI_INT, 0, Comm);
1907 NewVertices =
new TVertex*[N_G];
1911 NewVertices[i] =
new TVertex(Coordinates[3*i], Coordinates[3*i+1], Coordinates[3*i+2]);
1914 if (Coordinates[3*i] > Xmax) Xmax = Coordinates[3*i];
1915 if (Coordinates[3*i] < Xmin) Xmin = Coordinates[3*i];
1916 if (Coordinates[3*i+1] > Ymax) Ymax = Coordinates[3*i+1];
1917 if (Coordinates[3*i+1] < Ymin) Ymin = Coordinates[3*i+1];
1918 if (Coordinates[3*i+2] > Zmax) Zmax = Coordinates[3*i+2];
1919 if (Coordinates[3*i+2] < Zmin) Zmin = Coordinates[3*i+2];
1926 BoundX = Xmax - Xmin;
1927 BoundY = Ymax - Ymin;
1928 BoundZ = Zmax - Zmin;
1931 Domain->SetBoundBox(StartX, StartY, StartZ, BoundX, BoundY, BoundZ);
1942 for (i=0;i<N_RootCells;i++)
1947 CellTree[i]->
SetVertex(0, NewVertices[Tetrahedrals[4*i ]]);
1948 CellTree[i]->
SetVertex(1, NewVertices[Tetrahedrals[4*i + 1]]);
1949 CellTree[i]->
SetVertex(2, NewVertices[Tetrahedrals[4*i + 2]]);
1950 CellTree[i]->
SetVertex(3, NewVertices[Tetrahedrals[4*i + 3]]);
1953 ((
TMacroCell *) CellTree[i])->SetSubGridID(0);
1968 PointNeighb =
new int[N_G];
1972 cout<<
"numberofpoints "<<N_G<<endl;
1973 memset(PointNeighb, 0, N_G *SizeOfInt);
1975 for (i=0;i<4*N_RootCells;i++)
1976 PointNeighb[Tetrahedrals[i]]++;
1979 if (PointNeighb[i] > maxEpV) maxEpV = PointNeighb[i];
1980 delete [] PointNeighb;
1985 cout<<
"maxEpV "<< maxEpV<<endl;
1987 PointNeighb =
new int[++maxEpV * N_G];
1989 memset(PointNeighb, 0, maxEpV*N_G*SizeOfInt);
1996 for(i=0;i<4*N_RootCells;i++)
1998 j = Tetrahedrals[i]*maxEpV;
2001 PointNeighb[j + PointNeighb[j]] = i / 4;
2009 for (i=0;i<N_Cells;i++)
2015 Tetrahedrals_loc = Tetrahedrals+4*i;
2017 for(jj=0;jj<N_Faces;jj++)
2021 N_Points = TmpLen[jj];
2025 cerr <<
"Only Tria faces are allowed!!! N_FVert: " << N_Points << endl;
2031 a = Tetrahedrals_loc[TmpFV[jj*MaxLen]];
2032 b = Tetrahedrals_loc[TmpFV[jj*MaxLen + 1]];
2033 c = Tetrahedrals_loc[TmpFV[jj*MaxLen + 2]];
2041 len1 = PointNeighb[a*maxEpV];
2042 len2 = PointNeighb[b*maxEpV];
2043 len3 = PointNeighb[c*maxEpV];
2046 for (j=1;j<=len1;j++)
2048 Neighb_tmp = PointNeighb[a*maxEpV + j];
2049 for (k=1;k<=len2;k++)
2051 if (Neighb_tmp == PointNeighb[b*maxEpV + k])
2053 for (l=1;l<=len3;l++)
2054 if (Neighb_tmp == PointNeighb[c*maxEpV + l])
2056 Neib[CurrNeib++] = Neighb_tmp;
2061 if (CurrNeib == 2)
break;
2076 NewVertices[a]->
GetY(), T[1], S[1]) ||
2078 NewVertices[b]->
GetY(), T[2], S[2]) ||
2080 NewVertices[c]->
GetY(), T[3], S[3]) )
2082 cerr<<
"Error: could not set parameter values"<<endl;
2083 OutPut(NewVertices[a]<<endl);
2084 OutPut(NewVertices[b]<<endl);
2085 OutPut(NewVertices[c]<<endl);
2093 CellTree[Neib[0]], CellTree[Neib[1]] );
2096 CellTree[Neib[0]], CellTree[Neib[1]] );
2110 cerr <<
"Error !!!!!!!! not enough neighbours!" << endl;
2112 Joint =
new TJointEqN(CellTree[Neib[0]], CellTree[Neib[1]]);
2118 if (Tetrahedrals[4*Neib[0]+j] == a)
break;
2122 if (Tetrahedrals[4*Neib[0]+k] == b)
break;
2126 if (Tetrahedrals[4*Neib[0]+l] == c)
break;
2128 l = l*100 + k*10 + j;
2134 case 210:
case 21:
case 102:
2135 case 120:
case 12:
case 201:
2138 case 310:
case 31:
case 103:
2139 case 130:
case 13:
case 301:
2142 case 321:
case 132:
case 213:
2143 case 231:
case 123:
case 312:
2146 case 230:
case 23:
case 302:
2147 case 320:
case 32:
case 203:
2152 Error(
"Unable to set the face !!!!!!!!!!!!" << endl);
2155 CellTree[Neib[0]]->
SetJoint(j, Joint);
2161 if (Tetrahedrals[4*Neib[1]+j] == a)
break;
2165 if (Tetrahedrals[4*Neib[1]+k] == b)
break;
2169 if (Tetrahedrals[4*Neib[1]+l] == c)
break;
2171 l = l*100 + k*10 + j;
2177 case 210:
case 21:
case 102:
2178 case 120:
case 12:
case 201:
2181 case 310:
case 31:
case 103:
2182 case 130:
case 13:
case 301:
2185 case 321:
case 132:
case 213:
2186 case 231:
case 123:
case 312:
2189 case 230:
case 23:
case 302:
2190 case 320:
case 32:
case 203:
2195 Error(
"Unable to set the face !!!!!!!!!!!!" << endl);
2198 CellTree[Neib[1]]->
SetJoint(j, Joint);
2201 if (Joint->
GetType() == InterfaceJoint3D ||
2202 Joint->
GetType() == IsoInterfaceJoint3D)
2208 if (Joint->
GetType() == JointEqN)
2217 cout<<
"numberoftrifaces after "<<N_G<<endl;
2233 delete [] Tetrahedrals ;
2234 delete [] Coordinates;
2240 delete [] PointNeighb;
2254 void TetraGenWithInputCells(
TDomain *&Domain)
2259 int i, j, k, l, N_Coord, *N_FVerts, N_Faces, *Facets;
2260 int N, N_RootCells, N_Cells, CurrVertex, N_Vertices, ID, N_G, RefLevel=0;
2261 int CurrNeib, len1, len2, len3, maxEpV = 0, a, b, c, Neib[2], Neighb_tmp, CurrComp;
2262 int *Tetrahedrals, *PointNeighb, dimension;
2263 int jj, N_Points, MaxLen, *Tetrahedrals_loc;
2264 const int *EdgeVertex, *TmpFV, *TmpLen;
2265 double *TetRegionlist;
2267 double *Coordinates, N_x, N_y, N_z;
2269 double Xmin = 1e10, Xmax = -1e10, Ymin = 1e10, Ymax = -1e10;
2270 double Zmin = 1e10, Zmax = -1e10, T[4]={0,0,0,0}, S[4]={0,0,0,0};
2271 double StartX, StartY, StartZ, BoundX, BoundY, BoundZ;
2273 tetgenio In, Out, InAddPts;
2277 TVertex **VertexDel, **NewVertices, **NewSurfVertices;
2287 char *SMESH, line[100];
2295 MPI_Comm_rank(Comm, &rank);
2296 MPI_Comm_size(Comm, &size);
2309 std::ostringstream opts;
2312 opts.seekp(std::ios::beg);
2341 ReadMeditMeshWithCells(SMESH, In);
2356 tetrahedralize((
char*)opts.str().c_str(), &In, &Out);
2366 DeleteDomain(Domain);
2373 N_RootCells = Out.numberoftetrahedra;
2374 N_G = Out.numberofpoints;
2377 Coordinates = Out.pointlist;
2378 Tetrahedrals = Out.tetrahedronlist;
2380 TetRegionlist = Out.tetrahedronattributelist;
2384 MPI_Bcast(&N_RootCells, 1, MPI_INT, 0, Comm);
2385 MPI_Bcast(&N_G, 1, MPI_INT, 0, Comm);
2390 Coordinates =
new double [3*N_G];
2391 Tetrahedrals =
new int[4*N_RootCells];
2392 TetRegionlist =
new double [N_RootCells];
2395 MPI_Bcast(Coordinates, 3*N_G, MPI_DOUBLE, 0, Comm);
2396 MPI_Bcast(Tetrahedrals, 4*N_RootCells, MPI_INT, 0, Comm);
2397 MPI_Bcast(TetRegionlist, N_RootCells, MPI_DOUBLE, 0, Comm);
2401 NewVertices =
new TVertex*[N_G];
2405 NewVertices[i] =
new TVertex(Coordinates[3*i], Coordinates[3*i+1], Coordinates[3*i+2]);
2408 if (Coordinates[3*i] > Xmax) Xmax = Coordinates[3*i];
2409 if (Coordinates[3*i] < Xmin) Xmin = Coordinates[3*i];
2410 if (Coordinates[3*i+1] > Ymax) Ymax = Coordinates[3*i+1];
2411 if (Coordinates[3*i+1] < Ymin) Ymin = Coordinates[3*i+1];
2412 if (Coordinates[3*i+2] > Zmax) Zmax = Coordinates[3*i+2];
2413 if (Coordinates[3*i+2] < Zmin) Zmin = Coordinates[3*i+2];
2420 BoundX = Xmax - Xmin;
2421 BoundY = Ymax - Ymin;
2422 BoundZ = Zmax - Zmin;
2425 Domain->SetBoundBox(StartX, StartY, StartZ, BoundX, BoundY, BoundZ);
2436 for (i=0;i<N_RootCells;i++)
2441 CellTree[i]->
SetVertex(0, NewVertices[Tetrahedrals[4*i ]]);
2442 CellTree[i]->
SetVertex(1, NewVertices[Tetrahedrals[4*i + 1]]);
2443 CellTree[i]->
SetVertex(2, NewVertices[Tetrahedrals[4*i + 2]]);
2444 CellTree[i]->
SetVertex(3, NewVertices[Tetrahedrals[4*i + 3]]);
2447 ((
TMacroCell *) CellTree[i])->SetSubGridID(0);
2465 PointNeighb =
new int[N_G];
2469 cout<<
"numberofpoints "<<N_G<<endl;
2470 memset(PointNeighb, 0, N_G *SizeOfInt);
2472 for (i=0;i<4*N_RootCells;i++)
2473 PointNeighb[Tetrahedrals[i]]++;
2476 if (PointNeighb[i] > maxEpV) maxEpV = PointNeighb[i];
2477 delete [] PointNeighb;
2482 cout<<
"maxEpV "<< maxEpV<<endl;
2484 PointNeighb =
new int[++maxEpV * N_G];
2486 memset(PointNeighb, 0, maxEpV*N_G*SizeOfInt);
2493 for(i=0;i<4*N_RootCells;i++)
2495 j = Tetrahedrals[i]*maxEpV;
2498 PointNeighb[j + PointNeighb[j]] = i / 4;
2506 for (i=0;i<N_Cells;i++)
2512 Tetrahedrals_loc = Tetrahedrals+4*i;
2514 for(jj=0;jj<N_Faces;jj++)
2518 N_Points = TmpLen[jj];
2522 cerr <<
"Only Tria faces are allowed!!! N_FVert: " << N_Points << endl;
2528 a = Tetrahedrals_loc[TmpFV[jj*MaxLen]];
2529 b = Tetrahedrals_loc[TmpFV[jj*MaxLen + 1]];
2530 c = Tetrahedrals_loc[TmpFV[jj*MaxLen + 2]];
2538 len1 = PointNeighb[a*maxEpV];
2539 len2 = PointNeighb[b*maxEpV];
2540 len3 = PointNeighb[c*maxEpV];
2543 for (j=1;j<=len1;j++)
2545 Neighb_tmp = PointNeighb[a*maxEpV + j];
2546 for (k=1;k<=len2;k++)
2548 if (Neighb_tmp == PointNeighb[b*maxEpV + k])
2550 for (l=1;l<=len3;l++)
2551 if (Neighb_tmp == PointNeighb[c*maxEpV + l])
2553 Neib[CurrNeib++] = Neighb_tmp;
2558 if (CurrNeib == 2)
break;
2573 NewVertices[a]->
GetY(), T[1], S[1]) ||
2575 NewVertices[b]->
GetY(), T[2], S[2]) ||
2577 NewVertices[c]->
GetY(), T[3], S[3]) )
2579 cerr<<
"Error: could not set parameter values"<<endl;
2580 OutPut(NewVertices[a]<<endl);
2581 OutPut(NewVertices[b]<<endl);
2582 OutPut(NewVertices[c]<<endl);
2590 CellTree[Neib[0]], CellTree[Neib[1]] );
2593 CellTree[Neib[0]], CellTree[Neib[1]] );
2607 cerr <<
"Error !!!!!!!! not enough neighbours!" << endl;
2609 Joint =
new TJointEqN(CellTree[Neib[0]], CellTree[Neib[1]]);
2615 if (Tetrahedrals[4*Neib[0]+j] == a)
break;
2619 if (Tetrahedrals[4*Neib[0]+k] == b)
break;
2623 if (Tetrahedrals[4*Neib[0]+l] == c)
break;
2625 l = l*100 + k*10 + j;
2631 case 210:
case 21:
case 102:
2632 case 120:
case 12:
case 201:
2635 case 310:
case 31:
case 103:
2636 case 130:
case 13:
case 301:
2639 case 321:
case 132:
case 213:
2640 case 231:
case 123:
case 312:
2643 case 230:
case 23:
case 302:
2644 case 320:
case 32:
case 203:
2649 Error(
"Unable to set the face !!!!!!!!!!!!" << endl);
2652 CellTree[Neib[0]]->
SetJoint(j, Joint);
2658 if (Tetrahedrals[4*Neib[1]+j] == a)
break;
2662 if (Tetrahedrals[4*Neib[1]+k] == b)
break;
2666 if (Tetrahedrals[4*Neib[1]+l] == c)
break;
2668 l = l*100 + k*10 + j;
2674 case 210:
case 21:
case 102:
2675 case 120:
case 12:
case 201:
2678 case 310:
case 31:
case 103:
2679 case 130:
case 13:
case 301:
2682 case 321:
case 132:
case 213:
2683 case 231:
case 123:
case 312:
2686 case 230:
case 23:
case 302:
2687 case 320:
case 32:
case 203:
2692 Error(
"Unable to set the face !!!!!!!!!!!!" << endl);
2695 CellTree[Neib[1]]->
SetJoint(j, Joint);
2698 if (Joint->
GetType() == InterfaceJoint3D ||
2699 Joint->
GetType() == IsoInterfaceJoint3D)
2705 if (Joint->
GetType() == JointEqN)
2714 cout<<
"numberoftrifaces after "<<N_G<<endl;
2730 delete [] Tetrahedrals ;
2731 delete [] Coordinates;
2732 delete [] TetRegionlist;
2737 delete [] PointNeighb;
void SetMapType()
Definition: Joint.C:107
void GetTreeInfo(TBaseCell **&celltree, int &N_rootcells)
get tree of cells
Definition: Domain.h:176
virtual int GetTSofXYZ(double X, double Y, double Z, double &T, double &S)=0
JointType GetType()
Definition: Joint.h:75
TBaseCell * GetCell(int i) const
return Cell with index i in Cells-array
Definition: Collection.h:50
int GetN_Faces()
return the number of faces of the cell
Definition: BaseCell.h:190
TBoundComp2D * GetBdComp(int i)
Definition: BoundPart.h:49
int SetJoint(int J_i, TJoint *J)
set the pointer to face J_i to J
Definition: BaseCell.h:168
int GetFaceVertex(const int *&TmpFV, const int *&TmpLen, int &MaxLen)
Definition: ShapeDesc.h:124
static TTimeDB * TimeDB
Definition: Database.h:1137
contains the boundary description, the virtual cell tree and macro grid
Definition: Domain.h:36
void SetClipBoard(int value)
set value in ClipBoard
Definition: BaseCell.h:263
double RE_NR
Definition: Database.h:313
int SetParam(TDomain *domain)
Definition: Iterator.C:17
static TIterator ** IteratorDB
Definition: Database.h:1131
Definition: IsoBoundFace.h:18
TShapeDesc * GetShapeDesc() const
return shape descriptor of refinement descriptor
Definition: BaseCell.h:134
store cells in an array, used by cell iterators
Definition: Collection.h:18
virtual TVertex * GetVertex(int Vert_i)=0
return the pointer to vertex with number i
represent a unit of the macro grid
Definition: MacroCell.h:15
Definition: JointEqN.h:20
int GetN_Cells() const
return number of cells
Definition: Collection.h:46
Definition: ShapeDesc.h:29
TJoint * GetJoint(int J_i)
return the pointer to face with number i
Definition: BaseCell.h:175
MPI_Comm Comm
Definition: Database.h:978
TBoundPart * GetBdPart(int i)
get i-th boundary part
Definition: Domain.h:172
Definition: BoundComp3D.h:17
double GetY() const
Definition: Vertex.h:99
int GetN_Vertices()
return the number of vertices of the cell
Definition: BaseCell.h:179
Definition: BoundPart.h:21
void SetTreeInfo(TBaseCell **celltree, int N_rootcells)
set tree of cells
Definition: Domain.h:183
bool IsFreeBoundary() const
Definition: BoundComp.h:57
TCollection * GetCollection(Iterators it, int level)
produce a collection with all cells returned by iterator it
Definition: Domain.C:1982
Definition: IsoInterfaceJoint3D.h:19
information for finite element data structure
Definition: BaseCell.h:25
static TRefDesc ** RefDescDB
Definition: Database.h:1125
void SetRegionID(int val)
set region number to this cell
Definition: BaseCell.h:347
Definition: BoundFace.h:18
double GetX() const
Definition: Vertex.h:96
virtual int SetVertex(int Vert_i, TVertex *Vert)=0
set the pointer of vertex Vert_i to Vert
represent geometric information of the cell
Definition: GridCell.h:15
void SetAsLayerCell(int val)
set as LayerCell cell
Definition: BaseCell.h:355
Definition: BdSphere.h:18
static TParamDB * ParamDB
Definition: Database.h:1134
Definition: InterfaceJoint3D.h:18