60 #include <boost/algorithm/string.hpp>
61 #include <boost/graph/adjacency_list.hpp>
62 #include <boost/graph/adjacency_iterator.hpp>
63 #include <boost/graph/detail/edge.hpp>
64 #include <boost/format.hpp>
68 namespace LibUtilities
75 Loki::SingleThreaded> Type;
76 return Type::Instance();
80 m_isCompressed(false),
83 m_comm(pSession->GetComm()),
84 m_weightingRequired(false),
102 "Too few elements for this many processes.");
116 TiXmlDeclaration * decl =
new TiXmlDeclaration(
"1.0",
"utf-8",
"");
117 vNew.LinkEndChild(decl);
119 TiXmlElement* vElmtNektar;
120 vElmtNektar =
new TiXmlElement(
"NEKTAR");
122 int rank =
m_comm->GetRowComm()->GetRank();
125 vNew.LinkEndChild(vElmtNektar);
127 std::string dirname = pSession->GetSessionName() +
"_xml";
128 fs::path pdirname(dirname);
132 fs::path pFilename(pad.str());
134 if(!fs::is_directory(dirname))
136 fs::create_directory(dirname);
139 fs::path fullpath = pdirname / pFilename;
148 TiXmlDeclaration * decl =
new TiXmlDeclaration(
"1.0",
"utf-8",
"");
149 vNew.LinkEndChild(decl);
151 TiXmlElement* vElmtNektar;
152 vElmtNektar =
new TiXmlElement(
"NEKTAR");
156 vNew.LinkEndChild(vElmtNektar);
158 std::string dirname = pSession->GetSessionName() +
"_xml";
159 fs::path pdirname(dirname);
163 fs::path pFilename(pad.str());
165 fs::path fullpath = pdirname / pFilename;
167 if(!fs::is_directory(dirname))
169 fs::create_directory(dirname);
182 composites[it->first] = it->second.list;
195 TiXmlElement *expansionTypes = pSession->GetElement(
"Nektar/Expansions");
198 TiXmlElement *expansion = expansionTypes->FirstChildElement();
199 std::string expType = expansion->Value();
212 std::vector<unsigned int> composite;
213 std::vector<unsigned int> nummodes;
214 std::vector<std::string> fieldName;
216 const char *nModesStr = expansion->Attribute(
"NUMMODES");
217 ASSERTL0(nModesStr,
"NUMMODES was not defined in EXPANSION section of input");
218 std::string numModesStr = nModesStr;
220 ASSERTL0(valid,
"Unable to correctly parse the number of modes.");
222 if (nummodes.size() == 1)
224 for (
int i = 1; i <
m_dim; i++)
226 nummodes.push_back( nummodes[0] );
229 ASSERTL0(nummodes.size() ==
m_dim,
"Number of modes should match mesh dimension");
232 const char *fStr = expansion->Attribute(
"FIELDS");
235 std::string fieldStr = fStr;
237 ASSERTL0(valid,
"Unable to correctly parse the field string in ExpansionTypes.");
239 for (
int i = 0; i < fieldName.size(); ++i)
251 fieldName.push_back(
"DefaultVar");
257 "Omitting field variables and explicitly listing " \
258 "them in different ExpansionTypes is wrong practise");
265 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
266 ASSERTL0(compositeStr.length() > 3,
"COMPOSITE must be specified in expansion definition");
267 int beg = compositeStr.find_first_of(
"[");
268 int end = compositeStr.find_first_of(
"]");
269 std::string compositeListStr = compositeStr.substr(beg+1,end-beg-1);
271 ASSERTL0(parseGood && !composite.empty(),
272 (std::string(
"Unable to read composite index range: ") + compositeListStr).c_str());
276 for (
int i = 0; i < composite.size(); ++i)
278 for (
int j = 0; j < fieldName.size(); j++)
280 for (
unsigned int k = 0; k <
m_meshComposites[composite[i]].list.size(); ++k)
289 expansion = expansion->NextSiblingElement(
"E");
292 else if(expType ==
"F")
294 ASSERTL0(expansion->Attribute(
"FILE"),
295 "Attribute FILE expected for type F expansion");
296 std::string filenameStr = expansion->Attribute(
"FILE");
298 "A filename must be specified for the FILE "
299 "attribute of expansion");
311 pSession->GetSharedFilesystem());
313 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
314 f->Import(filenameStr, fielddefs);
317 for (
int i = 0; i < fielddefs.size(); ++i)
320 for (
int j = 0; j < fielddefs[i]->m_fields.size(); ++j)
322 std::string fieldName = fielddefs[i]->m_fields[j];
331 int numHomoDir = fielddefs[i]->m_numHomogeneousDir;
333 for (
int j = 0; j < fielddefs[i]->m_elementIDs.size(); ++j)
335 int elid = fielddefs[i]->m_elementIDs[j];
336 std::vector<unsigned int> nummodes;
337 for (
int k = 0; k <
m_dim; k++)
339 nummodes.push_back(fielddefs[i]->m_numModes[cnt++]);
341 if (fielddefs[i]->m_uniOrder)
349 for (
int k = 0; k < fielddefs[i]->m_fields.size(); k++)
351 std::string fieldName = fielddefs[i]->m_fields[k];
354 switch (fielddefs[i]->m_shapeType)
392 ASSERTL0 (
false,
"Shape not recognized.");
400 ASSERTL0(
false,
"Expansion type not defined or not supported at the moment");
410 TiXmlElement *vGeometry, *vSubElement;
412 vGeometry = pSession->GetElement(
"Nektar/Geometry");
413 m_dim = atoi(vGeometry->Attribute(
"DIM"));
416 vSubElement = pSession->GetElement(
"Nektar/Geometry/Vertex");
419 std::string attr[] = {
"XSCALE",
"YSCALE",
"ZSCALE",
420 "XMOVE",
"YMOVE",
"ZMOVE" };
421 for (
int i = 0; i < 6; ++i)
423 const char *val = vSubElement->Attribute(attr[i].c_str());
431 std::string IsCompressed;
432 vSubElement->QueryStringAttribute(
"COMPRESSED",&IsCompressed);
434 if(IsCompressed.size())
436 ASSERTL0(boost::iequals(IsCompressed,
438 "Compressed formats do not match. Expected :"
440 +
"but got "+ std::string(IsCompressed));
445 TiXmlNode* vertexChild = vSubElement->FirstChild();
446 ASSERTL0(vertexChild,
"Unable to extract the data "
447 "from the compressed vertex tag.");
449 std::string vertexStr;
450 if (vertexChild->Type() == TiXmlNode::TINYXML_TEXT)
452 vertexStr += vertexChild->ToText()->ValueStr();
455 std::vector<MeshVertex> vertData;
458 for(
int i = 0; i < vertData.size(); ++i)
465 x = vSubElement->FirstChildElement();
469 TiXmlAttribute* y = x->FirstAttribute();
470 ASSERTL0(y,
"Failed to get attribute.");
472 v.
id = y->IntValue();
473 std::vector<std::string> vCoords;
474 std::string vCoordStr = x->FirstChild()->ToText()->Value();
475 boost::split(vCoords, vCoordStr, boost::is_any_of(
"\t "));
476 v.
x = atof(vCoords[0].c_str());
477 v.
y = atof(vCoords[1].c_str());
478 v.
z = atof(vCoords[2].c_str());
480 x = x->NextSiblingElement();
487 vSubElement = pSession->GetElement(
"Nektar/Geometry/Edge");
488 ASSERTL0(vSubElement,
"Cannot read edges");
491 std::string IsCompressed;
492 vSubElement->QueryStringAttribute(
"COMPRESSED",&IsCompressed);
494 if(IsCompressed.size())
496 ASSERTL0(boost::iequals(IsCompressed,
498 "Compressed formats do not match. Expected :"
501 + boost::lexical_cast<std::string>(IsCompressed));
506 TiXmlNode* edgeChild = vSubElement->FirstChild();
508 "Unable to extract the data from the compressed "
513 if (edgeChild->Type() == TiXmlNode::TINYXML_TEXT)
515 edgeStr += edgeChild->ToText()->ValueStr();
518 std::vector<MeshEdge> edgeData;
521 for(
int i = 0; i < edgeData.size(); ++i)
524 e.
id = edgeData[i].id;
525 e.
list.push_back(edgeData[i].v0);
526 e.
list.push_back(edgeData[i].v1);
532 x = vSubElement->FirstChildElement();
536 TiXmlAttribute* y = x->FirstAttribute();
537 ASSERTL0(y,
"Failed to get attribute.");
539 e.
id = y->IntValue();
541 std::vector<std::string> vVertices;
542 std::string vVerticesString = x->FirstChild()->ToText()->Value();
543 boost::split(vVertices, vVerticesString, boost::is_any_of(
"\t "));
544 e.
list.push_back(atoi(vVertices[0].c_str()));
545 e.
list.push_back(atoi(vVertices[1].c_str()));
547 x = x->NextSiblingElement();
555 vSubElement = pSession->GetElement(
"Nektar/Geometry/Face");
556 ASSERTL0(vSubElement,
"Cannot read faces.");
557 x = vSubElement->FirstChildElement();
562 std::string IsCompressed;
563 x->QueryStringAttribute(
"COMPRESSED",&IsCompressed);
565 if(IsCompressed.size())
567 ASSERTL0(boost::iequals(IsCompressed,
569 "Compressed formats do not match. Expected :"
572 + boost::lexical_cast<std::string>(
577 TiXmlNode* faceChild = x->FirstChild();
578 ASSERTL0(faceChild,
"Unable to extract the data from "
579 "the compressed edge tag.");
582 if (faceChild->Type() == TiXmlNode::TINYXML_TEXT)
584 faceStr += faceChild->ToText()->ValueStr();
588 const std::string val= x->Value();
590 if(boost::iequals(val,
"T"))
592 std::vector<MeshTri> faceData;
596 for(
int i= 0; i < faceData.size(); ++i)
600 f.
id = faceData[i].id;
602 for (
int j = 0; j < 3; ++j)
604 f.
list.push_back(faceData[i].e[j]);
609 else if (boost::iequals(val,
"Q"))
611 std::vector<MeshQuad> faceData;
615 for(
int i= 0; i < faceData.size(); ++i)
619 f.
id = faceData[i].id;
621 for (
int j = 0; j < 4; ++j)
623 f.
list.push_back(faceData[i].e[j]);
630 ASSERTL0(
false,
"Unrecognised face tag");
635 TiXmlAttribute* y = x->FirstAttribute();
636 ASSERTL0(y,
"Failed to get attribute.");
638 f.
id = y->IntValue();
639 f.
type = x->Value()[0];
640 std::vector<std::string> vEdges;
641 std::string vEdgeStr = x->FirstChild()->ToText()->Value();
642 boost::split(vEdges, vEdgeStr, boost::is_any_of(
"\t "));
643 for (
int i = 0; i < vEdges.size(); ++i)
645 f.
list.push_back(atoi(vEdges[i].c_str()));
649 x = x->NextSiblingElement();
654 vSubElement = pSession->GetElement(
"Nektar/Geometry/Element");
655 ASSERTL0(vSubElement,
"Cannot read elements.");
656 x = vSubElement->FirstChildElement();
660 std::string IsCompressed;
661 x->QueryStringAttribute(
"COMPRESSED",&IsCompressed);
663 if(IsCompressed.size())
665 ASSERTL0(boost::iequals(IsCompressed,
667 "Compressed formats do not match. Expected :"
670 + boost::lexical_cast<std::string>(IsCompressed));
674 TiXmlNode* child = x->FirstChild();
675 ASSERTL0(child,
"Unable to extract the data from the "
676 "compressed element tag.");
679 if (child->Type() == TiXmlNode::TINYXML_TEXT)
681 elmtStr += child->ToText()->ValueStr();
685 const std::string val= x->Value();
691 std::vector<MeshEdge> data;
694 for(
int i= 0; i < data.size(); ++i)
699 e.
list.push_back(data[i].v0);
700 e.
list.push_back(data[i].v1);
707 std::vector<MeshTri> data;
710 for(
int i= 0; i < data.size(); ++i)
715 for (
int j = 0; j < 3; ++j)
717 f.
list.push_back(data[i].e[j]);
725 std::vector<MeshQuad> data;
728 for(
int i= 0; i < data.size(); ++i)
733 for (
int j = 0; j < 4; ++j)
735 f.
list.push_back(data[i].e[j]);
743 std::vector<MeshTet> data;
746 for(
int i= 0; i < data.size(); ++i)
751 for (
int j = 0; j < 4; ++j)
753 f.
list.push_back(data[i].f[j]);
761 std::vector<MeshPyr> data;
764 for(
int i= 0; i < data.size(); ++i)
769 for (
int j = 0; j < 5; ++j)
771 f.
list.push_back(data[i].f[j]);
779 std::vector<MeshPrism> data;
782 for(
int i= 0; i < data.size(); ++i)
787 for (
int j = 0; j < 5; ++j)
789 f.
list.push_back(data[i].f[j]);
797 std::vector<MeshHex> data;
800 for(
int i= 0; i < data.size(); ++i)
805 for (
int j = 0; j < 6; ++j)
807 f.
list.push_back(data[i].f[j]);
814 ASSERTL0(
false,
"Unrecognised element tag");
819 TiXmlAttribute* y = x->FirstAttribute();
820 ASSERTL0(y,
"Failed to get attribute.");
822 e.
id = y->IntValue();
823 std::vector<std::string> vItems;
824 std::string vItemStr = x->FirstChild()->ToText()->Value();
825 boost::split(vItems, vItemStr, boost::is_any_of(
"\t "));
826 for (
int i = 0; i < vItems.size(); ++i)
828 e.
list.push_back(atoi(vItems[i].c_str()));
830 e.
type = x->Value()[0];
833 x = x->NextSiblingElement();
837 if (pSession->DefinesElement(
"Nektar/Geometry/Curved"))
839 vSubElement = pSession->GetElement(
"Nektar/Geometry/Curved");
842 std::string IsCompressed;
843 vSubElement->QueryStringAttribute(
"COMPRESSED",&IsCompressed);
845 x = vSubElement->FirstChildElement();
848 if(IsCompressed.size())
850 ASSERTL0(boost::iequals(IsCompressed,
852 "Compressed formats do not match. Expected :"
855 + boost::lexical_cast<std::string>(
860 const char *entitytype = x->Value();
878 if(boost::iequals(entitytype,
"E")||
879 boost::iequals(entitytype,
"F"))
883 TiXmlNode* child = x->FirstChild();
885 if (child->Type() == TiXmlNode::TINYXML_TEXT)
887 elmtStr = child->ToText()->ValueStr();
890 std::vector<MeshCurvedInfo> cinfo;
895 for(
int i = 0; i < cinfo.size(); ++i)
903 c.
ptid = cinfo[i].ptid;
909 else if(boost::iequals(entitytype,
"DATAPOINTS"))
915 "Failed to get ID from PTS section");
921 TiXmlElement* DataIdx =
922 x->FirstChildElement(
"INDEX");
924 "Cannot read data index tag in compressed "
927 TiXmlNode* child = DataIdx->FirstChild();
928 if (child->Type() == TiXmlNode::TINYXML_TEXT)
930 elmtStr = child->ToText()->ValueStr();
936 TiXmlElement* DataPts
937 = x->FirstChildElement(
"POINTS");
939 "Cannot read data pts tag in compressed "
942 child = DataPts->FirstChild();
943 if (child->Type() == TiXmlNode::TINYXML_TEXT)
945 elmtStr = child->ToText()->ValueStr();
955 ASSERTL0(
false,
"Unknown tag in curved section");
958 x = x->NextSiblingElement();
964 "Failed to get attribute ID");
965 c.
type = std::string(x->Attribute(
"TYPE"));
967 "Failed to get attribute TYPE");
969 "Failed to get attribute NUMPOINTS");
970 c.
data = x->FirstChild()->ToText()->Value();
976 "Failed to get attribute EDGEID");
981 "Failed to get attribute FACEID");
985 ASSERTL0(
false,
"Unknown curve type.");
989 x = x->NextSiblingElement();
995 vSubElement = pSession->GetElement(
"Nektar/Geometry/Composite");
996 ASSERTL0(vSubElement,
"Cannot read composites.");
997 x = vSubElement->FirstChildElement();
1000 TiXmlAttribute* y = x->FirstAttribute();
1001 ASSERTL0(y,
"Failed to get attribute.");
1003 c.
id = y->IntValue();
1004 std::string vSeqStr = x->FirstChild()->ToText()->Value();
1005 c.
type = vSeqStr[0];
1006 std::string::size_type indxBeg = vSeqStr.find_first_of(
'[') + 1;
1007 std::string::size_type indxEnd = vSeqStr.find_last_of(
']') - 1;
1008 vSeqStr = vSeqStr.substr(indxBeg, indxEnd - indxBeg + 1);
1010 std::vector<unsigned int> vSeq;
1013 for (
int i = 0; i < vSeq.size(); ++i)
1015 c.
list.push_back(vSeq[i]);
1018 x = x->NextSiblingElement();
1022 vSubElement = pSession->GetElement(
"Nektar/Geometry/Domain");
1023 ASSERTL0(vSubElement,
"Cannot read domain");
1024 std::string vSeqStr = vSubElement->FirstChild()->ToText()->Value();
1025 std::string::size_type indxBeg = vSeqStr.find_first_of(
'[') + 1;
1026 std::string::size_type indxEnd = vSeqStr.find_last_of(
']') - 1;
1027 vSeqStr = vSeqStr.substr(indxBeg, indxEnd - indxBeg + 1);
1033 int nElmt = boost::num_vertices(
m_mesh);
1036 out <<
"# Partition information:" << std::endl;
1037 out <<
"# No. elements : " << nElmt << std::endl;
1038 out <<
"# No. partitions: " << nPart << std::endl;
1039 out <<
"# ID nElmt nLocDof nBndDof" << std::endl;
1042 std::vector<int> partElmtCount(nPart, 0);
1043 std::vector<int> partLocCount (nPart, 0);
1044 std::vector<int> partBndCount (nPart, 0);
1046 std::map<int, int> elmtSizes;
1047 std::map<int, int> elmtBndSizes;
1052 int elid = expIt->first;
1058 " Number of directional" \
1059 " modes in expansion spec for element id = " +
1060 boost::lexical_cast<std::string>(elid) +
1062 boost::lexical_cast<std::string>(it->first) +
1063 " does not correspond to mesh dimension");
1065 int na = it->second[0];
1078 m_shape[elid],
false, na, nb, nc);
1080 m_shape[elid],
true, na, nb, nc);
1084 for (boost::tie(vertit, vertit_end) = boost::vertices(
m_mesh);
1085 vertit != vertit_end; ++vertit)
1087 int partId =
m_mesh[*vertit].partition;
1088 partElmtCount[partId]++;
1089 partLocCount [partId] += elmtSizes[
m_mesh[*vertit].id];
1090 partBndCount [partId] += elmtBndSizes[m_mesh[*vertit].id];
1093 for (
int i = 0; i < nPart; ++i)
1095 out << i <<
" " << partElmtCount[i] <<
" " << partLocCount[i] <<
" " << partBndCount[i] << std::endl;
1101 if (!pSession->DefinesElement(
"Nektar/Conditions/SolverInfo"))
1108 TiXmlElement* solverInfoElement =
1109 pSession->GetElement(
"Nektar/Conditions/SolverInfo");
1111 TiXmlElement* solverInfo =
1112 solverInfoElement->FirstChildElement(
"I");
1113 ASSERTL0(solverInfo,
"Cannot read SolverInfo tags");
1118 ASSERTL0(solverInfo->Attribute(
"PROPERTY"),
1119 "Missing PROPERTY attribute in solver info "
1121 std::string solverProperty =
1122 solverInfo->Attribute(
"PROPERTY");
1124 "Solver info properties must have a non-empty "
1127 std::string solverPropertyUpper =
1128 boost::to_upper_copy(solverProperty);
1132 ASSERTL0(solverInfo->Attribute(
"VALUE"),
1133 "Missing VALUE attribute in solver info section. ");
1134 std::string solverValue = solverInfo->Attribute(
"VALUE");
1136 "Solver info properties must have a non-empty value");
1138 std::string propertyValueUpper =
1139 boost::to_upper_copy(solverValue);
1141 if (solverPropertyUpper ==
"WEIGHTPARTITIONS")
1143 if (propertyValueUpper ==
"DOF")
1148 else if (propertyValueUpper ==
"BOUNDARY")
1153 else if (propertyValueUpper ==
"BOTH")
1161 solverInfo = solverInfo->NextSiblingElement(
"I");
1194 int elid = expIt->first;
1200 " Number of directional" \
1201 " modes in expansion spec for element id = " +
1202 boost::lexical_cast<std::string>(elid) +
1204 boost::lexical_cast<std::string>(it->first) +
1205 " does not correspond to mesh dimension");
1207 int na = it->second[0];
1236 std::map<int, int> vGraphEdges;
1244 pGraph[v].id = eIt->first;
1245 pGraph[v].partition = 0;
1255 for (
unsigned j = 0; j < eIt->second.list.size(); ++j)
1257 int eId = eIt->second.list[j];
1261 if (vGraphEdges.find(eId) != vGraphEdges.end())
1263 BoostEdge e = boost::add_edge(vcnt, vGraphEdges[eId], pGraph).first;
1264 pGraph[e].id = vcnt;
1268 vGraphEdges[eId] = vcnt;
1293 std::vector<BoostSubGraph>& pLocalPartition,
1297 int nGraphVerts = boost::num_vertices(pGraph);
1298 int nGraphEdges = boost::num_edges(pGraph);
1310 if (
m_comm->GetRowComm()->TreatAsRankZero())
1314 int nWeight = ncon*nGraphVerts;
1321 for ( boost::tie(vertit, vertit_end) = boost::vertices(pGraph);
1322 vertit != vertit_end;
1325 for ( boost::tie(adjvertit, adjvertit_end) = boost::adjacent_vertices(*vertit,pGraph);
1326 adjvertit != adjvertit_end;
1329 adjncy[acnt++] = *adjvertit;
1332 adjwgt[acnt-1] = pGraph[*vertit].edgeWeight[0];
1336 xadj[++vcnt] = acnt;
1343 vwgt[ncon*(vcnt-1)+ccnt] = pGraph[*vertit].weight[0];
1348 vwgt[ncon*(vcnt-1)+ccnt] = pGraph[*vertit].bndWeight[0];
1361 if(
m_comm->GetColumnComm()->GetRank() == 0)
1364 PartitionGraphImpl(nGraphVerts, ncon, xadj, adjncy, vwgt, vsize, adjwgt, nParts, vol, part);
1371 for (i = 1; i <
m_comm->GetColumnComm()->GetSize(); ++i)
1373 m_comm->GetColumnComm()->Send(i, part);
1379 m_comm->GetColumnComm()->Recv(0, part);
1383 m_comm->GetColumnComm()->Block();
1387 for (i = 1; i <
m_comm->GetRowComm()->GetSize(); ++i)
1389 m_comm->GetRowComm()->Send(i, part);
1396 "Error in calling metis to partition graph.");
1401 m_comm->GetRowComm()->Recv(0, part);
1406 pLocalPartition.resize(nCols);
1407 for (i = 0; i < nCols; ++i)
1409 pLocalPartition[i] = pGraph.create_subgraph();
1414 for ( boost::tie(vertit, vertit_end) = boost::vertices(pGraph);
1415 vertit != vertit_end;
1418 pGraph[*vertit].partition = part[i];
1419 boost::add_vertex(i, pLocalPartition[part[i]]);
1426 for ( boost::tie(vertit, vertit_end) = boost::vertices(pGraph);
1427 vertit != vertit_end;
1430 for (boost::tie(adjvertit, adjvertit_end) = boost::adjacent_vertices(*vertit,pGraph);
1431 adjvertit != adjvertit_end; ++adjvertit)
1433 if(part[*adjvertit] != part[*vertit])
1435 boost::add_vertex(*adjvertit, pLocalPartition[part[*vertit]]);
1446 unsigned int cnt = 0;
1450 for (i = 0; i < nParts; ++i)
1452 cnt = std::count(pPart.begin(), pPart.end(), i);
1466 for (i = 0; i < pPart.num_elements(); ++i)
1468 pPart[i] = i % nParts;
1477 TiXmlElement* pNektar)
1480 std::string vDim = pSession->GetElement(
"Nektar/Geometry")->Attribute(
"DIM");
1481 std::string vSpace = pSession->GetElement(
"Nektar/Geometry")->Attribute(
"SPACE");
1482 std::string vPart = boost::lexical_cast<std::string>(pGraph[*boost::vertices(pGraph).first].partition);
1483 TiXmlElement* vElmtGeometry =
new TiXmlElement(
"GEOMETRY");
1484 vElmtGeometry->SetAttribute(
"DIM", vDim);
1485 vElmtGeometry->SetAttribute(
"SPACE", vSpace);
1486 vElmtGeometry->SetAttribute(
"PARTITION", vPart);
1488 TiXmlElement *vVertex =
new TiXmlElement(
"VERTEX");
1489 TiXmlElement *vEdge =
new TiXmlElement(
"EDGE");
1490 TiXmlElement *vFace =
new TiXmlElement(
"FACE");
1491 TiXmlElement *vElement =
new TiXmlElement(
"ELEMENT");
1492 TiXmlElement *vCurved =
new TiXmlElement(
"CURVED");
1493 TiXmlElement *vComposite =
new TiXmlElement(
"COMPOSITE");
1494 TiXmlElement *vDomain =
new TiXmlElement(
"DOMAIN");
1502 std::map<int, MeshEntity> vComposites;
1503 std::map<int, MeshEntity> vElements;
1504 std::map<int, MeshEntity> vEdges;
1505 std::map<int, MeshEntity> vFaces;
1506 std::map<int, MeshVertex> vVertices;
1511 std::vector<unsigned int> idxList;
1514 for (boost::tie(vertit, vertit_end) = boost::vertices(pGraph);
1515 vertit != vertit_end;
1518 id = pGraph[*vertit].id;
1522 std::map<int, MeshEntity> * vNext = &vElements;
1528 for (vIt = vNext->begin(); vIt != vNext->end(); vIt++)
1530 for (
unsigned int j = 0; j < vIt->second.list.size(); ++j)
1532 id = vIt->second.list[j];
1541 for (vIt = vNext->begin(); vIt != vNext->end(); vIt++)
1543 for (
unsigned int j = 0; j < vIt->second.list.size(); ++j)
1545 id = vIt->second.list[j];
1554 for (vIt = vNext->begin(); vIt != vNext->end(); vIt++)
1556 for (
unsigned int j = 0; j < vIt->second.list.size(); ++j)
1558 id = vIt->second.list[j];
1568 std::vector<MeshVertex> vertInfo;
1569 for (vVertIt = vVertices.begin();
1570 vVertIt != vVertices.end(); vVertIt++)
1573 v.
id = vVertIt->first;
1574 v.
x = vVertIt->second.x;
1575 v.
y = vVertIt->second.y;
1576 v.
z = vVertIt->second.z;
1577 vertInfo.push_back(v);
1579 std::string vertStr;
1581 vVertex->SetAttribute(
"COMPRESSED",
1583 vVertex->SetAttribute(
"BITSIZE",
1585 vVertex->LinkEndChild(
new TiXmlText(vertStr));
1589 for (vVertIt = vVertices.begin(); vVertIt != vVertices.end(); vVertIt++)
1591 x =
new TiXmlElement(
"V");
1592 x->SetAttribute(
"ID", vVertIt->first);
1593 std::stringstream vCoords;
1594 vCoords.precision(12);
1595 vCoords << std::setw(15) << vVertIt->second.x <<
" "
1596 << std::setw(15) << vVertIt->second.y <<
" "
1597 << std::setw(15) << vVertIt->second.z <<
" ";
1598 y =
new TiXmlText(vCoords.str());
1600 vVertex->LinkEndChild(x);
1609 vVertex->SetAttribute(vAttrIt->first, vAttrIt->second);
1616 std::vector<MeshEdge> edgeInfo;
1617 for (vIt = vEdges.begin(); vIt != vEdges.end(); vIt++)
1621 e.
v0 = vIt->second.list[0];
1622 e.
v1 = vIt->second.list[1];
1623 edgeInfo.push_back(e);
1625 std::string edgeStr;
1627 vEdge->SetAttribute(
"COMPRESSED",
1629 vEdge->SetAttribute(
"BITSIZE",
1631 vEdge->LinkEndChild(
new TiXmlText(edgeStr));
1635 for (vIt = vEdges.begin(); vIt != vEdges.end(); vIt++)
1637 x =
new TiXmlElement(
"E");
1638 x->SetAttribute(
"ID", vIt->first);
1639 std::stringstream vVertices;
1640 vVertices << std::setw(10) << vIt->second.list[0]
1641 << std::setw(10) << vIt->second.list[1]
1643 y =
new TiXmlText(vVertices.str());
1645 vEdge->LinkEndChild(x);
1655 std::vector<MeshTri> TriFaceInfo;
1656 std::vector<MeshQuad> QuadFaceInfo;
1658 for (vIt = vFaces.begin(); vIt != vFaces.end(); vIt++)
1660 switch(vIt->second.list.size())
1666 for(
int i = 0; i < 3; ++i)
1668 f.
e[i] = vIt->second.list[i];
1670 TriFaceInfo.push_back(f);
1677 for(
int i = 0; i < 4; ++i)
1679 f.
e[i] = vIt->second.list[i];
1681 QuadFaceInfo.push_back(f);
1685 ASSERTL0(
false,
"Unknown face type.");
1689 if(TriFaceInfo.size())
1691 std::string vType(
"T");
1692 x =
new TiXmlElement(vType);
1694 std::string faceStr;
1697 x->SetAttribute(
"COMPRESSED",
1699 x->SetAttribute(
"BITSIZE",
1701 x->LinkEndChild(
new TiXmlText(faceStr));
1702 vFace->LinkEndChild(x);
1705 if(QuadFaceInfo.size())
1707 std::string vType(
"Q");
1708 x =
new TiXmlElement(vType);
1709 std::string faceStr;
1712 x->SetAttribute(
"COMPRESSED",
1714 x->SetAttribute(
"BITSIZE",
1716 x->LinkEndChild(
new TiXmlText(faceStr));
1717 vFace->LinkEndChild(x);
1722 for (vIt = vFaces.begin(); vIt != vFaces.end(); vIt++)
1724 std::string vType(
"F");
1725 vType[0] = vIt->second.type;
1726 x =
new TiXmlElement(vType);
1727 x->SetAttribute(
"ID", vIt->first);
1728 std::stringstream vListStr;
1729 for (
unsigned int i = 0; i < vIt->second.list.size(); ++i)
1731 vListStr << std::setw(10) << vIt->second.list[i];
1734 y =
new TiXmlText(vListStr.str());
1736 vFace->LinkEndChild(x);
1744 std::vector<MeshEdge> SegInfo;
1745 std::vector<MeshTri> TriInfo;
1746 std::vector<MeshQuad> QuadInfo;
1747 std::vector<MeshTet> TetInfo;
1748 std::vector<MeshPyr> PyrInfo;
1749 std::vector<MeshPrism> PrismInfo;
1750 std::vector<MeshHex> HexInfo;
1753 for (vIt = vElements.begin(); vIt != vElements.end(); vIt++)
1755 switch(vIt->second.type)
1761 e.
v0 = vIt->second.list[0];
1762 e.
v1 = vIt->second.list[1];
1763 SegInfo.push_back(e);
1770 for(
int i = 0; i < 3; ++i)
1772 f.
e[i] = vIt->second.list[i];
1774 TriInfo.push_back(f);
1781 for(
int i = 0; i < 4; ++i)
1783 f.
e[i] = vIt->second.list[i];
1785 QuadInfo.push_back(f);
1791 vol.
id = vIt->first;
1792 for(
int i = 0; i < 4; ++i)
1794 vol.
f[i] = vIt->second.list[i];
1796 TetInfo.push_back(vol);
1802 vol.
id = vIt->first;
1803 for(
int i = 0; i < 5; ++i)
1805 vol.
f[i] = vIt->second.list[i];
1807 PyrInfo.push_back(vol);
1813 vol.
id = vIt->first;
1814 for(
int i = 0; i < 5; ++i)
1816 vol.
f[i] = vIt->second.list[i];
1818 PrismInfo.push_back(vol);
1824 vol.
id = vIt->first;
1825 for(
int i = 0; i < 6; ++i)
1827 vol.
f[i] = vIt->second.list[i];
1829 HexInfo.push_back(vol);
1833 ASSERTL0(
false,
"Unknown element type");
1839 std::string vType(
"S");
1840 x =
new TiXmlElement(vType);
1844 x->SetAttribute(
"COMPRESSED",
1846 x->SetAttribute(
"BITSIZE",
1848 x->LinkEndChild(
new TiXmlText(segStr));
1849 vElement->LinkEndChild(x);
1854 std::string vType(
"T");
1855 x =
new TiXmlElement(vType);
1857 std::string faceStr;
1859 x->SetAttribute(
"COMPRESSED",
1861 x->SetAttribute(
"BITSIZE",
1863 x->LinkEndChild(
new TiXmlText(faceStr));
1864 vElement->LinkEndChild(x);
1869 std::string vType(
"Q");
1870 x =
new TiXmlElement(vType);
1871 std::string faceStr;
1873 x->SetAttribute(
"COMPRESSED",
1875 x->SetAttribute(
"BITSIZE",
1877 x->LinkEndChild(
new TiXmlText(faceStr));
1878 vElement->LinkEndChild(x);
1883 std::string vType(
"A");
1884 x =
new TiXmlElement(vType);
1887 x->SetAttribute(
"COMPRESSED",
1889 x->SetAttribute(
"BITSIZE",
1891 x->LinkEndChild(
new TiXmlText(volStr));
1892 vElement->LinkEndChild(x);
1897 std::string vType(
"P");
1898 x =
new TiXmlElement(vType);
1901 x->SetAttribute(
"COMPRESSED",
1903 x->SetAttribute(
"BITSIZE",
1905 x->LinkEndChild(
new TiXmlText(volStr));
1906 vElement->LinkEndChild(x);
1909 if(PrismInfo.size())
1911 std::string vType(
"R");
1912 x =
new TiXmlElement(vType);
1915 x->SetAttribute(
"COMPRESSED",
1917 x->SetAttribute(
"BITSIZE",
1919 x->LinkEndChild(
new TiXmlText(volStr));
1920 vElement->LinkEndChild(x);
1925 std::string vType(
"H");
1926 x =
new TiXmlElement(vType);
1929 x->SetAttribute(
"COMPRESSED",
1931 x->SetAttribute(
"BITSIZE",
1933 x->LinkEndChild(
new TiXmlText(volStr));
1934 vElement->LinkEndChild(x);
1940 for (vIt = vElements.begin(); vIt != vElements.end(); vIt++)
1942 std::string vType(
"T");
1943 vType[0] = vIt->second.type;
1944 x =
new TiXmlElement(vType.c_str());
1945 x->SetAttribute(
"ID", vIt->first);
1946 std::stringstream vEdges;
1947 for (
unsigned i = 0; i < vIt->second.list.size(); ++i)
1949 vEdges << std::setw(10) << vIt->second.list[i];
1952 y =
new TiXmlText(vEdges.str());
1954 vElement->LinkEndChild(x);
1960 std::map<MeshCurvedKey, MeshCurved>::const_iterator vItCurve;
1964 std::vector<MeshCurvedInfo> edgeinfo;
1965 std::vector<MeshCurvedInfo> faceinfo;
1970 std::map<int,int> idxmap;
1978 bool IsEdge = boost::iequals(c.
entitytype,
"E");
1979 bool IsFace = boost::iequals(c.
entitytype,
"F");
1981 if((IsEdge&&vEdges.find(c.
entityid) != vEdges.end())||
1982 (IsFace&&vFaces.find(c.
entityid) != vFaces.end()))
2003 edgeinfo.push_back(cinfo);
2007 faceinfo.push_back(cinfo);
2011 for(
int i =0; i < c.
npoints; ++i)
2019 if(idxmap.count(idx) == 0)
2021 idxmap[idx] = newidx;
2022 curvedpts.
index.push_back(newidx);
2023 curvedpts.
pts.push_back(
2029 curvedpts.
index.push_back(idxmap[idx]);
2038 vCurved->SetAttribute(
"COMPRESSED",
2040 vCurved->SetAttribute(
"BITSIZE",
2043 x =
new TiXmlElement(
"E");
2044 std::string dataStr;
2046 x->LinkEndChild(
new TiXmlText(dataStr));
2047 vCurved->LinkEndChild(x);
2052 vCurved->SetAttribute(
"COMPRESSED",
2054 vCurved->SetAttribute(
"BITSIZE",
2057 x =
new TiXmlElement(
"F");
2058 std::string dataStr;
2060 x->LinkEndChild(
new TiXmlText(dataStr));
2061 vCurved->LinkEndChild(x);
2064 if(edgeinfo.size()||faceinfo.size())
2066 x =
new TiXmlElement(
"DATAPOINTS");
2067 x->SetAttribute(
"ID", curvedpts.
id);
2069 TiXmlElement *subx =
new TiXmlElement(
"INDEX");
2070 std::string dataStr;
2073 subx->LinkEndChild(
new TiXmlText(dataStr));
2074 x->LinkEndChild(subx);
2076 subx =
new TiXmlElement(
"POINTS");
2079 subx->LinkEndChild(
new TiXmlText(dataStr));
2080 x->LinkEndChild(subx);
2082 vCurved->LinkEndChild(x);
2093 bool IsEdge = boost::iequals(c.
entitytype,
"E");
2094 bool IsFace = boost::iequals(c.
entitytype,
"F");
2096 if((IsEdge&&vEdges.find(c.
entityid) != vEdges.end())||
2097 (IsFace&&vFaces.find(c.
entityid) != vFaces.end()))
2100 x->SetAttribute(
"ID", c.
id);
2103 x->SetAttribute(
"EDGEID", c.
entityid);
2107 x->SetAttribute(
"FACEID", c.
entityid);
2109 x->SetAttribute(
"TYPE", c.
type);
2110 x->SetAttribute(
"NUMPOINTS", c.
npoints);
2111 y =
new TiXmlText(c.
data);
2113 vCurved->LinkEndChild(x);
2125 for (
unsigned int j = 0; j < vIt->second.list.size(); ++j)
2128 switch (vIt->second.type)
2131 if (vVertices.find(vIt->second.list[j]) == vVertices.end())
2137 if (vEdges.find(vIt->second.list[j]) == vEdges.end())
2143 if (vFaces.find(vIt->second.list[j]) == vFaces.end())
2149 if (vElements.find(vIt->second.list[j]) == vElements.end())
2156 idxList.push_back(vIt->second.list[j]);
2161 if (vCompositeStr.length() > 0)
2163 vComposites[vIt->first] = vIt->second;
2164 x =
new TiXmlElement(
"C");
2165 x->SetAttribute(
"ID", vIt->first);
2166 vCompositeStr =
"X[" + vCompositeStr +
"]";
2167 vCompositeStr[0] = vIt->second.type;
2168 y =
new TiXmlText(vCompositeStr.c_str());
2170 vComposite->LinkEndChild(x);
2175 std::string vDomainListStr;
2176 for (
unsigned int i = 0; i <
m_domain.size(); ++i)
2178 if (vComposites.find(
m_domain[i]) != vComposites.end())
2184 TiXmlText* vDomainList =
new TiXmlText(vDomainListStr);
2185 vDomain->LinkEndChild(vDomainList);
2187 vElmtGeometry->LinkEndChild(vVertex);
2190 vElmtGeometry->LinkEndChild(vEdge);
2194 vElmtGeometry->LinkEndChild(vFace);
2196 vElmtGeometry->LinkEndChild(vElement);
2199 vElmtGeometry->LinkEndChild(vCurved);
2201 vElmtGeometry->LinkEndChild(vComposite);
2202 vElmtGeometry->LinkEndChild(vDomain);
2204 pNektar->LinkEndChild(vElmtGeometry);
2206 if (pSession->DefinesElement(
"Nektar/Conditions"))
2208 std::set<int> vBndRegionIdList;
2209 TiXmlElement* vConditions =
new TiXmlElement(*pSession->GetElement(
"Nektar/Conditions"));
2210 TiXmlElement* vBndRegions = vConditions->FirstChildElement(
"BOUNDARYREGIONS");
2211 TiXmlElement* vBndConditions = vConditions->FirstChildElement(
"BOUNDARYCONDITIONS");
2212 TiXmlElement* vItem;
2216 TiXmlElement* vNewBndRegions =
new TiXmlElement(
"BOUNDARYREGIONS");
2217 vItem = vBndRegions->FirstChildElement();
2220 std::string vSeqStr = vItem->FirstChild()->ToText()->Value();
2221 std::string::size_type indxBeg = vSeqStr.find_first_of(
'[') + 1;
2222 std::string::size_type indxEnd = vSeqStr.find_last_of(
']') - 1;
2223 vSeqStr = vSeqStr.substr(indxBeg, indxEnd - indxBeg + 1);
2224 std::vector<unsigned int> vSeq;
2229 for (
unsigned int i = 0; i < vSeq.size(); ++i)
2231 if (vComposites.find(vSeq[i]) != vComposites.end())
2233 idxList.push_back(vSeq[i]);
2236 int p = atoi(vItem->Attribute(
"ID"));
2240 if (vListStr.length() == 0)
2242 TiXmlElement* tmp = vItem;
2243 vItem = vItem->NextSiblingElement();
2244 vBndRegions->RemoveChild(tmp);
2248 vListStr =
"C[" + vListStr +
"]";
2249 TiXmlText* vList =
new TiXmlText(vListStr);
2250 TiXmlElement* vNewElement =
new TiXmlElement(
"B");
2251 vNewElement->SetAttribute(
"ID", p);
2252 vNewElement->LinkEndChild(vList);
2253 vNewBndRegions->LinkEndChild(vNewElement);
2254 vBndRegionIdList.insert(p);
2255 vItem = vItem->NextSiblingElement();
2262 vConditions->ReplaceChild(vBndRegions, *vNewBndRegions);
2267 vItem = vBndConditions->FirstChildElement();
2271 if ((x = vBndRegionIdList.find(atoi(vItem->Attribute(
"REF")))) != vBndRegionIdList.end())
2273 vItem->SetAttribute(
"REF", *x);
2274 vItem = vItem->NextSiblingElement();
2278 TiXmlElement* tmp = vItem;
2279 vItem = vItem->NextSiblingElement();
2280 vBndConditions->RemoveChild(tmp);
2284 pNektar->LinkEndChild(vConditions);
2288 TiXmlElement* vSrc = pSession->GetElement(
"Nektar")
2289 ->FirstChildElement();
2292 std::string vName = boost::to_upper_copy(vSrc->ValueStr());
2293 if (vName !=
"GEOMETRY" && vName !=
"CONDITIONS")
2295 pNektar->LinkEndChild(
new TiXmlElement(*vSrc));
2297 vSrc = vSrc->NextSiblingElement();
2308 for ( boost::tie(vertit, vertit_end) = boost::vertices(
m_localPartition[procid]);
2309 vertit != vertit_end;
2328 weight = bndWeight ?
2333 weight = bndWeight ?
2338 weight = bndWeight ?
2343 weight = bndWeight ?
2348 weight = bndWeight ?
2353 weight = bndWeight ?
2358 weight = bndWeight ?
2385 int n = std::max ( na, std::max(nb, nc));
void GetCompositeOrdering(CompositeOrdering &composites)
int CalculateElementWeight(char elmtType, bool bndWeight, int na, int nb, int nc)
#define ASSERTL0(condition, msg)
static bool GenerateOrderedStringVector(const char *const str, std::vector< std::string > &vec)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
std::map< std::string, std::string > m_vertexAttributes
int getNumberOfBndCoefficients(int Na, int Nb)
int getNumberOfCoefficients(int Na, int Nb, int Nc)
static bool GenerateOrderedVector(const char *const str, std::vector< unsigned int > &vec)
tBaseSharedPtr CreateInstance(tKey idKey BOOST_PP_COMMA_IF(MAX_PARAM) BOOST_PP_ENUM_BINARY_PARAMS(MAX_PARAM, tParam, x))
Create an instance of the class referred to by idKey.
NekInt64 ptoffset
the id of point data map (currently always 0 since we are using just one set).
std::map< int, MeshEntity > m_meshComposites
void WriteLocalPartition(SessionReaderSharedPtr &pSession)
const std::string kPointsTypeStr[]
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
std::map< int, MeshVertex > m_meshVertices
std::vector< NekInt64 > index
id of this Point set
void CheckPartitions(int nParts, Array< OneD, int > &pPart)
void ReadConditions(const SessionReaderSharedPtr &pSession)
static std::string GenerateSeqString(const std::vector< unsigned int > &elmtids)
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
std::map< MeshCurvedKey, MeshCurved > m_meshCurved
std::map< int, std::vector< unsigned int > > BndRegionOrdering
boost::graph_traits< BoostGraph >::vertex_descriptor BoostVertex
std::map< int, MultiWeight > m_vertBndWeights
std::map< int, MultiWeight > m_vertWeights
std::map< int, std::vector< unsigned int > > CompositeOrdering
int getNumberOfCoefficients(int Na, int Nb, int Nc)
FieldIOFactory & GetFieldIOFactory()
Returns the FieldIO factory.
boost::shared_ptr< SessionReader > SessionReaderSharedPtr
static bool GenerateSeqVector(const char *const str, std::vector< unsigned int > &vec)
CommFactory & GetCommFactory()
NekInt64 entityid
Id of this curved information.
std::map< std::string, NumModes > NummodesPerField
std::map< std::string, int > m_fieldNameToId
void ReadExpansions(const SessionReaderSharedPtr &pSession)
std::string GetCompressString(void)
std::map< int, NummodesPerField > m_expansions
std::vector< unsigned int > list
std::map< int, MeshEntity > m_meshElements
boost::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
int CalculateEdgeWeight(char elmtType, int na, int nb, int nc)
NekInt64 npoints
The entity id corresponding to the global edge/curve.
int getNumberOfCoefficients(int Na)
LibUtilities::NekFactory< std::string, MeshPartition, const SessionReaderSharedPtr & > MeshPartitionFactory
Datatype of the NekFactory used to instantiate classes derived from the EquationSystem class...
void CreateGraph(BoostSubGraph &pGraph)
static const std::string GetFileType(const std::string &filename, CommSharedPtr comm)
Determine file type of given input file.
void GetBndRegionOrdering(BndRegionOrdering &composites)
std::map< int, MultiWeight > m_edgeWeights
int getNumberOfCoefficients(int Na, int Nb)
void GetElementIDs(const int procid, std::vector< unsigned int > &tmp)
std::vector< unsigned int > m_domain
std::vector< BoostSubGraph > m_localPartition
std::string PortablePath(const boost::filesystem::path &path)
create portable path on different platforms for boost::filesystem path
boost::shared_ptr< FieldIO > FieldIOSharedPtr
void ReadGeometry(const SessionReaderSharedPtr &pSession)
virtual void PartitionGraphImpl(int &nVerts, int &nVertConds, Nektar::Array< Nektar::OneD, int > &xadj, Nektar::Array< Nektar::OneD, int > &adjcy, Nektar::Array< Nektar::OneD, int > &vertWgt, Nektar::Array< Nektar::OneD, int > &vertSize, Nektar::Array< Nektar::OneD, int > &edgeWgt, int &nparts, int &volume, Nektar::Array< Nektar::OneD, int > &part)=0
int getNumberOfBndCoefficients(int Na)
int ZlibEncodeToBase64Str(std::vector< T > &in, std::string &out64)
int getNumberOfBndCoefficients(int Na, int Nb)
NekInt64 ptype
point offset of data entry for this curve
BndRegionOrdering m_bndRegOrder
int getNumberOfCoefficients(int Na, int Nb, int Nc)
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator
std::string GetBitSizeStr(void)
boost::graph_traits< BoostGraph >::adjacency_iterator BoostAdjacencyIterator
std::map< int, MeshEntity > m_meshEdges
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
NekInt64 ptid
The number of points in this curved entity.
int getNumberOfCoefficients(int Na, int Nb)
void PartitionMesh(int nParts, bool shared=false, bool overlapping=false)
boost::graph_traits< BoostGraph >::edge_descriptor BoostEdge
void PrintPartInfo(std::ostream &out)
std::map< int, MeshEntity > m_meshFaces
void WriteAllPartitions(SessionReaderSharedPtr &pSession)
boost::graph_traits< BoostGraph >::vertex_iterator BoostVertexIterator
std::vector< MeshVertex > pts
mapping to access pts value.
void OutputPartition(SessionReaderSharedPtr &pSession, BoostSubGraph &pGraph, TiXmlElement *pGeometry)
void PartitionGraph(BoostSubGraph &pGraph, int nParts, std::vector< BoostSubGraph > &pLocalPartition, bool overlapping=false)
Partition the graph.
int getNumberOfCoefficients(int Na, int Nb, int Nc)
MeshPartition(const SessionReaderSharedPtr &pSession)
std::map< int, MeshCurvedPts > m_meshCurvedPts
MeshPartitionFactory & GetMeshPartitionFactory()
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
int ZlibDecodeFromBase64Str(std::string &in64, std::vector< T > &out)
Provides a generic Factory class.
boost::subgraph< BoostGraph > BoostSubGraph
std::map< int, char > m_shape