48 #include <boost/iostreams/filtering_streambuf.hpp>
49 #include <boost/iostreams/copy.hpp>
50 #include <boost/iostreams/filter/gzip.hpp>
51 #include <boost/algorithm/string.hpp>
60 #include <boost/program_options.hpp>
61 #include <boost/format.hpp>
63 #ifndef NEKTAR_VERSION
64 #define NEKTAR_VERSION "Unknown"
67 namespace po = boost::program_options;
68 namespace io = boost::iostreams;
72 namespace LibUtilities
128 return solverInfoEnums;
143 return solverInfoMap;
159 return gloSysSolnInfoList;
173 return cmdLineArguments;
185 SessionReader::SessionReader(
int argc,
char *argv[])
188 m_filenames = ParseCommandLineArguments(argc, argv);
190 ASSERTL0(m_filenames.size() > 0,
"No session file(s) given.");
192 m_sessionName = ParseSessionName(m_filenames);
195 CreateComm(argc, argv);
197 TestSharedFilesystem();
201 if (m_comm->GetSize() > 1)
203 GetSolverInfoDefaults()[
"GLOBALSYSSOLN"] =
204 "IterativeStaticCond";
212 SessionReader::SessionReader(
215 const std::vector<std::string> &pFilenames,
218 ASSERTL0(pFilenames.size() > 0,
"No filenames specified.");
220 ParseCommandLineArguments(argc, argv);
222 m_filenames = pFilenames;
224 m_sessionName = ParseSessionName(m_filenames);
229 CreateComm(argc, argv);
235 if (m_comm->GetSize() > 1)
237 GetSolverInfoDefaults()[
"GLOBALSYSSOLN"] =
238 "IterativeStaticCond";
242 TestSharedFilesystem();
246 if (m_comm->GetSize() > 1)
248 GetSolverInfoDefaults()[
"GLOBALSYSSOLN"] =
249 "IterativeStaticCond";
257 SessionReader::~SessionReader()
269 void SessionReader::InitSession()
271 m_exprEvaluator.SetRandomSeed((m_comm->GetRank() + 1) * time(NULL));
290 if (m_verbose && m_comm)
292 if (m_comm->TreatAsRankZero() && m_parameters.size() > 0)
294 cout <<
"Parameters:" << endl;
296 for (x = m_parameters.begin(); x != m_parameters.end(); ++x)
298 cout <<
"\t" << x->first <<
" = " << x->second << endl;
303 if (m_comm->TreatAsRankZero() && m_solverInfo.size() > 0)
305 cout <<
"Solver Info:" << endl;
307 for (x = m_solverInfo.begin(); x != m_solverInfo.end(); ++x)
309 cout <<
"\t" << x->first <<
" = " << x->second << endl;
317 void SessionReader::TestSharedFilesystem()
319 m_sharedFilesystem =
false;
321 if (m_comm->GetSize() > 1)
323 if (m_comm->GetRank() == 0)
325 std::ofstream testfile(
"shared-fs-testfile");
326 testfile <<
"" << std::endl;
327 ASSERTL1(!testfile.fail(),
"Test file creation failed");
332 int exists = (bool)boost::filesystem::exists(
"shared-fs-testfile");
335 m_sharedFilesystem = (exists == m_comm->GetSize());
337 if ((m_sharedFilesystem && m_comm->GetRank() == 0) ||
340 std::remove(
"shared-fs-testfile");
345 m_sharedFilesystem =
false;
348 if (m_verbose && m_comm->GetRank() == 0 && m_sharedFilesystem)
350 cout <<
"Shared filesystem detected" << endl;
359 std::vector<std::string> SessionReader::ParseCommandLineArguments(
360 int argc,
char *argv[])
363 po::options_description desc(
"Allowed options");
365 (
"verbose,v",
"be verbose")
366 (
"version,V",
"print version information")
367 (
"help,h",
"print this help message")
368 (
"solverinfo,I", po::value<vector<std::string> >(),
369 "override a SOLVERINFO property")
370 (
"parameter,P", po::value<vector<std::string> >(),
371 "override a parameter")
372 (
"npx", po::value<int>(),
373 "number of procs in X-dir")
374 (
"npy", po::value<int>(),
375 "number of procs in Y-dir")
376 (
"npz", po::value<int>(),
377 "number of procs in Z-dir")
378 (
"nsz", po::value<int>(),
379 "number of slices in Z-dir")
380 (
"part-only", po::value<int>(),
381 "only partition mesh into N partitions.")
382 (
"part-only-overlapping", po::value<int>(),
383 "only partition mesh into N overlapping partitions.")
384 (
"part-info",
"Output partition information")
387 CmdLineArgMap::const_iterator cmdIt;
388 for (cmdIt = GetCmdLineArgMap().begin();
389 cmdIt != GetCmdLineArgMap().end(); ++cmdIt)
391 std::string names = cmdIt->first;
392 if (cmdIt->second.shortName !=
"")
394 names +=
"," + cmdIt->second.shortName;
396 if (cmdIt->second.isFlag)
399 (names.c_str(), cmdIt->second.description.c_str())
405 (names.c_str(), po::value<std::string>(),
406 cmdIt->second.description.c_str())
413 po::options_description hidden(
"Hidden options");
415 (
"input-file", po::value< vector<string> >(),
420 po::options_description all(
"All options");
421 all.add(desc).add(hidden);
424 po::positional_options_description p;
425 p.add(
"input-file", -1);
428 po::parsed_options parsed = po::command_line_parser(argc, argv).
431 allow_unregistered().
435 po::store(parsed, m_cmdLineOptions);
436 po::notify(m_cmdLineOptions);
439 if (m_cmdLineOptions.count(
"help"))
446 if (m_cmdLineOptions.count(
"version"))
454 boost::replace_all(branch,
"refs/heads/",
"");
456 cout <<
" (git changeset " << sha1.substr(0, 8) <<
", ";
460 cout <<
"detached head";
464 cout <<
"head " << branch;
475 if (m_cmdLineOptions.count(
"verbose"))
485 std::vector< po::basic_option<char> >
::iterator x;
486 for (x = parsed.options.begin(); x != parsed.options.end(); ++x)
490 cout <<
"Warning: Unknown option: " << x->string_key
496 if (m_cmdLineOptions.count(
"input-file"))
498 return m_cmdLineOptions[
"input-file"].as<
499 std::vector<std::string> >();
503 return std::vector<std::string>();
511 std::string SessionReader::ParseSessionName(
512 std::vector<std::string> &filenames)
515 "At least one filename expected.");
517 std::string retval =
"";
520 std::string fname = filenames[0];
523 if (fname.size() > 4 &&
524 fname.substr(fname.size() - 4, 4) ==
"_xml")
526 retval = fname.substr(0, fname.find_last_of(
"_"));
529 else if (fname.size() > 4 &&
530 fname.substr(fname.size() - 4, 4) ==
".xml")
532 retval = fname.substr(0, fname.find_last_of(
"."));
535 else if (fname.size() > 7 &&
536 fname.substr(fname.size() - 7, 7) ==
".xml.gz")
538 retval = fname.substr(0, fname.find_last_of(
"."));
539 retval = retval.substr(0, retval.find_last_of(
"."));
549 TiXmlDocument& SessionReader::GetDocument()
551 ASSERTL1(m_xmlDoc,
"XML Document not defined.");
578 TiXmlElement* SessionReader::GetElement(
const string& pPath)
580 std::string vPath = boost::to_upper_copy(pPath);
581 std::vector<std::string> st;
582 boost::split(st, vPath, boost::is_any_of(
"\\/ "));
583 ASSERTL0(st.size() > 0,
"No path given in XML element request.");
585 TiXmlElement* vReturn = m_xmlDoc->FirstChildElement(st[0].c_str());
586 ASSERTL0(vReturn, std::string(
"Cannot find element '")
587 + st[0] + std::string(
"'."));
588 for (
int i = 1; i < st.size(); ++i)
590 vReturn = vReturn->FirstChildElement(st[i].c_str());
591 ASSERTL0(vReturn, std::string(
"Cannot find element '")
592 + st[i] + std::string(
"'."));
601 bool SessionReader::DefinesElement(
const std::string &pPath)
const
603 std::string vPath = boost::to_upper_copy(pPath);
604 std::vector<std::string> st;
605 boost::split(st, vPath, boost::is_any_of(
"\\/ "));
606 ASSERTL0(st.size() > 0,
"No path given in XML element request.");
608 TiXmlElement* vReturn = m_xmlDoc->FirstChildElement(st[0].c_str());
609 ASSERTL0(vReturn, std::string(
"Cannot find element '")
610 + st[0] + std::string(
"'."));
611 for (
int i = 1; i < st.size(); ++i)
613 vReturn = vReturn->FirstChildElement(st[i].c_str());
614 if (!vReturn)
return false;
623 const std::vector<std::string>& SessionReader::GetFilenames()
const
632 const std::string& SessionReader::GetSessionName()
const
634 return m_sessionName;
642 const std::string SessionReader::GetSessionNameRank()
const
644 std::string dirname = m_sessionName +
"_xml";
645 fs::path pdirname(dirname);
647 std::string vFilename =
"P" + boost::lexical_cast<std::string>(m_comm->GetRowComm()->GetRank());
648 fs::path pFilename(vFilename);
650 fs::path fullpath = pdirname / pFilename;
663 bool SessionReader::GetSharedFilesystem()
665 return m_sharedFilesystem;
683 bool SessionReader::DefinesParameter(
const std::string& pName)
const
685 std::string vName = boost::to_upper_copy(pName);
686 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
687 return (paramIter != m_parameters.end());
700 const std::string& pName)
const
702 std::string vName = boost::to_upper_copy(pName);
703 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
705 ASSERTL0(paramIter != m_parameters.end(),
706 "Unable to find requested parameter: " + pName);
708 return paramIter->second;
715 void SessionReader::LoadParameter(
716 const std::string &pName,
int &pVar)
const
718 std::string vName = boost::to_upper_copy(pName);
719 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
720 ASSERTL0(paramIter != m_parameters.end(),
"Required parameter '" +
721 pName +
"' not specified in session.");
722 pVar = (int)floor(paramIter->second);
729 void SessionReader::LoadParameter(
730 const std::string &pName,
int &pVar,
const int &pDefault)
const
732 std::string vName = boost::to_upper_copy(pName);
733 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
734 if(paramIter != m_parameters.end())
736 pVar = (int)floor(paramIter->second);
748 void SessionReader::LoadParameter(
749 const std::string &pName,
NekDouble& pVar)
const
751 std::string vName = boost::to_upper_copy(pName);
752 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
753 ASSERTL0(paramIter != m_parameters.end(),
"Required parameter '" +
754 pName +
"' not specified in session.");
755 pVar = paramIter->second;
762 void SessionReader::LoadParameter(
763 const std::string &pName,
767 std::string vName = boost::to_upper_copy(pName);
768 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
769 if(paramIter != m_parameters.end())
771 pVar = paramIter->second;
784 void SessionReader::SetParameter(
const std::string &pName,
int &pVar)
786 std::string vName = boost::to_upper_copy(pName);
787 m_parameters[vName] = pVar;
794 void SessionReader::SetParameter(
795 const std::string &pName,
NekDouble& pVar)
797 std::string vName = boost::to_upper_copy(pName);
798 m_parameters[vName] = pVar;
806 bool SessionReader::DefinesSolverInfo(
const std::string &pName)
const
808 std::string vName = boost::to_upper_copy(pName);
809 SolverInfoMap::const_iterator infoIter = m_solverInfo.find(vName);
810 return (infoIter != m_solverInfo.end());
817 const std::string& SessionReader::GetSolverInfo(
818 const std::string &pProperty)
const
820 std::string vProperty = boost::to_upper_copy(pProperty);
821 SolverInfoMap::const_iterator iter = m_solverInfo.find(vProperty);
823 ASSERTL1(iter != m_solverInfo.end(),
824 "Unable to find requested property: " + pProperty);
832 void SessionReader::SetSolverInfo(
833 const std::string &pProperty,
const std::string &pValue)
835 std::string vProperty = boost::to_upper_copy(pProperty);
838 ASSERTL1(iter != m_solverInfo.end(),
839 "Unable to find requested property: " + pProperty);
841 iter->second = pValue;
847 void SessionReader::LoadSolverInfo(
848 const std::string &pName,
850 const std::string &pDefault)
const
852 std::string vName = boost::to_upper_copy(pName);
853 SolverInfoMap::const_iterator infoIter = m_solverInfo.find(vName);
854 if(infoIter != m_solverInfo.end())
856 pVar = infoIter->second;
868 void SessionReader::MatchSolverInfo(
869 const std::string &pName,
870 const std::string &pTrueVal,
872 const bool &pDefault)
const
874 std::string vName = boost::to_upper_copy(pName);
875 SolverInfoMap::const_iterator infoIter = m_solverInfo.find(vName);
876 if(infoIter != m_solverInfo.end())
878 pVar = boost::iequals(infoIter->second, pTrueVal);
890 bool SessionReader::MatchSolverInfo(
891 const std::string &pName,
892 const std::string &pTrueVal)
const
894 if (DefinesSolverInfo(pName))
896 std::string vName = boost::to_upper_copy(pName);
897 SolverInfoMap::const_iterator iter = m_solverInfo.find(vName);
898 if(iter != m_solverInfo.end())
910 bool SessionReader::DefinesGlobalSysSolnInfo(
const std::string &pVariable,
911 const std::string &pProperty)
const
914 GloSysSolnInfoList::const_iterator iter =
915 GetGloSysSolnList().find(pVariable);
916 if(iter == GetGloSysSolnList().end())
921 std::string vProperty = boost::to_upper_copy(pProperty);
923 GloSysInfoMap::const_iterator iter1 = iter->second.find(vProperty);
924 if(iter1 == iter->second.end())
936 const std::string &SessionReader::GetGlobalSysSolnInfo(
const std::string &pVariable,
const std::string &pProperty)
const
938 GloSysSolnInfoList::const_iterator iter;
940 ASSERTL0( (iter = GetGloSysSolnList().
find(pVariable)) !=
941 GetGloSysSolnList().end(),
942 "Failed to find variable in GlobalSysSolnInfoList");
944 std::string vProperty = boost::to_upper_copy(pProperty);
945 GloSysInfoMap::const_iterator iter1;
947 ASSERTL0( (iter1 = iter->second.find(vProperty)) != iter->second.end(),
948 "Failed to find property: " + vProperty +
" in GlobalSysSolnInfoList");
950 return iter1->second;
956 bool SessionReader::DefinesGeometricInfo(
const std::string &pName)
const
958 std::string vName = boost::to_upper_copy(pName);
959 GeometricInfoMap::const_iterator iter = m_geometricInfo.find(vName);
960 return (iter != m_geometricInfo.end());
967 void SessionReader::LoadGeometricInfo(
968 const std::string &pName,
970 const std::string &pDefault)
const
972 std::string vName = boost::to_upper_copy(pName);
973 GeometricInfoMap::const_iterator iter = m_geometricInfo.find(vName);
974 if(iter != m_geometricInfo.end())
988 void SessionReader::LoadGeometricInfo(
989 const std::string &pName,
991 const bool &pDefault)
const
993 std::string vName = boost::to_upper_copy(pName);
994 GeometricInfoMap::const_iterator iter = m_geometricInfo.find(vName);
995 if(iter != m_geometricInfo.end())
997 if (iter->second ==
"TRUE")
1016 void SessionReader::LoadGeometricInfo(
1017 const std::string &pName,
1021 std::string vName = boost::to_upper_copy(pName);
1022 GeometricInfoMap::const_iterator iter = m_geometricInfo.find(vName);
1023 if(iter != m_geometricInfo.end())
1025 pVar = std::atoi(iter->second.c_str());
1037 void SessionReader::MatchGeometricInfo(
1038 const std::string &pName,
1039 const std::string &pTrueVal,
1041 const bool &pDefault)
const
1043 std::string vName = boost::to_upper_copy(pName);
1044 GeometricInfoMap::const_iterator iter = m_geometricInfo.find(vName);
1045 if(iter != m_geometricInfo.end())
1047 pVar = boost::iequals(iter->second, pTrueVal);
1059 const std::string& SessionReader::GetVariable(
1060 const unsigned int &idx)
const
1062 ASSERTL0(idx < m_variables.size(),
"Variable index out of range.");
1063 return m_variables[idx];
1071 void SessionReader::SetVariable(
const unsigned int &idx,
1072 std::string newname)
1074 ASSERTL0(idx < m_variables.size(),
"Variable index out of range.");
1075 m_variables[idx] = newname;
1082 std::vector<std::string> SessionReader::GetVariables()
const
1091 bool SessionReader::DefinesFunction(
const std::string &pName)
const
1093 FunctionMap::const_iterator it1;
1094 std::string vName = boost::to_upper_copy(pName);
1096 if ((it1 = m_functions.find(vName)) != m_functions.end())
1107 bool SessionReader::DefinesFunction(
1108 const std::string &pName,
1109 const std::string &pVariable,
1110 const int pDomain)
const
1112 FunctionMap::const_iterator it1;
1113 FunctionVariableMap::const_iterator it2;
1114 std::string vName = boost::to_upper_copy(pName);
1117 if ((it1 = m_functions.find(vName)) != m_functions.end())
1119 pair<std::string, int> key(pVariable,pDomain);
1120 pair<std::string, int> defkey(
"*",pDomain);
1122 (it2 = it1->second.find(key)) != it1->second.end() ||
1123 (it2 = it1->second.find(defkey)) != it1->second.end();
1134 const std::string &pName,
1135 const std::string &pVariable,
1136 const int pDomain)
const
1138 FunctionMap::const_iterator it1;
1139 FunctionVariableMap::const_iterator it2, it3;
1140 std::string vName = boost::to_upper_copy(pName);
1142 ASSERTL0((it1 = m_functions.find(vName)) != m_functions.end(),
1143 std::string(
"No such function '") + pName
1144 + std::string(
"' has been defined in the session file."));
1147 pair<std::string,int> key(pVariable,pDomain);
1148 pair<std::string,int> defkey(
"*",pDomain);
1149 bool specific = (it2 = it1->second.find(key)) !=
1151 bool wildcard = (it3 = it1->second.find(defkey)) !=
1156 "No such variable " + pVariable
1157 +
" in domain " + boost::lexical_cast<string>(pDomain)
1158 +
" defined for function " + pName
1159 +
" in session file.");
1168 std::string(
"Function is defined by a file."));
1169 return it2->second.m_expression;
1177 const std::string &pName,
1178 const unsigned int &pVar,
1179 const int pDomain)
const
1181 ASSERTL0(pVar < m_variables.size(),
"Variable index out of range.");
1182 return GetFunction(pName, m_variables[pVar],pDomain);
1190 const std::string &pName,
1191 const std::string &pVariable,
1192 const int pDomain)
const
1194 FunctionMap::const_iterator it1;
1195 FunctionVariableMap::const_iterator it2, it3;
1196 std::string vName = boost::to_upper_copy(pName);
1198 it1 = m_functions.find(vName);
1199 ASSERTL0 (it1 != m_functions.end(),
1200 std::string(
"Function '") + pName
1201 + std::string(
"' not found."));
1204 pair<std::string,int> key(pVariable,pDomain);
1205 pair<std::string,int> defkey(
"*",pDomain);
1206 bool specific = (it2 = it1->second.find(key)) !=
1208 bool wildcard = (it3 = it1->second.find(defkey)) !=
1213 "No such variable " + pVariable
1214 +
" in domain " + boost::lexical_cast<string>(pDomain)
1215 +
" defined for function " + pName
1216 +
" in session file.");
1224 return it2->second.m_type;
1232 const std::string &pName,
1233 const unsigned int &pVar,
1234 const int pDomain)
const
1236 ASSERTL0(pVar < m_variables.size(),
"Variable index out of range.");
1237 return GetFunctionType(pName, m_variables[pVar],pDomain);
1244 std::string SessionReader::GetFunctionFilename(
1245 const std::string &pName,
1246 const std::string &pVariable,
1247 const int pDomain)
const
1249 FunctionMap::const_iterator it1;
1250 FunctionVariableMap::const_iterator it2, it3;
1251 std::string vName = boost::to_upper_copy(pName);
1253 it1 = m_functions.find(vName);
1254 ASSERTL0 (it1 != m_functions.end(),
1255 std::string(
"Function '") + pName
1256 + std::string(
"' not found."));
1259 pair<std::string,int> key(pVariable,pDomain);
1260 pair<std::string,int> defkey(
"*",pDomain);
1261 bool specific = (it2 = it1->second.find(key)) !=
1263 bool wildcard = (it3 = it1->second.find(defkey)) !=
1268 "No such variable " + pVariable
1269 +
" in domain " + boost::lexical_cast<string>(pDomain)
1270 +
" defined for function " + pName
1271 +
" in session file.");
1279 return it2->second.m_filename;
1286 std::string SessionReader::GetFunctionFilename(
1287 const std::string &pName,
1288 const unsigned int &pVar,
1289 const int pDomain)
const
1291 ASSERTL0(pVar < m_variables.size(),
"Variable index out of range.");
1292 return GetFunctionFilename(pName, m_variables[pVar],pDomain);
1299 std::string SessionReader::GetFunctionFilenameVariable(
1300 const std::string &pName,
1301 const std::string &pVariable,
1302 const int pDomain)
const
1304 FunctionMap::const_iterator it1;
1305 FunctionVariableMap::const_iterator it2, it3;
1306 std::string vName = boost::to_upper_copy(pName);
1308 it1 = m_functions.find(vName);
1309 ASSERTL0 (it1 != m_functions.end(),
1310 std::string(
"Function '") + pName
1311 + std::string(
"' not found."));
1314 pair<std::string,int> key(pVariable,pDomain);
1315 pair<std::string,int> defkey(
"*",pDomain);
1316 bool specific = (it2 = it1->second.find(key)) !=
1318 bool wildcard = (it3 = it1->second.find(defkey)) !=
1323 "No such variable " + pVariable
1324 +
" in domain " + boost::lexical_cast<string>(pDomain)
1325 +
" defined for function " + pName
1326 +
" in session file.");
1334 return it2->second.m_fileVariable;
1343 return m_exprEvaluator;
1350 bool SessionReader::DefinesTag(
const std::string &pName)
const
1352 std::string vName = boost::to_upper_copy(pName);
1353 TagMap::const_iterator vTagIterator = m_tags.find(vName);
1354 return (vTagIterator != m_tags.end());
1361 void SessionReader::SetTag(
1362 const std::string &pName,
1363 const std::string &pValue)
1365 std::string vName = boost::to_upper_copy(pName);
1366 m_tags[vName] = pValue;
1373 const std::string &SessionReader::GetTag(
const std::string& pName)
const
1375 std::string vName = boost::to_upper_copy(pName);
1376 TagMap::const_iterator vTagIterator = m_tags.find(vName);
1377 ASSERTL0(vTagIterator != m_tags.end(),
1378 "Requested tag does not exist.");
1379 return vTagIterator->second;
1395 bool SessionReader::DefinesCmdLineArgument(
1396 const std::string& pName)
const
1398 return (m_cmdLineOptions.find(pName) != m_cmdLineOptions.end());
1405 void SessionReader::SubstituteExpressions(std::string& pExpr)
1408 for (exprIter = m_expressions.begin();
1409 exprIter != m_expressions.end(); ++exprIter)
1411 boost::replace_all(pExpr, exprIter->first, exprIter->second);
1422 return m_bndRegOrder;
1428 void SessionReader::LoadDoc(
1429 const std::string &pFilename,
1430 TiXmlDocument* pDoc)
const
1432 if (pFilename.size() > 3 &&
1433 pFilename.substr(pFilename.size() - 3, 3) ==
".gz")
1435 ifstream file(pFilename.c_str(),
1436 ios_base::in | ios_base::binary);
1437 ASSERTL0(file.good(),
"Unable to open file: " + pFilename);
1439 io::filtering_streambuf<io::input> in;
1440 in.push(io::gzip_decompressor());
1447 catch (io::gzip_error& e)
1450 "Error: File '" + pFilename +
"' is corrupt.");
1453 else if (pFilename.size() > 4 &&
1454 pFilename.substr(pFilename.size() - 4, 4) ==
"_xml")
1456 fs::path pdirname(pFilename);
1457 boost::format pad(
"P%1$07d.xml");
1458 pad % m_comm->GetRank();
1459 fs::path pRankFilename(pad.str());
1460 fs::path fullpath = pdirname / pRankFilename;
1463 ASSERTL0(file.good(),
"Unable to open file: " + fullpath.string());
1468 ifstream file(pFilename.c_str());
1469 ASSERTL0(file.good(),
"Unable to open file: " + pFilename);
1477 TiXmlDocument *SessionReader::MergeDoc(
1478 const std::vector<std::string> &pFilenames)
const
1480 ASSERTL0(pFilenames.size() > 0,
"No filenames for merging.");
1483 TiXmlDocument *vMainDoc =
new TiXmlDocument;
1484 LoadDoc(pFilenames[0], vMainDoc);
1486 TiXmlHandle vMainHandle(vMainDoc);
1487 TiXmlElement* vMainNektar =
1488 vMainHandle.FirstChildElement(
"NEKTAR").Element();
1493 for (
int i = 1; i < pFilenames.size(); ++i)
1495 if((pFilenames[i].compare(pFilenames[i].size()-3,3,
"xml") == 0)
1496 ||(pFilenames[i].compare(pFilenames[i].size()-6,6,
"xml.gz") == 0))
1498 TiXmlDocument* vTempDoc =
new TiXmlDocument;
1499 LoadDoc(pFilenames[i], vTempDoc);
1501 TiXmlHandle docHandle(vTempDoc);
1502 TiXmlElement* vTempNektar;
1503 vTempNektar = docHandle.FirstChildElement(
"NEKTAR").Element();
1504 ASSERTL0(vTempNektar,
"Unable to find NEKTAR tag in file.");
1505 TiXmlElement* p = vTempNektar->FirstChildElement();
1509 TiXmlElement *vMainEntry =
1510 vMainNektar->FirstChildElement(p->Value());
1513 if (!p->FirstChild() && vMainEntry)
1515 std::string warningmsg =
1516 "File " + pFilenames[i] +
" contains " +
1517 "an empty XML element " +
1518 std::string(p->Value()) +
1519 " which will be ignored.";
1526 vMainNektar->RemoveChild(vMainEntry);
1528 TiXmlElement *q =
new TiXmlElement(*p);
1529 vMainNektar->LinkEndChild(q);
1531 p = p->NextSiblingElement();
1544 void SessionReader::ParseDocument()
1547 ASSERTL0(m_xmlDoc,
"No XML document loaded.");
1550 TiXmlHandle docHandle(m_xmlDoc);
1552 e = docHandle.FirstChildElement(
"NEKTAR").
1553 FirstChildElement(
"CONDITIONS").Element();
1558 ReadGlobalSysSolnInfo (e);
1559 ReadExpressions (e);
1563 e = docHandle.FirstChildElement(
"NEKTAR").
1564 FirstChildElement(
"FILTERS").Element();
1573 void SessionReader::CreateComm(
1583 string vCommModule(
"Serial");
1586 vCommModule =
"ParallelMPI";
1597 void SessionReader::PartitionMesh()
1599 ASSERTL0(m_comm.get(),
"Communication not initialised.");
1603 const bool isRoot = m_comm->TreatAsRankZero();
1619 int isPartitioned = 0;
1622 m_xmlDoc = MergeDoc(m_filenames);
1623 if (DefinesElement(
"Nektar/Geometry"))
1625 if (GetElement(
"Nektar/Geometry")->Attribute(
"PARTITION"))
1627 cout <<
"Using pre-partitioned mesh." << endl;
1640 m_xmlDoc = MergeDoc(m_filenames);
1648 string vPartitionerName =
"Metis";
1651 vPartitionerName =
"Scotch";
1653 if (DefinesCmdLineArgument(
"use-metis"))
1655 vPartitionerName =
"Metis";
1657 if (DefinesCmdLineArgument(
"use-scotch"))
1659 vPartitionerName =
"Scotch";
1665 if (DefinesCmdLineArgument(
"part-only")||
1666 DefinesCmdLineArgument(
"part-only-overlapping"))
1671 "The 'part-only' option should be used in serial.");
1678 vPartitionerName, vSession);
1679 if(DefinesCmdLineArgument(
"part-only"))
1681 nParts = GetCmdLineArgument<int>(
"part-only");
1682 vPartitioner->PartitionMesh(nParts,
true);
1686 nParts = GetCmdLineArgument<int>(
"part-only-overlapping");
1687 vPartitioner->PartitionMesh(nParts,
true,
true);
1689 vPartitioner->WriteAllPartitions(vSession);
1690 vPartitioner->GetCompositeOrdering(m_compOrder);
1691 vPartitioner->GetBndRegionOrdering(m_bndRegOrder);
1693 if (isRoot && DefinesCmdLineArgument(
"part-info"))
1695 vPartitioner->PrintPartInfo(std::cout);
1701 else if (vCommMesh->GetSize() > 1)
1704 int nParts = vCommMesh->GetSize();
1705 if (m_sharedFilesystem)
1708 vector<unsigned int> keys, vals;
1713 m_xmlDoc = MergeDoc(m_filenames);
1717 vPartitionerName, vSession);
1718 vPartitioner->PartitionMesh(nParts,
true);
1719 vPartitioner->WriteAllPartitions(vSession);
1720 vPartitioner->GetCompositeOrdering(m_compOrder);
1721 vPartitioner->GetBndRegionOrdering(m_bndRegOrder);
1728 keys[0] = m_compOrder.size();
1729 keys[1] = m_bndRegOrder.size();
1731 for (i = 1; i < vComm->GetSize(); ++i)
1733 vComm->Send(i, keys);
1739 keys.resize(m_compOrder.size());
1740 vals.resize(m_compOrder.size());
1742 for (cIt = m_compOrder.begin(), i = 0;
1743 cIt != m_compOrder.end(); ++cIt, ++i)
1745 keys[i] = cIt->first;
1746 vals[i] = cIt->second.size();
1750 for (i = 1; i < vComm->GetSize(); ++i)
1752 vComm->Send(i, keys);
1753 vComm->Send(i, vals);
1755 for (cIt = m_compOrder.begin();
1756 cIt != m_compOrder.end(); ++cIt)
1758 vComm->Send(i, cIt->second);
1765 keys.resize(m_bndRegOrder.size());
1766 vals.resize(m_bndRegOrder.size());
1768 for (bIt = m_bndRegOrder.begin(), i = 0;
1769 bIt != m_bndRegOrder.end(); ++bIt, ++i)
1771 keys[i] = bIt->first;
1772 vals[i] = bIt->second.size();
1776 for (i = 1; i < vComm->GetSize(); ++i)
1778 vComm->Send(i, keys);
1779 vComm->Send(i, vals);
1781 for (bIt = m_bndRegOrder.begin();
1782 bIt != m_bndRegOrder.end(); ++bIt)
1784 vComm->Send(i, bIt->second);
1788 if (DefinesCmdLineArgument(
"part-info"))
1790 vPartitioner->PrintPartInfo(std::cout);
1796 vComm->Recv(0, keys);
1798 int cmpSize = keys[0];
1799 int bndSize = keys[1];
1801 keys.resize(cmpSize);
1802 vals.resize(cmpSize);
1803 vComm->Recv(0, keys);
1804 vComm->Recv(0, vals);
1806 for (
int i = 0; i < keys.size(); ++i)
1808 vector<unsigned int> tmp(vals[i]);
1809 vComm->Recv(0, tmp);
1810 m_compOrder[keys[i]] = tmp;
1813 keys.resize(bndSize);
1814 vals.resize(bndSize);
1815 vComm->Recv(0, keys);
1816 vComm->Recv(0, vals);
1818 for (
int i = 0; i < keys.size(); ++i)
1820 vector<unsigned int> tmp(vals[i]);
1821 vComm->Recv(0, tmp);
1822 m_bndRegOrder[keys[i]] = tmp;
1831 m_xmlDoc = MergeDoc(m_filenames);
1839 vPartitionerName, vSession);
1840 vPartitioner->PartitionMesh(nParts,
false);
1841 vPartitioner->WriteLocalPartition(vSession);
1842 vPartitioner->GetCompositeOrdering(m_compOrder);
1843 vPartitioner->GetBndRegionOrdering(m_bndRegOrder);
1845 if (DefinesCmdLineArgument(
"part-info") && isRoot)
1847 vPartitioner->PrintPartInfo(std::cout);
1852 std::string dirname = GetSessionName() +
"_xml";
1853 fs::path pdirname(dirname);
1854 boost::format pad(
"P%1$07d.xml");
1855 pad % m_comm->GetRowComm()->GetRank();
1856 fs::path pFilename(pad.str());
1857 fs::path fullpath = pdirname / pFilename;
1865 m_xmlDoc =
new TiXmlDocument(vFilename);
1867 ASSERTL0(m_xmlDoc,
"Failed to create XML document object.");
1869 bool loadOkay = m_xmlDoc->LoadFile(vFilename);
1870 ASSERTL0(loadOkay,
"Unable to load file: " + vFilename +
1871 ". Check XML standards compliance. Error on line: " +
1872 boost::lexical_cast<std::string>(m_xmlDoc->Row()));
1876 m_xmlDoc = MergeDoc(m_filenames);
1888 void SessionReader::PartitionComm()
1890 if (m_comm->GetSize() > 1)
1896 if (DefinesCmdLineArgument(
"npx")) {
1897 nProcX = GetCmdLineArgument<int>(
"npx");
1899 if (DefinesCmdLineArgument(
"npy")) {
1900 nProcY = GetCmdLineArgument<int>(
"npy");
1902 if (DefinesCmdLineArgument(
"npz")) {
1903 nProcZ = GetCmdLineArgument<int>(
"npz");
1905 if (DefinesCmdLineArgument(
"nsz")) {
1906 nStripZ = GetCmdLineArgument<int>(
"nsz");
1908 ASSERTL0(m_comm->GetSize() % (nProcZ*nProcY*nProcX) == 0,
1909 "Cannot exactly partition using PROC_Z value.");
1911 "Cannot exactly partition using PROC_Y value.");
1913 "Cannot exactly partition using PROC_X value.");
1916 int nProcSm = nProcZ * nProcY * nProcX;
1920 int nProcSem = m_comm->GetSize() / nProcSm;
1922 m_comm->SplitComm(nProcSm,nProcSem);
1923 m_comm->GetColumnComm()->SplitComm(nProcZ/nStripZ,nStripZ);
1924 m_comm->GetColumnComm()->GetColumnComm()->SplitComm(
1925 (nProcY*nProcX),nProcZ/nStripZ);
1926 m_comm->GetColumnComm()->GetColumnComm()->GetColumnComm()
1927 ->SplitComm(nProcX,nProcY);
1935 void SessionReader::ReadParameters(TiXmlElement *conditions)
1937 m_parameters.clear();
1944 TiXmlElement *parametersElement = conditions->FirstChildElement(
1949 if (parametersElement)
1951 TiXmlElement *parameter =
1952 parametersElement->FirstChildElement(
"P");
1960 stringstream tagcontent;
1961 tagcontent << *parameter;
1962 TiXmlNode *node = parameter->FirstChild();
1964 while (node && node->Type() != TiXmlNode::TINYXML_TEXT)
1966 node = node->NextSibling();
1972 std::string line = node->ToText()->Value(),
lhs, rhs;
1975 ParseEquals(line,
lhs, rhs);
1979 ASSERTL0(
false,
"Syntax error in parameter "
1980 "expression '" + line
1981 +
"' in XML element: \n\t'"
1982 + tagcontent.str() +
"'");
1988 if (!
lhs.empty() && !rhs.empty())
1994 GetSharedThisPtr(), rhs);
1997 catch (
const std::runtime_error &)
2000 "Error evaluating parameter expression"
2001 " '" + rhs +
"' in XML element: \n\t'"
2002 + tagcontent.str() +
"'");
2004 m_exprEvaluator.SetParameter(
lhs, value);
2005 caseSensitiveParameters[
lhs] = value;
2006 boost::to_upper(
lhs);
2007 m_parameters[
lhs] = value;
2011 parameter = parameter->NextSiblingElement();
2020 void SessionReader::ReadSolverInfo(TiXmlElement *conditions)
2022 m_solverInfo.clear();
2023 m_solverInfo = GetSolverInfoDefaults();
2030 TiXmlElement *solverInfoElement =
2031 conditions->FirstChildElement(
"SOLVERINFO");
2033 if (solverInfoElement)
2035 TiXmlElement *solverInfo =
2036 solverInfoElement->FirstChildElement(
"I");
2040 std::stringstream tagcontent;
2041 tagcontent << *solverInfo;
2043 ASSERTL0(solverInfo->Attribute(
"PROPERTY"),
2044 "Missing PROPERTY attribute in solver info "
2045 "XML element: \n\t'" + tagcontent.str() +
"'");
2046 std::string solverProperty =
2047 solverInfo->Attribute(
"PROPERTY");
2049 "PROPERTY attribute must be non-empty in XML "
2050 "element: \n\t'" + tagcontent.str() +
"'");
2053 std::string solverPropertyUpper =
2054 boost::to_upper_copy(solverProperty);
2057 ASSERTL0(solverInfo->Attribute(
"VALUE"),
2058 "Missing VALUE attribute in solver info "
2059 "XML element: \n\t'" + tagcontent.str() +
"'");
2060 std::string solverValue = solverInfo->Attribute(
"VALUE");
2062 "VALUE attribute must be non-empty in XML "
2063 "element: \n\t'" + tagcontent.str() +
"'");
2066 m_solverInfo[solverPropertyUpper] = solverValue;
2067 solverInfo = solverInfo->NextSiblingElement(
"I");
2071 if (m_comm && m_comm->GetRowComm()->GetSize() > 1)
2074 m_solverInfo[
"GLOBALSYSSOLN"] ==
"IterativeFull" ||
2075 m_solverInfo[
"GLOBALSYSSOLN"] ==
"IterativeStaticCond" ||
2076 m_solverInfo[
"GLOBALSYSSOLN"] ==
2077 "IterativeMultiLevelStaticCond" ||
2078 m_solverInfo[
"GLOBALSYSSOLN"] ==
"XxtFull" ||
2079 m_solverInfo[
"GLOBALSYSSOLN"] ==
"XxtStaticCond" ||
2080 m_solverInfo[
"GLOBALSYSSOLN"] ==
2081 "XxtMultiLevelStaticCond" ||
2082 m_solverInfo[
"GLOBALSYSSOLN"] ==
"PETScFull" ||
2083 m_solverInfo[
"GLOBALSYSSOLN"] ==
"PETScStaticCond" ||
2084 m_solverInfo[
"GLOBALSYSSOLN"] ==
2085 "PETScMultiLevelStaticCond",
2086 "A parallel solver must be used when run in parallel.");
2095 void SessionReader::ReadGlobalSysSolnInfo(TiXmlElement *conditions)
2097 GetGloSysSolnList().clear();
2104 TiXmlElement *GlobalSys =
2105 conditions->FirstChildElement(
"GLOBALSYSSOLNINFO");
2112 TiXmlElement *VarInfo = GlobalSys->FirstChildElement(
"V");
2116 std::stringstream tagcontent;
2117 tagcontent << *VarInfo;
2118 ASSERTL0(VarInfo->Attribute(
"VAR"),
2119 "Missing VAR attribute in GobalSysSolnInfo XML "
2120 "element: \n\t'" + tagcontent.str() +
"'");
2122 std::string VarList = VarInfo->Attribute(
"VAR");
2124 "VAR attribute must be non-empty in XML element:\n\t'"
2125 + tagcontent.str() +
"'");
2128 std::vector<std::string> varStrings;
2129 bool valid = ParseUtils::GenerateOrderedStringVector(
2130 VarList.c_str(),varStrings);
2132 ASSERTL0(valid,
"Unable to process list of variable in XML "
2133 "element \n\t'" + tagcontent.str() +
"'");
2135 if(varStrings.size())
2137 TiXmlElement *SysSolnInfo = VarInfo->FirstChildElement(
"I");
2142 tagcontent << *SysSolnInfo;
2144 ASSERTL0(SysSolnInfo->Attribute(
"PROPERTY"),
2145 "Missing PROPERTY attribute in "
2146 "GlobalSysSolnInfo for variable(s) '"
2147 + VarList +
"' in XML element: \n\t'"
2148 + tagcontent.str() +
"'");
2150 std::string SysSolnProperty =
2151 SysSolnInfo->Attribute(
"PROPERTY");
2154 "GlobalSysSolnIno properties must have a "
2155 "non-empty name for variable(s) : '"
2156 + VarList +
"' in XML element: \n\t'"
2157 + tagcontent.str() +
"'");
2160 std::string SysSolnPropertyUpper =
2161 boost::to_upper_copy(SysSolnProperty);
2164 ASSERTL0(SysSolnInfo->Attribute(
"VALUE"),
2165 "Missing VALUE attribute in GlobalSysSolnInfo "
2166 "for variable(s) '" + VarList
2167 +
"' in XML element: \n\t"
2168 + tagcontent.str() +
"'");
2170 std::string SysSolnValue =
2171 SysSolnInfo->Attribute(
"VALUE");
2173 "GlobalSysSolnInfo properties must have a "
2174 "non-empty value for variable(s) '"
2175 + VarList +
"' in XML element: \n\t'"
2176 + tagcontent.str() +
"'");
2179 for(
int i = 0; i < varStrings.size(); ++i)
2182 if ((x = GetGloSysSolnList().
find(varStrings[i])) ==
2183 GetGloSysSolnList().end())
2185 (GetGloSysSolnList()[varStrings[i]])[
2186 SysSolnPropertyUpper] = SysSolnValue;
2190 x->second[SysSolnPropertyUpper] = SysSolnValue;
2194 SysSolnInfo = SysSolnInfo->NextSiblingElement(
"I");
2196 VarInfo = VarInfo->NextSiblingElement(
"V");
2200 if (m_verbose && GetGloSysSolnList().size() > 0 && m_comm)
2202 if(m_comm->GetRank() == 0)
2204 cout <<
"GlobalSysSoln Info:" << endl;
2207 for (x = GetGloSysSolnList().begin();
2208 x != GetGloSysSolnList().end();
2211 cout <<
"\t Variable: " << x->first << endl;
2214 for (y = x->second.begin(); y != x->second.end(); ++y)
2216 cout <<
"\t\t " << y->first <<
" = " << y->second
2229 void SessionReader::ReadExpressions(TiXmlElement *conditions)
2231 m_expressions.clear();
2238 TiXmlElement *expressionsElement =
2239 conditions->FirstChildElement(
"EXPRESSIONS");
2241 if (expressionsElement)
2243 TiXmlElement *expr = expressionsElement->FirstChildElement(
"E");
2247 stringstream tagcontent;
2248 tagcontent << *expr;
2250 "Missing NAME attribute in expression "
2251 "definition: \n\t'" + tagcontent.str() +
"'");
2252 std::string nameString = expr->Attribute(
"NAME");
2254 "Expressions must have a non-empty name: \n\t'"
2255 + tagcontent.str() +
"'");
2258 "Missing VALUE attribute in expression "
2259 "definition: \n\t'" + tagcontent.str() +
"'");
2260 std::string valString = expr->Attribute(
"VALUE");
2262 "Expressions must have a non-empty value: \n\t'"
2263 + tagcontent.str() +
"'");
2266 = m_expressions.find(nameString);
2267 ASSERTL0(exprIter == m_expressions.end(),
2268 std::string(
"Expression '") + nameString
2269 + std::string(
"' already specified."));
2271 m_expressions[nameString] = valString;
2272 expr = expr->NextSiblingElement(
"E");
2281 void SessionReader::ReadVariables(TiXmlElement *conditions)
2283 m_variables.clear();
2290 TiXmlElement *variablesElement =
2291 conditions->FirstChildElement(
"VARIABLES");
2295 if (variablesElement)
2297 TiXmlElement *varElement =
2298 variablesElement->FirstChildElement(
"V");
2301 int nextVariableNumber = -1;
2305 stringstream tagcontent;
2306 tagcontent << *varElement;
2310 nextVariableNumber++;
2313 int err = varElement->QueryIntAttribute(
"ID", &i);
2315 "Variables must have a unique ID number attribute "
2316 "in XML element: \n\t'" + tagcontent.str() +
"'");
2318 "ID numbers for variables must begin with zero and"
2319 " be sequential in XML element: \n\t'"
2320 + tagcontent.str() +
"'");
2322 TiXmlNode* varChild = varElement->FirstChild();
2327 while(varChild && varChild->Type() != TiXmlNode::TINYXML_TEXT)
2329 varChild = varChild->NextSibling();
2333 "Unable to read variable definition body for "
2335 + boost::lexical_cast<string>(i)
2336 +
" in XML element: \n\t'"
2337 + tagcontent.str() +
"'");
2338 std::string variableName = varChild->ToText()->ValueStr();
2340 std::istringstream variableStrm(variableName);
2341 variableStrm >> variableName;
2344 variableName) == m_variables.end(),
2346 + boost::lexical_cast<
string>(i)
2347 +
" in XML element \n\t'" + tagcontent.str()
2348 +
"'\nhas already been defined.");
2350 m_variables.push_back(variableName);
2352 varElement = varElement->NextSiblingElement(
"V");
2356 "Number of variables must be greater than zero.");
2364 void SessionReader::ReadFunctions(TiXmlElement *conditions)
2366 m_functions.clear();
2374 TiXmlElement *
function = conditions->FirstChildElement(
"FUNCTION");
2377 stringstream tagcontent;
2378 tagcontent << *
function;
2381 ASSERTL0(function->Attribute(
"NAME"),
2382 "Functions must have a NAME attribute defined in XML "
2383 "element: \n\t'" + tagcontent.str() +
"'");
2384 std::string functionStr =
function->Attribute(
"NAME");
2386 "Functions must have a non-empty name in XML "
2387 "element: \n\t'" + tagcontent.str() +
"'");
2390 boost::to_upper(functionStr);
2393 TiXmlElement *variable =
function->FirstChildElement();
2402 std::string conditionType = variable->Value();
2405 std::string variableStr;
2406 if (!variable->Attribute(
"VAR"))
2412 variableStr = variable->Attribute(
"VAR");
2416 std::vector<std::string> variableList;
2417 ParseUtils::GenerateOrderedStringVector(variableStr.c_str(),
2421 std::string domainStr;
2422 if (!variable->Attribute(
"DOMAIN"))
2428 domainStr = variable->Attribute(
"DOMAIN");
2432 std::vector<std::string> varSplit;
2433 std::vector<unsigned int> domainList;
2434 ParseUtils::GenerateSeqVector(domainStr.c_str(), domainList);
2437 if (conditionType ==
"E")
2442 ASSERTL0(variable->Attribute(
"VALUE"),
2443 "Attribute VALUE expected for function '"
2444 + functionStr +
"'.");
2445 std::string fcnStr = variable->Attribute(
"VALUE");
2448 (std::string(
"Expression for var: ")
2450 + std::string(
" must be specified.")).c_str());
2452 SubstituteExpressions(fcnStr);
2460 else if (conditionType ==
"F")
2462 if (variable->Attribute(
"TIMEDEPENDENT") &&
2463 boost::lexical_cast<
bool>(variable->Attribute(
"TIMEDEPENDENT")))
2473 ASSERTL0(variable->Attribute(
"FILE"),
2474 "Attribute FILE expected for function '"
2475 + functionStr +
"'.");
2476 std::string filenameStr = variable->Attribute(
"FILE");
2479 "A filename must be specified for the FILE "
2480 "attribute of function '" + functionStr
2483 std::vector<std::string> fSplit;
2484 boost::split(fSplit, filenameStr, boost::is_any_of(
":"));
2486 ASSERTL0(fSplit.size() == 1 || fSplit.size() == 2,
2487 "Incorrect filename specification in function "
2488 + functionStr +
"'. "
2489 "Specify variables inside file as: "
2490 "filename:var1,var2");
2495 if (fSplit.size() == 2)
2498 "Filename variable mapping not valid "
2499 "when using * as a variable inside "
2500 "function '" + functionStr +
"'.");
2503 varSplit, fSplit[1], boost::is_any_of(
","));
2504 ASSERTL0(varSplit.size() == variableList.size(),
2505 "Filename variables should contain the "
2506 "same number of variables defined in "
2507 "VAR in function " + functionStr +
"'.");
2514 stringstream tagcontent;
2515 tagcontent << *variable;
2518 "Identifier " + conditionType +
" in function "
2519 + std::string(function->Attribute(
"NAME"))
2520 +
" is not recognised in XML element: \n\t'"
2521 + tagcontent.str() +
"'");
2527 for (
unsigned int i = 0; i < variableList.size(); ++i)
2529 for(
unsigned int j = 0; j < domainList.size(); ++j)
2532 pair<std::string,int> key(variableList[i],domainList[j]);
2534 = functionVarMap.find(key);
2535 ASSERTL0(fcnsIter == functionVarMap.end(),
2536 "Error setting expression '" + variableList[i]
2538 + boost::lexical_cast<std::string>(domainList[j])
2539 +
"' in function '" + functionStr +
"'. "
2540 "Expression has already been defined.");
2542 if (varSplit.size() > 0)
2546 functionVarMap[key] = funcDef2;
2550 functionVarMap[key] = funcDef;
2555 variable = variable->NextSiblingElement();
2558 m_functions[functionStr] = functionVarMap;
2559 function =
function->NextSiblingElement(
"FUNCTION");
2567 void SessionReader::ReadFilters(TiXmlElement *filters)
2576 TiXmlElement *filter = filters->FirstChildElement(
"FILTER");
2579 ASSERTL0(filter->Attribute(
"TYPE"),
2580 "Missing attribute 'TYPE' for filter.");
2581 std::string typeStr = filter->Attribute(
"TYPE");
2583 std::map<std::string, std::string> vParams;
2585 TiXmlElement *param = filter->FirstChildElement(
"PARAM");
2589 "Missing attribute 'NAME' for parameter in filter "
2591 std::string nameStr = param->Attribute(
"NAME");
2593 ASSERTL0(param->GetText(),
"Empty value string for param.");
2594 std::string valueStr = param->GetText();
2596 vParams[nameStr] = valueStr;
2598 param = param->NextSiblingElement(
"PARAM");
2601 m_filters.push_back(
2602 std::pair<std::string, FilterParams>(typeStr, vParams));
2604 filter = filter->NextSiblingElement(
"FILTER");
2608 void SessionReader::ParseEquals(
2609 const std::string &line,
2614 int beg = line.find_first_not_of(
" ");
2615 int end = line.find_first_of(
"=");
2617 if (beg == end)
throw 1;
2619 if (end != line.find_last_of(
"="))
throw 1;
2621 if (end == std::string::npos)
throw 1;
2623 lhs = line.substr(line.find_first_not_of(
" "),
2625 lhs = lhs .substr(0, lhs.find_last_not_of(
" ")+1);
2626 rhs = line.substr(line.find_last_of(
"=")+1);
2627 rhs = rhs .substr(rhs.find_first_not_of(
" "));
2628 rhs = rhs .substr(0, rhs.find_last_not_of(
" ")+1);
2634 void SessionReader::CmdLineOverride()
2637 if (m_cmdLineOptions.count(
"solverinfo"))
2639 std::vector<std::string> solverInfoList =
2640 m_cmdLineOptions[
"solverinfo"].as<
2641 std::vector<std::string> >();
2643 for (
int i = 0; i < solverInfoList.size(); ++i)
2645 std::string
lhs, rhs;
2649 ParseEquals(solverInfoList[i], lhs, rhs);
2653 ASSERTL0(
false,
"Parse error with command line "
2654 "option: "+solverInfoList[i]);
2657 std::string lhsUpper = boost::to_upper_copy(lhs);
2658 m_solverInfo[lhsUpper] = rhs;
2662 if (m_cmdLineOptions.count(
"parameter"))
2664 std::vector<std::string> parametersList =
2665 m_cmdLineOptions[
"parameter"].as<
2666 std::vector<std::string> >();
2668 for (
int i = 0; i < parametersList.size(); ++i)
2670 std::string
lhs, rhs;
2674 ParseEquals(parametersList[i], lhs, rhs);
2678 ASSERTL0(
false,
"Parse error with command line "
2679 "option: "+parametersList[i]);
2682 std::string lhsUpper = boost::to_upper_copy(lhs);
2686 m_parameters[lhsUpper] =
2691 ASSERTL0(
false,
"Unable to convert string: "+rhs+
2692 "to double value.");
2698 void SessionReader::VerifySolverInfo()
2700 SolverInfoMap::const_iterator x;
2701 for (x = m_solverInfo.begin(); x != m_solverInfo.end(); ++x)
2703 std::string solverProperty = x->first;
2704 std::string solverValue = x->second;
2706 EnumMapList::const_iterator propIt =
2707 GetSolverInfoEnums().find(solverProperty);
2708 if (propIt != GetSolverInfoEnums().end())
2710 EnumMap::const_iterator valIt =
2711 propIt->second.find(solverValue);
2712 ASSERTL0(valIt != propIt->second.end(),
2713 "Value '" + solverValue +
"' is not valid for "
2714 "property '" + solverProperty +
"'");
2720 void SessionReader::SetUpXmlDoc(
void)
2722 m_xmlDoc = MergeDoc(m_filenames);
std::map< std::string, std::string > SolverInfoMap
#define ASSERTL0(condition, msg)
tBaseSharedPtr CreateInstance(tKey idKey BOOST_PP_COMMA_IF(MAX_PARAM) BOOST_PP_ENUM_BINARY_PARAMS(MAX_PARAM, tParam, x))
Create an instance of the class referred to by idKey.
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
boost::shared_ptr< MeshPartition > MeshPartitionSharedPtr
std::map< int, std::vector< unsigned int > > BndRegionOrdering
std::map< int, std::vector< unsigned int > > CompositeOrdering
boost::shared_ptr< SessionReader > SessionReaderSharedPtr
CommFactory & GetCommFactory()
EquationSharedPtr m_expression
boost::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
const std::string kGitSha1
std::map< std::string, GloSysInfoMap > GloSysSolnInfoList
int GetSize(const Array< OneD, const NekDouble > &x)
NekDouble Evaluate() const
#define WARNINGL0(condition, msg)
std::vector< std::pair< std::string, FilterParams > > FilterMap
std::string PortablePath(const boost::filesystem::path &path)
create portable path on different platforms for boost::filesystem path
const std::string kGitBranch
boost::shared_ptr< Equation > EquationSharedPtr
This class defines evaluator of analytic (symbolic) mathematical expressions. Expressions are allowed...
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator
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
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
MeshPartitionFactory & GetMeshPartitionFactory()