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;
294 m_domainRange->m_checkShape =
false;
299 m_domainRange->m_doXrange =
true;
302 m_domainRange->m_xmin = xmin;
303 m_domainRange->m_xmax = xmax;
307 m_domainRange->m_doYrange =
false;
311 m_domainRange->m_doYrange =
true;
312 m_domainRange->m_ymin = ymin;
313 m_domainRange->m_ymax = ymax;
318 m_domainRange->m_doZrange =
false;
322 m_domainRange->m_doZrange =
true;
323 m_domainRange->m_zmin = zmin;
324 m_domainRange->m_zmax = zmax;
328 int MeshGraph::GetNumElements()
330 switch (m_meshDimension)
334 return m_segGeoms.size();
339 return m_triGeoms.size() + m_quadGeoms.size();
344 return m_tetGeoms.size() + m_pyrGeoms.size() + m_prismGeoms.size() +
354 bool returnval =
true;
362 if (m_domainRange->m_doXrange)
366 for (
int i = 0; i < nverts; ++i)
369 if (xval < m_domainRange->m_xmin)
374 if (xval > m_domainRange->m_xmax)
383 if ((ncnt_up == nverts) || (ncnt_low == nverts))
390 if (m_domainRange->m_doYrange)
394 for (
int i = 0; i < nverts; ++i)
397 if (yval < m_domainRange->m_ymin)
402 if (yval > m_domainRange->m_ymax)
411 if ((ncnt_up == nverts) || (ncnt_low == nverts))
420 if (m_domainRange->m_doZrange)
425 for (
int i = 0; i < nverts; ++i)
429 if (zval < m_domainRange->m_zmin)
434 if (zval > m_domainRange->m_zmax)
443 if ((ncnt_up == nverts) || (ncnt_low == nverts))
456 bool returnval =
true;
462 if (m_domainRange->m_doXrange)
467 for (
int i = 0; i < nverts; ++i)
470 if (xval < m_domainRange->m_xmin)
475 if (xval > m_domainRange->m_xmax)
484 if ((ncnt_up == nverts) || (ncnt_low == nverts))
490 if (m_domainRange->m_doYrange)
494 for (
int i = 0; i < nverts; ++i)
497 if (yval < m_domainRange->m_ymin)
502 if (yval > m_domainRange->m_ymax)
511 if ((ncnt_up == nverts) || (ncnt_low == nverts))
517 if (m_domainRange->m_doZrange)
521 for (
int i = 0; i < nverts; ++i)
525 if (zval < m_domainRange->m_zmin)
530 if (zval > m_domainRange->m_zmax)
539 if ((ncnt_up == nverts) || (ncnt_low == nverts))
545 if (m_domainRange->m_checkShape)
565 if (whichComposite >= 0 && whichComposite <
int(m_meshComposites.size()))
567 if (whichItem >= 0 &&
568 whichItem <
int(m_meshComposites[whichComposite]->m_geomVec.size()))
570 returnval = m_meshComposites[whichComposite]->m_geomVec[whichItem];
584 std::ostringstream errStream;
585 errStream <<
"Unable to access composite item [" << whichComposite
586 <<
"][" << whichItem <<
"].";
588 std::string testStr = errStream.str();
590 NEKERROR(ErrorUtil::efatal, testStr.c_str());
599 void MeshGraph::GetCompositeList(
const std::string &compositeStr,
603 vector<unsigned int> seqVector;
605 ParseUtils::GenerateSeqVector(compositeStr.c_str(), seqVector);
608 parseGood && !seqVector.empty(),
609 (std::string(
"Unable to read composite index range: ") + compositeStr)
615 for (
auto iter = seqVector.begin(); iter != seqVector.end(); ++iter)
620 if (
std::find(addedVector.begin(), addedVector.end(), *iter) ==
626 if (m_meshComposites.find(*iter) == m_meshComposites.end() &&
632 addedVector.push_back(*iter);
633 ASSERTL0(m_meshComposites.find(*iter) != m_meshComposites.end(),
634 "Composite not found.");
639 compositeVector[*iter] = composite;
644 ::sprintf(str,
"%d", *iter);
646 (std::string(
"Undefined composite: ") + str).c_str());
655 const ExpansionMap &MeshGraph::GetExpansions(
const std::string variable)
659 if (m_expansionMapShPtrMap.count(variable))
661 returnval = m_expansionMapShPtrMap.find(variable)->second;
665 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
670 "Unable to find expansion vector definition for field: ") +
674 returnval = m_expansionMapShPtrMap.find(
"DefaultVar")->second;
675 m_expansionMapShPtrMap[variable] = returnval;
680 "Using Default variable expansion definition for field: ") +
692 const std::string variable)
695 m_expansionMapShPtrMap.find(variable)->second;
697 auto iter = expansionMap->find(geom->GetGlobalID());
698 ASSERTL1(iter != expansionMap->end(),
699 "Could not find expansion " +
700 boost::lexical_cast<string>(geom->GetGlobalID()) +
701 " in expansion for variable " + variable);
708 void MeshGraph::SetExpansions(
709 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef)
711 int i, j, k, cnt, id;
718 for (i = 0; i < fielddef.size(); ++i)
720 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
722 std::string field = fielddef[i]->m_fields[j];
723 if (m_expansionMapShPtrMap.count(field) == 0)
725 expansionMap = SetUpExpansionMap();
726 m_expansionMapShPtrMap[field] = expansionMap;
730 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
732 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
740 for (i = 0; i < fielddef.size(); ++i)
743 std::vector<std::string> fields = fielddef[i]->m_fields;
744 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
745 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
746 bool pointDef = fielddef[i]->m_pointsDef;
747 bool numPointDef = fielddef[i]->m_numPointsDef;
750 std::vector<unsigned int> npoints = fielddef[i]->m_numPoints;
751 std::vector<LibUtilities::PointsType> points = fielddef[i]->m_points;
753 bool UniOrder = fielddef[i]->m_uniOrder;
755 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
759 id = fielddef[i]->m_elementIDs[j];
761 switch (fielddef[i]->m_shapeType)
765 if (m_segGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
771 cnt += fielddef[i]->m_numHomogeneousDir;
775 geom = m_segGeoms[fielddef[i]->m_elementIDs[j]];
780 if (numPointDef && pointDef)
786 else if (!numPointDef && pointDef)
792 else if (numPointDef && !pointDef)
804 cnt += fielddef[i]->m_numHomogeneousDir;
806 bkeyvec.push_back(bkey);
811 if (m_triGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
817 cnt += fielddef[i]->m_numHomogeneousDir;
821 geom = m_triGeoms[fielddef[i]->m_elementIDs[j]];
825 if (numPointDef && pointDef)
831 else if (!numPointDef && pointDef)
837 else if (numPointDef && !pointDef)
845 bkeyvec.push_back(bkey);
849 if (numPointDef && pointDef)
855 else if (!numPointDef && pointDef)
861 else if (numPointDef && !pointDef)
870 bkeyvec.push_back(bkey1);
875 cnt += fielddef[i]->m_numHomogeneousDir;
881 if (m_quadGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
887 cnt += fielddef[i]->m_numHomogeneousDir;
892 geom = m_quadGeoms[fielddef[i]->m_elementIDs[j]];
894 for (
int b = 0; b < 2; ++b)
900 if (numPointDef && pointDef)
903 npoints[cnt + b], points[b]);
906 else if (!numPointDef && pointDef)
909 nmodes[cnt + b] + 1, points[b]);
912 else if (numPointDef && !pointDef)
921 bkeyvec.push_back(bkey);
927 cnt += fielddef[i]->m_numHomogeneousDir;
934 k = fielddef[i]->m_elementIDs[j];
939 if (m_tetGeoms.count(k) == 0)
947 geom = m_tetGeoms[k];
954 if (numPointDef && pointDef)
960 else if (!numPointDef && pointDef)
966 else if (numPointDef && !pointDef)
977 bkeyvec.push_back(bkey);
984 if (numPointDef && pointDef)
987 npoints[cnt + 1], points[1]);
990 else if (!numPointDef && pointDef)
993 nmodes[cnt + 1] + 1, points[1]);
996 else if (numPointDef && !pointDef)
1007 bkeyvec.push_back(bkey);
1015 if (numPointDef && pointDef)
1018 npoints[cnt + 2], points[2]);
1021 else if (!numPointDef && pointDef)
1024 nmodes[cnt + 2] + 1, points[2]);
1027 else if (numPointDef && !pointDef)
1038 bkeyvec.push_back(bkey);
1049 k = fielddef[i]->m_elementIDs[j];
1050 if (m_prismGeoms.count(k) == 0)
1058 geom = m_prismGeoms[k];
1060 for (
int b = 0; b < 2; ++b)
1063 nmodes[cnt + b] + 1,
1066 if (numPointDef && pointDef)
1069 npoints[cnt + b], points[b]);
1072 else if (!numPointDef && pointDef)
1075 nmodes[cnt + b] + 1, points[b]);
1078 else if (numPointDef && !pointDef)
1088 bkeyvec.push_back(bkey);
1096 if (numPointDef && pointDef)
1099 npoints[cnt + 2], points[2]);
1102 else if (!numPointDef && pointDef)
1105 nmodes[cnt + 2] + 1, points[2]);
1108 else if (numPointDef && !pointDef)
1118 bkeyvec.push_back(bkey);
1129 k = fielddef[i]->m_elementIDs[j];
1130 ASSERTL0(m_pyrGeoms.find(k) != m_pyrGeoms.end(),
1131 "Failed to find geometry with same global id");
1132 geom = m_pyrGeoms[k];
1134 for (
int b = 0; b < 2; ++b)
1137 nmodes[cnt + b] + 1,
1140 if (numPointDef && pointDef)
1143 npoints[cnt + b], points[b]);
1146 else if (!numPointDef && pointDef)
1149 nmodes[cnt + b] + 1, points[b]);
1152 else if (numPointDef && !pointDef)
1162 bkeyvec.push_back(bkey);
1170 if (numPointDef && pointDef)
1173 npoints[cnt + 2], points[2]);
1176 else if (!numPointDef && pointDef)
1179 nmodes[cnt + 2] + 1, points[2]);
1182 else if (numPointDef && !pointDef)
1192 bkeyvec.push_back(bkey);
1203 k = fielddef[i]->m_elementIDs[j];
1204 if (m_hexGeoms.count(k) == 0)
1213 geom = m_hexGeoms[k];
1215 for (
int b = 0; b < 3; ++b)
1221 if (numPointDef && pointDef)
1224 npoints[cnt + b], points[b]);
1227 else if (!numPointDef && pointDef)
1230 nmodes[cnt + b] + 1, points[b]);
1233 else if (numPointDef && !pointDef)
1243 bkeyvec.push_back(bkey);
1255 "Need to set up for pyramid and prism 3D Expansions");
1259 for (k = 0; k < fields.size(); ++k)
1261 expansionMap = m_expansionMapShPtrMap.find(fields[k])->second;
1262 if ((*expansionMap).find(
id) != (*expansionMap).end())
1264 (*expansionMap)[id]->m_geomShPtr = geom;
1265 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1275 void MeshGraph::SetExpansions(
1276 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef,
1277 std::vector<std::vector<LibUtilities::PointsType>> &pointstype)
1279 int i, j, k, cnt, id;
1286 for (i = 0; i < fielddef.size(); ++i)
1288 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
1290 std::string field = fielddef[i]->m_fields[j];
1291 if (m_expansionMapShPtrMap.count(field) == 0)
1293 expansionMap = SetUpExpansionMap();
1294 m_expansionMapShPtrMap[field] = expansionMap;
1298 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
1300 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
1308 for (i = 0; i < fielddef.size(); ++i)
1311 std::vector<std::string> fields = fielddef[i]->m_fields;
1312 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
1313 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
1314 bool UniOrder = fielddef[i]->m_uniOrder;
1316 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
1319 id = fielddef[i]->m_elementIDs[j];
1321 switch (fielddef[i]->m_shapeType)
1325 k = fielddef[i]->m_elementIDs[j];
1326 ASSERTL0(m_segGeoms.find(k) != m_segGeoms.end(),
1327 "Failed to find geometry with same global id.");
1328 geom = m_segGeoms[k];
1336 cnt += fielddef[i]->m_numHomogeneousDir;
1338 bkeyvec.push_back(bkey);
1343 k = fielddef[i]->m_elementIDs[j];
1344 ASSERTL0(m_triGeoms.find(k) != m_triGeoms.end(),
1345 "Failed to find geometry with same global id.");
1346 geom = m_triGeoms[k];
1347 for (
int b = 0; b < 2; ++b)
1353 bkeyvec.push_back(bkey);
1359 cnt += fielddef[i]->m_numHomogeneousDir;
1365 k = fielddef[i]->m_elementIDs[j];
1366 ASSERTL0(m_quadGeoms.find(k) != m_quadGeoms.end(),
1367 "Failed to find geometry with same global id");
1368 geom = m_quadGeoms[k];
1370 for (
int b = 0; b < 2; ++b)
1376 bkeyvec.push_back(bkey);
1382 cnt += fielddef[i]->m_numHomogeneousDir;
1388 k = fielddef[i]->m_elementIDs[j];
1389 ASSERTL0(m_tetGeoms.find(k) != m_tetGeoms.end(),
1390 "Failed to find geometry with same global id");
1391 geom = m_tetGeoms[k];
1393 for (
int b = 0; b < 3; ++b)
1399 bkeyvec.push_back(bkey);
1410 k = fielddef[i]->m_elementIDs[j];
1411 ASSERTL0(m_pyrGeoms.find(k) != m_pyrGeoms.end(),
1412 "Failed to find geometry with same global id");
1413 geom = m_pyrGeoms[k];
1415 for (
int b = 0; b < 3; ++b)
1421 bkeyvec.push_back(bkey);
1432 k = fielddef[i]->m_elementIDs[j];
1433 ASSERTL0(m_prismGeoms.find(k) != m_prismGeoms.end(),
1434 "Failed to find geometry with same global id");
1435 geom = m_prismGeoms[k];
1437 for (
int b = 0; b < 3; ++b)
1443 bkeyvec.push_back(bkey);
1454 k = fielddef[i]->m_elementIDs[j];
1455 ASSERTL0(m_hexGeoms.find(k) != m_hexGeoms.end(),
1456 "Failed to find geometry with same global id");
1457 geom = m_hexGeoms[k];
1459 for (
int b = 0; b < 3; ++b)
1465 bkeyvec.push_back(bkey);
1477 "Need to set up for pyramid and prism 3D Expansions");
1481 for (k = 0; k < fields.size(); ++k)
1483 expansionMap = m_expansionMapShPtrMap.find(fields[k])->second;
1484 if ((*expansionMap).find(
id) != (*expansionMap).end())
1486 (*expansionMap)[id]->m_geomShPtr = geom;
1487 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1499 void MeshGraph::SetExpansionsToEvenlySpacedPoints(
int npoints)
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];
1523 npts = max(npts, 2);
1529 expIt->second->m_basisKeyVector[i] = bkeynew;
1541 void MeshGraph::SetExpansionsToPolyOrder(
int nmodes)
1544 for (
auto it = m_expansionMapShPtrMap.begin();
1545 it != m_expansionMapShPtrMap.end(); ++it)
1547 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1550 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1553 expIt->second->m_basisKeyVector[i];
1562 expIt->second->m_basisKeyVector[i] = bkeynew;
1574 void MeshGraph::SetExpansionsToPointOrder(
int npts)
1577 for (
auto it = m_expansionMapShPtrMap.begin();
1578 it != m_expansionMapShPtrMap.end(); ++it)
1580 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1583 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1586 expIt->second->m_basisKeyVector[i];
1593 expIt->second->m_basisKeyVector[i] = bkeynew;
1616 for (
auto elemIter = expansionMap->begin(); elemIter != expansionMap->end();
1619 if ((elemIter->second)->m_geomShPtr->GetShapeType() == shape)
1621 (elemIter->second)->m_basisKeyVector = keys;
1665 nummodes + quadoffset,
1669 returnval.push_back(bkey);
1675 nummodes + quadoffset,
1679 returnval.push_back(bkey);
1680 returnval.push_back(bkey);
1686 nummodes + quadoffset,
1690 returnval.push_back(bkey);
1691 returnval.push_back(bkey);
1692 returnval.push_back(bkey);
1698 nummodes + quadoffset,
1702 returnval.push_back(bkey);
1705 nummodes + quadoffset - 1,
1710 returnval.push_back(bkey1);
1716 nummodes + quadoffset,
1720 returnval.push_back(bkey);
1723 nummodes + quadoffset - 1,
1727 returnval.push_back(bkey1);
1732 nummodes + quadoffset - 1,
1736 returnval.push_back(bkey2);
1741 nummodes + quadoffset - 1,
1745 returnval.push_back(bkey2);
1752 nummodes + quadoffset,
1756 returnval.push_back(bkey);
1757 returnval.push_back(bkey);
1760 nummodes + quadoffset,
1764 returnval.push_back(bkey1);
1770 nummodes + quadoffset,
1774 returnval.push_back(bkey);
1775 returnval.push_back(bkey);
1778 nummodes + quadoffset - 1,
1782 returnval.push_back(bkey1);
1788 "Expansion not defined in switch for this shape");
1805 returnval.push_back(bkey);
1814 returnval.push_back(bkey);
1815 returnval.push_back(bkey);
1825 returnval.push_back(bkey);
1831 returnval.push_back(bkey1);
1841 returnval.push_back(bkey);
1842 returnval.push_back(bkey);
1843 returnval.push_back(bkey);
1849 "Expansion not defined in switch for this shape");
1867 returnval.push_back(bkey);
1877 returnval.push_back(bkey);
1878 returnval.push_back(bkey);
1888 returnval.push_back(bkey);
1889 returnval.push_back(bkey);
1890 returnval.push_back(bkey);
1896 "Expansion not defined in switch for this shape");
1914 returnval.push_back(bkey);
1924 returnval.push_back(bkey);
1931 returnval.push_back(bkey1);
1941 returnval.push_back(bkey);
1942 returnval.push_back(bkey);
1952 returnval.push_back(bkey);
1959 returnval.push_back(bkey1);
1970 "Expansion not defined in switch for this shape");
1988 returnval.push_back(bkey);
1998 returnval.push_back(bkey);
1999 returnval.push_back(bkey);
2009 returnval.push_back(bkey);
2010 returnval.push_back(bkey);
2011 returnval.push_back(bkey);
2017 "Expansion not defined in switch for this shape");
2034 returnval.push_back(bkey);
2043 returnval.push_back(bkey);
2044 returnval.push_back(bkey);
2053 returnval.push_back(bkey);
2054 returnval.push_back(bkey);
2055 returnval.push_back(bkey);
2061 "Expansion not defined in switch for this shape");
2078 returnval.push_back(bkey);
2087 returnval.push_back(bkey);
2088 returnval.push_back(bkey);
2097 returnval.push_back(bkey);
2098 returnval.push_back(bkey);
2099 returnval.push_back(bkey);
2105 "Expansion not defined in switch for this shape");
2122 returnval.push_back(bkey);
2131 returnval.push_back(bkey);
2132 returnval.push_back(bkey);
2141 returnval.push_back(bkey);
2142 returnval.push_back(bkey);
2143 returnval.push_back(bkey);
2149 "Expansion not defined in switch for this shape");
2166 returnval.push_back(bkey);
2175 returnval.push_back(bkey);
2176 returnval.push_back(bkey);
2185 returnval.push_back(bkey);
2186 returnval.push_back(bkey);
2187 returnval.push_back(bkey);
2193 "Expansion not defined in switch for this shape");
2210 returnval.push_back(bkey);
2219 returnval.push_back(bkey);
2220 returnval.push_back(bkey);
2229 returnval.push_back(bkey);
2230 returnval.push_back(bkey);
2231 returnval.push_back(bkey);
2237 "Expansion not defined in switch for this shape");
2254 returnval.push_back(bkey);
2260 returnval.push_back(bkey1);
2266 "Expansion not defined in switch for this shape");
2283 returnval.push_back(bkey1);
2289 returnval.push_back(bkey);
2295 "Expansion not defined in switch for this shape");
2312 returnval.push_back(bkey);
2318 returnval.push_back(bkey1);
2324 "Expansion not defined in switch for this shape");
2333 ASSERTL0(
false,
"Expansion type not defined");
2346 ExpansionType type_z,
const int nummodes_x,
const int nummodes_y,
2347 const int nummodes_z)
2357 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2363 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2377 returnval.push_back(bkey1);
2387 returnval.push_back(bkey1);
2397 returnval.push_back(bkey1);
2407 returnval.push_back(bkey1);
2417 returnval.push_back(bkey1);
2423 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2424 "or Chebyshev type only");
2437 returnval.push_back(bkey2);
2447 returnval.push_back(bkey2);
2457 returnval.push_back(bkey2);
2467 returnval.push_back(bkey2);
2477 returnval.push_back(bkey2);
2483 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2484 "or Chebyshev type only");
2497 returnval.push_back(bkey3);
2507 returnval.push_back(bkey3);
2517 returnval.push_back(bkey3);
2527 returnval.push_back(bkey3);
2537 returnval.push_back(bkey3);
2543 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2544 "or Chebyshev type only");
2553 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2559 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2564 ASSERTL0(
false,
"Expansion not defined in switch for this shape");
2583 for (
int d = 0; d < m_domain.size(); ++d)
2585 for (
auto compIter = m_domain[d].begin(); compIter != m_domain[d].end();
2588 for (
auto x = compIter->second->m_geomVec.begin();
2589 x != compIter->second->m_geomVec.end(); ++x)
2594 int id = (*x)->GetGlobalID();
2595 (*returnval)[id] = expansionElementShPtr;
2608 if (comp->m_geomVec.size() == 0)
2615 map<LibUtilities::ShapeType, pair<string, string>> compMap;
2628 int shapeDim = firstGeom->GetShapeDim();
2629 string tag = (shapeDim < m_meshDimension)
2630 ? compMap[firstGeom->GetShapeType()].second
2631 : compMap[firstGeom->GetShapeType()].first;
2633 std::vector<unsigned int> idxList;
2635 comp->m_geomVec.begin(), comp->m_geomVec.end(),
2636 std::back_inserter(idxList),
2639 s <<
" " << tag <<
"[" << ParseUtils::GenerateSeqString(idxList) <<
"] ";
2643 void MeshGraph::ReadExpansions()
2646 TiXmlElement *expansionTypes = m_session->GetElement(
"NEKTAR/EXPANSIONS");
2647 ASSERTL0(expansionTypes,
"Unable to find EXPANSIONS tag in file.");
2652 TiXmlElement *expansion = expansionTypes->FirstChildElement();
2653 ASSERTL0(expansion,
"Unable to find entries in EXPANSIONS tag in "
2655 std::string expType = expansion->Value();
2656 std::vector<std::string> vars = m_session->GetVariables();
2661 m_expansionMapShPtrMap.clear();
2677 map<int, bool> domainCompList;
2678 for (
int d = 0; d < m_domain.size(); ++d)
2680 for (
auto c = m_domain[d].begin(); c != m_domain[d].end(); ++c)
2682 domainCompList[c->first] =
false;
2685 map<std::string, map<int, bool>> fieldDomainCompList;
2690 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
2691 ASSERTL0(compositeStr.length() > 3,
2692 "COMPOSITE must be specified in expansion definition");
2693 int beg = compositeStr.find_first_of(
"[");
2694 int end = compositeStr.find_first_of(
"]");
2695 std::string compositeListStr =
2696 compositeStr.substr(beg + 1, end - beg - 1);
2698 map<int, CompositeSharedPtr> compositeVector;
2699 GetCompositeList(compositeListStr, compositeVector);
2702 const char *fStr = expansion->Attribute(
"FIELDS");
2703 std::vector<std::string> fieldStrings;
2707 std::string fieldStr = fStr;
2708 bool valid = ParseUtils::GenerateVector(
2709 fieldStr.c_str(), fieldStrings);
2710 ASSERTL0(valid,
"Unable to correctly parse the field "
2711 "string in ExpansionTypes.");
2714 if(m_expansionMapShPtrMap.count(fieldStrings[0]))
2717 m_expansionMapShPtrMap.find(fieldStrings[0])
2722 expansionMap = SetUpExpansionMap();
2727 for (i = 0; i < fieldStrings.size(); ++i)
2729 if (vars.size() && std::count(vars.begin(), vars.end(),
2730 fieldStrings[i]) == 0)
2732 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
2733 "' defined in EXPANSIONS is not"
2734 " defined in VARIABLES.");
2737 if (m_expansionMapShPtrMap.count(fieldStrings[i]) == 0)
2739 m_expansionMapShPtrMap[fieldStrings[i]] =
2744 fieldDomainCompList[fieldStrings[i]] =
2746 for (
auto c = compositeVector.begin(); c !=
2747 compositeVector.end(); ++c)
2749 fieldDomainCompList.find(fieldStrings[i])
2750 ->second.find(c->first)
2756 for (
auto c = compositeVector.begin(); c !=
2757 compositeVector.end(); ++c)
2759 if (fieldDomainCompList.find(fieldStrings[i])
2760 ->second.find(c->first)->second ==
false)
2762 fieldDomainCompList.find(fieldStrings[i])
2763 ->second.find(c->first)->second =
true;
2767 ASSERTL0(
false,
"Expansion vector for "
2768 "variable '"+fieldStrings[i]
2769 +
"' is already setup for C["
2770 +to_string(c->first) +
"].");
2774 m_expansionMapShPtrMap.find(fieldStrings[i])
2781 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
2783 expansionMap = SetUpExpansionMap();
2784 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
2786 fieldDomainCompList[
"DefaultVar"] = domainCompList;
2787 for (
auto c = compositeVector.begin(); c !=
2788 compositeVector.end(); ++c)
2790 fieldDomainCompList.find(
"DefaultVar")
2791 ->second.find(c->first)->second =
true;
2796 for (
auto c = compositeVector.begin(); c !=
2797 compositeVector.end(); ++c)
2799 if (fieldDomainCompList.find(
"DefaultVar")
2800 ->second.find(c->first)->second ==
false)
2802 fieldDomainCompList.find(
"DefaultVar")
2803 ->second.find(c->first)->second =
true;
2807 ASSERTL0(
false,
"Default expansion already "
2809 to_string(c->first) +
"].");
2813 m_expansionMapShPtrMap.find(
"DefaultVar")
2819 bool useExpansionType =
false;
2824 const char *tStr = expansion->Attribute(
"TYPE");
2828 std::string typeStr = tStr;
2830 const std::string *endStr =
2832 const std::string *expStr =
2835 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
2850 const char *nStr = expansion->Attribute(
"NUMMODES");
2851 ASSERTL0(nStr,
"NUMMODES was not defined in EXPANSION "
2852 "section of input");
2853 std::string nummodesStr = nStr;
2860 num_modes = (int)nummodesEqn.
Evaluate();
2864 num_modes = boost::lexical_cast<int>(nummodesStr);
2867 useExpansionType =
true;
2872 const char *bTypeStr = expansion->Attribute(
"BASISTYPE");
2873 ASSERTL0(bTypeStr,
"TYPE or BASISTYPE was not defined in "
2874 "EXPANSION section of input");
2875 std::string basisTypeStr = bTypeStr;
2878 std::vector<std::string> basisStrings;
2879 std::vector<LibUtilities::BasisType> basis;
2880 bool valid = ParseUtils::GenerateVector(
2881 basisTypeStr.c_str(), basisStrings);
2883 "Unable to correctly parse the basis types.");
2884 for (vector<std::string>::size_type i = 0;
2885 i < basisStrings.size(); i++)
2888 for (
unsigned int j = 0;
2902 "Unable to correctly parse the basis type: ")
2903 .append(basisStrings[i])
2906 const char *nModesStr = expansion->Attribute(
"NUMMODES");
2907 ASSERTL0(nModesStr,
"NUMMODES was not defined in EXPANSION "
2908 "section of input");
2910 std::string numModesStr = nModesStr;
2911 std::vector<unsigned int> numModes;
2912 valid = ParseUtils::GenerateVector(
2913 numModesStr.c_str(), numModes);
2915 "Unable to correctly parse the number of modes.");
2916 ASSERTL0(numModes.size() == basis.size(),
2917 "information for num modes does not match the "
2920 const char *pTypeStr = expansion->Attribute(
"POINTSTYPE");
2921 ASSERTL0(pTypeStr,
"POINTSTYPE was not defined in "
2922 "EXPANSION section of input");
2923 std::string pointsTypeStr = pTypeStr;
2925 std::vector<std::string> pointsStrings;
2926 std::vector<LibUtilities::PointsType> points;
2927 valid = ParseUtils::GenerateVector(
2928 pointsTypeStr.c_str(), pointsStrings);
2930 "Unable to correctly parse the points types.");
2931 for (vector<std::string>::size_type i = 0;
2932 i < pointsStrings.size(); i++)
2935 for (
unsigned int j = 0;
2949 "Unable to correctly parse the points type: ")
2950 .append(pointsStrings[i])
2954 const char *nPointsStr = expansion->Attribute(
"NUMPOINTS");
2955 ASSERTL0(nPointsStr,
"NUMPOINTS was not defined in "
2956 "EXPANSION section of input");
2957 std::string numPointsStr = nPointsStr;
2958 std::vector<unsigned int> numPoints;
2959 valid = ParseUtils::GenerateVector(
2960 numPointsStr.c_str(), numPoints);
2962 "Unable to correctly parse the number of points.");
2963 ASSERTL0(numPoints.size() == numPoints.size(),
2964 "information for num points does not match the "
2967 for (
int i = 0; i < basis.size(); ++i)
2973 basis[i], numModes[i], pkey));
2981 for (
auto compVecIter = compositeVector.begin();
2982 compVecIter != compositeVector.end(); ++compVecIter)
2984 for (
auto geomVecIter =
2985 compVecIter->second->m_geomVec.begin();
2986 geomVecIter != compVecIter->second->m_geomVec.end();
2990 expansionMap->find((*geomVecIter)->GetGlobalID());
2992 "Expansion not found!!");
2993 if (useExpansionType)
2995 (x->second)->m_basisKeyVector =
2996 MeshGraph::DefineBasisKeyFromExpansionType(
2997 *geomVecIter, expansion_type, num_modes);
3001 ASSERTL0((*geomVecIter)->GetShapeDim() ==
3003 " There is an incompatible expansion "
3004 "dimension with geometry dimension");
3005 (x->second)->m_basisKeyVector = basiskeyvec;
3010 expansion = expansion->NextSiblingElement(
"E");
3016 for (
auto f = fieldDomainCompList.begin(); f !=
3017 fieldDomainCompList.end(); ++f)
3019 if (f->first !=
"DefaultVar")
3021 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3023 if (c->second ==
false &&
3024 fieldDomainCompList.find(
"DefaultVar")->second
3025 .find(c->first)->second ==
true)
3029 for (
auto geomVecIter = m_meshComposites.find(c->
3030 first)->second->m_geomVec.begin();
3031 geomVecIter != m_meshComposites.find(c->first)->
3032 second->m_geomVec.end();
3036 m_expansionMapShPtrMap.find(
"DefaultVar")->
3037 second->find((*geomVecIter)->GetGlobalID());
3040 m_expansionMapShPtrMap.find(f->first)->
3041 second->find((*geomVecIter)->GetGlobalID());
3043 (xField->second)->m_basisKeyVector =
3044 (xDefaultVar->second)->m_basisKeyVector;
3049 "Using Default expansion definition for "
3050 "field '") + f->first +
"' in composite "
3051 "C[" + to_string(c->first) +
"].").c_str());
3053 ASSERTL0(c->second,
"There is no expansion defined for "
3054 "variable '" + 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"))
3067 expansionMap = m_expansionMapShPtrMap.find(
"DefaultVar")
3069 m_expansionMapShPtrMap[vars[i]] = expansionMap;
3073 "Using Default expansion definition for field "
3074 "'") + vars[i] +
"'.").c_str());
3078 ASSERTL0(
false,
"Variable '" + vars[i] +
"' is missing"
3079 " in FIELDS attribute of EXPANSIONS"
3085 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3091 m_expansionMapShPtrMap.begin()->second;
3092 m_expansionMapShPtrMap[
"DefaultVar"] = firstEntryAddr;
3095 else if (expType ==
"H")
3098 m_expansionMapShPtrMap.clear();
3103 map<int, bool> domainCompList;
3104 for (
int d = 0; d < m_domain.size(); ++d)
3106 for (
auto c = m_domain[d].begin(); c != m_domain[d].end(); ++c)
3108 domainCompList[c->first] =
false;
3111 map<std::string, map<int, bool>> fieldDomainCompList;
3116 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
3117 ASSERTL0(compositeStr.length() > 3,
3118 "COMPOSITE must be specified in expansion definition");
3119 int beg = compositeStr.find_first_of(
"[");
3120 int end = compositeStr.find_first_of(
"]");
3121 std::string compositeListStr =
3122 compositeStr.substr(beg + 1, end - beg - 1);
3124 map<int, CompositeSharedPtr> compositeVector;
3125 GetCompositeList(compositeListStr, compositeVector);
3128 const char *fStr = expansion->Attribute(
"FIELDS");
3129 std::vector<std::string> fieldStrings;
3133 std::string fieldStr = fStr;
3134 bool valid = ParseUtils::GenerateVector(
3135 fieldStr.c_str(), fieldStrings);
3136 ASSERTL0(valid,
"Unable to correctly parse the field "
3137 "string in ExpansionTypes.");
3140 if(m_expansionMapShPtrMap.count(fieldStrings[0]))
3143 m_expansionMapShPtrMap.find(fieldStrings[0])
3148 expansionMap = SetUpExpansionMap();
3153 for (i = 0; i < fieldStrings.size(); ++i)
3155 if (vars.size() && std::count(vars.begin(), vars.end(),
3156 fieldStrings[i]) == 0)
3158 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
3159 "' defined in EXPANSIONS is not"
3160 " defined in VARIABLES.");
3163 if (m_expansionMapShPtrMap.count(fieldStrings[i]) == 0)
3165 m_expansionMapShPtrMap[fieldStrings[i]] =
3170 fieldDomainCompList[fieldStrings[i]] =
3172 for (
auto c = compositeVector.begin(); c !=
3173 compositeVector.end(); ++c)
3175 fieldDomainCompList.find(fieldStrings[i])
3176 ->second.find(c->first)
3182 for (
auto c = compositeVector.begin(); c !=
3183 compositeVector.end(); ++c)
3185 if (fieldDomainCompList.find(fieldStrings[i])
3186 ->second.find(c->first)->second ==
false)
3188 fieldDomainCompList.find(fieldStrings[i])
3189 ->second.find(c->first)->second =
true;
3193 ASSERTL0(
false,
"Expansion vector for "
3194 "variable '"+fieldStrings[i]
3195 +
"' is already setup for C["
3196 +to_string(c->first) +
"].");
3200 m_expansionMapShPtrMap.find(fieldStrings[i])
3207 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3209 expansionMap = SetUpExpansionMap();
3210 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
3212 fieldDomainCompList[
"DefaultVar"] = domainCompList;
3213 for (
auto c = compositeVector.begin(); c !=
3214 compositeVector.end(); ++c)
3216 fieldDomainCompList.find(
"DefaultVar")
3217 ->second.find(c->first)->second =
true;
3222 for (
auto c = compositeVector.begin(); c !=
3223 compositeVector.end(); ++c)
3225 if (fieldDomainCompList.find(
"DefaultVar")
3226 ->second.find(c->first)->second ==
false)
3228 fieldDomainCompList.find(
"DefaultVar")
3229 ->second.find(c->first)->second =
true;
3233 ASSERTL0(
false,
"Default expansion already "
3235 to_string(c->first) +
"].");
3239 m_expansionMapShPtrMap.find(
"DefaultVar")
3248 int num_modes_x = 0;
3249 int num_modes_y = 0;
3250 int num_modes_z = 0;
3254 const char *tStr_x = expansion->Attribute(
"TYPE-X");
3258 std::string typeStr = tStr_x;
3260 const std::string *endStr =
3262 const std::string *expStr =
3265 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3268 const char *nStr = expansion->Attribute(
"NUMMODES-X");
3269 ASSERTL0(nStr,
"NUMMODES-X was not defined in EXPANSION "
3270 "section of input");
3271 std::string nummodesStr = nStr;
3279 num_modes_x = (int)nummodesEqn.
Evaluate();
3283 num_modes_x = boost::lexical_cast<int>(nummodesStr);
3287 const char *tStr_y = expansion->Attribute(
"TYPE-Y");
3291 std::string typeStr = tStr_y;
3293 const std::string *endStr =
3295 const std::string *expStr =
3298 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3301 const char *nStr = expansion->Attribute(
"NUMMODES-Y");
3302 ASSERTL0(nStr,
"NUMMODES-Y was not defined in EXPANSION "
3303 "section of input");
3304 std::string nummodesStr = nStr;
3311 num_modes_y = (int)nummodesEqn.
Evaluate();
3315 num_modes_y = boost::lexical_cast<int>(nummodesStr);
3319 const char *tStr_z = expansion->Attribute(
"TYPE-Z");
3323 std::string typeStr = tStr_z;
3325 const std::string *endStr =
3327 const std::string *expStr =
3330 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3333 const char *nStr = expansion->Attribute(
"NUMMODES-Z");
3334 ASSERTL0(nStr,
"NUMMODES-Z was not defined in EXPANSION "
3335 "section of input");
3336 std::string nummodesStr = nStr;
3343 num_modes_z = (int)nummodesEqn.
Evaluate();
3347 num_modes_z = boost::lexical_cast<int>(nummodesStr);
3351 for (
auto compVecIter = compositeVector.begin();
3352 compVecIter != compositeVector.end(); ++compVecIter)
3354 for (
auto geomVecIter =
3355 compVecIter->second->m_geomVec.begin();
3356 geomVecIter != compVecIter->second->m_geomVec.end();
3359 for (
auto expVecIter = expansionMap->begin();
3360 expVecIter != expansionMap->end(); ++expVecIter)
3363 (expVecIter->second)->m_basisKeyVector =
3364 DefineBasisKeyFromExpansionTypeHomo(
3365 *geomVecIter, expansion_type_x,
3366 expansion_type_y, expansion_type_z,
3367 num_modes_x, num_modes_y, num_modes_z);
3372 expansion = expansion->NextSiblingElement(
"H");
3378 for (
auto f = fieldDomainCompList.begin(); f !=
3379 fieldDomainCompList.end(); ++f)
3381 if (f->first !=
"DefaultVar")
3383 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3385 if (c->second ==
false &&
3386 fieldDomainCompList.find(
"DefaultVar")->second
3387 .find(c->first)->second ==
true)
3391 for (
auto geomVecIter = m_meshComposites.find(c->
3392 first)->second->m_geomVec.begin();
3393 geomVecIter != m_meshComposites.find(c->first)->
3394 second->m_geomVec.end();
3398 m_expansionMapShPtrMap.find(
"DefaultVar")->
3399 second->find((*geomVecIter)->GetGlobalID());
3402 m_expansionMapShPtrMap.find(f->first)->
3403 second->find((*geomVecIter)->GetGlobalID());
3405 (xField->second)->m_basisKeyVector =
3406 (xDefaultVar->second)->m_basisKeyVector;
3411 "Using Default expansion definition for "
3412 "field '") + f->first +
"' in composite "
3413 "C[" + to_string(c->first) +
"].").c_str());
3415 ASSERTL0(c->second,
"There is no expansion defined for "
3416 "variable '" + f->first +
"' in C["+
3417 to_string(c->first) +
"].");
3423 for (i = 0; i < vars.size(); ++i)
3425 if (m_expansionMapShPtrMap.count(vars[i]) == 0)
3427 if (m_expansionMapShPtrMap.count(
"DefaultVar"))
3429 expansionMap = m_expansionMapShPtrMap.find(
"DefaultVar")
3431 m_expansionMapShPtrMap[vars[i]] = expansionMap;
3435 "Using Default expansion definition for field "
3436 "'") + vars[i] +
"'.").c_str());
3440 ASSERTL0(
false,
"Variable '" + vars[i] +
"' is missing"
3441 " in FIELDS attribute of EXPANSIONS"
3447 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3455 m_expansionMapShPtrMap.begin()->second;
3456 m_expansionMapShPtrMap[
"DefaultVar"] = firstEntryAddr;
3462 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3466 std::shared_ptr<LibUtilities::FieldIOXml> f =
3467 make_shared<LibUtilities::FieldIOXml>(m_session->GetComm(),
false);
3468 f->ImportFieldDefs(LibUtilities::XmlDataSource::create(m_session->GetDocument()),
3470 cout <<
" Number of elements: " << fielddefs.size() << endl;
3471 SetExpansions(fielddefs);
3473 else if (expType ==
"F")
3475 ASSERTL0(expansion->Attribute(
"FILE"),
3476 "Attribute FILE expected for type F expansion");
3477 std::string filenameStr = expansion->Attribute(
"FILE");
3479 "A filename must be specified for the FILE "
3480 "attribute of expansion");
3482 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3484 LibUtilities::FieldIO::CreateForFile(m_session, filenameStr);
3485 f->Import(filenameStr, fielddefs);
3486 SetExpansions(fielddefs);
3490 ASSERTL0(
false,
"Expansion type not defined");
3507 for (
int d = 0; d < m_domain.size(); ++d)
3509 for (
auto compIter = m_domain[d].begin(); compIter != m_domain[d].end();
3512 for (
auto &geomIter : compIter->second->m_geomVec)
3514 triGeomShPtr = std::dynamic_pointer_cast<TriGeom>(geomIter);
3515 quadGeomShPtr = std::dynamic_pointer_cast<QuadGeom>(geomIter);
3517 if (triGeomShPtr || quadGeomShPtr)
3521 for (
int i = 0; i < triGeomShPtr->GetNumEdges(); i++)
3523 if (triGeomShPtr->GetEdge(i)->GetGlobalID() ==
3524 edge->GetGlobalID())
3526 ret->push_back(make_pair(triGeomShPtr, i));
3531 else if (quadGeomShPtr)
3533 for (
int i = 0; i < quadGeomShPtr->GetNumEdges(); i++)
3535 if (quadGeomShPtr->GetEdge(i)->GetGlobalID() ==
3536 edge->GetGlobalID())
3538 ret->push_back(make_pair(quadGeomShPtr, i));
3552 const std::string variable)
3561 int edge_id = elmts->at(0).second;
3564 edge_id = (edge_id) ? 1 : 0;
3568 edge_id = edge_id % 2;
3570 int nummodes = expansion->m_basisKeyVector[edge_id].GetNumModes();
3571 int numpoints = expansion->m_basisKeyVector[edge_id].GetNumPoints();
3575 switch (expansion->m_basisKeyVector[edge_id].GetBasisType())
3579 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3586 expansion->m_basisKeyVector[0].GetBasisType(),
3591 ASSERTL0(
false,
"Unexpected points distribution");
3599 expansion->m_basisKeyVector[0].GetBasisType(),
3609 expansion->m_basisKeyVector[edge_id].GetPointsType())
3621 ASSERTL0(
false,
"Unexpected points distribution");
3630 expansion->m_basisKeyVector[0].GetBasisType(),
3638 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3645 expansion->m_basisKeyVector[0].GetBasisType(),
3654 expansion->m_basisKeyVector[0].GetBasisType(),
3659 ASSERTL0(
false,
"Unexpected points distribution");
3667 expansion->m_basisKeyVector[0].GetBasisType(),
3675 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3682 expansion->m_basisKeyVector[0].GetBasisType(),
3687 ASSERTL0(
false,
"Unexpected points distribution");
3695 expansion->m_basisKeyVector[0].GetBasisType(),
3702 ASSERTL0(
false,
"Unexpected basis distribution");
3709 expansion->m_basisKeyVector[0].GetBasisType(), nummodes,
3717 numpoints, expansion->m_basisKeyVector[edge_id].GetPointsType());
3719 expansion->m_basisKeyVector[edge_id].GetBasisType(), nummodes,
3723 ASSERTL0(
false,
"Unable to determine edge points type.");
3731 const std::string variable)
3737 "No elements for the given face."
3738 " Check all elements belong to the domain composite.");
3747 ASSERTL0(expansion,
"Could not find expansion connected to face " +
3748 boost::lexical_cast<string>(face->GetGlobalID()));
3751 std::dynamic_pointer_cast<SpatialDomains::Geometry3D>(
3752 expansion->m_geomShPtr);
3756 int dir = geom3d->GetDir(elements->at(0).second, facedir);
3757 if (face->GetNumVerts() == 3)
3760 facedir, expansion->m_basisKeyVector[dir].GetBasisType(),
3761 expansion->m_basisKeyVector[dir].GetNumPoints(),
3762 expansion->m_basisKeyVector[dir].GetNumModes());
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;
#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.
@ 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::map< int, ExpansionShPtr > ExpansionMap
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< DomainRange > DomainRangeShPtr
std::map< int, CompositeSharedPtr > CompositeMap
std::shared_ptr< SegGeom > SegGeomSharedPtr
std::shared_ptr< ExpansionMap > ExpansionMapShPtr
const std::string kExpansionTypeStr[]
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
static DomainRangeShPtr NullDomainRangeShPtr
std::shared_ptr< Expansion > ExpansionShPtr
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::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)
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