46 #include <boost/format.hpp>
54 namespace SpatialDomains
57 std::string MeshGraphXml::className =
59 "IO with Xml geometry");
61 void MeshGraphXml::v_PartitionMesh(
67 const bool isRoot = comm->TreatAsRankZero();
79 int isPartitioned = 0;
82 if (m_session->DefinesElement(
"Nektar/Geometry"))
84 if (m_session->GetElement(
"Nektar/Geometry")
85 ->Attribute(
"PARTITION"))
87 std::cout <<
"Using pre-partitioned mesh." << std::endl;
92 comm->Bcast(isPartitioned, 0);
100 m_session->InitSession();
107 string partitionerName =
"Metis";
110 partitionerName =
"Scotch";
112 if (session->DefinesCmdLineArgument(
"use-metis"))
114 partitionerName =
"Metis";
116 if (session->DefinesCmdLineArgument(
"use-scotch"))
118 partitionerName =
"Scotch";
124 if (session->DefinesCmdLineArgument(
"part-only") ||
125 session->DefinesCmdLineArgument(
"part-only-overlapping"))
130 "The 'part-only' option should be used in serial.");
137 auto comp = CreateCompositeDescriptor();
141 partitionerName, session, session->GetComm(),
142 m_meshDimension, CreateMeshEntities(), comp);
144 if (session->DefinesCmdLineArgument(
"part-only"))
146 nParts = session->GetCmdLineArgument<
int>(
"part-only");
147 partitioner->PartitionMesh(nParts,
true);
152 session->GetCmdLineArgument<
int>(
"part-only-overlapping");
153 partitioner->PartitionMesh(nParts,
true,
true);
156 vector<set<unsigned int>> elmtIDs;
157 vector<unsigned int> parts(nParts);
158 for (
int i = 0; i < nParts; ++i)
160 vector<unsigned int> elIDs;
161 set<unsigned int> tmp;
162 partitioner->GetElementIDs(i, elIDs);
163 tmp.insert(elIDs.begin(), elIDs.end());
164 elmtIDs.push_back(tmp);
168 this->WriteXMLGeometry(m_session->GetSessionName(), elmtIDs, parts);
170 if (isRoot && session->DefinesCmdLineArgument(
"part-info"))
172 partitioner->PrintPartInfo(std::cout);
179 if (commMesh->GetSize() > 1)
181 int nParts = commMesh->GetSize();
183 if (session->GetSharedFilesystem())
185 vector<unsigned int> keys, vals;
194 m_compOrder = CreateCompositeOrdering();
195 auto comp = CreateCompositeDescriptor();
200 partitionerName, session, session->GetComm(),
201 m_meshDimension, CreateMeshEntities(), comp);
203 partitioner->PartitionMesh(nParts,
true);
205 vector<set<unsigned int>> elmtIDs;
206 vector<unsigned int> parts(nParts);
207 for (i = 0; i < nParts; ++i)
209 vector<unsigned int> elIDs;
210 set<unsigned int> tmp;
211 partitioner->GetElementIDs(i, elIDs);
212 tmp.insert(elIDs.begin(), elIDs.end());
213 elmtIDs.push_back(tmp);
219 this->WriteXMLGeometry(m_session->GetSessionName(), elmtIDs,
227 keys[0] = m_compOrder.size();
228 keys[1] = m_bndRegOrder.size();
229 comm->Bcast(keys, 0);
233 keys.resize(m_compOrder.size());
234 vals.resize(m_compOrder.size());
237 for (
auto &cIt : m_compOrder)
240 vals[i++] = cIt.second.size();
244 comm->Bcast(keys, 0);
245 comm->Bcast(vals, 0);
246 for (
auto &cIt : m_compOrder)
248 comm->Bcast(cIt.second, 0);
253 keys.resize(m_bndRegOrder.size());
254 vals.resize(m_bndRegOrder.size());
257 for (
auto &bIt : m_bndRegOrder)
260 vals[i++] = bIt.second.size();
266 comm->Bcast(keys, 0);
270 comm->Bcast(vals, 0);
272 for (
auto &bIt : m_bndRegOrder)
274 comm->Bcast(bIt.second, 0);
277 if (session->DefinesCmdLineArgument(
"part-info"))
279 partitioner->PrintPartInfo(std::cout);
285 comm->Bcast(keys, 0);
287 int cmpSize = keys[0];
288 int bndSize = keys[1];
290 keys.resize(cmpSize);
291 vals.resize(cmpSize);
292 comm->Bcast(keys, 0);
293 comm->Bcast(vals, 0);
295 for (
int i = 0; i < keys.size(); ++i)
297 vector<unsigned int> tmp(vals[i]);
299 m_compOrder[keys[i]] = tmp;
302 keys.resize(bndSize);
303 vals.resize(bndSize);
306 comm->Bcast(keys, 0);
310 comm->Bcast(vals, 0);
312 for (
int i = 0; i < keys.size(); ++i)
314 vector<unsigned int> tmp(vals[i]);
316 m_bndRegOrder[keys[i]] = tmp;
322 m_session->InitSession();
325 m_compOrder = CreateCompositeOrdering();
326 auto comp = CreateCompositeDescriptor();
333 partitionerName, session, session->GetComm(),
334 m_meshDimension, CreateMeshEntities(), comp);
336 partitioner->PartitionMesh(nParts,
false);
338 vector<unsigned int> parts(1), tmp;
339 parts[0] = commMesh->GetRank();
340 vector<set<unsigned int>> elIDs(1);
341 partitioner->GetElementIDs(parts[0], tmp);
342 elIDs[0].insert(tmp.begin(), tmp.end());
344 this->WriteXMLGeometry(session->GetSessionName(), elIDs, parts);
346 if (m_session->DefinesCmdLineArgument(
"part-info") && isRoot)
348 partitioner->PrintPartInfo(std::cout);
355 std::string dirname = m_session->GetSessionName() +
"_xml";
356 fs::path pdirname(dirname);
358 pad % comm->GetRowComm()->GetRank();
359 fs::path pFilename(pad.str());
360 fs::path fullpath = pdirname / pFilename;
362 std::vector<std::string> filenames = {
364 m_session->InitSession(filenames);
371 m_session->InitSession();
381 m_curvedEdges.clear();
382 m_curvedFaces.clear();
388 m_prismGeoms.clear();
390 m_meshComposites.clear();
391 m_compositesLabels.clear();
393 m_expansionMapShPtrMap.clear();
395 m_faceToElMap.clear();
398 m_xmlGeom = m_session->GetElement(
"NEKTAR/GEOMETRY");
402 TiXmlAttribute *attr = m_xmlGeom->FirstAttribute();
407 m_meshPartitioned =
false;
409 m_spaceDimension = 3;
413 std::string attrName(attr->Name());
414 if (attrName ==
"DIM")
416 err = attr->QueryIntValue(&m_meshDimension);
417 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read mesh dimension.");
419 else if (attrName ==
"SPACE")
421 err = attr->QueryIntValue(&m_spaceDimension);
422 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read space dimension.");
424 else if (attrName ==
"PARTITION")
426 err = attr->QueryIntValue(&m_partition);
427 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read partition.");
428 m_meshPartitioned =
true;
432 std::string errstr(
"Unknown attribute: ");
441 ASSERTL0(m_meshDimension <= m_spaceDimension,
442 "Mesh dimension greater than space dimension");
446 if (m_meshDimension >= 2)
449 if (m_meshDimension == 3)
460 MeshGraph::FillGraph();
464 void MeshGraphXml::v_ReadVertices()
467 TiXmlElement *element = m_xmlGeom->FirstChildElement(
"VERTEX");
468 ASSERTL0(element,
"Unable to find mesh VERTEX tag in file.");
475 const char *xscal = element->Attribute(
"XSCALE");
482 std::string xscalstr = xscal;
484 xscale = expEvaluator.
Evaluate(expr_id);
487 const char *yscal = element->Attribute(
"YSCALE");
494 std::string yscalstr = yscal;
496 yscale = expEvaluator.
Evaluate(expr_id);
499 const char *zscal = element->Attribute(
"ZSCALE");
506 std::string zscalstr = zscal;
508 zscale = expEvaluator.
Evaluate(expr_id);
516 const char *xmov = element->Attribute(
"XMOVE");
523 std::string xmovstr = xmov;
525 xmove = expEvaluator.
Evaluate(expr_id);
528 const char *ymov = element->Attribute(
"YMOVE");
535 std::string ymovstr = ymov;
537 ymove = expEvaluator.
Evaluate(expr_id);
540 const char *zmov = element->Attribute(
"ZMOVE");
547 std::string zmovstr = zmov;
549 zmove = expEvaluator.
Evaluate(expr_id);
552 TiXmlElement *vertex = element->FirstChildElement(
"V");
555 int nextVertexNumber = -1;
561 TiXmlAttribute *vertexAttr = vertex->FirstAttribute();
562 std::string attrName(vertexAttr->Name());
565 (std::string(
"Unknown attribute name: ") + attrName).c_str());
567 int err = vertexAttr->QueryIntValue(&indx);
568 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read attribute ID.");
571 std::string vertexBodyStr;
573 TiXmlNode *vertexBody = vertex->FirstChild();
578 if (vertexBody->Type() == TiXmlNode::TINYXML_TEXT)
580 vertexBodyStr += vertexBody->ToText()->Value();
581 vertexBodyStr +=
" ";
584 vertexBody = vertexBody->NextSibling();
588 "Vertex definitions must contain vertex data.");
592 std::istringstream vertexDataStrm(vertexBodyStr.c_str());
596 while (!vertexDataStrm.fail())
598 vertexDataStrm >> xval >> yval >> zval;
600 xval = xval * xscale + xmove;
601 yval = yval * yscale + ymove;
602 zval = zval * zscale + zmove;
607 if (!vertexDataStrm.fail())
611 m_spaceDimension, indx, xval, yval, zval));
612 m_vertSet[indx] = vert;
618 ASSERTL0(
false,
"Unable to read VERTEX data.");
621 vertex = vertex->NextSiblingElement(
"V");
625 void MeshGraphXml::v_ReadCurves()
629 TiXmlElement *element = m_xmlGeom->FirstChildElement(
"VERTEX");
630 ASSERTL0(element,
"Unable to find mesh VERTEX tag in file.");
635 const char *xscal = element->Attribute(
"XSCALE");
642 std::string xscalstr = xscal;
644 xscale = expEvaluator.
Evaluate(expr_id);
647 const char *yscal = element->Attribute(
"YSCALE");
654 std::string yscalstr = yscal;
656 yscale = expEvaluator.
Evaluate(expr_id);
659 const char *zscal = element->Attribute(
"ZSCALE");
666 std::string zscalstr = zscal;
668 zscale = expEvaluator.
Evaluate(expr_id);
676 const char *xmov = element->Attribute(
"XMOVE");
683 std::string xmovstr = xmov;
685 xmove = expEvaluator.
Evaluate(expr_id);
688 const char *ymov = element->Attribute(
"YMOVE");
695 std::string ymovstr = ymov;
697 ymove = expEvaluator.
Evaluate(expr_id);
700 const char *zmov = element->Attribute(
"ZMOVE");
707 std::string zmovstr = zmov;
709 zmove = expEvaluator.
Evaluate(expr_id);
715 TiXmlElement *field = m_xmlGeom->FirstChildElement(
"CURVED");
726 TiXmlElement *edgelement = field->FirstChildElement(
"E");
728 int edgeindx, edgeid;
729 int nextEdgeNumber = -1;
736 std::string edge(edgelement->ValueStr());
738 (std::string(
"Unknown 3D curve type:") + edge).c_str());
741 err = edgelement->QueryIntAttribute(
"ID", &edgeindx);
742 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read curve attribute ID.");
745 err = edgelement->QueryIntAttribute(
"EDGEID", &edgeid);
747 "Unable to read curve attribute EDGEID.");
750 std::string elementStr;
751 TiXmlNode *elementChild = edgelement->FirstChild();
756 if (elementChild->Type() == TiXmlNode::TINYXML_TEXT)
758 elementStr += elementChild->ToText()->ValueStr();
761 elementChild = elementChild->NextSibling();
764 ASSERTL0(!elementStr.empty(),
"Unable to read curve description body.");
772 std::string typeStr = edgelement->Attribute(
"TYPE");
773 ASSERTL0(!typeStr.empty(),
"TYPE must be specified in "
774 "points definition");
778 const std::string *endStr =
780 const std::string *ptsStr =
std::find(begStr, endStr, typeStr);
782 ASSERTL0(ptsStr != endStr,
"Invalid points type.");
786 err = edgelement->QueryIntAttribute(
"NUMPOINTS", &numPts);
788 "Unable to read curve attribute NUMPOINTS.");
794 std::istringstream elementDataStrm(elementStr.c_str());
797 while (!elementDataStrm.fail())
799 elementDataStrm >> xval >> yval >> zval;
801 xval = xval * xscale + xmove;
802 yval = yval * yscale + ymove;
803 zval = zval * zscale + zmove;
808 if (!elementDataStrm.fail())
812 m_meshDimension, edgeindx, xval, yval, zval));
814 curve->m_points.push_back(vert);
821 (std::string(
"Unable to read curve data for EDGE: ") +
826 ASSERTL0(curve->m_points.size() == numPts,
827 "Number of points specificed by attribute "
828 "NUMPOINTS is different from number of points "
829 "in list (edgeid = " +
830 boost::lexical_cast<string>(edgeid));
832 m_curvedEdges[edgeid] = curve;
834 edgelement = edgelement->NextSiblingElement(
"E");
840 TiXmlElement *facelement = field->FirstChildElement(
"F");
841 int faceindx, faceid;
845 std::string face(facelement->ValueStr());
847 (std::string(
"Unknown 3D curve type: ") + face).c_str());
850 err = facelement->QueryIntAttribute(
"ID", &faceindx);
851 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read curve attribute ID.");
854 err = facelement->QueryIntAttribute(
"FACEID", &faceid);
856 "Unable to read curve attribute FACEID.");
859 std::string elementStr;
860 TiXmlNode *elementChild = facelement->FirstChild();
865 if (elementChild->Type() == TiXmlNode::TINYXML_TEXT)
867 elementStr += elementChild->ToText()->ValueStr();
870 elementChild = elementChild->NextSibling();
873 ASSERTL0(!elementStr.empty(),
"Unable to read curve description body.");
879 std::string typeStr = facelement->Attribute(
"TYPE");
880 ASSERTL0(!typeStr.empty(),
"TYPE must be specified in "
881 "points definition");
884 const std::string *endStr =
886 const std::string *ptsStr =
std::find(begStr, endStr, typeStr);
888 ASSERTL0(ptsStr != endStr,
"Invalid points type.");
891 std::string numptsStr = facelement->Attribute(
"NUMPOINTS");
893 "NUMPOINTS must be specified in points definition");
902 ASSERTL0(numPts >= 3,
"NUMPOINTS for face must be greater than 2");
906 ASSERTL0(ptsStr != endStr,
"Invalid points type.");
911 std::istringstream elementDataStrm(elementStr.c_str());
914 while (!elementDataStrm.fail())
916 elementDataStrm >> xval >> yval >> zval;
922 if (!elementDataStrm.fail())
926 m_meshDimension, faceindx, xval, yval, zval));
927 curve->m_points.push_back(vert);
934 (std::string(
"Unable to read curve data for FACE: ") +
938 m_curvedFaces[faceid] = curve;
940 facelement = facelement->NextSiblingElement(
"F");
945 void MeshGraphXml::ReadDomain()
947 TiXmlElement *domain = NULL;
949 domain = m_xmlGeom->FirstChildElement(
"DOMAIN");
951 ASSERTL0(domain,
"Unable to find DOMAIN tag in file.");
955 TiXmlElement *multidomains = domain->FirstChildElement(
"D");
962 int err = multidomains->QueryIntAttribute(
"ID", &indx);
964 "Unable to read attribute ID in Domain.");
966 TiXmlNode *elementChild = multidomains->FirstChild();
967 while (elementChild &&
968 elementChild->Type() != TiXmlNode::TINYXML_TEXT)
970 elementChild = elementChild->NextSibling();
973 ASSERTL0(elementChild,
"Unable to read DOMAIN body.");
974 std::string elementStr = elementChild->ToText()->ValueStr();
976 elementStr = elementStr.substr(elementStr.find_first_not_of(
" "));
978 std::string::size_type indxBeg = elementStr.find_first_of(
'[') + 1;
979 std::string::size_type indxEnd = elementStr.find_last_of(
']') - 1;
980 std::string indxStr =
981 elementStr.substr(indxBeg, indxEnd - indxBeg + 1);
985 "Unable to read domain's composite index (index missing?).");
989 map<int, CompositeSharedPtr> unrollDomain;
990 GetCompositeList(indxStr, unrollDomain);
991 m_domain[indx] = unrollDomain;
995 "Unable to obtain domain's referenced composite: ") +
1000 multidomains = multidomains->NextSiblingElement(
"D");
1007 TiXmlNode *elementChild = domain->FirstChild();
1008 while (elementChild && elementChild->Type() != TiXmlNode::TINYXML_TEXT)
1010 elementChild = elementChild->NextSibling();
1013 ASSERTL0(elementChild,
"Unable to read DOMAIN body.");
1014 std::string elementStr = elementChild->ToText()->ValueStr();
1016 elementStr = elementStr.substr(elementStr.find_first_not_of(
" "));
1018 std::string::size_type indxBeg = elementStr.find_first_of(
'[') + 1;
1019 std::string::size_type indxEnd = elementStr.find_last_of(
']') - 1;
1020 std::string indxStr = elementStr.substr(indxBeg, indxEnd - indxBeg + 1);
1023 "Unable to read domain's composite index (index missing?).");
1027 map<int, CompositeSharedPtr> fullDomain;
1028 GetCompositeList(indxStr, fullDomain);
1029 m_domain[0] = fullDomain;
1032 !m_domain[0].empty(),
1033 (std::string(
"Unable to obtain domain's referenced composite: ") +
1039 void MeshGraphXml::v_ReadEdges()
1041 CurveMap::iterator it;
1044 TiXmlElement *field = m_xmlGeom->FirstChildElement(
"EDGE");
1046 ASSERTL0(field,
"Unable to find EDGE tag in file.");
1051 TiXmlElement *edge = field->FirstChildElement(
"E");
1059 std::string edgeStr;
1064 int err = edge->QueryIntAttribute(
"ID", &indx);
1065 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read edge attribute ID.");
1067 TiXmlNode *child = edge->FirstChild();
1069 if (child->Type() == TiXmlNode::TINYXML_TEXT)
1071 edgeStr += child->ToText()->ValueStr();
1075 int vertex1, vertex2;
1076 std::istringstream edgeDataStrm(edgeStr.c_str());
1080 while (!edgeDataStrm.fail())
1082 edgeDataStrm >> vertex1 >> vertex2;
1089 if (!edgeDataStrm.fail())
1092 GetVertex(vertex2)};
1094 it = m_curvedEdges.find(indx);
1096 if (it == m_curvedEdges.end())
1099 indx, m_spaceDimension, vertices);
1104 indx, m_spaceDimension, vertices, it->second);
1107 m_segGeoms[indx] = edge;
1115 (std::string(
"Unable to read edge data: ") + edgeStr).c_str());
1118 edge = edge->NextSiblingElement(
"E");
1122 void MeshGraphXml::v_ReadFaces()
1125 TiXmlElement *field = m_xmlGeom->FirstChildElement(
"FACE");
1127 ASSERTL0(field,
"Unable to find FACE tag in file.");
1133 TiXmlElement *element = field->FirstChildElement();
1134 CurveMap::iterator it;
1138 std::string elementType(element->ValueStr());
1140 ASSERTL0(elementType ==
"Q" || elementType ==
"T",
1141 (std::string(
"Unknown 3D face type: ") + elementType).c_str());
1145 int err = element->QueryIntAttribute(
"ID", &indx);
1146 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read face attribute ID.");
1149 it = m_curvedFaces.find(indx);
1152 TiXmlNode *elementChild = element->FirstChild();
1153 std::string elementStr;
1154 while (elementChild)
1156 if (elementChild->Type() == TiXmlNode::TINYXML_TEXT)
1158 elementStr += elementChild->ToText()->ValueStr();
1160 elementChild = elementChild->NextSibling();
1163 ASSERTL0(!elementStr.empty(),
"Unable to read face description body.");
1167 if (elementType ==
"T")
1170 int edge1, edge2, edge3;
1171 std::istringstream elementDataStrm(elementStr.c_str());
1175 elementDataStrm >> edge1;
1176 elementDataStrm >> edge2;
1177 elementDataStrm >> edge3;
1180 !elementDataStrm.fail(),
1181 (std::string(
"Unable to read face data for TRIANGLE: ") +
1187 GetSegGeom(edge1), GetSegGeom(edge2), GetSegGeom(edge3)};
1191 if (it == m_curvedFaces.end())
1199 indx, edges, it->second);
1202 trigeom->SetGlobalID(indx);
1204 m_triGeoms[indx] = trigeom;
1210 (std::string(
"Unable to read face data for TRIANGLE: ") +
1215 else if (elementType ==
"Q")
1218 int edge1, edge2, edge3, edge4;
1219 std::istringstream elementDataStrm(elementStr.c_str());
1223 elementDataStrm >> edge1;
1224 elementDataStrm >> edge2;
1225 elementDataStrm >> edge3;
1226 elementDataStrm >> edge4;
1229 (std::string(
"Unable to read face data for QUAD: ") +
1235 GetSegGeom(edge1), GetSegGeom(edge2), GetSegGeom(edge3),
1240 if (it == m_curvedFaces.end())
1248 indx, edges, it->second);
1250 quadgeom->SetGlobalID(indx);
1252 m_quadGeoms[indx] = quadgeom;
1257 (std::string(
"Unable to read face data for QUAD: ") +
1263 element = element->NextSiblingElement();
1267 void MeshGraphXml::ReadElements()
1269 switch (m_meshDimension)
1283 void MeshGraphXml::v_ReadElements1D()
1285 TiXmlElement *field = NULL;
1288 field = m_xmlGeom->FirstChildElement(
"ELEMENT");
1290 ASSERTL0(field,
"Unable to find ELEMENT tag in file.");
1295 TiXmlElement *segment = field->FirstChildElement(
"S");
1296 CurveMap::iterator it;
1301 int err = segment->QueryIntAttribute(
"ID", &indx);
1302 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read element attribute ID.");
1304 TiXmlNode *elementChild = segment->FirstChild();
1305 while (elementChild && elementChild->Type() != TiXmlNode::TINYXML_TEXT)
1307 elementChild = elementChild->NextSibling();
1310 ASSERTL0(elementChild,
"Unable to read element description body.");
1311 std::string elementStr = elementChild->ToText()->ValueStr();
1316 int vertex1, vertex2;
1317 std::istringstream elementDataStrm(elementStr.c_str());
1321 elementDataStrm >> vertex1;
1322 elementDataStrm >> vertex2;
1325 (std::string(
"Unable to read element data for SEGMENT: ") +
1330 GetVertex(vertex2)};
1332 it = m_curvedEdges.find(indx);
1334 if (it == m_curvedEdges.end())
1337 indx, m_spaceDimension, vertices);
1338 seg->SetGlobalID(indx);
1343 indx, m_spaceDimension, vertices, it->second);
1344 seg->SetGlobalID(indx);
1346 seg->SetGlobalID(indx);
1347 m_segGeoms[indx] = seg;
1352 (std::string(
"Unable to read element data for segment: ") +
1357 segment = segment->NextSiblingElement(
"S");
1361 void MeshGraphXml::v_ReadElements2D()
1364 TiXmlElement *field = m_xmlGeom->FirstChildElement(
"ELEMENT");
1366 ASSERTL0(field,
"Unable to find ELEMENT tag in file.");
1369 CurveMap::iterator it;
1374 TiXmlElement *element = field->FirstChildElement();
1378 std::string elementType(element->ValueStr());
1381 elementType ==
"Q" || elementType ==
"T",
1382 (std::string(
"Unknown 2D element type: ") + elementType).c_str());
1386 int err = element->QueryIntAttribute(
"ID", &indx);
1387 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read element attribute ID.");
1389 it = m_curvedFaces.find(indx);
1392 TiXmlNode *elementChild = element->FirstChild();
1393 std::string elementStr;
1394 while (elementChild)
1396 if (elementChild->Type() == TiXmlNode::TINYXML_TEXT)
1398 elementStr += elementChild->ToText()->ValueStr();
1400 elementChild = elementChild->NextSibling();
1404 "Unable to read element description body.");
1408 if (elementType ==
"T")
1411 int edge1, edge2, edge3;
1412 std::istringstream elementDataStrm(elementStr.c_str());
1416 elementDataStrm >> edge1;
1417 elementDataStrm >> edge2;
1418 elementDataStrm >> edge3;
1421 !elementDataStrm.fail(),
1422 (std::string(
"Unable to read element data for TRIANGLE: ") +
1428 GetSegGeom(edge1), GetSegGeom(edge2), GetSegGeom(edge3)};
1431 if (it == m_curvedFaces.end())
1439 indx, edges, it->second);
1441 trigeom->SetGlobalID(indx);
1443 m_triGeoms[indx] = trigeom;
1449 (std::string(
"Unable to read element data for TRIANGLE: ") +
1454 else if (elementType ==
"Q")
1457 int edge1, edge2, edge3, edge4;
1458 std::istringstream elementDataStrm(elementStr.c_str());
1462 elementDataStrm >> edge1;
1463 elementDataStrm >> edge2;
1464 elementDataStrm >> edge3;
1465 elementDataStrm >> edge4;
1468 !elementDataStrm.fail(),
1469 (std::string(
"Unable to read element data for QUAD: ") +
1475 GetSegGeom(edge1), GetSegGeom(edge2), GetSegGeom(edge3),
1479 if (it == m_curvedFaces.end())
1487 indx, edges, it->second);
1489 quadgeom->SetGlobalID(indx);
1491 m_quadGeoms[indx] = quadgeom;
1497 (std::string(
"Unable to read element data for QUAD: ") +
1503 element = element->NextSiblingElement();
1507 void MeshGraphXml::v_ReadElements3D()
1510 TiXmlElement *field = m_xmlGeom->FirstChildElement(
"ELEMENT");
1512 ASSERTL0(field,
"Unable to find ELEMENT tag in file.");
1517 TiXmlElement *element = field->FirstChildElement();
1521 std::string elementType(element->ValueStr());
1525 elementType ==
"A" || elementType ==
"P" || elementType ==
"R" ||
1527 (std::string(
"Unknown 3D element type: ") + elementType).c_str());
1531 int err = element->QueryIntAttribute(
"ID", &indx);
1532 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read element attribute ID.");
1535 TiXmlNode *elementChild = element->FirstChild();
1536 std::string elementStr;
1537 while (elementChild)
1539 if (elementChild->Type() == TiXmlNode::TINYXML_TEXT)
1541 elementStr += elementChild->ToText()->ValueStr();
1543 elementChild = elementChild->NextSibling();
1547 "Unable to read element description body.");
1549 std::istringstream elementDataStrm(elementStr.c_str());
1555 if (elementType ==
"A")
1560 const int kNfaces = TetGeom::kNfaces;
1561 const int kNtfaces = TetGeom::kNtfaces;
1562 const int kNqfaces = TetGeom::kNqfaces;
1569 std::stringstream errorstring;
1570 errorstring <<
"Element " << indx <<
" must have " << kNtfaces
1571 <<
" triangle face(s), and " << kNqfaces
1572 <<
" quadrilateral face(s).";
1573 for (
int i = 0; i < kNfaces; i++)
1576 elementDataStrm >> faceID;
1582 std::stringstream errorstring;
1583 errorstring <<
"Element " << indx
1584 <<
" has invalid face: " << faceID;
1585 ASSERTL0(
false, errorstring.str().c_str());
1589 ASSERTL0(Ntfaces < kNtfaces, errorstring.str().c_str());
1590 tfaces[Ntfaces++] = static_pointer_cast<TriGeom>(face);
1592 else if (face->GetShapeType() ==
1595 ASSERTL0(Nqfaces < kNqfaces, errorstring.str().c_str());
1603 "Unable to read element data for TETRAHEDRON: ") +
1606 ASSERTL0(Ntfaces == kNtfaces, errorstring.str().c_str());
1607 ASSERTL0(Nqfaces == kNqfaces, errorstring.str().c_str());
1612 m_tetGeoms[indx] = tetgeom;
1613 PopulateFaceToElMap(tetgeom, kNfaces);
1619 "Unable to read element data for TETRAHEDRON: ") +
1625 else if (elementType ==
"P")
1630 const int kNfaces = PyrGeom::kNfaces;
1631 const int kNtfaces = PyrGeom::kNtfaces;
1632 const int kNqfaces = PyrGeom::kNqfaces;
1640 std::stringstream errorstring;
1641 errorstring <<
"Element " << indx <<
" must have " << kNtfaces
1642 <<
" triangle face(s), and " << kNqfaces
1643 <<
" quadrilateral face(s).";
1644 for (
int i = 0; i < kNfaces; i++)
1647 elementDataStrm >> faceID;
1653 std::stringstream errorstring;
1654 errorstring <<
"Element " << indx
1655 <<
" has invalid face: " << faceID;
1656 ASSERTL0(
false, errorstring.str().c_str());
1660 ASSERTL0(Ntfaces < kNtfaces, errorstring.str().c_str());
1661 faces[Nfaces++] = static_pointer_cast<TriGeom>(face);
1664 else if (face->GetShapeType() ==
1667 ASSERTL0(Nqfaces < kNqfaces, errorstring.str().c_str());
1668 faces[Nfaces++] = static_pointer_cast<QuadGeom>(face);
1676 !elementDataStrm.fail(),
1677 (std::string(
"Unable to read element data for PYRAMID: ") +
1680 ASSERTL0(Ntfaces == kNtfaces, errorstring.str().c_str());
1681 ASSERTL0(Nqfaces == kNqfaces, errorstring.str().c_str());
1686 m_pyrGeoms[indx] = pyrgeom;
1687 PopulateFaceToElMap(pyrgeom, kNfaces);
1693 (std::string(
"Unable to read element data for PYRAMID: ") +
1699 else if (elementType ==
"R")
1704 const int kNfaces = PrismGeom::kNfaces;
1705 const int kNtfaces = PrismGeom::kNtfaces;
1706 const int kNqfaces = PrismGeom::kNqfaces;
1714 std::stringstream errorstring;
1715 errorstring <<
"Element " << indx <<
" must have " << kNtfaces
1716 <<
" triangle face(s), and " << kNqfaces
1717 <<
" quadrilateral face(s).";
1719 for (
int i = 0; i < kNfaces; i++)
1722 elementDataStrm >> faceID;
1728 std::stringstream errorstring;
1729 errorstring <<
"Element " << indx
1730 <<
" has invalid face: " << faceID;
1731 ASSERTL0(
false, errorstring.str().c_str());
1735 ASSERTL0(Ntfaces < kNtfaces, errorstring.str().c_str());
1737 std::static_pointer_cast<TriGeom>(face);
1740 else if (face->GetShapeType() ==
1743 ASSERTL0(Nqfaces < kNqfaces, errorstring.str().c_str());
1745 std::static_pointer_cast<QuadGeom>(face);
1753 !elementDataStrm.fail(),
1754 (std::string(
"Unable to read element data for PRISM: ") +
1757 ASSERTL0(Ntfaces == kNtfaces, errorstring.str().c_str());
1758 ASSERTL0(Nqfaces == kNqfaces, errorstring.str().c_str());
1763 m_prismGeoms[indx] = prismgeom;
1764 PopulateFaceToElMap(prismgeom, kNfaces);
1770 (std::string(
"Unable to read element data for PRISM: ") +
1776 else if (elementType ==
"H")
1781 const int kNfaces = HexGeom::kNfaces;
1782 const int kNtfaces = HexGeom::kNtfaces;
1783 const int kNqfaces = HexGeom::kNqfaces;
1791 std::stringstream errorstring;
1792 errorstring <<
"Element " << indx <<
" must have " << kNtfaces
1793 <<
" triangle face(s), and " << kNqfaces
1794 <<
" quadrilateral face(s).";
1795 for (
int i = 0; i < kNfaces; i++)
1798 elementDataStrm >> faceID;
1804 std::stringstream errorstring;
1805 errorstring <<
"Element " << indx
1806 <<
" has invalid face: " << faceID;
1807 ASSERTL0(
false, errorstring.str().c_str());
1811 ASSERTL0(Ntfaces < kNtfaces, errorstring.str().c_str());
1815 else if (face->GetShapeType() ==
1818 ASSERTL0(Nqfaces < kNqfaces, errorstring.str().c_str());
1820 std::static_pointer_cast<QuadGeom>(face);
1828 "Unable to read element data for HEXAHEDRAL: ") +
1831 ASSERTL0(Ntfaces == kNtfaces, errorstring.str().c_str());
1832 ASSERTL0(Nqfaces == kNqfaces, errorstring.str().c_str());
1837 m_hexGeoms[indx] = hexgeom;
1838 PopulateFaceToElMap(hexgeom, kNfaces);
1844 "Unable to read element data for HEXAHEDRAL: ") +
1850 element = element->NextSiblingElement();
1854 void MeshGraphXml::ReadComposites()
1856 TiXmlElement *field = NULL;
1859 field = m_xmlGeom->FirstChildElement(
"COMPOSITE");
1861 ASSERTL0(field,
"Unable to find COMPOSITE tag in file.");
1863 TiXmlElement *node = field->FirstChildElement(
"C");
1866 int nextCompositeNumber = -1;
1873 nextCompositeNumber++;
1876 int err = node->QueryIntAttribute(
"ID", &indx);
1877 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read attribute ID.");
1881 TiXmlNode *compositeChild = node->FirstChild();
1886 while (compositeChild &&
1887 compositeChild->Type() != TiXmlNode::TINYXML_TEXT)
1889 compositeChild = compositeChild->NextSibling();
1892 ASSERTL0(compositeChild,
"Unable to read composite definition body.");
1893 std::string compositeStr = compositeChild->ToText()->ValueStr();
1897 std::istringstream compositeDataStrm(compositeStr.c_str());
1902 std::string prevCompositeElementStr;
1904 while (!compositeDataStrm.fail())
1906 std::string compositeElementStr;
1907 compositeDataStrm >> compositeElementStr;
1909 if (!compositeDataStrm.fail())
1917 m_meshComposites[indx] = curVector;
1920 if (compositeElementStr.length() > 0)
1922 ResolveGeomRef(prevCompositeElementStr,
1923 compositeElementStr,
1924 m_meshComposites[indx]);
1926 prevCompositeElementStr = compositeElementStr;
1934 (std::string(
"Unable to read COMPOSITE data for composite: ") +
1941 err = node->QueryStringAttribute(
"NAME", &
name);
1942 if (err == TIXML_SUCCESS)
1944 m_compositesLabels[indx] =
name;
1948 node = node->NextSiblingElement(
"C");
1952 "At least one composite must be specified.");
1955 void MeshGraphXml::ResolveGeomRef(
const std::string &prevToken,
1956 const std::string &token,
1959 switch (m_meshDimension)
1962 ResolveGeomRef1D(prevToken, token, composite);
1965 ResolveGeomRef2D(prevToken, token, composite);
1968 ResolveGeomRef3D(prevToken, token, composite);
1973 void MeshGraphXml::ResolveGeomRef1D(
const std::string &prevToken,
1974 const std::string &token,
1979 std::istringstream tokenStream(token);
1980 std::istringstream prevTokenStream(prevToken);
1985 tokenStream >> type;
1987 std::string::size_type indxBeg = token.find_first_of(
'[') + 1;
1988 std::string::size_type indxEnd = token.find_last_of(
']') - 1;
1992 (std::string(
"Error reading index definition:") + token).c_str());
1994 std::string indxStr = token.substr(indxBeg, indxEnd - indxBeg + 1);
1996 typedef vector<unsigned int> SeqVectorType;
1997 SeqVectorType seqVector;
1999 if (!ParseUtils::GenerateSeqVector(indxStr.c_str(), seqVector))
2002 (std::string(
"Ill-formed sequence definition: ") + indxStr)
2006 prevTokenStream >> prevType;
2009 bool validSequence =
2010 (prevToken.empty() ||
2011 (type ==
'V' && prevType ==
'V') ||
2012 (type ==
'S' && prevType ==
'S'));
2015 std::string(
"Invalid combination of composite items: ") +
2016 type +
" and " + prevType +
".");
2021 for (SeqVectorType::iterator iter = seqVector.begin();
2022 iter != seqVector.end(); ++iter)
2024 if (m_vertSet.find(*iter) == m_vertSet.end())
2027 "Unknown vertex index: " +
2028 std::to_string(*iter));
2032 composite->m_geomVec.push_back(m_vertSet[*iter]);
2038 for (SeqVectorType::iterator iter = seqVector.begin();
2039 iter != seqVector.end(); ++iter)
2041 if (m_segGeoms.find(*iter) == m_segGeoms.end())
2044 "Unknown segment index: " +
2045 std::to_string(*iter));
2049 composite->m_geomVec.push_back(m_segGeoms[*iter]);
2056 "Unrecognized composite token: " + token);
2062 "Problem processing composite token: " + token);
2068 void MeshGraphXml::ResolveGeomRef2D(
const std::string &prevToken,
2069 const std::string &token,
2074 std::istringstream tokenStream(token);
2075 std::istringstream prevTokenStream(prevToken);
2080 tokenStream >> type;
2082 std::string::size_type indxBeg = token.find_first_of(
'[') + 1;
2083 std::string::size_type indxEnd = token.find_last_of(
']') - 1;
2087 (std::string(
"Error reading index definition:") + token).c_str());
2089 std::string indxStr = token.substr(indxBeg, indxEnd - indxBeg + 1);
2090 std::vector<unsigned int> seqVector;
2091 std::vector<unsigned int>::iterator seqIter;
2093 bool err = ParseUtils::GenerateSeqVector(indxStr.c_str(), seqVector);
2096 (std::string(
"Error reading composite elements: ") + indxStr)
2099 prevTokenStream >> prevType;
2102 bool validSequence =
2103 (prevToken.empty() ||
2104 (type ==
'V' && prevType ==
'V') ||
2105 (type ==
'E' && prevType ==
'E') ||
2106 ((type ==
'T' || type ==
'Q') &&
2107 (prevType ==
'T' || prevType ==
'Q')));
2110 std::string(
"Invalid combination of composite items: ") +
2111 type +
" and " + prevType +
".");
2116 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2119 if (m_segGeoms.find(*seqIter) == m_segGeoms.end())
2122 "Unknown edge index: " +
2123 std::to_string(*seqIter));
2127 composite->m_geomVec.push_back(m_segGeoms[*seqIter]);
2134 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2137 if (m_triGeoms.count(*seqIter) == 0)
2140 "Unknown triangle index: " +
2141 std::to_string(*seqIter));
2145 if (CheckRange(*m_triGeoms[*seqIter]))
2147 composite->m_geomVec.push_back(
2148 m_triGeoms[*seqIter]);
2157 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2160 if (m_quadGeoms.count(*seqIter) == 0)
2163 ErrorUtil::ewarning,
2164 "Unknown quad index: " + std::to_string(*seqIter) +
2165 " in Composite section");
2169 if (CheckRange(*m_quadGeoms[*seqIter]))
2171 composite->m_geomVec.push_back(
2172 m_quadGeoms[*seqIter]);
2180 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2183 if (*seqIter >= m_vertSet.size())
2186 "Unknown vertex index: " +
2187 std::to_string(*seqIter));
2191 composite->m_geomVec.push_back(m_vertSet[*seqIter]);
2198 "Unrecognized composite token: " + token);
2204 "Problem processing composite token: " + token);
2210 void MeshGraphXml::ResolveGeomRef3D(
const std::string &prevToken,
2211 const std::string &token,
2216 std::istringstream tokenStream(token);
2217 std::istringstream prevTokenStream(prevToken);
2222 tokenStream >> type;
2224 std::string::size_type indxBeg = token.find_first_of(
'[') + 1;
2225 std::string::size_type indxEnd = token.find_last_of(
']') - 1;
2228 "Error reading index definition: " + token);
2230 std::string indxStr = token.substr(indxBeg, indxEnd - indxBeg + 1);
2232 std::vector<unsigned int> seqVector;
2233 std::vector<unsigned int>::iterator seqIter;
2235 bool err = ParseUtils::GenerateSeqVector(indxStr.c_str(), seqVector);
2237 ASSERTL0(err,
"Error reading composite elements: " + indxStr);
2239 prevTokenStream >> prevType;
2243 map<char, int> typeMap;
2254 bool validSequence =
2255 (prevToken.empty() || (typeMap[type] == typeMap[prevType]));
2258 std::string(
"Invalid combination of composite items: ") +
2259 type +
" and " + prevType +
".");
2264 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2267 if (m_vertSet.find(*seqIter) == m_vertSet.end())
2270 "Unknown vertex index: " +
2271 std::to_string(*seqIter));
2275 composite->m_geomVec.push_back(m_vertSet[*seqIter]);
2281 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2284 if (m_segGeoms.find(*seqIter) == m_segGeoms.end())
2287 "Unknown edge index: " +
2288 std::to_string(*seqIter));
2292 composite->m_geomVec.push_back(m_segGeoms[*seqIter]);
2298 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2305 "Unknown face index: " +
2306 std::to_string(*seqIter));
2310 if (CheckRange(*face))
2312 composite->m_geomVec.push_back(face);
2319 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2322 if (m_triGeoms.find(*seqIter) == m_triGeoms.end())
2325 "Unknown triangle index: " +
2326 std::to_string(*seqIter));
2330 if (CheckRange(*m_triGeoms[*seqIter]))
2332 composite->m_geomVec.push_back(
2333 m_triGeoms[*seqIter]);
2340 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2343 if (m_quadGeoms.find(*seqIter) == m_quadGeoms.end())
2346 "Unknown quad index: " +
2347 std::to_string(*seqIter));
2351 if (CheckRange(*m_quadGeoms[*seqIter]))
2353 composite->m_geomVec.push_back(
2354 m_quadGeoms[*seqIter]);
2362 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2365 if (m_tetGeoms.find(*seqIter) == m_tetGeoms.end())
2368 "Unknown tet index: " +
2369 std::to_string(*seqIter));
2373 if (CheckRange(*m_tetGeoms[*seqIter]))
2375 composite->m_geomVec.push_back(
2376 m_tetGeoms[*seqIter]);
2384 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2387 if (m_pyrGeoms.find(*seqIter) == m_pyrGeoms.end())
2390 "Unknown pyramid index: " +
2391 std::to_string(*seqIter));
2395 if (CheckRange(*m_pyrGeoms[*seqIter]))
2397 composite->m_geomVec.push_back(
2398 m_pyrGeoms[*seqIter]);
2406 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2409 if (m_prismGeoms.find(*seqIter) == m_prismGeoms.end())
2412 "Unknown prism index: " +
2413 std::to_string(*seqIter));
2417 if (CheckRange(*m_prismGeoms[*seqIter]))
2419 composite->m_geomVec.push_back(
2420 m_prismGeoms[*seqIter]);
2428 for (seqIter = seqVector.begin(); seqIter != seqVector.end();
2431 if (m_hexGeoms.find(*seqIter) == m_hexGeoms.end())
2434 "Unknown hex index: " +
2435 std::to_string(*seqIter));
2439 if (CheckRange(*m_hexGeoms[*seqIter]))
2441 composite->m_geomVec.push_back(
2442 m_hexGeoms[*seqIter]);
2450 "Unrecognized composite token: " + token);
2456 "Problem processing composite token: " + token);
2462 void MeshGraphXml::v_WriteVertices(TiXmlElement *geomTag,
PointGeomMap &verts)
2464 TiXmlElement *vertTag =
new TiXmlElement(
"VERTEX");
2466 for (
auto &i : verts)
2469 s << scientific << setprecision(8) << (*i.second)(0) <<
" "
2470 << (*i.second)(1) <<
" " << (*i.second)(2);
2471 TiXmlElement *v =
new TiXmlElement(
"V");
2472 v->SetAttribute(
"ID", i.second->GetGlobalID());
2473 v->LinkEndChild(
new TiXmlText(s.str()));
2474 vertTag->LinkEndChild(v);
2477 geomTag->LinkEndChild(vertTag);
2480 void MeshGraphXml::v_WriteEdges(TiXmlElement *geomTag,
SegGeomMap &edges)
2482 TiXmlElement *edgeTag =
2483 new TiXmlElement(m_meshDimension == 1 ?
"ELEMENT" :
"EDGE");
2484 string tag = m_meshDimension == 1 ?
"S" :
"E";
2486 for (
auto &i : edges)
2490 s << seg->GetVid(0) <<
" " << seg->GetVid(1);
2491 TiXmlElement *e =
new TiXmlElement(tag);
2492 e->SetAttribute(
"ID", i.first);
2493 e->LinkEndChild(
new TiXmlText(s.str()));
2494 edgeTag->LinkEndChild(e);
2497 geomTag->LinkEndChild(edgeTag);
2500 void MeshGraphXml::v_WriteTris(TiXmlElement *faceTag,
TriGeomMap &tris)
2504 for (
auto &i : tris)
2508 s << tri->GetEid(0) <<
" " << tri->GetEid(1) <<
" " << tri->GetEid(2);
2509 TiXmlElement *t =
new TiXmlElement(tag);
2510 t->SetAttribute(
"ID", i.first);
2511 t->LinkEndChild(
new TiXmlText(s.str()));
2512 faceTag->LinkEndChild(t);
2516 void MeshGraphXml::v_WriteQuads(TiXmlElement *faceTag,
QuadGeomMap &quads)
2520 for (
auto &i : quads)
2524 s << quad->GetEid(0) <<
" " << quad->GetEid(1) <<
" " << quad->GetEid(2)
2525 <<
" " << quad->GetEid(3);
2526 TiXmlElement *q =
new TiXmlElement(tag);
2527 q->SetAttribute(
"ID", i.first);
2528 q->LinkEndChild(
new TiXmlText(s.str()));
2529 faceTag->LinkEndChild(q);
2533 void MeshGraphXml::v_WriteHexs(TiXmlElement *elmtTag,
HexGeomMap &hexs)
2537 for (
auto &i : hexs)
2541 s << hex->GetFid(0) <<
" " << hex->GetFid(1) <<
" " << hex->GetFid(2)
2542 <<
" " << hex->GetFid(3) <<
" " << hex->GetFid(4) <<
" "
2543 << hex->GetFid(5) <<
" ";
2544 TiXmlElement *h =
new TiXmlElement(tag);
2545 h->SetAttribute(
"ID", i.first);
2546 h->LinkEndChild(
new TiXmlText(s.str()));
2547 elmtTag->LinkEndChild(h);
2551 void MeshGraphXml::v_WritePrisms(TiXmlElement *elmtTag,
PrismGeomMap &pris)
2555 for (
auto &i : pris)
2559 s << prism->GetFid(0) <<
" " << prism->GetFid(1) <<
" "
2560 << prism->GetFid(2) <<
" " << prism->GetFid(3) <<
" "
2561 << prism->GetFid(4) <<
" ";
2562 TiXmlElement *
p =
new TiXmlElement(tag);
2563 p->SetAttribute(
"ID", i.first);
2564 p->LinkEndChild(
new TiXmlText(s.str()));
2565 elmtTag->LinkEndChild(
p);
2569 void MeshGraphXml::v_WritePyrs(TiXmlElement *elmtTag,
PyrGeomMap &pyrs)
2573 for (
auto &i : pyrs)
2577 s << pyr->GetFid(0) <<
" " << pyr->GetFid(1) <<
" " << pyr->GetFid(2)
2578 <<
" " << pyr->GetFid(3) <<
" " << pyr->GetFid(4) <<
" ";
2579 TiXmlElement *
p =
new TiXmlElement(tag);
2580 p->SetAttribute(
"ID", i.first);
2581 p->LinkEndChild(
new TiXmlText(s.str()));
2582 elmtTag->LinkEndChild(
p);
2586 void MeshGraphXml::v_WriteTets(TiXmlElement *elmtTag,
TetGeomMap &tets)
2590 for (
auto &i : tets)
2594 s << tet->GetFid(0) <<
" " << tet->GetFid(1) <<
" " << tet->GetFid(2)
2595 <<
" " << tet->GetFid(3) <<
" ";
2596 TiXmlElement *t =
new TiXmlElement(tag);
2597 t->SetAttribute(
"ID", i.first);
2598 t->LinkEndChild(
new TiXmlText(s.str()));
2599 elmtTag->LinkEndChild(t);
2603 void MeshGraphXml::v_WriteCurves(TiXmlElement *geomTag,
CurveMap &edges,
2606 TiXmlElement *curveTag =
new TiXmlElement(
"CURVED");
2607 CurveMap::iterator curveIt;
2610 for (curveIt = edges.begin(); curveIt != edges.end(); ++curveIt)
2613 TiXmlElement *c =
new TiXmlElement(
"E");
2617 for (
int j = 0; j < curve->m_points.size(); ++j)
2620 s << scientific << (*p)(0) <<
" " << (*
p)(1) <<
" " << (*
p)(2)
2624 c->SetAttribute(
"ID", curveId++);
2625 c->SetAttribute(
"EDGEID", curve->m_curveID);
2626 c->SetAttribute(
"NUMPOINTS", curve->m_points.size());
2628 c->LinkEndChild(
new TiXmlText(s.str()));
2629 curveTag->LinkEndChild(c);
2632 for (curveIt = faces.begin(); curveIt != faces.end(); ++curveIt)
2635 TiXmlElement *c =
new TiXmlElement(
"F");
2639 for (
int j = 0; j < curve->m_points.size(); ++j)
2642 s << scientific << (*p)(0) <<
" " << (*
p)(1) <<
" " << (*
p)(2)
2646 c->SetAttribute(
"ID", curveId++);
2647 c->SetAttribute(
"FACEID", curve->m_curveID);
2648 c->SetAttribute(
"NUMPOINTS", curve->m_points.size());
2650 c->LinkEndChild(
new TiXmlText(s.str()));
2651 curveTag->LinkEndChild(c);
2654 geomTag->LinkEndChild(curveTag);
2657 void MeshGraphXml::WriteComposites(TiXmlElement *geomTag,
CompositeMap &comps,
2658 std::map<int, std::string> &compLabels)
2660 TiXmlElement *compTag =
new TiXmlElement(
"COMPOSITE");
2662 for (
auto &cIt : comps)
2664 if (cIt.second->m_geomVec.size() == 0)
2669 TiXmlElement *c =
new TiXmlElement(
"C");
2670 c->SetAttribute(
"ID", cIt.first);
2671 if (!m_compositesLabels[cIt.first].empty())
2673 c->SetAttribute(
"NAME", compLabels[cIt.first]);
2675 c->LinkEndChild(
new TiXmlText(GetCompositeString(cIt.second)));
2676 compTag->LinkEndChild(c);
2679 geomTag->LinkEndChild(compTag);
2682 void MeshGraphXml::WriteDomain(TiXmlElement *geomTag,
2683 std::map<int, CompositeMap> &domainMap)
2685 TiXmlElement *domTag =
new TiXmlElement(
"DOMAIN");
2687 vector<unsigned int> idxList;
2688 for (
auto &domain : domainMap)
2690 TiXmlElement *c =
new TiXmlElement(
"D");
2697 for (
const auto &elem : domain.second)
2699 idxList.push_back(elem.first);
2702 s << ParseUtils::GenerateSeqString(idxList) <<
"] ";
2703 c->SetAttribute(
"ID", domain.first);
2704 c->LinkEndChild(
new TiXmlText(s.str()));
2705 domTag->LinkEndChild(c);
2708 geomTag->LinkEndChild(domTag);
2711 void MeshGraphXml::WriteDefaultExpansion(TiXmlElement *root)
2713 TiXmlElement *expTag =
new TiXmlElement(
"EXPANSIONS");
2715 for (
auto it = m_meshComposites.begin(); it != m_meshComposites.end(); it++)
2717 if (it->second->m_geomVec[0]->GetShapeDim() == m_meshDimension)
2719 TiXmlElement *exp =
new TiXmlElement(
"E");
2720 exp->SetAttribute(
"COMPOSITE",
2721 "C[" + boost::lexical_cast<string>(it->first) +
2723 exp->SetAttribute(
"NUMMODES", 4);
2724 exp->SetAttribute(
"TYPE",
"MODIFIED");
2725 exp->SetAttribute(
"FIELDS",
"u");
2727 expTag->LinkEndChild(exp);
2730 root->LinkEndChild(expTag);
2737 void MeshGraphXml::v_WriteGeometry(
2738 std::string &outfilename,
bool defaultExp,
2743 TiXmlDeclaration *decl =
new TiXmlDeclaration(
"1.0",
"utf-8",
"");
2744 doc.LinkEndChild(decl);
2746 TiXmlElement *root =
new TiXmlElement(
"NEKTAR");
2747 doc.LinkEndChild(root);
2748 TiXmlElement *geomTag =
new TiXmlElement(
"GEOMETRY");
2749 root->LinkEndChild(geomTag);
2757 geomTag->SetAttribute(
"DIM", m_meshDimension);
2758 geomTag->SetAttribute(
"SPACE", m_spaceDimension);
2760 if (m_session !=
nullptr && !m_session->GetComm()->IsSerial())
2762 geomTag->SetAttribute(
"PARTITION", m_session->GetComm()->GetRank());
2769 v_WriteVertices(geomTag, m_vertSet);
2770 v_WriteEdges(geomTag, m_segGeoms);
2771 if (m_meshDimension > 1)
2773 TiXmlElement *faceTag =
2774 new TiXmlElement(m_meshDimension == 2 ?
"ELEMENT" :
"FACE");
2776 v_WriteTris(faceTag, m_triGeoms);
2777 v_WriteQuads(faceTag, m_quadGeoms);
2778 geomTag->LinkEndChild(faceTag);
2780 if (m_meshDimension > 2)
2782 TiXmlElement *elmtTag =
new TiXmlElement(
"ELEMENT");
2784 v_WriteHexs(elmtTag, m_hexGeoms);
2785 v_WritePyrs(elmtTag, m_pyrGeoms);
2786 v_WritePrisms(elmtTag, m_prismGeoms);
2787 v_WriteTets(elmtTag, m_tetGeoms);
2789 geomTag->LinkEndChild(elmtTag);
2791 v_WriteCurves(geomTag, m_curvedEdges, m_curvedFaces);
2792 WriteComposites(geomTag, m_meshComposites, m_compositesLabels);
2793 WriteDomain(geomTag, m_domain);
2797 WriteDefaultExpansion(root);
2801 doc.SaveFile(outfilename);
2804 void MeshGraphXml::WriteXMLGeometry(std::string outname,
2805 vector<set<unsigned int>> elements,
2806 vector<unsigned int> partitions)
2817 string dirname = outname +
"_xml";
2818 boost::filesystem::path pdirname(dirname);
2820 if (!boost::filesystem::is_directory(dirname))
2822 boost::filesystem::create_directory(dirname);
2825 ASSERTL0(elements.size() == partitions.size(),
2826 "error in partitioned information");
2828 for (
int i = 0; i < partitions.size(); i++)
2831 TiXmlDeclaration *decl =
new TiXmlDeclaration(
"1.0",
"utf-8",
"");
2832 doc.LinkEndChild(decl);
2834 TiXmlElement *root = doc.FirstChildElement(
"NEKTAR");
2835 TiXmlElement *geomTag;
2840 root =
new TiXmlElement(
"NEKTAR");
2841 doc.LinkEndChild(root);
2843 geomTag =
new TiXmlElement(
"GEOMETRY");
2844 root->LinkEndChild(geomTag);
2849 geomTag = root->FirstChildElement(
"GEOMETRY");
2853 geomTag =
new TiXmlElement(
"GEOMETRY");
2854 root->LinkEndChild(geomTag);
2858 geomTag->SetAttribute(
"DIM", m_meshDimension);
2859 geomTag->SetAttribute(
"SPACE", m_spaceDimension);
2860 geomTag->SetAttribute(
"PARTITION", partitions[i]);
2875 vector<set<unsigned int>> entityIds(4);
2876 entityIds[m_meshDimension] = elements[i];
2878 switch (m_meshDimension)
2882 for (
auto &j : entityIds[3])
2885 if (m_hexGeoms.count(j))
2888 localHex[j] = m_hexGeoms[j];
2890 else if (m_pyrGeoms.count(j))
2893 localPyr[j] = m_pyrGeoms[j];
2895 else if (m_prismGeoms.count(j))
2897 g = m_prismGeoms[j];
2898 localPrism[j] = m_prismGeoms[j];
2900 else if (m_tetGeoms.count(j))
2903 localTet[j] = m_tetGeoms[j];
2907 ASSERTL0(
false,
"element in partition not found");
2910 for (
int k = 0; k < g->GetNumFaces(); k++)
2912 entityIds[2].insert(g->GetFid(k));
2914 for (
int k = 0; k < g->GetNumEdges(); k++)
2916 entityIds[1].insert(g->GetEid(k));
2918 for (
int k = 0; k < g->GetNumVerts(); k++)
2920 entityIds[0].insert(g->GetVid(k));
2927 for (
auto &j : entityIds[2])
2930 if (m_triGeoms.count(j))
2933 localTri[j] = m_triGeoms[j];
2935 else if (m_quadGeoms.count(j))
2938 localQuad[j] = m_quadGeoms[j];
2942 ASSERTL0(
false,
"element in partition not found");
2945 for (
int k = 0; k < g->GetNumEdges(); k++)
2947 entityIds[1].insert(g->GetEid(k));
2949 for (
int k = 0; k < g->GetNumVerts(); k++)
2951 entityIds[0].insert(g->GetVid(k));
2958 for (
auto &j : entityIds[1])
2961 if (m_segGeoms.count(j))
2964 localEdge[j] = m_segGeoms[j];
2968 ASSERTL0(
false,
"element in partition not found");
2971 for (
int k = 0; k < g->GetNumVerts(); k++)
2973 entityIds[0].insert(g->GetVid(k));
2979 if (m_meshDimension > 2)
2981 for (
auto &j : entityIds[2])
2983 if (m_triGeoms.count(j))
2985 localTri[j] = m_triGeoms[j];
2987 else if (m_quadGeoms.count(j))
2989 localQuad[j] = m_quadGeoms[j];
2998 if (m_meshDimension > 1)
3000 for (
auto &j : entityIds[1])
3002 if (m_segGeoms.count(j))
3004 localEdge[j] = m_segGeoms[j];
3013 for (
auto &j : entityIds[0])
3015 if (m_vertSet.count(j))
3017 localVert[j] = m_vertSet[j];
3025 v_WriteVertices(geomTag, localVert);
3026 v_WriteEdges(geomTag, localEdge);
3027 if (m_meshDimension > 1)
3029 TiXmlElement *faceTag =
3030 new TiXmlElement(m_meshDimension == 2 ?
"ELEMENT" :
"FACE");
3032 v_WriteTris(faceTag, localTri);
3033 v_WriteQuads(faceTag, localQuad);
3034 geomTag->LinkEndChild(faceTag);
3036 if (m_meshDimension > 2)
3038 TiXmlElement *elmtTag =
new TiXmlElement(
"ELEMENT");
3040 v_WriteHexs(elmtTag, localHex);
3041 v_WritePyrs(elmtTag, localPyr);
3042 v_WritePrisms(elmtTag, localPrism);
3043 v_WriteTets(elmtTag, localTet);
3045 geomTag->LinkEndChild(elmtTag);
3048 for (
auto &j : localTri)
3050 if (m_curvedFaces.count(j.first))
3052 localCurveFace[j.first] = m_curvedFaces[j.first];
3055 for (
auto &j : localQuad)
3057 if (m_curvedFaces.count(j.first))
3059 localCurveFace[j.first] = m_curvedFaces[j.first];
3062 for (
auto &j : localEdge)
3064 if (m_curvedEdges.count(j.first))
3066 localCurveEdge[j.first] = m_curvedEdges[j.first];
3070 v_WriteCurves(geomTag, localCurveEdge, localCurveFace);
3073 std::map<int, std::string> localCompLabels;
3075 for (
auto &j : m_meshComposites)
3078 int dim = j.second->m_geomVec[0]->GetShapeDim();
3080 for (
int k = 0; k < j.second->m_geomVec.size(); k++)
3082 if (entityIds[dim].count(j.second->m_geomVec[k]->GetGlobalID()))
3084 comp->m_geomVec.push_back(j.second->m_geomVec[k]);
3088 if (comp->m_geomVec.size())
3090 localComp[j.first] = comp;
3091 if (!m_compositesLabels[j.first].empty())
3093 localCompLabels[j.first] = m_compositesLabels[j.first];
3098 WriteComposites(geomTag, localComp, localCompLabels);
3100 map<int, CompositeMap> domain;
3101 for (
auto &j : localComp)
3103 for (
auto &dom : m_domain)
3105 for (
auto &dIt : dom.second)
3107 if (j.first == dIt.first)
3109 domain[dom.first][j.first] = j.second;
3116 WriteDomain(geomTag, domain);
3118 if (m_session->DefinesElement(
"NEKTAR/CONDITIONS"))
3120 std::set<int> vBndRegionIdList;
3121 TiXmlElement *vConditions =
3122 new TiXmlElement(*m_session->GetElement(
"Nektar/Conditions"));
3123 TiXmlElement *vBndRegions =
3124 vConditions->FirstChildElement(
"BOUNDARYREGIONS");
3125 TiXmlElement *vBndConditions =
3126 vConditions->FirstChildElement(
"BOUNDARYCONDITIONS");
3127 TiXmlElement *vItem;
3131 TiXmlElement *vNewBndRegions =
3132 new TiXmlElement(
"BOUNDARYREGIONS");
3133 vItem = vBndRegions->FirstChildElement();
3136 std::string vSeqStr =
3137 vItem->FirstChild()->ToText()->Value();
3138 std::string::size_type indxBeg =
3139 vSeqStr.find_first_of(
'[') + 1;
3140 std::string::size_type indxEnd =
3141 vSeqStr.find_last_of(
']') - 1;
3142 vSeqStr = vSeqStr.substr(indxBeg, indxEnd - indxBeg + 1);
3143 std::vector<unsigned int> vSeq;
3144 ParseUtils::GenerateSeqVector(vSeqStr.c_str(), vSeq);
3146 vector<unsigned int> idxList;
3148 for (
unsigned int i = 0; i < vSeq.size(); ++i)
3150 if (localComp.find(vSeq[i]) != localComp.end())
3152 idxList.push_back(vSeq[i]);
3155 int p = atoi(vItem->Attribute(
"ID"));
3157 std::string vListStr =
3158 ParseUtils::GenerateSeqString(idxList);
3160 if (vListStr.length() == 0)
3162 TiXmlElement *tmp = vItem;
3163 vItem = vItem->NextSiblingElement();
3164 vBndRegions->RemoveChild(tmp);
3168 vListStr =
"C[" + vListStr +
"]";
3169 TiXmlText *vList =
new TiXmlText(vListStr);
3170 TiXmlElement *vNewElement =
new TiXmlElement(
"B");
3171 vNewElement->SetAttribute(
"ID",
p);
3172 vNewElement->LinkEndChild(vList);
3173 vNewBndRegions->LinkEndChild(vNewElement);
3174 vBndRegionIdList.insert(
p);
3175 vItem = vItem->NextSiblingElement();
3179 m_bndRegOrder[
p] = vSeq;
3181 vConditions->ReplaceChild(vBndRegions, *vNewBndRegions);
3186 vItem = vBndConditions->FirstChildElement();
3189 std::set<int>::iterator x;
3190 if ((x = vBndRegionIdList.find(atoi(vItem->Attribute(
3191 "REF")))) != vBndRegionIdList.end())
3193 vItem->SetAttribute(
"REF", *x);
3194 vItem = vItem->NextSiblingElement();
3198 TiXmlElement *tmp = vItem;
3199 vItem = vItem->NextSiblingElement();
3200 vBndConditions->RemoveChild(tmp);
3204 root->LinkEndChild(vConditions);
3208 TiXmlElement *vSrc =
3209 m_session->GetElement(
"Nektar")->FirstChildElement();
3212 std::string vName = boost::to_upper_copy(vSrc->ValueStr());
3213 if (vName !=
"GEOMETRY" && vName !=
"CONDITIONS")
3215 root->LinkEndChild(
new TiXmlElement(*vSrc));
3217 vSrc = vSrc->NextSiblingElement();
3223 pad % partitions[i];
3224 boost::filesystem::path pFilename(pad.str());
3226 boost::filesystem::path fullpath = pdirname / pFilename;
3235 for (
auto &c : m_meshComposites)
3237 bool fillComp =
true;
3238 for (
auto &d : m_domain[0])
3240 if (c.second == d.second)
3247 std::vector<unsigned int> ids;
3248 for (
auto &elmt : c.second->m_geomVec)
3250 ids.push_back(elmt->GetGlobalID());
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
Interpreter class for the evaluation of mathematical expressions.
int DefineFunction(const std::string &vlist, const std::string &expr)
Defines a function for the purposes of evaluation.
NekDouble Evaluate(const int id)
Evaluate a function which depends only on constants and/or parameters.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
std::map< std::string, std::string > FieldMetaDataMap
const std::string kPointsTypeStr[]
std::string PortablePath(const boost::filesystem::path &path)
create portable path on different platforms for boost::filesystem path
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< DomainRange > DomainRangeShPtr
std::shared_ptr< XmlTagWriter > XmlTagWriterSharedPtr
static DomainRangeShPtr NullDomainRangeShPtr
@ SIZE_PointsType
Length of enum list.
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
std::map< int, TriGeomSharedPtr > TriGeomMap
std::map< int, std::vector< unsigned int > > CompositeOrdering
std::shared_ptr< QuadGeom > QuadGeomSharedPtr
std::map< int, PyrGeomSharedPtr > PyrGeomMap
std::map< int, QuadGeomSharedPtr > QuadGeomMap
std::shared_ptr< PrismGeom > PrismGeomSharedPtr
MeshPartitionFactory & GetMeshPartitionFactory()
std::shared_ptr< Composite > CompositeSharedPtr
std::map< int, SegGeomSharedPtr > SegGeomMap
std::shared_ptr< Curve > CurveSharedPtr
std::unordered_map< int, CurveSharedPtr > CurveMap
std::shared_ptr< HexGeom > HexGeomSharedPtr
std::shared_ptr< SegGeom > SegGeomSharedPtr
std::map< int, TetGeomSharedPtr > TetGeomMap
std::shared_ptr< PyrGeom > PyrGeomSharedPtr
std::shared_ptr< TetGeom > TetGeomSharedPtr
std::map< int, PrismGeomSharedPtr > PrismGeomMap
std::shared_ptr< PointGeom > PointGeomSharedPtr
std::shared_ptr< Geometry2D > Geometry2DSharedPtr
std::shared_ptr< MeshPartition > MeshPartitionSharedPtr
std::shared_ptr< Geometry > GeometrySharedPtr
std::shared_ptr< TriGeom > TriGeomSharedPtr
MeshGraphFactory & GetMeshGraphFactory()
std::map< int, HexGeomSharedPtr > HexGeomMap
std::map< int, PointGeomSharedPtr > PointGeomMap
std::map< int, CompositeSharedPtr > CompositeMap
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
The above copyright notice and this permission notice shall be included.