693 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef)
695 int i, j, k, cnt, id;
702 for (i = 0; i < fielddef.size(); ++i)
704 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
706 std::string field = fielddef[i]->m_fields[j];
724 for (i = 0; i < fielddef.size(); ++i)
727 std::vector<std::string> fields = fielddef[i]->m_fields;
728 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
729 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
730 bool pointDef = fielddef[i]->m_pointsDef;
731 bool numPointDef = fielddef[i]->m_numPointsDef;
734 std::vector<unsigned int> npoints = fielddef[i]->m_numPoints;
735 std::vector<LibUtilities::PointsType> points = fielddef[i]->m_points;
737 bool UniOrder = fielddef[i]->m_uniOrder;
739 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
743 id = fielddef[i]->m_elementIDs[j];
745 switch (fielddef[i]->m_shapeType)
749 if (
m_segGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
755 cnt += fielddef[i]->m_numHomogeneousDir;
759 geom =
m_segGeoms[fielddef[i]->m_elementIDs[j]].get();
764 if (numPointDef && pointDef)
770 else if (!numPointDef && pointDef)
776 else if (numPointDef && !pointDef)
788 cnt += fielddef[i]->m_numHomogeneousDir;
790 bkeyvec.push_back(bkey);
795 if (
m_triGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
801 cnt += fielddef[i]->m_numHomogeneousDir;
805 geom =
m_triGeoms[fielddef[i]->m_elementIDs[j]].get();
809 if (numPointDef && pointDef)
815 else if (!numPointDef && pointDef)
821 else if (numPointDef && !pointDef)
829 bkeyvec.push_back(bkey);
832 nmodes[cnt + 1], LibUtilities::eGaussRadauMAlpha1Beta0);
833 if (numPointDef && pointDef)
839 else if (!numPointDef && pointDef)
845 else if (numPointDef && !pointDef)
849 LibUtilities::eGaussRadauMAlpha1Beta0);
854 bkeyvec.push_back(bkey1);
859 cnt += fielddef[i]->m_numHomogeneousDir;
865 if (
m_quadGeoms.count(fielddef[i]->m_elementIDs[j]) == 0)
871 cnt += fielddef[i]->m_numHomogeneousDir;
876 geom =
m_quadGeoms[fielddef[i]->m_elementIDs[j]].get();
878 for (
int b = 0; b < 2; ++b)
884 if (numPointDef && pointDef)
887 npoints[cnt + b], points[b]);
890 else if (!numPointDef && pointDef)
893 nmodes[cnt + b] + 1, points[b]);
896 else if (numPointDef && !pointDef)
905 bkeyvec.push_back(bkey);
911 cnt += fielddef[i]->m_numHomogeneousDir;
918 k = fielddef[i]->m_elementIDs[j];
938 if (numPointDef && pointDef)
944 else if (!numPointDef && pointDef)
950 else if (numPointDef && !pointDef)
961 bkeyvec.push_back(bkey);
966 LibUtilities::eGaussRadauMAlpha1Beta0);
968 if (numPointDef && pointDef)
971 npoints[cnt + 1], points[1]);
974 else if (!numPointDef && pointDef)
977 nmodes[cnt + 1] + 1, points[1]);
980 else if (numPointDef && !pointDef)
984 LibUtilities::eGaussRadauMAlpha1Beta0);
991 bkeyvec.push_back(bkey);
997 LibUtilities::eGaussRadauMAlpha2Beta0);
999 if (numPointDef && pointDef)
1002 npoints[cnt + 2], points[2]);
1005 else if (!numPointDef && pointDef)
1008 nmodes[cnt + 2] + 1, points[2]);
1011 else if (numPointDef && !pointDef)
1015 LibUtilities::eGaussRadauMAlpha1Beta0);
1022 bkeyvec.push_back(bkey);
1033 k = fielddef[i]->m_elementIDs[j];
1044 for (
int b = 0; b < 2; ++b)
1047 nmodes[cnt + b] + 1,
1050 if (numPointDef && pointDef)
1053 npoints[cnt + b], points[b]);
1056 else if (!numPointDef && pointDef)
1059 nmodes[cnt + b] + 1, points[b]);
1062 else if (numPointDef && !pointDef)
1072 bkeyvec.push_back(bkey);
1078 LibUtilities::eGaussRadauMAlpha1Beta0);
1080 if (numPointDef && pointDef)
1083 npoints[cnt + 2], points[2]);
1086 else if (!numPointDef && pointDef)
1089 nmodes[cnt + 2] + 1, points[2]);
1092 else if (numPointDef && !pointDef)
1102 bkeyvec.push_back(bkey);
1113 k = fielddef[i]->m_elementIDs[j];
1126 for (
int b = 0; b < 2; ++b)
1129 nmodes[cnt + b] + 1,
1132 if (numPointDef && pointDef)
1135 npoints[cnt + b], points[b]);
1138 else if (!numPointDef && pointDef)
1141 nmodes[cnt + b] + 1, points[b]);
1144 else if (numPointDef && !pointDef)
1154 bkeyvec.push_back(bkey);
1160 LibUtilities::eGaussRadauMAlpha2Beta0);
1162 if (numPointDef && pointDef)
1165 npoints[cnt + 2], points[2]);
1168 else if (!numPointDef && pointDef)
1171 nmodes[cnt + 2] + 1, points[2]);
1174 else if (numPointDef && !pointDef)
1184 bkeyvec.push_back(bkey);
1195 k = fielddef[i]->m_elementIDs[j];
1207 for (
int b = 0; b < 3; ++b)
1213 if (numPointDef && pointDef)
1216 npoints[cnt + b], points[b]);
1219 else if (!numPointDef && pointDef)
1222 nmodes[cnt + b] + 1, points[b]);
1225 else if (numPointDef && !pointDef)
1235 bkeyvec.push_back(bkey);
1246 ASSERTL0(
false,
"Need to set up for pyramid and prism 3D "
1251 for (k = 0; k < fields.size(); ++k)
1254 if ((*expansionMap).find(
id) != (*expansionMap).end())
1256 (*expansionMap)[id]->m_geomPtr = geom;
1257 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1268 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef,
1269 std::vector<std::vector<LibUtilities::PointsType>> &pointstype)
1271 int i, j, k, cnt, id;
1278 for (i = 0; i < fielddef.size(); ++i)
1280 for (j = 0; j < fielddef[i]->m_fields.size(); ++j)
1282 std::string field = fielddef[i]->m_fields[j];
1300 for (i = 0; i < fielddef.size(); ++i)
1303 std::vector<std::string> fields = fielddef[i]->m_fields;
1304 std::vector<unsigned int> nmodes = fielddef[i]->m_numModes;
1305 std::vector<LibUtilities::BasisType> basis = fielddef[i]->m_basis;
1306 bool UniOrder = fielddef[i]->m_uniOrder;
1308 for (j = 0; j < fielddef[i]->m_elementIDs.size(); ++j)
1311 id = fielddef[i]->m_elementIDs[j];
1313 switch (fielddef[i]->m_shapeType)
1317 k = fielddef[i]->m_elementIDs[j];
1319 "Failed to find geometry with same global id.");
1328 cnt += fielddef[i]->m_numHomogeneousDir;
1330 bkeyvec.push_back(bkey);
1335 k = fielddef[i]->m_elementIDs[j];
1337 "Failed to find geometry with same global id.");
1339 for (
int b = 0; b < 2; ++b)
1345 bkeyvec.push_back(bkey);
1351 cnt += fielddef[i]->m_numHomogeneousDir;
1357 k = fielddef[i]->m_elementIDs[j];
1359 "Failed to find geometry with same global id");
1362 for (
int b = 0; b < 2; ++b)
1368 bkeyvec.push_back(bkey);
1374 cnt += fielddef[i]->m_numHomogeneousDir;
1380 k = fielddef[i]->m_elementIDs[j];
1382 "Failed to find geometry with same global id");
1385 for (
int b = 0; b < 3; ++b)
1391 bkeyvec.push_back(bkey);
1402 k = fielddef[i]->m_elementIDs[j];
1404 "Failed to find geometry with same global id");
1407 for (
int b = 0; b < 3; ++b)
1413 bkeyvec.push_back(bkey);
1424 k = fielddef[i]->m_elementIDs[j];
1426 "Failed to find geometry with same global id");
1429 for (
int b = 0; b < 3; ++b)
1435 bkeyvec.push_back(bkey);
1446 k = fielddef[i]->m_elementIDs[j];
1448 "Failed to find geometry with same global id");
1451 for (
int b = 0; b < 3; ++b)
1457 bkeyvec.push_back(bkey);
1467 ASSERTL0(
false,
"Need to set up for pyramid and prism 3D "
1472 for (k = 0; k < fields.size(); ++k)
1475 if ((*expansionMap).find(
id) != (*expansionMap).end())
1477 (*expansionMap)[id]->m_geomPtr = geom;
1478 (*expansionMap)[id]->m_basisKeyVector = bkeyvec;
1663 nummodes + quadoffset,
1667 returnval.push_back(bkey);
1673 nummodes + quadoffset,
1677 returnval.push_back(bkey);
1678 returnval.push_back(bkey);
1684 nummodes + quadoffset,
1688 returnval.push_back(bkey);
1689 returnval.push_back(bkey);
1690 returnval.push_back(bkey);
1696 nummodes + quadoffset,
1700 returnval.push_back(bkey);
1703 nummodes + quadoffset - 1,
1704 LibUtilities::eGaussRadauMAlpha1Beta0);
1708 returnval.push_back(bkey1);
1714 nummodes + quadoffset,
1718 returnval.push_back(bkey);
1721 nummodes + quadoffset - 1,
1722 LibUtilities::eGaussRadauMAlpha1Beta0);
1725 returnval.push_back(bkey1);
1730 nummodes + quadoffset - 1,
1731 LibUtilities::eGaussRadauMAlpha1Beta0);
1734 returnval.push_back(bkey2);
1739 nummodes + quadoffset - 1,
1740 LibUtilities::eGaussRadauMAlpha2Beta0);
1743 returnval.push_back(bkey2);
1750 nummodes + quadoffset,
1754 returnval.push_back(bkey);
1755 returnval.push_back(bkey);
1758 nummodes + quadoffset,
1759 LibUtilities::eGaussRadauMAlpha2Beta0);
1762 returnval.push_back(bkey1);
1768 nummodes + quadoffset,
1772 returnval.push_back(bkey);
1773 returnval.push_back(bkey);
1776 nummodes + quadoffset - 1,
1777 LibUtilities::eGaussRadauMAlpha1Beta0);
1780 returnval.push_back(bkey1);
1786 "Expansion not defined in switch for this shape");
1803 returnval.push_back(bkey);
1812 returnval.push_back(bkey);
1813 returnval.push_back(bkey);
1823 returnval.push_back(bkey);
1826 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1829 returnval.push_back(bkey1);
1839 returnval.push_back(bkey);
1840 returnval.push_back(bkey);
1841 returnval.push_back(bkey);
1847 "Expansion not defined in switch for this shape");
1865 returnval.push_back(bkey);
1875 returnval.push_back(bkey);
1876 returnval.push_back(bkey);
1886 returnval.push_back(bkey);
1887 returnval.push_back(bkey);
1888 returnval.push_back(bkey);
1894 "Expansion not defined in switch for this shape");
1912 returnval.push_back(bkey);
1922 returnval.push_back(bkey);
1925 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1929 returnval.push_back(bkey1);
1939 returnval.push_back(bkey);
1940 returnval.push_back(bkey);
1950 returnval.push_back(bkey);
1953 nummodes, LibUtilities::eGaussRadauMAlpha1Beta0);
1957 returnval.push_back(bkey1);
1960 nummodes, LibUtilities::eGaussRadauMAlpha2Beta0);
1968 "Expansion not defined in switch for this shape");
1986 returnval.push_back(bkey);
1996 returnval.push_back(bkey);
1997 returnval.push_back(bkey);
2007 returnval.push_back(bkey);
2008 returnval.push_back(bkey);
2009 returnval.push_back(bkey);
2015 "Expansion not defined in switch for this shape");
2032 returnval.push_back(bkey);
2041 returnval.push_back(bkey);
2042 returnval.push_back(bkey);
2051 returnval.push_back(bkey);
2052 returnval.push_back(bkey);
2053 returnval.push_back(bkey);
2059 "Expansion not defined in switch for this shape");
2076 returnval.push_back(bkey);
2085 returnval.push_back(bkey);
2086 returnval.push_back(bkey);
2095 returnval.push_back(bkey);
2096 returnval.push_back(bkey);
2097 returnval.push_back(bkey);
2103 "Expansion not defined in switch for this shape");
2120 returnval.push_back(bkey);
2129 returnval.push_back(bkey);
2130 returnval.push_back(bkey);
2139 returnval.push_back(bkey);
2140 returnval.push_back(bkey);
2141 returnval.push_back(bkey);
2147 "Expansion not defined in switch for this shape");
2164 returnval.push_back(bkey);
2173 returnval.push_back(bkey);
2174 returnval.push_back(bkey);
2183 returnval.push_back(bkey);
2184 returnval.push_back(bkey);
2185 returnval.push_back(bkey);
2191 "Expansion not defined in switch for this shape");
2208 returnval.push_back(bkey);
2217 returnval.push_back(bkey);
2218 returnval.push_back(bkey);
2227 returnval.push_back(bkey);
2228 returnval.push_back(bkey);
2229 returnval.push_back(bkey);
2235 "Expansion not defined in switch for this shape");
2252 returnval.push_back(bkey);
2258 returnval.push_back(bkey1);
2264 "Expansion not defined in switch for this shape");
2281 returnval.push_back(bkey1);
2287 returnval.push_back(bkey);
2293 "Expansion not defined in switch for this shape");
2310 returnval.push_back(bkey);
2316 returnval.push_back(bkey1);
2322 "Expansion not defined in switch for this shape");
2331 ASSERTL0(
false,
"Expansion type not defined");
2772 TiXmlElement *refinementTypes =
m_session->GetElement(
"NEKTAR/REFINEMENTS");
2774 if (refinementTypes)
2776 TiXmlElement *refinement = refinementTypes->FirstChildElement();
2777 ASSERTL0(refinement,
"Unable to find entries in REFINEMENTS tag "
2779 std::string refType = refinement->Value();
2785 std::vector<NekDouble> coord1Vector, coord2Vector;
2786 std::vector<unsigned int> nModesVector, nPointsVector;
2789 const char *idStr = refinement->Attribute(
"REF");
2790 ASSERTL0(idStr,
"REF was not defined in REFINEMENT section "
2793 unsigned id = std::stoul(idStr);
2796 const char *radiusStr = refinement->Attribute(
"RADIUS");
2797 ASSERTL0(radiusStr,
"RADIUS was not defined in REFINEMENT "
2798 "section of input");
2800 NekDouble radius = std::stod(radiusStr);
2803 const char *c1Str = refinement->Attribute(
"COORDINATE1");
2804 ASSERTL0(c1Str,
"COORDINATE1 was not defined in REFINEMENT"
2805 "section of input");
2807 std::string coord1String = c1Str;
2810 ASSERTL0(valid,
"Unable to correctly parse the axes "
2811 "values for COORDINATE1");
2814 "Number of coordinates do not match the space "
2815 "dimension for COORDINATE1");
2818 const char *rType = refinement->Attribute(
"TYPE");
2819 ASSERTL0(rType,
"TYPE was not defined in REFINEMENT "
2820 "section of input");
2823 const char *c2Str = refinement->Attribute(
"COORDINATE2");
2825 if (strcmp(rType,
"STANDARD") == 0)
2827 ASSERTL0(c2Str,
"COORDINATE2 was not defined in REFINEMENT "
2828 "section of input");
2830 std::string coord2String = c2Str;
2833 ASSERTL0(valid,
"Unable to correctly parse the axes "
2834 "values for COORDINATE2");
2836 "Number of coordinates do not match the space "
2837 "dimension for COORDINATE2");
2843 "The mesh dimension must match the space dimension");
2845 else if (strcmp(rType,
"SPHERE") == 0)
2848 ASSERTL0(!c2Str,
"COORDINATE2 should not be defined in "
2849 "REFINEMENT section of input for the "
2852 coord2Vector.clear();
2857 "Invalid refinement type");
2864 const char *nModesStr = refinement->Attribute(
"NUMMODES");
2865 ASSERTL0(nModesStr,
"NUMMODES was not defined in "
2866 "Refinement section of input");
2868 std::string numModesStr = nModesStr;
2871 ASSERTL0(valid,
"Unable to correctly parse the "
2875 const char *nPointsStr = refinement->Attribute(
"NUMPOINTS");
2876 ASSERTL0(nPointsStr,
"NUMPOINTS was not defined in "
2877 "Refinement section of input");
2879 std::string numPointsStr = nPointsStr;
2882 ASSERTL0(valid,
"Unable to correctly parse the "
2887 const char *nModesStr = refinement->Attribute(
"NUMMODES");
2889 "NUMMODES was not defined in Refinement "
2890 "section of input");
2892 std::string numModesStr = nModesStr;
2897 m_session->GetInterpreter(), numModesStr);
2898 n_modesRef = (int)nummodesEqn.
Evaluate();
2902 n_modesRef = std::stoi(numModesStr);
2904 nModesVector.push_back(n_modesRef);
2905 nPointsVector.clear();
2909 if (strcmp(rType,
"STANDARD") == 0)
2919 coord2Vector, nModesVector, nPointsVector);
2929 coord2Vector, nModesVector, nPointsVector);
2937 coord2Vector, nModesVector, nPointsVector);
2947 nModesVector, nPointsVector);
2951 refinement = refinement->NextSiblingElement(
"R");
2958 "Unable to find REFINEMENTS tag in file");
2965 TiXmlElement *expansionTypes =
m_session->GetElement(
"NEKTAR/EXPANSIONS");
2967 expansionTypes,
m_session->GetTimeLevel());
2969 ASSERTL0(expansionTypes,
"Unable to find EXPANSIONS tag in file.");
2974 TiXmlElement *expansion = expansionTypes->FirstChildElement();
2975 ASSERTL0(expansion,
"Unable to find entries in EXPANSIONS tag in "
2977 std::string expType = expansion->Value();
2978 std::vector<std::string> vars =
m_session->GetVariables();
2999 std::map<int, bool> domainCompList;
3002 for (
auto &c : d.second)
3004 domainCompList[c.first] =
false;
3007 std::map<std::string, std::map<int, bool>> fieldDomainCompList;
3012 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
3013 ASSERTL0(compositeStr.length() > 3,
3014 "COMPOSITE must be specified in expansion "
3016 int beg = compositeStr.find_first_of(
"[");
3017 int end = compositeStr.find_first_of(
"]");
3018 std::string compositeListStr =
3019 compositeStr.substr(beg + 1, end - beg - 1);
3021 std::map<int, CompositeSharedPtr> compositeVector;
3025 const char *fStr = expansion->Attribute(
"FIELDS");
3026 std::vector<std::string> fieldStrings;
3030 std::string fieldStr = fStr;
3033 ASSERTL0(valid,
"Unable to correctly parse the field "
3034 "string in ExpansionTypes.");
3050 for (i = 0; i < fieldStrings.size(); ++i)
3052 if (vars.size() && std::count(vars.begin(), vars.end(),
3053 fieldStrings[i]) == 0)
3055 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
3056 "' defined in EXPANSIONS is not"
3057 " defined in VARIABLES.");
3067 fieldDomainCompList[fieldStrings[i]] =
3069 for (
auto c = compositeVector.begin();
3070 c != compositeVector.end(); ++c)
3072 fieldDomainCompList.find(fieldStrings[i])
3073 ->second.find(c->first)
3079 for (
auto c = compositeVector.begin();
3080 c != compositeVector.end(); ++c)
3082 if (fieldDomainCompList.find(fieldStrings[i])
3083 ->second.find(c->first)
3086 fieldDomainCompList.find(fieldStrings[i])
3087 ->second.find(c->first)
3093 "Expansion vector for "
3096 "' is already setup for "
3098 std::to_string(c->first) +
3115 fieldDomainCompList[
"DefaultVar"] = domainCompList;
3116 for (
auto c = compositeVector.begin();
3117 c != compositeVector.end(); ++c)
3119 fieldDomainCompList.find(
"DefaultVar")
3120 ->second.find(c->first)
3126 for (
auto c = compositeVector.begin();
3127 c != compositeVector.end(); ++c)
3129 if (fieldDomainCompList.find(
"DefaultVar")
3130 ->second.find(c->first)
3133 fieldDomainCompList.find(
"DefaultVar")
3134 ->second.find(c->first)
3139 ASSERTL0(
false,
"Default expansion already "
3141 std::to_string(c->first) +
3156 const char *tStr = expansion->Attribute(
"TYPE");
3160 std::string typeStr = tStr;
3162 const std::string *endStr =
3164 const std::string *expStr =
3165 std::find(begStr, endStr, typeStr);
3167 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3180 const char *nStr = expansion->Attribute(
"NUMMODES");
3181 ASSERTL0(nStr,
"NUMMODES was not defined in EXPANSION "
3182 "section of input");
3183 std::string nummodesStr = nStr;
3190 m_session->GetInterpreter(), nummodesStr);
3191 num_modes = (int)nummodesEqn.
Evaluate();
3195 num_modes = std::stoi(nummodesStr);
3203 const char *bTypeStr = expansion->Attribute(
"BASISTYPE");
3204 ASSERTL0(bTypeStr,
"TYPE or BASISTYPE was not defined in "
3205 "EXPANSION section of input");
3206 std::string basisTypeStr = bTypeStr;
3209 std::vector<std::string> basisStrings;
3210 std::vector<LibUtilities::BasisType> basis;
3212 basisTypeStr.c_str(), basisStrings);
3214 "Unable to correctly parse the basis types.");
3215 for (std::vector<std::string>::size_type i = 0;
3216 i < basisStrings.size(); i++)
3219 for (
unsigned int j = 0;
3230 ASSERTL0(valid, std::string(
"Unable to correctly "
3231 "parse the basis type: ")
3232 .append(basisStrings[i])
3235 const char *nModesStr = expansion->Attribute(
"NUMMODES");
3236 ASSERTL0(nModesStr,
"NUMMODES was not defined in EXPANSION "
3237 "section of input");
3239 std::string numModesStr = nModesStr;
3240 std::vector<unsigned int> numModes;
3243 ASSERTL0(valid,
"Unable to correctly parse the "
3244 "number of modes.");
3245 ASSERTL0(numModes.size() == basis.size(),
3246 "information for num modes does not match the "
3249 const char *pTypeStr = expansion->Attribute(
"POINTSTYPE");
3250 ASSERTL0(pTypeStr,
"POINTSTYPE was not defined in "
3251 "EXPANSION section of input");
3252 std::string pointsTypeStr = pTypeStr;
3254 std::vector<std::string> pointsStrings;
3255 std::vector<LibUtilities::PointsType> points;
3259 "Unable to correctly parse the points types.");
3260 for (std::vector<std::string>::size_type i = 0;
3261 i < pointsStrings.size(); i++)
3264 for (
unsigned int j = 0;
3275 ASSERTL0(valid, std::string(
"Unable to correctly "
3276 "parse the points type: ")
3277 .append(pointsStrings[i])
3281 const char *nPointsStr = expansion->Attribute(
"NUMPOINTS");
3282 ASSERTL0(nPointsStr,
"NUMPOINTS was not defined in "
3283 "EXPANSION section of input");
3284 std::string numPointsStr = nPointsStr;
3285 std::vector<unsigned int> numPoints;
3288 ASSERTL0(valid,
"Unable to correctly parse the "
3289 "number of points.");
3290 ASSERTL0(numPoints.size() == numPoints.size(),
3291 "information for num points does not match the "
3294 for (
int i = 0; i < basis.size(); ++i)
3300 basis[i], numModes[i], pkey));
3305 const char *refIDsStr = expansion->Attribute(
"REFIDS");
3308 std::vector<NekDouble> refIDsVector;
3309 std::string refIDsString = refIDsStr;
3312 ASSERTL0(valid,
"Unable to correctly parse the ids "
3316 for (
auto iter = refIDsVector.begin();
3317 iter != refIDsVector.end(); ++iter)
3328 for (
auto compVecIter = compositeVector.begin();
3329 compVecIter != compositeVector.end(); ++compVecIter)
3331 for (
auto geomVecIter =
3332 compVecIter->second->m_geomVec.begin();
3333 geomVecIter != compVecIter->second->m_geomVec.end();
3337 expansionMap->find((*geomVecIter)->GetGlobalID());
3339 x != expansionMap->end(),
3341 std::to_string((*geomVecIter)->GetGlobalID()) +
3345 (x->second)->m_basisKeyVector =
3347 *geomVecIter, expansion_type, num_modes);
3351 ASSERTL0((*geomVecIter)->GetShapeDim() ==
3353 " There is an incompatible expansion "
3354 "dimension with geometry dimension");
3355 (x->second)->m_basisKeyVector = basiskeyvec;
3360 expansion = expansion->NextSiblingElement(
"E");
3367 for (
auto f = fieldDomainCompList.begin();
3368 f != 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")
3376 ->second.find(c->first)
3382 for (
auto geomVecIter =
3384 ->second->m_geomVec.begin();
3386 ->second->m_geomVec.end();
3392 (*geomVecIter)->GetGlobalID());
3397 (*geomVecIter)->GetGlobalID());
3399 (xField->second)->m_basisKeyVector =
3400 (xDefaultVar->second)->m_basisKeyVector;
3404 (std::string(
"Using Default expansion "
3410 std::to_string(c->first) +
"].")
3413 ASSERTL0(c->second,
"There is no expansion defined for "
3415 f->first +
"' in C[" +
3416 std::to_string(c->first) +
3424 for (i = 0; i < vars.size(); ++i)
3435 (std::string(
"Using Default expansion "
3436 "definition for field "
3443 ASSERTL0(
false,
"Variable '" + vars[i] +
3445 " in FIELDS attribute of EXPANSIONS"
3475 else if (expType ==
"H")
3483 std::map<int, bool> domainCompList;
3486 for (
auto &c : d.second)
3488 domainCompList[c.first] =
false;
3491 std::map<std::string, std::map<int, bool>> fieldDomainCompList;
3496 std::string compositeStr = expansion->Attribute(
"COMPOSITE");
3497 ASSERTL0(compositeStr.length() > 3,
3498 "COMPOSITE must be specified in expansion "
3500 int beg = compositeStr.find_first_of(
"[");
3501 int end = compositeStr.find_first_of(
"]");
3502 std::string compositeListStr =
3503 compositeStr.substr(beg + 1, end - beg - 1);
3505 std::map<int, CompositeSharedPtr> compositeVector;
3509 const char *fStr = expansion->Attribute(
"FIELDS");
3510 std::vector<std::string> fieldStrings;
3514 std::string fieldStr = fStr;
3517 ASSERTL0(valid,
"Unable to correctly parse the field "
3518 "string in ExpansionTypes.");
3534 for (i = 0; i < fieldStrings.size(); ++i)
3536 if (vars.size() && std::count(vars.begin(), vars.end(),
3537 fieldStrings[i]) == 0)
3539 ASSERTL0(
false,
"Variable '" + fieldStrings[i] +
3540 "' defined in EXPANSIONS is not"
3541 " defined in VARIABLES.");
3551 fieldDomainCompList[fieldStrings[i]] =
3553 for (
auto c = compositeVector.begin();
3554 c != compositeVector.end(); ++c)
3556 fieldDomainCompList.find(fieldStrings[i])
3557 ->second.find(c->first)
3563 for (
auto c = compositeVector.begin();
3564 c != compositeVector.end(); ++c)
3566 if (fieldDomainCompList.find(fieldStrings[i])
3567 ->second.find(c->first)
3570 fieldDomainCompList.find(fieldStrings[i])
3571 ->second.find(c->first)
3577 "Expansion vector for "
3580 "' is already setup for "
3582 std::to_string(c->first) +
3599 fieldDomainCompList[
"DefaultVar"] = domainCompList;
3600 for (
auto c = compositeVector.begin();
3601 c != compositeVector.end(); ++c)
3603 fieldDomainCompList.find(
"DefaultVar")
3604 ->second.find(c->first)
3610 for (
auto c = compositeVector.begin();
3611 c != compositeVector.end(); ++c)
3613 if (fieldDomainCompList.find(
"DefaultVar")
3614 ->second.find(c->first)
3617 fieldDomainCompList.find(
"DefaultVar")
3618 ->second.find(c->first)
3623 ASSERTL0(
false,
"Default expansion already "
3625 std::to_string(c->first) +
3638 int num_modes_x = 0;
3639 int num_modes_y = 0;
3640 int num_modes_z = 0;
3644 const char *tStr_x = expansion->Attribute(
"TYPE-X");
3648 std::string typeStr = tStr_x;
3650 const std::string *endStr =
3652 const std::string *expStr =
3653 std::find(begStr, endStr, typeStr);
3655 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3658 const char *nStr = expansion->Attribute(
"NUMMODES-X");
3659 ASSERTL0(nStr,
"NUMMODES-X was not defined in EXPANSION "
3660 "section of input");
3661 std::string nummodesStr = nStr;
3669 m_session->GetInterpreter(), nummodesStr);
3670 num_modes_x = (int)nummodesEqn.
Evaluate();
3674 num_modes_x = std::stoi(nummodesStr);
3678 const char *tStr_y = expansion->Attribute(
"TYPE-Y");
3682 std::string typeStr = tStr_y;
3684 const std::string *endStr =
3686 const std::string *expStr =
3687 std::find(begStr, endStr, typeStr);
3689 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3692 const char *nStr = expansion->Attribute(
"NUMMODES-Y");
3693 ASSERTL0(nStr,
"NUMMODES-Y was not defined in EXPANSION "
3694 "section of input");
3695 std::string nummodesStr = nStr;
3702 m_session->GetInterpreter(), nummodesStr);
3703 num_modes_y = (int)nummodesEqn.
Evaluate();
3707 num_modes_y = std::stoi(nummodesStr);
3711 const char *tStr_z = expansion->Attribute(
"TYPE-Z");
3715 std::string typeStr = tStr_z;
3717 const std::string *endStr =
3719 const std::string *expStr =
3720 std::find(begStr, endStr, typeStr);
3722 ASSERTL0(expStr != endStr,
"Invalid expansion type.");
3725 const char *nStr = expansion->Attribute(
"NUMMODES-Z");
3726 ASSERTL0(nStr,
"NUMMODES-Z was not defined in EXPANSION "
3727 "section of input");
3728 std::string nummodesStr = nStr;
3735 m_session->GetInterpreter(), nummodesStr);
3736 num_modes_z = (int)nummodesEqn.
Evaluate();
3740 num_modes_z = std::stoi(nummodesStr);
3744 for (
auto compVecIter = compositeVector.begin();
3745 compVecIter != compositeVector.end(); ++compVecIter)
3747 for (
auto geomVecIter =
3748 compVecIter->second->m_geomVec.begin();
3749 geomVecIter != compVecIter->second->m_geomVec.end();
3752 for (
auto expVecIter = expansionMap->begin();
3753 expVecIter != expansionMap->end(); ++expVecIter)
3756 (expVecIter->second)->m_basisKeyVector =
3758 *geomVecIter, expansion_type_x,
3759 expansion_type_y, expansion_type_z,
3760 num_modes_x, num_modes_y, num_modes_z);
3765 expansion = expansion->NextSiblingElement(
"H");
3772 for (
auto f = fieldDomainCompList.begin();
3773 f != fieldDomainCompList.end(); ++f)
3775 if (f->first !=
"DefaultVar")
3777 for (
auto c = f->second.begin(); c != f->second.end(); ++c)
3779 if (c->second ==
false &&
3780 fieldDomainCompList.find(
"DefaultVar")
3781 ->second.find(c->first)
3787 for (
auto geomVecIter =
3789 ->second->m_geomVec.begin();
3791 ->second->m_geomVec.end();
3797 (*geomVecIter)->GetGlobalID());
3802 (*geomVecIter)->GetGlobalID());
3804 (xField->second)->m_basisKeyVector =
3805 (xDefaultVar->second)->m_basisKeyVector;
3809 (std::string(
"Using Default expansion "
3815 std::to_string(c->first) +
"].")
3818 ASSERTL0(c->second,
"There is no expansion defined for "
3820 f->first +
"' in C[" +
3821 std::to_string(c->first) +
3829 for (i = 0; i < vars.size(); ++i)
3840 (std::string(
"Using Default expansion "
3841 "definition for field "
3848 ASSERTL0(
false,
"Variable '" + vars[i] +
3850 " in FIELDS attribute of EXPANSIONS"
3868 else if (expType ==
"ELEMENTS")
3871 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3875 std::shared_ptr<LibUtilities::FieldIOXml> f =
3876 std::make_shared<LibUtilities::FieldIOXml>(
m_session->GetComm(),
3881 std::cout <<
" Number of elements: " << fielddefs.size()
3885 else if (expType ==
"F")
3887 ASSERTL0(expansion->Attribute(
"FILE"),
3888 "Attribute FILE expected for type F expansion");
3889 std::string filenameStr = expansion->Attribute(
"FILE");
3891 "A filename must be specified for the FILE "
3892 "attribute of expansion");
3894 std::vector<LibUtilities::FieldDefinitionsSharedPtr> fielddefs;
3897 f->Import(filenameStr, fielddefs);
3902 ASSERTL0(
false,
"Expansion type not defined");