35#include <boost/algorithm/string.hpp>
46#define TIME_RESULT(verb, msg, timer) \
49 std::cout << " - " << msg << ": " << timer.TimePerTest(1) << "\n" \
65 "IO with HDF5 geometry");
96std::pair<size_t, size_t>
SplitWork(
size_t vecsize,
int rank,
int nprocs)
98 size_t div = vecsize / nprocs;
99 size_t rem = vecsize % nprocs;
102 return std::make_pair(rank * (div + 1), div + 1);
106 return std::make_pair((rank - rem) * div + rem * (div + 1), div);
110template <class T, typename std::enable_if<T::kDim == 0, int>::type = 0>
112 [[maybe_unused]] std::map<
int, std::shared_ptr<T>> &geomMap)
117template <class T, typename std::enable_if<T::kDim == 1, int>::type = 0>
119 [[maybe_unused]] std::map<
int, std::shared_ptr<T>> &geomMap)
124template <class T, typename std::enable_if<T::kDim == 2, int>::type = 0>
126 [[maybe_unused]] std::map<
int, std::shared_ptr<T>> &geomMap)
131template <class T, typename std::enable_if<T::kDim == 3, int>::type = 0>
133 [[maybe_unused]] std::map<
int, std::shared_ptr<T>> &geomMap)
139inline void UniqueValues([[maybe_unused]] std::unordered_set<int> &unique)
145 const std::vector<int> &input, T &...args)
157 "use-hdf5-node-comm",
"",
158 "Use a per-node communicator for HDF5 partitioning.");
173 const bool isRoot = comm->TreatAsRankZero();
185 TiXmlAttribute *attr =
m_xmlGeom->FirstAttribute();
191 std::string attrName(attr->Name());
192 if (attrName ==
"DIM")
195 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read mesh dimension.");
197 else if (attrName ==
"SPACE")
200 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read space dimension.");
202 else if (attrName ==
"PARTITION")
205 "PARTITION parameter should only be used in XML meshes");
207 else if (attrName ==
"HDF5FILE")
211 else if (attrName ==
"PARTITIONED")
214 "PARTITIONED parameter should only be used in XML meshes");
218 std::string errstr(
"Unknown attribute: ");
228 "Mesh dimension greater than space dimension.");
234 if (commMesh->GetSize() > 1)
237 parallelProps = H5::PList::FileAccess();
238 parallelProps->SetMpio(commMesh);
240 m_readPL = H5::PList::DatasetXfer();
246 auto root =
m_file->OpenGroup(
"NEKTAR");
247 ASSERTL0(root,
"Cannot find NEKTAR group in HDF5 file.");
249 auto root2 = root->OpenGroup(
"GEOMETRY");
250 ASSERTL0(root2,
"Cannot find NEKTAR/GEOMETRY group in HDF5 file.");
255 for (; attrIt != attrEnd; ++attrIt)
257 if (*attrIt ==
"FORMAT_VERSION")
263 "Unable to determine Nektar++ geometry HDF5 file version.");
268 " is higher than supported in "
269 "this version of Nektar++");
271 m_mesh = root2->OpenGroup(
"MESH");
272 ASSERTL0(
m_mesh,
"Cannot find NEKTAR/GEOMETRY/MESH group in HDF5 file.");
273 m_maps = root2->OpenGroup(
"MAPS");
274 ASSERTL0(
m_mesh,
"Cannot find NEKTAR/GEOMETRY/MAPS group in HDF5 file.");
287 std::vector<std::tuple<std::string, int, LibUtilities::ShapeType>>>
298 const bool verbRoot =
299 isRoot &&
m_session->DefinesCmdLineArgument(
"verbose");
303 std::cout <<
"Reading HDF5 geometry..." << std::endl;
311 int innerRank = 0, innerSize = 1,
312 interRank = interComm->GetRowComm()->GetRank(),
313 interSize = interComm->GetRowComm()->GetSize();
315 if (session->DefinesCmdLineArgument(
"use-hdf5-node-comm"))
317 ASSERTL0(comm->GetSize() == commMesh->GetSize(),
318 "--use-hdf5-node-comm not available with Parallel-in-Time")
320 auto splitComm = comm->SplitCommNode();
321 innerComm = splitComm.first;
322 interComm = splitComm.second;
323 innerRank = innerComm->GetRank();
324 innerSize = innerComm->GetSize();
328 interRank = interComm->GetRank();
329 interSize = interComm->GetSize();
335 std::unordered_set<int> toRead;
344 std::cout <<
" - beginning partitioning" << std::endl;
354 const bool verbRoot2 =
355 isRoot && session->DefinesCmdLineArgument(
"verbose");
358 std::vector<int> ids;
362 std::vector<MeshEntity> elmts;
363 std::unordered_map<int, int> row2id, id2row;
373 auto parallelProps = H5::PList::FileAccess();
374 parallelProps->SetMpio(interComm);
377 readPL = H5::PList::DatasetXfer();
378 readPL->SetDxMpioCollective();
379 file = H5::File::Open(
m_hdf5Name, H5F_ACC_RDONLY, parallelProps);
381 auto root = file->OpenGroup(
"NEKTAR");
382 auto root2 = root->OpenGroup(
"GEOMETRY");
383 mesh = root2->OpenGroup(
"MESH");
384 maps = root2->OpenGroup(
"MAPS");
390 std::string ds = std::get<0>(it);
392 if (!mesh->ContainsDataSet(ds))
400 vector<hsize_t> dims = space->GetDims();
404 vector<hsize_t> mdims = mspace->GetDims();
409 vector<int> tmpElmts, tmpIds;
410 mdata->Read(tmpIds, mspace, readPL);
411 data->Read(tmpElmts, space, readPL);
413 const int nGeomData = std::get<1>(it);
415 for (
int i = 0, cnt = 0; i < tmpIds.size(); ++i, ++rowCount)
418 row2id[rowCount] = tmpIds[i];
419 id2row[tmpIds[i]] = row2id[rowCount];
423 e.
list = std::vector<unsigned int>(&tmpElmts[cnt],
424 &tmpElmts[cnt + nGeomData]);
430 interComm->GetRowComm()->Block();
437 size_t numElmt = elmts.size();
438 ASSERTL0(commMesh->GetSize() <= numElmt,
439 "This mesh has more processors than elements!");
441 auto elRange =
SplitWork(numElmt, interRank, interSize);
444 std::map<int, MeshEntity> partElmts;
445 std::unordered_set<int> facetIDs;
449 for (
int el = elRange.first; el < elRange.first + elRange.second;
454 partElmts[el] = elmt;
456 for (
auto &facet : elmt.
list)
458 facetIDs.insert(facet);
465 for (
int i = 0; i < numElmt; ++i)
468 if (i >= elRange.first && i < elRange.first + elRange.second)
477 for (
auto &eId : elmt.
list)
479 if (facetIDs.find(eId) != facetIDs.end())
489 partElmts[elmt.
id] = elmt;
496 string partitionerName =
497 commMesh->GetSize() > 1 ?
"PtScotch" :
"Scotch";
500 partitionerName =
"ParMetis";
502 if (session->DefinesCmdLineArgument(
"use-parmetis"))
504 partitionerName =
"ParMetis";
506 if (session->DefinesCmdLineArgument(
"use-ptscotch"))
508 partitionerName =
"PtScotch";
517 TIME_RESULT(verbRoot2,
" - partitioner setup", t2);
520 partitioner->PartitionMesh(interSize,
true,
false, nLocal);
527 std::vector<unsigned int> nodeElmts;
528 partitioner->GetElementIDs(interRank, nodeElmts);
533 std::map<int, MeshEntity> partElmts;
534 std::unordered_map<int, int> row2elmtid, elmtid2row;
541 for (
auto &elmtRow : nodeElmts)
543 row2elmtid[vcnt] = elmts[elmtRow].origId;
544 elmtid2row[elmts[elmtRow].origId] = vcnt;
547 partElmts[vcnt++] = elmt;
560 TIME_RESULT(verbRoot2,
" - inner partition setup", t2);
563 partitioner->PartitionMesh(innerSize,
true,
false, 0);
566 TIME_RESULT(verbRoot2,
" - inner partitioning", t2);
570 for (
int i = 1; i < innerSize; ++i)
572 std::vector<unsigned int> tmp;
573 partitioner->GetElementIDs(i, tmp);
574 size_t tmpsize = tmp.size();
575 for (
int j = 0; j < tmpsize; ++j)
577 tmp[j] = row2elmtid[tmp[j]];
579 innerComm->Send(i, tmpsize);
580 innerComm->Send(i, tmp);
584 TIME_RESULT(verbRoot2,
" - inner partition scatter", t2);
586 std::vector<unsigned int> tmp;
587 partitioner->GetElementIDs(0, tmp);
589 for (
auto &tmpId : tmp)
591 toRead.insert(row2elmtid[tmpId]);
596 for (
auto &tmpId : nodeElmts)
598 toRead.insert(row2id[tmpId]);
607 innerComm->Recv(0, tmpSize);
608 std::vector<unsigned int> tmp(tmpSize);
609 innerComm->Recv(0, tmp);
611 for (
auto &tmpId : tmp)
613 toRead.insert(tmpId);
623 std::vector<int> vertIDs, segIDs, triIDs, quadIDs;
624 std::vector<int> tetIDs, prismIDs, pyrIDs, hexIDs;
625 std::vector<int> segData, triData, quadData, tetData;
626 std::vector<int> prismData, pyrData, hexData;
627 std::vector<NekDouble> vertData;
639 UniqueValues(toRead, hexData, pyrData, prismData, tetData);
684 for (
auto &edge : segIDs)
700 for (
auto &face : triIDs)
704 for (
auto &face : quadIDs)
729 if (
m_session->DefinesElement(
"NEKTAR/CONDITIONS"))
731 std::set<int> vBndRegionIdList;
732 TiXmlElement *vConditions =
733 new TiXmlElement(*
m_session->GetElement(
"Nektar/Conditions"));
734 TiXmlElement *vBndRegions =
735 vConditions->FirstChildElement(
"BOUNDARYREGIONS");
742 vItem = vBndRegions->FirstChildElement();
745 std::string vSeqStr = vItem->FirstChild()->ToText()->Value();
746 std::string::size_type indxBeg = vSeqStr.find_first_of(
'[') + 1;
747 std::string::size_type indxEnd = vSeqStr.find_last_of(
']') - 1;
748 vSeqStr = vSeqStr.substr(indxBeg, indxEnd - indxBeg + 1);
750 std::vector<unsigned int> vSeq;
753 int p = atoi(vItem->Attribute(
"ID"));
755 vItem = vItem->NextSiblingElement();
764template <
class T,
typename DataType>
766 [[maybe_unused]] std::map<
int, std::shared_ptr<T>> &geomMap,
767 [[maybe_unused]]
int id, [[maybe_unused]] DataType *data,
774 std::map<
int, std::shared_ptr<PointGeom>> &geomMap,
int id,
NekDouble *data,
783 std::map<
int, std::shared_ptr<SegGeom>> &geomMap,
int id,
int *data,
793 std::map<
int, std::shared_ptr<TriGeom>> &geomMap,
int id,
int *data,
803 std::map<
int, std::shared_ptr<QuadGeom>> &geomMap,
int id,
int *data,
813 std::map<
int, std::shared_ptr<TetGeom>> &geomMap,
int id,
int *data,
824 geomMap[id] = tetGeom;
829 std::map<
int, std::shared_ptr<PyrGeom>> &geomMap,
int id,
int *data,
838 geomMap[id] = pyrGeom;
843 std::map<
int, std::shared_ptr<PrismGeom>> &geomMap,
int id,
int *data,
852 geomMap[id] = prismGeom;
857 std::map<
int, std::shared_ptr<HexGeom>> &geomMap,
int id,
int *data,
870 geomMap[id] = hexGeom;
873template <
class T,
typename DataType>
875 const CurveMap &curveMap, std::vector<int> &ids,
876 std::vector<DataType> &geomData)
879 const int nRows = geomData.size() / nGeomData;
883 if (curveMap.size() > 0)
885 for (
int i = 0, cnt = 0; i < nRows; i++, cnt += nGeomData)
887 auto cIt = curveMap.find(ids[i]);
889 cIt == curveMap.end() ? empty : cIt->second);
894 for (
int i = 0, cnt = 0; i < nRows; i++, cnt += nGeomData)
901template <
class T,
typename DataType>
904 const std::unordered_set<int> &readIds,
905 std::vector<int> &ids,
906 std::vector<DataType> &geomData)
908 if (!
m_mesh->ContainsDataSet(dataSet))
916 vector<hsize_t> dims = space->GetDims();
921 vector<hsize_t> mdims = mspace->GetDims();
923 ASSERTL0(mdims[0] == dims[0],
"map and data set lengths do not match");
929 mdata->Read(allIds, mspace);
936 std::vector<hsize_t> coords;
937 for (
auto &
id : allIds)
939 if (readIds.find(
id) != readIds.end())
941 for (
int j = 0; j < nGeomData; ++j)
951 space->SetSelection(coords.size() / 2, coords);
954 data->Read(geomData, space,
m_readPL);
958 const std::unordered_set<int> &readIds)
961 if (!
m_mesh->ContainsDataSet(dsName))
975 vector<int> ids, newIds;
976 idData->Read(ids, idSpace);
977 curveSpace->ClearRange();
980 vector<hsize_t> curveSel;
985 if (readIds.find(
id) != readIds.end())
987 curveSel.push_back(cnt);
988 curveSel.push_back(0);
989 curveSel.push_back(cnt);
990 curveSel.push_back(1);
991 curveSel.push_back(cnt);
992 curveSel.push_back(2);
993 newIds.push_back(
id);
1000 auto toRead = newIds.size();
1001 m_session->GetComm()->GetRowComm()->AllReduce(toRead,
1010 vector<int> curveInfo;
1011 curveSpace->SetSelection(curveSel.size() / 2, curveSel);
1012 curveData->Read(curveInfo, curveSpace,
m_readPL);
1016 std::unordered_map<int, int> curvePtOffset;
1019 for (
int i = 0, cnt = 0, cnt2 = 0; i < curveInfo.size() / 3; ++i, cnt += 3)
1024 curve->m_points.resize(curveInfo[cnt]);
1026 const int ptOffset = curveInfo[cnt + 2];
1028 for (
int j = 0; j < curveInfo[cnt]; ++j)
1032 curveSel.push_back(ptOffset + j);
1033 curveSel.push_back(0);
1034 curveSel.push_back(ptOffset + j);
1035 curveSel.push_back(1);
1036 curveSel.push_back(ptOffset + j);
1037 curveSel.push_back(2);
1042 curvePtOffset[newIds[i]] = 3 * cnt2;
1043 cnt2 += curveInfo[cnt];
1045 curveMap[newIds[i]] = curve;
1054 nodeSpace->ClearRange();
1055 nodeSpace->SetSelection(curveSel.size() / 2, curveSel);
1057 vector<NekDouble> nodeRawData;
1058 nodeData->Read(nodeRawData, nodeSpace,
m_readPL);
1061 for (
auto &cIt : curvePtOffset)
1066 int cnt = cIt.second;
1067 for (
int i = 0; i < curve->m_points.size(); ++i, cnt += 3)
1071 nodeRawData[cnt + 2]);
1080 map<int, CompositeSharedPtr> fullDomain;
1084 vector<string> data;
1085 dst->ReadVectorString(data, space,
m_readPL);
1092 std::vector<CompositeMap> fullDomain;
1096 vector<string> data;
1097 dst->ReadVectorString(data, space,
m_readPL);
1098 for (
auto &dIt : data)
1108 mdata->Read(ids, mspace);
1110 for (
int i = 0; i < ids.size(); ++i)
1118 string nm =
"COMPOSITE";
1122 vector<hsize_t> dims = space->GetDims();
1124 vector<string> comps;
1125 data->ReadVectorString(comps, space);
1129 vector<hsize_t> mdims = mspace->GetDims();
1132 mdata->Read(ids, mspace);
1134 for (
int i = 0; i < dims[0]; i++)
1136 string compStr = comps[i];
1139 istringstream strm(compStr);
1145 string::size_type indxBeg = compStr.find_first_of(
'[') + 1;
1146 string::size_type indxEnd = compStr.find_last_of(
']') - 1;
1148 string indxStr = compStr.substr(indxBeg, indxEnd - indxBeg + 1);
1149 vector<unsigned int> seqVector;
1157 for (
auto &i : seqVector)
1162 comp->m_geomVec.push_back(it->second);
1168 for (
auto &i : seqVector)
1173 comp->m_geomVec.push_back(it->second);
1178 for (
auto &i : seqVector)
1185 comp->m_geomVec.push_back(it->second);
1191 for (
auto &i : seqVector)
1198 comp->m_geomVec.push_back(it->second);
1204 for (
auto &i : seqVector)
1211 comp->m_geomVec.push_back(it1->second);
1219 comp->m_geomVec.push_back(it2->second);
1225 for (
auto &i : seqVector)
1232 comp->m_geomVec.push_back(it->second);
1238 for (
auto &i : seqVector)
1245 comp->m_geomVec.push_back(it->second);
1251 for (
auto &i : seqVector)
1258 comp->m_geomVec.push_back(it->second);
1264 for (
auto &i : seqVector)
1271 comp->m_geomVec.push_back(it->second);
1278 if (comp->m_geomVec.size() > 0)
1286 std::unordered_map<int, int> &id2row)
1290 string nm =
"COMPOSITE";
1294 vector<hsize_t> dims = space->GetDims();
1296 vector<string> comps;
1297 data->ReadVectorString(comps, space);
1301 vector<hsize_t> mdims = mspace->GetDims();
1304 mdata->Read(ids, mspace);
1306 for (
int i = 0; i < dims[0]; i++)
1308 string compStr = comps[i];
1311 istringstream strm(compStr);
1315 string::size_type indxBeg = compStr.find_first_of(
'[') + 1;
1316 string::size_type indxEnd = compStr.find_last_of(
']') - 1;
1318 string indxStr = compStr.substr(indxBeg, indxEnd - indxBeg + 1);
1319 vector<unsigned int> seqVector;
1359 std::vector<int> filteredVector;
1360 for (
auto &compElmt : seqVector)
1362 if (id2row.find(compElmt) == id2row.end())
1367 filteredVector.push_back(compElmt);
1370 if (filteredVector.size() == 0)
1375 ret[ids[i]] = std::make_pair(shapeType, filteredVector);
1381template <class T, typename std::enable_if<T::kDim == 0, int>::type = 0>
1387template <class T, typename std::enable_if<T::kDim == 1, int>::type = 0>
1390 return geom->GetVid(i);
1393template <class T, typename std::enable_if<T::kDim == 2, int>::type = 0>
1394inline int GetGeomData(std::shared_ptr<T> &geom,
int i)
1396 return geom->GetEid(i);
1399template <class T, typename std::enable_if<T::kDim == 3, int>::type = 0>
1400inline int GetGeomData(std::shared_ptr<T> &geom,
int i)
1402 return geom->GetFid(i);
1407 std::string datasetName)
1409 typedef typename std::conditional<std::is_same<T, PointGeom>::value,
1413 const size_t nGeom = geomMap.size();
1421 vector<int> idMap(nGeom);
1422 vector<DataType> data(nGeom * nGeomData);
1424 int cnt1 = 0, cnt2 = 0;
1425 for (
auto &it : geomMap)
1427 idMap[cnt1++] = it.first;
1429 for (
int j = 0; j < nGeomData; ++j)
1437 vector<hsize_t> dims = {
static_cast<hsize_t
>(nGeom),
1438 static_cast<hsize_t
>(nGeomData)};
1443 dst->Write(data, ds);
1445 tp = H5::DataType::OfObject(idMap[0]);
1447 ds = std::shared_ptr<H5::DataSpace>(
new H5::DataSpace(dims));
1448 dst =
m_maps->CreateDataSet(datasetName, tp, ds);
1449 dst->Write(idMap, ds);
1456 vector<int> data, map;
1459 for (
auto &c : curves)
1461 map.push_back(c.first);
1462 data.push_back(c.second->m_points.size());
1463 data.push_back(c.second->m_ptype);
1464 data.push_back(ptOffset);
1466 ptOffset += c.second->m_points.size();
1468 for (
auto &pt : c.second->m_points)
1472 pt->GetCoords(v.
x, v.
y, v.
z);
1473 curvedPts.
pts.push_back(v);
1474 curvedPts.
index.push_back(newIdx++);
1479 vector<hsize_t> dims = {data.size() / 3, 3};
1484 dst->Write(data, ds);
1486 tp = H5::DataType::OfObject(map[0]);
1487 dims = {map.size()};
1488 ds = std::shared_ptr<H5::DataSpace>(
new H5::DataSpace(dims));
1489 dst =
m_maps->CreateDataSet(dsName, tp, ds);
1490 dst->Write(map, ds);
1495 vector<double> vertData(curvedPts.
pts.size() * 3);
1498 for (
auto &pt : curvedPts.
pts)
1500 vertData[cnt++] = pt.x;
1501 vertData[cnt++] = pt.y;
1502 vertData[cnt++] = pt.z;
1505 vector<hsize_t> dims = {curvedPts.
pts.size(), 3};
1510 dst->Write(vertData, ds);
1515 vector<string> comps;
1522 for (
auto &cIt : composites)
1524 if (cIt.second->m_geomVec.size() == 0)
1530 c_map.push_back(cIt.first);
1536 dst->WriteVectorString(comps, ds, tp);
1538 tp = H5::DataType::OfObject(c_map[0]);
1539 ds = H5::DataSpace::OneD(c_map.size());
1540 dst =
m_maps->CreateDataSet(
"COMPOSITE", tp, ds);
1541 dst->Write(c_map, ds);
1550 std::vector<vector<unsigned int>> idxList;
1553 for (
auto &dIt : domain)
1555 idxList.push_back(std::vector<unsigned int>());
1556 for (
auto cIt = dIt.second.begin(); cIt != dIt.second.end(); ++cIt)
1558 idxList[cnt].push_back(cIt->first);
1562 d_map.push_back(dIt.first);
1565 stringstream domString;
1566 vector<string> doms;
1567 for (
auto &cIt : idxList)
1575 dst->WriteVectorString(doms, ds, tp);
1577 tp = H5::DataType::OfObject(d_map[0]);
1578 ds = H5::DataSpace::OneD(d_map.size());
1579 dst =
m_maps->CreateDataSet(
"DOMAIN", tp, ds);
1580 dst->Write(d_map, ds);
1584 const std::string &outfilename,
bool defaultExp,
1588 boost::split(tmp, outfilename, boost::is_any_of(
"."));
1589 string filenameXml = tmp[0] +
".xml";
1590 string filenameHdf5 = tmp[0] +
".nekg";
1599 TiXmlDocument *doc =
new TiXmlDocument;
1601 TiXmlElement *geomTag;
1603 if (fs::exists(filenameXml.c_str()))
1605 ifstream file(filenameXml.c_str());
1607 TiXmlHandle docHandle(doc);
1608 root = docHandle.FirstChildElement(
"NEKTAR").Element();
1609 ASSERTL0(root,
"Unable to find NEKTAR tag in file.");
1610 geomTag = root->FirstChildElement(
"GEOMETRY");
1615 TiXmlDeclaration *decl =
new TiXmlDeclaration(
"1.0",
"utf-8",
"");
1616 doc->LinkEndChild(decl);
1617 root =
new TiXmlElement(
"NEKTAR");
1618 doc->LinkEndChild(root);
1620 geomTag =
new TiXmlElement(
"GEOMETRY");
1621 root->LinkEndChild(geomTag);
1627 geomTag->SetAttribute(
"HDF5FILE", filenameHdf5);
1633 TiXmlElement *expTag =
new TiXmlElement(
"EXPANSIONS");
1640 TiXmlElement *exp =
new TiXmlElement(
"E");
1643 "C[" + boost::lexical_cast<string>(it->first) +
"]");
1644 exp->SetAttribute(
"NUMMODES", 4);
1645 exp->SetAttribute(
"TYPE",
"MODIFIED");
1646 exp->SetAttribute(
"FIELDS",
"u");
1648 expTag->LinkEndChild(exp);
1651 root->LinkEndChild(expTag);
1659 doc->SaveFile(filenameXml);
1666 m_file = H5::File::Create(filenameHdf5, H5F_ACC_TRUNC);
1667 auto hdfRoot =
m_file->CreateGroup(
"NEKTAR");
1668 auto hdfRoot2 = hdfRoot->CreateGroup(
"GEOMETRY");
1674 m_mesh = hdfRoot2->CreateGroup(
"MESH");
1675 m_maps = hdfRoot2->CreateGroup(
"MAPS");
1693 int ptOffset = 0, newIdx = 0;
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define TIME_RESULT(verb, msg, timer)
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.
static void GetXMLElementTimeLevel(TiXmlElement *&element, const size_t timeLevel, const bool enableCheck=true)
Get XML elment time level (Parallel-in-Time)
static std::string RegisterCmdLineFlag(const std::string &pName, const std::string &pShortName, const std::string &pDescription)
Registers a command-line flag with the session reader.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
static std::string GenerateSeqString(const std::vector< T > &v)
Generate a compressed comma-separated string representation of a vector of unsigned integers.
static bool GenerateSeqVector(const std::string &str, std::vector< unsigned int > &out)
Takes a comma-separated compressed string and converts it to entries in a vector.
void FillGeomMap(std::map< int, std::shared_ptr< T > > &geomMap, const CurveMap &curveMap, std::vector< int > &ids, std::vector< DataType > &geomData)
void ConstructGeomObject(std::map< int, std::shared_ptr< T > > &geomMap, int id, DataType *data, CurveSharedPtr curve)
void v_PartitionMesh(LibUtilities::SessionReaderSharedPtr session) override
Partition the mesh.
void ReadCurveMap(CurveMap &curveMap, std::string dsName, const std::unordered_set< int > &readIds)
void v_WriteGeometry(const std::string &outfilename, bool defaultExp=false, const LibUtilities::FieldMetaDataMap &metadata=LibUtilities::NullFieldMetaDataMap) override
static const unsigned int FORMAT_VERSION
Version of the Nektar++ HDF5 geometry format, which is embedded into the main NEKTAR/GEOMETRY group a...
static std::string className
void v_ReadGeometry(LibUtilities::DomainRangeShPtr rng, bool fillGraph) override
void WriteComposites(CompositeMap &comps)
static std::string cmdSwitch
void WriteCurvePoints(MeshCurvedPts &curvedPts)
LibUtilities::H5::GroupSharedPtr m_maps
static MeshGraphSharedPtr create()
LibUtilities::H5::PListSharedPtr m_readPL
unsigned int m_inFormatVersion
LibUtilities::H5::FileSharedPtr m_file
void WriteGeometryMap(std::map< int, std::shared_ptr< T > > &geomMap, std::string datasetName)
void ReadGeometryData(std::map< int, std::shared_ptr< T > > &geomMap, std::string dataSet, const std::unordered_set< int > &readIds, std::vector< int > &ids, std::vector< DataType > &geomData)
void WriteDomain(std::map< int, CompositeMap > &domain)
LibUtilities::H5::GroupSharedPtr m_mesh
void WriteCurveMap(CurveMap &curves, std::string dsName, MeshCurvedPts &curvedPts, int &ptOffset, int &newIdx)
bool CheckRange(Geometry2D &geom)
Check if goemetry is in range definition if activated.
PrismGeomMap m_prismGeoms
void PopulateFaceToElMap(Geometry3DSharedPtr element, int kNfaces)
Given a 3D geometry object #element, populate the face to element map m_faceToElMap which maps faces ...
Geometry2DSharedPtr GetGeometry2D(int gID)
LibUtilities::SessionReaderSharedPtr m_session
std::map< int, CompositeMap > m_domain
CompositeOrdering m_compOrder
void GetCompositeList(const std::string &compositeStr, CompositeMap &compositeVector) const
CompositeMap m_meshComposites
MovementSharedPtr m_movement
std::string GetCompositeString(CompositeSharedPtr comp)
Returns a string representation of a composite.
SegGeomSharedPtr GetSegGeom(int id)
CompositeDescriptor CreateCompositeDescriptor()
PointGeomSharedPtr GetVertex(int id)
LibUtilities::DomainRangeShPtr m_domainRange
BndRegionOrdering m_bndRegOrder
std::shared_ptr< DataSpace > DataSpaceSharedPtr
std::shared_ptr< PList > PListSharedPtr
std::shared_ptr< File > FileSharedPtr
std::shared_ptr< DataType > DataTypeSharedPtr
std::shared_ptr< Group > GroupSharedPtr
std::shared_ptr< DataSet > DataSetSharedPtr
std::map< std::string, std::string > FieldMetaDataMap
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< DomainRange > DomainRangeShPtr
CommFactory & GetCommFactory()
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
NekDouble GetGeomData(std::shared_ptr< T > &geom, int i)
std::shared_ptr< QuadGeom > QuadGeomSharedPtr
int GetGeomDataDim(std::map< int, std::shared_ptr< T > > &geomMap)
std::map< int, std::pair< LibUtilities::ShapeType, std::vector< int > > > CompositeDescriptor
MeshPartitionFactory & GetMeshPartitionFactory()
std::pair< size_t, size_t > SplitWork(size_t vecsize, int rank, int nprocs)
Utility function to split a vector equally amongst a number of processors.
std::shared_ptr< Composite > CompositeSharedPtr
std::shared_ptr< Curve > CurveSharedPtr
std::unordered_map< int, CurveSharedPtr > CurveMap
std::shared_ptr< SegGeom > SegGeomSharedPtr
std::shared_ptr< PointGeom > PointGeomSharedPtr
std::shared_ptr< Geometry2D > Geometry2DSharedPtr
std::shared_ptr< MeshPartition > MeshPartitionSharedPtr
std::shared_ptr< TriGeom > TriGeomSharedPtr
MeshGraphFactory & GetMeshGraphFactory()
void UniqueValues(std::unordered_set< int > &unique)
std::map< int, CompositeSharedPtr > CompositeMap
std::vector< MeshVertex > pts
mapping to access pts value.
std::vector< NekInt64 > index
id of this Point set
std::vector< unsigned int > list