35 #include <boost/core/ignore_unused.hpp> 36 #include <boost/algorithm/string.hpp> 54 "Reads Tecplot polyhedron ascii format converted from Star CCM (.dat).");
81 cout <<
"InputStarTec: Start reading file..." << endl;
95 if (line.find(
"ZONE") != string::npos)
105 if (line.find(
"ZONE") != string::npos)
124 int nfaces, nnodes, nelements;
131 nnodes = nfaces = nelements = 0;
136 boost::to_upper(line);
139 if (sscanf(line.c_str(),
"%lf", &value) == 1)
144 if ((line.find(
"NODES") != string::npos) &&
145 (line.find(
"TOTALNUMFACENODES") == string::npos))
151 start = tag.find(
"NODES=");
152 end = tag.find_first_of(
',', start);
153 nnodes = atoi(tag.substr(start + 6, end).c_str());
156 if ((line.find(
"FACES") != string::npos) &&
157 (line.find(
"NUMCONNECTEDBOUNDARYFACES") == string::npos))
163 start = tag.find(
"FACES=");
164 end = tag.find_first_of(
',', start);
165 nfaces = atoi(tag.substr(start + 6, end).c_str());
168 if (line.find(
"ELEMENTS") != string::npos)
174 start = tag.find(
"ELEMENTS=");
175 end = tag.find_first_of(
',', start);
176 nelements = atoi(tag.substr(start + 9, end).c_str());
179 if (line.find(
"ZONETYPE") != string::npos)
184 if ((line.find(
"FEPOLYGON") == string::npos) &&
185 (line.find(
"FEPOLYHEDRON") == string::npos))
188 "Routine only set up for FEPolygon or FEPolyhedron");
197 cout <<
"Setting up zone " << zcnt++;
199 int nodeCount = 3 * nnodes;
200 vector<NekDouble> nodeLocs;
202 while (nodeCount > 0 && !
m_mshFile.eof())
208 nodeLocs.push_back(value);
217 ASSERTL0(nodeLocs.size() == 3*nnodes,
"Unable to read correct number of " 218 "nodes from Tecplot file");
220 std::vector<NodeSharedPtr> Nodes;
221 for (i = 0; i < nnodes; ++i)
224 std::shared_ptr<Node>(
225 new Node(i, nodeLocs[i], nodeLocs[i+nnodes],
226 nodeLocs[i+2*nnodes])));
231 if (line.find(
"node count per face") == string::npos)
233 if (line.find(
"face nodes") == string::npos)
242 vector<int> Nodes_per_face;
243 if (line.find(
"node count per face") != string::npos)
246 for (i = 0; i < nfaces; ++i)
250 "Can only handle meshes with " 251 "up to four nodes per face");
252 Nodes_per_face.push_back(nodes);
259 if (line.find(
"face nodes") == string::npos)
266 vector<vector<int> > FaceNodes;
268 if (line.find(
"face nodes") != string::npos)
271 for (i = 0; i < nfaces; ++i)
275 int nodes = (Nodes_per_face.size()) ? Nodes_per_face[i] : 2;
279 for (
int j = 0; j < nodes; ++j)
284 Fnodes.push_back(nodeID - 1);
287 FaceNodes.push_back(Fnodes);
292 ASSERTL0(
false,
"Failed to find face node section");
300 if (line.find(
"left elements") == string::npos)
305 if (line.find(
"left elements") != string::npos)
309 for (i = 0; i < nfaces; ++i)
315 ElementFaces[elmtID - 1].push_back(i);
321 ASSERTL0(
false,
"Left element not found");
326 if (line.find(
"right elements") == string::npos)
331 if (line.find(
"right elements") != string::npos)
336 for (i = 0; i < nfaces; ++i)
342 ElementFaces[elmtID - 1].push_back(i);
351 ASSERTL0(
false,
"Left element not found");
354 if (Nodes_per_face.size())
356 cout <<
" (3D) " << endl;
365 for (i = 0; i < nelements; ++i)
367 if (ElementFaces[i].size() > 4)
370 Nodes, i, ElementFaces[i], FaceNodes, nComposite,
true);
377 for (i = 0; i < nelements; ++i)
379 if (ElementFaces[i].size() == 4)
382 Nodes, i, ElementFaces[i], FaceNodes, nComposite,
true);
391 cout <<
" (2D)" << endl;
395 for (i = 0; i < Nodes.size(); ++i)
397 auto it =
m_mesh->m_vertexSet.find(Nodes[i]);
399 if (it ==
m_mesh->m_vertexSet.end())
401 ASSERTL0(
false,
"Failed to find face vertex in 3D list");
409 for (i = 0; i < nelements; ++i)
411 GenElement2D(Nodes, i, ElementFaces[i], FaceNodes, nComposite);
419 map<int, int> &facelist,
420 vector<vector<int> > &FacesToPrisms,
421 vector<vector<int> > &PrismsToFaces,
422 vector<bool> &PrismDone);
426 vector<vector<int> > &FaceNodes)
430 int face1_map[3] = {0, 1, 4};
431 int face3_map[3] = {3, 2, 5};
433 map<int, bool> FacesRenumbered;
436 vector<vector<int> > FaceToPrisms(FaceNodes.size());
437 vector<vector<int> > PrismToFaces(ElementFaces.num_elements());
438 map<int, int> Prisms;
442 for (i = 0; i < ElementFaces.num_elements(); ++i)
445 if (ElementFaces[i].size() == 5)
447 vector<int> LocTriFaces;
449 for (j = 0; j < ElementFaces[i].size(); ++j)
451 if (FaceNodes[ElementFaces[i][j]].size() == 3)
453 LocTriFaces.push_back(j);
457 if (LocTriFaces.size() == 2)
461 PrismToFaces[i].push_back(ElementFaces[i][LocTriFaces[0]]);
462 PrismToFaces[i].push_back(ElementFaces[i][LocTriFaces[1]]);
464 FaceToPrisms[ElementFaces[i][LocTriFaces[0]]].push_back(i);
465 FaceToPrisms[ElementFaces[i][LocTriFaces[1]]].push_back(i);
470 vector<bool> FacesDone(FaceNodes.size(),
false);
471 vector<bool> PrismDone(ElementFaces.num_elements(),
false);
476 for (
auto &PrismIt : Prisms)
478 int elmtid = PrismIt.first;
479 map<int, int> facelist;
481 if (PrismDone[elmtid])
489 elmtid, facelist, FaceToPrisms, PrismToFaces, PrismDone);
492 for (
auto &faceIt : facelist)
494 int faceid = faceIt.second;
496 for (i = 0; i < FaceToPrisms[faceid].size(); ++i)
498 int prismid = FaceToPrisms[faceid][i];
500 if ((FacesDone[PrismToFaces[prismid][0]] ==
true) &&
501 (FacesDone[PrismToFaces[prismid][1]] ==
true))
509 if ((FacesDone[PrismToFaces[prismid][0]] ==
false) &&
510 (FacesDone[PrismToFaces[prismid][1]] ==
false))
514 for (i = 0; i < 3; ++i)
516 if (NodeReordering[Nodes[face1_map[i]]] == -1)
518 NodeReordering[Nodes[face1_map[i]]] = nodeid++;
522 for (i = 0; i < 3; ++i)
524 if (NodeReordering[Nodes[face3_map[i]]] == -1)
526 NodeReordering[Nodes[face3_map[i]]] = nodeid++;
530 else if ((FacesDone[PrismToFaces[prismid][0]] ==
false) &&
531 (FacesDone[PrismToFaces[prismid][1]] ==
true))
534 int max_id1, max_id2;
536 max_id1 = (NodeReordering[Nodes[face3_map[0]]] <
537 NodeReordering[Nodes[face3_map[1]]])
540 max_id2 = (NodeReordering[Nodes[face3_map[max_id1]]] <
541 NodeReordering[Nodes[face3_map[2]]])
546 int id0 = (max_id1 == 1) ? 0 : 1;
548 if (NodeReordering[Nodes[face1_map[id0]]] == -1)
550 NodeReordering[Nodes[face1_map[id0]]] = nodeid++;
553 if (NodeReordering[Nodes[face1_map[max_id1]]] == -1)
555 NodeReordering[Nodes[face1_map[max_id1]]] =
559 if (NodeReordering[Nodes[face1_map[max_id2]]] == -1)
561 NodeReordering[Nodes[face1_map[max_id2]]] =
565 else if ((FacesDone[PrismToFaces[prismid][0]] ==
true) &&
566 (FacesDone[PrismToFaces[prismid][1]] ==
false))
569 int max_id1, max_id2;
571 max_id1 = (NodeReordering[Nodes[face1_map[0]]] <
572 NodeReordering[Nodes[face1_map[1]]])
575 max_id2 = (NodeReordering[Nodes[face1_map[max_id1]]] <
576 NodeReordering[Nodes[face1_map[2]]])
581 int id0 = (max_id1 == 1) ? 0 : 1;
583 if (NodeReordering[Nodes[face3_map[id0]]] == -1)
585 NodeReordering[Nodes[face3_map[id0]]] = nodeid++;
588 if (NodeReordering[Nodes[face3_map[max_id1]]] == -1)
590 NodeReordering[Nodes[face3_map[max_id1]]] =
594 if (NodeReordering[Nodes[face3_map[max_id2]]] == -1)
596 NodeReordering[Nodes[face3_map[max_id2]]] =
606 for (i = 0; i < NodeReordering.num_elements(); ++i)
608 if (NodeReordering[i] == -1)
610 NodeReordering[i] = nodeid++;
614 ASSERTL1(nodeid == NodeReordering.num_elements(),
615 "Have not renumbered all nodes");
618 for (i = 0; i < FaceNodes.size(); ++i)
620 for (j = 0; j < FaceNodes[i].size(); ++j)
622 FaceNodes[i][j] = NodeReordering[FaceNodes[i][j]];
626 vector<NodeSharedPtr> save(Vnodes);
627 for (i = 0; i < Vnodes.size(); ++i)
629 Vnodes[NodeReordering[i]] = save[i];
630 Vnodes[NodeReordering[i]]->SetID(NodeReordering[i]);
635 map<int, int> &facelist,
636 vector<vector<int> > &FaceToPrisms,
637 vector<vector<int> > &PrismToFaces,
638 vector<bool> &PrismDone)
640 if (PrismDone[prismid] ==
false)
642 PrismDone[prismid] =
true;
645 int face = PrismToFaces[prismid][0];
646 facelist[face] = face;
647 for (
int i = 0; i < FaceToPrisms[face].size(); ++i)
657 face = PrismToFaces[prismid][1];
658 facelist[face] = face;
659 for (
int i = 0; i < FaceToPrisms[face].size(); ++i)
672 vector<int> &ElementFaces,
673 vector<vector<int> > &FaceNodes,
676 boost::ignore_unused(i);
681 if (ElementFaces.size() == 3)
685 else if (ElementFaces.size() == 4)
692 "Not set up for elements which are not Tris or Quads");
697 tags.push_back(nComposite);
700 vector<NodeSharedPtr> nodeList;
702 for (
int j = 0; j < Nodes.num_elements(); ++j)
704 nodeList.push_back(VertNodes[Nodes[j]]);
712 m_mesh->m_element[E->GetDim()].push_back(E);
717 vector<int> &ElementFaces,
718 vector<vector<int> > &FaceNodes,
722 boost::ignore_unused(i);
727 int nnodes = Nodes.num_elements();
728 map<LibUtilities::ShapeType, int> domainComposite;
738 else if (nnodes == 5)
742 else if (nnodes == 6)
749 "Not set up for elements which are not Tets, " 750 "Prisms or Pyramids.");
755 tags.push_back(nComposite);
758 vector<NodeSharedPtr> nodeList;
759 for (
int j = 0; j < Nodes.num_elements(); ++j)
761 nodeList.push_back(VertNodes[Nodes[j]]);
767 ElmtConfig conf(elType, 1,
true,
true, DoOrient);
771 m_mesh->m_element[E->GetDim()].push_back(E);
775 cout <<
"Warning: Pyramid detected " << endl;
780 vector<int> &ElementFaces,
781 vector<vector<int> > &FaceNodes)
786 if (ElementFaces.size() == 3)
790 returnval[0] = FaceNodes[ElementFaces[0]][0];
791 returnval[1] = FaceNodes[ElementFaces[0]][1];
794 for (i = 0; i < 2; ++i)
796 if ((FaceNodes[ElementFaces[1]][i] != returnval[0]) &&
797 (FaceNodes[ElementFaces[1]][i] != returnval[1]))
799 returnval[2] = FaceNodes[ElementFaces[1]][i];
804 else if (ElementFaces.size() == 4)
808 int indx0 = FaceNodes[ElementFaces[0]][0];
809 int indx1 = FaceNodes[ElementFaces[0]][1];
814 for (j = 1; j < 4; ++j)
816 for (i = 0; i < 2; ++i)
818 if ((FaceNodes[ElementFaces[j]][i] != indx0) &&
819 (FaceNodes[ElementFaces[j]][i] != indx1))
823 indx2 = FaceNodes[ElementFaces[j]][i];
825 else if (indx2 != -1)
827 if (FaceNodes[ElementFaces[j]][i] != indx2)
829 indx3 = FaceNodes[ElementFaces[j]][i];
836 ASSERTL1((indx2 != -1) && (indx3 != -1),
837 "Failed to find vertex 3 or 4");
840 Node a = *(Vnodes[indx1]) - *(Vnodes[indx0]);
842 Node b = *(Vnodes[indx2]) - *(Vnodes[indx0]);
846 Node c = *(Vnodes[indx1]) - *(Vnodes[indx2]);
848 Node d = *(Vnodes[indx3]) - *(Vnodes[indx2]);
852 if (acurlb_dot_acurld > 0.0)
854 returnval[0] = indx0;
855 returnval[1] = indx1;
856 returnval[2] = indx2;
857 returnval[3] = indx3;
861 returnval[0] = indx0;
862 returnval[1] = indx1;
863 returnval[2] = indx3;
864 returnval[3] = indx2;
872 vector<int> &ElementFaces,
873 vector<vector<int> > &FaceNodes)
879 if (ElementFaces.size() == 4)
881 ASSERTL1(FaceNodes[ElementFaces[0]].size() == 3,
882 "Face is not triangular");
886 int indx0 = FaceNodes[ElementFaces[0]][0];
887 int indx1 = FaceNodes[ElementFaces[0]][1];
888 int indx2 = FaceNodes[ElementFaces[0]][2];
892 Node a = *(Vnodes[indx1]) - *(Vnodes[indx0]);
894 Node b = *(Vnodes[indx2]) - *(Vnodes[indx0]);
897 ASSERTL1(FaceNodes[ElementFaces[1]].size() == 3,
898 "Face is not triangular");
899 for (i = 0; i < 3; ++i)
902 if ((FaceNodes[ElementFaces[1]][i] != indx0) &&
903 (FaceNodes[ElementFaces[1]][i] != indx1) &&
904 (FaceNodes[ElementFaces[1]][i] != indx2))
906 indx3 = FaceNodes[ElementFaces[1]][i];
912 Node c = *(Vnodes[indx3]) - *(Vnodes[indx0]);
916 if (acurlb_dotc < 0.0)
918 returnval[0] = indx0;
919 returnval[1] = indx1;
920 returnval[2] = indx2;
921 returnval[3] = indx3;
925 returnval[0] = indx1;
926 returnval[1] = indx0;
927 returnval[2] = indx2;
928 returnval[3] = indx3;
931 else if (ElementFaces.size() == 5)
933 int triface0, triface1;
934 int quadface0, quadface1, quadface2;
938 triface0 = triface1 = -1;
939 quadface0 = quadface1 = quadface2 = -1;
940 for (i = 0; i < 5; ++i)
942 if (FaceNodes[ElementFaces[i]].size() == 3)
948 else if (triface1 == -1)
958 if (FaceNodes[ElementFaces[i]].size() == 4)
964 else if (quadface1 == -1)
968 else if (quadface2 == -1)
985 int indx0, indx1, indx2, indx3, indx4;
987 indx0 = indx1 = indx2 = indx3 = indx4 = -1;
992 for (i = 0; i < 4; ++i)
994 for (j = 0; j < 3; ++j)
996 if (FaceNodes[ElementFaces[triface0]][j] ==
997 FaceNodes[ElementFaces[quadface0]][i])
1007 indx2 = FaceNodes[ElementFaces[quadface0]][i];
1009 else if (indx3 == -1)
1011 indx3 = FaceNodes[ElementFaces[quadface0]][i];
1017 "More than two vertices do not match triangular face");
1024 indx0 = FaceNodes[ElementFaces[quadface0]][i];
1028 indx1 = FaceNodes[ElementFaces[quadface0]][i];
1034 for (
int i = 0; i < 3; ++i)
1036 if ((FaceNodes[ElementFaces[triface0]][i] != indx0) &&
1037 (FaceNodes[ElementFaces[triface0]][i] != indx1) &&
1038 (FaceNodes[ElementFaces[triface0]][i] != indx2))
1040 indx4 = FaceNodes[ElementFaces[triface0]][i];
1046 Node a = *(Vnodes[indx1]) - *(Vnodes[indx0]);
1048 Node b = *(Vnodes[indx4]) - *(Vnodes[indx0]);
1050 Node c = *(Vnodes[indx2]) - *(Vnodes[indx0]);
1054 if (acurlb_dotc < 0.0)
1056 returnval[0] = indx0;
1057 returnval[1] = indx1;
1058 returnval[4] = indx4;
1062 returnval[0] = indx1;
1063 returnval[1] = indx0;
1064 returnval[4] = indx4;
1072 for (
int i = 0; i < 4; ++i)
1074 if ((FaceNodes[ElementFaces[quadface1]][i] == returnval[1]) ||
1075 (FaceNodes[ElementFaces[quadface1]][i] == indx2))
1083 returnval[2] = indx2;
1084 returnval[3] = indx3;
1089 for (
int i = 0; i < 4; ++i)
1091 if ((FaceNodes[ElementFaces[quadface2]][i] == returnval[1]) ||
1092 (FaceNodes[ElementFaces[quadface2]][i] == indx2))
1101 returnval[2] = indx3;
1102 returnval[3] = indx2;
1106 returnval[2] = indx2;
1107 returnval[3] = indx3;
1111 if (isPrism ==
true)
1114 for (
int i = 0; i < 3; ++i)
1116 if ((FaceNodes[ElementFaces[triface1]][i] != indx2) &&
1117 (FaceNodes[ElementFaces[triface1]][i] != indx3) &&
1118 (FaceNodes[ElementFaces[triface1]][i] != indx3))
1120 returnval[5] = FaceNodes[ElementFaces[triface1]][i];
1128 ASSERTL0(
false,
"SortFaceNodes not set up for this number of faces");
#define ASSERTL0(condition, msg)
Basic information about an element.
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
NEKMESHUTILS_EXPORT NekDouble dot(const Node &pSrc) const
MeshSharedPtr m_mesh
Mesh object.
std::shared_ptr< Mesh > MeshSharedPtr
Shared pointer to a mesh.
ElementFactory & GetElementFactory()
Represents a point in the domain.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
std::pair< ModuleType, std::string > ModuleKey
virtual NEKMESHUTILS_EXPORT void ProcessFaces(bool ReprocessFaces=true)
Extract element faces.
std::shared_ptr< Element > ElementSharedPtr
virtual NEKMESHUTILS_EXPORT void ProcessElements()
Generate element IDs.
NEKMESHUTILS_EXPORT Node curl(const Node &pSrc) const
static void PrismLineFaces(int prismid, map< int, int > &facelist, vector< vector< int > > &FacesToPrisms, vector< vector< int > > &PrismsToFaces, vector< bool > &PrismDone)
virtual NEKMESHUTILS_EXPORT void ProcessVertices()
Extract element vertices.
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.
std::pair< ModuleType, std::string > ModuleKey
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
virtual NEKMESHUTILS_EXPORT void ProcessComposites()
Generate composites.
ModuleFactory & GetModuleFactory()