55 #include <boost/archive/iterators/base64_from_binary.hpp>
56 #include <boost/archive/iterators/binary_from_base64.hpp>
57 #include <boost/archive/iterators/transform_width.hpp>
58 #include <boost/iostreams/copy.hpp>
59 #include <boost/iostreams/filter/zlib.hpp>
60 #include <boost/iostreams/filtering_stream.hpp>
62 #include <boost/geometry/geometry.hpp>
63 #include <boost/geometry/index/rtree.hpp>
64 namespace bg = boost::geometry;
70 namespace SpatialDomains
84 typedef bg::model::point<NekDouble, 3, bg::cs::cartesian>
BgPoint;
85 typedef bg::model::box<BgPoint>
BgBox;
88 bg::index::rtree< BgRtreeValue, bg::index::rstar<16, 4> >
m_bgTree;
92 std::array<NekDouble, 6> minMax = geom->GetBoundingBox();
93 BgPoint ptMin(minMax[0], minMax[1], minMax[2]);
94 BgPoint ptMax(minMax[3], minMax[4], minMax[5]);
96 std::make_pair(
BgBox(ptMin, ptMax), geom->GetGlobalID()));
100 MeshGraph::MeshGraph()
102 m_boundingBoxTree = std::unique_ptr<MeshGraph::GeomRTree>(
109 MeshGraph::~MeshGraph()
119 ASSERTL0(comm.get(),
"Communication not initialised.");
124 const bool isRoot = comm->TreatAsRankZero();
125 std::string geomType;
130 session->InitSession();
133 geomType = session->GetGeometryType();
136 std::vector<char> v(geomType.c_str(),
137 geomType.c_str() + geomType.length());
139 size_t length = v.size();
140 comm->Bcast(length, 0);
146 comm->Bcast(length, 0);
148 std::vector<char> v(length);
151 geomType = std::string(v.begin(),v.end());
158 mesh->PartitionMesh(session);
161 mesh->ReadGeometry(rng, fillGraph);
166 void MeshGraph::FillGraph()
170 switch (m_meshDimension)
174 for (
auto &x : m_pyrGeoms)
178 for (
auto &x : m_prismGeoms)
182 for (
auto &x : m_tetGeoms)
186 for (
auto &x : m_hexGeoms)
194 for (
auto &x : m_triGeoms)
198 for (
auto &x : m_quadGeoms)
206 for (
auto x : m_segGeoms)
215 void MeshGraph::FillBoundingBoxTree()
218 m_boundingBoxTree->m_bgTree.clear();
219 switch (m_meshDimension)
222 for (
auto &x : m_segGeoms)
224 m_boundingBoxTree->InsertGeom(x.second);
228 for (
auto &x : m_triGeoms)
230 m_boundingBoxTree->InsertGeom(x.second);
232 for (
auto &x : m_quadGeoms)
234 m_boundingBoxTree->InsertGeom(x.second);
238 for (
auto &x : m_tetGeoms)
240 m_boundingBoxTree->InsertGeom(x.second);
242 for (
auto &x : m_prismGeoms)
244 m_boundingBoxTree->InsertGeom(x.second);
246 for (
auto &x : m_pyrGeoms)
248 m_boundingBoxTree->InsertGeom(x.second);
250 for (
auto &x : m_hexGeoms)
252 m_boundingBoxTree->InsertGeom(x.second);
260 std::vector<int> MeshGraph::GetElementsContainingPoint(
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;
292 int MeshGraph::GetNumElements()
294 switch (m_meshDimension)
298 return m_segGeoms.size();
303 return m_triGeoms.size() + m_quadGeoms.size();
308 return m_tetGeoms.size() + m_pyrGeoms.size() + m_prismGeoms.size() +
318 bool returnval =
true;
326 if (m_domainRange->m_doXrange)
330 for (
int i = 0; i < nverts; ++i)
333 if (xval < m_domainRange->m_xmin)
338 if (xval > m_domainRange->m_xmax)
347 if ((ncnt_up == nverts) || (ncnt_low == nverts))
354 if (m_domainRange->m_doYrange)
358 for (
int i = 0; i < nverts; ++i)
361 if (yval < m_domainRange->m_ymin)
366 if (yval > m_domainRange->m_ymax)
375 if ((ncnt_up == nverts) || (ncnt_low == nverts))
384 if (m_domainRange->m_doZrange)
389 for (
int i = 0; i < nverts; ++i)
393 if (zval < m_domainRange->m_zmin)
398 if (zval > m_domainRange->m_zmax)
407 if ((ncnt_up == nverts) || (ncnt_low == nverts))
420 bool returnval =
true;
426 if (m_domainRange->m_doXrange)
431 for (
int i = 0; i < nverts; ++i)
434 if (xval < m_domainRange->m_xmin)
439 if (xval > m_domainRange->m_xmax)
448 if ((ncnt_up == nverts) || (ncnt_low == nverts))
454 if (m_domainRange->m_doYrange)
458 for (
int i = 0; i < nverts; ++i)
461 if (yval < m_domainRange->m_ymin)
466 if (yval > m_domainRange->m_ymax)
475 if ((ncnt_up == nverts) || (ncnt_low == nverts))
481 if (m_domainRange->m_doZrange)
485 for (
int i = 0; i < nverts; ++i)
489 if (zval < m_domainRange->m_zmin)
494 if (zval > m_domainRange->m_zmax)
503 if ((ncnt_up == nverts) || (ncnt_low == nverts))
509 if (m_domainRange->m_checkShape)
529 if (whichComposite >= 0 && whichComposite <
int(m_meshComposites.size()))
531 if (whichItem >= 0 &&
532 whichItem <
int(m_meshComposites[whichComposite]->m_geomVec.size()))
534 returnval = m_meshComposites[whichComposite]->m_geomVec[whichItem];
548 std::ostringstream errStream;
549 errStream <<
"Unable to access composite item [" << whichComposite
550 <<
"][" << whichItem <<
"].";
552 std::string testStr = errStream.str();
554 NEKERROR(ErrorUtil::efatal, testStr.c_str());
563 void MeshGraph::GetCompositeList(
const std::string &compositeStr,
567 vector<unsigned int> seqVector;
569 ParseUtils::GenerateSeqVector(compositeStr.c_str(), seqVector);
572 parseGood && !seqVector.empty(),
573 (std::string(
"Unable to read composite index range: ") + compositeStr)
579 for (
auto iter = seqVector.begin(); iter != seqVector.end(); ++iter)
584 if (
std::find(addedVector.begin(), addedVector.end(), *iter) ==
590 if (m_meshComposites.find(*iter) == m_meshComposites.end() &&
596 addedVector.push_back(*iter);
597 ASSERTL0(m_meshComposites.find(*iter) != m_meshComposites.end(),
598 "Composite not found.");
603 compositeVector[*iter] = composite;
608 ::sprintf(str,
"%d", *iter);
610 (std::string(
"Undefined composite: ") + str).c_str());
623 if (m_expansionMapShPtrMap.count(variable))
625 returnval = m_expansionMapShPtrMap.find(variable)->second;
629 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
634 "Unable to find expansion vector definition for field: ") +
638 returnval = m_expansionMapShPtrMap.find(
"DefaultVar")->second;
639 m_expansionMapShPtrMap[variable] = returnval;
644 "Using Default variable expansion definition for field: ") +
656 const std::string variable)
659 m_expansionMapShPtrMap.find(variable)->second;
661 auto iter = expansionMap->find(geom->GetGlobalID());
662 ASSERTL1(iter != expansionMap->end(),
663 "Could not find expansion " +
664 boost::lexical_cast<string>(geom->GetGlobalID()) +
665 " in expansion for variable " + variable);
672 void MeshGraph::SetExpansionInfo(
673 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef)
675 int i, j, k, cnt, id;
682 for (i = 0; i < fielddef.size(); ++i)
684 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
686 std::string field = fielddef[i]->m_fields[j];
687 if (m_expansionMapShPtrMap.count(field) == 0)
689 expansionMap = SetUpExpansionInfoMap();
690 m_expansionMapShPtrMap[field] = expansionMap;
694 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
696 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
704 for (i = 0; i < fielddef.size(); ++i)
707 std::vector<std::string> fields = fielddef[i]->m_fields;
708 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
709 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
710 bool pointDef = fielddef[i]->m_pointsDef;
711 bool numPointDef = fielddef[i]->m_numPointsDef;
714 std::vector<unsigned int> npoints = fielddef[i]->m_numPoints;
715 std::vector<LibUtilities::PointsType> points = fielddef[i]->m_points;
717 bool UniOrder = fielddef[i]->m_uniOrder;
719 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
723 id = fielddef[i]->m_elementIDs[j];
725 switch (fielddef[i]->m_shapeType)
729 if (m_segGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
735 cnt += fielddef[i]->m_numHomogeneousDir;
739 geom = m_segGeoms[fielddef[i]->m_elementIDs[j]];
744 if (numPointDef && pointDef)
750 else if (!numPointDef && pointDef)
756 else if (numPointDef && !pointDef)
768 cnt += fielddef[i]->m_numHomogeneousDir;
770 bkeyvec.push_back(bkey);
775 if (m_triGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
781 cnt += fielddef[i]->m_numHomogeneousDir;
785 geom = m_triGeoms[fielddef[i]->m_elementIDs[j]];
789 if (numPointDef && pointDef)
795 else if (!numPointDef && pointDef)
801 else if (numPointDef && !pointDef)
809 bkeyvec.push_back(bkey);
813 if (numPointDef && pointDef)
819 else if (!numPointDef && pointDef)
825 else if (numPointDef && !pointDef)
834 bkeyvec.push_back(bkey1);
839 cnt += fielddef[i]->m_numHomogeneousDir;
845 if (m_quadGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
851 cnt += fielddef[i]->m_numHomogeneousDir;
856 geom = m_quadGeoms[fielddef[i]->m_elementIDs[j]];
858 for (
int b = 0; b < 2; ++b)
864 if (numPointDef && pointDef)
867 npoints[cnt + b], points[b]);
870 else if (!numPointDef && pointDef)
873 nmodes[cnt + b] + 1, points[b]);
876 else if (numPointDef && !pointDef)
885 bkeyvec.push_back(bkey);
891 cnt += fielddef[i]->m_numHomogeneousDir;
898 k = fielddef[i]->m_elementIDs[j];
903 if (m_tetGeoms.count(k) == 0)
911 geom = m_tetGeoms[k];
918 if (numPointDef && pointDef)
924 else if (!numPointDef && pointDef)
930 else if (numPointDef && !pointDef)
941 bkeyvec.push_back(bkey);
948 if (numPointDef && pointDef)
951 npoints[cnt + 1], points[1]);
954 else if (!numPointDef && pointDef)
957 nmodes[cnt + 1] + 1, points[1]);
960 else if (numPointDef && !pointDef)
971 bkeyvec.push_back(bkey);
979 if (numPointDef && pointDef)
982 npoints[cnt + 2], points[2]);
985 else if (!numPointDef && pointDef)
988 nmodes[cnt + 2] + 1, points[2]);
991 else if (numPointDef && !pointDef)
1002 bkeyvec.push_back(bkey);
1013 k = fielddef[i]->m_elementIDs[j];
1014 if (m_prismGeoms.count(k) == 0)
1022 geom = m_prismGeoms[k];
1024 for (
int b = 0; b < 2; ++b)
1027 nmodes[cnt + b] + 1,
1030 if (numPointDef && pointDef)
1033 npoints[cnt + b], points[b]);
1036 else if (!numPointDef && pointDef)
1039 nmodes[cnt + b] + 1, points[b]);
1042 else if (numPointDef && !pointDef)
1052 bkeyvec.push_back(bkey);
1060 if (numPointDef && pointDef)
1063 npoints[cnt + 2], points[2]);
1066 else if (!numPointDef && pointDef)
1069 nmodes[cnt + 2] + 1, points[2]);
1072 else if (numPointDef && !pointDef)
1082 bkeyvec.push_back(bkey);
1093 k = fielddef[i]->m_elementIDs[j];
1094 ASSERTL0(m_pyrGeoms.find(k) != m_pyrGeoms.end(),
1095 "Failed to find geometry with same global id");
1096 geom = m_pyrGeoms[k];
1098 for (
int b = 0; b < 2; ++b)
1101 nmodes[cnt + b] + 1,
1104 if (numPointDef && pointDef)
1107 npoints[cnt + b], points[b]);
1110 else if (!numPointDef && pointDef)
1113 nmodes[cnt + b] + 1, points[b]);
1116 else if (numPointDef && !pointDef)
1126 bkeyvec.push_back(bkey);
1134 if (numPointDef && pointDef)
1137 npoints[cnt + 2], points[2]);
1140 else if (!numPointDef && pointDef)
1143 nmodes[cnt + 2] + 1, points[2]);
1146 else if (numPointDef && !pointDef)
1156 bkeyvec.push_back(bkey);
1167 k = fielddef[i]->m_elementIDs[j];
1168 if (m_hexGeoms.count(k) == 0)
1177 geom = m_hexGeoms[k];
1179 for (
int b = 0; b < 3; ++b)
1185 if (numPointDef && pointDef)
1188 npoints[cnt + b], points[b]);
1191 else if (!numPointDef && pointDef)
1194 nmodes[cnt + b] + 1, points[b]);
1197 else if (numPointDef && !pointDef)
1207 bkeyvec.push_back(bkey);
1219 "Need to set up for pyramid and prism 3D ExpansionInfo");
1223 for (k = 0; k < fields.size(); ++k)
1225 expansionMap = m_expansionMapShPtrMap.find(fields[k])->second;
1226 if ((*expansionMap).find(
id) != (*expansionMap).end())
1228 (*expansionMap)[id]->m_geomShPtr = geom;
1229 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1239 void MeshGraph::SetExpansionInfo(
1240 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef,
1241 std::vector<std::vector<LibUtilities::PointsType>> &pointstype)
1243 int i, j, k, cnt, id;
1250 for (i = 0; i < fielddef.size(); ++i)
1252 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
1254 std::string field = fielddef[i]->m_fields[j];
1255 if (m_expansionMapShPtrMap.count(field) == 0)
1257 expansionMap = SetUpExpansionInfoMap();
1258 m_expansionMapShPtrMap[field] = expansionMap;
1262 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
1264 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
1272 for (i = 0; i < fielddef.size(); ++i)
1275 std::vector<std::string> fields = fielddef[i]->m_fields;
1276 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
1277 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
1278 bool UniOrder = fielddef[i]->m_uniOrder;
1280 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
1283 id = fielddef[i]->m_elementIDs[j];
1285 switch (fielddef[i]->m_shapeType)
1289 k = fielddef[i]->m_elementIDs[j];
1290 ASSERTL0(m_segGeoms.find(k) != m_segGeoms.end(),
1291 "Failed to find geometry with same global id.");
1292 geom = m_segGeoms[k];
1300 cnt += fielddef[i]->m_numHomogeneousDir;
1302 bkeyvec.push_back(bkey);
1307 k = fielddef[i]->m_elementIDs[j];
1308 ASSERTL0(m_triGeoms.find(k) != m_triGeoms.end(),
1309 "Failed to find geometry with same global id.");
1310 geom = m_triGeoms[k];
1311 for (
int b = 0; b < 2; ++b)
1317 bkeyvec.push_back(bkey);
1323 cnt += fielddef[i]->m_numHomogeneousDir;
1329 k = fielddef[i]->m_elementIDs[j];
1330 ASSERTL0(m_quadGeoms.find(k) != m_quadGeoms.end(),
1331 "Failed to find geometry with same global id");
1332 geom = m_quadGeoms[k];
1334 for (
int b = 0; b < 2; ++b)
1340 bkeyvec.push_back(bkey);
1346 cnt += fielddef[i]->m_numHomogeneousDir;
1352 k = fielddef[i]->m_elementIDs[j];
1353 ASSERTL0(m_tetGeoms.find(k) != m_tetGeoms.end(),
1354 "Failed to find geometry with same global id");
1355 geom = m_tetGeoms[k];
1357 for (
int b = 0; b < 3; ++b)
1363 bkeyvec.push_back(bkey);
1374 k = fielddef[i]->m_elementIDs[j];
1375 ASSERTL0(m_pyrGeoms.find(k) != m_pyrGeoms.end(),
1376 "Failed to find geometry with same global id");
1377 geom = m_pyrGeoms[k];
1379 for (
int b = 0; b < 3; ++b)
1385 bkeyvec.push_back(bkey);
1396 k = fielddef[i]->m_elementIDs[j];
1397 ASSERTL0(m_prismGeoms.find(k) != m_prismGeoms.end(),
1398 "Failed to find geometry with same global id");
1399 geom = m_prismGeoms[k];
1401 for (
int b = 0; b < 3; ++b)
1407 bkeyvec.push_back(bkey);
1418 k = fielddef[i]->m_elementIDs[j];
1419 ASSERTL0(m_hexGeoms.find(k) != m_hexGeoms.end(),
1420 "Failed to find geometry with same global id");
1421 geom = m_hexGeoms[k];
1423 for (
int b = 0; b < 3; ++b)
1429 bkeyvec.push_back(bkey);
1441 "Need to set up for pyramid and prism 3D ExpansionInfo");
1445 for (k = 0; k < fields.size(); ++k)
1447 expansionMap = m_expansionMapShPtrMap.find(fields[k])->second;
1448 if ((*expansionMap).find(
id) != (*expansionMap).end())
1450 (*expansionMap)[id]->m_geomShPtr = geom;
1451 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1463 void MeshGraph::SetExpansionInfoToEvenlySpacedPoints(
int npoints)
1466 for (
auto it = m_expansionMapShPtrMap.begin();
1467 it != m_expansionMapShPtrMap.end(); ++it)
1469 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1472 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1475 expIt->second->m_basisKeyVector[i];
1487 npts = max(npts, 2);
1493 expIt->second->m_basisKeyVector[i] = bkeynew;
1505 void MeshGraph::SetExpansionInfoToNumModes(
int nmodes)
1508 for (
auto it = m_expansionMapShPtrMap.begin();
1509 it != m_expansionMapShPtrMap.end(); ++it)
1511 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1514 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1517 expIt->second->m_basisKeyVector[i];
1526 expIt->second->m_basisKeyVector[i] = bkeynew;
1538 void MeshGraph::SetExpansionInfoToPointOrder(
int npts)
1541 for (
auto it = m_expansionMapShPtrMap.begin();
1542 it != m_expansionMapShPtrMap.end(); ++it)
1544 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1547 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1550 expIt->second->m_basisKeyVector[i];
1557 expIt->second->m_basisKeyVector[i] = bkeynew;
1579 ResetExpansionInfoToBasisKey(expansionMap, shape, keys);
1586 for (
auto elemIter = expansionMap->begin(); elemIter != expansionMap->end();
1589 if ((elemIter->second)->m_geomShPtr->GetShapeType() == shape)
1591 (elemIter->second)->m_basisKeyVector = keys;
1635 nummodes + quadoffset,
1639 returnval.push_back(bkey);
1645 nummodes + quadoffset,
1649 returnval.push_back(bkey);
1650 returnval.push_back(bkey);
1656 nummodes + quadoffset,
1660 returnval.push_back(bkey);
1661 returnval.push_back(bkey);
1662 returnval.push_back(bkey);
1668 nummodes + quadoffset,
1672 returnval.push_back(bkey);
1675 nummodes + quadoffset - 1,
1680 returnval.push_back(bkey1);
1686 nummodes + quadoffset,
1690 returnval.push_back(bkey);
1693 nummodes + quadoffset - 1,
1697 returnval.push_back(bkey1);
1702 nummodes + quadoffset - 1,
1706 returnval.push_back(bkey2);
1711 nummodes + quadoffset - 1,
1715 returnval.push_back(bkey2);
1722 nummodes + quadoffset,
1726 returnval.push_back(bkey);
1727 returnval.push_back(bkey);
1730 nummodes + quadoffset,
1734 returnval.push_back(bkey1);
1740 nummodes + quadoffset,
1744 returnval.push_back(bkey);
1745 returnval.push_back(bkey);
1748 nummodes + quadoffset - 1,
1752 returnval.push_back(bkey1);
1758 "Expansion not defined in switch for this shape");
1775 returnval.push_back(bkey);
1784 returnval.push_back(bkey);
1785 returnval.push_back(bkey);
1795 returnval.push_back(bkey);
1801 returnval.push_back(bkey1);
1811 returnval.push_back(bkey);
1812 returnval.push_back(bkey);
1813 returnval.push_back(bkey);
1819 "Expansion not defined in switch for this shape");
1837 returnval.push_back(bkey);
1847 returnval.push_back(bkey);
1848 returnval.push_back(bkey);
1858 returnval.push_back(bkey);
1859 returnval.push_back(bkey);
1860 returnval.push_back(bkey);
1866 "Expansion not defined in switch for this shape");
1884 returnval.push_back(bkey);
1894 returnval.push_back(bkey);
1901 returnval.push_back(bkey1);
1911 returnval.push_back(bkey);
1912 returnval.push_back(bkey);
1922 returnval.push_back(bkey);
1929 returnval.push_back(bkey1);
1940 "Expansion not defined in switch for this shape");
1958 returnval.push_back(bkey);
1968 returnval.push_back(bkey);
1969 returnval.push_back(bkey);
1979 returnval.push_back(bkey);
1980 returnval.push_back(bkey);
1981 returnval.push_back(bkey);
1987 "Expansion not defined in switch for this shape");
2004 returnval.push_back(bkey);
2013 returnval.push_back(bkey);
2014 returnval.push_back(bkey);
2023 returnval.push_back(bkey);
2024 returnval.push_back(bkey);
2025 returnval.push_back(bkey);
2031 "Expansion not defined in switch for this shape");
2048 returnval.push_back(bkey);
2057 returnval.push_back(bkey);
2058 returnval.push_back(bkey);
2067 returnval.push_back(bkey);
2068 returnval.push_back(bkey);
2069 returnval.push_back(bkey);
2075 "Expansion not defined in switch for this shape");
2092 returnval.push_back(bkey);
2101 returnval.push_back(bkey);
2102 returnval.push_back(bkey);
2111 returnval.push_back(bkey);
2112 returnval.push_back(bkey);
2113 returnval.push_back(bkey);
2119 "Expansion not defined in switch for this shape");
2136 returnval.push_back(bkey);
2145 returnval.push_back(bkey);
2146 returnval.push_back(bkey);
2155 returnval.push_back(bkey);
2156 returnval.push_back(bkey);
2157 returnval.push_back(bkey);
2163 "Expansion not defined in switch for this shape");
2180 returnval.push_back(bkey);
2189 returnval.push_back(bkey);
2190 returnval.push_back(bkey);
2199 returnval.push_back(bkey);
2200 returnval.push_back(bkey);
2201 returnval.push_back(bkey);
2207 "Expansion not defined in switch for this shape");
2224 returnval.push_back(bkey);
2230 returnval.push_back(bkey1);
2236 "Expansion not defined in switch for this shape");
2253 returnval.push_back(bkey1);
2259 returnval.push_back(bkey);
2265 "Expansion not defined in switch for this shape");
2282 returnval.push_back(bkey);
2288 returnval.push_back(bkey1);
2294 "Expansion not defined in switch for this shape");
2303 ASSERTL0(
false,
"Expansion type not defined");
2316 ExpansionType type_z,
const int nummodes_x,
const int nummodes_y,
2317 const int nummodes_z)
2327 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2333 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2347 returnval.push_back(bkey1);
2357 returnval.push_back(bkey1);
2367 returnval.push_back(bkey1);
2377 returnval.push_back(bkey1);
2387 returnval.push_back(bkey1);
2393 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2394 "or Chebyshev type only");
2407 returnval.push_back(bkey2);
2417 returnval.push_back(bkey2);
2427 returnval.push_back(bkey2);
2437 returnval.push_back(bkey2);
2447 returnval.push_back(bkey2);
2453 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2454 "or Chebyshev type only");
2467 returnval.push_back(bkey3);
2477 returnval.push_back(bkey3);
2487 returnval.push_back(bkey3);
2497 returnval.push_back(bkey3);
2507 returnval.push_back(bkey3);
2513 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2514 "or Chebyshev type only");
2523 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2529 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2534 ASSERTL0(
false,
"Expansion not defined in switch for this shape");
2553 for (
int d = 0; d < m_domain.size(); ++d)
2555 for (
auto compIter = m_domain[d].begin(); compIter != m_domain[d].end();
2559 for (
auto x = compIter->second->m_geomVec.begin();
2560 x != compIter->second->m_geomVec.end(); ++x)
2567 int id = (*x)->GetGlobalID();
2568 (*returnval)[id] = expansionElementShPtr;
2572 for (
auto x = compIter->second->m_geomVec.begin();
2573 x != compIter->second->m_geomVec.end(); ++x)
2580 int id = (*x)->GetGlobalID();
2581 (*returnval)[id] = expansionElementShPtr;
2597 if (comp->m_geomVec.size() == 0)
2604 map<LibUtilities::ShapeType, pair<string, string>> compMap;
2617 int shapeDim = firstGeom->GetShapeDim();
2618 string tag = (shapeDim < m_meshDimension)
2619 ? compMap[firstGeom->GetShapeType()].second
2620 : compMap[firstGeom->GetShapeType()].first;
2622 std::vector<unsigned int> idxList;
2624 comp->m_geomVec.begin(), comp->m_geomVec.end(),
2625 std::back_inserter(idxList),
2628 s <<
" " << tag <<
"[" << ParseUtils::GenerateSeqString(idxList) <<
"] ";
2632 void MeshGraph::ReadExpansionInfo()
2635 TiXmlElement *expansionTypes = m_session->GetElement(
"NEKTAR/EXPANSIONS");
2636 ASSERTL0(expansionTypes,
"Unable to find EXPANSIONS tag in file.");
2641 TiXmlElement *expansion = expansionTypes->FirstChildElement();
2642 ASSERTL0(expansion,
"Unable to find entries in EXPANSIONS tag in "
2644 std::string expType = expansion->Value();
2645 std::vector<std::string> vars = m_session->GetVariables();
2650 m_expansionMapShPtrMap.clear();
2666 map<int, bool> domainCompList;
2667 for (
int d = 0; d < m_domain.size(); ++d)
2669 for (
auto c = m_domain[d].begin(); c != m_domain[d].end(); ++c)
2671 domainCompList[c->first] =
false;
2674 map<std::string, map<int, bool>> fieldDomainCompList;
2679 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
2680 ASSERTL0(compositeStr.length() > 3,
2681 "COMPOSITE must be specified in expansion definition");
2682 int beg = compositeStr.find_first_of(
"[");
2683 int end = compositeStr.find_first_of(
"]");
2684 std::string compositeListStr =
2685 compositeStr.substr(beg + 1, end - beg - 1);
2687 map<int, CompositeSharedPtr> compositeVector;
2688 GetCompositeList(compositeListStr, compositeVector);
2691 const char *fStr = expansion->Attribute(
"FIELDS");
2692 std::vector<std::string> fieldStrings;
2696 std::string fieldStr = fStr;
2697 bool valid = ParseUtils::GenerateVector(
2698 fieldStr.c_str(), fieldStrings);
2699 ASSERTL0(valid,
"Unable to correctly parse the field "
2700 "string in ExpansionTypes.");
2703 if(m_expansionMapShPtrMap.count(fieldStrings[0]))
2706 m_expansionMapShPtrMap.find(fieldStrings[0])
2711 expansionMap = SetUpExpansionInfoMap();
2716 for (i = 0; i < fieldStrings.size(); ++i)
2718 if (vars.size() && std::count(vars.begin(), vars.end(),
2719 fieldStrings[i]) == 0)
2721 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
2722 "' defined in EXPANSIONS is not"
2723 " defined in VARIABLES.");
2726 if (m_expansionMapShPtrMap.count(fieldStrings[i]) == 0)
2728 m_expansionMapShPtrMap[fieldStrings[i]] =
2733 fieldDomainCompList[fieldStrings[i]] =
2735 for (
auto c = compositeVector.begin(); c !=
2736 compositeVector.end(); ++c)
2738 fieldDomainCompList.find(fieldStrings[i])
2739 ->second.find(c->first)
2745 for (
auto c = compositeVector.begin(); c !=
2746 compositeVector.end(); ++c)
2748 if (fieldDomainCompList.find(fieldStrings[i])
2749 ->second.find(c->first)->second ==
false)
2751 fieldDomainCompList.find(fieldStrings[i])
2752 ->second.find(c->first)->second =
true;
2756 ASSERTL0(
false,
"Expansion vector for "
2757 "variable '"+fieldStrings[i]
2758 +
"' is already setup for C["
2759 +to_string(c->first) +
"].");
2763 m_expansionMapShPtrMap.find(fieldStrings[i])
2770 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
2772 expansionMap = SetUpExpansionInfoMap();
2773 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
2775 fieldDomainCompList[
"DefaultVar"] = domainCompList;
2776 for (
auto c = compositeVector.begin(); c !=
2777 compositeVector.end(); ++c)
2779 fieldDomainCompList.find(
"DefaultVar")
2780 ->second.find(c->first)->second =
true;
2785 for (
auto c = compositeVector.begin(); c !=
2786 compositeVector.end(); ++c)
2788 if (fieldDomainCompList.find(
"DefaultVar")
2789 ->second.find(c->first)->second ==
false)
2791 fieldDomainCompList.find(
"DefaultVar")
2792 ->second.find(c->first)->second =
true;
2796 ASSERTL0(
false,
"Default expansion already "
2798 to_string(c->first) +
"].");
2802 m_expansionMapShPtrMap.find(
"DefaultVar")
2808 bool useExpansionType =
false;
2813 const char *tStr = expansion->Attribute(
"TYPE");
2817 std::string typeStr = tStr;
2819 const std::string *endStr =
2821 const std::string *expStr =
2824 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
2839 const char *nStr = expansion->Attribute(
"NUMMODES");
2840 ASSERTL0(nStr,
"NUMMODES was not defined in EXPANSION "
2841 "section of input");
2842 std::string nummodesStr = nStr;
2849 num_modes = (int)nummodesEqn.
Evaluate();
2853 num_modes = boost::lexical_cast<int>(nummodesStr);
2856 useExpansionType =
true;
2861 const char *bTypeStr = expansion->Attribute(
"BASISTYPE");
2862 ASSERTL0(bTypeStr,
"TYPE or BASISTYPE was not defined in "
2863 "EXPANSION section of input");
2864 std::string basisTypeStr = bTypeStr;
2867 std::vector<std::string> basisStrings;
2868 std::vector<LibUtilities::BasisType> basis;
2869 bool valid = ParseUtils::GenerateVector(
2870 basisTypeStr.c_str(), basisStrings);
2872 "Unable to correctly parse the basis types.");
2873 for (vector<std::string>::size_type i = 0;
2874 i < basisStrings.size(); i++)
2877 for (
unsigned int j = 0;
2891 "Unable to correctly parse the basis type: ")
2892 .append(basisStrings[i])
2895 const char *nModesStr = expansion->Attribute(
"NUMMODES");
2896 ASSERTL0(nModesStr,
"NUMMODES was not defined in EXPANSION "
2897 "section of input");
2899 std::string numModesStr = nModesStr;
2900 std::vector<unsigned int> numModes;
2901 valid = ParseUtils::GenerateVector(
2902 numModesStr.c_str(), numModes);
2904 "Unable to correctly parse the number of modes.");
2905 ASSERTL0(numModes.size() == basis.size(),
2906 "information for num modes does not match the "
2909 const char *pTypeStr = expansion->Attribute(
"POINTSTYPE");
2910 ASSERTL0(pTypeStr,
"POINTSTYPE was not defined in "
2911 "EXPANSION section of input");
2912 std::string pointsTypeStr = pTypeStr;
2914 std::vector<std::string> pointsStrings;
2915 std::vector<LibUtilities::PointsType> points;
2916 valid = ParseUtils::GenerateVector(
2917 pointsTypeStr.c_str(), pointsStrings);
2919 "Unable to correctly parse the points types.");
2920 for (vector<std::string>::size_type i = 0;
2921 i < pointsStrings.size(); i++)
2924 for (
unsigned int j = 0;
2938 "Unable to correctly parse the points type: ")
2939 .append(pointsStrings[i])
2943 const char *nPointsStr = expansion->Attribute(
"NUMPOINTS");
2944 ASSERTL0(nPointsStr,
"NUMPOINTS was not defined in "
2945 "EXPANSION section of input");
2946 std::string numPointsStr = nPointsStr;
2947 std::vector<unsigned int> numPoints;
2948 valid = ParseUtils::GenerateVector(
2949 numPointsStr.c_str(), numPoints);
2951 "Unable to correctly parse the number of points.");
2952 ASSERTL0(numPoints.size() == numPoints.size(),
2953 "information for num points does not match the "
2956 for (
int i = 0; i < basis.size(); ++i)
2962 basis[i], numModes[i], pkey));
2970 for (
auto compVecIter = compositeVector.begin();
2971 compVecIter != compositeVector.end(); ++compVecIter)
2973 for (
auto geomVecIter =
2974 compVecIter->second->m_geomVec.begin();
2975 geomVecIter != compVecIter->second->m_geomVec.end();
2979 expansionMap->find((*geomVecIter)->GetGlobalID());
2981 "Expansion not found!!");
2982 if (useExpansionType)
2984 (x->second)->m_basisKeyVector =
2985 MeshGraph::DefineBasisKeyFromExpansionType(
2986 *geomVecIter, expansion_type, num_modes);
2990 ASSERTL0((*geomVecIter)->GetShapeDim() ==
2992 " There is an incompatible expansion "
2993 "dimension with geometry dimension");
2994 (x->second)->m_basisKeyVector = basiskeyvec;
2999 expansion = expansion->NextSiblingElement(
"E");
3005 for (
auto f = fieldDomainCompList.begin(); f !=
3006 fieldDomainCompList.end(); ++f)
3008 if (f->first !=
"DefaultVar")
3010 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3012 if (c->second ==
false &&
3013 fieldDomainCompList.find(
"DefaultVar")->second
3014 .find(c->first)->second ==
true)
3018 for (
auto geomVecIter = m_meshComposites.find(c->
3019 first)->second->m_geomVec.begin();
3020 geomVecIter != m_meshComposites.find(c->first)->
3021 second->m_geomVec.end();
3025 m_expansionMapShPtrMap.find(
"DefaultVar")->
3026 second->find((*geomVecIter)->GetGlobalID());
3029 m_expansionMapShPtrMap.find(f->first)->
3030 second->find((*geomVecIter)->GetGlobalID());
3032 (xField->second)->m_basisKeyVector =
3033 (xDefaultVar->second)->m_basisKeyVector;
3038 "Using Default expansion definition for "
3039 "field '") + f->first +
"' in composite "
3040 "C[" + to_string(c->first) +
"].").c_str());
3042 ASSERTL0(c->second,
"There is no expansion defined for "
3043 "variable '" + f->first +
"' in C["+
3044 to_string(c->first) +
"].");
3050 for (i = 0; i < vars.size(); ++i)
3052 if (m_expansionMapShPtrMap.count(vars[i]) == 0)
3054 if (m_expansionMapShPtrMap.count(
"DefaultVar"))
3056 expansionMap = m_expansionMapShPtrMap.find(
"DefaultVar")
3058 m_expansionMapShPtrMap[vars[i]] = expansionMap;
3062 "Using Default expansion definition for field "
3063 "'") + vars[i] +
"'.").c_str());
3067 ASSERTL0(
false,
"Variable '" + vars[i] +
"' is missing"
3068 " in FIELDS attribute of EXPANSIONS"
3074 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3080 m_expansionMapShPtrMap.begin()->second;
3081 m_expansionMapShPtrMap[
"DefaultVar"] = firstEntryAddr;
3084 else if (expType ==
"H")
3087 m_expansionMapShPtrMap.clear();
3092 map<int, bool> domainCompList;
3093 for (
int d = 0; d < m_domain.size(); ++d)
3095 for (
auto c = m_domain[d].begin(); c != m_domain[d].end(); ++c)
3097 domainCompList[c->first] =
false;
3100 map<std::string, map<int, bool>> fieldDomainCompList;
3105 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
3106 ASSERTL0(compositeStr.length() > 3,
3107 "COMPOSITE must be specified in expansion definition");
3108 int beg = compositeStr.find_first_of(
"[");
3109 int end = compositeStr.find_first_of(
"]");
3110 std::string compositeListStr =
3111 compositeStr.substr(beg + 1, end - beg - 1);
3113 map<int, CompositeSharedPtr> compositeVector;
3114 GetCompositeList(compositeListStr, compositeVector);
3117 const char *fStr = expansion->Attribute(
"FIELDS");
3118 std::vector<std::string> fieldStrings;
3122 std::string fieldStr = fStr;
3123 bool valid = ParseUtils::GenerateVector(
3124 fieldStr.c_str(), fieldStrings);
3125 ASSERTL0(valid,
"Unable to correctly parse the field "
3126 "string in ExpansionTypes.");
3129 if(m_expansionMapShPtrMap.count(fieldStrings[0]))
3132 m_expansionMapShPtrMap.find(fieldStrings[0])
3137 expansionMap = SetUpExpansionInfoMap();
3142 for (i = 0; i < fieldStrings.size(); ++i)
3144 if (vars.size() && std::count(vars.begin(), vars.end(),
3145 fieldStrings[i]) == 0)
3147 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
3148 "' defined in EXPANSIONS is not"
3149 " defined in VARIABLES.");
3152 if (m_expansionMapShPtrMap.count(fieldStrings[i]) == 0)
3154 m_expansionMapShPtrMap[fieldStrings[i]] =
3159 fieldDomainCompList[fieldStrings[i]] =
3161 for (
auto c = compositeVector.begin(); c !=
3162 compositeVector.end(); ++c)
3164 fieldDomainCompList.find(fieldStrings[i])
3165 ->second.find(c->first)
3171 for (
auto c = compositeVector.begin(); c !=
3172 compositeVector.end(); ++c)
3174 if (fieldDomainCompList.find(fieldStrings[i])
3175 ->second.find(c->first)->second ==
false)
3177 fieldDomainCompList.find(fieldStrings[i])
3178 ->second.find(c->first)->second =
true;
3182 ASSERTL0(
false,
"Expansion vector for "
3183 "variable '"+fieldStrings[i]
3184 +
"' is already setup for C["
3185 +to_string(c->first) +
"].");
3189 m_expansionMapShPtrMap.find(fieldStrings[i])
3196 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3198 expansionMap = SetUpExpansionInfoMap();
3199 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
3201 fieldDomainCompList[
"DefaultVar"] = domainCompList;
3202 for (
auto c = compositeVector.begin(); c !=
3203 compositeVector.end(); ++c)
3205 fieldDomainCompList.find(
"DefaultVar")
3206 ->second.find(c->first)->second =
true;
3211 for (
auto c = compositeVector.begin(); c !=
3212 compositeVector.end(); ++c)
3214 if (fieldDomainCompList.find(
"DefaultVar")
3215 ->second.find(c->first)->second ==
false)
3217 fieldDomainCompList.find(
"DefaultVar")
3218 ->second.find(c->first)->second =
true;
3222 ASSERTL0(
false,
"Default expansion already "
3224 to_string(c->first) +
"].");
3228 m_expansionMapShPtrMap.find(
"DefaultVar")
3237 int num_modes_x = 0;
3238 int num_modes_y = 0;
3239 int num_modes_z = 0;
3243 const char *tStr_x = expansion->Attribute(
"TYPE-X");
3247 std::string typeStr = tStr_x;
3249 const std::string *endStr =
3251 const std::string *expStr =
3254 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3257 const char *nStr = expansion->Attribute(
"NUMMODES-X");
3258 ASSERTL0(nStr,
"NUMMODES-X was not defined in EXPANSION "
3259 "section of input");
3260 std::string nummodesStr = nStr;
3268 num_modes_x = (int)nummodesEqn.
Evaluate();
3272 num_modes_x = boost::lexical_cast<int>(nummodesStr);
3276 const char *tStr_y = expansion->Attribute(
"TYPE-Y");
3280 std::string typeStr = tStr_y;
3282 const std::string *endStr =
3284 const std::string *expStr =
3287 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3290 const char *nStr = expansion->Attribute(
"NUMMODES-Y");
3291 ASSERTL0(nStr,
"NUMMODES-Y was not defined in EXPANSION "
3292 "section of input");
3293 std::string nummodesStr = nStr;
3300 num_modes_y = (int)nummodesEqn.
Evaluate();
3304 num_modes_y = boost::lexical_cast<int>(nummodesStr);
3308 const char *tStr_z = expansion->Attribute(
"TYPE-Z");
3312 std::string typeStr = tStr_z;
3314 const std::string *endStr =
3316 const std::string *expStr =
3319 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3322 const char *nStr = expansion->Attribute(
"NUMMODES-Z");
3323 ASSERTL0(nStr,
"NUMMODES-Z was not defined in EXPANSION "
3324 "section of input");
3325 std::string nummodesStr = nStr;
3332 num_modes_z = (int)nummodesEqn.
Evaluate();
3336 num_modes_z = boost::lexical_cast<int>(nummodesStr);
3340 for (
auto compVecIter = compositeVector.begin();
3341 compVecIter != compositeVector.end(); ++compVecIter)
3343 for (
auto geomVecIter =
3344 compVecIter->second->m_geomVec.begin();
3345 geomVecIter != compVecIter->second->m_geomVec.end();
3348 for (
auto expVecIter = expansionMap->begin();
3349 expVecIter != expansionMap->end(); ++expVecIter)
3352 (expVecIter->second)->m_basisKeyVector =
3353 DefineBasisKeyFromExpansionTypeHomo(
3354 *geomVecIter, expansion_type_x,
3355 expansion_type_y, expansion_type_z,
3356 num_modes_x, num_modes_y, num_modes_z);
3361 expansion = expansion->NextSiblingElement(
"H");
3367 for (
auto f = fieldDomainCompList.begin(); f !=
3368 fieldDomainCompList.end(); ++f)
3370 if (f->first !=
"DefaultVar")
3372 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3374 if (c->second ==
false &&
3375 fieldDomainCompList.find(
"DefaultVar")->second
3376 .find(c->first)->second ==
true)
3380 for (
auto geomVecIter = m_meshComposites.find(c->
3381 first)->second->m_geomVec.begin();
3382 geomVecIter != m_meshComposites.find(c->first)->
3383 second->m_geomVec.end();
3387 m_expansionMapShPtrMap.find(
"DefaultVar")->
3388 second->find((*geomVecIter)->GetGlobalID());
3391 m_expansionMapShPtrMap.find(f->first)->
3392 second->find((*geomVecIter)->GetGlobalID());
3394 (xField->second)->m_basisKeyVector =
3395 (xDefaultVar->second)->m_basisKeyVector;
3400 "Using Default expansion definition for "
3401 "field '") + f->first +
"' in composite "
3402 "C[" + to_string(c->first) +
"].").c_str());
3404 ASSERTL0(c->second,
"There is no expansion defined for "
3405 "variable '" + f->first +
"' in C["+
3406 to_string(c->first) +
"].");
3412 for (i = 0; i < vars.size(); ++i)
3414 if (m_expansionMapShPtrMap.count(vars[i]) == 0)
3416 if (m_expansionMapShPtrMap.count(
"DefaultVar"))
3418 expansionMap = m_expansionMapShPtrMap.find(
"DefaultVar")
3420 m_expansionMapShPtrMap[vars[i]] = expansionMap;
3424 "Using Default expansion definition for field "
3425 "'") + vars[i] +
"'.").c_str());
3429 ASSERTL0(
false,
"Variable '" + vars[i] +
"' is missing"
3430 " in FIELDS attribute of EXPANSIONS"
3436 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3444 m_expansionMapShPtrMap.begin()->second;
3445 m_expansionMapShPtrMap[
"DefaultVar"] = firstEntryAddr;
3451 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3455 std::shared_ptr<LibUtilities::FieldIOXml> f =
3456 make_shared<LibUtilities::FieldIOXml>(m_session->GetComm(),
false);
3457 f->ImportFieldDefs(LibUtilities::XmlDataSource::create(m_session->GetDocument()),
3459 cout <<
" Number of elements: " << fielddefs.size() << endl;
3460 SetExpansionInfo(fielddefs);
3462 else if (expType ==
"F")
3464 ASSERTL0(expansion->Attribute(
"FILE"),
3465 "Attribute FILE expected for type F expansion");
3466 std::string filenameStr = expansion->Attribute(
"FILE");
3468 "A filename must be specified for the FILE "
3469 "attribute of expansion");
3471 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3473 LibUtilities::FieldIO::CreateForFile(m_session, filenameStr);
3474 f->Import(filenameStr, fielddefs);
3475 SetExpansionInfo(fielddefs);
3479 ASSERTL0(
false,
"Expansion type not defined");
3496 for (
int d = 0; d < m_domain.size(); ++d)
3498 for (
auto compIter = m_domain[d].begin(); compIter != m_domain[d].end();
3501 for (
auto &geomIter : compIter->second->m_geomVec)
3503 triGeomShPtr = std::dynamic_pointer_cast<TriGeom>(geomIter);
3504 quadGeomShPtr = std::dynamic_pointer_cast<QuadGeom>(geomIter);
3506 if (triGeomShPtr || quadGeomShPtr)
3510 for (
int i = 0; i < triGeomShPtr->GetNumEdges(); i++)
3512 if (triGeomShPtr->GetEdge(i)->GetGlobalID() ==
3513 edge->GetGlobalID())
3515 ret->push_back(make_pair(triGeomShPtr, i));
3520 else if (quadGeomShPtr)
3522 for (
int i = 0; i < quadGeomShPtr->GetNumEdges(); i++)
3524 if (quadGeomShPtr->GetEdge(i)->GetGlobalID() ==
3525 edge->GetGlobalID())
3527 ret->push_back(make_pair(quadGeomShPtr, i));
3541 const std::string variable)
3550 int edge_id = elmts->at(0).second;
3553 edge_id = (edge_id) ? 1 : 0;
3557 edge_id = edge_id % 2;
3559 int nummodes = expansion->m_basisKeyVector[edge_id].GetNumModes();
3560 int numpoints = expansion->m_basisKeyVector[edge_id].GetNumPoints();
3564 switch (expansion->m_basisKeyVector[edge_id].GetBasisType())
3568 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3575 expansion->m_basisKeyVector[0].GetBasisType(),
3580 ASSERTL0(
false,
"Unexpected points distribution");
3588 expansion->m_basisKeyVector[0].GetBasisType(),
3598 expansion->m_basisKeyVector[edge_id].GetPointsType())
3610 ASSERTL0(
false,
"Unexpected points distribution");
3619 expansion->m_basisKeyVector[0].GetBasisType(),
3627 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3634 expansion->m_basisKeyVector[0].GetBasisType(),
3643 expansion->m_basisKeyVector[0].GetBasisType(),
3648 ASSERTL0(
false,
"Unexpected points distribution");
3656 expansion->m_basisKeyVector[0].GetBasisType(),
3664 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3671 expansion->m_basisKeyVector[0].GetBasisType(),
3676 ASSERTL0(
false,
"Unexpected points distribution");
3684 expansion->m_basisKeyVector[0].GetBasisType(),
3691 ASSERTL0(
false,
"Unexpected basis distribution");
3698 expansion->m_basisKeyVector[0].GetBasisType(), nummodes,
3706 numpoints, expansion->m_basisKeyVector[edge_id].GetPointsType());
3708 expansion->m_basisKeyVector[edge_id].GetBasisType(), nummodes,
3712 ASSERTL0(
false,
"Unable to determine edge points type.");
3720 const std::string variable)
3726 "No elements for the given face."
3727 " Check all elements belong to the domain composite.");
3736 ASSERTL0(expansion,
"Could not find expansion connected to face " +
3737 boost::lexical_cast<string>(face->GetGlobalID()));
3740 std::dynamic_pointer_cast<SpatialDomains::Geometry3D>(
3741 expansion->m_geomShPtr);
3745 int dir = geom3d->GetDir(elements->at(0).second, facedir);
3747 if (face->GetNumVerts() == 3)
3750 facedir, expansion->m_basisKeyVector[dir].GetBasisType(),
3751 expansion->m_basisKeyVector[dir].GetNumPoints(),
3752 expansion->m_basisKeyVector[dir].GetNumModes());
3759 geom3d->GetForient(elements->at(0).second);
3763 dir = (dir == 0)? 1: 0;
3767 facedir, expansion->m_basisKeyVector[dir].GetBasisType(),
3768 expansion->m_basisKeyVector[dir].GetNumPoints(),
3769 expansion->m_basisKeyVector[dir].GetNumModes());
3778 auto it = m_faceToElMap.find(face->GetGlobalID());
3780 ASSERTL0(it != m_faceToElMap.end(),
"Unable to find corresponding face!");
3797 for (
int i = 0; i < kNfaces; ++i)
3799 int faceId = element->GetFace(i)->GetGlobalID();
3802 auto it = m_faceToElMap.find(faceId);
3804 if (it == m_faceToElMap.end())
3808 tmp->push_back(make_pair(element, i));
3809 m_faceToElMap[faceId] = tmp;
3813 it->second->push_back(make_pair(element, i));
3825 std::map<int, MeshEntity> MeshGraph::CreateMeshEntities()
3827 std::map<int, MeshEntity> elements;
3828 switch (m_meshDimension)
3832 for (
auto &i : m_segGeoms)
3836 e.
list.push_back(i.second->GetVertex(0)->GetGlobalID());
3837 e.
list.push_back(i.second->GetVertex(1)->GetGlobalID());
3845 for (
auto &i : m_triGeoms)
3849 e.
list.push_back(i.second->GetEdge(0)->GetGlobalID());
3850 e.
list.push_back(i.second->GetEdge(1)->GetGlobalID());
3851 e.
list.push_back(i.second->GetEdge(2)->GetGlobalID());
3855 for (
auto &i : m_quadGeoms)
3859 e.
list.push_back(i.second->GetEdge(0)->GetGlobalID());
3860 e.
list.push_back(i.second->GetEdge(1)->GetGlobalID());
3861 e.
list.push_back(i.second->GetEdge(2)->GetGlobalID());
3862 e.
list.push_back(i.second->GetEdge(3)->GetGlobalID());
3870 for (
auto &i : m_tetGeoms)
3874 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3875 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3876 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3877 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3881 for (
auto &i : m_pyrGeoms)
3885 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3886 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3887 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3888 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3889 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3893 for (
auto &i : m_prismGeoms)
3897 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3898 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3899 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3900 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3901 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3905 for (
auto &i : m_hexGeoms)
3909 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3910 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3911 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3912 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3913 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3914 e.
list.push_back(i.second->GetFace(5)->GetGlobalID());
3929 for (
auto &comp : m_meshComposites)
3931 std::pair<LibUtilities::ShapeType, vector<int>> tmp;
3932 tmp.first = comp.second->m_geomVec[0]->GetShapeType();
3934 tmp.second.resize(comp.second->m_geomVec.size());
3935 for (
size_t i = 0; i < tmp.second.size(); ++i)
3937 tmp.second[i] = comp.second->m_geomVec[i]->GetGlobalID();
3940 ret[comp.first] = tmp;
3950 m_domainRange->m_checkShape =
false;
3955 m_domainRange->m_doXrange =
true;
3958 m_domainRange->m_xmin = xmin;
3959 m_domainRange->m_xmax = xmax;
3963 m_domainRange->m_doYrange =
false;
3967 m_domainRange->m_doYrange =
true;
3968 m_domainRange->m_ymin = ymin;
3969 m_domainRange->m_ymax = ymax;
3974 m_domainRange->m_doZrange =
false;
3978 m_domainRange->m_doZrange =
true;
3979 m_domainRange->m_zmin = zmin;
3980 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.
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::vector< BasisKey > BasisKeyVector
Name for a vector of BasisKeys.
std::shared_ptr< DomainRange > DomainRangeShPtr
static DomainRangeShPtr NullDomainRangeShPtr
@ SIZE_PointsType
Length of enum list.
@ eFourierEvenlySpaced
1D Evenly-spaced points using Fourier Fit
@ eGaussRadauMAlpha2Beta0
Gauss Radau pinned at x=-1, .
@ 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
@ eGaussRadauMAlpha1Beta0
Gauss Radau pinned at x=-1, .
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< ExpansionInfoMap > ExpansionInfoMapShPtr
std::map< int, CompositeSharedPtr > CompositeMap
@ 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< Composite > CompositeSharedPtr
std::shared_ptr< Geometry1D > Geometry1DSharedPtr
std::map< int, ExpansionInfoShPtr > ExpansionInfoMap
std::shared_ptr< Geometry3D > Geometry3DSharedPtr
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