53 #include <boost/archive/iterators/base64_from_binary.hpp>
54 #include <boost/archive/iterators/binary_from_base64.hpp>
55 #include <boost/archive/iterators/transform_width.hpp>
56 #include <boost/iostreams/copy.hpp>
57 #include <boost/iostreams/filter/zlib.hpp>
58 #include <boost/iostreams/filtering_stream.hpp>
60 #include <boost/geometry/geometry.hpp>
61 #include <boost/geometry/index/rtree.hpp>
62 namespace bg = boost::geometry;
68 namespace SpatialDomains
82 typedef bg::model::point<NekDouble, 3, bg::cs::cartesian>
BgPoint;
83 typedef bg::model::box<BgPoint>
BgBox;
86 bg::index::rtree<BgRtreeValue, bg::index::rstar<16, 4>>
m_bgTree;
90 std::array<NekDouble, 6> minMax = geom->GetBoundingBox();
91 BgPoint ptMin(minMax[0], minMax[1], minMax[2]);
92 BgPoint ptMax(minMax[3], minMax[4], minMax[5]);
94 std::make_pair(
BgBox(ptMin, ptMax), geom->GetGlobalID()));
98 MeshGraph::MeshGraph()
107 MeshGraph::~MeshGraph()
116 ASSERTL0(comm.get(),
"Communication not initialised.");
121 const bool isRoot = comm->TreatAsRankZero();
122 std::string geomType;
127 session->InitSession();
130 geomType = session->GetGeometryType();
133 std::vector<char> v(geomType.c_str(),
134 geomType.c_str() + geomType.length());
136 size_t length = v.size();
137 comm->Bcast(length, 0);
143 comm->Bcast(length, 0);
145 std::vector<char> v(length);
148 geomType = std::string(v.begin(), v.end());
155 mesh->PartitionMesh(session);
158 mesh->ReadGeometry(rng, fillGraph);
163 void MeshGraph::FillGraph()
167 switch (m_meshDimension)
171 for (
auto &x : m_pyrGeoms)
175 for (
auto &x : m_prismGeoms)
179 for (
auto &x : m_tetGeoms)
183 for (
auto &x : m_hexGeoms)
191 for (
auto &x : m_triGeoms)
195 for (
auto &x : m_quadGeoms)
203 for (
auto &x : m_segGeoms)
216 void MeshGraph::FillBoundingBoxTree()
219 m_boundingBoxTree->m_bgTree.clear();
220 switch (m_meshDimension)
223 for (
auto &x : m_segGeoms)
225 m_boundingBoxTree->InsertGeom(x.second);
229 for (
auto &x : m_triGeoms)
231 m_boundingBoxTree->InsertGeom(x.second);
233 for (
auto &x : m_quadGeoms)
235 m_boundingBoxTree->InsertGeom(x.second);
239 for (
auto &x : m_tetGeoms)
241 m_boundingBoxTree->InsertGeom(x.second);
243 for (
auto &x : m_prismGeoms)
245 m_boundingBoxTree->InsertGeom(x.second);
247 for (
auto &x : m_pyrGeoms)
249 m_boundingBoxTree->InsertGeom(x.second);
251 for (
auto &x : m_hexGeoms)
253 m_boundingBoxTree->InsertGeom(x.second);
263 if (m_boundingBoxTree->m_bgTree.empty())
265 FillBoundingBoxTree();
271 std::vector<GeomRTree::BgRtreeValue> matches;
273 p->GetCoords(x, y, z);
278 m_boundingBoxTree->m_bgTree.query(bg::index::intersects(b),
279 std::back_inserter(matches));
281 std::vector<int> vals(matches.size());
283 for (
int i = 0; i < matches.size(); ++i)
285 vals[i] = matches[i].second;
291 int MeshGraph::GetNumElements()
293 switch (m_meshDimension)
297 return m_segGeoms.size();
302 return m_triGeoms.size() + m_quadGeoms.size();
307 return m_tetGeoms.size() + m_pyrGeoms.size() + m_prismGeoms.size() +
317 bool returnval =
true;
325 if (m_domainRange->m_doXrange)
329 for (
int i = 0; i < nverts; ++i)
332 if (xval < m_domainRange->m_xmin)
337 if (xval > m_domainRange->m_xmax)
346 if ((ncnt_up == nverts) || (ncnt_low == nverts))
353 if (m_domainRange->m_doYrange)
357 for (
int i = 0; i < nverts; ++i)
360 if (yval < m_domainRange->m_ymin)
365 if (yval > m_domainRange->m_ymax)
374 if ((ncnt_up == nverts) || (ncnt_low == nverts))
383 if (m_domainRange->m_doZrange)
388 for (
int i = 0; i < nverts; ++i)
392 if (zval < m_domainRange->m_zmin)
397 if (zval > m_domainRange->m_zmax)
406 if ((ncnt_up == nverts) || (ncnt_low == nverts))
419 bool returnval =
true;
425 if (m_domainRange->m_doXrange)
430 for (
int i = 0; i < nverts; ++i)
433 if (xval < m_domainRange->m_xmin)
438 if (xval > m_domainRange->m_xmax)
447 if ((ncnt_up == nverts) || (ncnt_low == nverts))
453 if (m_domainRange->m_doYrange)
457 for (
int i = 0; i < nverts; ++i)
460 if (yval < m_domainRange->m_ymin)
465 if (yval > m_domainRange->m_ymax)
474 if ((ncnt_up == nverts) || (ncnt_low == nverts))
480 if (m_domainRange->m_doZrange)
484 for (
int i = 0; i < nverts; ++i)
488 if (zval < m_domainRange->m_zmin)
493 if (zval > m_domainRange->m_zmax)
502 if ((ncnt_up == nverts) || (ncnt_low == nverts))
508 if (m_domainRange->m_checkShape)
528 if (whichComposite >= 0 && whichComposite <
int(m_meshComposites.size()))
530 if (whichItem >= 0 &&
531 whichItem <
int(m_meshComposites[whichComposite]->m_geomVec.size()))
533 returnval = m_meshComposites[whichComposite]->m_geomVec[whichItem];
547 std::ostringstream errStream;
548 errStream <<
"Unable to access composite item [" << whichComposite
549 <<
"][" << whichItem <<
"].";
551 std::string testStr = errStream.str();
553 NEKERROR(ErrorUtil::efatal, testStr.c_str());
562 void MeshGraph::GetCompositeList(
const std::string &compositeStr,
566 vector<unsigned int> seqVector;
568 ParseUtils::GenerateSeqVector(compositeStr.c_str(), seqVector);
571 parseGood && !seqVector.empty(),
572 (std::string(
"Unable to read composite index range: ") + compositeStr)
575 vector<unsigned int> addedVector;
577 for (
auto iter = seqVector.begin(); iter != seqVector.end(); ++iter)
582 if (
std::find(addedVector.begin(), addedVector.end(), *iter) ==
588 if (m_meshComposites.find(*iter) == m_meshComposites.end() &&
594 addedVector.push_back(*iter);
595 ASSERTL0(m_meshComposites.find(*iter) != m_meshComposites.end(),
596 "Composite not found.");
601 compositeVector[*iter] = composite;
606 (
"Undefined composite: " + std::to_string(*iter)));
619 if (m_expansionMapShPtrMap.count(variable))
621 returnval = m_expansionMapShPtrMap.find(variable)->second;
625 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
630 "Unable to find expansion vector definition for field: ") +
634 returnval = m_expansionMapShPtrMap.find(
"DefaultVar")->second;
635 m_expansionMapShPtrMap[variable] = returnval;
640 "Using Default variable expansion definition for field: ") +
652 const std::string variable)
655 m_expansionMapShPtrMap.find(variable)->second;
657 auto iter = expansionMap->find(geom->GetGlobalID());
658 ASSERTL1(iter != expansionMap->end(),
659 "Could not find expansion " +
660 boost::lexical_cast<string>(geom->GetGlobalID()) +
661 " in expansion for variable " + variable);
668 void MeshGraph::SetExpansionInfo(
669 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef)
671 int i, j, k, cnt, id;
678 for (i = 0; i < fielddef.size(); ++i)
680 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
682 std::string field = fielddef[i]->m_fields[j];
683 if (m_expansionMapShPtrMap.count(field) == 0)
685 expansionMap = SetUpExpansionInfoMap();
686 m_expansionMapShPtrMap[field] = expansionMap;
690 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
692 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
700 for (i = 0; i < fielddef.size(); ++i)
703 std::vector<std::string> fields = fielddef[i]->m_fields;
704 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
705 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
706 bool pointDef = fielddef[i]->m_pointsDef;
707 bool numPointDef = fielddef[i]->m_numPointsDef;
710 std::vector<unsigned int> npoints = fielddef[i]->m_numPoints;
711 std::vector<LibUtilities::PointsType> points = fielddef[i]->m_points;
713 bool UniOrder = fielddef[i]->m_uniOrder;
715 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
719 id = fielddef[i]->m_elementIDs[j];
721 switch (fielddef[i]->m_shapeType)
725 if (m_segGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
731 cnt += fielddef[i]->m_numHomogeneousDir;
735 geom = m_segGeoms[fielddef[i]->m_elementIDs[j]];
740 if (numPointDef && pointDef)
746 else if (!numPointDef && pointDef)
752 else if (numPointDef && !pointDef)
764 cnt += fielddef[i]->m_numHomogeneousDir;
766 bkeyvec.push_back(bkey);
771 if (m_triGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
777 cnt += fielddef[i]->m_numHomogeneousDir;
781 geom = m_triGeoms[fielddef[i]->m_elementIDs[j]];
785 if (numPointDef && pointDef)
791 else if (!numPointDef && pointDef)
797 else if (numPointDef && !pointDef)
805 bkeyvec.push_back(bkey);
808 nmodes[cnt + 1], LibUtilities::eGaussRadauMAlpha1Beta0);
809 if (numPointDef && pointDef)
815 else if (!numPointDef && pointDef)
821 else if (numPointDef && !pointDef)
825 LibUtilities::eGaussRadauMAlpha1Beta0);
830 bkeyvec.push_back(bkey1);
835 cnt += fielddef[i]->m_numHomogeneousDir;
841 if (m_quadGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
847 cnt += fielddef[i]->m_numHomogeneousDir;
852 geom = m_quadGeoms[fielddef[i]->m_elementIDs[j]];
854 for (
int b = 0; b < 2; ++b)
860 if (numPointDef && pointDef)
863 npoints[cnt + b], points[b]);
866 else if (!numPointDef && pointDef)
869 nmodes[cnt + b] + 1, points[b]);
872 else if (numPointDef && !pointDef)
881 bkeyvec.push_back(bkey);
887 cnt += fielddef[i]->m_numHomogeneousDir;
894 k = fielddef[i]->m_elementIDs[j];
899 if (m_tetGeoms.count(k) == 0)
907 geom = m_tetGeoms[k];
914 if (numPointDef && pointDef)
920 else if (!numPointDef && pointDef)
926 else if (numPointDef && !pointDef)
937 bkeyvec.push_back(bkey);
942 LibUtilities::eGaussRadauMAlpha1Beta0);
944 if (numPointDef && pointDef)
947 npoints[cnt + 1], points[1]);
950 else if (!numPointDef && pointDef)
953 nmodes[cnt + 1] + 1, points[1]);
956 else if (numPointDef && !pointDef)
960 LibUtilities::eGaussRadauMAlpha1Beta0);
967 bkeyvec.push_back(bkey);
973 LibUtilities::eGaussRadauMAlpha2Beta0);
975 if (numPointDef && pointDef)
978 npoints[cnt + 2], points[2]);
981 else if (!numPointDef && pointDef)
984 nmodes[cnt + 2] + 1, points[2]);
987 else if (numPointDef && !pointDef)
991 LibUtilities::eGaussRadauMAlpha1Beta0);
998 bkeyvec.push_back(bkey);
1009 k = fielddef[i]->m_elementIDs[j];
1010 if (m_prismGeoms.count(k) == 0)
1018 geom = m_prismGeoms[k];
1020 for (
int b = 0; b < 2; ++b)
1023 nmodes[cnt + b] + 1,
1026 if (numPointDef && pointDef)
1029 npoints[cnt + b], points[b]);
1032 else if (!numPointDef && pointDef)
1035 nmodes[cnt + b] + 1, points[b]);
1038 else if (numPointDef && !pointDef)
1048 bkeyvec.push_back(bkey);
1054 LibUtilities::eGaussRadauMAlpha1Beta0);
1056 if (numPointDef && pointDef)
1059 npoints[cnt + 2], points[2]);
1062 else if (!numPointDef && pointDef)
1065 nmodes[cnt + 2] + 1, points[2]);
1068 else if (numPointDef && !pointDef)
1078 bkeyvec.push_back(bkey);
1089 k = fielddef[i]->m_elementIDs[j];
1090 ASSERTL0(m_pyrGeoms.find(k) != m_pyrGeoms.end(),
1091 "Failed to find geometry with same global id");
1092 geom = m_pyrGeoms[k];
1094 for (
int b = 0; b < 2; ++b)
1097 nmodes[cnt + b] + 1,
1100 if (numPointDef && pointDef)
1103 npoints[cnt + b], points[b]);
1106 else if (!numPointDef && pointDef)
1109 nmodes[cnt + b] + 1, points[b]);
1112 else if (numPointDef && !pointDef)
1122 bkeyvec.push_back(bkey);
1128 LibUtilities::eGaussRadauMAlpha2Beta0);
1130 if (numPointDef && pointDef)
1133 npoints[cnt + 2], points[2]);
1136 else if (!numPointDef && pointDef)
1139 nmodes[cnt + 2] + 1, points[2]);
1142 else if (numPointDef && !pointDef)
1152 bkeyvec.push_back(bkey);
1163 k = fielddef[i]->m_elementIDs[j];
1164 if (m_hexGeoms.count(k) == 0)
1173 geom = m_hexGeoms[k];
1175 for (
int b = 0; b < 3; ++b)
1181 if (numPointDef && pointDef)
1184 npoints[cnt + b], points[b]);
1187 else if (!numPointDef && pointDef)
1190 nmodes[cnt + b] + 1, points[b]);
1193 else if (numPointDef && !pointDef)
1203 bkeyvec.push_back(bkey);
1213 ASSERTL0(
false,
"Need to set up for pyramid and prism 3D "
1218 for (k = 0; k < fields.size(); ++k)
1220 expansionMap = m_expansionMapShPtrMap.find(fields[k])->second;
1221 if ((*expansionMap).find(
id) != (*expansionMap).end())
1223 (*expansionMap)[id]->m_geomShPtr = geom;
1224 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1234 void MeshGraph::SetExpansionInfo(
1235 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef,
1236 std::vector<std::vector<LibUtilities::PointsType>> &pointstype)
1238 int i, j, k, cnt, id;
1245 for (i = 0; i < fielddef.size(); ++i)
1247 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
1249 std::string field = fielddef[i]->m_fields[j];
1250 if (m_expansionMapShPtrMap.count(field) == 0)
1252 expansionMap = SetUpExpansionInfoMap();
1253 m_expansionMapShPtrMap[field] = expansionMap;
1257 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
1259 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
1267 for (i = 0; i < fielddef.size(); ++i)
1270 std::vector<std::string> fields = fielddef[i]->m_fields;
1271 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
1272 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
1273 bool UniOrder = fielddef[i]->m_uniOrder;
1275 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
1278 id = fielddef[i]->m_elementIDs[j];
1280 switch (fielddef[i]->m_shapeType)
1284 k = fielddef[i]->m_elementIDs[j];
1285 ASSERTL0(m_segGeoms.find(k) != m_segGeoms.end(),
1286 "Failed to find geometry with same global id.");
1287 geom = m_segGeoms[k];
1295 cnt += fielddef[i]->m_numHomogeneousDir;
1297 bkeyvec.push_back(bkey);
1302 k = fielddef[i]->m_elementIDs[j];
1303 ASSERTL0(m_triGeoms.find(k) != m_triGeoms.end(),
1304 "Failed to find geometry with same global id.");
1305 geom = m_triGeoms[k];
1306 for (
int b = 0; b < 2; ++b)
1312 bkeyvec.push_back(bkey);
1318 cnt += fielddef[i]->m_numHomogeneousDir;
1324 k = fielddef[i]->m_elementIDs[j];
1325 ASSERTL0(m_quadGeoms.find(k) != m_quadGeoms.end(),
1326 "Failed to find geometry with same global id");
1327 geom = m_quadGeoms[k];
1329 for (
int b = 0; b < 2; ++b)
1335 bkeyvec.push_back(bkey);
1341 cnt += fielddef[i]->m_numHomogeneousDir;
1347 k = fielddef[i]->m_elementIDs[j];
1348 ASSERTL0(m_tetGeoms.find(k) != m_tetGeoms.end(),
1349 "Failed to find geometry with same global id");
1350 geom = m_tetGeoms[k];
1352 for (
int b = 0; b < 3; ++b)
1358 bkeyvec.push_back(bkey);
1369 k = fielddef[i]->m_elementIDs[j];
1370 ASSERTL0(m_pyrGeoms.find(k) != m_pyrGeoms.end(),
1371 "Failed to find geometry with same global id");
1372 geom = m_pyrGeoms[k];
1374 for (
int b = 0; b < 3; ++b)
1380 bkeyvec.push_back(bkey);
1391 k = fielddef[i]->m_elementIDs[j];
1392 ASSERTL0(m_prismGeoms.find(k) != m_prismGeoms.end(),
1393 "Failed to find geometry with same global id");
1394 geom = m_prismGeoms[k];
1396 for (
int b = 0; b < 3; ++b)
1402 bkeyvec.push_back(bkey);
1413 k = fielddef[i]->m_elementIDs[j];
1414 ASSERTL0(m_hexGeoms.find(k) != m_hexGeoms.end(),
1415 "Failed to find geometry with same global id");
1416 geom = m_hexGeoms[k];
1418 for (
int b = 0; b < 3; ++b)
1424 bkeyvec.push_back(bkey);
1434 ASSERTL0(
false,
"Need to set up for pyramid and prism 3D "
1439 for (k = 0; k < fields.size(); ++k)
1441 expansionMap = m_expansionMapShPtrMap.find(fields[k])->second;
1442 if ((*expansionMap).find(
id) != (*expansionMap).end())
1444 (*expansionMap)[id]->m_geomShPtr = geom;
1445 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1457 void MeshGraph::SetExpansionInfoToEvenlySpacedPoints(
int npoints)
1460 for (
auto it = m_expansionMapShPtrMap.begin();
1461 it != m_expansionMapShPtrMap.end(); ++it)
1463 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1466 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1469 expIt->second->m_basisKeyVector[i];
1481 npts = max(npts, 2);
1487 expIt->second->m_basisKeyVector[i] = bkeynew;
1499 void MeshGraph::SetExpansionInfoToNumModes(
int nmodes)
1502 for (
auto it = m_expansionMapShPtrMap.begin();
1503 it != m_expansionMapShPtrMap.end(); ++it)
1505 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1508 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1511 expIt->second->m_basisKeyVector[i];
1520 expIt->second->m_basisKeyVector[i] = bkeynew;
1532 void MeshGraph::SetExpansionInfoToPointOrder(
int npts)
1535 for (
auto it = m_expansionMapShPtrMap.begin();
1536 it != m_expansionMapShPtrMap.end(); ++it)
1538 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1541 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1544 expIt->second->m_basisKeyVector[i];
1551 expIt->second->m_basisKeyVector[i] = bkeynew;
1573 m_expansionMapShPtrMap.find(var)->second;
1574 ResetExpansionInfoToBasisKey(expansionMap, shape, keys);
1577 void MeshGraph::ResetExpansionInfoToBasisKey(
1581 for (
auto elemIter = expansionMap->begin(); elemIter != expansionMap->end();
1584 if ((elemIter->second)->m_geomShPtr->GetShapeType() == shape)
1586 (elemIter->second)->m_basisKeyVector = keys;
1630 nummodes + quadoffset,
1634 returnval.push_back(bkey);
1640 nummodes + quadoffset,
1644 returnval.push_back(bkey);
1645 returnval.push_back(bkey);
1651 nummodes + quadoffset,
1655 returnval.push_back(bkey);
1656 returnval.push_back(bkey);
1657 returnval.push_back(bkey);
1663 nummodes + quadoffset,
1667 returnval.push_back(bkey);
1670 nummodes + quadoffset - 1,
1671 LibUtilities::eGaussRadauMAlpha1Beta0);
1675 returnval.push_back(bkey1);
1681 nummodes + quadoffset,
1685 returnval.push_back(bkey);
1688 nummodes + quadoffset - 1,
1689 LibUtilities::eGaussRadauMAlpha1Beta0);
1692 returnval.push_back(bkey1);
1697 nummodes + quadoffset - 1,
1698 LibUtilities::eGaussRadauMAlpha1Beta0);
1701 returnval.push_back(bkey2);
1706 nummodes + quadoffset - 1,
1707 LibUtilities::eGaussRadauMAlpha2Beta0);
1710 returnval.push_back(bkey2);
1717 nummodes + quadoffset,
1721 returnval.push_back(bkey);
1722 returnval.push_back(bkey);
1725 nummodes + quadoffset,
1726 LibUtilities::eGaussRadauMAlpha2Beta0);
1729 returnval.push_back(bkey1);
1735 nummodes + quadoffset,
1739 returnval.push_back(bkey);
1740 returnval.push_back(bkey);
1743 nummodes + quadoffset - 1,
1744 LibUtilities::eGaussRadauMAlpha1Beta0);
1747 returnval.push_back(bkey1);
1753 "Expansion not defined in switch for this shape");
1770 returnval.push_back(bkey);
1779 returnval.push_back(bkey);
1780 returnval.push_back(bkey);
1790 returnval.push_back(bkey);
1793 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1796 returnval.push_back(bkey1);
1806 returnval.push_back(bkey);
1807 returnval.push_back(bkey);
1808 returnval.push_back(bkey);
1814 "Expansion not defined in switch for this shape");
1832 returnval.push_back(bkey);
1842 returnval.push_back(bkey);
1843 returnval.push_back(bkey);
1853 returnval.push_back(bkey);
1854 returnval.push_back(bkey);
1855 returnval.push_back(bkey);
1861 "Expansion not defined in switch for this shape");
1879 returnval.push_back(bkey);
1889 returnval.push_back(bkey);
1892 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1896 returnval.push_back(bkey1);
1906 returnval.push_back(bkey);
1907 returnval.push_back(bkey);
1917 returnval.push_back(bkey);
1920 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1924 returnval.push_back(bkey1);
1927 nummodes, LibUtilities::eGaussRadauMAlpha2Beta0);
1935 "Expansion not defined in switch for this shape");
1953 returnval.push_back(bkey);
1963 returnval.push_back(bkey);
1964 returnval.push_back(bkey);
1974 returnval.push_back(bkey);
1975 returnval.push_back(bkey);
1976 returnval.push_back(bkey);
1982 "Expansion not defined in switch for this shape");
1999 returnval.push_back(bkey);
2008 returnval.push_back(bkey);
2009 returnval.push_back(bkey);
2018 returnval.push_back(bkey);
2019 returnval.push_back(bkey);
2020 returnval.push_back(bkey);
2026 "Expansion not defined in switch for this shape");
2043 returnval.push_back(bkey);
2052 returnval.push_back(bkey);
2053 returnval.push_back(bkey);
2062 returnval.push_back(bkey);
2063 returnval.push_back(bkey);
2064 returnval.push_back(bkey);
2070 "Expansion not defined in switch for this shape");
2087 returnval.push_back(bkey);
2096 returnval.push_back(bkey);
2097 returnval.push_back(bkey);
2106 returnval.push_back(bkey);
2107 returnval.push_back(bkey);
2108 returnval.push_back(bkey);
2114 "Expansion not defined in switch for this shape");
2131 returnval.push_back(bkey);
2140 returnval.push_back(bkey);
2141 returnval.push_back(bkey);
2150 returnval.push_back(bkey);
2151 returnval.push_back(bkey);
2152 returnval.push_back(bkey);
2158 "Expansion not defined in switch for this shape");
2175 returnval.push_back(bkey);
2184 returnval.push_back(bkey);
2185 returnval.push_back(bkey);
2194 returnval.push_back(bkey);
2195 returnval.push_back(bkey);
2196 returnval.push_back(bkey);
2202 "Expansion not defined in switch for this shape");
2219 returnval.push_back(bkey);
2225 returnval.push_back(bkey1);
2231 "Expansion not defined in switch for this shape");
2248 returnval.push_back(bkey1);
2254 returnval.push_back(bkey);
2260 "Expansion not defined in switch for this shape");
2277 returnval.push_back(bkey);
2283 returnval.push_back(bkey1);
2289 "Expansion not defined in switch for this shape");
2298 ASSERTL0(
false,
"Expansion type not defined");
2311 ExpansionType type_z,
const int nummodes_x,
const int nummodes_y,
2312 const int nummodes_z)
2322 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2328 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2342 returnval.push_back(bkey1);
2352 returnval.push_back(bkey1);
2362 returnval.push_back(bkey1);
2372 returnval.push_back(bkey1);
2382 returnval.push_back(bkey1);
2388 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2389 "or Chebyshev type only");
2402 returnval.push_back(bkey2);
2412 returnval.push_back(bkey2);
2422 returnval.push_back(bkey2);
2432 returnval.push_back(bkey2);
2442 returnval.push_back(bkey2);
2448 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2449 "or Chebyshev type only");
2462 returnval.push_back(bkey3);
2472 returnval.push_back(bkey3);
2482 returnval.push_back(bkey3);
2492 returnval.push_back(bkey3);
2502 returnval.push_back(bkey3);
2508 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2509 "or Chebyshev type only");
2518 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2524 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2529 ASSERTL0(
false,
"Expansion not defined in switch for this shape");
2548 for (
auto &d : m_domain)
2550 for (
auto &compIter : d.second)
2553 for (
auto &x : compIter.second->m_geomVec)
2555 if (x->GetGeomFactors()->GetGtype() !=
2561 int id = x->GetGlobalID();
2562 (*returnval)[id] = expansionElementShPtr;
2566 for (
auto &x : compIter.second->m_geomVec)
2568 if (x->GetGeomFactors()->GetGtype() ==
2574 int id = x->GetGlobalID();
2575 (*returnval)[id] = expansionElementShPtr;
2589 if (comp->m_geomVec.size() == 0)
2596 map<LibUtilities::ShapeType, pair<string, string>> compMap;
2609 int shapeDim = firstGeom->GetShapeDim();
2610 string tag = (shapeDim < m_meshDimension)
2611 ? compMap[firstGeom->GetShapeType()].second
2612 : compMap[firstGeom->GetShapeType()].first;
2614 std::vector<unsigned int> idxList;
2615 std::transform(comp->m_geomVec.begin(), comp->m_geomVec.end(),
2616 std::back_inserter(idxList),
2619 s <<
" " << tag <<
"[" << ParseUtils::GenerateSeqString(idxList) <<
"] ";
2623 void MeshGraph::ReadExpansionInfo()
2626 TiXmlElement *expansionTypes = m_session->GetElement(
"NEKTAR/EXPANSIONS");
2627 ASSERTL0(expansionTypes,
"Unable to find EXPANSIONS tag in file.");
2632 TiXmlElement *expansion = expansionTypes->FirstChildElement();
2633 ASSERTL0(expansion,
"Unable to find entries in EXPANSIONS tag in "
2635 std::string expType = expansion->Value();
2636 std::vector<std::string> vars = m_session->GetVariables();
2641 m_expansionMapShPtrMap.clear();
2657 map<int, bool> domainCompList;
2658 for (
auto &d : m_domain)
2660 for (
auto &c : d.second)
2662 domainCompList[c.first] =
false;
2665 map<std::string, map<int, bool>> fieldDomainCompList;
2670 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
2671 ASSERTL0(compositeStr.length() > 3,
2672 "COMPOSITE must be specified in expansion definition");
2673 int beg = compositeStr.find_first_of(
"[");
2674 int end = compositeStr.find_first_of(
"]");
2675 std::string compositeListStr =
2676 compositeStr.substr(beg + 1, end - beg - 1);
2678 map<int, CompositeSharedPtr> compositeVector;
2679 GetCompositeList(compositeListStr, compositeVector);
2682 const char *fStr = expansion->Attribute(
"FIELDS");
2683 std::vector<std::string> fieldStrings;
2687 std::string fieldStr = fStr;
2688 bool valid = ParseUtils::GenerateVector(fieldStr.c_str(),
2690 ASSERTL0(valid,
"Unable to correctly parse the field "
2691 "string in ExpansionTypes.");
2694 if (m_expansionMapShPtrMap.count(fieldStrings[0]))
2697 m_expansionMapShPtrMap.find(fieldStrings[0])
2702 expansionMap = SetUpExpansionInfoMap();
2707 for (i = 0; i < fieldStrings.size(); ++i)
2709 if (vars.size() && std::count(vars.begin(), vars.end(),
2710 fieldStrings[i]) == 0)
2712 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
2713 "' defined in EXPANSIONS is not"
2714 " defined in VARIABLES.");
2717 if (m_expansionMapShPtrMap.count(fieldStrings[i]) == 0)
2719 m_expansionMapShPtrMap[fieldStrings[i]] =
2724 fieldDomainCompList[fieldStrings[i]] =
2726 for (
auto c = compositeVector.begin();
2727 c != compositeVector.end(); ++c)
2729 fieldDomainCompList.find(fieldStrings[i])
2730 ->second.find(c->first)
2736 for (
auto c = compositeVector.begin();
2737 c != compositeVector.end(); ++c)
2739 if (fieldDomainCompList.find(fieldStrings[i])
2740 ->second.find(c->first)
2743 fieldDomainCompList.find(fieldStrings[i])
2744 ->second.find(c->first)
2750 "Expansion vector for "
2753 "' is already setup for C[" +
2754 to_string(c->first) +
"].");
2758 m_expansionMapShPtrMap.find(fieldStrings[i])
2765 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
2767 expansionMap = SetUpExpansionInfoMap();
2768 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
2770 fieldDomainCompList[
"DefaultVar"] = domainCompList;
2771 for (
auto c = compositeVector.begin();
2772 c != compositeVector.end(); ++c)
2774 fieldDomainCompList.find(
"DefaultVar")
2775 ->second.find(c->first)
2781 for (
auto c = compositeVector.begin();
2782 c != compositeVector.end(); ++c)
2784 if (fieldDomainCompList.find(
"DefaultVar")
2785 ->second.find(c->first)
2788 fieldDomainCompList.find(
"DefaultVar")
2789 ->second.find(c->first)
2794 ASSERTL0(
false,
"Default expansion already "
2796 to_string(c->first) +
"].");
2800 m_expansionMapShPtrMap.find(
"DefaultVar")->second;
2805 bool useExpansionType =
false;
2810 const char *tStr = expansion->Attribute(
"TYPE");
2814 std::string typeStr = tStr;
2816 const std::string *endStr =
2818 const std::string *expStr =
2821 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
2836 const char *nStr = expansion->Attribute(
"NUMMODES");
2837 ASSERTL0(nStr,
"NUMMODES was not defined in EXPANSION "
2838 "section of input");
2839 std::string nummodesStr = nStr;
2846 m_session->GetInterpreter(), nummodesStr);
2847 num_modes = (int)nummodesEqn.
Evaluate();
2851 num_modes = boost::lexical_cast<int>(nummodesStr);
2854 useExpansionType =
true;
2859 const char *bTypeStr = expansion->Attribute(
"BASISTYPE");
2860 ASSERTL0(bTypeStr,
"TYPE or BASISTYPE was not defined in "
2861 "EXPANSION section of input");
2862 std::string basisTypeStr = bTypeStr;
2865 std::vector<std::string> basisStrings;
2866 std::vector<LibUtilities::BasisType> basis;
2867 bool valid = ParseUtils::GenerateVector(
2868 basisTypeStr.c_str(), basisStrings);
2870 "Unable to correctly parse the basis types.");
2871 for (vector<std::string>::size_type i = 0;
2872 i < basisStrings.size(); i++)
2875 for (
unsigned int j = 0;
2889 "Unable to correctly parse the basis type: ")
2890 .append(basisStrings[i])
2893 const char *nModesStr = expansion->Attribute(
"NUMMODES");
2894 ASSERTL0(nModesStr,
"NUMMODES was not defined in EXPANSION "
2895 "section of input");
2897 std::string numModesStr = nModesStr;
2898 std::vector<unsigned int> numModes;
2899 valid = ParseUtils::GenerateVector(numModesStr.c_str(),
2902 "Unable to correctly parse the number of modes.");
2903 ASSERTL0(numModes.size() == basis.size(),
2904 "information for num modes does not match the "
2907 const char *pTypeStr = expansion->Attribute(
"POINTSTYPE");
2908 ASSERTL0(pTypeStr,
"POINTSTYPE was not defined in "
2909 "EXPANSION section of input");
2910 std::string pointsTypeStr = pTypeStr;
2912 std::vector<std::string> pointsStrings;
2913 std::vector<LibUtilities::PointsType> points;
2914 valid = ParseUtils::GenerateVector(pointsTypeStr.c_str(),
2917 "Unable to correctly parse the points types.");
2918 for (vector<std::string>::size_type i = 0;
2919 i < pointsStrings.size(); i++)
2922 for (
unsigned int j = 0;
2936 "Unable to correctly parse the points type: ")
2937 .append(pointsStrings[i])
2941 const char *nPointsStr = expansion->Attribute(
"NUMPOINTS");
2942 ASSERTL0(nPointsStr,
"NUMPOINTS was not defined in "
2943 "EXPANSION section of input");
2944 std::string numPointsStr = nPointsStr;
2945 std::vector<unsigned int> numPoints;
2946 valid = ParseUtils::GenerateVector(numPointsStr.c_str(),
2949 "Unable to correctly parse the number of points.");
2950 ASSERTL0(numPoints.size() == numPoints.size(),
2951 "information for num points does not match the "
2954 for (
int i = 0; i < basis.size(); ++i)
2960 basis[i], numModes[i], pkey));
2968 for (
auto compVecIter = compositeVector.begin();
2969 compVecIter != compositeVector.end(); ++compVecIter)
2971 for (
auto geomVecIter =
2972 compVecIter->second->m_geomVec.begin();
2973 geomVecIter != compVecIter->second->m_geomVec.end();
2977 expansionMap->find((*geomVecIter)->GetGlobalID());
2979 x != expansionMap->end(),
2981 std::to_string((*geomVecIter)->GetGlobalID()) +
2983 if (useExpansionType)
2985 (x->second)->m_basisKeyVector =
2986 MeshGraph::DefineBasisKeyFromExpansionType(
2987 *geomVecIter, expansion_type, num_modes);
2991 ASSERTL0((*geomVecIter)->GetShapeDim() ==
2993 " There is an incompatible expansion "
2994 "dimension with geometry dimension");
2995 (x->second)->m_basisKeyVector = basiskeyvec;
3000 expansion = expansion->NextSiblingElement(
"E");
3006 for (
auto f = fieldDomainCompList.begin();
3007 f != fieldDomainCompList.end(); ++f)
3009 if (f->first !=
"DefaultVar")
3011 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3013 if (c->second ==
false &&
3014 fieldDomainCompList.find(
"DefaultVar")
3015 ->second.find(c->first)
3020 for (
auto geomVecIter =
3021 m_meshComposites.find(c->first)
3022 ->second->m_geomVec.begin();
3023 geomVecIter != m_meshComposites.find(c->first)
3024 ->second->m_geomVec.end();
3028 m_expansionMapShPtrMap.find(
"DefaultVar")
3030 (*geomVecIter)->GetGlobalID());
3033 m_expansionMapShPtrMap.find(f->first)
3035 (*geomVecIter)->GetGlobalID());
3037 (xField->second)->m_basisKeyVector =
3038 (xDefaultVar->second)->m_basisKeyVector;
3042 ErrorUtil::ewarning,
3044 "Using Default expansion definition for "
3049 to_string(c->first) +
"].")
3052 ASSERTL0(c->second,
"There is no expansion defined for "
3054 f->first +
"' in C[" +
3055 to_string(c->first) +
"].");
3061 for (i = 0; i < vars.size(); ++i)
3063 if (m_expansionMapShPtrMap.count(vars[i]) == 0)
3065 if (m_expansionMapShPtrMap.count(
"DefaultVar"))
3068 m_expansionMapShPtrMap.find(
"DefaultVar")->second;
3069 m_expansionMapShPtrMap[vars[i]] = expansionMap;
3072 ErrorUtil::ewarning,
3074 "Using Default expansion definition for field "
3081 ASSERTL0(
false,
"Variable '" + vars[i] +
3083 " in FIELDS attribute of EXPANSIONS"
3089 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3097 m_expansionMapShPtrMap.begin()->second;
3098 m_expansionMapShPtrMap[
"DefaultVar"] = firstEntryAddr;
3101 else if (expType ==
"H")
3104 m_expansionMapShPtrMap.clear();
3109 map<int, bool> domainCompList;
3110 for (
auto &d : m_domain)
3112 for (
auto &c : d.second)
3114 domainCompList[c.first] =
false;
3117 map<std::string, map<int, bool>> fieldDomainCompList;
3122 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
3123 ASSERTL0(compositeStr.length() > 3,
3124 "COMPOSITE must be specified in expansion definition");
3125 int beg = compositeStr.find_first_of(
"[");
3126 int end = compositeStr.find_first_of(
"]");
3127 std::string compositeListStr =
3128 compositeStr.substr(beg + 1, end - beg - 1);
3130 map<int, CompositeSharedPtr> compositeVector;
3131 GetCompositeList(compositeListStr, compositeVector);
3134 const char *fStr = expansion->Attribute(
"FIELDS");
3135 std::vector<std::string> fieldStrings;
3139 std::string fieldStr = fStr;
3140 bool valid = ParseUtils::GenerateVector(fieldStr.c_str(),
3142 ASSERTL0(valid,
"Unable to correctly parse the field "
3143 "string in ExpansionTypes.");
3146 if (m_expansionMapShPtrMap.count(fieldStrings[0]))
3149 m_expansionMapShPtrMap.find(fieldStrings[0])
3154 expansionMap = SetUpExpansionInfoMap();
3159 for (i = 0; i < fieldStrings.size(); ++i)
3161 if (vars.size() && std::count(vars.begin(), vars.end(),
3162 fieldStrings[i]) == 0)
3164 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
3165 "' defined in EXPANSIONS is not"
3166 " defined in VARIABLES.");
3169 if (m_expansionMapShPtrMap.count(fieldStrings[i]) == 0)
3171 m_expansionMapShPtrMap[fieldStrings[i]] =
3176 fieldDomainCompList[fieldStrings[i]] =
3178 for (
auto c = compositeVector.begin();
3179 c != compositeVector.end(); ++c)
3181 fieldDomainCompList.find(fieldStrings[i])
3182 ->second.find(c->first)
3188 for (
auto c = compositeVector.begin();
3189 c != compositeVector.end(); ++c)
3191 if (fieldDomainCompList.find(fieldStrings[i])
3192 ->second.find(c->first)
3195 fieldDomainCompList.find(fieldStrings[i])
3196 ->second.find(c->first)
3202 "Expansion vector for "
3205 "' is already setup for C[" +
3206 to_string(c->first) +
"].");
3210 m_expansionMapShPtrMap.find(fieldStrings[i])
3217 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3219 expansionMap = SetUpExpansionInfoMap();
3220 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
3222 fieldDomainCompList[
"DefaultVar"] = domainCompList;
3223 for (
auto c = compositeVector.begin();
3224 c != compositeVector.end(); ++c)
3226 fieldDomainCompList.find(
"DefaultVar")
3227 ->second.find(c->first)
3233 for (
auto c = compositeVector.begin();
3234 c != compositeVector.end(); ++c)
3236 if (fieldDomainCompList.find(
"DefaultVar")
3237 ->second.find(c->first)
3240 fieldDomainCompList.find(
"DefaultVar")
3241 ->second.find(c->first)
3246 ASSERTL0(
false,
"Default expansion already "
3248 to_string(c->first) +
"].");
3252 m_expansionMapShPtrMap.find(
"DefaultVar")->second;
3260 int num_modes_x = 0;
3261 int num_modes_y = 0;
3262 int num_modes_z = 0;
3266 const char *tStr_x = expansion->Attribute(
"TYPE-X");
3270 std::string typeStr = tStr_x;
3272 const std::string *endStr =
3274 const std::string *expStr =
3277 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3280 const char *nStr = expansion->Attribute(
"NUMMODES-X");
3281 ASSERTL0(nStr,
"NUMMODES-X was not defined in EXPANSION "
3282 "section of input");
3283 std::string nummodesStr = nStr;
3291 m_session->GetInterpreter(), nummodesStr);
3292 num_modes_x = (int)nummodesEqn.
Evaluate();
3296 num_modes_x = boost::lexical_cast<int>(nummodesStr);
3300 const char *tStr_y = expansion->Attribute(
"TYPE-Y");
3304 std::string typeStr = tStr_y;
3306 const std::string *endStr =
3308 const std::string *expStr =
3311 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3314 const char *nStr = expansion->Attribute(
"NUMMODES-Y");
3315 ASSERTL0(nStr,
"NUMMODES-Y was not defined in EXPANSION "
3316 "section of input");
3317 std::string nummodesStr = nStr;
3324 m_session->GetInterpreter(), nummodesStr);
3325 num_modes_y = (int)nummodesEqn.
Evaluate();
3329 num_modes_y = boost::lexical_cast<int>(nummodesStr);
3333 const char *tStr_z = expansion->Attribute(
"TYPE-Z");
3337 std::string typeStr = tStr_z;
3339 const std::string *endStr =
3341 const std::string *expStr =
3344 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3347 const char *nStr = expansion->Attribute(
"NUMMODES-Z");
3348 ASSERTL0(nStr,
"NUMMODES-Z was not defined in EXPANSION "
3349 "section of input");
3350 std::string nummodesStr = nStr;
3357 m_session->GetInterpreter(), nummodesStr);
3358 num_modes_z = (int)nummodesEqn.
Evaluate();
3362 num_modes_z = boost::lexical_cast<int>(nummodesStr);
3366 for (
auto compVecIter = compositeVector.begin();
3367 compVecIter != compositeVector.end(); ++compVecIter)
3369 for (
auto geomVecIter =
3370 compVecIter->second->m_geomVec.begin();
3371 geomVecIter != compVecIter->second->m_geomVec.end();
3374 for (
auto expVecIter = expansionMap->begin();
3375 expVecIter != expansionMap->end(); ++expVecIter)
3378 (expVecIter->second)->m_basisKeyVector =
3379 DefineBasisKeyFromExpansionTypeHomo(
3380 *geomVecIter, expansion_type_x,
3381 expansion_type_y, expansion_type_z,
3382 num_modes_x, num_modes_y, num_modes_z);
3387 expansion = expansion->NextSiblingElement(
"H");
3393 for (
auto f = fieldDomainCompList.begin();
3394 f != fieldDomainCompList.end(); ++f)
3396 if (f->first !=
"DefaultVar")
3398 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3400 if (c->second ==
false &&
3401 fieldDomainCompList.find(
"DefaultVar")
3402 ->second.find(c->first)
3407 for (
auto geomVecIter =
3408 m_meshComposites.find(c->first)
3409 ->second->m_geomVec.begin();
3410 geomVecIter != m_meshComposites.find(c->first)
3411 ->second->m_geomVec.end();
3415 m_expansionMapShPtrMap.find(
"DefaultVar")
3417 (*geomVecIter)->GetGlobalID());
3420 m_expansionMapShPtrMap.find(f->first)
3422 (*geomVecIter)->GetGlobalID());
3424 (xField->second)->m_basisKeyVector =
3425 (xDefaultVar->second)->m_basisKeyVector;
3429 ErrorUtil::ewarning,
3431 "Using Default expansion definition for "
3436 to_string(c->first) +
"].")
3439 ASSERTL0(c->second,
"There is no expansion defined for "
3441 f->first +
"' in C[" +
3442 to_string(c->first) +
"].");
3448 for (i = 0; i < vars.size(); ++i)
3450 if (m_expansionMapShPtrMap.count(vars[i]) == 0)
3452 if (m_expansionMapShPtrMap.count(
"DefaultVar"))
3455 m_expansionMapShPtrMap.find(
"DefaultVar")->second;
3456 m_expansionMapShPtrMap[vars[i]] = expansionMap;
3459 ErrorUtil::ewarning,
3461 "Using Default expansion definition for field "
3468 ASSERTL0(
false,
"Variable '" + vars[i] +
3470 " in FIELDS attribute of EXPANSIONS"
3476 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3484 m_expansionMapShPtrMap.begin()->second;
3485 m_expansionMapShPtrMap[
"DefaultVar"] = firstEntryAddr;
3491 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3495 std::shared_ptr<LibUtilities::FieldIOXml> f =
3496 make_shared<LibUtilities::FieldIOXml>(m_session->GetComm(),
3499 LibUtilities::XmlDataSource::create(m_session->GetDocument()),
3501 cout <<
" Number of elements: " << fielddefs.size() << endl;
3502 SetExpansionInfo(fielddefs);
3504 else if (expType ==
"F")
3506 ASSERTL0(expansion->Attribute(
"FILE"),
3507 "Attribute FILE expected for type F expansion");
3508 std::string filenameStr = expansion->Attribute(
"FILE");
3510 "A filename must be specified for the FILE "
3511 "attribute of expansion");
3513 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3515 LibUtilities::FieldIO::CreateForFile(m_session, filenameStr);
3516 f->Import(filenameStr, fielddefs);
3517 SetExpansionInfo(fielddefs);
3521 ASSERTL0(
false,
"Expansion type not defined");
3538 for (
auto &d : m_domain)
3540 for (
auto &compIter : d.second)
3542 for (
auto &geomIter : compIter.second->m_geomVec)
3544 triGeomShPtr = std::dynamic_pointer_cast<TriGeom>(geomIter);
3545 quadGeomShPtr = std::dynamic_pointer_cast<QuadGeom>(geomIter);
3547 if (triGeomShPtr || quadGeomShPtr)
3551 for (
int i = 0; i < triGeomShPtr->GetNumEdges(); i++)
3553 if (triGeomShPtr->GetEdge(i)->GetGlobalID() ==
3554 edge->GetGlobalID())
3556 ret->push_back(make_pair(triGeomShPtr, i));
3561 else if (quadGeomShPtr)
3563 for (
int i = 0; i < quadGeomShPtr->GetNumEdges(); i++)
3565 if (quadGeomShPtr->GetEdge(i)->GetGlobalID() ==
3566 edge->GetGlobalID())
3568 ret->push_back(make_pair(quadGeomShPtr, i));
3582 const std::string variable)
3591 int edge_id = elmts->at(0).second;
3594 edge_id = (edge_id) ? 1 : 0;
3598 edge_id = edge_id % 2;
3600 int nummodes = expansion->m_basisKeyVector[edge_id].GetNumModes();
3601 int numpoints = expansion->m_basisKeyVector[edge_id].GetNumPoints();
3605 switch (expansion->m_basisKeyVector[edge_id].GetBasisType())
3609 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3616 expansion->m_basisKeyVector[0].GetBasisType(),
3621 ASSERTL0(
false,
"Unexpected points distribution");
3629 expansion->m_basisKeyVector[0].GetBasisType(),
3638 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3640 case LibUtilities::eGaussRadauMAlpha1Beta0:
3649 ASSERTL0(
false,
"Unexpected points distribution");
3657 expansion->m_basisKeyVector[0].GetBasisType(),
3665 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3668 case LibUtilities::eGaussRadauMAlpha1Beta0:
3673 expansion->m_basisKeyVector[0].GetBasisType(),
3682 expansion->m_basisKeyVector[0].GetBasisType(),
3687 ASSERTL0(
false,
"Unexpected points distribution");
3695 expansion->m_basisKeyVector[0].GetBasisType(),
3703 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3710 expansion->m_basisKeyVector[0].GetBasisType(),
3715 ASSERTL0(
false,
"Unexpected points distribution");
3723 expansion->m_basisKeyVector[0].GetBasisType(),
3730 ASSERTL0(
false,
"Unexpected basis distribution");
3737 expansion->m_basisKeyVector[0].GetBasisType(), nummodes,
3745 numpoints, expansion->m_basisKeyVector[edge_id].GetPointsType());
3747 expansion->m_basisKeyVector[edge_id].GetBasisType(), nummodes,
3751 ASSERTL0(
false,
"Unable to determine edge points type.");
3759 const std::string variable)
3765 "No elements for the given face."
3766 " Check all elements belong to the domain composite.");
3775 ASSERTL0(expansion,
"Could not find expansion connected to face " +
3776 boost::lexical_cast<string>(face->GetGlobalID()));
3779 std::dynamic_pointer_cast<SpatialDomains::Geometry3D>(
3780 expansion->m_geomShPtr);
3784 int dir = geom3d->GetDir(elements->at(0).second, facedir);
3786 if (face->GetNumVerts() == 3)
3789 facedir, expansion->m_basisKeyVector[dir].GetBasisType(),
3790 expansion->m_basisKeyVector[dir].GetNumPoints(),
3791 expansion->m_basisKeyVector[dir].GetNumModes());
3798 geom3d->GetForient(elements->at(0).second);
3802 dir = (dir == 0) ? 1 : 0;
3806 facedir, expansion->m_basisKeyVector[dir].GetBasisType(),
3807 expansion->m_basisKeyVector[dir].GetNumPoints(),
3808 expansion->m_basisKeyVector[dir].GetNumModes());
3817 auto it = m_faceToElMap.find(face->GetGlobalID());
3819 ASSERTL0(it != m_faceToElMap.end(),
"Unable to find corresponding face!");
3836 for (
int i = 0; i < kNfaces; ++i)
3838 int faceId = element->GetFace(i)->GetGlobalID();
3841 auto it = m_faceToElMap.find(faceId);
3843 if (it == m_faceToElMap.end())
3847 tmp->push_back(make_pair(element, i));
3848 m_faceToElMap[faceId] = tmp;
3852 it->second->push_back(make_pair(element, i));
3864 std::map<int, MeshEntity> MeshGraph::CreateMeshEntities()
3866 std::map<int, MeshEntity> elements;
3867 switch (m_meshDimension)
3871 for (
auto &i : m_segGeoms)
3875 e.
list.push_back(i.second->GetVertex(0)->GetGlobalID());
3876 e.
list.push_back(i.second->GetVertex(1)->GetGlobalID());
3884 for (
auto &i : m_triGeoms)
3888 e.
list.push_back(i.second->GetEdge(0)->GetGlobalID());
3889 e.
list.push_back(i.second->GetEdge(1)->GetGlobalID());
3890 e.
list.push_back(i.second->GetEdge(2)->GetGlobalID());
3894 for (
auto &i : m_quadGeoms)
3898 e.
list.push_back(i.second->GetEdge(0)->GetGlobalID());
3899 e.
list.push_back(i.second->GetEdge(1)->GetGlobalID());
3900 e.
list.push_back(i.second->GetEdge(2)->GetGlobalID());
3901 e.
list.push_back(i.second->GetEdge(3)->GetGlobalID());
3909 for (
auto &i : m_tetGeoms)
3913 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3914 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3915 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3916 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3920 for (
auto &i : m_pyrGeoms)
3924 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3925 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3926 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3927 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3928 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3932 for (
auto &i : m_prismGeoms)
3936 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3937 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3938 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3939 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3940 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3944 for (
auto &i : m_hexGeoms)
3948 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3949 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3950 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3951 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3952 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3953 e.
list.push_back(i.second->GetFace(5)->GetGlobalID());
3968 for (
auto &comp : m_meshComposites)
3970 std::pair<LibUtilities::ShapeType, vector<int>> tmp;
3971 tmp.first = comp.second->m_geomVec[0]->GetShapeType();
3973 tmp.second.resize(comp.second->m_geomVec.size());
3974 for (
size_t i = 0; i < tmp.second.size(); ++i)
3976 tmp.second[i] = comp.second->m_geomVec[i]->GetGlobalID();
3979 ret[comp.first] = tmp;
3988 m_domainRange->m_checkShape =
false;
3994 m_domainRange->m_doXrange =
true;
3997 m_domainRange->m_xmin = xmin;
3998 m_domainRange->m_xmax = xmax;
4002 m_domainRange->m_doYrange =
false;
4006 m_domainRange->m_doYrange =
true;
4007 m_domainRange->m_ymin = ymin;
4008 m_domainRange->m_ymax = ymax;
4013 m_domainRange->m_doZrange =
false;
4017 m_domainRange->m_doZrange =
true;
4018 m_domainRange->m_zmin = zmin;
4019 m_domainRange->m_zmax = zmax;
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Describes the specification for a Basis.
int GetNumPoints() const
Return points order at which basis is defined.
BasisType GetBasisType() const
Return type of expansion basis.
int GetNumModes() const
Returns the order of the basis.
PointsType GetPointsType() const
Return type of quadrature.
NekDouble Evaluate() const
Provides a generic Factory class.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Defines a specification for a set of points.
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
LibUtilities::ShapeType GetShapeType(void)
Get the geometric shape type of this object.
PointGeomSharedPtr GetVertex(int i) const
Returns vertex i of this object.
int GetCoordim() const
Return the coordinate dimension of this object (i.e. the dimension of the space in which this object ...
int GetNumVerts() const
Get the number of vertices of this object.
std::vector< BasisKey > BasisKeyVector
Name for a vector of BasisKeys.
const char *const BasisTypeMap[]
std::shared_ptr< FieldIO > FieldIOSharedPtr
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
const std::string kPointsTypeStr[]
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< DomainRange > DomainRangeShPtr
static DomainRangeShPtr NullDomainRangeShPtr
@ SIZE_PointsType
Length of enum list.
@ eGaussRadauMLegendre
1D Gauss-Radau-Legendre quadrature points, pinned at x=-1
@ eFourierEvenlySpaced
1D Evenly-spaced points using Fourier Fit
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGaussGaussChebyshev
1D Gauss-Gauss-Chebyshev quadrature points
@ ePolyEvenlySpaced
1D Evenly-spaced points using Lagrange polynomial
@ eGaussGaussLegendre
1D Gauss-Gauss-Legendre quadrature points
@ eFourierSingleModeSpaced
1D Non Evenly-spaced points for Single Mode analysis
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
@ eModified_B
Principle Modified Functions .
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points.
@ eOrtho_A
Principle Orthogonal Functions .
@ eModified_C
Principle Modified Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ SIZE_BasisType
Length of enum list.
@ eFourierSingleMode
Fourier ModifiedExpansion with just the first mode .
@ eChebyshev
Chebyshev Polynomials.
@ eOrtho_C
Principle Orthogonal Functions .
@ eModifiedPyr_C
Principle Modified Functions.
@ eOrtho_B
Principle Orthogonal Functions .
@ eModified_A
Principle Modified Functions .
@ eFourierHalfModeIm
Fourier Modified expansions with just the imaginary part of the first mode .
@ eFourierHalfModeRe
Fourier Modified expansions with just the real part of the first mode .
@ eFourier
Fourier Expansion .
static const NekDouble kNekUnsetDouble
std::shared_ptr< QuadGeom > QuadGeomSharedPtr
std::map< int, std::pair< LibUtilities::ShapeType, std::vector< int > > > CompositeDescriptor
std::shared_ptr< std::vector< std::pair< GeometrySharedPtr, int > > > GeometryLinkSharedPtr
std::shared_ptr< Composite > CompositeSharedPtr
std::shared_ptr< ExpansionInfoMap > ExpansionInfoMapShPtr
@ eDeformed
Geometry is curved or has non-constant factors.
std::shared_ptr< SegGeom > SegGeomSharedPtr
std::shared_ptr< ExpansionInfo > ExpansionInfoShPtr
const std::string kExpansionTypeStr[]
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::shared_ptr< PointGeom > PointGeomSharedPtr
std::shared_ptr< Geometry2D > Geometry2DSharedPtr
std::shared_ptr< Geometry > GeometrySharedPtr
std::shared_ptr< TriGeom > TriGeomSharedPtr
MeshGraphFactory & GetMeshGraphFactory()
std::shared_ptr< Geometry1D > Geometry1DSharedPtr
std::map< int, ExpansionInfoShPtr > ExpansionInfoMap
std::shared_ptr< Geometry3D > Geometry3DSharedPtr
std::map< int, CompositeSharedPtr > CompositeMap
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
@ eDir1FwdDir2_Dir2FwdDir1
The above copyright notice and this permission notice shall be included.
std::vector< unsigned int > list
bg::model::point< NekDouble, 3, bg::cs::cartesian > BgPoint
bg::model::box< BgPoint > BgBox
std::pair< BgBox, int > BgRtreeValue
void InsertGeom(GeometrySharedPtr const &geom)
bg::index::rtree< BgRtreeValue, bg::index::rstar< 16, 4 > > m_bgTree