46 #include <boost/iostreams/filtering_streambuf.hpp> 47 #include <boost/iostreams/copy.hpp> 48 #include <boost/iostreams/filter/gzip.hpp> 49 #include <boost/algorithm/string.hpp> 61 #include <boost/program_options.hpp> 62 #include <boost/format.hpp> 64 #ifndef NEKTAR_VERSION 65 #define NEKTAR_VERSION "Unknown" 70 namespace po = boost::program_options;
71 namespace io = boost::iostreams;
75 namespace LibUtilities
131 return solverInfoEnums;
146 return solverInfoMap;
162 return gloSysSolnInfoList;
176 return cmdLineArguments;
188 SessionReader::SessionReader(
int argc,
char *argv[])
191 m_filenames = ParseCommandLineArguments(argc, argv);
193 ASSERTL0(m_filenames.size() > 0,
"No session file(s) given.");
195 m_sessionName = ParseSessionName(m_filenames);
198 CreateComm(argc, argv);
200 TestSharedFilesystem();
204 if (m_comm->GetSize() > 1)
206 GetSolverInfoDefaults()[
"GLOBALSYSSOLN"] =
207 "IterativeStaticCond";
211 m_interpreter->SetRandomSeed((m_comm->GetRank() + 1)
212 * (
unsigned int)time(NULL));
222 SessionReader::SessionReader(
225 const std::vector<std::string> &pFilenames,
228 ASSERTL0(pFilenames.size() > 0,
"No filenames specified.");
230 ParseCommandLineArguments(argc, argv);
232 m_filenames = pFilenames;
234 m_sessionName = ParseSessionName(m_filenames);
239 CreateComm(argc, argv);
246 TestSharedFilesystem();
250 if (m_comm->GetSize() > 1)
252 GetSolverInfoDefaults()[
"GLOBALSYSSOLN"] =
253 "IterativeStaticCond";
257 m_interpreter->SetRandomSeed((m_comm->GetRank() + 1)
258 * (
unsigned int)time(NULL));
268 SessionReader::~SessionReader()
283 void SessionReader::InitSession(
284 const std::vector<std::string> &filenames)
287 if (filenames.size() > 0)
289 m_filenames = filenames;
298 m_xmlDoc = MergeDoc(m_filenames);
311 if (m_verbose && m_comm)
313 if (m_comm->TreatAsRankZero() && m_parameters.size() > 0)
315 cout <<
"Parameters:" << endl;
316 for (
auto &x : m_parameters)
318 cout <<
"\t" << x.first <<
" = " << x.second << endl;
323 if (m_comm->TreatAsRankZero() && m_solverInfo.size() > 0)
325 cout <<
"Solver Info:" << endl;
326 for (
auto &x : m_solverInfo)
328 cout <<
"\t" << x.first <<
" = " << x.second << endl;
335 void SessionReader::TestSharedFilesystem()
337 m_sharedFilesystem =
false;
339 if (m_comm->GetSize() > 1)
341 if (m_comm->GetRank() == 0)
343 std::ofstream testfile(
"shared-fs-testfile");
344 testfile <<
"" << std::endl;
345 ASSERTL1(!testfile.fail(),
"Test file creation failed");
350 int exists = (bool)boost::filesystem::exists(
"shared-fs-testfile");
353 m_sharedFilesystem = (exists == m_comm->GetSize());
355 if ((m_sharedFilesystem && m_comm->GetRank() == 0) ||
358 std::remove(
"shared-fs-testfile");
363 m_sharedFilesystem =
false;
366 if (m_verbose && m_comm->GetRank() == 0 && m_sharedFilesystem)
368 cout <<
"Shared filesystem detected" << endl;
377 std::vector<std::string> SessionReader::ParseCommandLineArguments(
378 int argc,
char *argv[])
381 po::options_description desc(
"Allowed options");
383 (
"verbose,v",
"be verbose")
384 (
"version,V",
"print version information")
385 (
"help,h",
"print this help message")
386 (
"solverinfo,I", po::value<vector<std::string> >(),
387 "override a SOLVERINFO property")
388 (
"parameter,P", po::value<vector<std::string> >(),
389 "override a parameter")
390 (
"npx", po::value<int>(),
391 "number of procs in X-dir")
392 (
"npy", po::value<int>(),
393 "number of procs in Y-dir")
394 (
"npz", po::value<int>(),
395 "number of procs in Z-dir")
396 (
"nsz", po::value<int>(),
397 "number of slices in Z-dir")
398 (
"part-only", po::value<int>(),
399 "only partition mesh into N partitions.")
400 (
"part-only-overlapping", po::value<int>(),
401 "only partition mesh into N overlapping partitions.")
402 (
"part-info",
"Output partition information")
403 #ifdef NEKTAR_USE_CWIPI 404 (
"cwipi", po::value<std::string>(),
409 for (
auto &cmdIt : GetCmdLineArgMap())
411 std::string names = cmdIt.first;
412 if (cmdIt.second.shortName !=
"")
414 names +=
"," + cmdIt.second.shortName;
416 if (cmdIt.second.isFlag)
419 (names.c_str(), cmdIt.second.description.c_str())
425 (names.c_str(), po::value<std::string>(),
426 cmdIt.second.description.c_str())
433 po::options_description hidden(
"Hidden options");
435 (
"input-file", po::value< vector<string> >(),
440 po::options_description all(
"All options");
441 all.add(desc).add(hidden);
444 po::positional_options_description
p;
445 p.add(
"input-file", -1);
448 po::parsed_options parsed = po::command_line_parser(argc, argv).
451 allow_unregistered().
455 po::store(parsed, m_cmdLineOptions);
456 po::notify(m_cmdLineOptions);
459 if (m_cmdLineOptions.count(
"help"))
466 if (m_cmdLineOptions.count(
"version"))
474 boost::replace_all(branch,
"refs/heads/",
"");
476 cout <<
" (git changeset " << sha1.substr(0, 8) <<
", ";
480 cout <<
"detached head";
484 cout <<
"head " << branch;
495 if (m_cmdLineOptions.count(
"verbose"))
505 for (
auto &x : parsed.options)
509 cout <<
"Warning: Unknown option: " << x.string_key
515 if (m_cmdLineOptions.count(
"input-file"))
517 return m_cmdLineOptions[
"input-file"].as<
518 std::vector<std::string> >();
522 return std::vector<std::string>();
530 std::string SessionReader::ParseSessionName(
531 std::vector<std::string> &filenames)
534 "At least one filename expected.");
536 std::string retval =
"";
539 std::string fname = filenames[0];
542 if (fname.size() > 4 &&
543 fname.substr(fname.size() - 4, 4) ==
"_xml")
545 retval = fname.substr(0, fname.find_last_of(
"_"));
548 else if (fname.size() > 4 &&
549 fname.substr(fname.size() - 4, 4) ==
".xml")
551 retval = fname.substr(0, fname.find_last_of(
"."));
554 else if (fname.size() > 7 &&
555 fname.substr(fname.size() - 7, 7) ==
".xml.gz")
557 retval = fname.substr(0, fname.find_last_of(
"."));
558 retval = retval.substr(0, retval.find_last_of(
"."));
568 TiXmlDocument& SessionReader::GetDocument()
570 ASSERTL1(m_xmlDoc,
"XML Document not defined.");
597 TiXmlElement* SessionReader::GetElement(
const string& pPath)
599 std::string vPath = boost::to_upper_copy(pPath);
600 std::vector<std::string> st;
601 boost::split(st, vPath, boost::is_any_of(
"\\/ "));
602 ASSERTL0(st.size() > 0,
"No path given in XML element request.");
604 TiXmlElement* vReturn = m_xmlDoc->FirstChildElement(st[0].c_str());
605 ASSERTL0(vReturn, std::string(
"Cannot find element '")
606 + st[0] + std::string(
"'."));
607 for (
int i = 1; i < st.size(); ++i)
609 vReturn = vReturn->FirstChildElement(st[i].c_str());
610 ASSERTL0(vReturn, std::string(
"Cannot find element '")
611 + st[i] + std::string(
"'."));
620 bool SessionReader::DefinesElement(
const std::string &pPath)
const 622 std::string vPath = boost::to_upper_copy(pPath);
623 std::vector<std::string> st;
624 boost::split(st, vPath, boost::is_any_of(
"\\/ "));
625 ASSERTL0(st.size() > 0,
"No path given in XML element request.");
627 TiXmlElement* vReturn = m_xmlDoc->FirstChildElement(st[0].c_str());
628 ASSERTL0(vReturn, std::string(
"Cannot find element '")
629 + st[0] + std::string(
"'."));
630 for (
int i = 1; i < st.size(); ++i)
632 vReturn = vReturn->FirstChildElement(st[i].c_str());
633 if (!vReturn)
return false;
642 const std::vector<std::string>& SessionReader::GetFilenames()
const 651 const std::string& SessionReader::GetSessionName()
const 653 return m_sessionName;
661 const std::string SessionReader::GetSessionNameRank()
const 663 std::string dirname = m_sessionName +
"_xml";
664 fs::path pdirname(dirname);
666 std::string vFilename =
"P" + boost::lexical_cast<std::string>(m_comm->GetRowComm()->GetRank());
667 fs::path pFilename(vFilename);
669 fs::path fullpath = pdirname / pFilename;
682 bool SessionReader::GetSharedFilesystem()
684 return m_sharedFilesystem;
702 bool SessionReader::DefinesParameter(
const std::string& pName)
const 704 std::string vName = boost::to_upper_copy(pName);
705 return m_parameters.find(vName) != m_parameters.end();
718 const std::string& pName)
const 720 std::string vName = boost::to_upper_copy(pName);
721 auto paramIter = m_parameters.find(vName);
723 ASSERTL0(paramIter != m_parameters.end(),
724 "Unable to find requested parameter: " + pName);
726 return paramIter->second;
733 void SessionReader::LoadParameter(
734 const std::string &pName,
int &pVar)
const 736 std::string vName = boost::to_upper_copy(pName);
737 auto paramIter = m_parameters.find(vName);
738 ASSERTL0(paramIter != m_parameters.end(),
"Required parameter '" +
739 pName +
"' not specified in session.");
740 NekDouble param = round(paramIter->second);
748 void SessionReader::LoadParameter(
749 const std::string &pName,
int &pVar,
const int &pDefault)
const 751 std::string vName = boost::to_upper_copy(pName);
752 auto paramIter = m_parameters.find(vName);
753 if(paramIter != m_parameters.end())
755 NekDouble param = round(paramIter->second);
768 void SessionReader::LoadParameter(
769 const std::string &pName,
NekDouble& pVar)
const 771 std::string vName = boost::to_upper_copy(pName);
772 auto paramIter = m_parameters.find(vName);
773 ASSERTL0(paramIter != m_parameters.end(),
"Required parameter '" +
774 pName +
"' not specified in session.");
775 pVar = paramIter->second;
782 void SessionReader::LoadParameter(
783 const std::string &pName,
787 std::string vName = boost::to_upper_copy(pName);
788 auto paramIter = m_parameters.find(vName);
789 if(paramIter != m_parameters.end())
791 pVar = paramIter->second;
804 void SessionReader::SetParameter(
const std::string &pName,
int &pVar)
806 std::string vName = boost::to_upper_copy(pName);
807 m_parameters[vName] = pVar;
814 void SessionReader::SetParameter(
815 const std::string &pName,
NekDouble& pVar)
817 std::string vName = boost::to_upper_copy(pName);
818 m_parameters[vName] = pVar;
826 bool SessionReader::DefinesSolverInfo(
const std::string &pName)
const 828 std::string vName = boost::to_upper_copy(pName);
829 auto infoIter = m_solverInfo.find(vName);
830 return (infoIter != m_solverInfo.end());
837 const std::string& SessionReader::GetSolverInfo(
838 const std::string &pProperty)
const 840 std::string vProperty = boost::to_upper_copy(pProperty);
841 auto iter = m_solverInfo.find(vProperty);
843 ASSERTL1(iter != m_solverInfo.end(),
844 "Unable to find requested property: " + pProperty);
852 void SessionReader::SetSolverInfo(
853 const std::string &pProperty,
const std::string &pValue)
855 std::string vProperty = boost::to_upper_copy(pProperty);
856 auto iter = m_solverInfo.find(vProperty);
858 ASSERTL1(iter != m_solverInfo.end(),
859 "Unable to find requested property: " + pProperty);
861 iter->second = pValue;
867 void SessionReader::LoadSolverInfo(
868 const std::string &pName,
870 const std::string &pDefault)
const 872 std::string vName = boost::to_upper_copy(pName);
873 auto infoIter = m_solverInfo.find(vName);
874 if(infoIter != m_solverInfo.end())
876 pVar = infoIter->second;
888 void SessionReader::MatchSolverInfo(
889 const std::string &pName,
890 const std::string &pTrueVal,
892 const bool &pDefault)
const 894 std::string vName = boost::to_upper_copy(pName);
895 auto infoIter = m_solverInfo.find(vName);
896 if(infoIter != m_solverInfo.end())
898 pVar = boost::iequals(infoIter->second, pTrueVal);
910 bool SessionReader::MatchSolverInfo(
911 const std::string &pName,
912 const std::string &pTrueVal)
const 914 if (DefinesSolverInfo(pName))
916 std::string vName = boost::to_upper_copy(pName);
917 auto iter = m_solverInfo.find(vName);
918 if(iter != m_solverInfo.end())
920 return boost::iequals(iter->second, pTrueVal);
930 bool SessionReader::DefinesGlobalSysSolnInfo(
const std::string &pVariable,
931 const std::string &pProperty)
const 933 auto iter = GetGloSysSolnList().find(pVariable);
934 if(iter == GetGloSysSolnList().end())
939 std::string vProperty = boost::to_upper_copy(pProperty);
941 auto iter1 = iter->second.find(vProperty);
942 if(iter1 == iter->second.end())
954 const std::string &SessionReader::GetGlobalSysSolnInfo(
const std::string &pVariable,
const std::string &pProperty)
const 956 auto iter = GetGloSysSolnList().find(pVariable);
957 ASSERTL0(iter != GetGloSysSolnList().end(),
958 "Failed to find variable in GlobalSysSolnInfoList");
960 std::string vProperty = boost::to_upper_copy(pProperty);
961 auto iter1 = iter->second.find(vProperty);
963 ASSERTL0(iter1 != iter->second.end(),
964 "Failed to find property: " + vProperty +
" in GlobalSysSolnInfoList");
966 return iter1->second;
969 std::string SessionReader::GetGeometryType()
const 971 TiXmlElement *xmlGeom = m_xmlDoc->FirstChildElement(
"NEKTAR")
972 ->FirstChildElement(
"GEOMETRY");
973 TiXmlAttribute *attr = xmlGeom->FirstAttribute();
976 std::string attrName(attr->Name());
977 if (attrName ==
"HDF5FILE")
988 TiXmlElement *element = xmlGeom->FirstChildElement(
"VERTEX");
990 element->QueryStringAttribute(
"COMPRESSED", &IsCompressed);
992 if (IsCompressed.size() > 0)
994 return "XmlCompressed";
1004 bool SessionReader::DefinesGeometricInfo(
const std::string &pName)
const 1006 std::string vName = boost::to_upper_copy(pName);
1007 return m_geometricInfo.find(vName) != m_geometricInfo.end();
1014 void SessionReader::LoadGeometricInfo(
1015 const std::string &pName,
1017 const std::string &pDefault)
const 1019 std::string vName = boost::to_upper_copy(pName);
1020 auto iter = m_geometricInfo.find(vName);
1021 if(iter != m_geometricInfo.end())
1023 pVar = iter->second;
1035 void SessionReader::LoadGeometricInfo(
1036 const std::string &pName,
1038 const bool &pDefault)
const 1040 std::string vName = boost::to_upper_copy(pName);
1041 auto iter = m_geometricInfo.find(vName);
1042 if(iter != m_geometricInfo.end())
1044 if (iter->second ==
"TRUE")
1063 void SessionReader::LoadGeometricInfo(
1064 const std::string &pName,
1068 std::string vName = boost::to_upper_copy(pName);
1069 auto iter = m_geometricInfo.find(vName);
1070 if(iter != m_geometricInfo.end())
1072 pVar = std::atoi(iter->second.c_str());
1084 void SessionReader::MatchGeometricInfo(
1085 const std::string &pName,
1086 const std::string &pTrueVal,
1088 const bool &pDefault)
const 1090 std::string vName = boost::to_upper_copy(pName);
1091 auto iter = m_geometricInfo.find(vName);
1092 if(iter != m_geometricInfo.end())
1094 pVar = boost::iequals(iter->second, pTrueVal);
1106 const std::string& SessionReader::GetVariable(
1107 const unsigned int &idx)
const 1109 ASSERTL0(idx < m_variables.size(),
"Variable index out of range.");
1110 return m_variables[idx];
1118 void SessionReader::SetVariable(
const unsigned int &idx,
1119 std::string newname)
1121 ASSERTL0(idx < m_variables.size(),
"Variable index out of range.");
1122 m_variables[idx] = newname;
1129 std::vector<std::string> SessionReader::GetVariables()
const 1138 bool SessionReader::DefinesFunction(
const std::string &pName)
const 1140 std::string vName = boost::to_upper_copy(pName);
1141 return m_functions.find(vName) != m_functions.end();
1148 bool SessionReader::DefinesFunction(
1149 const std::string &pName,
1150 const std::string &pVariable,
1151 const int pDomain)
const 1153 std::string vName = boost::to_upper_copy(pName);
1156 auto it1 = m_functions.find(vName);
1157 if (it1 != m_functions.end())
1159 pair<std::string, int> key(pVariable,pDomain);
1160 pair<std::string, int> defkey(
"*",pDomain);
1162 it1->second.find(key) != it1->second.end() ||
1163 it1->second.find(defkey) != it1->second.end();
1174 const std::string &pName,
1175 const std::string &pVariable,
1176 const int pDomain)
const 1178 std::string vName = boost::to_upper_copy(pName);
1179 auto it1 = m_functions.find(vName);
1182 std::string(
"No such function '") + pName
1183 + std::string(
"' has been defined in the session file."));
1186 pair<std::string,int> key(pVariable,pDomain);
1187 pair<std::string,int> defkey(
"*",pDomain);
1189 auto it2 = it1->second.find(key);
1190 auto it3 = it1->second.find(defkey);
1191 bool specific = it2 != it1->second.end();
1192 bool wildcard = it3 != it1->second.end();
1196 "No such variable " + pVariable
1197 +
" in domain " + boost::lexical_cast<string>(pDomain)
1198 +
" defined for function " + pName
1199 +
" in session file.");
1208 std::string(
"Function is defined by a file."));
1209 return it2->second.m_expression;
1217 const std::string &pName,
1218 const unsigned int &pVar,
1219 const int pDomain)
const 1221 ASSERTL0(pVar < m_variables.size(),
"Variable index out of range.");
1222 return GetFunction(pName, m_variables[pVar],pDomain);
1230 const std::string &pName,
1231 const std::string &pVariable,
1232 const int pDomain)
const 1234 std::string vName = boost::to_upper_copy(pName);
1235 auto it1 = m_functions.find(vName);
1237 ASSERTL0 (it1 != m_functions.end(),
1238 std::string(
"Function '") + pName
1239 + std::string(
"' not found."));
1242 pair<std::string,int> key(pVariable,pDomain);
1243 pair<std::string,int> defkey(
"*",pDomain);
1245 auto it2 = it1->second.find(key);
1246 auto it3 = it1->second.find(defkey);
1247 bool specific = it2 != it1->second.end();
1248 bool wildcard = it3 != it1->second.end();
1252 "No such variable " + pVariable
1253 +
" in domain " + boost::lexical_cast<string>(pDomain)
1254 +
" defined for function " + pName
1255 +
" in session file.");
1263 return it2->second.m_type;
1271 const std::string &pName,
1272 const unsigned int &pVar,
1273 const int pDomain)
const 1275 ASSERTL0(pVar < m_variables.size(),
"Variable index out of range.");
1276 return GetFunctionType(pName, m_variables[pVar],pDomain);
1283 std::string SessionReader::GetFunctionFilename(
1284 const std::string &pName,
1285 const std::string &pVariable,
1286 const int pDomain)
const 1288 std::string vName = boost::to_upper_copy(pName);
1289 auto it1 = m_functions.find(vName);
1291 ASSERTL0 (it1 != m_functions.end(),
1292 std::string(
"Function '") + pName
1293 + std::string(
"' not found."));
1296 pair<std::string,int> key(pVariable,pDomain);
1297 pair<std::string,int> defkey(
"*",pDomain);
1299 auto it2 = it1->second.find(key);
1300 auto it3 = it1->second.find(defkey);
1301 bool specific = it2 != it1->second.end();
1302 bool wildcard = it3 != it1->second.end();
1306 "No such variable " + pVariable
1307 +
" in domain " + boost::lexical_cast<string>(pDomain)
1308 +
" defined for function " + pName
1309 +
" in session file.");
1317 return it2->second.m_filename;
1324 std::string SessionReader::GetFunctionFilename(
1325 const std::string &pName,
1326 const unsigned int &pVar,
1327 const int pDomain)
const 1329 ASSERTL0(pVar < m_variables.size(),
"Variable index out of range.");
1330 return GetFunctionFilename(pName, m_variables[pVar],pDomain);
1337 std::string SessionReader::GetFunctionFilenameVariable(
1338 const std::string &pName,
1339 const std::string &pVariable,
1340 const int pDomain)
const 1342 std::string vName = boost::to_upper_copy(pName);
1343 auto it1 = m_functions.find(vName);
1345 ASSERTL0 (it1 != m_functions.end(),
1346 std::string(
"Function '") + pName
1347 + std::string(
"' not found."));
1350 pair<std::string,int> key(pVariable,pDomain);
1351 pair<std::string,int> defkey(
"*",pDomain);
1353 auto it2 = it1->second.find(key);
1354 auto it3 = it1->second.find(defkey);
1355 bool specific = it2 != it1->second.end();
1356 bool wildcard = it3 != it1->second.end();
1360 "No such variable " + pVariable
1361 +
" in domain " + boost::lexical_cast<string>(pDomain)
1362 +
" defined for function " + pName
1363 +
" in session file.");
1371 return it2->second.m_fileVariable;
1378 bool SessionReader::DefinesTag(
const std::string &pName)
const 1380 std::string vName = boost::to_upper_copy(pName);
1381 return m_tags.find(vName) != m_tags.end();
1388 void SessionReader::SetTag(
1389 const std::string &pName,
1390 const std::string &pValue)
1392 std::string vName = boost::to_upper_copy(pName);
1393 m_tags[vName] = pValue;
1400 const std::string &SessionReader::GetTag(
const std::string& pName)
const 1402 std::string vName = boost::to_upper_copy(pName);
1403 auto vTagIterator = m_tags.find(vName);
1404 ASSERTL0(vTagIterator != m_tags.end(),
1405 "Requested tag does not exist.");
1406 return vTagIterator->second;
1422 bool SessionReader::DefinesCmdLineArgument(
1423 const std::string& pName)
const 1425 return (m_cmdLineOptions.find(pName) != m_cmdLineOptions.end());
1432 void SessionReader::SubstituteExpressions(std::string& pExpr)
1434 for (
auto &exprIter : m_expressions)
1436 boost::replace_all(pExpr, exprIter.first, exprIter.second);
1443 void SessionReader::LoadDoc(
1444 const std::string &pFilename,
1445 TiXmlDocument* pDoc)
const 1447 if (pFilename.size() > 3 &&
1448 pFilename.substr(pFilename.size() - 3, 3) ==
".gz")
1450 ifstream file(pFilename.c_str(),
1451 ios_base::in | ios_base::binary);
1452 ASSERTL0(file.good(),
"Unable to open file: " + pFilename);
1454 io::filtering_streambuf<io::input> in;
1455 in.push(io::gzip_decompressor());
1462 catch (io::gzip_error&)
1465 "Error: File '" + pFilename +
"' is corrupt.");
1468 else if (pFilename.size() > 4 &&
1469 pFilename.substr(pFilename.size() - 4, 4) ==
"_xml")
1471 fs::path pdirname(pFilename);
1473 pad % m_comm->GetRank();
1474 fs::path pRankFilename(pad.str());
1475 fs::path fullpath = pdirname / pRankFilename;
1478 ASSERTL0(file.good(),
"Unable to open file: " + fullpath.string());
1483 ifstream file(pFilename.c_str());
1484 ASSERTL0(file.good(),
"Unable to open file: " + pFilename);
1492 TiXmlDocument *SessionReader::MergeDoc(
1493 const std::vector<std::string> &pFilenames)
const 1495 ASSERTL0(pFilenames.size() > 0,
"No filenames for merging.");
1498 TiXmlDocument *vMainDoc =
new TiXmlDocument;
1499 LoadDoc(pFilenames[0], vMainDoc);
1501 TiXmlHandle vMainHandle(vMainDoc);
1502 TiXmlElement* vMainNektar =
1503 vMainHandle.FirstChildElement(
"NEKTAR").Element();
1508 for (
int i = 1; i < pFilenames.size(); ++i)
1510 if((pFilenames[i].compare(pFilenames[i].size()-3,3,
"xml") == 0)
1511 ||(pFilenames[i].compare(pFilenames[i].size()-6,6,
"xml.gz") == 0))
1513 TiXmlDocument* vTempDoc =
new TiXmlDocument;
1514 LoadDoc(pFilenames[i], vTempDoc);
1516 TiXmlHandle docHandle(vTempDoc);
1517 TiXmlElement* vTempNektar;
1518 vTempNektar = docHandle.FirstChildElement(
"NEKTAR").Element();
1519 ASSERTL0(vTempNektar,
"Unable to find NEKTAR tag in file.");
1520 TiXmlElement*
p = vTempNektar->FirstChildElement();
1524 TiXmlElement *vMainEntry =
1525 vMainNektar->FirstChildElement(p->Value());
1528 if (!p->FirstChild() && vMainEntry)
1530 std::string warningmsg =
1531 "File " + pFilenames[i] +
" contains " +
1532 "an empty XML element " +
1533 std::string(p->Value()) +
1534 " which will be ignored.";
1535 NEKERROR(ErrorUtil::ewarning, warningmsg.c_str());
1541 vMainNektar->RemoveChild(vMainEntry);
1543 TiXmlElement *q =
new TiXmlElement(*p);
1544 vMainNektar->LinkEndChild(q);
1546 p = p->NextSiblingElement();
1559 void SessionReader::ParseDocument()
1562 ASSERTL0(m_xmlDoc,
"No XML document loaded.");
1565 TiXmlHandle docHandle(m_xmlDoc);
1567 e = docHandle.FirstChildElement(
"NEKTAR").
1568 FirstChildElement(
"CONDITIONS").Element();
1573 ReadGlobalSysSolnInfo (e);
1574 ReadExpressions (e);
1578 e = docHandle.FirstChildElement(
"NEKTAR").
1579 FirstChildElement(
"FILTERS").Element();
1588 void SessionReader::CreateComm(
1598 string vCommModule(
"Serial");
1601 vCommModule =
"ParallelMPI";
1605 vCommModule =
"CWIPI";
1619 void SessionReader::PartitionComm()
1621 if (m_comm->GetSize() > 1)
1627 if (DefinesCmdLineArgument(
"npx")) {
1628 nProcX = GetCmdLineArgument<int>(
"npx");
1630 if (DefinesCmdLineArgument(
"npy")) {
1631 nProcY = GetCmdLineArgument<int>(
"npy");
1633 if (DefinesCmdLineArgument(
"npz")) {
1634 nProcZ = GetCmdLineArgument<int>(
"npz");
1636 if (DefinesCmdLineArgument(
"nsz")) {
1637 nStripZ = GetCmdLineArgument<int>(
"nsz");
1639 ASSERTL0(m_comm->GetSize() % (nProcZ*nProcY*nProcX) == 0,
1640 "Cannot exactly partition using PROC_Z value.");
1642 "Cannot exactly partition using PROC_Y value.");
1644 "Cannot exactly partition using PROC_X value.");
1647 int nProcSm = nProcZ * nProcY * nProcX;
1651 int nProcSem = m_comm->GetSize() / nProcSm;
1653 m_comm->SplitComm(nProcSm,nProcSem);
1654 m_comm->GetColumnComm()->SplitComm(nProcZ/nStripZ,nStripZ);
1655 m_comm->GetColumnComm()->GetColumnComm()->SplitComm(
1656 (nProcY*nProcX),nProcZ/nStripZ);
1657 m_comm->GetColumnComm()->GetColumnComm()->GetColumnComm()
1658 ->SplitComm(nProcX,nProcY);
1666 void SessionReader::ReadParameters(TiXmlElement *conditions)
1668 m_parameters.clear();
1675 TiXmlElement *parametersElement = conditions->FirstChildElement(
1680 if (parametersElement)
1682 TiXmlElement *parameter =
1683 parametersElement->FirstChildElement(
"P");
1691 stringstream tagcontent;
1692 tagcontent << *parameter;
1693 TiXmlNode *node = parameter->FirstChild();
1695 while (node && node->Type() != TiXmlNode::TINYXML_TEXT)
1697 node = node->NextSibling();
1703 std::string line = node->ToText()->Value(),
lhs,
rhs;
1706 ParseEquals(line,
lhs, rhs);
1711 "Syntax error in parameter expression '" 1712 + line +
"' in XML element: \n\t'" 1713 + tagcontent.str() +
"'");
1719 if (!
lhs.empty() && !rhs.empty())
1725 m_interpreter, rhs);
1728 catch (
const std::runtime_error &)
1731 "Error evaluating parameter expression" 1732 " '" + rhs +
"' in XML element: \n\t'" 1733 + tagcontent.str() +
"'");
1735 m_interpreter->SetParameter(
lhs, value);
1736 caseSensitiveParameters[
lhs] = value;
1737 boost::to_upper(
lhs);
1738 m_parameters[
lhs] = value;
1742 parameter = parameter->NextSiblingElement();
1751 void SessionReader::ReadSolverInfo(TiXmlElement *conditions)
1753 m_solverInfo.clear();
1754 m_solverInfo = GetSolverInfoDefaults();
1761 TiXmlElement *solverInfoElement =
1762 conditions->FirstChildElement(
"SOLVERINFO");
1764 if (solverInfoElement)
1766 TiXmlElement *solverInfo =
1767 solverInfoElement->FirstChildElement(
"I");
1771 std::stringstream tagcontent;
1772 tagcontent << *solverInfo;
1774 ASSERTL0(solverInfo->Attribute(
"PROPERTY"),
1775 "Missing PROPERTY attribute in solver info " 1776 "XML element: \n\t'" + tagcontent.str() +
"'");
1777 std::string solverProperty =
1778 solverInfo->Attribute(
"PROPERTY");
1780 "PROPERTY attribute must be non-empty in XML " 1781 "element: \n\t'" + tagcontent.str() +
"'");
1784 std::string solverPropertyUpper =
1785 boost::to_upper_copy(solverProperty);
1788 ASSERTL0(solverInfo->Attribute(
"VALUE"),
1789 "Missing VALUE attribute in solver info " 1790 "XML element: \n\t'" + tagcontent.str() +
"'");
1791 std::string solverValue = solverInfo->Attribute(
"VALUE");
1793 "VALUE attribute must be non-empty in XML " 1794 "element: \n\t'" + tagcontent.str() +
"'");
1797 m_solverInfo[solverPropertyUpper] = solverValue;
1798 solverInfo = solverInfo->NextSiblingElement(
"I");
1802 if (m_comm && m_comm->GetRowComm()->GetSize() > 1)
1805 m_solverInfo[
"GLOBALSYSSOLN"] ==
"IterativeFull" ||
1806 m_solverInfo[
"GLOBALSYSSOLN"] ==
"IterativeStaticCond" ||
1807 m_solverInfo[
"GLOBALSYSSOLN"] ==
1808 "IterativeMultiLevelStaticCond" ||
1809 m_solverInfo[
"GLOBALSYSSOLN"] ==
"XxtFull" ||
1810 m_solverInfo[
"GLOBALSYSSOLN"] ==
"XxtStaticCond" ||
1811 m_solverInfo[
"GLOBALSYSSOLN"] ==
1812 "XxtMultiLevelStaticCond" ||
1813 m_solverInfo[
"GLOBALSYSSOLN"] ==
"PETScFull" ||
1814 m_solverInfo[
"GLOBALSYSSOLN"] ==
"PETScStaticCond" ||
1815 m_solverInfo[
"GLOBALSYSSOLN"] ==
1816 "PETScMultiLevelStaticCond",
1817 "A parallel solver must be used when run in parallel.");
1826 void SessionReader::ReadGlobalSysSolnInfo(TiXmlElement *conditions)
1828 GetGloSysSolnList().clear();
1835 TiXmlElement *GlobalSys =
1836 conditions->FirstChildElement(
"GLOBALSYSSOLNINFO");
1843 TiXmlElement *VarInfo = GlobalSys->FirstChildElement(
"V");
1847 std::stringstream tagcontent;
1848 tagcontent << *VarInfo;
1849 ASSERTL0(VarInfo->Attribute(
"VAR"),
1850 "Missing VAR attribute in GobalSysSolnInfo XML " 1851 "element: \n\t'" + tagcontent.str() +
"'");
1853 std::string VarList = VarInfo->Attribute(
"VAR");
1855 "VAR attribute must be non-empty in XML element:\n\t'" 1856 + tagcontent.str() +
"'");
1859 std::vector<std::string> varStrings;
1860 bool valid = ParseUtils::GenerateVector(VarList, varStrings);
1862 ASSERTL0(valid,
"Unable to process list of variable in XML " 1863 "element \n\t'" + tagcontent.str() +
"'");
1865 if(varStrings.size())
1867 TiXmlElement *SysSolnInfo = VarInfo->FirstChildElement(
"I");
1872 tagcontent << *SysSolnInfo;
1874 ASSERTL0(SysSolnInfo->Attribute(
"PROPERTY"),
1875 "Missing PROPERTY attribute in " 1876 "GlobalSysSolnInfo for variable(s) '" 1877 + VarList +
"' in XML element: \n\t'" 1878 + tagcontent.str() +
"'");
1880 std::string SysSolnProperty =
1881 SysSolnInfo->Attribute(
"PROPERTY");
1884 "GlobalSysSolnIno properties must have a " 1885 "non-empty name for variable(s) : '" 1886 + VarList +
"' in XML element: \n\t'" 1887 + tagcontent.str() +
"'");
1890 std::string SysSolnPropertyUpper =
1891 boost::to_upper_copy(SysSolnProperty);
1894 ASSERTL0(SysSolnInfo->Attribute(
"VALUE"),
1895 "Missing VALUE attribute in GlobalSysSolnInfo " 1896 "for variable(s) '" + VarList
1897 +
"' in XML element: \n\t" 1898 + tagcontent.str() +
"'");
1900 std::string SysSolnValue =
1901 SysSolnInfo->Attribute(
"VALUE");
1903 "GlobalSysSolnInfo properties must have a " 1904 "non-empty value for variable(s) '" 1905 + VarList +
"' in XML element: \n\t'" 1906 + tagcontent.str() +
"'");
1909 for(
int i = 0; i < varStrings.size(); ++i)
1911 auto x = GetGloSysSolnList().find(varStrings[i]);
1912 if (x == GetGloSysSolnList().end())
1914 (GetGloSysSolnList()[varStrings[i]])[
1915 SysSolnPropertyUpper] = SysSolnValue;
1919 x->second[SysSolnPropertyUpper] = SysSolnValue;
1923 SysSolnInfo = SysSolnInfo->NextSiblingElement(
"I");
1925 VarInfo = VarInfo->NextSiblingElement(
"V");
1929 if (m_verbose && GetGloSysSolnList().size() > 0 && m_comm)
1931 if(m_comm->GetRank() == 0)
1933 cout <<
"GlobalSysSoln Info:" << endl;
1935 for (
auto &x : GetGloSysSolnList())
1937 cout <<
"\t Variable: " << x.first << endl;
1939 for (
auto &y : x.second)
1941 cout <<
"\t\t " << y.first <<
" = " << y.second
1954 void SessionReader::ReadExpressions(TiXmlElement *conditions)
1956 m_expressions.clear();
1963 TiXmlElement *expressionsElement =
1964 conditions->FirstChildElement(
"EXPRESSIONS");
1966 if (expressionsElement)
1968 TiXmlElement *expr = expressionsElement->FirstChildElement(
"E");
1972 stringstream tagcontent;
1973 tagcontent << *expr;
1975 "Missing NAME attribute in expression " 1976 "definition: \n\t'" + tagcontent.str() +
"'");
1977 std::string nameString = expr->Attribute(
"NAME");
1979 "Expressions must have a non-empty name: \n\t'" 1980 + tagcontent.str() +
"'");
1983 "Missing VALUE attribute in expression " 1984 "definition: \n\t'" + tagcontent.str() +
"'");
1985 std::string valString = expr->Attribute(
"VALUE");
1987 "Expressions must have a non-empty value: \n\t'" 1988 + tagcontent.str() +
"'");
1990 auto exprIter = m_expressions.find(nameString);
1991 ASSERTL0(exprIter == m_expressions.end(),
1992 std::string(
"Expression '") + nameString
1993 + std::string(
"' already specified."));
1995 m_expressions[nameString] = valString;
1996 expr = expr->NextSiblingElement(
"E");
2005 void SessionReader::ReadVariables(TiXmlElement *conditions)
2007 m_variables.clear();
2014 TiXmlElement *variablesElement =
2015 conditions->FirstChildElement(
"VARIABLES");
2019 if (variablesElement)
2021 TiXmlElement *varElement =
2022 variablesElement->FirstChildElement(
"V");
2025 int nextVariableNumber = -1;
2029 stringstream tagcontent;
2030 tagcontent << *varElement;
2034 nextVariableNumber++;
2037 int err = varElement->QueryIntAttribute(
"ID", &i);
2039 "Variables must have a unique ID number attribute " 2040 "in XML element: \n\t'" + tagcontent.str() +
"'");
2042 "ID numbers for variables must begin with zero and" 2043 " be sequential in XML element: \n\t'" 2044 + tagcontent.str() +
"'");
2046 TiXmlNode* varChild = varElement->FirstChild();
2051 while(varChild && varChild->Type() != TiXmlNode::TINYXML_TEXT)
2053 varChild = varChild->NextSibling();
2057 "Unable to read variable definition body for " 2059 + boost::lexical_cast<string>(i)
2060 +
" in XML element: \n\t'" 2061 + tagcontent.str() +
"'");
2062 std::string variableName = varChild->ToText()->ValueStr();
2064 std::istringstream variableStrm(variableName);
2065 variableStrm >> variableName;
2068 variableName) == m_variables.end(),
2070 + boost::lexical_cast<
string>(i)
2071 +
" in XML element \n\t'" + tagcontent.str()
2072 +
"'\nhas already been defined.");
2074 m_variables.push_back(variableName);
2076 varElement = varElement->NextSiblingElement(
"V");
2080 "Number of variables must be greater than zero.");
2088 void SessionReader::ReadFunctions(TiXmlElement *conditions)
2090 m_functions.clear();
2098 TiXmlElement *
function = conditions->FirstChildElement(
"FUNCTION");
2101 stringstream tagcontent;
2102 tagcontent << *
function;
2105 ASSERTL0(function->Attribute(
"NAME"),
2106 "Functions must have a NAME attribute defined in XML " 2107 "element: \n\t'" + tagcontent.str() +
"'");
2108 std::string functionStr =
function->Attribute(
"NAME");
2110 "Functions must have a non-empty name in XML " 2111 "element: \n\t'" + tagcontent.str() +
"'");
2114 boost::to_upper(functionStr);
2117 TiXmlElement *variable =
function->FirstChildElement();
2126 std::string conditionType = variable->Value();
2129 std::string variableStr;
2130 if (!variable->Attribute(
"VAR"))
2136 variableStr = variable->Attribute(
"VAR");
2140 std::vector<std::string> variableList;
2141 ParseUtils::GenerateVector(variableStr, variableList);
2144 std::string domainStr;
2145 if (!variable->Attribute(
"DOMAIN"))
2151 domainStr = variable->Attribute(
"DOMAIN");
2155 std::string evarsStr =
"x y z t";
2156 if (variable->Attribute(
"EVARS"))
2158 evarsStr = evarsStr + std::string(
" ") + variable->Attribute(
"EVARS");
2162 std::vector<std::string> varSplit;
2163 std::vector<unsigned int> domainList;
2164 ParseUtils::GenerateSeqVector(domainStr, domainList);
2167 if (conditionType ==
"E")
2172 ASSERTL0(variable->Attribute(
"VALUE"),
2173 "Attribute VALUE expected for function '" 2174 + functionStr +
"'.");
2175 std::string fcnStr = variable->Attribute(
"VALUE");
2178 (std::string(
"Expression for var: ")
2180 + std::string(
" must be specified.")).c_str());
2182 SubstituteExpressions(fcnStr);
2190 else if (conditionType ==
"F")
2192 if (variable->Attribute(
"TIMEDEPENDENT") &&
2193 boost::lexical_cast<
bool>(variable->Attribute(
"TIMEDEPENDENT")))
2203 ASSERTL0(variable->Attribute(
"FILE"),
2204 "Attribute FILE expected for function '" 2205 + functionStr +
"'.");
2206 std::string filenameStr = variable->Attribute(
"FILE");
2209 "A filename must be specified for the FILE " 2210 "attribute of function '" + functionStr
2213 std::vector<std::string> fSplit;
2214 boost::split(fSplit, filenameStr, boost::is_any_of(
":"));
2216 ASSERTL0(fSplit.size() == 1 || fSplit.size() == 2,
2217 "Incorrect filename specification in function " 2218 + functionStr +
"'. " 2219 "Specify variables inside file as: " 2220 "filename:var1,var2");
2225 if (fSplit.size() == 2)
2228 "Filename variable mapping not valid " 2229 "when using * as a variable inside " 2230 "function '" + functionStr +
"'.");
2233 varSplit, fSplit[1], boost::is_any_of(
","));
2234 ASSERTL0(varSplit.size() == variableList.size(),
2235 "Filename variables should contain the " 2236 "same number of variables defined in " 2237 "VAR in function " + functionStr +
"'.");
2244 stringstream tagcontent;
2245 tagcontent << *variable;
2248 "Identifier " + conditionType +
" in function " 2249 + std::string(function->Attribute(
"NAME"))
2250 +
" is not recognised in XML element: \n\t'" 2251 + tagcontent.str() +
"'");
2257 for (
unsigned int i = 0; i < variableList.size(); ++i)
2259 for(
unsigned int j = 0; j < domainList.size(); ++j)
2262 pair<std::string,int> key(variableList[i],domainList[j]);
2263 auto fcnsIter = functionVarMap.find(key);
2264 ASSERTL0(fcnsIter == functionVarMap.end(),
2265 "Error setting expression '" + variableList[i]
2267 + boost::lexical_cast<std::string>(domainList[j])
2268 +
"' in function '" + functionStr +
"'. " 2269 "Expression has already been defined.");
2271 if (varSplit.size() > 0)
2275 functionVarMap[key] = funcDef2;
2279 functionVarMap[key] = funcDef;
2284 variable = variable->NextSiblingElement();
2287 m_functions[functionStr] = functionVarMap;
2288 function =
function->NextSiblingElement(
"FUNCTION");
2296 void SessionReader::ReadFilters(TiXmlElement *filters)
2305 TiXmlElement *filter = filters->FirstChildElement(
"FILTER");
2308 ASSERTL0(filter->Attribute(
"TYPE"),
2309 "Missing attribute 'TYPE' for filter.");
2310 std::string typeStr = filter->Attribute(
"TYPE");
2312 std::map<std::string, std::string> vParams;
2314 TiXmlElement *param = filter->FirstChildElement(
"PARAM");
2318 "Missing attribute 'NAME' for parameter in filter " 2320 std::string nameStr = param->Attribute(
"NAME");
2322 ASSERTL0(param->GetText(),
"Empty value string for param.");
2323 std::string valueStr = param->GetText();
2325 vParams[nameStr] = valueStr;
2327 param = param->NextSiblingElement(
"PARAM");
2330 m_filters.push_back(
2331 std::pair<std::string, FilterParams>(typeStr, vParams));
2333 filter = filter->NextSiblingElement(
"FILTER");
2337 void SessionReader::ParseEquals(
2338 const std::string &line,
2343 size_t beg = line.find_first_not_of(
" ");
2344 size_t end = line.find_first_of(
"=");
2346 if (beg == end)
throw 1;
2348 if (end != line.find_last_of(
"="))
throw 1;
2350 if (end == std::string::npos)
throw 1;
2352 lhs = line.substr(line.find_first_not_of(
" "),
2354 lhs = lhs .substr(0, lhs.find_last_not_of(
" ")+1);
2355 rhs = line.substr(line.find_last_of(
"=")+1);
2356 rhs = rhs .substr(rhs.find_first_not_of(
" "));
2357 rhs = rhs .substr(0, rhs.find_last_not_of(
" ")+1);
2363 void SessionReader::CmdLineOverride()
2366 if (m_cmdLineOptions.count(
"solverinfo"))
2368 std::vector<std::string> solverInfoList =
2369 m_cmdLineOptions[
"solverinfo"].as<
2370 std::vector<std::string> >();
2372 for (
size_t i = 0; i < solverInfoList.size(); ++i)
2378 ParseEquals(solverInfoList[i], lhs, rhs);
2383 "Parse error with command line " 2384 "option: "+solverInfoList[i]);
2387 std::string lhsUpper = boost::to_upper_copy(lhs);
2388 m_solverInfo[lhsUpper] =
rhs;
2392 if (m_cmdLineOptions.count(
"parameter"))
2394 std::vector<std::string> parametersList =
2395 m_cmdLineOptions[
"parameter"].as<
2396 std::vector<std::string> >();
2398 for (
size_t i = 0; i < parametersList.size(); ++i)
2404 ParseEquals(parametersList[i], lhs, rhs);
2409 "Parse error with command line " 2410 "option: "+parametersList[i]);
2413 std::string lhsUpper = boost::to_upper_copy(lhs);
2417 m_parameters[lhsUpper] =
2423 "Unable to convert string: "+rhs+
2424 "to double value.");
2430 void SessionReader::VerifySolverInfo()
2432 for (
auto &x : m_solverInfo)
2434 std::string solverProperty = x.first;
2435 std::string solverValue = x.second;
2437 auto propIt = GetSolverInfoEnums().find(solverProperty);
2438 if (propIt != GetSolverInfoEnums().end())
2440 auto valIt = propIt->second.find(solverValue);
2441 ASSERTL0(valIt != propIt->second.end(),
2442 "Value '" + solverValue +
"' is not valid for " 2443 "property '" + solverProperty +
"'");
2449 void SessionReader::SetUpXmlDoc(
void)
2451 m_xmlDoc = MergeDoc(m_filenames);
2456 return m_interpreter;
std::map< std::string, std::string > SolverInfoMap
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
static void Finalise(gs_data *pGsh)
Deallocates the GSLib mapping data.
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
std::map< std::pair< std::string, int >, FunctionVariableDefinition > FunctionVariableMap
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
To checked_cast(const Ti param)
checked cast from float types only to int types
CommFactory & GetCommFactory()
EquationSharedPtr m_expression
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
const std::string kGitSha1
bool ModuleExists(tKey idKey)
Checks if a particular module is available.
std::map< std::string, GloSysInfoMap > GloSysSolnInfoList
std::vector< std::pair< std::string, FilterParams > > FilterMap
std::shared_ptr< Interpreter > InterpreterSharedPtr
std::string PortablePath(const boost::filesystem::path &path)
create portable path on different platforms for boost::filesystem path
NekDouble Evaluate() const
const std::string kGitBranch
std::shared_ptr< Equation > EquationSharedPtr
std::map< std::string, NekDouble > ParameterMap
std::map< std::string, EnumMap > EnumMapList
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
std::string m_fileVariable
std::map< std::string, CmdLineArg > CmdLineArgMap
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...