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