9 #pragma mark * local ( static ) function prototypes *
11 static double CurrentTime(
void)
26 #pragma mark * exported function implementations *
33 #include PROTEUS_TRIANGLE_H
68 for(
int i=0,eN=0;i<nx-1;i++)
75 const double hx=Lx/(nx-1.0);
77 memset(mesh.
nodeArray,0,nx*3*
sizeof(
double));
99 for(
int i=0,eN=0;i<ny-1;i++)
100 for(
int j=0;j<nx-1;j++)
103 n0 =(j+0) + (i+0)*nx,
104 n1 =(j+1) + (i+0)*nx,
105 n2 =(j+0) + (i+1)*nx,
106 n3 =(j+1) + (i+1)*nx;
107 if (triangleFlag == 2)
113 else if (triangleFlag == 1)
115 if (i%2 + j%2 == 0 || i%2 + j%2 == 2)
144 double x_0,y_0,x_1,y_1,epsilon=1.0e-8;
152 if (y_0 <= epsilon && y_1 <= epsilon)
154 else if (y_0 >= Ly - epsilon && y_1 >= Ly - epsilon)
156 else if (x_0 <= epsilon && x_1 <= epsilon)
158 else if (x_0 >= Lx - epsilon && x_1 >= Lx - epsilon)
168 const double hx=Lx/(nx-1.0),hy=Ly/(ny-1.0);
177 for(
int i=0;i<ny;i++)
178 for(
int j=0;j<nx;j++)
199 int &n0(nodes[0]),&n1(nodes[1]),&n2(nodes[2]),&n3(nodes[3]);
201 t[0][0] = nodeArray[n1*3+0] - nodeArray[n0*3+0];
202 t[0][1] = nodeArray[n1*3+1] - nodeArray[n0*3+1];
203 t[0][2] = nodeArray[n1*3+2] - nodeArray[n0*3+2];
205 t[1][0] = nodeArray[n2*3+0] - nodeArray[n0*3+0];
206 t[1][1] = nodeArray[n2*3+1] - nodeArray[n0*3+1];
207 t[1][2] = nodeArray[n2*3+2] - nodeArray[n0*3+2];
209 t[2][0] = nodeArray[n3*3+0] - nodeArray[n0*3+0];
210 t[2][1] = nodeArray[n3*3+1] - nodeArray[n0*3+1];
211 t[2][2] = nodeArray[n3*3+2] - nodeArray[n0*3+2];
213 register double det = t[0][0]*(t[1][1]*t[2][2] - t[1][2]*t[2][1]) -
214 t[0][1]*(t[1][0]*t[2][2] - t[1][2]*t[2][0]) +
215 t[0][2]*(t[1][0]*t[2][1] - t[1][1]*t[2][0]);
245 for(
int i=0,eN=0;i<nz-1;i++)
246 for(
int j=0;j<ny-1;j++)
247 for(
int k=0;k<nx-1;k++)
250 n0 = (k+0) + (j+0)*nx + (i+0)*nxy,
251 n1 = (k+1) + (j+0)*nx + (i+0)*nxy,
252 n2 = (k+0) + (j+1)*nx + (i+0)*nxy,
253 n3 = (k+1) + (j+1)*nx + (i+0)*nxy,
254 n4 = (k+0) + (j+0)*nx + (i+1)*nxy,
255 n5 = (k+1) + (j+0)*nx + (i+1)*nxy,
256 n6 = (k+0) + (j+1)*nx + (i+1)*nxy,
257 n7 = (k+1) + (j+1)*nx + (i+1)*nxy;
272 int ebN,nN_0,nN_1,nN_2;
294 if (z_0 <= epsilon && z_1 <= epsilon && z_2 <= epsilon)
296 else if (z_0 >= Lz - epsilon && z_1 >= Lz - epsilon && z_2 >= Lz - epsilon)
298 else if (y_0 <= epsilon && y_1 <= epsilon && y_2 <= epsilon)
300 else if (y_0 >= Ly - epsilon && y_1 >= Ly - epsilon && y_2 >= Ly - epsilon)
302 else if (x_0 <= epsilon && x_1 <= epsilon && x_2 <= epsilon)
304 else if (x_0 >= Lx - epsilon && x_1 >= Lx - epsilon && x_2 >= Lx - epsilon)
316 int ebN,nN_0,nN_1,nN_2, nN_3;
344 if (z_0 <= epsilon && z_1 <= epsilon && z_2 <= epsilon && z_3 <= epsilon)
346 else if (z_0 >= Lz - epsilon && z_1 >= Lz - epsilon && z_2 >= Lz - epsilon && z_3 >= Lz - epsilon)
348 else if (y_0 <= epsilon && y_1 <= epsilon && y_2 <= epsilon && y_3 <= epsilon)
350 else if (y_0 >= Ly - epsilon && y_1 >= Ly - epsilon && y_2 >= Ly - epsilon && y_3 >= Ly - epsilon)
352 else if (x_0 <= epsilon && x_1 <= epsilon && x_2 <= epsilon && x_3 <= epsilon)
354 else if (x_0 >= Lx - epsilon && x_1 >= Lx - epsilon && x_2 >= Lx - epsilon && x_3 >= Lx - epsilon)
377 const double hx=Lx/(nx-1.0),
393 for(
int i=0;i<nz;i++)
394 for(
int j=0;j<ny;j++)
395 for(
int k=0;k<nx;k++)
397 nN = k + j*nx + i*nxy;
425 const double hx=Lx/(nx-1.0),
436 for(
int j=0;j<ny;j++)
437 for(
int k=0;k<nx;k++)
478 std::cout<<
"mesh elements"<<std::endl;
496 for(
int i=0;i<nz-1;i++)
497 for(
int j=0;j<ny-1;j++)
498 for(
int k=0;k<nx-1;k++)
501 (k+0) + (j+0)*nx + (i+0)*nxy,
502 (k+1) + (j+0)*nx + (i+0)*nxy,
503 (k+1) + (j+1)*nx + (i+0)*nxy,
504 (k+0) + (j+1)*nx + (i+0)*nxy,
505 (k+0) + (j+0)*nx + (i+1)*nxy,
506 (k+1) + (j+0)*nx + (i+1)*nxy,
507 (k+1) + (j+1)*nx + (i+1)*nxy,
508 (k+0) + (j+1)*nx + (i+1)*nxy);
529 for(
int j=0;j<ny-1;j++)
530 for(
int k=0;k<nx-1;k++)
568 for(
int i=0;i<nz-px;i++)
569 for(
int j=0;j<ny-py;j++)
570 for(
int k=0;k<nx-pz;k++)
577 for(
int ii=0;ii<px+1;ii++)
578 for(
int jj=0;jj<py+1;jj++)
579 for(
int kk=0;kk<pz+1;kk++)
588 mesh.
U_KNOT =
new double[nx+px+1];
589 mesh.
V_KNOT =
new double[ny+py+1];
590 mesh.
W_KNOT =
new double[nz+pz+1];
592 for(
int i=0;i<px+1;i++)
594 for(
int i=px+1;i<nx;i++)
595 mesh.
U_KNOT[i] = double(i-px-1);
596 for(
int i=nx;i<nx+px+1;i++)
597 mesh.
U_KNOT[i] =
double(nx);
599 for(
int i=0;i<py+1;i++)
601 for(
int i=py+1;i<ny;i++)
602 mesh.
V_KNOT[i] = double(i-py-1);
603 for(
int i=ny;i<ny+py+1;i++)
604 mesh.
V_KNOT[i] =
double(ny);
606 for(
int i=0;i<pz+1;i++)
608 for(
int i=pz+1;i<pz;i++)
609 mesh.
W_KNOT[i] = double(i-pz-1);
610 for(
int i=nz;i<nz+pz+1;i++)
611 mesh.
W_KNOT[i] =
double(nz);
633 for(
int ebN=0;ebN<2;ebN++)
635 register int nodes[1];
638 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
640 elementBoundaryElements[ebt].right=eN;
641 elementBoundaryElements[ebt].right_ebN_element=ebN;
645 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
648 stop = CurrentTime();
654 start = CurrentTime();
655 set<int> interiorElementBoundaries,exteriorElementBoundaries;
662 stop = CurrentTime();
666 start = CurrentTime();
669 eb != elementBoundaryElements.end();
678 if(eb->second.right != -1)
680 interiorElementBoundaries.insert(ebN);
684 exteriorElementBoundaries.insert(ebN);
687 if (eb->second.right != -1)
697 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
699 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
721 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
726 stop = CurrentTime();
741 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
791 for(
int ebN=0;ebN<3;ebN++)
793 register int nodes[2];
797 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
799 elementBoundaryElements[ebt].right=eN;
800 elementBoundaryElements[ebt].right_ebN_element=ebN;
804 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
807 stop = CurrentTime();
813 start = CurrentTime();
814 set<int> interiorElementBoundaries,exteriorElementBoundaries;
820 stop = CurrentTime();
824 start = CurrentTime();
827 eb != elementBoundaryElements.end();
837 if(eb->second.right != -1)
839 interiorElementBoundaries.insert(ebN);
843 exteriorElementBoundaries.insert(ebN);
845 if (eb->second.right != -1)
855 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
857 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
859 set<NodeTuple<2> > edges;
874 for (set<
NodeTuple<2> >::iterator edgeTuple_p=edges.begin();edgeTuple_p != edges.end();edgeTuple_p++,edgeN++)
891 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
893 stop = CurrentTime();
911 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
960 for(
int ebN=0;ebN<4;ebN++)
962 register int nodes[2];
966 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
968 elementBoundaryElements[ebt].right=eN;
969 elementBoundaryElements[ebt].right_ebN_element=ebN;
973 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
976 stop = CurrentTime();
982 start = CurrentTime();
983 set<int> interiorElementBoundaries,exteriorElementBoundaries;
989 stop = CurrentTime();
993 start = CurrentTime();
996 eb != elementBoundaryElements.end();
1006 if(eb->second.right != -1)
1008 interiorElementBoundaries.insert(ebN);
1012 exteriorElementBoundaries.insert(ebN);
1014 if (eb->second.right != -1)
1024 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
1026 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
1028 set<NodeTuple<2> > edges;
1043 for (set<
NodeTuple<2> >::iterator edgeTuple_p=edges.begin();edgeTuple_p != edges.end();edgeTuple_p++,edgeN++)
1060 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
1062 stop = CurrentTime();
1080 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
1122 using namespace std;
1126 ElementBoundaryElementsType elementBoundaryElements;
1127 start=CurrentTime();
1132 register int nodes[3];
1137 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
1139 elementBoundaryElements[ebt].right=eN;
1140 elementBoundaryElements[ebt].right_ebN_element=ebN;
1144 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
1147 stop = CurrentTime();
1153 start = CurrentTime();
1154 typedef set<int> ElementBoundariesType;
1155 ElementBoundariesType interiorElementBoundaries,exteriorElementBoundaries;
1161 stop = CurrentTime();
1164 start = CurrentTime();
1167 eb != elementBoundaryElements.end();
1179 if(eb->second.right != -1)
1181 interiorElementBoundaries.insert(ebN);
1185 exteriorElementBoundaries.insert(ebN);
1187 if (eb->second.right != -1)
1197 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
1199 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
1206 typedef set<NodeTuple<2> > EdgesType;
1222 EdgesType::iterator edge_p=edges.begin();
1223 for (
int edgeN=0;edgeN<int(edges.size());edgeN++)
1232 typedef vector<set<int> > NodeStarType;
1245 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
1250 stop = CurrentTime();
1254 typedef vector<set<int> > NodeElementsStarType;
1268 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
1310 using namespace std;
1314 start=CurrentTime();
1316 int lface[6][4] = {{0,1,2,3},
1327 register int nodes[4];
1334 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
1336 elementBoundaryElements[ebt].right=eN;
1337 elementBoundaryElements[ebt].right_ebN_element=ebN;
1341 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
1344 stop = CurrentTime();
1350 start = CurrentTime();
1351 set<int> interiorElementBoundaries,exteriorElementBoundaries;
1358 stop = CurrentTime();
1362 start = CurrentTime();
1365 eb != elementBoundaryElements.end();
1378 if(eb->second.right != -1)
1380 interiorElementBoundaries.insert(ebN);
1384 exteriorElementBoundaries.insert(ebN);
1387 if (eb->second.right != -1)
1397 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
1399 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
1401 set<NodeTuple<2> > edges;
1403 int ledge[12][2] = {{0,1},{1,2},{2,3},{3,0},
1404 {0,4},{1,5},{2,6},{3,7},
1405 {4,5},{5,6},{6,7},{7,4}};
1414 for (
int e=0;e<12;e++)
1427 set<NodeTuple<2> >::iterator edge_p=edges.begin();
1428 for (
int edgeN=0;edgeN<int(edges.size());edgeN++)
1451 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
1453 stop = CurrentTime();
1473 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
1516 using namespace std;
1520 int n2 = (mesh.
px+1)*(mesh.
py+1)-1 ;
1521 int n3 = (mesh.
px+1)*mesh.
py;
1524 int n4 = (mesh.
px+1)*(mesh.
py+1)*mesh.
pz + n0;
1525 int n5 = (mesh.
px+1)*(mesh.
py+1)*mesh.
pz + n1;
1526 int n6 = (mesh.
px+1)*(mesh.
py+1)*mesh.
pz + n2;
1527 int n7 = (mesh.
px+1)*(mesh.
py+1)*mesh.
pz + n3;
1533 using namespace std;
1537 start=CurrentTime();
1539 int lface[6][4] = {{n0,n1,n2,n3},
1552 register int nodes[4];
1559 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
1561 elementBoundaryElements[ebt].right=eN;
1562 elementBoundaryElements[ebt].right_ebN_element=ebN;
1566 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
1569 stop = CurrentTime();
1575 start = CurrentTime();
1576 set<int> interiorElementBoundaries,exteriorElementBoundaries;
1583 stop = CurrentTime();
1587 start = CurrentTime();
1590 eb != elementBoundaryElements.end();
1603 if(eb->second.right != -1)
1605 interiorElementBoundaries.insert(ebN);
1609 exteriorElementBoundaries.insert(ebN);
1612 if (eb->second.right != -1)
1622 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
1624 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
1626 set<NodeTuple<2> > edges;
1631 int ledge[12][2] = {{n0,n1},{n1,n2},{n2,n3},{n3,n0},
1632 {n0,n4},{n1,n5},{n2,n6},{n3,n7},
1633 {n4,n5},{n5,n6},{n6,n7},{n7,n4}};
1642 for (
int e=0;e<12;e++)
1655 set<NodeTuple<2> >::iterator edge_p=edges.begin();
1656 for (
int edgeN=0;edgeN<int(edges.size());edgeN++)
1676 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
1678 stop = CurrentTime();
1697 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
1741 int n2 = (mesh.
px+1)*(mesh.
py+1)-1 ;
1742 int n3 = (mesh.
px+1)*mesh.
py;
1745 int n4 = (mesh.
px+1)*(mesh.
py+1)*mesh.
pz + n0;
1746 int n5 = (mesh.
px+1)*(mesh.
py+1)*mesh.
pz + n1;
1747 int n6 = (mesh.
px+1)*(mesh.
py+1)*mesh.
pz + n2;
1748 int n7 = (mesh.
px+1)*(mesh.
py+1)*mesh.
pz + n3;
1753 using namespace std;
1758 int> elementBoundaryIds;
1759 start=CurrentTime();
1761 int lface[6][4] = {{n0,n1,n2,n3},
1773 register int nodes[4];
1779 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
1781 elementBoundaryElements[ebt].right=eN;
1782 elementBoundaryElements[ebt].right_ebN_element=ebN;
1788 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
1789 elementBoundaryIds.insert(elementBoundaryIds.end(),make_pair(ebt,ebN_global));
1792 stop = CurrentTime();
1798 start = CurrentTime();
1799 set<int> interiorElementBoundaries,exteriorElementBoundaries;
1804 stop = CurrentTime();
1808 start = CurrentTime();
1810 eb != elementBoundaryElements.end();
1813 int ebN = elementBoundaryIds[eb->first];
1824 if(eb->second.right != -1)
1826 interiorElementBoundaries.insert(ebN);
1830 exteriorElementBoundaries.insert(ebN);
1832 if (eb->second.right != -1)
1842 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
1844 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
1884 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
1886 stop = CurrentTime();
1904 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
1947 using namespace std;
1953 int> elementBoundaryIds;
1954 start=CurrentTime();
1956 for(
int ebN=0;ebN<2;ebN++)
1959 register int nodes[1];
1962 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
1964 elementBoundaryElements[ebt].right=eN;
1965 elementBoundaryElements[ebt].right_ebN_element=ebN;
1966 assert(elementBoundaryIds[ebt] == ebN_global);
1970 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
1971 elementBoundaryIds.insert(elementBoundaryIds.end(),make_pair(ebt,ebN_global));
1974 stop = CurrentTime();
1980 start = CurrentTime();
1981 set<int> interiorElementBoundaries,exteriorElementBoundaries;
1986 stop = CurrentTime();
1990 start = CurrentTime();
1992 eb != elementBoundaryElements.end();
1995 int ebN = elementBoundaryIds[eb->first];
2002 if(eb->second.right != -1)
2004 interiorElementBoundaries.insert(ebN);
2008 exteriorElementBoundaries.insert(ebN);
2010 if (eb->second.right != -1)
2020 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
2022 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
2044 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
2049 stop = CurrentTime();
2064 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
2105 using namespace std;
2114 int> elementBoundaryIds;
2115 start=CurrentTime();
2117 for(
int ebN=0;ebN<3;ebN++)
2120 register int nodes[2];
2124 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
2126 elementBoundaryElements[ebt].right=eN;
2127 elementBoundaryElements[ebt].right_ebN_element=ebN;
2128 assert(elementBoundaryIds[ebt] == ebN_global);
2132 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
2133 elementBoundaryIds.insert(elementBoundaryIds.end(),make_pair(ebt,ebN_global));
2136 stop = CurrentTime();
2142 start = CurrentTime();
2143 set<int> interiorElementBoundaries,exteriorElementBoundaries;
2148 stop = CurrentTime();
2152 start = CurrentTime();
2154 eb != elementBoundaryElements.end();
2157 int ebN = elementBoundaryIds[eb->first];
2165 if(eb->second.right != -1)
2167 interiorElementBoundaries.insert(ebN);
2171 exteriorElementBoundaries.insert(ebN);
2173 if (eb->second.right != -1)
2183 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
2185 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
2187 set<NodeTuple<2> > edges;
2202 for (set<
NodeTuple<2> >::iterator edgeTuple_p=edges.begin();edgeTuple_p != edges.end();edgeTuple_p++,edgeN++)
2219 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
2221 stop = CurrentTime();
2239 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
2279 using namespace std;
2288 int> elementBoundaryIds;
2289 start=CurrentTime();
2291 for(
int ebN=0;ebN<4;ebN++)
2294 register int nodes[2];
2298 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
2300 elementBoundaryElements[ebt].right=eN;
2301 elementBoundaryElements[ebt].right_ebN_element=ebN;
2302 assert(elementBoundaryIds[ebt] == ebN_global);
2306 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
2307 elementBoundaryIds.insert(elementBoundaryIds.end(),make_pair(ebt,ebN_global));
2310 stop = CurrentTime();
2316 start = CurrentTime();
2317 set<int> interiorElementBoundaries,exteriorElementBoundaries;
2322 stop = CurrentTime();
2326 start = CurrentTime();
2328 eb != elementBoundaryElements.end();
2331 int ebN = elementBoundaryIds[eb->first];
2339 if(eb->second.right != -1)
2341 interiorElementBoundaries.insert(ebN);
2345 exteriorElementBoundaries.insert(ebN);
2347 if (eb->second.right != -1)
2357 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
2359 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
2361 set<NodeTuple<2> > edges;
2375 for (set<
NodeTuple<2> >::iterator edgeTuple_p=edges.begin();edgeTuple_p != edges.end();edgeTuple_p++,edgeN++)
2392 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
2394 stop = CurrentTime();
2412 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
2455 using namespace std;
2460 int> elementBoundaryIds;
2461 start=CurrentTime();
2467 register int nodes[3];
2472 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
2474 elementBoundaryElements[ebt].right=eN;
2475 elementBoundaryElements[ebt].right_ebN_element=ebN;
2476 assert(elementBoundaryIds[ebt] == ebN_global);
2480 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
2481 elementBoundaryIds.insert(elementBoundaryIds.end(),make_pair(ebt,ebN_global));
2484 stop = CurrentTime();
2490 start = CurrentTime();
2491 set<int> interiorElementBoundaries,exteriorElementBoundaries;
2496 stop = CurrentTime();
2500 start = CurrentTime();
2502 eb != elementBoundaryElements.end();
2505 int ebN = elementBoundaryIds[eb->first];
2515 if(eb->second.right != -1)
2517 interiorElementBoundaries.insert(ebN);
2521 exteriorElementBoundaries.insert(ebN);
2523 if (eb->second.right != -1)
2533 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
2535 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
2537 set<NodeTuple<2> > edges;
2552 set<NodeTuple<2> >::iterator edge_p=edges.begin();
2553 for (
int edgeN=0;edgeN<int(edges.size());edgeN++)
2571 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
2573 stop = CurrentTime();
2591 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
2635 using namespace std;
2641 int> elementBoundaryIds;
2642 start=CurrentTime();
2644 for(
int ebN=0;ebN<2;ebN++)
2647 register int nodes[1];
2650 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
2652 elementBoundaryElements[ebt].right=eN;
2653 elementBoundaryElements[ebt].right_ebN_element=ebN;
2654 assert(elementBoundaryIds[ebt] == ebN_global);
2658 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
2659 elementBoundaryIds.insert(elementBoundaryIds.end(),make_pair(ebt,ebN_global));
2662 stop = CurrentTime();
2668 start = CurrentTime();
2669 set<int> interiorElementBoundaries,exteriorElementBoundaries;
2674 stop = CurrentTime();
2678 start = CurrentTime();
2680 eb != elementBoundaryElements.end();
2683 int ebN = elementBoundaryIds[eb->first];
2690 if(eb->second.right != -1)
2692 interiorElementBoundaries.insert(ebN);
2696 exteriorElementBoundaries.insert(ebN);
2698 if (eb->second.right != -1)
2708 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
2710 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
2726 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
2731 stop = CurrentTime();
2746 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
2787 using namespace std;
2796 int> elementBoundaryIds;
2797 start=CurrentTime();
2799 for(
int ebN=0;ebN<3;ebN++)
2802 register int nodes[2];
2806 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
2808 elementBoundaryElements[ebt].right=eN;
2809 elementBoundaryElements[ebt].right_ebN_element=ebN;
2810 assert(elementBoundaryIds[ebt] == ebN_global);
2814 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
2815 elementBoundaryIds.insert(elementBoundaryIds.end(),make_pair(ebt,ebN_global));
2818 stop = CurrentTime();
2824 start = CurrentTime();
2825 set<int> interiorElementBoundaries,exteriorElementBoundaries;
2830 stop = CurrentTime();
2834 start = CurrentTime();
2836 eb != elementBoundaryElements.end();
2839 int ebN = elementBoundaryIds[eb->first];
2847 if(eb->second.right != -1)
2849 interiorElementBoundaries.insert(ebN);
2853 exteriorElementBoundaries.insert(ebN);
2855 if (eb->second.right != -1)
2865 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
2867 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
2902 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
2904 stop = CurrentTime();
2922 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
2962 using namespace std;
2971 int> elementBoundaryIds;
2972 start=CurrentTime();
2974 for(
int ebN=0;ebN<4;ebN++)
2977 register int nodes[2];
2981 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
2983 elementBoundaryElements[ebt].right=eN;
2984 elementBoundaryElements[ebt].right_ebN_element=ebN;
2985 assert(elementBoundaryIds[ebt] == ebN_global);
2989 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
2990 elementBoundaryIds.insert(elementBoundaryIds.end(),make_pair(ebt,ebN_global));
2993 stop = CurrentTime();
2999 start = CurrentTime();
3000 set<int> interiorElementBoundaries,exteriorElementBoundaries;
3005 stop = CurrentTime();
3009 start = CurrentTime();
3011 eb != elementBoundaryElements.end();
3014 int ebN = elementBoundaryIds[eb->first];
3022 if(eb->second.right != -1)
3024 interiorElementBoundaries.insert(ebN);
3028 exteriorElementBoundaries.insert(ebN);
3030 if (eb->second.right != -1)
3040 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
3042 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
3057 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
3059 stop = CurrentTime();
3077 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
3120 using namespace std;
3125 int> elementBoundaryIds;
3126 start=CurrentTime();
3132 register int nodes[3];
3138 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
3140 elementBoundaryElements[ebt].right=eN;
3141 elementBoundaryElements[ebt].right_ebN_element=ebN;
3142 assert(elementBoundaryIds[ebt] == ebN_global);
3146 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
3147 elementBoundaryIds.insert(elementBoundaryIds.end(),make_pair(ebt,ebN_global));
3150 stop = CurrentTime();
3156 start = CurrentTime();
3157 set<int> interiorElementBoundaries,exteriorElementBoundaries;
3162 stop = CurrentTime();
3166 start = CurrentTime();
3168 eb != elementBoundaryElements.end();
3171 int ebN = elementBoundaryIds[eb->first];
3181 if(eb->second.right != -1)
3183 interiorElementBoundaries.insert(ebN);
3187 exteriorElementBoundaries.insert(ebN);
3189 if (eb->second.right != -1)
3199 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
3201 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
3238 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
3257 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
3299 using namespace std;
3304 int> elementBoundaryIds;
3305 start=CurrentTime();
3307 int lface[6][4] = {{0,1,2,3},
3319 register int nodes[4];
3325 if(elementBoundaryElements.find(ebt) != elementBoundaryElements.end())
3327 elementBoundaryElements[ebt].right=eN;
3328 elementBoundaryElements[ebt].right_ebN_element=ebN;
3332 elementBoundaryElements.insert(elementBoundaryElements.end(),make_pair(ebt,
ElementNeighbors(eN,ebN)));
3333 elementBoundaryIds.insert(elementBoundaryIds.end(),make_pair(ebt,ebN_global));
3336 stop = CurrentTime();
3342 start = CurrentTime();
3343 set<int> interiorElementBoundaries,exteriorElementBoundaries;
3348 stop = CurrentTime();
3352 start = CurrentTime();
3354 eb != elementBoundaryElements.end();
3357 int ebN = elementBoundaryIds[eb->first];
3368 if(eb->second.right != -1)
3370 interiorElementBoundaries.insert(ebN);
3374 exteriorElementBoundaries.insert(ebN);
3376 if (eb->second.right != -1)
3386 for (set<int>::iterator ebN=interiorElementBoundaries.begin();ebN != interiorElementBoundaries.end(); ebN++,ebNI++)
3388 for (set<int>::iterator ebN=exteriorElementBoundaries.begin();ebN != exteriorElementBoundaries.end(); ebN++,ebNE++)
3426 for (set<int>::iterator nN_star=nodeStar[nN].begin();nN_star!=nodeStar[nN].end();nN_star++,offset++)
3428 stop = CurrentTime();
3446 for (set<int>::iterator eN_star = nodeElementsStar[nN].begin(); eN_star != nodeElementsStar[nN].end();
3486 register double dx,dy,dz;
3487 dx = nodeArray[nL*3+0] - nodeArray[nR*3+0];
3488 dy = nodeArray[nL*3+1] - nodeArray[nR*3+1];
3489 dz = nodeArray[nL*3+2] - nodeArray[nR*3+2];
3490 return sqrt(dx*dx+dy*dy+dz*dz);
3493 inline double triangleArea(
int n0,
int n1,
int n2,
const double* nodeArray)
3495 register double va[3],vb[3];
3496 va[0] = nodeArray[n1*3+0] - nodeArray[n0*3+0];
3497 va[1] = nodeArray[n1*3+1] - nodeArray[n0*3+1];
3498 va[2] = nodeArray[n1*3+2] - nodeArray[n0*3+2];
3499 vb[0] = nodeArray[n2*3+0] - nodeArray[n0*3+0];
3500 vb[1] = nodeArray[n2*3+1] - nodeArray[n0*3+1];
3501 vb[2] = nodeArray[n2*3+2] - nodeArray[n0*3+2];
3502 return 0.5*fabs(va[1]*vb[2] - vb[1]*va[2] - (va[0]*vb[2] - vb[0]*va[2]) + (va[0]*vb[1] - va[1]*vb[0]));
3507 register double t[3][3];
3508 t[0][0] = nodeArray[n1*3+0] - nodeArray[n0*3+0];
3509 t[0][1] = nodeArray[n1*3+1] - nodeArray[n0*3+1];
3510 t[0][2] = nodeArray[n1*3+2] - nodeArray[n0*3+2];
3512 t[1][0] = nodeArray[n2*3+0] - nodeArray[n0*3+0];
3513 t[1][1] = nodeArray[n2*3+1] - nodeArray[n0*3+1];
3514 t[1][2] = nodeArray[n2*3+2] - nodeArray[n0*3+2];
3516 t[2][0] = nodeArray[n3*3+0] - nodeArray[n0*3+0];
3517 t[2][1] = nodeArray[n3*3+1] - nodeArray[n0*3+1];
3518 t[2][2] = nodeArray[n3*3+2] - nodeArray[n0*3+2];
3519 return fabs(t[0][0]*(t[1][1]*t[2][2] - t[1][2]*t[2][1]) - \
3520 t[0][1]*(t[1][0]*t[2][2] - t[1][2]*t[2][0]) + \
3521 t[0][2]*(t[1][0]*t[2][1] - t[1][1]*t[2][0]))/6.0;
3575 double volume, surfaceArea=0.0, hMin=0.0,hMax=0.0;
3582 for (
int ebN=0;ebN<4;ebN++)
3589 hMin = 6.0*volume/surfaceArea;
3601 mesh.
h = fmax(hMax,mesh.
h);
3629 inline double hexahedronVolume(
int n0,
int n1,
int n2,
int n3,
int n4,
int n5,
int n6,
int n7,
const double* nodeArray)
3631 register double t[3];
3632 t[0] = nodeArray[n0*3+0] - nodeArray[n1*3+0];
3633 t[1] = nodeArray[n0*3+1] - nodeArray[n3*3+1];
3634 t[2] = nodeArray[n0*3+2] - nodeArray[n4*3+2];
3636 return fabs(t[0]*t[1]*t[2]);
3679 double volume, hMin=0.0,hMax=0.0;
3709 mesh.
h = fmax(hMax,mesh.
h);
3776 double area=0.0, perimeter=0.0,h=0.0, hMin=0.0,hMax=0.0;
3789 hMax = fmax(hMax,h);
3791 hMin = 4.0*area/perimeter;
3796 mesh.
h = fmax(hMax,mesh.
h);
3872 double area=0.0, perimeter=0.0,h=0.0, hMin=1.0e6,hMax=0.0;
3890 hMax = fmax(hMax,h);
3891 hMin = fmin(hMin,h);
3897 mesh.
h = fmax(hMax,mesh.
h);
4016 using namespace std;
4017 multilevelMesh.
nLevels = nLevels;
4019 for(
int i=0;i<nLevels;i++)
4025 for(
int i=1;i<nLevels;i++)
4028 set<Node> newNodeSet;
4029 set<Node>::iterator nodeItr;
4030 pair<set<Node>::iterator,
bool> ret;
4054 midpoints[0].
nN = nN_new;
4058 else if (averageNewNodeFlags)
4064 newNodeSet.insert(midpoints[0]);
4084 for(nodeItr=newNodeSet.begin();nodeItr!=newNodeSet.end();nodeItr++)
4101 for(nodeItr=newNodeSet.begin();nodeItr!=newNodeSet.end();nodeItr++)
4111 using namespace std;
4112 multilevelMesh.
nLevels = nLevels;
4114 for(
int i=0;i<nLevels;i++)
4120 for(
int i=1;i<nLevels;i++)
4123 set<Node> newNodeSet;
4124 set<Node>::iterator nodeItr;
4125 pair<set<Node>::iterator,
bool> ret;
4152 for(
int nN_element_0=0,nN_midpoint=0;nN_element_0<mesh.
nNodes_element;nN_element_0++)
4153 for(
int nN_element_1=nN_element_0+1;nN_element_1<mesh.
nNodes_element;nN_element_1++,nN_midpoint++)
4157 midpoints[nN_midpoint]);
4158 nodeItr = newNodeSet.find(midpoints[nN_midpoint]);
4159 if(nodeItr == newNodeSet.end())
4161 midpoints[nN_midpoint].
nN = nN_new;
4165 else if (averageNewNodeFlags)
4171 newNodeSet.insert(midpoints[nN_midpoint]);
4175 midpoints[nN_midpoint].
nN = nodeItr->nN;
4205 for(nodeItr=newNodeSet.begin();nodeItr!=newNodeSet.end();nodeItr++)
4222 for(nodeItr=newNodeSet.begin();nodeItr!=newNodeSet.end();nodeItr++)
4236 using namespace std;
4237 multilevelMesh.
nLevels = nLevels;
4239 for(
int i=0;i<nLevels;i++)
4245 for(
int i=1;i<nLevels;i++)
4247 std::cout<<
"Quad refinement not imlemented "<<i<<endl;
4255 using namespace std;
4256 multilevelMesh.
nLevels = nLevels;
4258 for(
int i=0;i<nLevels;i++)
4264 for(
int i=1;i<nLevels;i++)
4267 set<Node> newNodeSet;
4268 set<Node>::iterator nodeItr;
4269 pair<set<Node>::iterator,
bool> ret;
4311 for(
int nN_element_0=0,nN_midpoint=0;nN_element_0<mesh.
nNodes_element;nN_element_0++)
4312 for(
int nN_element_1=nN_element_0+1;nN_element_1<mesh.
nNodes_element;nN_element_1++,nN_midpoint++)
4316 midpoints[nN_midpoint]);
4317 nodeItr = newNodeSet.find(midpoints[nN_midpoint]);
4318 if(nodeItr == newNodeSet.end())
4320 midpoints[nN_midpoint].
nN = nN_new;
4324 else if (averageNewNodeFlags)
4330 newNodeSet.insert(midpoints[nN_midpoint]);
4334 midpoints[nN_midpoint].
nN = nodeItr->nN;
4360 for(
int dN=1;dN<3;dN++)
4362 dd =
edgeLength(midpoints[dN],midpoints[5-dN]);
4368 else if (dd == mind)
4370 if(midpoints[dN] < midpoints[mindN])
4372 else if (!(midpoints[mindN] < midpoints[dN]) && (midpoints[5-dN] < midpoints[5-mindN]))
4399 else if (mindN == 1)
4456 for(nodeItr=newNodeSet.begin();nodeItr!=newNodeSet.end();nodeItr++)
4530 for(nodeItr=newNodeSet.begin();nodeItr!=newNodeSet.end();nodeItr++)
4540 using namespace std;
4541 multilevelMesh.
nLevels = nLevels;
4543 for(
int i=0;i<nLevels;i++)
4549 for(
int i=1;i<nLevels;i++)
4551 std::cout<<
"Hexahedron refinement not implemented"<<std::endl;
4558 const int& nSpace_global)
4566 int eN_left_parent = levelElementParentsArray[eN_left];
4567 int eN_right_parent= levelElementParentsArray[eN_right];
4568 if (eN_left_parent == eN_right_parent)
4573 int left_parent_ebN = -1;
4575 ebN_left_parent_element++)
4578 ebN_left_parent_element]
4581 left_parent_ebN = ebN_left_parent_element;
4595 int eN_parent = levelElementParentsArray[eN];
4596 int lastExteriorElementBoundaryOnParent=-1;
4597 int nExteriorElementBoundariesOnParent =0;
4602 lastExteriorElementBoundaryOnParent = ebN_element;
4603 nExteriorElementBoundariesOnParent++;
4606 assert(nExteriorElementBoundariesOnParent > 0); assert(lastExteriorElementBoundaryOnParent >= 0);
4607 if (nExteriorElementBoundariesOnParent > 1)
4611 if (nSpace_global == 1)
4618 const double n_child = (childMesh.
nodeArray[nN_child1*3+0]-childMesh.
nodeArray[nN_child0*3+0])/
4623 const double n_parent0 = (parentMesh.
nodeArray[nN_parent1*3+0]-parentMesh.
nodeArray[nN_parent0*3+0])/
4625 const double n_parent1 = (parentMesh.
nodeArray[nN_parent0*3+0]-parentMesh.
nodeArray[nN_parent1*3+0])/
4628 int ebN_parent = -1;
4629 if (fabs(n_child-n_parent1) < 1.0e-8)
4631 else if (fabs(n_child-n_parent0) < 1.0e-8)
4633 assert(ebN_parent >= 0);
4636 else if (nSpace_global == 2)
4640 double n_child[2] = {childMesh.
nodeArray[nN_ebN_child[1]*3+1]-childMesh.
nodeArray[nN_ebN_child[0]*3+1],
4642 double tmp = sqrt(n_child[0]*n_child[0] + n_child[1]*n_child[1]);
4644 n_child[0] /= tmp; n_child[1] /= tmp;
4646 int ebN_parent = -1;
4653 double n_parent[2] = {parentMesh.
nodeArray[nN_ebN_parent[1]*3+1]-parentMesh.
nodeArray[nN_ebN_parent[0]*3+1],
4654 parentMesh.
nodeArray[nN_ebN_parent[0]*3+0]-parentMesh.
nodeArray[nN_ebN_parent[1]*3+0]};
4655 tmp = sqrt(n_parent[0]*n_parent[0] + n_parent[1]*n_parent[1]);
4657 n_parent[0] /= tmp; n_parent[1] /= tmp;
4660 tmp = n_parent[0]*n_child[0] + n_parent[1]*n_child[1];
4662 if (fabs(sqrt(tmp*tmp) - 1.0) < 1.0e-8)
4664 ebN_parent = ebN_cur;
4668 assert(ebN_parent >= 0);
4676 double n_child[3] = {0.,0.,0.};
4678 n_child[0] = (nN_ebN_child_1_x[1]-nN_ebN_child_0_x[1])*(nN_ebN_child_2_x[2]-nN_ebN_child_0_x[2])
4679 -(nN_ebN_child_1_x[2]-nN_ebN_child_0_x[2])*(nN_ebN_child_2_x[1]-nN_ebN_child_0_x[1]);
4681 n_child[1] = (nN_ebN_child_1_x[2]-nN_ebN_child_0_x[2])*(nN_ebN_child_2_x[0]-nN_ebN_child_0_x[0])
4682 -(nN_ebN_child_1_x[0]-nN_ebN_child_0_x[0])*(nN_ebN_child_2_x[2]-nN_ebN_child_0_x[2]);
4684 n_child[2] = (nN_ebN_child_1_x[0]-nN_ebN_child_0_x[0])*(nN_ebN_child_2_x[1]-nN_ebN_child_0_x[1])
4685 -(nN_ebN_child_1_x[1]-nN_ebN_child_0_x[1])*(nN_ebN_child_2_x[0]-nN_ebN_child_0_x[0]);
4687 double tmp = sqrt(n_child[0]*n_child[0] + n_child[1]*n_child[1] + n_child[2]*n_child[2]);
4689 n_child[0] /= tmp; n_child[1] /= tmp; n_child[2] /= tmp;
4691 int ebN_parent = -1;
4692 double n_parent[3] = {0.,0.,0.};
4701 n_parent[0] = (nN_ebN_parent_1_x[1]-nN_ebN_parent_0_x[1])*(nN_ebN_parent_2_x[2]-nN_ebN_parent_0_x[2])
4702 -(nN_ebN_parent_1_x[2]-nN_ebN_parent_0_x[2])*(nN_ebN_parent_2_x[1]-nN_ebN_parent_0_x[1]);
4704 n_parent[1] = (nN_ebN_parent_1_x[2]-nN_ebN_parent_0_x[2])*(nN_ebN_parent_2_x[0]-nN_ebN_parent_0_x[0])
4705 -(nN_ebN_parent_1_x[0]-nN_ebN_parent_0_x[0])*(nN_ebN_parent_2_x[2]-nN_ebN_parent_0_x[2]);
4707 n_parent[2] = (nN_ebN_parent_1_x[0]-nN_ebN_parent_0_x[0])*(nN_ebN_parent_2_x[1]-nN_ebN_parent_0_x[1])
4708 -(nN_ebN_parent_1_x[1]-nN_ebN_parent_0_x[1])*(nN_ebN_parent_2_x[0]-nN_ebN_parent_0_x[0]);
4710 tmp = sqrt(n_parent[0]*n_parent[0] + n_parent[1]*n_parent[1] + n_parent[2]*n_parent[2]);
4712 n_parent[0] /= tmp; n_parent[1] /= tmp; n_parent[2] /= tmp;
4716 tmp = n_parent[0]*n_child[0] + n_parent[1]*n_child[1] + n_parent[2]*n_child[2];
4718 if (fabs(sqrt(tmp*tmp) - 1.0) < 1.0e-8)
4720 ebN_parent = ebN_cur;
4725 assert(ebN_parent >= 0);
4733 lastExteriorElementBoundaryOnParent];
4745 using namespace std;
4748 string word,elementType;
4753 if(word ==
"MESH1D")
4755 elementType =
"E2E";
4759 else if(word ==
"MESH2D")
4761 elementType =
"E3T";
4765 else if (word ==
"MESH3D")
4767 elementType =
"E4T";
4773 cerr<<
"Unrecognized mesh type"<<endl;
4776 vector<vector<int> > elementNodesVector;
4778 vector<int> materialTypes;
4781 while(word == elementType)
4786 meshFile>>nodes[nN];
4789 elementNodesVector.push_back(nodes);
4791 materialTypes.push_back(type);
4809 using namespace std;
4811 meshFile<<
"ND"<<setw(7)<<nN+1
4812 <<scientific<<setprecision(8)<<setw(16)<<mesh.
nodeArray[3*nN+0]
4813 <<scientific<<setprecision(8)<<setw(16)<<mesh.
nodeArray[3*nN+1]
4814 <<scientific<<setprecision(8)<<setw(16)<<mesh.
nodeArray[3*nN+2]
4822 meshFile<<
"Try to write something"<<std::endl;
4823 using namespace std;
4829 elementType =
"E2E";
4830 meshFile<<
"MESH1D"<<endl;
4835 elementType =
"E3T";
4836 meshFile<<
"MESH2D"<<endl;
4841 elementType =
"E4T";
4842 meshFile<<
"MESH3D"<<endl;
4846 cerr<<
"Unknown element type"<<endl;
4851 meshFile<<elementType;
4852 meshFile<<setw(width)<<eN+1;
4866 assert(trimesh); assert(trimesh->trianglelist);
4875 if (trimesh->triangleattributelist)
4877 for (
int eN = 0; eN < trimesh->numberoftriangles; eN++)
4878 mesh.
elementMaterialTypes[eN] = trimesh->triangleattributelist[eN*trimesh->numberoftriangleattributes+0];
4889 trimesh->trianglelist[eN*trimesh->numberofcorners+ebN]-base;
4900 assert(trimesh); assert(trimesh->pointlist);