699 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef)
701 int i, j, k, cnt, id;
708 for (i = 0; i < fielddef.size(); ++i)
710 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
712 std::string field = fielddef[i]->m_fields[j];
730 for (i = 0; i < fielddef.size(); ++i)
733 std::vector<std::string> fields = fielddef[i]->m_fields;
734 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
735 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
736 bool pointDef = fielddef[i]->m_pointsDef;
737 bool numPointDef = fielddef[i]->m_numPointsDef;
740 std::vector<unsigned int> npoints = fielddef[i]->m_numPoints;
741 std::vector<LibUtilities::PointsType> points = fielddef[i]->m_points;
743 bool UniOrder = fielddef[i]->m_uniOrder;
745 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
749 id = fielddef[i]->m_elementIDs[j];
751 switch (fielddef[i]->m_shapeType)
755 if (
m_segGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
761 cnt += fielddef[i]->m_numHomogeneousDir;
765 geom =
m_segGeoms[fielddef[i]->m_elementIDs[j]].get();
770 if (numPointDef && pointDef)
776 else if (!numPointDef && pointDef)
782 else if (numPointDef && !pointDef)
794 cnt += fielddef[i]->m_numHomogeneousDir;
796 bkeyvec.push_back(bkey);
801 if (
m_triGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
807 cnt += fielddef[i]->m_numHomogeneousDir;
811 geom =
m_triGeoms[fielddef[i]->m_elementIDs[j]].get();
815 if (numPointDef && pointDef)
821 else if (!numPointDef && pointDef)
827 else if (numPointDef && !pointDef)
835 bkeyvec.push_back(bkey);
838 nmodes[cnt + 1], LibUtilities::eGaussRadauMAlpha1Beta0);
839 if (numPointDef && pointDef)
845 else if (!numPointDef && pointDef)
851 else if (numPointDef && !pointDef)
855 LibUtilities::eGaussRadauMAlpha1Beta0);
860 bkeyvec.push_back(bkey1);
865 cnt += fielddef[i]->m_numHomogeneousDir;
871 if (
m_quadGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
877 cnt += fielddef[i]->m_numHomogeneousDir;
882 geom =
m_quadGeoms[fielddef[i]->m_elementIDs[j]].get();
884 for (
int b = 0; b < 2; ++b)
890 if (numPointDef && pointDef)
893 npoints[cnt + b], points[b]);
896 else if (!numPointDef && pointDef)
899 nmodes[cnt + b] + 1, points[b]);
902 else if (numPointDef && !pointDef)
911 bkeyvec.push_back(bkey);
917 cnt += fielddef[i]->m_numHomogeneousDir;
924 k = fielddef[i]->m_elementIDs[j];
944 if (numPointDef && pointDef)
950 else if (!numPointDef && pointDef)
956 else if (numPointDef && !pointDef)
967 bkeyvec.push_back(bkey);
972 LibUtilities::eGaussRadauMAlpha1Beta0);
974 if (numPointDef && pointDef)
977 npoints[cnt + 1], points[1]);
980 else if (!numPointDef && pointDef)
983 nmodes[cnt + 1] + 1, points[1]);
986 else if (numPointDef && !pointDef)
990 LibUtilities::eGaussRadauMAlpha1Beta0);
997 bkeyvec.push_back(bkey);
1003 LibUtilities::eGaussRadauMAlpha2Beta0);
1005 if (numPointDef && pointDef)
1008 npoints[cnt + 2], points[2]);
1011 else if (!numPointDef && pointDef)
1014 nmodes[cnt + 2] + 1, points[2]);
1017 else if (numPointDef && !pointDef)
1021 LibUtilities::eGaussRadauMAlpha1Beta0);
1028 bkeyvec.push_back(bkey);
1039 k = fielddef[i]->m_elementIDs[j];
1050 for (
int b = 0; b < 2; ++b)
1053 nmodes[cnt + b] + 1,
1056 if (numPointDef && pointDef)
1059 npoints[cnt + b], points[b]);
1062 else if (!numPointDef && pointDef)
1065 nmodes[cnt + b] + 1, points[b]);
1068 else if (numPointDef && !pointDef)
1078 bkeyvec.push_back(bkey);
1084 LibUtilities::eGaussRadauMAlpha1Beta0);
1086 if (numPointDef && pointDef)
1089 npoints[cnt + 2], points[2]);
1092 else if (!numPointDef && pointDef)
1095 nmodes[cnt + 2] + 1, points[2]);
1098 else if (numPointDef && !pointDef)
1108 bkeyvec.push_back(bkey);
1119 k = fielddef[i]->m_elementIDs[j];
1132 for (
int b = 0; b < 2; ++b)
1135 nmodes[cnt + b] + 1,
1138 if (numPointDef && pointDef)
1141 npoints[cnt + b], points[b]);
1144 else if (!numPointDef && pointDef)
1147 nmodes[cnt + b] + 1, points[b]);
1150 else if (numPointDef && !pointDef)
1160 bkeyvec.push_back(bkey);
1166 LibUtilities::eGaussRadauMAlpha2Beta0);
1168 if (numPointDef && pointDef)
1171 npoints[cnt + 2], points[2]);
1174 else if (!numPointDef && pointDef)
1177 nmodes[cnt + 2] + 1, points[2]);
1180 else if (numPointDef && !pointDef)
1190 bkeyvec.push_back(bkey);
1201 k = fielddef[i]->m_elementIDs[j];
1213 for (
int b = 0; b < 3; ++b)
1219 if (numPointDef && pointDef)
1222 npoints[cnt + b], points[b]);
1225 else if (!numPointDef && pointDef)
1228 nmodes[cnt + b] + 1, points[b]);
1231 else if (numPointDef && !pointDef)
1241 bkeyvec.push_back(bkey);
1252 ASSERTL0(
false,
"Need to set up for pyramid and prism 3D "
1257 for (k = 0; k < fields.size(); ++k)
1260 if ((*expansionMap).find(
id) != (*expansionMap).end())
1262 (*expansionMap)[id]->m_geomPtr = geom;
1263 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1274 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef,
1275 std::vector<std::vector<LibUtilities::PointsType>> &pointstype)
1277 int i, j, k, cnt, id;
1284 for (i = 0; i < fielddef.size(); ++i)
1286 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
1288 std::string field = fielddef[i]->m_fields[j];
1306 for (i = 0; i < fielddef.size(); ++i)
1309 std::vector<std::string> fields = fielddef[i]->m_fields;
1310 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
1311 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
1312 bool UniOrder = fielddef[i]->m_uniOrder;
1314 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
1317 id = fielddef[i]->m_elementIDs[j];
1319 switch (fielddef[i]->m_shapeType)
1323 k = fielddef[i]->m_elementIDs[j];
1325 "Failed to find geometry with same global id.");
1334 cnt += fielddef[i]->m_numHomogeneousDir;
1336 bkeyvec.push_back(bkey);
1341 k = fielddef[i]->m_elementIDs[j];
1343 "Failed to find geometry with same global id.");
1345 for (
int b = 0; b < 2; ++b)
1351 bkeyvec.push_back(bkey);
1357 cnt += fielddef[i]->m_numHomogeneousDir;
1363 k = fielddef[i]->m_elementIDs[j];
1365 "Failed to find geometry with same global id");
1368 for (
int b = 0; b < 2; ++b)
1374 bkeyvec.push_back(bkey);
1380 cnt += fielddef[i]->m_numHomogeneousDir;
1386 k = fielddef[i]->m_elementIDs[j];
1388 "Failed to find geometry with same global id");
1391 for (
int b = 0; b < 3; ++b)
1397 bkeyvec.push_back(bkey);
1408 k = fielddef[i]->m_elementIDs[j];
1410 "Failed to find geometry with same global id");
1413 for (
int b = 0; b < 3; ++b)
1419 bkeyvec.push_back(bkey);
1430 k = fielddef[i]->m_elementIDs[j];
1432 "Failed to find geometry with same global id");
1435 for (
int b = 0; b < 3; ++b)
1441 bkeyvec.push_back(bkey);
1452 k = fielddef[i]->m_elementIDs[j];
1454 "Failed to find geometry with same global id");
1457 for (
int b = 0; b < 3; ++b)
1463 bkeyvec.push_back(bkey);
1474 "Need to set up for pyramid and prism 3D "
1479 for (k = 0; k < fields.size(); ++k)
1482 if ((*expansionMap).find(
id) != (*expansionMap).end())
1484 (*expansionMap)[id]->m_geomPtr = geom;
1485 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1670 nummodes + quadoffset,
1674 returnval.push_back(bkey);
1680 nummodes + quadoffset,
1684 returnval.push_back(bkey);
1685 returnval.push_back(bkey);
1691 nummodes + quadoffset,
1695 returnval.push_back(bkey);
1696 returnval.push_back(bkey);
1697 returnval.push_back(bkey);
1703 nummodes + quadoffset,
1707 returnval.push_back(bkey);
1710 nummodes + quadoffset - 1,
1711 LibUtilities::eGaussRadauMAlpha1Beta0);
1715 returnval.push_back(bkey1);
1721 nummodes + quadoffset,
1725 returnval.push_back(bkey);
1728 nummodes + quadoffset - 1,
1729 LibUtilities::eGaussRadauMAlpha1Beta0);
1732 returnval.push_back(bkey1);
1737 nummodes + quadoffset - 1,
1738 LibUtilities::eGaussRadauMAlpha1Beta0);
1741 returnval.push_back(bkey2);
1746 nummodes + quadoffset - 1,
1747 LibUtilities::eGaussRadauMAlpha2Beta0);
1750 returnval.push_back(bkey2);
1757 nummodes + quadoffset,
1761 returnval.push_back(bkey);
1762 returnval.push_back(bkey);
1765 nummodes + quadoffset - 1,
1766 LibUtilities::eGaussRadauMAlpha2Beta0);
1769 returnval.push_back(bkey1);
1775 nummodes + quadoffset,
1779 returnval.push_back(bkey);
1780 returnval.push_back(bkey);
1783 nummodes + quadoffset - 1,
1784 LibUtilities::eGaussRadauMAlpha1Beta0);
1787 returnval.push_back(bkey1);
1793 "Expansion not defined in switch for this shape");
1810 returnval.push_back(bkey);
1819 returnval.push_back(bkey);
1820 returnval.push_back(bkey);
1831 returnval.push_back(bkey);
1834 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1837 returnval.push_back(bkey1);
1847 returnval.push_back(bkey);
1848 returnval.push_back(bkey);
1849 returnval.push_back(bkey);
1857 nummodes + quadoffset,
1861 returnval.push_back(bkey);
1866 returnval.push_back(bkey1);
1869 nummodes + quadoffset - 1,
1870 LibUtilities::eGaussRadauMAlpha1Beta0);
1873 returnval.push_back(bkey2);
1881 nummodes + quadoffset,
1885 returnval.push_back(bkey);
1888 nummodes + quadoffset - 1,
1889 LibUtilities::eGaussRadauMAlpha1Beta0);
1892 returnval.push_back(bkey1);
1897 nummodes + quadoffset - 1,
1898 LibUtilities::eGaussRadauMAlpha1Beta0);
1901 returnval.push_back(bkey2);
1906 nummodes + quadoffset - 1,
1907 LibUtilities::eGaussRadauMAlpha2Beta0);
1910 returnval.push_back(bkey2);
1917 "Expansion not defined in switch for this shape");
1935 returnval.push_back(bkey);
1945 returnval.push_back(bkey);
1946 returnval.push_back(bkey);
1956 returnval.push_back(bkey);
1957 returnval.push_back(bkey);
1958 returnval.push_back(bkey);
1964 "Expansion not defined in switch for this shape");
1982 returnval.push_back(bkey);
1992 returnval.push_back(bkey);
1995 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1999 returnval.push_back(bkey1);
2009 returnval.push_back(bkey);
2010 returnval.push_back(bkey);
2019 returnval.push_back(bkey);
2020 returnval.push_back(bkey);
2021 returnval.push_back(bkey);
2030 returnval.push_back(bkey);
2031 returnval.push_back(bkey);
2034 nummodes, LibUtilities::eGaussRadauMAlpha2Beta0);
2037 returnval.push_back(bkey1);
2046 returnval.push_back(bkey);
2047 returnval.push_back(bkey);
2050 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
2053 returnval.push_back(bkey1);
2063 returnval.push_back(bkey);
2066 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
2070 returnval.push_back(bkey1);
2073 nummodes, LibUtilities::eGaussRadauMAlpha2Beta0);
2077 returnval.push_back(bkey2);
2083 "Expansion not defined in switch for this shape");
2101 returnval.push_back(bkey);
2111 returnval.push_back(bkey);
2112 returnval.push_back(bkey);
2122 returnval.push_back(bkey);
2123 returnval.push_back(bkey);
2124 returnval.push_back(bkey);
2130 "Expansion not defined in switch for this shape");
2147 returnval.push_back(bkey);
2156 returnval.push_back(bkey);
2157 returnval.push_back(bkey);
2166 returnval.push_back(bkey);
2167 returnval.push_back(bkey);
2168 returnval.push_back(bkey);
2174 "Expansion not defined in switch for this shape");
2191 returnval.push_back(bkey);
2200 returnval.push_back(bkey);
2201 returnval.push_back(bkey);
2210 returnval.push_back(bkey);
2211 returnval.push_back(bkey);
2212 returnval.push_back(bkey);
2218 "Expansion not defined in switch for this shape");
2235 returnval.push_back(bkey);
2244 returnval.push_back(bkey);
2245 returnval.push_back(bkey);
2254 returnval.push_back(bkey);
2255 returnval.push_back(bkey);
2256 returnval.push_back(bkey);
2262 "Expansion not defined in switch for this shape");
2279 returnval.push_back(bkey);
2288 returnval.push_back(bkey);
2289 returnval.push_back(bkey);
2298 returnval.push_back(bkey);
2299 returnval.push_back(bkey);
2300 returnval.push_back(bkey);
2306 "Expansion not defined in switch for this shape");
2323 returnval.push_back(bkey);
2332 returnval.push_back(bkey);
2333 returnval.push_back(bkey);
2342 returnval.push_back(bkey);
2343 returnval.push_back(bkey);
2344 returnval.push_back(bkey);
2350 "Expansion not defined in switch for this shape");
2367 returnval.push_back(bkey);
2373 returnval.push_back(bkey1);
2379 "Expansion not defined in switch for this shape");
2396 returnval.push_back(bkey1);
2402 returnval.push_back(bkey);
2408 "Expansion not defined in switch for this shape");
2425 returnval.push_back(bkey);
2431 returnval.push_back(bkey1);
2437 "Expansion not defined in switch for this shape");
2894 TiXmlElement *refinementTypes =
m_session->GetElement(
"NEKTAR/REFINEMENTS");
2896 if (refinementTypes)
2898 TiXmlElement *refinement = refinementTypes->FirstChildElement();
2899 ASSERTL0(refinement,
"Unable to find entries in REFINEMENTS tag "
2901 std::string refType = refinement->Value();
2907 std::vector<NekDouble> coord1Vector, coord2Vector;
2908 std::vector<unsigned int> nModesVector, nPointsVector;
2911 const char *idStr = refinement->Attribute(
"REF");
2912 ASSERTL0(idStr,
"REF was not defined in REFINEMENT section "
2915 unsigned id = std::stoul(idStr);
2918 const char *radiusStr = refinement->Attribute(
"RADIUS");
2919 ASSERTL0(radiusStr,
"RADIUS was not defined in REFINEMENT "
2920 "section of input");
2922 NekDouble radius = std::stod(radiusStr);
2925 const char *c1Str = refinement->Attribute(
"COORDINATE1");
2926 ASSERTL0(c1Str,
"COORDINATE1 was not defined in REFINEMENT"
2927 "section of input");
2929 std::string coord1String = c1Str;
2935 "Unable to correctly parse the axes "
2936 "values for COORDINATE1");
2942 "Number of coordinates do not match the space "
2943 "dimension for COORDINATE1");
2947 const char *rType = refinement->Attribute(
"TYPE");
2948 ASSERTL0(rType,
"TYPE was not defined in REFINEMENT "
2949 "section of input");
2952 const char *c2Str = refinement->Attribute(
"COORDINATE2");
2954 if (strcmp(rType,
"STANDARD") == 0)
2956 ASSERTL0(c2Str,
"COORDINATE2 was not defined in REFINEMENT "
2957 "section of input");
2959 std::string coord2String = c2Str;
2965 "Unable to correctly parse the axes "
2966 "values for COORDINATE2");
2972 "Number of coordinates do not match the space "
2973 "dimension for COORDINATE2");
2981 "The mesh dimension must match the space "
2985 else if (strcmp(rType,
"SPHERE") == 0)
2988 ASSERTL0(!c2Str,
"COORDINATE2 should not be defined in "
2989 "REFINEMENT section of input for the "
2992 coord2Vector.clear();
2997 "Invalid refinement type");
3004 const char *nModesStr = refinement->Attribute(
"NUMMODES");
3005 ASSERTL0(nModesStr,
"NUMMODES was not defined in "
3006 "Refinement section of input");
3008 std::string numModesStr = nModesStr;
3011 ASSERTL0(valid,
"Unable to correctly parse the "
3015 const char *nPointsStr = refinement->Attribute(
"NUMPOINTS");
3016 ASSERTL0(nPointsStr,
"NUMPOINTS was not defined in "
3017 "Refinement section of input");
3019 std::string numPointsStr = nPointsStr;
3022 ASSERTL0(valid,
"Unable to correctly parse the "
3027 const char *nModesStr = refinement->Attribute(
"NUMMODES");
3029 "NUMMODES was not defined in Refinement "
3030 "section of input");
3032 std::string numModesStr = nModesStr;
3037 m_session->GetInterpreter(), numModesStr);
3038 n_modesRef = (int)nummodesEqn.
Evaluate();
3042 n_modesRef = std::stoi(numModesStr);
3044 nModesVector.push_back(n_modesRef);
3045 nPointsVector.clear();
3049 if (strcmp(rType,
"STANDARD") == 0)
3059 coord2Vector, nModesVector, nPointsVector);
3069 coord2Vector, nModesVector, nPointsVector);
3077 coord2Vector, nModesVector, nPointsVector);
3087 nModesVector, nPointsVector);
3091 refinement = refinement->NextSiblingElement(
"R");
3098 "Unable to find REFINEMENTS tag in file");
3106 expansionTypes,
m_session->GetTimeLevel());
3108 ASSERTL0(expansionTypes,
"Unable to find EXPANSIONS tag in file.");
3113 TiXmlElement *expansion = expansionTypes->FirstChildElement();
3114 ASSERTL0(expansion,
"Unable to find entries in EXPANSIONS tag in "
3116 std::string expType = expansion->Value();
3117 std::vector<std::string> vars =
m_session->GetVariables();
3138 std::map<int, bool> domainCompList;
3141 for (
auto &c : d.second)
3143 domainCompList[c.first] =
false;
3146 std::map<std::string, std::map<int, bool>> fieldDomainCompList;
3151 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
3152 ASSERTL0(compositeStr.length() > 3,
3153 "COMPOSITE must be specified in expansion "
3155 int beg = compositeStr.find_first_of(
"[");
3156 int end = compositeStr.find_first_of(
"]");
3157 std::string compositeListStr =
3158 compositeStr.substr(beg + 1, end - beg - 1);
3160 std::map<int, CompositeSharedPtr> compositeVector;
3164 const char *fStr = expansion->Attribute(
"FIELDS");
3165 std::vector<std::string> fieldStrings;
3169 std::string fieldStr = fStr;
3175 "Unable to correctly parse the field "
3176 "string in ExpansionTypes.");
3193 for (i = 0; i < fieldStrings.size(); ++i)
3195 if (vars.size() && std::count(vars.begin(), vars.end(),
3196 fieldStrings[i]) == 0)
3199 "Variable '" + fieldStrings[i] +
3200 "' defined in EXPANSIONS is not"
3201 " defined in VARIABLES.");
3211 fieldDomainCompList[fieldStrings[i]] =
3213 for (
auto c = compositeVector.begin();
3214 c != compositeVector.end(); ++c)
3216 fieldDomainCompList.find(fieldStrings[i])
3217 ->second.find(c->first)
3223 for (
auto c = compositeVector.begin();
3224 c != compositeVector.end(); ++c)
3226 if (fieldDomainCompList.find(fieldStrings[i])
3227 ->second.find(c->first)
3230 fieldDomainCompList.find(fieldStrings[i])
3231 ->second.find(c->first)
3237 "Expansion vector for "
3240 "' is already setup for "
3242 std::to_string(c->first) +
3259 fieldDomainCompList[
"DefaultVar"] = domainCompList;
3260 for (
auto c = compositeVector.begin();
3261 c != compositeVector.end(); ++c)
3263 fieldDomainCompList.find(
"DefaultVar")
3264 ->second.find(c->first)
3270 for (
auto c = compositeVector.begin();
3271 c != compositeVector.end(); ++c)
3273 if (fieldDomainCompList.find(
"DefaultVar")
3274 ->second.find(c->first)
3277 fieldDomainCompList.find(
"DefaultVar")
3278 ->second.find(c->first)
3283 ASSERTL0(
false,
"Default expansion already "
3285 std::to_string(c->first) +
3300 const char *tStr = expansion->Attribute(
"TYPE");
3304 std::string typeStr = tStr;
3306 const std::string *endStr =
3308 const std::string *expStr =
3309 std::find(begStr, endStr, typeStr);
3311 if (expStr == endStr)
3327 const char *nStr = expansion->Attribute(
"NUMMODES");
3328 ASSERTL0(nStr,
"NUMMODES was not defined in EXPANSION "
3329 "section of input");
3330 std::string nummodesStr = nStr;
3337 m_session->GetInterpreter(), nummodesStr);
3338 num_modes = (int)nummodesEqn.
Evaluate();
3342 num_modes = std::stoi(nummodesStr);
3350 const char *bTypeStr = expansion->Attribute(
"BASISTYPE");
3351 ASSERTL0(bTypeStr,
"TYPE or BASISTYPE was not defined in "
3352 "EXPANSION section of input");
3353 std::string basisTypeStr = bTypeStr;
3356 std::vector<std::string> basisStrings;
3357 std::vector<LibUtilities::BasisType> basis;
3359 basisTypeStr.c_str(), basisStrings);
3361 "Unable to correctly parse the basis types.");
3362 for (std::vector<std::string>::size_type i = 0;
3363 i < basisStrings.size(); i++)
3366 for (
unsigned int j = 0;
3377 ASSERTL0(valid, std::string(
"Unable to correctly "
3378 "parse the basis type: ")
3379 .append(basisStrings[i])
3382 const char *nModesStr = expansion->Attribute(
"NUMMODES");
3383 ASSERTL0(nModesStr,
"NUMMODES was not defined in EXPANSION "
3384 "section of input");
3386 std::string numModesStr = nModesStr;
3387 std::vector<unsigned int> numModes;
3390 ASSERTL0(valid,
"Unable to correctly parse the "
3391 "number of modes.");
3392 ASSERTL0(numModes.size() == basis.size(),
3393 "information for num modes does not match the "
3396 const char *pTypeStr = expansion->Attribute(
"POINTSTYPE");
3397 ASSERTL0(pTypeStr,
"POINTSTYPE was not defined in "
3398 "EXPANSION section of input");
3399 std::string pointsTypeStr = pTypeStr;
3401 std::vector<std::string> pointsStrings;
3402 std::vector<LibUtilities::PointsType> points;
3406 "Unable to correctly parse the points types.");
3407 for (std::vector<std::string>::size_type i = 0;
3408 i < pointsStrings.size(); i++)
3411 for (
unsigned int j = 0;
3422 ASSERTL0(valid, std::string(
"Unable to correctly "
3423 "parse the points type: ")
3424 .append(pointsStrings[i])
3428 const char *nPointsStr = expansion->Attribute(
"NUMPOINTS");
3429 ASSERTL0(nPointsStr,
"NUMPOINTS was not defined in "
3430 "EXPANSION section of input");
3431 std::string numPointsStr = nPointsStr;
3432 std::vector<unsigned int> numPoints;
3435 ASSERTL0(valid,
"Unable to correctly parse the "
3436 "number of points.");
3437 ASSERTL0(numPoints.size() == numPoints.size(),
3438 "information for num points does not match the "
3441 for (
int i = 0; i < basis.size(); ++i)
3447 basis[i], numModes[i], pkey));
3452 const char *refIDsStr = expansion->Attribute(
"REFIDS");
3455 std::vector<NekDouble> refIDsVector;
3456 std::string refIDsString = refIDsStr;
3459 ASSERTL0(valid,
"Unable to correctly parse the ids "
3463 for (
auto iter = refIDsVector.begin();
3464 iter != refIDsVector.end(); ++iter)
3475 for (
auto compVecIter = compositeVector.begin();
3476 compVecIter != compositeVector.end(); ++compVecIter)
3478 for (
auto geomVecIter =
3479 compVecIter->second->m_geomVec.begin();
3480 geomVecIter != compVecIter->second->m_geomVec.end();
3484 expansionMap->find((*geomVecIter)->GetGlobalID());
3486 x != expansionMap->end(),
3488 std::to_string((*geomVecIter)->GetGlobalID()) +
3492 (x->second)->m_basisKeyVector =
3494 *geomVecIter, expansion_type, num_modes);
3498 ASSERTL0((*geomVecIter)->GetShapeDim() ==
3500 " There is an incompatible expansion "
3501 "dimension with geometry dimension");
3502 (x->second)->m_basisKeyVector = basiskeyvec;
3507 expansion = expansion->NextSiblingElement(
"E");
3513 for (
auto f = fieldDomainCompList.begin();
3514 f != fieldDomainCompList.end(); ++f)
3516 if (f->first !=
"DefaultVar")
3518 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3520 if (c->second ==
false &&
3521 fieldDomainCompList.find(
"DefaultVar")
3522 ->second.find(c->first)
3528 for (
auto geomVecIter =
3530 ->second->m_geomVec.begin();
3532 ->second->m_geomVec.end();
3538 (*geomVecIter)->GetGlobalID());
3543 (*geomVecIter)->GetGlobalID());
3545 (xField->second)->m_basisKeyVector =
3546 (xDefaultVar->second)->m_basisKeyVector;
3550 (std::string(
"Using Default expansion "
3556 std::to_string(c->first) +
"].")
3559 ASSERTL0(c->second,
"There is no expansion defined for "
3561 f->first +
"' in C[" +
3562 std::to_string(c->first) +
3570 for (i = 0; i < vars.size(); ++i)
3581 (std::string(
"Using Default expansion "
3582 "definition for field "
3589 ASSERTL0(
false,
"Variable '" + vars[i] +
3591 " in FIELDS attribute of EXPANSIONS"
3621 else if (expType ==
"H")
3629 std::map<int, bool> domainCompList;
3632 for (
auto &c : d.second)
3634 domainCompList[c.first] =
false;
3637 std::map<std::string, std::map<int, bool>> fieldDomainCompList;
3642 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
3643 ASSERTL0(compositeStr.length() > 3,
3644 "COMPOSITE must be specified in expansion "
3646 int beg = compositeStr.find_first_of(
"[");
3647 int end = compositeStr.find_first_of(
"]");
3648 std::string compositeListStr =
3649 compositeStr.substr(beg + 1, end - beg - 1);
3651 std::map<int, CompositeSharedPtr> compositeVector;
3655 const char *fStr = expansion->Attribute(
"FIELDS");
3656 std::vector<std::string> fieldStrings;
3660 std::string fieldStr = fStr;
3663 ASSERTL0(valid,
"Unable to correctly parse the field "
3664 "string in ExpansionTypes.");
3680 for (i = 0; i < fieldStrings.size(); ++i)
3682 if (vars.size() && std::count(vars.begin(), vars.end(),
3683 fieldStrings[i]) == 0)
3685 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
3686 "' defined in EXPANSIONS is not"
3687 " defined in VARIABLES.");
3697 fieldDomainCompList[fieldStrings[i]] =
3699 for (
auto c = compositeVector.begin();
3700 c != compositeVector.end(); ++c)
3702 fieldDomainCompList.find(fieldStrings[i])
3703 ->second.find(c->first)
3709 for (
auto c = compositeVector.begin();
3710 c != compositeVector.end(); ++c)
3712 if (fieldDomainCompList.find(fieldStrings[i])
3713 ->second.find(c->first)
3716 fieldDomainCompList.find(fieldStrings[i])
3717 ->second.find(c->first)
3723 "Expansion vector for "
3726 "' is already setup for "
3728 std::to_string(c->first) +
3745 fieldDomainCompList[
"DefaultVar"] = domainCompList;
3746 for (
auto c = compositeVector.begin();
3747 c != compositeVector.end(); ++c)
3749 fieldDomainCompList.find(
"DefaultVar")
3750 ->second.find(c->first)
3756 for (
auto c = compositeVector.begin();
3757 c != compositeVector.end(); ++c)
3759 if (fieldDomainCompList.find(
"DefaultVar")
3760 ->second.find(c->first)
3763 fieldDomainCompList.find(
"DefaultVar")
3764 ->second.find(c->first)
3769 ASSERTL0(
false,
"Default expansion already "
3771 std::to_string(c->first) +
3784 int num_modes_x = 0;
3785 int num_modes_y = 0;
3786 int num_modes_z = 0;
3790 const char *tStr_x = expansion->Attribute(
"TYPE-X");
3794 std::string typeStr = tStr_x;
3796 const std::string *endStr =
3798 const std::string *expStr =
3799 std::find(begStr, endStr, typeStr);
3801 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3804 const char *nStr = expansion->Attribute(
"NUMMODES-X");
3805 ASSERTL0(nStr,
"NUMMODES-X was not defined in EXPANSION "
3806 "section of input");
3807 std::string nummodesStr = nStr;
3815 m_session->GetInterpreter(), nummodesStr);
3816 num_modes_x = (int)nummodesEqn.
Evaluate();
3820 num_modes_x = std::stoi(nummodesStr);
3824 const char *tStr_y = expansion->Attribute(
"TYPE-Y");
3828 std::string typeStr = tStr_y;
3830 const std::string *endStr =
3832 const std::string *expStr =
3833 std::find(begStr, endStr, typeStr);
3835 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3838 const char *nStr = expansion->Attribute(
"NUMMODES-Y");
3839 ASSERTL0(nStr,
"NUMMODES-Y was not defined in EXPANSION "
3840 "section of input");
3841 std::string nummodesStr = nStr;
3848 m_session->GetInterpreter(), nummodesStr);
3849 num_modes_y = (int)nummodesEqn.
Evaluate();
3853 num_modes_y = std::stoi(nummodesStr);
3857 const char *tStr_z = expansion->Attribute(
"TYPE-Z");
3861 std::string typeStr = tStr_z;
3863 const std::string *endStr =
3865 const std::string *expStr =
3866 std::find(begStr, endStr, typeStr);
3868 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3871 const char *nStr = expansion->Attribute(
"NUMMODES-Z");
3872 ASSERTL0(nStr,
"NUMMODES-Z was not defined in EXPANSION "
3873 "section of input");
3874 std::string nummodesStr = nStr;
3881 m_session->GetInterpreter(), nummodesStr);
3882 num_modes_z = (int)nummodesEqn.
Evaluate();
3886 num_modes_z = std::stoi(nummodesStr);
3890 for (
auto compVecIter = compositeVector.begin();
3891 compVecIter != compositeVector.end(); ++compVecIter)
3893 for (
auto geomVecIter =
3894 compVecIter->second->m_geomVec.begin();
3895 geomVecIter != compVecIter->second->m_geomVec.end();
3898 for (
auto expVecIter = expansionMap->begin();
3899 expVecIter != expansionMap->end(); ++expVecIter)
3902 (expVecIter->second)->m_basisKeyVector =
3904 *geomVecIter, expansion_type_x,
3905 expansion_type_y, expansion_type_z,
3906 num_modes_x, num_modes_y, num_modes_z);
3911 expansion = expansion->NextSiblingElement(
"H");
3918 for (
auto f = fieldDomainCompList.begin();
3919 f != fieldDomainCompList.end(); ++f)
3921 if (f->first !=
"DefaultVar")
3923 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3925 if (c->second ==
false &&
3926 fieldDomainCompList.find(
"DefaultVar")
3927 ->second.find(c->first)
3933 for (
auto geomVecIter =
3935 ->second->m_geomVec.begin();
3937 ->second->m_geomVec.end();
3943 (*geomVecIter)->GetGlobalID());
3948 (*geomVecIter)->GetGlobalID());
3950 (xField->second)->m_basisKeyVector =
3951 (xDefaultVar->second)->m_basisKeyVector;
3955 (std::string(
"Using Default expansion "
3961 std::to_string(c->first) +
"].")
3964 ASSERTL0(c->second,
"There is no expansion defined for "
3966 f->first +
"' in C[" +
3967 std::to_string(c->first) +
3975 for (i = 0; i < vars.size(); ++i)
3986 (std::string(
"Using Default expansion "
3987 "definition for field "
3994 ASSERTL0(
false,
"Variable '" + vars[i] +
3996 " in FIELDS attribute of EXPANSIONS"
4014 else if (expType ==
"ELEMENTS")
4017 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
4021 std::shared_ptr<LibUtilities::FieldIOXml> f =
4022 std::make_shared<LibUtilities::FieldIOXml>(
m_session->GetComm(),
4027 std::cout <<
" Number of elements: " << fielddefs.size()
4031 else if (expType ==
"F")
4033 ASSERTL0(expansion->Attribute(
"FILE"),
4034 "Attribute FILE expected for type F expansion");
4035 std::string filenameStr = expansion->Attribute(
"FILE");
4037 "A filename must be specified for the FILE "
4038 "attribute of expansion");
4040 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
4043 f->Import(filenameStr, fielddefs);
4048 ASSERTL0(
false,
"Expansion type not defined");