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 std::string expType = expansion->Value();
2673 const char *fStr = expansion->Attribute(
"FIELDS");
2674 std::vector<std::string> fieldStrings;
2678 std::string fieldStr = fStr;
2679 bool valid = ParseUtils::GenerateVector(
2680 fieldStr.c_str(), fieldStrings);
2681 ASSERTL0(valid,
"Unable to correctly parse the field " 2682 "string in ExpansionTypes.");
2688 if (m_expansionMapShPtrMap.count(
"DefaultVar") ==
2691 expansionMap = SetUpExpansionMap();
2693 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
2697 for (i = 0; i < fieldStrings.size(); ++i)
2699 m_expansionMapShPtrMap[fieldStrings[i]] = expansionMap;
2705 if (fieldStrings.size())
2708 if (m_expansionMapShPtrMap.count(fieldStrings[0]))
2711 m_expansionMapShPtrMap.find(fieldStrings[0])
2716 expansionMap = SetUpExpansionMap();
2719 for (i = 0; i < fieldStrings.size(); ++i)
2721 if (m_expansionMapShPtrMap.count(
2722 fieldStrings[i]) == 0)
2724 m_expansionMapShPtrMap[fieldStrings[i]] =
2729 ASSERTL0(
false,
"Expansion vector for this " 2730 "field is already setup");
2738 m_expansionMapShPtrMap.find(
"DefaultVar")->second;
2743 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
2744 ASSERTL0(compositeStr.length() > 3,
2745 "COMPOSITE must be specified in expansion definition");
2746 int beg = compositeStr.find_first_of(
"[");
2747 int end = compositeStr.find_first_of(
"]");
2748 std::string compositeListStr =
2749 compositeStr.substr(beg + 1, end - beg - 1);
2751 map<int, CompositeSharedPtr> compositeVector;
2752 GetCompositeList(compositeListStr, compositeVector);
2754 bool useExpansionType =
false;
2759 const char *tStr = expansion->Attribute(
"TYPE");
2763 std::string typeStr = tStr;
2765 const std::string *endStr =
2767 const std::string *expStr =
2770 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
2785 const char *nStr = expansion->Attribute(
"NUMMODES");
2786 ASSERTL0(nStr,
"NUMMODES was not defined in EXPANSION " 2787 "section of input");
2788 std::string nummodesStr = nStr;
2795 num_modes = (int)nummodesEqn.
Evaluate();
2799 num_modes = boost::lexical_cast<
int>(nummodesStr);
2802 useExpansionType =
true;
2807 const char *bTypeStr = expansion->Attribute(
"BASISTYPE");
2808 ASSERTL0(bTypeStr,
"TYPE or BASISTYPE was not defined in " 2809 "EXPANSION section of input");
2810 std::string basisTypeStr = bTypeStr;
2813 std::vector<std::string> basisStrings;
2814 std::vector<LibUtilities::BasisType> basis;
2815 bool valid = ParseUtils::GenerateVector(
2816 basisTypeStr.c_str(), basisStrings);
2818 "Unable to correctly parse the basis types.");
2819 for (vector<std::string>::size_type i = 0;
2820 i < basisStrings.size(); i++)
2823 for (
unsigned int j = 0;
2837 "Unable to correctly parse the basis type: ")
2838 .append(basisStrings[i])
2841 const char *nModesStr = expansion->Attribute(
"NUMMODES");
2842 ASSERTL0(nModesStr,
"NUMMODES was not defined in EXPANSION " 2843 "section of input");
2845 std::string numModesStr = nModesStr;
2846 std::vector<unsigned int> numModes;
2847 valid = ParseUtils::GenerateVector(
2848 numModesStr.c_str(), numModes);
2850 "Unable to correctly parse the number of modes.");
2851 ASSERTL0(numModes.size() == basis.size(),
2852 "information for num modes does not match the " 2855 const char *pTypeStr = expansion->Attribute(
"POINTSTYPE");
2856 ASSERTL0(pTypeStr,
"POINTSTYPE was not defined in " 2857 "EXPANSION section of input");
2858 std::string pointsTypeStr = pTypeStr;
2860 std::vector<std::string> pointsStrings;
2861 std::vector<LibUtilities::PointsType> points;
2862 valid = ParseUtils::GenerateVector(
2863 pointsTypeStr.c_str(), pointsStrings);
2865 "Unable to correctly parse the points types.");
2866 for (vector<std::string>::size_type i = 0;
2867 i < pointsStrings.size(); i++)
2870 for (
unsigned int j = 0;
2884 "Unable to correctly parse the points type: ")
2885 .append(pointsStrings[i])
2889 const char *nPointsStr = expansion->Attribute(
"NUMPOINTS");
2890 ASSERTL0(nPointsStr,
"NUMPOINTS was not defined in " 2891 "EXPANSION section of input");
2892 std::string numPointsStr = nPointsStr;
2893 std::vector<unsigned int> numPoints;
2894 valid = ParseUtils::GenerateVector(
2895 numPointsStr.c_str(), numPoints);
2897 "Unable to correctly parse the number of points.");
2898 ASSERTL0(numPoints.size() == numPoints.size(),
2899 "information for num points does not match the " 2902 for (
int i = 0; i < basis.size(); ++i)
2908 basis[i], numModes[i], pkey));
2916 for (
auto compVecIter = compositeVector.begin();
2917 compVecIter != compositeVector.end(); ++compVecIter)
2919 for (
auto geomVecIter =
2920 compVecIter->second->m_geomVec.begin();
2921 geomVecIter != compVecIter->second->m_geomVec.end();
2925 expansionMap->find((*geomVecIter)->GetGlobalID());
2927 "Expansion not found!!");
2928 if (useExpansionType)
2930 (x->second)->m_basisKeyVector =
2931 MeshGraph::DefineBasisKeyFromExpansionType(
2932 *geomVecIter, expansion_type, num_modes);
2936 ASSERTL0((*geomVecIter)->GetShapeDim() ==
2938 " There is an incompatible expansion " 2939 "dimension with geometry dimension");
2940 (x->second)->m_basisKeyVector = basiskeyvec;
2945 expansion = expansion->NextSiblingElement(
"E");
2948 else if (expType ==
"H")
2956 const char *fStr = expansion->Attribute(
"FIELDS");
2957 std::vector<std::string> fieldStrings;
2961 std::string fieldStr = fStr;
2962 bool valid = ParseUtils::GenerateVector(
2963 fieldStr.c_str(), fieldStrings);
2964 ASSERTL0(valid,
"Unable to correctly parse the field " 2965 "string in ExpansionTypes.");
2971 if (m_expansionMapShPtrMap.count(
"DefaultVar") ==
2974 expansionMap = SetUpExpansionMap();
2976 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
2980 for (i = 0; i < fieldStrings.size(); ++i)
2982 m_expansionMapShPtrMap[fieldStrings[i]] = expansionMap;
2988 if (fieldStrings.size())
2991 if (m_expansionMapShPtrMap.count(fieldStrings[0]))
2994 m_expansionMapShPtrMap.find(fieldStrings[0])
2999 expansionMap = SetUpExpansionMap();
3002 for (i = 0; i < fieldStrings.size(); ++i)
3004 if (m_expansionMapShPtrMap.count(
3005 fieldStrings[i]) == 0)
3007 m_expansionMapShPtrMap[fieldStrings[i]] =
3012 ASSERTL0(
false,
"Expansion vector for this " 3013 "field is already setup");
3021 m_expansionMapShPtrMap.find(
"DefaultVar")->second;
3026 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
3027 ASSERTL0(compositeStr.length() > 3,
3028 "COMPOSITE must be specified in expansion definition");
3029 int beg = compositeStr.find_first_of(
"[");
3030 int end = compositeStr.find_first_of(
"]");
3031 std::string compositeListStr =
3032 compositeStr.substr(beg + 1, end - beg - 1);
3034 map<int, CompositeSharedPtr> compositeVector;
3035 GetCompositeList(compositeListStr, compositeVector);
3040 int num_modes_x = 0;
3041 int num_modes_y = 0;
3042 int num_modes_z = 0;
3046 const char *tStr_x = expansion->Attribute(
"TYPE-X");
3050 std::string typeStr = tStr_x;
3052 const std::string *endStr =
3054 const std::string *expStr =
3057 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3060 const char *nStr = expansion->Attribute(
"NUMMODES-X");
3061 ASSERTL0(nStr,
"NUMMODES-X was not defined in EXPANSION " 3062 "section of input");
3063 std::string nummodesStr = nStr;
3071 num_modes_x = (int)nummodesEqn.
Evaluate();
3075 num_modes_x = boost::lexical_cast<
int>(nummodesStr);
3079 const char *tStr_y = expansion->Attribute(
"TYPE-Y");
3083 std::string typeStr = tStr_y;
3085 const std::string *endStr =
3087 const std::string *expStr =
3090 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3093 const char *nStr = expansion->Attribute(
"NUMMODES-Y");
3094 ASSERTL0(nStr,
"NUMMODES-Y was not defined in EXPANSION " 3095 "section of input");
3096 std::string nummodesStr = nStr;
3103 num_modes_y = (int)nummodesEqn.
Evaluate();
3107 num_modes_y = boost::lexical_cast<
int>(nummodesStr);
3111 const char *tStr_z = expansion->Attribute(
"TYPE-Z");
3115 std::string typeStr = tStr_z;
3117 const std::string *endStr =
3119 const std::string *expStr =
3122 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3125 const char *nStr = expansion->Attribute(
"NUMMODES-Z");
3126 ASSERTL0(nStr,
"NUMMODES-Z was not defined in EXPANSION " 3127 "section of input");
3128 std::string nummodesStr = nStr;
3135 num_modes_z = (int)nummodesEqn.
Evaluate();
3139 num_modes_z = boost::lexical_cast<
int>(nummodesStr);
3143 for (
auto compVecIter = compositeVector.begin();
3144 compVecIter != compositeVector.end(); ++compVecIter)
3146 for (
auto geomVecIter =
3147 compVecIter->second->m_geomVec.begin();
3148 geomVecIter != compVecIter->second->m_geomVec.end();
3151 for (
auto expVecIter = expansionMap->begin();
3152 expVecIter != expansionMap->end(); ++expVecIter)
3155 (expVecIter->second)->m_basisKeyVector =
3156 DefineBasisKeyFromExpansionTypeHomo(
3157 *geomVecIter, expansion_type_x,
3158 expansion_type_y, expansion_type_z,
3159 num_modes_x, num_modes_y, num_modes_z);
3164 expansion = expansion->NextSiblingElement(
"H");
3170 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3174 std::shared_ptr<LibUtilities::FieldIOXml> f =
3175 make_shared<LibUtilities::FieldIOXml>(m_session->GetComm(),
false);
3176 f->ImportFieldDefs(LibUtilities::XmlDataSource::create(m_session->GetDocument()),
3178 cout <<
" Number of elements: " << fielddefs.size() << endl;
3179 SetExpansions(fielddefs);
3181 else if (expType ==
"F")
3183 ASSERTL0(expansion->Attribute(
"FILE"),
3184 "Attribute FILE expected for type F expansion");
3185 std::string filenameStr = expansion->Attribute(
"FILE");
3187 "A filename must be specified for the FILE " 3188 "attribute of expansion");
3190 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3192 LibUtilities::FieldIO::CreateForFile(m_session, filenameStr);
3193 f->Import(filenameStr, fielddefs);
3194 SetExpansions(fielddefs);
3198 ASSERTL0(
false,
"Expansion type not defined");
3215 for (
int d = 0; d < m_domain.size(); ++d)
3217 for (
auto compIter = m_domain[d].begin(); compIter != m_domain[d].end();
3220 for (
auto &geomIter : compIter->second->m_geomVec)
3222 triGeomShPtr = std::dynamic_pointer_cast<
TriGeom>(geomIter);
3223 quadGeomShPtr = std::dynamic_pointer_cast<
QuadGeom>(geomIter);
3225 if (triGeomShPtr || quadGeomShPtr)
3229 for (
int i = 0; i < triGeomShPtr->GetNumEdges(); i++)
3231 if (triGeomShPtr->GetEdge(i)->GetGlobalID() ==
3232 edge->GetGlobalID())
3234 ret->push_back(make_pair(triGeomShPtr, i));
3239 else if (quadGeomShPtr)
3241 for (
int i = 0; i < quadGeomShPtr->GetNumEdges(); i++)
3243 if (quadGeomShPtr->GetEdge(i)->GetGlobalID() ==
3244 edge->GetGlobalID())
3246 ret->push_back(make_pair(quadGeomShPtr, i));
3260 const std::string variable)
3269 int edge_id = elmts->at(0).second;
3272 edge_id = (edge_id) ? 1 : 0;
3276 edge_id = edge_id % 2;
3278 int nummodes = expansion->m_basisKeyVector[edge_id].GetNumModes();
3279 int numpoints = expansion->m_basisKeyVector[edge_id].GetNumPoints();
3283 switch (expansion->m_basisKeyVector[edge_id].GetBasisType())
3287 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3294 expansion->m_basisKeyVector[0].GetBasisType(),
3299 ASSERTL0(
false,
"Unexpected points distribution");
3307 expansion->m_basisKeyVector[0].GetBasisType(),
3317 expansion->m_basisKeyVector[edge_id].GetPointsType())
3329 ASSERTL0(
false,
"Unexpected points distribution");
3338 expansion->m_basisKeyVector[0].GetBasisType(),
3346 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3353 expansion->m_basisKeyVector[0].GetBasisType(),
3362 expansion->m_basisKeyVector[0].GetBasisType(),
3367 ASSERTL0(
false,
"Unexpected points distribution");
3375 expansion->m_basisKeyVector[0].GetBasisType(),
3383 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3390 expansion->m_basisKeyVector[0].GetBasisType(),
3395 ASSERTL0(
false,
"Unexpected points distribution");
3403 expansion->m_basisKeyVector[0].GetBasisType(),
3410 ASSERTL0(
false,
"Unexpected basis distribution");
3417 expansion->m_basisKeyVector[0].GetBasisType(), nummodes,
3425 numpoints, expansion->m_basisKeyVector[edge_id].GetPointsType());
3427 expansion->m_basisKeyVector[edge_id].GetBasisType(), nummodes,
3431 ASSERTL0(
false,
"Unable to determine edge points type.");
3439 const std::string variable)
3445 "No elements for the given face." 3446 " Check all elements belong to the domain composite.");
3455 ASSERTL0(expansion,
"Could not find expansion connected to face " +
3456 boost::lexical_cast<string>(face->GetGlobalID()));
3460 expansion->m_geomShPtr);
3464 int dir = geom3d->
GetDir(elements->at(0).second, facedir);
3465 if (face->GetNumVerts() == 3)
3468 facedir, expansion->m_basisKeyVector[dir].GetBasisType(),
3469 expansion->m_basisKeyVector[dir].GetNumPoints(),
3470 expansion->m_basisKeyVector[dir].GetNumModes());
3475 facedir, expansion->m_basisKeyVector[dir].GetBasisType(),
3476 expansion->m_basisKeyVector[dir].GetNumPoints(),
3477 expansion->m_basisKeyVector[dir].GetNumModes());
3486 auto it = m_faceToElMap.find(face->GetGlobalID());
3488 ASSERTL0(it != m_faceToElMap.end(),
"Unable to find corresponding face!");
3505 for (
int i = 0; i < kNfaces; ++i)
3507 int faceId = element->GetFace(i)->GetGlobalID();
3510 auto it = m_faceToElMap.find(faceId);
3512 if (it == m_faceToElMap.end())
3516 tmp->push_back(make_pair(element, i));
3517 m_faceToElMap[faceId] = tmp;
3521 it->second->push_back(make_pair(element, i));
3533 std::map<int, MeshEntity> MeshGraph::CreateMeshEntities()
3535 std::map<int, MeshEntity> elements;
3536 switch (m_meshDimension)
3540 for (
auto &i : m_segGeoms)
3544 e.
list.push_back(i.second->GetVertex(0)->GetGlobalID());
3545 e.
list.push_back(i.second->GetVertex(1)->GetGlobalID());
3553 for (
auto &i : m_triGeoms)
3557 e.
list.push_back(i.second->GetEdge(0)->GetGlobalID());
3558 e.
list.push_back(i.second->GetEdge(1)->GetGlobalID());
3559 e.
list.push_back(i.second->GetEdge(2)->GetGlobalID());
3563 for (
auto &i : m_quadGeoms)
3567 e.
list.push_back(i.second->GetEdge(0)->GetGlobalID());
3568 e.
list.push_back(i.second->GetEdge(1)->GetGlobalID());
3569 e.
list.push_back(i.second->GetEdge(2)->GetGlobalID());
3570 e.
list.push_back(i.second->GetEdge(3)->GetGlobalID());
3578 for (
auto &i : m_tetGeoms)
3582 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3583 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3584 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3585 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3589 for (
auto &i : m_pyrGeoms)
3593 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3594 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3595 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3596 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3597 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3601 for (
auto &i : m_prismGeoms)
3605 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3606 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3607 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3608 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3609 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3613 for (
auto &i : m_hexGeoms)
3617 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3618 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3619 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3620 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3621 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3622 e.
list.push_back(i.second->GetFace(5)->GetGlobalID());
3637 for (
auto &comp : m_meshComposites)
3639 std::pair<LibUtilities::ShapeType, vector<int>> tmp;
3640 tmp.first = comp.second->m_geomVec[0]->GetShapeType();
3642 tmp.second.resize(comp.second->m_geomVec.size());
3643 for (
size_t i = 0; i < tmp.second.size(); ++i)
3645 tmp.second[i] = comp.second->m_geomVec[i]->GetGlobalID();
3648 ret[comp.first] = tmp;
int GetNumPoints() const
Return points order at which basis is defined.
int GetDir(const int faceidx, const int facedir) const
Returns the element coordinate direction corresponding to a given face coordinate direction...
#define ASSERTL0(condition, msg)
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
Principle Modified Functions .
std::shared_ptr< Geometry3D > Geometry3DSharedPtr
std::shared_ptr< Geometry2D > Geometry2DSharedPtr
const char *const BasisTypeMap[]
Principle Modified Functions .
std::shared_ptr< std::vector< std::pair< GeometrySharedPtr, int > > > GeometryLinkSharedPtr
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
const std::string kPointsTypeStr[]
std::shared_ptr< QuadGeom > QuadGeomSharedPtr
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
BasisType GetBasisType() const
Return type of expansion basis.
std::pair< BgBox, int > BgRtreeValue
Principle Modified Functions .
Lagrange Polynomials using the Gauss points .
std::map< int, CompositeSharedPtr > CompositeMap
std::shared_ptr< Composite > CompositeSharedPtr
std::shared_ptr< DomainRange > DomainRangeShPtr
1D Gauss-Gauss-Legendre quadrature points
Gauss Radau pinned at x=-1, .
bg::model::box< BgPoint > BgBox
Principle Orthogonal Functions .
1D Evenly-spaced points using Lagrange polynomial
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
int GetCoordim() const
Return the coordinate dimension of this object (i.e. the dimension of the space in which this object ...
std::shared_ptr< TriGeom > TriGeomSharedPtr
1D Evenly-spaced points using Fourier Fit
int GetNumModes() const
Returns the order of the basis.
Fourier Modified expansions with just the real part of the first mode .
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
Principle Modified Functions .
PointsType GetPointsType() const
Return type of quadrature.
MeshGraphFactory & GetMeshGraphFactory()
std::shared_ptr< Geometry > GeometrySharedPtr
Principle Orthogonal Functions .
Principle Orthogonal Functions .
1D Gauss-Gauss-Chebyshev quadrature points
std::vector< unsigned int > list
Defines a specification for a set of points.
NekDouble Evaluate() const
std::vector< BasisKey > BasisKeyVector
Name for a vector of BasisKeys.
std::shared_ptr< PointGeom > PointGeomSharedPtr
std::shared_ptr< Expansion > ExpansionShPtr
bg::index::rtree< BgRtreeValue, bg::index::rstar< 16, 4 > > m_bgTree
static const NekDouble kNekUnsetDouble
int GetNumVerts() const
Get the number of vertices of this object.
std::map< int, std::pair< LibUtilities::ShapeType, std::vector< int > > > CompositeDescriptor
Fourier Modified expansions with just the imaginary part of the first mode .
static DomainRangeShPtr NullDomainRangeShPtr
Fourier ModifiedExpansion with just the first mode .
1D Non Evenly-spaced points for Single Mode analysis
Gauss Radau pinned at x=-1, .
bg::model::point< NekDouble, 3, bg::cs::cartesian > BgPoint
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
std::shared_ptr< Geometry1D > Geometry1DSharedPtr
std::shared_ptr< ExpansionMap > ExpansionMapShPtr
const std::string kExpansionTypeStr[]
std::shared_ptr< FieldIO > FieldIOSharedPtr
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
std::shared_ptr< SegGeom > SegGeomSharedPtr
PointGeomSharedPtr GetVertex(int i) const
Returns vertex i of this object.
Describes the specification for a Basis.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
void InsertGeom(GeometrySharedPtr const &geom)
LibUtilities::ShapeType GetShapeType(void)
Get the geometric shape type of this object.
1D Gauss-Lobatto-Legendre quadrature points
std::map< int, ExpansionShPtr > ExpansionMap
Provides a generic Factory class.