52 #include <boost/archive/iterators/base64_from_binary.hpp>
53 #include <boost/archive/iterators/binary_from_base64.hpp>
54 #include <boost/archive/iterators/transform_width.hpp>
55 #include <boost/iostreams/copy.hpp>
56 #include <boost/iostreams/filter/zlib.hpp>
57 #include <boost/iostreams/filtering_stream.hpp>
59 #include <boost/geometry/geometry.hpp>
60 #include <boost/geometry/index/rtree.hpp>
61 namespace bg = boost::geometry;
67 namespace SpatialDomains
81 typedef bg::model::point<NekDouble, 3, bg::cs::cartesian>
BgPoint;
82 typedef bg::model::box<BgPoint>
BgBox;
85 bg::index::rtree<BgRtreeValue, bg::index::rstar<16, 4>>
m_bgTree;
89 std::array<NekDouble, 6> minMax = geom->GetBoundingBox();
90 BgPoint ptMin(minMax[0], minMax[1], minMax[2]);
91 BgPoint ptMax(minMax[3], minMax[4], minMax[5]);
93 std::make_pair(
BgBox(ptMin, ptMax), geom->GetGlobalID()));
97 MeshGraph::MeshGraph()
106 MeshGraph::~MeshGraph()
115 ASSERTL0(comm.get(),
"Communication not initialised.");
120 const bool isRoot = comm->TreatAsRankZero();
121 std::string geomType;
126 session->InitSession();
129 geomType = session->GetGeometryType();
132 std::vector<char> v(geomType.c_str(),
133 geomType.c_str() + geomType.length());
135 size_t length = v.size();
136 comm->Bcast(length, 0);
142 comm->Bcast(length, 0);
144 std::vector<char> v(length);
147 geomType = std::string(v.begin(), v.end());
154 mesh->PartitionMesh(session);
157 mesh->ReadGeometry(rng, fillGraph);
162 void MeshGraph::FillGraph()
166 switch (m_meshDimension)
170 for (
auto &x : m_pyrGeoms)
174 for (
auto &x : m_prismGeoms)
178 for (
auto &x : m_tetGeoms)
182 for (
auto &x : m_hexGeoms)
190 for (
auto &x : m_triGeoms)
194 for (
auto &x : m_quadGeoms)
202 for (
auto x : m_segGeoms)
211 void MeshGraph::FillBoundingBoxTree()
214 m_boundingBoxTree->m_bgTree.clear();
215 switch (m_meshDimension)
218 for (
auto &x : m_segGeoms)
220 m_boundingBoxTree->InsertGeom(x.second);
224 for (
auto &x : m_triGeoms)
226 m_boundingBoxTree->InsertGeom(x.second);
228 for (
auto &x : m_quadGeoms)
230 m_boundingBoxTree->InsertGeom(x.second);
234 for (
auto &x : m_tetGeoms)
236 m_boundingBoxTree->InsertGeom(x.second);
238 for (
auto &x : m_prismGeoms)
240 m_boundingBoxTree->InsertGeom(x.second);
242 for (
auto &x : m_pyrGeoms)
244 m_boundingBoxTree->InsertGeom(x.second);
246 for (
auto &x : m_hexGeoms)
248 m_boundingBoxTree->InsertGeom(x.second);
258 if (m_boundingBoxTree->m_bgTree.empty())
260 FillBoundingBoxTree();
266 std::vector<GeomRTree::BgRtreeValue> matches;
268 p->GetCoords(x, y, z);
273 m_boundingBoxTree->m_bgTree.query(bg::index::intersects(b),
274 std::back_inserter(matches));
276 std::vector<int> vals(matches.size());
278 for (
int i = 0; i < matches.size(); ++i)
280 vals[i] = matches[i].second;
286 int MeshGraph::GetNumElements()
288 switch (m_meshDimension)
292 return m_segGeoms.size();
297 return m_triGeoms.size() + m_quadGeoms.size();
302 return m_tetGeoms.size() + m_pyrGeoms.size() + m_prismGeoms.size() +
312 bool returnval =
true;
320 if (m_domainRange->m_doXrange)
324 for (
int i = 0; i < nverts; ++i)
327 if (xval < m_domainRange->m_xmin)
332 if (xval > m_domainRange->m_xmax)
341 if ((ncnt_up == nverts) || (ncnt_low == nverts))
348 if (m_domainRange->m_doYrange)
352 for (
int i = 0; i < nverts; ++i)
355 if (yval < m_domainRange->m_ymin)
360 if (yval > m_domainRange->m_ymax)
369 if ((ncnt_up == nverts) || (ncnt_low == nverts))
378 if (m_domainRange->m_doZrange)
383 for (
int i = 0; i < nverts; ++i)
387 if (zval < m_domainRange->m_zmin)
392 if (zval > m_domainRange->m_zmax)
401 if ((ncnt_up == nverts) || (ncnt_low == nverts))
414 bool returnval =
true;
420 if (m_domainRange->m_doXrange)
425 for (
int i = 0; i < nverts; ++i)
428 if (xval < m_domainRange->m_xmin)
433 if (xval > m_domainRange->m_xmax)
442 if ((ncnt_up == nverts) || (ncnt_low == nverts))
448 if (m_domainRange->m_doYrange)
452 for (
int i = 0; i < nverts; ++i)
455 if (yval < m_domainRange->m_ymin)
460 if (yval > m_domainRange->m_ymax)
469 if ((ncnt_up == nverts) || (ncnt_low == nverts))
475 if (m_domainRange->m_doZrange)
479 for (
int i = 0; i < nverts; ++i)
483 if (zval < m_domainRange->m_zmin)
488 if (zval > m_domainRange->m_zmax)
497 if ((ncnt_up == nverts) || (ncnt_low == nverts))
503 if (m_domainRange->m_checkShape)
523 if (whichComposite >= 0 && whichComposite <
int(m_meshComposites.size()))
525 if (whichItem >= 0 &&
526 whichItem <
int(m_meshComposites[whichComposite]->m_geomVec.size()))
528 returnval = m_meshComposites[whichComposite]->m_geomVec[whichItem];
542 std::ostringstream errStream;
543 errStream <<
"Unable to access composite item [" << whichComposite
544 <<
"][" << whichItem <<
"].";
546 std::string testStr = errStream.str();
548 NEKERROR(ErrorUtil::efatal, testStr.c_str());
557 void MeshGraph::GetCompositeList(
const std::string &compositeStr,
561 vector<unsigned int> seqVector;
563 ParseUtils::GenerateSeqVector(compositeStr.c_str(), seqVector);
566 parseGood && !seqVector.empty(),
567 (std::string(
"Unable to read composite index range: ") + compositeStr)
570 vector<unsigned int> addedVector;
572 for (
auto iter = seqVector.begin(); iter != seqVector.end(); ++iter)
577 if (
std::find(addedVector.begin(), addedVector.end(), *iter) ==
583 if (m_meshComposites.find(*iter) == m_meshComposites.end() &&
589 addedVector.push_back(*iter);
590 ASSERTL0(m_meshComposites.find(*iter) != m_meshComposites.end(),
591 "Composite not found.");
596 compositeVector[*iter] = composite;
601 ::sprintf(str,
"%d", *iter);
603 (std::string(
"Undefined composite: ") + str).c_str());
616 if (m_expansionMapShPtrMap.count(variable))
618 returnval = m_expansionMapShPtrMap.find(variable)->second;
622 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
627 "Unable to find expansion vector definition for field: ") +
631 returnval = m_expansionMapShPtrMap.find(
"DefaultVar")->second;
632 m_expansionMapShPtrMap[variable] = returnval;
637 "Using Default variable expansion definition for field: ") +
649 const std::string variable)
652 m_expansionMapShPtrMap.find(variable)->second;
654 auto iter = expansionMap->find(geom->GetGlobalID());
655 ASSERTL1(iter != expansionMap->end(),
656 "Could not find expansion " +
657 boost::lexical_cast<string>(geom->GetGlobalID()) +
658 " in expansion for variable " + variable);
665 void MeshGraph::SetExpansionInfo(
666 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef)
668 int i, j, k, cnt, id;
675 for (i = 0; i < fielddef.size(); ++i)
677 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
679 std::string field = fielddef[i]->m_fields[j];
680 if (m_expansionMapShPtrMap.count(field) == 0)
682 expansionMap = SetUpExpansionInfoMap();
683 m_expansionMapShPtrMap[field] = expansionMap;
687 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
689 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
697 for (i = 0; i < fielddef.size(); ++i)
700 std::vector<std::string> fields = fielddef[i]->m_fields;
701 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
702 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
703 bool pointDef = fielddef[i]->m_pointsDef;
704 bool numPointDef = fielddef[i]->m_numPointsDef;
707 std::vector<unsigned int> npoints = fielddef[i]->m_numPoints;
708 std::vector<LibUtilities::PointsType> points = fielddef[i]->m_points;
710 bool UniOrder = fielddef[i]->m_uniOrder;
712 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
716 id = fielddef[i]->m_elementIDs[j];
718 switch (fielddef[i]->m_shapeType)
722 if (m_segGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
728 cnt += fielddef[i]->m_numHomogeneousDir;
732 geom = m_segGeoms[fielddef[i]->m_elementIDs[j]];
737 if (numPointDef && pointDef)
743 else if (!numPointDef && pointDef)
749 else if (numPointDef && !pointDef)
761 cnt += fielddef[i]->m_numHomogeneousDir;
763 bkeyvec.push_back(bkey);
768 if (m_triGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
774 cnt += fielddef[i]->m_numHomogeneousDir;
778 geom = m_triGeoms[fielddef[i]->m_elementIDs[j]];
782 if (numPointDef && pointDef)
788 else if (!numPointDef && pointDef)
794 else if (numPointDef && !pointDef)
802 bkeyvec.push_back(bkey);
805 nmodes[cnt + 1], LibUtilities::eGaussRadauMAlpha1Beta0);
806 if (numPointDef && pointDef)
812 else if (!numPointDef && pointDef)
818 else if (numPointDef && !pointDef)
822 LibUtilities::eGaussRadauMAlpha1Beta0);
827 bkeyvec.push_back(bkey1);
832 cnt += fielddef[i]->m_numHomogeneousDir;
838 if (m_quadGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
844 cnt += fielddef[i]->m_numHomogeneousDir;
849 geom = m_quadGeoms[fielddef[i]->m_elementIDs[j]];
851 for (
int b = 0; b < 2; ++b)
857 if (numPointDef && pointDef)
860 npoints[cnt + b], points[b]);
863 else if (!numPointDef && pointDef)
866 nmodes[cnt + b] + 1, points[b]);
869 else if (numPointDef && !pointDef)
878 bkeyvec.push_back(bkey);
884 cnt += fielddef[i]->m_numHomogeneousDir;
891 k = fielddef[i]->m_elementIDs[j];
896 if (m_tetGeoms.count(k) == 0)
904 geom = m_tetGeoms[k];
911 if (numPointDef && pointDef)
917 else if (!numPointDef && pointDef)
923 else if (numPointDef && !pointDef)
934 bkeyvec.push_back(bkey);
939 LibUtilities::eGaussRadauMAlpha1Beta0);
941 if (numPointDef && pointDef)
944 npoints[cnt + 1], points[1]);
947 else if (!numPointDef && pointDef)
950 nmodes[cnt + 1] + 1, points[1]);
953 else if (numPointDef && !pointDef)
957 LibUtilities::eGaussRadauMAlpha1Beta0);
964 bkeyvec.push_back(bkey);
970 LibUtilities::eGaussRadauMAlpha2Beta0);
972 if (numPointDef && pointDef)
975 npoints[cnt + 2], points[2]);
978 else if (!numPointDef && pointDef)
981 nmodes[cnt + 2] + 1, points[2]);
984 else if (numPointDef && !pointDef)
988 LibUtilities::eGaussRadauMAlpha1Beta0);
995 bkeyvec.push_back(bkey);
1006 k = fielddef[i]->m_elementIDs[j];
1007 if (m_prismGeoms.count(k) == 0)
1015 geom = m_prismGeoms[k];
1017 for (
int b = 0; b < 2; ++b)
1020 nmodes[cnt + b] + 1,
1023 if (numPointDef && pointDef)
1026 npoints[cnt + b], points[b]);
1029 else if (!numPointDef && pointDef)
1032 nmodes[cnt + b] + 1, points[b]);
1035 else if (numPointDef && !pointDef)
1045 bkeyvec.push_back(bkey);
1051 LibUtilities::eGaussRadauMAlpha1Beta0);
1053 if (numPointDef && pointDef)
1056 npoints[cnt + 2], points[2]);
1059 else if (!numPointDef && pointDef)
1062 nmodes[cnt + 2] + 1, points[2]);
1065 else if (numPointDef && !pointDef)
1075 bkeyvec.push_back(bkey);
1086 k = fielddef[i]->m_elementIDs[j];
1087 ASSERTL0(m_pyrGeoms.find(k) != m_pyrGeoms.end(),
1088 "Failed to find geometry with same global id");
1089 geom = m_pyrGeoms[k];
1091 for (
int b = 0; b < 2; ++b)
1094 nmodes[cnt + b] + 1,
1097 if (numPointDef && pointDef)
1100 npoints[cnt + b], points[b]);
1103 else if (!numPointDef && pointDef)
1106 nmodes[cnt + b] + 1, points[b]);
1109 else if (numPointDef && !pointDef)
1119 bkeyvec.push_back(bkey);
1125 LibUtilities::eGaussRadauMAlpha2Beta0);
1127 if (numPointDef && pointDef)
1130 npoints[cnt + 2], points[2]);
1133 else if (!numPointDef && pointDef)
1136 nmodes[cnt + 2] + 1, points[2]);
1139 else if (numPointDef && !pointDef)
1149 bkeyvec.push_back(bkey);
1160 k = fielddef[i]->m_elementIDs[j];
1161 if (m_hexGeoms.count(k) == 0)
1170 geom = m_hexGeoms[k];
1172 for (
int b = 0; b < 3; ++b)
1178 if (numPointDef && pointDef)
1181 npoints[cnt + b], points[b]);
1184 else if (!numPointDef && pointDef)
1187 nmodes[cnt + b] + 1, points[b]);
1190 else if (numPointDef && !pointDef)
1200 bkeyvec.push_back(bkey);
1210 ASSERTL0(
false,
"Need to set up for pyramid and prism 3D "
1215 for (k = 0; k < fields.size(); ++k)
1217 expansionMap = m_expansionMapShPtrMap.find(fields[k])->second;
1218 if ((*expansionMap).find(
id) != (*expansionMap).end())
1220 (*expansionMap)[id]->m_geomShPtr = geom;
1221 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1231 void MeshGraph::SetExpansionInfo(
1232 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef,
1233 std::vector<std::vector<LibUtilities::PointsType>> &pointstype)
1235 int i, j, k, cnt, id;
1242 for (i = 0; i < fielddef.size(); ++i)
1244 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
1246 std::string field = fielddef[i]->m_fields[j];
1247 if (m_expansionMapShPtrMap.count(field) == 0)
1249 expansionMap = SetUpExpansionInfoMap();
1250 m_expansionMapShPtrMap[field] = expansionMap;
1254 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
1256 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
1264 for (i = 0; i < fielddef.size(); ++i)
1267 std::vector<std::string> fields = fielddef[i]->m_fields;
1268 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
1269 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
1270 bool UniOrder = fielddef[i]->m_uniOrder;
1272 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
1275 id = fielddef[i]->m_elementIDs[j];
1277 switch (fielddef[i]->m_shapeType)
1281 k = fielddef[i]->m_elementIDs[j];
1282 ASSERTL0(m_segGeoms.find(k) != m_segGeoms.end(),
1283 "Failed to find geometry with same global id.");
1284 geom = m_segGeoms[k];
1292 cnt += fielddef[i]->m_numHomogeneousDir;
1294 bkeyvec.push_back(bkey);
1299 k = fielddef[i]->m_elementIDs[j];
1300 ASSERTL0(m_triGeoms.find(k) != m_triGeoms.end(),
1301 "Failed to find geometry with same global id.");
1302 geom = m_triGeoms[k];
1303 for (
int b = 0; b < 2; ++b)
1309 bkeyvec.push_back(bkey);
1315 cnt += fielddef[i]->m_numHomogeneousDir;
1321 k = fielddef[i]->m_elementIDs[j];
1322 ASSERTL0(m_quadGeoms.find(k) != m_quadGeoms.end(),
1323 "Failed to find geometry with same global id");
1324 geom = m_quadGeoms[k];
1326 for (
int b = 0; b < 2; ++b)
1332 bkeyvec.push_back(bkey);
1338 cnt += fielddef[i]->m_numHomogeneousDir;
1344 k = fielddef[i]->m_elementIDs[j];
1345 ASSERTL0(m_tetGeoms.find(k) != m_tetGeoms.end(),
1346 "Failed to find geometry with same global id");
1347 geom = m_tetGeoms[k];
1349 for (
int b = 0; b < 3; ++b)
1355 bkeyvec.push_back(bkey);
1366 k = fielddef[i]->m_elementIDs[j];
1367 ASSERTL0(m_pyrGeoms.find(k) != m_pyrGeoms.end(),
1368 "Failed to find geometry with same global id");
1369 geom = m_pyrGeoms[k];
1371 for (
int b = 0; b < 3; ++b)
1377 bkeyvec.push_back(bkey);
1388 k = fielddef[i]->m_elementIDs[j];
1389 ASSERTL0(m_prismGeoms.find(k) != m_prismGeoms.end(),
1390 "Failed to find geometry with same global id");
1391 geom = m_prismGeoms[k];
1393 for (
int b = 0; b < 3; ++b)
1399 bkeyvec.push_back(bkey);
1410 k = fielddef[i]->m_elementIDs[j];
1411 ASSERTL0(m_hexGeoms.find(k) != m_hexGeoms.end(),
1412 "Failed to find geometry with same global id");
1413 geom = m_hexGeoms[k];
1415 for (
int b = 0; b < 3; ++b)
1421 bkeyvec.push_back(bkey);
1431 ASSERTL0(
false,
"Need to set up for pyramid and prism 3D "
1436 for (k = 0; k < fields.size(); ++k)
1438 expansionMap = m_expansionMapShPtrMap.find(fields[k])->second;
1439 if ((*expansionMap).find(
id) != (*expansionMap).end())
1441 (*expansionMap)[id]->m_geomShPtr = geom;
1442 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1454 void MeshGraph::SetExpansionInfoToEvenlySpacedPoints(
int npoints)
1457 for (
auto it = m_expansionMapShPtrMap.begin();
1458 it != m_expansionMapShPtrMap.end(); ++it)
1460 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1463 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1466 expIt->second->m_basisKeyVector[i];
1478 npts = max(npts, 2);
1484 expIt->second->m_basisKeyVector[i] = bkeynew;
1496 void MeshGraph::SetExpansionInfoToNumModes(
int nmodes)
1499 for (
auto it = m_expansionMapShPtrMap.begin();
1500 it != m_expansionMapShPtrMap.end(); ++it)
1502 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1505 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1508 expIt->second->m_basisKeyVector[i];
1517 expIt->second->m_basisKeyVector[i] = bkeynew;
1529 void MeshGraph::SetExpansionInfoToPointOrder(
int npts)
1532 for (
auto it = m_expansionMapShPtrMap.begin();
1533 it != m_expansionMapShPtrMap.end(); ++it)
1535 for (
auto expIt = it->second->begin(); expIt != it->second->end();
1538 for (
int i = 0; i < expIt->second->m_basisKeyVector.size(); ++i)
1541 expIt->second->m_basisKeyVector[i];
1548 expIt->second->m_basisKeyVector[i] = bkeynew;
1570 m_expansionMapShPtrMap.find(var)->second;
1571 ResetExpansionInfoToBasisKey(expansionMap, shape, keys);
1574 void MeshGraph::ResetExpansionInfoToBasisKey(
1578 for (
auto elemIter = expansionMap->begin(); elemIter != expansionMap->end();
1581 if ((elemIter->second)->m_geomShPtr->GetShapeType() == shape)
1583 (elemIter->second)->m_basisKeyVector = keys;
1627 nummodes + quadoffset,
1631 returnval.push_back(bkey);
1637 nummodes + quadoffset,
1641 returnval.push_back(bkey);
1642 returnval.push_back(bkey);
1648 nummodes + quadoffset,
1652 returnval.push_back(bkey);
1653 returnval.push_back(bkey);
1654 returnval.push_back(bkey);
1660 nummodes + quadoffset,
1664 returnval.push_back(bkey);
1667 nummodes + quadoffset - 1,
1668 LibUtilities::eGaussRadauMAlpha1Beta0);
1672 returnval.push_back(bkey1);
1678 nummodes + quadoffset,
1682 returnval.push_back(bkey);
1685 nummodes + quadoffset - 1,
1686 LibUtilities::eGaussRadauMAlpha1Beta0);
1689 returnval.push_back(bkey1);
1694 nummodes + quadoffset - 1,
1695 LibUtilities::eGaussRadauMAlpha1Beta0);
1698 returnval.push_back(bkey2);
1703 nummodes + quadoffset - 1,
1704 LibUtilities::eGaussRadauMAlpha2Beta0);
1707 returnval.push_back(bkey2);
1714 nummodes + quadoffset,
1718 returnval.push_back(bkey);
1719 returnval.push_back(bkey);
1722 nummodes + quadoffset,
1723 LibUtilities::eGaussRadauMAlpha2Beta0);
1726 returnval.push_back(bkey1);
1732 nummodes + quadoffset,
1736 returnval.push_back(bkey);
1737 returnval.push_back(bkey);
1740 nummodes + quadoffset - 1,
1741 LibUtilities::eGaussRadauMAlpha1Beta0);
1744 returnval.push_back(bkey1);
1750 "Expansion not defined in switch for this shape");
1767 returnval.push_back(bkey);
1776 returnval.push_back(bkey);
1777 returnval.push_back(bkey);
1787 returnval.push_back(bkey);
1790 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1793 returnval.push_back(bkey1);
1803 returnval.push_back(bkey);
1804 returnval.push_back(bkey);
1805 returnval.push_back(bkey);
1811 "Expansion not defined in switch for this shape");
1829 returnval.push_back(bkey);
1839 returnval.push_back(bkey);
1840 returnval.push_back(bkey);
1850 returnval.push_back(bkey);
1851 returnval.push_back(bkey);
1852 returnval.push_back(bkey);
1858 "Expansion not defined in switch for this shape");
1876 returnval.push_back(bkey);
1886 returnval.push_back(bkey);
1889 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1893 returnval.push_back(bkey1);
1903 returnval.push_back(bkey);
1904 returnval.push_back(bkey);
1914 returnval.push_back(bkey);
1917 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1921 returnval.push_back(bkey1);
1924 nummodes, LibUtilities::eGaussRadauMAlpha2Beta0);
1932 "Expansion not defined in switch for this shape");
1950 returnval.push_back(bkey);
1960 returnval.push_back(bkey);
1961 returnval.push_back(bkey);
1971 returnval.push_back(bkey);
1972 returnval.push_back(bkey);
1973 returnval.push_back(bkey);
1979 "Expansion not defined in switch for this shape");
1996 returnval.push_back(bkey);
2005 returnval.push_back(bkey);
2006 returnval.push_back(bkey);
2015 returnval.push_back(bkey);
2016 returnval.push_back(bkey);
2017 returnval.push_back(bkey);
2023 "Expansion not defined in switch for this shape");
2040 returnval.push_back(bkey);
2049 returnval.push_back(bkey);
2050 returnval.push_back(bkey);
2059 returnval.push_back(bkey);
2060 returnval.push_back(bkey);
2061 returnval.push_back(bkey);
2067 "Expansion not defined in switch for this shape");
2084 returnval.push_back(bkey);
2093 returnval.push_back(bkey);
2094 returnval.push_back(bkey);
2103 returnval.push_back(bkey);
2104 returnval.push_back(bkey);
2105 returnval.push_back(bkey);
2111 "Expansion not defined in switch for this shape");
2128 returnval.push_back(bkey);
2137 returnval.push_back(bkey);
2138 returnval.push_back(bkey);
2147 returnval.push_back(bkey);
2148 returnval.push_back(bkey);
2149 returnval.push_back(bkey);
2155 "Expansion not defined in switch for this shape");
2172 returnval.push_back(bkey);
2181 returnval.push_back(bkey);
2182 returnval.push_back(bkey);
2191 returnval.push_back(bkey);
2192 returnval.push_back(bkey);
2193 returnval.push_back(bkey);
2199 "Expansion not defined in switch for this shape");
2216 returnval.push_back(bkey);
2222 returnval.push_back(bkey1);
2228 "Expansion not defined in switch for this shape");
2245 returnval.push_back(bkey1);
2251 returnval.push_back(bkey);
2257 "Expansion not defined in switch for this shape");
2274 returnval.push_back(bkey);
2280 returnval.push_back(bkey1);
2286 "Expansion not defined in switch for this shape");
2295 ASSERTL0(
false,
"Expansion type not defined");
2308 ExpansionType type_z,
const int nummodes_x,
const int nummodes_y,
2309 const int nummodes_z)
2319 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2325 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2339 returnval.push_back(bkey1);
2349 returnval.push_back(bkey1);
2359 returnval.push_back(bkey1);
2369 returnval.push_back(bkey1);
2379 returnval.push_back(bkey1);
2385 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2386 "or Chebyshev type only");
2399 returnval.push_back(bkey2);
2409 returnval.push_back(bkey2);
2419 returnval.push_back(bkey2);
2429 returnval.push_back(bkey2);
2439 returnval.push_back(bkey2);
2445 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2446 "or Chebyshev type only");
2459 returnval.push_back(bkey3);
2469 returnval.push_back(bkey3);
2479 returnval.push_back(bkey3);
2489 returnval.push_back(bkey3);
2499 returnval.push_back(bkey3);
2505 ASSERTL0(
false,
"Homogeneous expansion can be of Fourier "
2506 "or Chebyshev type only");
2515 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2521 ASSERTL0(
false,
"Homogeneous expansion not defined for this shape");
2526 ASSERTL0(
false,
"Expansion not defined in switch for this shape");
2545 for (
auto &d : m_domain)
2547 for (
auto compIter = d.second.begin(); compIter != d.second.end();
2551 for (
auto x = compIter->second->m_geomVec.begin();
2552 x != compIter->second->m_geomVec.end(); ++x)
2554 if ((*x)->GetGeomFactors()->GetGtype() !=
2561 int id = (*x)->GetGlobalID();
2562 (*returnval)[id] = expansionElementShPtr;
2566 for (
auto x = compIter->second->m_geomVec.begin();
2567 x != compIter->second->m_geomVec.end(); ++x)
2569 if ((*x)->GetGeomFactors()->GetGtype() ==
2576 int id = (*x)->GetGlobalID();
2577 (*returnval)[id] = expansionElementShPtr;
2591 if (comp->m_geomVec.size() == 0)
2598 map<LibUtilities::ShapeType, pair<string, string>> compMap;
2611 int shapeDim = firstGeom->GetShapeDim();
2612 string tag = (shapeDim < m_meshDimension)
2613 ? compMap[firstGeom->GetShapeType()].second
2614 : compMap[firstGeom->GetShapeType()].first;
2616 std::vector<unsigned int> idxList;
2617 std::transform(comp->m_geomVec.begin(), comp->m_geomVec.end(),
2618 std::back_inserter(idxList),
2621 s <<
" " << tag <<
"[" << ParseUtils::GenerateSeqString(idxList) <<
"] ";
2625 void MeshGraph::ReadExpansionInfo()
2628 TiXmlElement *expansionTypes = m_session->GetElement(
"NEKTAR/EXPANSIONS");
2629 ASSERTL0(expansionTypes,
"Unable to find EXPANSIONS tag in file.");
2634 TiXmlElement *expansion = expansionTypes->FirstChildElement();
2635 ASSERTL0(expansion,
"Unable to find entries in EXPANSIONS tag in "
2637 std::string expType = expansion->Value();
2638 std::vector<std::string> vars = m_session->GetVariables();
2643 m_expansionMapShPtrMap.clear();
2659 map<int, bool> domainCompList;
2660 for (
auto &d : m_domain)
2662 for (
auto &c : d.second)
2664 domainCompList[c.first] =
false;
2667 map<std::string, map<int, bool>> fieldDomainCompList;
2672 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
2673 ASSERTL0(compositeStr.length() > 3,
2674 "COMPOSITE must be specified in expansion definition");
2675 int beg = compositeStr.find_first_of(
"[");
2676 int end = compositeStr.find_first_of(
"]");
2677 std::string compositeListStr =
2678 compositeStr.substr(beg + 1, end - beg - 1);
2680 map<int, CompositeSharedPtr> compositeVector;
2681 GetCompositeList(compositeListStr, compositeVector);
2684 const char *fStr = expansion->Attribute(
"FIELDS");
2685 std::vector<std::string> fieldStrings;
2689 std::string fieldStr = fStr;
2690 bool valid = ParseUtils::GenerateVector(fieldStr.c_str(),
2692 ASSERTL0(valid,
"Unable to correctly parse the field "
2693 "string in ExpansionTypes.");
2696 if (m_expansionMapShPtrMap.count(fieldStrings[0]))
2699 m_expansionMapShPtrMap.find(fieldStrings[0])
2704 expansionMap = SetUpExpansionInfoMap();
2709 for (i = 0; i < fieldStrings.size(); ++i)
2711 if (vars.size() && std::count(vars.begin(), vars.end(),
2712 fieldStrings[i]) == 0)
2714 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
2715 "' defined in EXPANSIONS is not"
2716 " defined in VARIABLES.");
2719 if (m_expansionMapShPtrMap.count(fieldStrings[i]) == 0)
2721 m_expansionMapShPtrMap[fieldStrings[i]] =
2726 fieldDomainCompList[fieldStrings[i]] =
2728 for (
auto c = compositeVector.begin();
2729 c != compositeVector.end(); ++c)
2731 fieldDomainCompList.find(fieldStrings[i])
2732 ->second.find(c->first)
2738 for (
auto c = compositeVector.begin();
2739 c != compositeVector.end(); ++c)
2741 if (fieldDomainCompList.find(fieldStrings[i])
2742 ->second.find(c->first)
2745 fieldDomainCompList.find(fieldStrings[i])
2746 ->second.find(c->first)
2752 "Expansion vector for "
2755 "' is already setup for C[" +
2756 to_string(c->first) +
"].");
2760 m_expansionMapShPtrMap.find(fieldStrings[i])
2767 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
2769 expansionMap = SetUpExpansionInfoMap();
2770 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
2772 fieldDomainCompList[
"DefaultVar"] = domainCompList;
2773 for (
auto c = compositeVector.begin();
2774 c != compositeVector.end(); ++c)
2776 fieldDomainCompList.find(
"DefaultVar")
2777 ->second.find(c->first)
2783 for (
auto c = compositeVector.begin();
2784 c != compositeVector.end(); ++c)
2786 if (fieldDomainCompList.find(
"DefaultVar")
2787 ->second.find(c->first)
2790 fieldDomainCompList.find(
"DefaultVar")
2791 ->second.find(c->first)
2796 ASSERTL0(
false,
"Default expansion already "
2798 to_string(c->first) +
"].");
2802 m_expansionMapShPtrMap.find(
"DefaultVar")->second;
2807 bool useExpansionType =
false;
2812 const char *tStr = expansion->Attribute(
"TYPE");
2816 std::string typeStr = tStr;
2818 const std::string *endStr =
2820 const std::string *expStr =
2823 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
2838 const char *nStr = expansion->Attribute(
"NUMMODES");
2839 ASSERTL0(nStr,
"NUMMODES was not defined in EXPANSION "
2840 "section of input");
2841 std::string nummodesStr = nStr;
2848 m_session->GetInterpreter(), nummodesStr);
2849 num_modes = (int)nummodesEqn.
Evaluate();
2853 num_modes = boost::lexical_cast<int>(nummodesStr);
2856 useExpansionType =
true;
2861 const char *bTypeStr = expansion->Attribute(
"BASISTYPE");
2862 ASSERTL0(bTypeStr,
"TYPE or BASISTYPE was not defined in "
2863 "EXPANSION section of input");
2864 std::string basisTypeStr = bTypeStr;
2867 std::vector<std::string> basisStrings;
2868 std::vector<LibUtilities::BasisType> basis;
2869 bool valid = ParseUtils::GenerateVector(
2870 basisTypeStr.c_str(), basisStrings);
2872 "Unable to correctly parse the basis types.");
2873 for (vector<std::string>::size_type i = 0;
2874 i < basisStrings.size(); i++)
2877 for (
unsigned int j = 0;
2891 "Unable to correctly parse the basis type: ")
2892 .append(basisStrings[i])
2895 const char *nModesStr = expansion->Attribute(
"NUMMODES");
2896 ASSERTL0(nModesStr,
"NUMMODES was not defined in EXPANSION "
2897 "section of input");
2899 std::string numModesStr = nModesStr;
2900 std::vector<unsigned int> numModes;
2901 valid = ParseUtils::GenerateVector(numModesStr.c_str(),
2904 "Unable to correctly parse the number of modes.");
2905 ASSERTL0(numModes.size() == basis.size(),
2906 "information for num modes does not match the "
2909 const char *pTypeStr = expansion->Attribute(
"POINTSTYPE");
2910 ASSERTL0(pTypeStr,
"POINTSTYPE was not defined in "
2911 "EXPANSION section of input");
2912 std::string pointsTypeStr = pTypeStr;
2914 std::vector<std::string> pointsStrings;
2915 std::vector<LibUtilities::PointsType> points;
2916 valid = ParseUtils::GenerateVector(pointsTypeStr.c_str(),
2919 "Unable to correctly parse the points types.");
2920 for (vector<std::string>::size_type i = 0;
2921 i < pointsStrings.size(); i++)
2924 for (
unsigned int j = 0;
2938 "Unable to correctly parse the points type: ")
2939 .append(pointsStrings[i])
2943 const char *nPointsStr = expansion->Attribute(
"NUMPOINTS");
2944 ASSERTL0(nPointsStr,
"NUMPOINTS was not defined in "
2945 "EXPANSION section of input");
2946 std::string numPointsStr = nPointsStr;
2947 std::vector<unsigned int> numPoints;
2948 valid = ParseUtils::GenerateVector(numPointsStr.c_str(),
2951 "Unable to correctly parse the number of points.");
2952 ASSERTL0(numPoints.size() == numPoints.size(),
2953 "information for num points does not match the "
2956 for (
int i = 0; i < basis.size(); ++i)
2962 basis[i], numModes[i], pkey));
2970 for (
auto compVecIter = compositeVector.begin();
2971 compVecIter != compositeVector.end(); ++compVecIter)
2973 for (
auto geomVecIter =
2974 compVecIter->second->m_geomVec.begin();
2975 geomVecIter != compVecIter->second->m_geomVec.end();
2979 expansionMap->find((*geomVecIter)->GetGlobalID());
2981 "Expansion not found!!");
2982 if (useExpansionType)
2984 (x->second)->m_basisKeyVector =
2985 MeshGraph::DefineBasisKeyFromExpansionType(
2986 *geomVecIter, expansion_type, num_modes);
2990 ASSERTL0((*geomVecIter)->GetShapeDim() ==
2992 " There is an incompatible expansion "
2993 "dimension with geometry dimension");
2994 (x->second)->m_basisKeyVector = basiskeyvec;
2999 expansion = expansion->NextSiblingElement(
"E");
3005 for (
auto f = fieldDomainCompList.begin();
3006 f != fieldDomainCompList.end(); ++f)
3008 if (f->first !=
"DefaultVar")
3010 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3012 if (c->second ==
false &&
3013 fieldDomainCompList.find(
"DefaultVar")
3014 ->second.find(c->first)
3019 for (
auto geomVecIter =
3020 m_meshComposites.find(c->first)
3021 ->second->m_geomVec.begin();
3022 geomVecIter != m_meshComposites.find(c->first)
3023 ->second->m_geomVec.end();
3027 m_expansionMapShPtrMap.find(
"DefaultVar")
3029 (*geomVecIter)->GetGlobalID());
3032 m_expansionMapShPtrMap.find(f->first)
3034 (*geomVecIter)->GetGlobalID());
3036 (xField->second)->m_basisKeyVector =
3037 (xDefaultVar->second)->m_basisKeyVector;
3041 ErrorUtil::ewarning,
3043 "Using Default expansion definition for "
3048 to_string(c->first) +
"].")
3051 ASSERTL0(c->second,
"There is no expansion defined for "
3053 f->first +
"' in C[" +
3054 to_string(c->first) +
"].");
3060 for (i = 0; i < vars.size(); ++i)
3062 if (m_expansionMapShPtrMap.count(vars[i]) == 0)
3064 if (m_expansionMapShPtrMap.count(
"DefaultVar"))
3067 m_expansionMapShPtrMap.find(
"DefaultVar")->second;
3068 m_expansionMapShPtrMap[vars[i]] = expansionMap;
3071 ErrorUtil::ewarning,
3073 "Using Default expansion definition for field "
3080 ASSERTL0(
false,
"Variable '" + vars[i] +
3082 " in FIELDS attribute of EXPANSIONS"
3088 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3096 m_expansionMapShPtrMap.begin()->second;
3097 m_expansionMapShPtrMap[
"DefaultVar"] = firstEntryAddr;
3100 else if (expType ==
"H")
3103 m_expansionMapShPtrMap.clear();
3108 map<int, bool> domainCompList;
3109 for (
auto &d : m_domain)
3111 for (
auto &c : d.second)
3113 domainCompList[c.first] =
false;
3116 map<std::string, map<int, bool>> fieldDomainCompList;
3121 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
3122 ASSERTL0(compositeStr.length() > 3,
3123 "COMPOSITE must be specified in expansion definition");
3124 int beg = compositeStr.find_first_of(
"[");
3125 int end = compositeStr.find_first_of(
"]");
3126 std::string compositeListStr =
3127 compositeStr.substr(beg + 1, end - beg - 1);
3129 map<int, CompositeSharedPtr> compositeVector;
3130 GetCompositeList(compositeListStr, compositeVector);
3133 const char *fStr = expansion->Attribute(
"FIELDS");
3134 std::vector<std::string> fieldStrings;
3138 std::string fieldStr = fStr;
3139 bool valid = ParseUtils::GenerateVector(fieldStr.c_str(),
3141 ASSERTL0(valid,
"Unable to correctly parse the field "
3142 "string in ExpansionTypes.");
3145 if (m_expansionMapShPtrMap.count(fieldStrings[0]))
3148 m_expansionMapShPtrMap.find(fieldStrings[0])
3153 expansionMap = SetUpExpansionInfoMap();
3158 for (i = 0; i < fieldStrings.size(); ++i)
3160 if (vars.size() && std::count(vars.begin(), vars.end(),
3161 fieldStrings[i]) == 0)
3163 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
3164 "' defined in EXPANSIONS is not"
3165 " defined in VARIABLES.");
3168 if (m_expansionMapShPtrMap.count(fieldStrings[i]) == 0)
3170 m_expansionMapShPtrMap[fieldStrings[i]] =
3175 fieldDomainCompList[fieldStrings[i]] =
3177 for (
auto c = compositeVector.begin();
3178 c != compositeVector.end(); ++c)
3180 fieldDomainCompList.find(fieldStrings[i])
3181 ->second.find(c->first)
3187 for (
auto c = compositeVector.begin();
3188 c != compositeVector.end(); ++c)
3190 if (fieldDomainCompList.find(fieldStrings[i])
3191 ->second.find(c->first)
3194 fieldDomainCompList.find(fieldStrings[i])
3195 ->second.find(c->first)
3201 "Expansion vector for "
3204 "' is already setup for C[" +
3205 to_string(c->first) +
"].");
3209 m_expansionMapShPtrMap.find(fieldStrings[i])
3216 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3218 expansionMap = SetUpExpansionInfoMap();
3219 m_expansionMapShPtrMap[
"DefaultVar"] = expansionMap;
3221 fieldDomainCompList[
"DefaultVar"] = domainCompList;
3222 for (
auto c = compositeVector.begin();
3223 c != compositeVector.end(); ++c)
3225 fieldDomainCompList.find(
"DefaultVar")
3226 ->second.find(c->first)
3232 for (
auto c = compositeVector.begin();
3233 c != compositeVector.end(); ++c)
3235 if (fieldDomainCompList.find(
"DefaultVar")
3236 ->second.find(c->first)
3239 fieldDomainCompList.find(
"DefaultVar")
3240 ->second.find(c->first)
3245 ASSERTL0(
false,
"Default expansion already "
3247 to_string(c->first) +
"].");
3251 m_expansionMapShPtrMap.find(
"DefaultVar")->second;
3259 int num_modes_x = 0;
3260 int num_modes_y = 0;
3261 int num_modes_z = 0;
3265 const char *tStr_x = expansion->Attribute(
"TYPE-X");
3269 std::string typeStr = tStr_x;
3271 const std::string *endStr =
3273 const std::string *expStr =
3276 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3279 const char *nStr = expansion->Attribute(
"NUMMODES-X");
3280 ASSERTL0(nStr,
"NUMMODES-X was not defined in EXPANSION "
3281 "section of input");
3282 std::string nummodesStr = nStr;
3290 m_session->GetInterpreter(), nummodesStr);
3291 num_modes_x = (int)nummodesEqn.
Evaluate();
3295 num_modes_x = boost::lexical_cast<int>(nummodesStr);
3299 const char *tStr_y = expansion->Attribute(
"TYPE-Y");
3303 std::string typeStr = tStr_y;
3305 const std::string *endStr =
3307 const std::string *expStr =
3310 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3313 const char *nStr = expansion->Attribute(
"NUMMODES-Y");
3314 ASSERTL0(nStr,
"NUMMODES-Y was not defined in EXPANSION "
3315 "section of input");
3316 std::string nummodesStr = nStr;
3323 m_session->GetInterpreter(), nummodesStr);
3324 num_modes_y = (int)nummodesEqn.
Evaluate();
3328 num_modes_y = boost::lexical_cast<int>(nummodesStr);
3332 const char *tStr_z = expansion->Attribute(
"TYPE-Z");
3336 std::string typeStr = tStr_z;
3338 const std::string *endStr =
3340 const std::string *expStr =
3343 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3346 const char *nStr = expansion->Attribute(
"NUMMODES-Z");
3347 ASSERTL0(nStr,
"NUMMODES-Z was not defined in EXPANSION "
3348 "section of input");
3349 std::string nummodesStr = nStr;
3356 m_session->GetInterpreter(), nummodesStr);
3357 num_modes_z = (int)nummodesEqn.
Evaluate();
3361 num_modes_z = boost::lexical_cast<int>(nummodesStr);
3365 for (
auto compVecIter = compositeVector.begin();
3366 compVecIter != compositeVector.end(); ++compVecIter)
3368 for (
auto geomVecIter =
3369 compVecIter->second->m_geomVec.begin();
3370 geomVecIter != compVecIter->second->m_geomVec.end();
3373 for (
auto expVecIter = expansionMap->begin();
3374 expVecIter != expansionMap->end(); ++expVecIter)
3377 (expVecIter->second)->m_basisKeyVector =
3378 DefineBasisKeyFromExpansionTypeHomo(
3379 *geomVecIter, expansion_type_x,
3380 expansion_type_y, expansion_type_z,
3381 num_modes_x, num_modes_y, num_modes_z);
3386 expansion = expansion->NextSiblingElement(
"H");
3392 for (
auto f = fieldDomainCompList.begin();
3393 f != fieldDomainCompList.end(); ++f)
3395 if (f->first !=
"DefaultVar")
3397 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3399 if (c->second ==
false &&
3400 fieldDomainCompList.find(
"DefaultVar")
3401 ->second.find(c->first)
3406 for (
auto geomVecIter =
3407 m_meshComposites.find(c->first)
3408 ->second->m_geomVec.begin();
3409 geomVecIter != m_meshComposites.find(c->first)
3410 ->second->m_geomVec.end();
3414 m_expansionMapShPtrMap.find(
"DefaultVar")
3416 (*geomVecIter)->GetGlobalID());
3419 m_expansionMapShPtrMap.find(f->first)
3421 (*geomVecIter)->GetGlobalID());
3423 (xField->second)->m_basisKeyVector =
3424 (xDefaultVar->second)->m_basisKeyVector;
3428 ErrorUtil::ewarning,
3430 "Using Default expansion definition for "
3435 to_string(c->first) +
"].")
3438 ASSERTL0(c->second,
"There is no expansion defined for "
3440 f->first +
"' in C[" +
3441 to_string(c->first) +
"].");
3447 for (i = 0; i < vars.size(); ++i)
3449 if (m_expansionMapShPtrMap.count(vars[i]) == 0)
3451 if (m_expansionMapShPtrMap.count(
"DefaultVar"))
3454 m_expansionMapShPtrMap.find(
"DefaultVar")->second;
3455 m_expansionMapShPtrMap[vars[i]] = expansionMap;
3458 ErrorUtil::ewarning,
3460 "Using Default expansion definition for field "
3467 ASSERTL0(
false,
"Variable '" + vars[i] +
3469 " in FIELDS attribute of EXPANSIONS"
3475 if (m_expansionMapShPtrMap.count(
"DefaultVar") == 0)
3483 m_expansionMapShPtrMap.begin()->second;
3484 m_expansionMapShPtrMap[
"DefaultVar"] = firstEntryAddr;
3490 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3494 std::shared_ptr<LibUtilities::FieldIOXml> f =
3495 make_shared<LibUtilities::FieldIOXml>(m_session->GetComm(),
3498 LibUtilities::XmlDataSource::create(m_session->GetDocument()),
3500 cout <<
" Number of elements: " << fielddefs.size() << endl;
3501 SetExpansionInfo(fielddefs);
3503 else if (expType ==
"F")
3505 ASSERTL0(expansion->Attribute(
"FILE"),
3506 "Attribute FILE expected for type F expansion");
3507 std::string filenameStr = expansion->Attribute(
"FILE");
3509 "A filename must be specified for the FILE "
3510 "attribute of expansion");
3512 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3514 LibUtilities::FieldIO::CreateForFile(m_session, filenameStr);
3515 f->Import(filenameStr, fielddefs);
3516 SetExpansionInfo(fielddefs);
3520 ASSERTL0(
false,
"Expansion type not defined");
3537 for (
auto &d : m_domain)
3539 for (
auto compIter = d.second.begin(); compIter != d.second.end();
3542 for (
auto &geomIter : compIter->second->m_geomVec)
3544 triGeomShPtr = std::dynamic_pointer_cast<TriGeom>(geomIter);
3545 quadGeomShPtr = std::dynamic_pointer_cast<QuadGeom>(geomIter);
3547 if (triGeomShPtr || quadGeomShPtr)
3551 for (
int i = 0; i < triGeomShPtr->GetNumEdges(); i++)
3553 if (triGeomShPtr->GetEdge(i)->GetGlobalID() ==
3554 edge->GetGlobalID())
3556 ret->push_back(make_pair(triGeomShPtr, i));
3561 else if (quadGeomShPtr)
3563 for (
int i = 0; i < quadGeomShPtr->GetNumEdges(); i++)
3565 if (quadGeomShPtr->GetEdge(i)->GetGlobalID() ==
3566 edge->GetGlobalID())
3568 ret->push_back(make_pair(quadGeomShPtr, i));
3582 const std::string variable)
3591 int edge_id = elmts->at(0).second;
3594 edge_id = (edge_id) ? 1 : 0;
3598 edge_id = edge_id % 2;
3600 int nummodes = expansion->m_basisKeyVector[edge_id].GetNumModes();
3601 int numpoints = expansion->m_basisKeyVector[edge_id].GetNumPoints();
3605 switch (expansion->m_basisKeyVector[edge_id].GetBasisType())
3609 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3616 expansion->m_basisKeyVector[0].GetBasisType(),
3621 ASSERTL0(
false,
"Unexpected points distribution");
3629 expansion->m_basisKeyVector[0].GetBasisType(),
3638 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3640 case LibUtilities::eGaussRadauMAlpha1Beta0:
3649 ASSERTL0(
false,
"Unexpected points distribution");
3657 expansion->m_basisKeyVector[0].GetBasisType(),
3665 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3668 case LibUtilities::eGaussRadauMAlpha1Beta0:
3673 expansion->m_basisKeyVector[0].GetBasisType(),
3682 expansion->m_basisKeyVector[0].GetBasisType(),
3687 ASSERTL0(
false,
"Unexpected points distribution");
3695 expansion->m_basisKeyVector[0].GetBasisType(),
3703 switch (expansion->m_basisKeyVector[edge_id].GetPointsType())
3710 expansion->m_basisKeyVector[0].GetBasisType(),
3715 ASSERTL0(
false,
"Unexpected points distribution");
3723 expansion->m_basisKeyVector[0].GetBasisType(),
3730 ASSERTL0(
false,
"Unexpected basis distribution");
3737 expansion->m_basisKeyVector[0].GetBasisType(), nummodes,
3745 numpoints, expansion->m_basisKeyVector[edge_id].GetPointsType());
3747 expansion->m_basisKeyVector[edge_id].GetBasisType(), nummodes,
3751 ASSERTL0(
false,
"Unable to determine edge points type.");
3759 const std::string variable)
3765 "No elements for the given face."
3766 " Check all elements belong to the domain composite.");
3775 ASSERTL0(expansion,
"Could not find expansion connected to face " +
3776 boost::lexical_cast<string>(face->GetGlobalID()));
3779 std::dynamic_pointer_cast<SpatialDomains::Geometry3D>(
3780 expansion->m_geomShPtr);
3784 int dir = geom3d->GetDir(elements->at(0).second, facedir);
3786 if (face->GetNumVerts() == 3)
3789 facedir, expansion->m_basisKeyVector[dir].GetBasisType(),
3790 expansion->m_basisKeyVector[dir].GetNumPoints(),
3791 expansion->m_basisKeyVector[dir].GetNumModes());
3798 geom3d->GetForient(elements->at(0).second);
3802 dir = (dir == 0) ? 1 : 0;
3806 facedir, expansion->m_basisKeyVector[dir].GetBasisType(),
3807 expansion->m_basisKeyVector[dir].GetNumPoints(),
3808 expansion->m_basisKeyVector[dir].GetNumModes());
3817 auto it = m_faceToElMap.find(face->GetGlobalID());
3819 ASSERTL0(it != m_faceToElMap.end(),
"Unable to find corresponding face!");
3836 for (
int i = 0; i < kNfaces; ++i)
3838 int faceId = element->GetFace(i)->GetGlobalID();
3841 auto it = m_faceToElMap.find(faceId);
3843 if (it == m_faceToElMap.end())
3847 tmp->push_back(make_pair(element, i));
3848 m_faceToElMap[faceId] = tmp;
3852 it->second->push_back(make_pair(element, i));
3864 std::map<int, MeshEntity> MeshGraph::CreateMeshEntities()
3866 std::map<int, MeshEntity> elements;
3867 switch (m_meshDimension)
3871 for (
auto &i : m_segGeoms)
3875 e.
list.push_back(i.second->GetVertex(0)->GetGlobalID());
3876 e.
list.push_back(i.second->GetVertex(1)->GetGlobalID());
3884 for (
auto &i : m_triGeoms)
3888 e.
list.push_back(i.second->GetEdge(0)->GetGlobalID());
3889 e.
list.push_back(i.second->GetEdge(1)->GetGlobalID());
3890 e.
list.push_back(i.second->GetEdge(2)->GetGlobalID());
3894 for (
auto &i : m_quadGeoms)
3898 e.
list.push_back(i.second->GetEdge(0)->GetGlobalID());
3899 e.
list.push_back(i.second->GetEdge(1)->GetGlobalID());
3900 e.
list.push_back(i.second->GetEdge(2)->GetGlobalID());
3901 e.
list.push_back(i.second->GetEdge(3)->GetGlobalID());
3909 for (
auto &i : m_tetGeoms)
3913 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3914 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3915 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3916 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3920 for (
auto &i : m_pyrGeoms)
3924 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3925 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3926 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3927 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3928 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3932 for (
auto &i : m_prismGeoms)
3936 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3937 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3938 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3939 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3940 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3944 for (
auto &i : m_hexGeoms)
3948 e.
list.push_back(i.second->GetFace(0)->GetGlobalID());
3949 e.
list.push_back(i.second->GetFace(1)->GetGlobalID());
3950 e.
list.push_back(i.second->GetFace(2)->GetGlobalID());
3951 e.
list.push_back(i.second->GetFace(3)->GetGlobalID());
3952 e.
list.push_back(i.second->GetFace(4)->GetGlobalID());
3953 e.
list.push_back(i.second->GetFace(5)->GetGlobalID());
3968 for (
auto &comp : m_meshComposites)
3970 std::pair<LibUtilities::ShapeType, vector<int>> tmp;
3971 tmp.first = comp.second->m_geomVec[0]->GetShapeType();
3973 tmp.second.resize(comp.second->m_geomVec.size());
3974 for (
size_t i = 0; i < tmp.second.size(); ++i)
3976 tmp.second[i] = comp.second->m_geomVec[i]->GetGlobalID();
3979 ret[comp.first] = tmp;
3988 m_domainRange->m_checkShape =
false;
3994 m_domainRange->m_doXrange =
true;
3997 m_domainRange->m_xmin = xmin;
3998 m_domainRange->m_xmax = xmax;
4002 m_domainRange->m_doYrange =
false;
4006 m_domainRange->m_doYrange =
true;
4007 m_domainRange->m_ymin = ymin;
4008 m_domainRange->m_ymax = ymax;
4013 m_domainRange->m_doZrange =
false;
4017 m_domainRange->m_doZrange =
true;
4018 m_domainRange->m_zmin = zmin;
4019 m_domainRange->m_zmax = zmax;
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Describes the specification for a Basis.
int GetNumPoints() const
Return points order at which basis is defined.
BasisType GetBasisType() const
Return type of expansion basis.
int GetNumModes() const
Returns the order of the basis.
PointsType GetPointsType() const
Return type of quadrature.
NekDouble Evaluate() const
Provides a generic Factory class.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Defines a specification for a set of points.
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
LibUtilities::ShapeType GetShapeType(void)
Get the geometric shape type of this object.
PointGeomSharedPtr GetVertex(int i) const
Returns vertex i of this object.
int GetCoordim() const
Return the coordinate dimension of this object (i.e. the dimension of the space in which this object ...
int GetNumVerts() const
Get the number of vertices of this object.
std::vector< BasisKey > BasisKeyVector
Name for a vector of BasisKeys.
const char *const BasisTypeMap[]
std::shared_ptr< FieldIO > FieldIOSharedPtr
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
const std::string kPointsTypeStr[]
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< DomainRange > DomainRangeShPtr
static DomainRangeShPtr NullDomainRangeShPtr
@ SIZE_PointsType
Length of enum list.
@ eGaussRadauMLegendre
1D Gauss-Radau-Legendre quadrature points, pinned at x=-1
@ eFourierEvenlySpaced
1D Evenly-spaced points using Fourier Fit
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGaussGaussChebyshev
1D Gauss-Gauss-Chebyshev quadrature points
@ ePolyEvenlySpaced
1D Evenly-spaced points using Lagrange polynomial
@ eGaussGaussLegendre
1D Gauss-Gauss-Legendre quadrature points
@ eFourierSingleModeSpaced
1D Non Evenly-spaced points for Single Mode analysis
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
@ eModified_B
Principle Modified Functions .
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points.
@ eOrtho_A
Principle Orthogonal Functions .
@ eModified_C
Principle Modified Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ SIZE_BasisType
Length of enum list.
@ eFourierSingleMode
Fourier ModifiedExpansion with just the first mode .
@ eChebyshev
Chebyshev Polynomials.
@ eOrtho_C
Principle Orthogonal Functions .
@ eModifiedPyr_C
Principle Modified Functions.
@ eOrtho_B
Principle Orthogonal Functions .
@ eModified_A
Principle Modified Functions .
@ eFourierHalfModeIm
Fourier Modified expansions with just the imaginary part of the first mode .
@ eFourierHalfModeRe
Fourier Modified expansions with just the real part of the first mode .
@ eFourier
Fourier Expansion .
static const NekDouble kNekUnsetDouble
std::shared_ptr< QuadGeom > QuadGeomSharedPtr
std::map< int, std::pair< LibUtilities::ShapeType, std::vector< int > > > CompositeDescriptor
std::shared_ptr< std::vector< std::pair< GeometrySharedPtr, int > > > GeometryLinkSharedPtr
std::shared_ptr< ExpansionInfoMap > ExpansionInfoMapShPtr
std::map< int, CompositeSharedPtr > CompositeMap
@ eDeformed
Geometry is curved or has non-constant factors.
std::shared_ptr< SegGeom > SegGeomSharedPtr
std::shared_ptr< ExpansionInfo > ExpansionInfoShPtr
const std::string kExpansionTypeStr[]
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::shared_ptr< PointGeom > PointGeomSharedPtr
std::shared_ptr< Geometry2D > Geometry2DSharedPtr
std::shared_ptr< Geometry > GeometrySharedPtr
std::shared_ptr< TriGeom > TriGeomSharedPtr
MeshGraphFactory & GetMeshGraphFactory()
std::shared_ptr< Composite > CompositeSharedPtr
std::shared_ptr< Geometry1D > Geometry1DSharedPtr
std::map< int, ExpansionInfoShPtr > ExpansionInfoMap
std::shared_ptr< Geometry3D > Geometry3DSharedPtr
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
@ eDir1FwdDir2_Dir2FwdDir1
The above copyright notice and this permission notice shall be included.
std::vector< unsigned int > list
bg::model::point< NekDouble, 3, bg::cs::cartesian > BgPoint
bg::model::box< BgPoint > BgBox
std::pair< BgBox, int > BgRtreeValue
void InsertGeom(GeometrySharedPtr const &geom)
bg::index::rtree< BgRtreeValue, bg::index::rstar< 16, 4 > > m_bgTree