63 std::map<unsigned int, ElmtConfig> InputGmsh::elmMap = InputGmsh::GenElmMap();
94 std::vector<int> nodeList;
97 nodeList.resize(nodes.size());
100 nodeList[0] = nodes[0];
103 nodeList[n - 1] = nodes[1];
104 nodeList[n * n - 1] = nodes[2];
105 nodeList[n * (n - 1)] = nodes[3];
107 for (
int i = 1; i < n - 1; ++i)
109 nodeList[i] = nodes[4 + i - 1];
111 for (
int i = 1; i < n - 1; ++i)
113 nodeList[n * n - 1 - i] = nodes[4 + 2 * (n - 2) + i - 1];
120 std::vector<int> interior((n - 2) * (n - 2));
122 nodes.begin() + 4 + 4 * (n - 2), nodes.end(), interior.begin());
126 for (
int j = 1; j < n - 1; ++j)
128 nodeList[j * n] = nodes[4 + 3 * (n - 2) + n - 2 - j];
129 for (
int i = 1; i < n - 1; ++i)
131 nodeList[j * n + i] = interior[(j - 1) * (n - 2) + (i - 1)];
133 nodeList[(j + 1) * n - 1] = nodes[4 + (n - 2) + j - 1];
171 std::vector<int> nodeList;
174 nodeList.resize(nodes.size());
177 nodeList[0] = nodes[0];
180 nodeList[n - 1] = nodes[1];
181 nodeList[n * (n + 1) / 2 - 1] = nodes[2];
186 for (
int i = 1; i < n - 1; ++i)
188 nodeList[i] = nodes[3 + i - 1];
189 nodeList[cnt] = nodes[3 + 3 * (n - 2) - i];
190 nodeList[cnt + n - i - 1] = nodes[3 + (n - 2) + i - 1];
198 std::vector<int> interior((n - 3) * (n - 2) / 2);
200 nodes.begin() + 3 + 3 * (n - 2), nodes.end(), interior.begin());
206 for (
int j = 1; j < n - 2; ++j)
208 for (
int i = 0; i < n - j - 2; ++i)
210 nodeList[cnt + i + 1] = interior[cnt2 + i];
220 typedef std::tuple<int, int, int>
Mode;
225 if (std::get<0>(a) < std::get<0>(b))
229 if (std::get<0>(a) > std::get<0>(b))
233 if (std::get<1>(a) < std::get<1>(b))
237 if (std::get<1>(a) > std::get<1>(b))
241 if (std::get<2>(a) < std::get<2>(b))
286 std::vector<int> nodeList;
287 int nTri = n*(n+1)/2;
288 int nTet = n*(n+1)*(n+2)/6;
290 nodeList.resize(nodes.size());
291 nodeList[0] = nodes[0];
299 nodeList[n - 1] = nodes[1];
300 nodeList[nTri - 1] = nodes[2];
301 nodeList[nTet - 1] = nodes[3];
310 std::map<Mode, int, cmpop> tmp;
312 for (
int k = 0, cnt = 0; k < n; ++k)
314 for (
int j = 0; j < n - k; ++j)
316 for (
int i = 0; i < n - k - j; ++i)
318 tmp[
Mode(i,j,k)] = cnt++;
324 for (
int i = 1; i < n-1; ++i)
327 nodeList[tmp[
Mode(i,0,0)]] = nodes[4 + eI];
328 nodeList[tmp[
Mode(n-1-i,i,0)]] = nodes[4 + (n-2) + eI];
329 nodeList[tmp[
Mode(0,n-1-i,0)]] = nodes[4 + 2*(n-2) + eI];
330 nodeList[tmp[
Mode(0,0,n-1-i)]] = nodes[4 + 3*(n-2) + eI];
331 nodeList[tmp[
Mode(0,i,n-1-i)]] = nodes[4 + 4*(n-2) + eI];
332 nodeList[tmp[
Mode(i,0,n-1-i)]] = nodes[4 + 5*(n-2) + eI];
342 int nFacePts = (n-3)*(n-2)/2;
345 vector<vector<int> > tmpNodes(4);
346 int offset = 4 + 6*(n-2);
348 for (
int i = 0; i < 4; ++i)
350 tmpNodes[i].resize(nFacePts);
351 for (
int j = 0; j < nFacePts; ++j)
353 tmpNodes[i][j] = nodes[offset++];
361 vector<int> triVertId(3), toAlign(3);
372 hoTri.
Align(toAlign);
376 hoTri.
Align(toAlign);
385 hoTri.
Align(toAlign);
391 for (
int j = 1, cnt = 0; j < n-2; ++j)
393 for (
int i = 1; i < n-j-1; ++i, ++cnt)
395 nodeList[tmp[
Mode(i,j,0)]] = tmpNodes[0][cnt];
396 nodeList[tmp[
Mode(i,0,j)]] = tmpNodes[1][cnt];
397 nodeList[tmp[
Mode(n-1-i-j,i,j)]] = tmpNodes[3][cnt];
398 nodeList[tmp[
Mode(0,i,j)]] = tmpNodes[2][cnt];
408 vector<int> intNodes, tmpInt;
409 for (
int i = offset; i < nTet; ++i)
411 intNodes.push_back(nodes[i]);
415 for (
int k = 1, cnt = 0; k < n - 2; ++k)
417 for (
int j = 1; j < n - k - 1; ++j)
419 for (
int i = 1; i < n - k - j - 1; ++i)
421 nodeList[tmp[
Mode(i,j,k)]] = tmpInt[cnt++];
465 std::vector<int> nodeList;
472 nodeList.resize(nodes.size());
476 nodeList[0] = nodes[1];
477 nodeList[1] = nodes[0];
489 nodeList[0] = nodes[1];
490 nodeList[1] = nodes[4];
491 nodeList[2] = nodes[2];
492 nodeList[3] = nodes[5];
493 nodeList[4] = nodes[0];
494 nodeList[5] = nodes[3];
495 nodeList[6] = nodes[7];
496 nodeList[7] = nodes[8];
497 nodeList[8] = nodes[6];
500 ASSERTL0(n < 4,
"Prism Gmsh input and output is incomplete for orders " 542 std::vector<int> nodeList;
544 nodeList.resize(nodes.size());
545 nodeList[0] = nodes[0];
553 nodeList[n - 1] = nodes[1];
554 nodeList[n*n -1] = nodes[2];
555 nodeList[n*(n-1)] = nodes[3];
556 nodeList[n*n*(n-1)] = nodes[4];
557 nodeList[n - 1 + n*n*(n-1)] = nodes[5];
558 nodeList[n*n -1 + n*n*(n-1)] = nodes[6];
559 nodeList[n*(n-1) + n*n*(n-1)] = nodes[7];
566 int hexEdges[12][2] = {
567 { 0, 1 }, { n-1, n }, { n*n-1, -1 }, { n*(n-1), -n },
568 { 0, n*n }, { n-1, n*n }, { n*n - 1, n*n }, { n*(n-1), n*n },
569 { n*n*(n-1), 1 }, { n*n*(n-1) + n-1, n }, { n*n*n-1, -1 },
570 { n*n*(n-1) + n*(n-1), -n }
572 int hexFaces[6][3] = {
573 { 0, 1, n }, { 0, 1, n*n }, { n-1, n, n*n },
574 { n*(n-1), 1, n*n }, { 0, n, n*n }, { n*n*(n-1), 1, n }
576 int gmshToNekEdge[12] = {0, -3, 4, 1, 5, 2, 6, 7, 8, -11, 9, 10};
580 for (
int i = 0; i < 12; ++i)
582 int e = abs(gmshToNekEdge[i]);
584 if (gmshToNekEdge[i] >= 0)
586 for (
int j = 1; j < n-1; ++j)
588 nodeList[hexEdges[e][0] + j*hexEdges[e][1]] = nodes[offset++];
593 for (
int j = 1; j < n-1; ++j)
595 nodeList[hexEdges[e][0] + (n-j-1)*hexEdges[e][1]] = nodes[offset++];
601 int gmsh2NekFace[6] = {0, 1, 4, 2, 3, 5};
610 StdRegions::eDir1FwdDir1_Dir2FwdDir2};
612 for (i = 0; i < 6; ++i)
614 int n2 = (n-2)*(n-2);
615 int face = gmsh2NekFace[i];
616 offset = 8 + 12 * (n-2) + i * n2;
619 vector<int> faceNodes(n2);
620 for (j = 0; j < n2; ++j)
622 faceNodes[j] = nodes[offset + j];
632 if (faceOrient[i] == StdRegions::eDir1FwdDir1_Dir2FwdDir2)
640 for (j = 0; j < n-2; ++j)
642 for (k = 0; k < n-2; ++k)
644 tmp[j * (n-2) + k] = faceNodes[k * (n-2) + j];
650 for (j = 0; j < n-2; ++j)
652 for (k = 0; k < n-2; ++k)
654 tmp[j * (n-2) + k] = faceNodes[j * (n-2) + (n - k - 3)];
660 for (k = 1; k < n-1; ++k)
662 for (j = 1; j < n-1; ++j)
664 nodeList[hexFaces[face][0] + j*hexFaces[face][1] + k*hexFaces[face][2]]
665 = faceNodes[(k-1)*(n-2) + j-1];
671 vector<int> intNodes, tmpInt;
672 for (
int i = 8 + 12 * (n-2) + 6 * (n-2) * (n-2); i < n*n*n; ++i)
674 intNodes.push_back(nodes[i]);
680 for (
int k = 1, cnt = 0; k < n - 1; ++k)
682 for (
int j = 1; j < n - 1; ++j)
684 for (
int i = 1; i < n - 1; ++i)
686 nodeList[i + j * n + k * n * n] = tmpInt[cnt++];
701 :
InputModule(m), m_version(0.0), m_prevId(-1), m_maxTagId(-1)
747 cout <<
"InputGmsh: Start reading file..." << endl;
750 std::vector<std::map<int, GmshEntity>> entityMap(4);
755 stringstream s(line);
760 if (word ==
"$MeshFormat")
763 stringstream s(line);
766 ASSERTL0(fileType == 0,
"Cannot read binary Gmsh files.")
767 ASSERTL0(m_version <= 4.1,
".msh file format versions greater than 4.1 are not currently supported.")
770 else if (word ==
"$Entities")
774 stringstream s(line);
776 s >> nEntity[0] >> nEntity[1] >> nEntity[2] >> nEntity[3];
778 for (
int i = 0; i < 4; ++i)
780 for (
int j = 0; j < nEntity[i]; ++j)
783 stringstream si(line);
797 for (
int k = 0; k < nPhysTags; ++k)
803 entityMap[i][entityId] = ent;
808 else if (word ==
"$Nodes")
811 stringstream s(line);
817 for (
int i = 0; i < nVBlocks; ++i)
820 stringstream si(line);
821 si >> tmp >> tmp >> tmp >> nVertices;
825 for (
int i = 0; i < nVertices; ++i)
840 for (
int i = 0; i < nVertices; ++i)
847 else if (word ==
"$Elements")
850 stringstream s(line);
856 for (
int i = 0; i < nEBlocks; ++i)
859 stringstream si(line);
864 si >> tag >> tagDim >> elm_type >> nElements;
868 si >> tagDim >> tag >> elm_type >> nElements;
872 std::vector<int> physIds = entityMap[tagDim][tag].physicalTags;
874 if (physIds.size() == 0)
876 for (
int j = 0; j < nElements; ++j)
884 for (
int j = 0; j < nElements; ++j)
895 for (
int i = 0; i < nElements; ++i)
905 map<int, map<LibUtilities::ShapeType, int> > compMap;
907 for (
int i = 0; i <
m_mesh->m_element[
m_mesh->m_expDim].size(); ++i)
912 vector<int> tags = el->GetTagList();
915 auto cIt = compMap.find(tag);
917 if (cIt == compMap.end())
919 compMap[tag][type] = tag;
924 auto sIt = cIt->second.find(type);
925 if (sIt == cIt->second.end())
930 el->SetTagList(tags);
932 else if (sIt->second != tag)
934 tags[0] = sIt->second;
935 el->SetTagList(tags);
939 bool printInfo =
false;
940 for (
auto &cIt : compMap)
942 if (cIt.second.size() > 1)
951 cout <<
"Multiple elements in composite detected; remapped:" << endl;
952 for (
auto &cIt : compMap)
954 if (cIt.second.size() > 1)
956 auto sIt = cIt.second.begin();
957 cout <<
"- Tag " << cIt.first <<
" => " << sIt->second <<
" (" 961 for (; sIt != cIt.second.end(); ++sIt)
963 cout <<
", " << sIt->second <<
" (" 986 double x = 0, y = 0, z = 0;
987 vector<int> id(nVertices);
989 for (
int i = 0; i < nVertices; ++i)
992 stringstream st(line);
996 for (
int i = 0; i < nVertices; ++i)
999 stringstream st(line);
1013 stringstream st(line);
1014 double x = 0, y = 0, z = 0;
1016 st >>
id >> x >> y >> z;
1026 if ((x * x) > 0.000001 &&
m_mesh->m_spaceDim < 1)
1030 if ((y * y) > 0.000001 &&
m_mesh->m_spaceDim < 2)
1034 if ((z * z) > 0.000001 &&
m_mesh->m_spaceDim < 3)
1050 for (
int i = 0; i <
m_mesh->m_node.size(); ++i)
1063 m_mesh->m_node.push_back(std::shared_ptr<Node>(
new Node(
id, x, y, z)));
1073 stringstream st(line);
1074 int id = 0, num_tag = 0, num_nodes = 0;
1081 st >> elm_type >> num_tag;
1084 auto it =
elmMap.find(elm_type);
1087 cerr <<
"Error: element type " << elm_type <<
" not supported" << endl;
1093 for (
int j = 0; j < num_tag; ++j)
1097 tags.push_back(tag);
1101 tags.push_back(tag);
1108 vector<NodeSharedPtr> nodeList;
1110 for (
int k = 0; k < num_nodes; ++k)
1117 nodeList.push_back(
m_mesh->m_node[node]);
1137 if (oIt->second.size() > 0)
1139 vector<int> &mapping = oIt->second;
1140 vector<NodeSharedPtr> tmp = nodeList;
1141 for (
int i = 0; i < mapping.size(); ++i)
1143 nodeList[i] = tmp[mapping[i]];
1149 it->second.m_e, it->second, nodeList, tags);
1152 if (E->GetDim() >
m_mesh->m_expDim)
1154 m_mesh->m_expDim = E->GetDim();
1156 m_mesh->m_element[E->GetDim()].push_back(E);
1166 auto it =
elmMap.find(InputGmshEntity);
1170 cerr <<
"Unknown element type " << InputGmshEntity << endl;
1174 switch (it->second.m_e)
1202 cerr <<
"Unknown element type!" << endl;
1220 auto it =
elmMap.find(InputGmshEntity);
1224 cerr <<
"Unknown element type " << InputGmshEntity << endl;
1230 switch (it->second.m_e)
1254 vector<int> returnVal;
1260 const int order = conf.
m_order;
1262 vector<int> mapping(order+1);
1263 for(
int i = 0; i < order+1; i++)
1276 const int order = conf.
m_order;
1277 const int n = order - 1;
1280 vector<int> mapping(3);
1281 for (
int i = 0; i < 3; ++i)
1292 mapping.resize(3 + 3 * n);
1294 for (
int i = 3; i < 3 + 3 * n; ++i)
1305 vector<int> interior(n * (n - 1) / 2);
1306 for (
int i = 0; i < interior.size(); ++i)
1308 interior[i] = i + 3 + 3 * n;
1311 if (interior.size() > 0)
1316 mapping.insert(mapping.end(), interior.begin(), interior.end());
1325 const int order = conf.
m_order;
1326 const int n = order - 1;
1329 vector<int> mapping(4);
1330 for (
int i = 0; i < 4; ++i)
1341 mapping.resize(4 + 4 * n);
1343 for (
int i = 4; i < 4 + 4 * n; ++i)
1354 vector<int> interior(n * n);
1355 for (
int i = 0; i < interior.size(); ++i)
1357 interior[i] = i + 4 + 4 * n;
1360 if (interior.size() > 0)
1364 mapping.insert(mapping.end(), interior.begin(), interior.end());
1373 const int order = conf.
m_order;
1374 const int n = order - 1;
1375 const int n2 = n * (n - 1) / 2;
1378 vector<int> mapping(4);
1381 for (i = 0; i < 4; ++i)
1392 mapping.resize(4 + 6 * n);
1395 static int gmshToNekEdge[6] = {0, 1, 2, 3, 5, 4};
1396 static int gmshToNekRev[6] = {0, 0, 1, 1, 1, 1};
1399 int offset, cnt = 4;
1400 for (i = 0; i < 6; ++i)
1402 offset = 4 + n * gmshToNekEdge[i];
1404 if (gmshToNekRev[i])
1406 for (
int j = 0; j < n; ++j)
1408 mapping[offset + n - j - 1] = cnt++;
1413 for (
int j = 0; j < n; ++j)
1415 mapping[offset + j] = cnt++;
1426 mapping.resize(4 + 6 * n + 4 * n2);
1428 static int gmshToNekFace[4] = {0, 1, 3, 2};
1430 vector<int> triVertId(3);
1436 for (i = 0; i < 4; ++i)
1438 int face = gmshToNekFace[i];
1439 int offset2 = 4 + 6 * n + i * n2;
1440 offset = 4 + 6 * n + face * n2;
1443 vector<int> faceNodes(n2);
1444 vector<int> toAlign(3);
1445 for (j = 0; j < n2; ++j)
1447 faceNodes[j] = offset2 + j;
1456 if (i == 0 || i == 2)
1462 hoTri.
Align(toAlign);
1470 hoTri.
Align(toAlign);
1474 for (j = 0; j < n2; ++j)
1476 mapping[offset + j] = hoTri.
surfVerts[j];
1485 const int nInt = (order - 3) * (order - 2) * (order - 1) / 6;
1493 mapping.push_back(mapping.size());
1497 int ntot = (order+1)*(order+2)*(order+3)/6;
1498 vector<int> interior;
1500 for (
int i = 4 + 6 * n + 4 * n2; i < ntot; ++i)
1502 interior.push_back(i);
1505 if (interior.size() > 0)
1510 mapping.insert(mapping.end(), interior.begin(), interior.end());
1525 const int order = conf.
m_order;
1526 const int n = order - 1;
1529 vector<int> mapping(6);
1534 static int nekToGmshVerts[6] = {3, 4, 1, 0, 5, 2};
1537 for (i = 0; i < 6; ++i)
1539 mapping[i] = nekToGmshVerts[i];
1548 mapping.resize(6 + 9 * n);
1559 static int gmshToNekEdge[9] = {2, 7, 3, 6, 1, 8, 0, 4, 5};
1560 static int gmshToNekRev[9] = {0, 0, 1, 0, 1, 1, 0, 0, 0};
1563 int offset, cnt = 6;
1564 for (i = 0; i < 9; ++i)
1566 offset = 6 + n * gmshToNekEdge[i];
1568 if (gmshToNekRev[i])
1570 for (
int j = 0; j < n; ++j)
1572 mapping[offset + n - j - 1] = cnt++;
1577 for (
int j = 0; j < n; ++j)
1579 mapping[offset + j] = cnt++;
1589 int nTriInt = n * (n - 1) / 2;
1590 int nQuadInt = n * n;
1600 static int gmshToNekFace[5] = {3, 1, 0, 4, 2};
1603 vector<int> offsets(5), offsets2(5);
1607 offsets[0] = offset;
1608 offsets[1] = offset + nTriInt;
1609 offsets[2] = offset + 2 * nTriInt;
1610 offsets[3] = offset + 2 * nTriInt + nQuadInt;
1611 offsets[4] = offset + 2 * nTriInt + 2 * nQuadInt;
1614 offsets2[0] = offset;
1615 offsets2[1] = offset + nQuadInt;
1616 offsets2[2] = offset + nQuadInt + nTriInt;
1617 offsets2[3] = offset + 2 * nQuadInt + nTriInt;
1618 offsets2[4] = offset + 2 * nQuadInt + 2 * nTriInt;
1620 mapping.resize(6 + 9 * n + 3 * nQuadInt + 2 * nTriInt);
1624 vector<int> triVertId(3);
1629 vector<int> quadVertId(4);
1635 for (i = 0; i < 5; ++i)
1637 int face = gmshToNekFace[i];
1638 int offset2 = offsets[i];
1639 offset = offsets2[face];
1642 int nFacePts = tri ? nTriInt : nQuadInt;
1650 vector<int> faceNodes(nFacePts);
1651 vector<int> toAlign(tri ? 3 : 4);
1652 for (
int j = 0; j < nFacePts; ++j)
1654 faceNodes[j] = offset2 + j;
1671 hoTri.
Align(toAlign);
1675 for (
int j = 0; j < nTriInt; ++j)
1677 mapping[offset + j] = hoTri.
surfVerts[j];
1708 hoQuad.
Align(toAlign);
1711 for (
int j = 0; j < nQuadInt; ++j)
1713 mapping[offset + j] = hoQuad.
surfVerts[j];
1724 offset = offsets[4] + nQuadInt;
1725 vector<int> intPoints, tmp;
1727 for (
int i = offset; i < (order+1) * (order+1) * (order+2) / 2; ++i)
1729 intPoints.push_back(i);
1734 mapping.insert(mapping.end(), tmp.begin(), tmp.end());
1744 const int order = conf.
m_order;
1745 const int n = order - 1;
1746 const int n2 = n * n;
1749 vector<int> mapping;
1752 static int gmshToNekEdge[12] = {0, -3, 4, 1, 5, 2, 6, 7, 8, -11, 9, 10};
1756 for (i = 0; i < 8; ++i)
1767 mapping.resize(8 + 12 * n);
1770 int cnt = 8, offset;
1771 for (i = 0; i < 12; ++i)
1773 int edge = gmshToNekEdge[i];
1774 offset = 8 + n * abs(edge);
1778 for (
int j = 0; j < n; ++j)
1780 mapping[offset + n - j - 1] = cnt++;
1785 for (
int j = 0; j < n; ++j)
1787 mapping[offset + j] = cnt++;
1798 mapping.resize(8 + 12 * n + 6 * n2);
1801 static int gmsh2NekFace[6] = {0, 1, 4, 2, 3, 5};
1810 StdRegions::eDir1FwdDir1_Dir2FwdDir2};
1812 for (i = 0; i < 6; ++i)
1814 int face = gmsh2NekFace[i];
1815 int offset2 = 8 + 12 * n + i * n2;
1816 offset = 8 + 12 * n + face * n2;
1819 vector<int> faceNodes(n2);
1820 for (j = 0; j < n2; ++j)
1822 faceNodes[j] = offset2 + j;
1831 if (faceOrient[i] == StdRegions::eDir1FwdDir1_Dir2FwdDir2)
1834 for (j = 0; j < n2; ++j)
1836 mapping[offset + j] = tmp[j];
1842 for (j = 0; j < n; ++j)
1844 for (k = 0; k < n; ++k)
1846 mapping[offset + j * n + k] = tmp[k * n + j];
1852 for (j = 0; j < n; ++j)
1854 for (k = 0; k < n; ++k)
1856 mapping[offset + j * n + k] = tmp[j * n + (n - k - 1)];
1867 const int totPoints = (order + 1) * (order + 1) * (order + 1);
1868 vector<int> interior;
1869 for (i = 8 + 12 * n + 6 * n2; i < totPoints; ++i)
1871 interior.push_back(i);
1875 mapping.insert(mapping.end(), interior.begin(), interior.end());
1892 using namespace LibUtilities;
1893 std::map<unsigned int, ElmtConfig> tmp;
bool m_faceNodes
Denotes whether the element contains face nodes. For 2D elements, if this is true then the element co...
bool operator()(Mode const &a, Mode const &b) const
std::vector< int > prismTensorNodeOrdering(const std::vector< int > &nodes, int n)
Reorder Gmsh nodes so that they appear in a "tensor product" format suitable for the interior of a Ne...
#define ASSERTL0(condition, msg)
std::vector< int > triTensorNodeOrdering(const std::vector< int > &nodes, int n)
Reorder Gmsh nodes so that they appear in a "tensor product" format suitable for the interior of a Ne...
Basic information about an element.
void Align(std::vector< int > vertId)
Align this surface to a given vertex ID.
std::tuple< int, int, int > Mode
static NEKMESHUTILS_EXPORT unsigned int GetNumNodes(ElmtConfig pConf)
Return the number of nodes defining a quadrilateral.
std::vector< int > quadTensorNodeOrdering(const std::vector< int > &nodes, int n)
Reorder Gmsh nodes so that they appear in a tensor product format suitable for the interior of a Nekt...
std::vector< T > surfVerts
The quadrilateral surface vertices – templated so that this can either be nodes or IDs...
std::vector< T > surfVerts
The triangle surface vertices – templated so that this can either be nodes or IDs.
std::vector< int > physicalTags
MeshSharedPtr m_mesh
Mesh object.
std::shared_ptr< Mesh > MeshSharedPtr
Shared pointer to a mesh.
ElementFactory & GetElementFactory()
std::vector< int > hexTensorNodeOrdering(const std::vector< int > &nodes, int n)
Reorder Gmsh nodes so that they appear in a "tensor product" format suitable for the interior of a Ne...
const char *const ShapeTypeMap[]
unsigned int m_order
Order of the element.
static NEKMESHUTILS_EXPORT unsigned int GetNumNodes(ElmtConfig pConf)
Return the number of nodes defining a line.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
std::pair< ModuleType, std::string > ModuleKey
static NEKMESHUTILS_EXPORT unsigned int GetNumNodes(ElmtConfig pConf)
Return the number of nodes defining a prism.
bool m_volumeNodes
Denotes whether the element contains volume (i.e. interior) nodes. These are not supported by either ...
virtual NEKMESHUTILS_EXPORT void ProcessFaces(bool ReprocessFaces=true)
Extract element faces.
std::shared_ptr< Element > ElementSharedPtr
virtual NEKMESHUTILS_EXPORT void ProcessElements()
Generate element IDs.
static NEKMESHUTILS_EXPORT unsigned int GetNumNodes(ElmtConfig pConf)
Return the number of nodes defining a triangle.
Representation of Gmsh entity so that we can extract physical tag IDs.
void Align(std::vector< int > vertId)
Align this surface to a given vertex ID.
A lightweight struct for dealing with high-order triangle alignment.
static NEKMESHUTILS_EXPORT unsigned int GetNumNodes(ElmtConfig pConf)
Return the number of nodes defining a hexahedron.
A lightweight struct for dealing with high-order quadrilateral alignment.
static NEKMESHUTILS_EXPORT unsigned int GetNumNodes(ElmtConfig pConf)
Return the number of nodes defining a tetrahedron.
virtual NEKMESHUTILS_EXPORT void ProcessVertices()
Extract element vertices.
std::vector< int > tetTensorNodeOrdering(const std::vector< int > &nodes, int n)
Reorder Gmsh nodes so that they appear in a "tensor product" format suitable for the interior of a Ne...
static NEKMESHUTILS_EXPORT unsigned int GetNumNodes(ElmtConfig pConf)
Return the number of nodes defining a pyramid.
virtual NEKMESHUTILS_EXPORT void ProcessEdges(bool ReprocessEdges=true)
Extract element edges.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
static NEKMESHUTILS_EXPORT unsigned int GetNumNodes(ElmtConfig pConf)
Return the number of nodes defining a point (i.e. return 1).
2D Evenly-spaced points on a Triangle
std::pair< ModuleType, std::string > ModuleKey
virtual NEKMESHUTILS_EXPORT void ProcessComposites()
Generate composites.
ModuleFactory & GetModuleFactory()