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);
199 if (m_comm->GetSize() > 1)
201 GetSolverInfoDefaults()[
"GLOBALSYSSOLN"] =
202 "IterativeStaticCond";
210 SessionReader::SessionReader(
213 const std::vector<std::string> &pFilenames,
216 ASSERTL0(pFilenames.size() > 0,
"No filenames specified.");
218 ParseCommandLineArguments(argc, argv);
220 m_filenames = pFilenames;
222 m_sessionName = ParseSessionName(m_filenames);
227 CreateComm(argc, argv);
233 if (m_comm->GetSize() > 1)
235 GetSolverInfoDefaults()[
"GLOBALSYSSOLN"] =
236 "IterativeStaticCond";
242 if (m_comm->GetSize() > 1)
244 GetSolverInfoDefaults()[
"GLOBALSYSSOLN"] =
245 "IterativeStaticCond";
253 SessionReader::~SessionReader()
265 void SessionReader::InitSession()
267 m_exprEvaluator.SetRandomSeed((m_comm->GetRank() + 1) * time(NULL));
283 if (m_verbose && m_comm)
285 if (m_comm->GetRank() == 0 && m_parameters.size() > 0)
287 cout <<
"Parameters:" << endl;
289 for (x = m_parameters.begin(); x != m_parameters.end(); ++x)
291 cout <<
"\t" << x->first <<
" = " << x->second << endl;
296 if (m_comm->GetRank() == 0 && m_solverInfo.size() > 0)
298 cout <<
"Solver Info:" << endl;
300 for (x = m_solverInfo.begin(); x != m_solverInfo.end(); ++x)
302 cout <<
"\t" << x->first <<
" = " << x->second << endl;
314 std::vector<std::string> SessionReader::ParseCommandLineArguments(
315 int argc,
char *argv[])
318 po::options_description desc(
"Allowed options");
320 (
"verbose,v",
"be verbose")
321 (
"version,V",
"print version information")
322 (
"help,h",
"print this help message")
323 (
"solverinfo,I", po::value<vector<std::string> >(),
324 "override a SOLVERINFO property")
325 (
"parameter,P", po::value<vector<std::string> >(),
326 "override a parameter")
327 (
"shared-filesystem,s",
"Using shared filesystem.")
328 (
"npx", po::value<int>(),
329 "number of procs in X-dir")
330 (
"npy", po::value<int>(),
331 "number of procs in Y-dir")
332 (
"npz", po::value<int>(),
333 "number of procs in Z-dir")
334 (
"nsz", po::value<int>(),
335 "number of slices in Z-dir")
336 (
"part-only", po::value<int>(),
337 "only partition mesh into N partitions.")
338 (
"part-info",
"Output partition information")
341 CmdLineArgMap::const_iterator cmdIt;
342 for (cmdIt = GetCmdLineArgMap().begin();
343 cmdIt != GetCmdLineArgMap().end(); ++cmdIt)
345 std::string names = cmdIt->first;
346 if (cmdIt->second.shortName !=
"")
348 names +=
"," + cmdIt->second.shortName;
350 if (cmdIt->second.isFlag)
353 (names.c_str(), cmdIt->second.description.c_str())
359 (names.c_str(), po::value<std::string>(),
360 cmdIt->second.description.c_str())
367 po::options_description hidden(
"Hidden options");
369 (
"input-file", po::value< vector<string> >(),
374 po::options_description all(
"All options");
375 all.add(desc).add(hidden);
378 po::positional_options_description p;
379 p.add(
"input-file", -1);
382 po::parsed_options parsed = po::command_line_parser(argc, argv).
385 allow_unregistered().
389 po::store(parsed, m_cmdLineOptions);
390 po::notify(m_cmdLineOptions);
393 if (m_cmdLineOptions.count(
"help"))
400 if (m_cmdLineOptions.count(
"version"))
408 boost::replace_all(branch,
"refs/heads/",
"");
410 cout <<
" (git changeset " << sha1.substr(0, 8) <<
", ";
414 cout <<
"detached head";
418 cout <<
"head " << branch;
429 if (m_cmdLineOptions.count(
"verbose"))
439 std::vector< po::basic_option<char> >
::iterator x;
440 for (x = parsed.options.begin(); x != parsed.options.end(); ++x)
444 cout <<
"Warning: Unknown option: " << x->string_key
450 if (m_cmdLineOptions.count(
"input-file"))
452 return m_cmdLineOptions[
"input-file"].as<
453 std::vector<std::string> >();
457 return std::vector<std::string>();
465 std::string SessionReader::ParseSessionName(
466 std::vector<std::string> &filenames)
469 "At least one filename expected.");
471 std::string retval =
"";
474 std::string fname = filenames[0];
477 if (fname.size() > 4 &&
478 fname.substr(fname.size() - 4, 4) ==
"_xml")
480 retval = fname.substr(0, fname.find_last_of(
"_"));
483 else if (fname.size() > 4 &&
484 fname.substr(fname.size() - 4, 4) ==
".xml")
486 retval = fname.substr(0, fname.find_last_of(
"."));
489 else if (fname.size() > 7 &&
490 fname.substr(fname.size() - 7, 7) ==
".xml.gz")
492 retval = fname.substr(0, fname.find_last_of(
"."));
493 retval = retval.substr(0, retval.find_last_of(
"."));
503 TiXmlDocument& SessionReader::GetDocument()
505 ASSERTL1(m_xmlDoc,
"XML Document not defined.");
532 TiXmlElement* SessionReader::GetElement(
const string& pPath)
534 std::string vPath = boost::to_upper_copy(pPath);
535 std::vector<std::string> st;
536 boost::split(st, vPath, boost::is_any_of(
"\\/ "));
537 ASSERTL0(st.size() > 0,
"No path given in XML element request.");
539 TiXmlElement* vReturn = m_xmlDoc->FirstChildElement(st[0].c_str());
540 ASSERTL0(vReturn, std::string(
"Cannot find element '")
541 + st[0] + std::string(
"'."));
542 for (
int i = 1; i < st.size(); ++i)
544 vReturn = vReturn->FirstChildElement(st[i].c_str());
545 ASSERTL0(vReturn, std::string(
"Cannot find element '")
546 + st[i] + std::string(
"'."));
555 bool SessionReader::DefinesElement(
const std::string &pPath)
const
557 std::string vPath = boost::to_upper_copy(pPath);
558 std::vector<std::string> st;
559 boost::split(st, vPath, boost::is_any_of(
"\\/ "));
560 ASSERTL0(st.size() > 0,
"No path given in XML element request.");
562 TiXmlElement* vReturn = m_xmlDoc->FirstChildElement(st[0].c_str());
563 ASSERTL0(vReturn, std::string(
"Cannot find element '")
564 + st[0] + std::string(
"'."));
565 for (
int i = 1; i < st.size(); ++i)
567 vReturn = vReturn->FirstChildElement(st[i].c_str());
568 if (!vReturn)
return false;
577 const std::vector<std::string>& SessionReader::GetFilenames()
const
586 const std::string& SessionReader::GetSessionName()
const
588 return m_sessionName;
596 const std::string SessionReader::GetSessionNameRank()
const
598 std::string dirname = m_sessionName +
"_xml";
599 fs::path pdirname(dirname);
601 std::string vFilename =
"P" + boost::lexical_cast<std::string>(m_comm->GetRowComm()->GetRank());
602 fs::path pFilename(vFilename);
604 fs::path fullpath = pdirname / pFilename;
633 bool SessionReader::DefinesParameter(
const std::string& pName)
const
635 std::string vName = boost::to_upper_copy(pName);
636 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
637 return (paramIter != m_parameters.end());
650 const std::string& pName)
const
652 std::string vName = boost::to_upper_copy(pName);
653 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
655 ASSERTL0(paramIter != m_parameters.end(),
656 "Unable to find requested parameter: " + pName);
658 return paramIter->second;
665 void SessionReader::LoadParameter(
666 const std::string &pName,
int &pVar)
const
668 std::string vName = boost::to_upper_copy(pName);
669 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
670 ASSERTL0(paramIter != m_parameters.end(),
"Required parameter '" +
671 pName +
"' not specified in session.");
672 pVar = (int)floor(paramIter->second);
679 void SessionReader::LoadParameter(
680 const std::string &pName,
int &pVar,
const int &pDefault)
const
682 std::string vName = boost::to_upper_copy(pName);
683 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
684 if(paramIter != m_parameters.end())
686 pVar = (int)floor(paramIter->second);
698 void SessionReader::LoadParameter(
699 const std::string &pName,
NekDouble& pVar)
const
701 std::string vName = boost::to_upper_copy(pName);
702 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
703 ASSERTL0(paramIter != m_parameters.end(),
"Required parameter '" +
704 pName +
"' not specified in session.");
705 pVar = paramIter->second;
712 void SessionReader::LoadParameter(
713 const std::string &pName,
717 std::string vName = boost::to_upper_copy(pName);
718 ParameterMap::const_iterator paramIter = m_parameters.find(vName);
719 if(paramIter != m_parameters.end())
721 pVar = paramIter->second;
734 void SessionReader::SetParameter(
const std::string &pName,
int &pVar)
736 std::string vName = boost::to_upper_copy(pName);
737 m_parameters[vName] = pVar;
744 void SessionReader::SetParameter(
745 const std::string &pName,
NekDouble& pVar)
747 std::string vName = boost::to_upper_copy(pName);
748 m_parameters[vName] = pVar;
756 bool SessionReader::DefinesSolverInfo(
const std::string &pName)
const
758 std::string vName = boost::to_upper_copy(pName);
759 SolverInfoMap::const_iterator infoIter = m_solverInfo.find(vName);
760 return (infoIter != m_solverInfo.end());
767 const std::string& SessionReader::GetSolverInfo(
768 const std::string &pProperty)
const
770 std::string vProperty = boost::to_upper_copy(pProperty);
771 SolverInfoMap::const_iterator iter = m_solverInfo.find(vProperty);
773 ASSERTL1(iter != m_solverInfo.end(),
774 "Unable to find requested property: " + pProperty);
782 void SessionReader::SetSolverInfo(
783 const std::string &pProperty,
const std::string &pValue)
785 std::string vProperty = boost::to_upper_copy(pProperty);
788 ASSERTL1(iter != m_solverInfo.end(),
789 "Unable to find requested property: " + pProperty);
791 iter->second = pValue;
797 void SessionReader::LoadSolverInfo(
798 const std::string &pName,
800 const std::string &pDefault)
const
802 std::string vName = boost::to_upper_copy(pName);
803 SolverInfoMap::const_iterator infoIter = m_solverInfo.find(vName);
804 if(infoIter != m_solverInfo.end())
806 pVar = infoIter->second;
818 void SessionReader::MatchSolverInfo(
819 const std::string &pName,
820 const std::string &pTrueVal,
822 const bool &pDefault)
const
824 std::string vName = boost::to_upper_copy(pName);
825 SolverInfoMap::const_iterator infoIter = m_solverInfo.find(vName);
826 if(infoIter != m_solverInfo.end())
828 pVar = boost::iequals(infoIter->second, pTrueVal);
840 bool SessionReader::MatchSolverInfo(
841 const std::string &pName,
842 const std::string &pTrueVal)
const
844 if (DefinesSolverInfo(pName))
846 std::string vName = boost::to_upper_copy(pName);
847 SolverInfoMap::const_iterator iter = m_solverInfo.find(vName);
848 if(iter != m_solverInfo.end())
860 bool SessionReader::DefinesGlobalSysSolnInfo(
const std::string &pVariable,
861 const std::string &pProperty)
const
864 GloSysSolnInfoList::const_iterator iter =
865 GetGloSysSolnList().find(pVariable);
866 if(iter == GetGloSysSolnList().end())
871 std::string vProperty = boost::to_upper_copy(pProperty);
873 GloSysInfoMap::const_iterator iter1 = iter->second.find(vProperty);
874 if(iter1 == iter->second.end())
886 const std::string &SessionReader::GetGlobalSysSolnInfo(
const std::string &pVariable,
const std::string &pProperty)
const
888 GloSysSolnInfoList::const_iterator iter;
890 ASSERTL0( (iter = GetGloSysSolnList().
find(pVariable)) !=
891 GetGloSysSolnList().end(),
892 "Failed to find variable in GlobalSysSolnInfoList");
894 std::string vProperty = boost::to_upper_copy(pProperty);
895 GloSysInfoMap::const_iterator iter1;
897 ASSERTL0( (iter1 = iter->second.find(vProperty)) != iter->second.end(),
898 "Failed to find property: " + vProperty +
" in GlobalSysSolnInfoList");
900 return iter1->second;
906 bool SessionReader::DefinesGeometricInfo(
const std::string &pName)
const
908 std::string vName = boost::to_upper_copy(pName);
909 GeometricInfoMap::const_iterator iter = m_geometricInfo.find(vName);
910 return (iter != m_geometricInfo.end());
917 void SessionReader::LoadGeometricInfo(
918 const std::string &pName,
920 const std::string &pDefault)
const
922 std::string vName = boost::to_upper_copy(pName);
923 GeometricInfoMap::const_iterator iter = m_geometricInfo.find(vName);
924 if(iter != m_geometricInfo.end())
938 void SessionReader::LoadGeometricInfo(
939 const std::string &pName,
941 const bool &pDefault)
const
943 std::string vName = boost::to_upper_copy(pName);
944 GeometricInfoMap::const_iterator iter = m_geometricInfo.find(vName);
945 if(iter != m_geometricInfo.end())
947 if (iter->second ==
"TRUE")
966 void SessionReader::LoadGeometricInfo(
967 const std::string &pName,
971 std::string vName = boost::to_upper_copy(pName);
972 GeometricInfoMap::const_iterator iter = m_geometricInfo.find(vName);
973 if(iter != m_geometricInfo.end())
975 pVar = std::atoi(iter->second.c_str());
987 void SessionReader::MatchGeometricInfo(
988 const std::string &pName,
989 const std::string &pTrueVal,
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 pVar = boost::iequals(iter->second, pTrueVal);
1009 const std::string& SessionReader::GetVariable(
1010 const unsigned int &idx)
const
1012 ASSERTL0(idx < m_variables.size(),
"Variable index out of range.");
1013 return m_variables[idx];
1021 void SessionReader::SetVariable(
const unsigned int &idx,
1022 std::string newname)
1024 ASSERTL0(idx < m_variables.size(),
"Variable index out of range.");
1025 m_variables[idx] = newname;
1032 std::vector<std::string> SessionReader::GetVariables()
const
1041 bool SessionReader::DefinesFunction(
const std::string &pName)
const
1043 FunctionMap::const_iterator it1;
1044 std::string vName = boost::to_upper_copy(pName);
1046 if ((it1 = m_functions.find(vName)) != m_functions.end())
1057 bool SessionReader::DefinesFunction(
1058 const std::string &pName,
1059 const std::string &pVariable,
1060 const int pDomain)
const
1062 FunctionMap::const_iterator it1;
1063 FunctionVariableMap::const_iterator it2;
1064 std::string vName = boost::to_upper_copy(pName);
1067 if ((it1 = m_functions.find(vName)) != m_functions.end())
1069 pair<std::string, int> key(pVariable,pDomain);
1070 pair<std::string, int> defkey(
"*",pDomain);
1072 (it2 = it1->second.find(key)) != it1->second.end() ||
1073 (it2 = it1->second.find(defkey)) != it1->second.end();
1084 const std::string &pName,
1085 const std::string &pVariable,
1086 const int pDomain)
const
1088 FunctionMap::const_iterator it1;
1089 FunctionVariableMap::const_iterator it2, it3;
1090 std::string vName = boost::to_upper_copy(pName);
1092 ASSERTL0((it1 = m_functions.find(vName)) != m_functions.end(),
1093 std::string(
"No such function '") + pName
1094 + std::string(
"' has been defined in the session file."));
1097 pair<std::string,int> key(pVariable,pDomain);
1098 pair<std::string,int> defkey(
"*",pDomain);
1099 bool specific = (it2 = it1->second.find(key)) !=
1101 bool wildcard = (it3 = it1->second.find(defkey)) !=
1106 "No such variable " + pVariable
1107 +
" in domain " + boost::lexical_cast<string>(pDomain)
1108 +
" defined for function " + pName
1109 +
" in session file.");
1118 std::string(
"Function is defined by a file."));
1119 return it2->second.m_expression;
1127 const std::string &pName,
1128 const unsigned int &pVar,
1129 const int pDomain)
const
1131 ASSERTL0(pVar < m_variables.size(),
"Variable index out of range.");
1132 return GetFunction(pName, m_variables[pVar],pDomain);
1140 const std::string &pName,
1141 const std::string &pVariable,
1142 const int pDomain)
const
1144 FunctionMap::const_iterator it1;
1145 FunctionVariableMap::const_iterator it2, it3;
1146 std::string vName = boost::to_upper_copy(pName);
1148 it1 = m_functions.find(vName);
1149 ASSERTL0 (it1 != m_functions.end(),
1150 std::string(
"Function '") + pName
1151 + std::string(
"' not found."));
1154 pair<std::string,int> key(pVariable,pDomain);
1155 pair<std::string,int> defkey(
"*",pDomain);
1156 bool specific = (it2 = it1->second.find(key)) !=
1158 bool wildcard = (it3 = it1->second.find(defkey)) !=
1163 "No such variable " + pVariable
1164 +
" in domain " + boost::lexical_cast<string>(pDomain)
1165 +
" defined for function " + pName
1166 +
" in session file.");
1174 return it2->second.m_type;
1182 const std::string &pName,
1183 const unsigned int &pVar,
1184 const int pDomain)
const
1186 ASSERTL0(pVar < m_variables.size(),
"Variable index out of range.");
1187 return GetFunctionType(pName, m_variables[pVar],pDomain);
1194 std::string SessionReader::GetFunctionFilename(
1195 const std::string &pName,
1196 const std::string &pVariable,
1197 const int pDomain)
const
1199 FunctionMap::const_iterator it1;
1200 FunctionVariableMap::const_iterator it2, it3;
1201 std::string vName = boost::to_upper_copy(pName);
1203 it1 = m_functions.find(vName);
1204 ASSERTL0 (it1 != m_functions.end(),
1205 std::string(
"Function '") + pName
1206 + std::string(
"' not found."));
1209 pair<std::string,int> key(pVariable,pDomain);
1210 pair<std::string,int> defkey(
"*",pDomain);
1211 bool specific = (it2 = it1->second.find(key)) !=
1213 bool wildcard = (it3 = it1->second.find(defkey)) !=
1218 "No such variable " + pVariable
1219 +
" in domain " + boost::lexical_cast<string>(pDomain)
1220 +
" defined for function " + pName
1221 +
" in session file.");
1229 return it2->second.m_filename;
1236 std::string SessionReader::GetFunctionFilename(
1237 const std::string &pName,
1238 const unsigned int &pVar,
1239 const int pDomain)
const
1241 ASSERTL0(pVar < m_variables.size(),
"Variable index out of range.");
1242 return GetFunctionFilename(pName, m_variables[pVar],pDomain);
1249 std::string SessionReader::GetFunctionFilenameVariable(
1250 const std::string &pName,
1251 const std::string &pVariable,
1252 const int pDomain)
const
1254 FunctionMap::const_iterator it1;
1255 FunctionVariableMap::const_iterator it2, it3;
1256 std::string vName = boost::to_upper_copy(pName);
1258 it1 = m_functions.find(vName);
1259 ASSERTL0 (it1 != m_functions.end(),
1260 std::string(
"Function '") + pName
1261 + std::string(
"' not found."));
1264 pair<std::string,int> key(pVariable,pDomain);
1265 pair<std::string,int> defkey(
"*",pDomain);
1266 bool specific = (it2 = it1->second.find(key)) !=
1268 bool wildcard = (it3 = it1->second.find(defkey)) !=
1273 "No such variable " + pVariable
1274 +
" in domain " + boost::lexical_cast<string>(pDomain)
1275 +
" defined for function " + pName
1276 +
" in session file.");
1284 return it2->second.m_fileVariable;
1293 return m_exprEvaluator;
1300 bool SessionReader::DefinesTag(
const std::string &pName)
const
1302 std::string vName = boost::to_upper_copy(pName);
1303 TagMap::const_iterator vTagIterator = m_tags.find(vName);
1304 return (vTagIterator != m_tags.end());
1311 void SessionReader::SetTag(
1312 const std::string &pName,
1313 const std::string &pValue)
1315 std::string vName = boost::to_upper_copy(pName);
1316 m_tags[vName] = pValue;
1323 const std::string &SessionReader::GetTag(
const std::string& pName)
const
1325 std::string vName = boost::to_upper_copy(pName);
1326 TagMap::const_iterator vTagIterator = m_tags.find(vName);
1327 ASSERTL0(vTagIterator != m_tags.end(),
1328 "Requested tag does not exist.");
1329 return vTagIterator->second;
1345 bool SessionReader::DefinesCmdLineArgument(
1346 const std::string& pName)
const
1348 return (m_cmdLineOptions.find(pName) != m_cmdLineOptions.end());
1355 void SessionReader::SubstituteExpressions(std::string& pExpr)
1358 for (exprIter = m_expressions.begin();
1359 exprIter != m_expressions.end(); ++exprIter)
1361 boost::replace_all(pExpr, exprIter->first, exprIter->second);
1372 return m_bndRegOrder;
1378 void SessionReader::LoadDoc(
1379 const std::string &pFilename,
1380 TiXmlDocument* pDoc)
const
1382 if (pFilename.size() > 3 &&
1383 pFilename.substr(pFilename.size() - 3, 3) ==
".gz")
1385 ifstream file(pFilename.c_str(),
1386 ios_base::in | ios_base::binary);
1387 ASSERTL0(file.good(),
"Unable to open file: " + pFilename);
1389 io::filtering_streambuf<io::input> in;
1390 in.push(io::gzip_decompressor());
1397 catch (io::gzip_error& e)
1400 "Error: File '" + pFilename +
"' is corrupt.");
1403 else if (pFilename.size() > 4 &&
1404 pFilename.substr(pFilename.size() - 4, 4) ==
"_xml")
1406 fs::path pdirname(pFilename);
1407 boost::format pad(
"P%1$07d.xml");
1408 pad % m_comm->GetRank();
1409 fs::path pRankFilename(pad.str());
1410 fs::path fullpath = pdirname / pRankFilename;
1413 ASSERTL0(file.good(),
"Unable to open file: " + fullpath.string());
1418 ifstream file(pFilename.c_str());
1419 ASSERTL0(file.good(),
"Unable to open file: " + pFilename);
1427 TiXmlDocument *SessionReader::MergeDoc(
1428 const std::vector<std::string> &pFilenames)
const
1430 ASSERTL0(pFilenames.size() > 0,
"No filenames for merging.");
1433 TiXmlDocument *vMainDoc =
new TiXmlDocument;
1434 LoadDoc(pFilenames[0], vMainDoc);
1436 TiXmlHandle vMainHandle(vMainDoc);
1437 TiXmlElement* vMainNektar =
1438 vMainHandle.FirstChildElement(
"NEKTAR").Element();
1443 for (
int i = 1; i < pFilenames.size(); ++i)
1445 if((pFilenames[i].compare(pFilenames[i].size()-3,3,
"xml") == 0)
1446 ||(pFilenames[i].compare(pFilenames[i].size()-6,6,
"xml.gz") == 0))
1448 TiXmlDocument* vTempDoc =
new TiXmlDocument;
1449 LoadDoc(pFilenames[i], vTempDoc);
1451 TiXmlHandle docHandle(vTempDoc);
1452 TiXmlElement* vTempNektar;
1453 vTempNektar = docHandle.FirstChildElement(
"NEKTAR").Element();
1454 ASSERTL0(vTempNektar,
"Unable to find NEKTAR tag in file.");
1455 TiXmlElement* p = vTempNektar->FirstChildElement();
1459 TiXmlElement *vMainEntry =
1460 vMainNektar->FirstChildElement(p->Value());
1461 TiXmlElement *q =
new TiXmlElement(*p);
1464 vMainNektar->RemoveChild(vMainEntry);
1466 vMainNektar->LinkEndChild(q);
1467 p = p->NextSiblingElement();
1480 void SessionReader::ParseDocument()
1483 ASSERTL0(m_xmlDoc,
"No XML document loaded.");
1486 TiXmlHandle docHandle(m_xmlDoc);
1488 e = docHandle.FirstChildElement(
"NEKTAR").
1489 FirstChildElement(
"CONDITIONS").Element();
1494 ReadGlobalSysSolnInfo (e);
1495 ReadExpressions (e);
1499 e = docHandle.FirstChildElement(
"NEKTAR").
1500 FirstChildElement(
"FILTERS").Element();
1509 void SessionReader::CreateComm(
1519 string vCommModule(
"Serial");
1522 vCommModule =
"ParallelMPI";
1533 void SessionReader::PartitionMesh()
1535 ASSERTL0(m_comm.get(),
"Communication not initialised.");
1539 const bool isRoot = (m_comm->GetRank() == 0);
1555 int isPartitioned = 0;
1558 m_xmlDoc = MergeDoc(m_filenames);
1559 if (DefinesElement(
"Nektar/Geometry"))
1561 if (GetElement(
"Nektar/Geometry")->Attribute(
"PARTITION"))
1563 cout <<
"Using pre-partitioned mesh." << endl;
1572 if (isPartitioned) {
1575 m_xmlDoc = MergeDoc(m_filenames);
1583 string vPartitionerName =
"Metis";
1586 vPartitionerName =
"Scotch";
1588 if (DefinesCmdLineArgument(
"use-metis"))
1590 vPartitionerName =
"Metis";
1592 if (DefinesCmdLineArgument(
"use-scotch"))
1594 vPartitionerName =
"Scotch";
1600 if (DefinesCmdLineArgument(
"part-only"))
1605 "The 'part-only' option should be used in serial.");
1608 int nParts = GetCmdLineArgument<int>(
"part-only");
1612 vPartitionerName, vSession);
1613 vPartitioner->PartitionMesh(nParts,
true);
1614 vPartitioner->WriteAllPartitions(vSession);
1615 vPartitioner->GetCompositeOrdering(m_compOrder);
1616 vPartitioner->GetBndRegionOrdering(m_bndRegOrder);
1618 if (isRoot && DefinesCmdLineArgument(
"part-info"))
1620 vPartitioner->PrintPartInfo(std::cout);
1626 else if (vCommMesh->GetSize() > 1)
1629 int nParts = vCommMesh->GetSize();
1630 if (DefinesCmdLineArgument(
"shared-filesystem"))
1633 vector<unsigned int> keys, vals;
1636 if (vComm->GetRank() == 0)
1638 m_xmlDoc = MergeDoc(m_filenames);
1642 vPartitionerName, vSession);
1643 vPartitioner->PartitionMesh(nParts,
true);
1644 vPartitioner->WriteAllPartitions(vSession);
1645 vPartitioner->GetCompositeOrdering(m_compOrder);
1646 vPartitioner->GetBndRegionOrdering(m_bndRegOrder);
1653 keys[0] = m_compOrder.size();
1654 keys[1] = m_bndRegOrder.size();
1656 for (i = 1; i < vComm->GetSize(); ++i)
1658 vComm->Send(i, keys);
1664 keys.resize(m_compOrder.size());
1665 vals.resize(m_compOrder.size());
1667 for (cIt = m_compOrder.begin(), i = 0;
1668 cIt != m_compOrder.end(); ++cIt, ++i)
1670 keys[i] = cIt->first;
1671 vals[i] = cIt->second.size();
1675 for (i = 1; i < vComm->GetSize(); ++i)
1677 vComm->Send(i, keys);
1678 vComm->Send(i, vals);
1680 for (cIt = m_compOrder.begin();
1681 cIt != m_compOrder.end(); ++cIt)
1683 vComm->Send(i, cIt->second);
1690 keys.resize(m_bndRegOrder.size());
1691 vals.resize(m_bndRegOrder.size());
1693 for (bIt = m_bndRegOrder.begin(), i = 0;
1694 bIt != m_bndRegOrder.end(); ++bIt, ++i)
1696 keys[i] = bIt->first;
1697 vals[i] = bIt->second.size();
1701 for (i = 1; i < vComm->GetSize(); ++i)
1703 vComm->Send(i, keys);
1704 vComm->Send(i, vals);
1706 for (bIt = m_bndRegOrder.begin();
1707 bIt != m_bndRegOrder.end(); ++bIt)
1709 vComm->Send(i, bIt->second);
1713 if (DefinesCmdLineArgument(
"part-info"))
1715 vPartitioner->PrintPartInfo(std::cout);
1721 vComm->Recv(0, keys);
1723 int cmpSize = keys[0];
1724 int bndSize = keys[1];
1726 keys.resize(cmpSize);
1727 vals.resize(cmpSize);
1728 vComm->Recv(0, keys);
1729 vComm->Recv(0, vals);
1731 for (
int i = 0; i < keys.size(); ++i)
1733 vector<unsigned int> tmp(vals[i]);
1734 vComm->Recv(0, tmp);
1735 m_compOrder[keys[i]] = tmp;
1738 keys.resize(bndSize);
1739 vals.resize(bndSize);
1740 vComm->Recv(0, keys);
1741 vComm->Recv(0, vals);
1743 for (
int i = 0; i < keys.size(); ++i)
1745 vector<unsigned int> tmp(vals[i]);
1746 vComm->Recv(0, tmp);
1747 m_bndRegOrder[keys[i]] = tmp;
1756 m_xmlDoc = MergeDoc(m_filenames);
1764 vPartitionerName, vSession);
1765 vPartitioner->PartitionMesh(nParts,
false);
1766 vPartitioner->WriteLocalPartition(vSession);
1767 vPartitioner->GetCompositeOrdering(m_compOrder);
1768 vPartitioner->GetBndRegionOrdering(m_bndRegOrder);
1770 if (DefinesCmdLineArgument(
"part-info") && isRoot)
1772 vPartitioner->PrintPartInfo(std::cout);
1777 std::string dirname = GetSessionName() +
"_xml";
1778 fs::path pdirname(dirname);
1779 boost::format pad(
"P%1$07d.xml");
1780 pad % m_comm->GetRowComm()->GetRank();
1781 fs::path pFilename(pad.str());
1782 fs::path fullpath = pdirname / pFilename;
1790 m_xmlDoc =
new TiXmlDocument(vFilename);
1792 ASSERTL0(m_xmlDoc,
"Failed to create XML document object.");
1794 bool loadOkay = m_xmlDoc->LoadFile(vFilename);
1795 ASSERTL0(loadOkay,
"Unable to load file: " + vFilename +
1796 ". Check XML standards compliance. Error on line: " +
1797 boost::lexical_cast<std::string>(m_xmlDoc->Row()));
1801 m_xmlDoc = MergeDoc(m_filenames);
1813 void SessionReader::PartitionComm()
1815 if (m_comm->GetSize() > 1)
1821 if (DefinesCmdLineArgument(
"npx")) {
1822 nProcX = GetCmdLineArgument<int>(
"npx");
1824 if (DefinesCmdLineArgument(
"npy")) {
1825 nProcY = GetCmdLineArgument<int>(
"npy");
1827 if (DefinesCmdLineArgument(
"npz")) {
1828 nProcZ = GetCmdLineArgument<int>(
"npz");
1830 if (DefinesCmdLineArgument(
"nsz")) {
1831 nStripZ = GetCmdLineArgument<int>(
"nsz");
1833 ASSERTL0(m_comm->GetSize() % (nProcZ*nProcY*nProcX) == 0,
1834 "Cannot exactly partition using PROC_Z value.");
1836 "Cannot exactly partition using PROC_Y value.");
1838 "Cannot exactly partition using PROC_X value.");
1841 int nProcSm = nProcZ * nProcY * nProcX;
1845 int nProcSem = m_comm->GetSize() / nProcSm;
1847 m_comm->SplitComm(nProcSm,nProcSem);
1848 m_comm->GetColumnComm()->SplitComm(nProcZ/nStripZ,nStripZ);
1849 m_comm->GetColumnComm()->GetColumnComm()->SplitComm(
1850 (nProcY*nProcX),nProcZ/nStripZ);
1851 m_comm->GetColumnComm()->GetColumnComm()->GetColumnComm()
1852 ->SplitComm(nProcX,nProcY);
1860 void SessionReader::ReadParameters(TiXmlElement *conditions)
1862 m_parameters.clear();
1869 TiXmlElement *parametersElement = conditions->FirstChildElement(
1874 if (parametersElement)
1876 TiXmlElement *parameter =
1877 parametersElement->FirstChildElement(
"P");
1885 stringstream tagcontent;
1886 tagcontent << *parameter;
1887 TiXmlNode *node = parameter->FirstChild();
1889 while (node && node->Type() != TiXmlNode::TINYXML_TEXT)
1891 node = node->NextSibling();
1897 std::string line = node->ToText()->Value(),
lhs, rhs;
1900 ParseEquals(line,
lhs, rhs);
1904 ASSERTL0(
false,
"Syntax error in parameter "
1905 "expression '" + line
1906 +
"' in XML element: \n\t'"
1907 + tagcontent.str() +
"'");
1913 if (!
lhs.empty() && !rhs.empty())
1919 GetSharedThisPtr(), rhs);
1922 catch (
const std::runtime_error &)
1925 "Error evaluating parameter expression"
1926 " '" + rhs +
"' in XML element: \n\t'"
1927 + tagcontent.str() +
"'");
1929 m_exprEvaluator.SetParameter(
lhs, value);
1930 caseSensitiveParameters[
lhs] = value;
1931 boost::to_upper(
lhs);
1932 m_parameters[
lhs] = value;
1936 parameter = parameter->NextSiblingElement();
1945 void SessionReader::ReadSolverInfo(TiXmlElement *conditions)
1947 m_solverInfo.clear();
1948 m_solverInfo = GetSolverInfoDefaults();
1955 TiXmlElement *solverInfoElement =
1956 conditions->FirstChildElement(
"SOLVERINFO");
1958 if (solverInfoElement)
1960 TiXmlElement *solverInfo =
1961 solverInfoElement->FirstChildElement(
"I");
1965 std::stringstream tagcontent;
1966 tagcontent << *solverInfo;
1968 ASSERTL0(solverInfo->Attribute(
"PROPERTY"),
1969 "Missing PROPERTY attribute in solver info "
1970 "XML element: \n\t'" + tagcontent.str() +
"'");
1971 std::string solverProperty =
1972 solverInfo->Attribute(
"PROPERTY");
1974 "PROPERTY attribute must be non-empty in XML "
1975 "element: \n\t'" + tagcontent.str() +
"'");
1978 std::string solverPropertyUpper =
1979 boost::to_upper_copy(solverProperty);
1982 ASSERTL0(solverInfo->Attribute(
"VALUE"),
1983 "Missing VALUE attribute in solver info "
1984 "XML element: \n\t'" + tagcontent.str() +
"'");
1985 std::string solverValue = solverInfo->Attribute(
"VALUE");
1987 "VALUE attribute must be non-empty in XML "
1988 "element: \n\t'" + tagcontent.str() +
"'");
1990 EnumMapList::const_iterator propIt =
1991 GetSolverInfoEnums().find(solverPropertyUpper);
1992 if (propIt != GetSolverInfoEnums().end())
1994 EnumMap::const_iterator valIt =
1995 propIt->second.find(solverValue);
1996 ASSERTL0(valIt != propIt->second.end(),
1997 "Value '" + solverValue +
"' is not valid for "
1998 "property '" + solverProperty +
"'");
2002 m_solverInfo[solverPropertyUpper] = solverValue;
2003 solverInfo = solverInfo->NextSiblingElement(
"I");
2007 if (m_comm && m_comm->GetRowComm()->GetSize() > 1)
2010 m_solverInfo[
"GLOBALSYSSOLN"] ==
"IterativeFull" ||
2011 m_solverInfo[
"GLOBALSYSSOLN"] ==
"IterativeStaticCond" ||
2012 m_solverInfo[
"GLOBALSYSSOLN"] ==
2013 "IterativeMultiLevelStaticCond" ||
2014 m_solverInfo[
"GLOBALSYSSOLN"] ==
"XxtFull" ||
2015 m_solverInfo[
"GLOBALSYSSOLN"] ==
"XxtStaticCond" ||
2016 m_solverInfo[
"GLOBALSYSSOLN"] ==
2017 "XxtMultiLevelStaticCond" ||
2018 m_solverInfo[
"GLOBALSYSSOLN"] ==
"PETScFull" ||
2019 m_solverInfo[
"GLOBALSYSSOLN"] ==
"PETScStaticCond" ||
2020 m_solverInfo[
"GLOBALSYSSOLN"] ==
2021 "PETScMultiLevelStaticCond",
2022 "A parallel solver must be used when run in parallel.");
2031 void SessionReader::ReadGlobalSysSolnInfo(TiXmlElement *conditions)
2033 GetGloSysSolnList().clear();
2040 TiXmlElement *GlobalSys =
2041 conditions->FirstChildElement(
"GLOBALSYSSOLNINFO");
2048 TiXmlElement *VarInfo = GlobalSys->FirstChildElement(
"V");
2052 std::stringstream tagcontent;
2053 tagcontent << *VarInfo;
2054 ASSERTL0(VarInfo->Attribute(
"VAR"),
2055 "Missing VAR attribute in GobalSysSolnInfo XML "
2056 "element: \n\t'" + tagcontent.str() +
"'");
2058 std::string VarList = VarInfo->Attribute(
"VAR");
2060 "VAR attribute must be non-empty in XML element:\n\t'"
2061 + tagcontent.str() +
"'");
2064 std::vector<std::string> varStrings;
2065 bool valid = ParseUtils::GenerateOrderedStringVector(
2066 VarList.c_str(),varStrings);
2068 ASSERTL0(valid,
"Unable to process list of variable in XML "
2069 "element \n\t'" + tagcontent.str() +
"'");
2071 if(varStrings.size())
2073 TiXmlElement *SysSolnInfo = VarInfo->FirstChildElement(
"I");
2078 tagcontent << *SysSolnInfo;
2080 ASSERTL0(SysSolnInfo->Attribute(
"PROPERTY"),
2081 "Missing PROPERTY attribute in "
2082 "GlobalSysSolnInfo for variable(s) '"
2083 + VarList +
"' in XML element: \n\t'"
2084 + tagcontent.str() +
"'");
2086 std::string SysSolnProperty =
2087 SysSolnInfo->Attribute(
"PROPERTY");
2090 "GlobalSysSolnIno properties must have a "
2091 "non-empty name for variable(s) : '"
2092 + VarList +
"' in XML element: \n\t'"
2093 + tagcontent.str() +
"'");
2096 std::string SysSolnPropertyUpper =
2097 boost::to_upper_copy(SysSolnProperty);
2100 ASSERTL0(SysSolnInfo->Attribute(
"VALUE"),
2101 "Missing VALUE attribute in GlobalSysSolnInfo "
2102 "for variable(s) '" + VarList
2103 +
"' in XML element: \n\t"
2104 + tagcontent.str() +
"'");
2106 std::string SysSolnValue =
2107 SysSolnInfo->Attribute(
"VALUE");
2109 "GlobalSysSolnInfo properties must have a "
2110 "non-empty value for variable(s) '"
2111 + VarList +
"' in XML element: \n\t'"
2112 + tagcontent.str() +
"'");
2115 for(
int i = 0; i < varStrings.size(); ++i)
2118 if ((x = GetGloSysSolnList().
find(varStrings[i])) ==
2119 GetGloSysSolnList().end())
2121 (GetGloSysSolnList()[varStrings[i]])[
2122 SysSolnPropertyUpper] = SysSolnValue;
2126 x->second[SysSolnPropertyUpper] = SysSolnValue;
2130 SysSolnInfo = SysSolnInfo->NextSiblingElement(
"I");
2132 VarInfo = VarInfo->NextSiblingElement(
"V");
2136 if (m_verbose && GetGloSysSolnList().size() > 0 && m_comm)
2138 if(m_comm->GetRank() == 0)
2140 cout <<
"GlobalSysSoln Info:" << endl;
2143 for (x = GetGloSysSolnList().begin();
2144 x != GetGloSysSolnList().end();
2147 cout <<
"\t Variable: " << x->first << endl;
2150 for (y = x->second.begin(); y != x->second.end(); ++y)
2152 cout <<
"\t\t " << y->first <<
" = " << y->second
2165 void SessionReader::ReadExpressions(TiXmlElement *conditions)
2167 m_expressions.clear();
2174 TiXmlElement *expressionsElement =
2175 conditions->FirstChildElement(
"EXPRESSIONS");
2177 if (expressionsElement)
2179 TiXmlElement *expr = expressionsElement->FirstChildElement(
"E");
2183 stringstream tagcontent;
2184 tagcontent << *expr;
2186 "Missing NAME attribute in expression "
2187 "definition: \n\t'" + tagcontent.str() +
"'");
2188 std::string nameString = expr->Attribute(
"NAME");
2190 "Expressions must have a non-empty name: \n\t'"
2191 + tagcontent.str() +
"'");
2194 "Missing VALUE attribute in expression "
2195 "definition: \n\t'" + tagcontent.str() +
"'");
2196 std::string valString = expr->Attribute(
"VALUE");
2198 "Expressions must have a non-empty value: \n\t'"
2199 + tagcontent.str() +
"'");
2202 = m_expressions.find(nameString);
2203 ASSERTL0(exprIter == m_expressions.end(),
2204 std::string(
"Expression '") + nameString
2205 + std::string(
"' already specified."));
2207 m_expressions[nameString] = valString;
2208 expr = expr->NextSiblingElement(
"E");
2217 void SessionReader::ReadVariables(TiXmlElement *conditions)
2219 m_variables.clear();
2226 TiXmlElement *variablesElement =
2227 conditions->FirstChildElement(
"VARIABLES");
2231 if (variablesElement)
2233 TiXmlElement *varElement =
2234 variablesElement->FirstChildElement(
"V");
2237 int nextVariableNumber = -1;
2241 stringstream tagcontent;
2242 tagcontent << *varElement;
2246 nextVariableNumber++;
2249 int err = varElement->QueryIntAttribute(
"ID", &i);
2251 "Variables must have a unique ID number attribute "
2252 "in XML element: \n\t'" + tagcontent.str() +
"'");
2254 "ID numbers for variables must begin with zero and"
2255 " be sequential in XML element: \n\t'"
2256 + tagcontent.str() +
"'");
2258 TiXmlNode* varChild = varElement->FirstChild();
2263 while(varChild && varChild->Type() != TiXmlNode::TINYXML_TEXT)
2265 varChild = varChild->NextSibling();
2269 "Unable to read variable definition body for "
2271 + boost::lexical_cast<string>(i)
2272 +
" in XML element: \n\t'"
2273 + tagcontent.str() +
"'");
2274 std::string variableName = varChild->ToText()->ValueStr();
2276 std::istringstream variableStrm(variableName);
2277 variableStrm >> variableName;
2280 variableName) == m_variables.end(),
2282 + boost::lexical_cast<
string>(i)
2283 +
" in XML element \n\t'" + tagcontent.str()
2284 +
"'\nhas already been defined.");
2286 m_variables.push_back(variableName);
2288 varElement = varElement->NextSiblingElement(
"V");
2292 "Number of variables must be greater than zero.");
2300 void SessionReader::ReadFunctions(TiXmlElement *conditions)
2302 m_functions.clear();
2310 TiXmlElement *
function = conditions->FirstChildElement(
"FUNCTION");
2313 stringstream tagcontent;
2314 tagcontent << *
function;
2317 ASSERTL0(function->Attribute(
"NAME"),
2318 "Functions must have a NAME attribute defined in XML "
2319 "element: \n\t'" + tagcontent.str() +
"'");
2320 std::string functionStr =
function->Attribute(
"NAME");
2322 "Functions must have a non-empty name in XML "
2323 "element: \n\t'" + tagcontent.str() +
"'");
2326 boost::to_upper(functionStr);
2329 TiXmlElement *variable =
function->FirstChildElement();
2338 std::string conditionType = variable->Value();
2341 std::string variableStr;
2342 if (!variable->Attribute(
"VAR"))
2348 variableStr = variable->Attribute(
"VAR");
2352 std::vector<std::string> variableList;
2353 ParseUtils::GenerateOrderedStringVector(variableStr.c_str(),
2357 std::string domainStr;
2358 if (!variable->Attribute(
"DOMAIN"))
2364 domainStr = variable->Attribute(
"DOMAIN");
2368 std::vector<std::string> varSplit;
2369 std::vector<unsigned int> domainList;
2370 ParseUtils::GenerateSeqVector(domainStr.c_str(), domainList);
2373 if (conditionType ==
"E")
2378 ASSERTL0(variable->Attribute(
"VALUE"),
2379 "Attribute VALUE expected for function '"
2380 + functionStr +
"'.");
2381 std::string fcnStr = variable->Attribute(
"VALUE");
2384 (std::string(
"Expression for var: ")
2386 + std::string(
" must be specified.")).c_str());
2388 SubstituteExpressions(fcnStr);
2396 else if (conditionType ==
"F")
2398 if (variable->Attribute(
"TIMEDEPENDENT") &&
2399 boost::lexical_cast<
bool>(variable->Attribute(
"TIMEDEPENDENT")))
2409 ASSERTL0(variable->Attribute(
"FILE"),
2410 "Attribute FILE expected for function '"
2411 + functionStr +
"'.");
2412 std::string filenameStr = variable->Attribute(
"FILE");
2415 "A filename must be specified for the FILE "
2416 "attribute of function '" + functionStr
2419 std::vector<std::string> fSplit;
2420 boost::split(fSplit, filenameStr, boost::is_any_of(
":"));
2422 ASSERTL0(fSplit.size() == 1 || fSplit.size() == 2,
2423 "Incorrect filename specification in function "
2424 + functionStr +
"'. "
2425 "Specify variables inside file as: "
2426 "filename:var1,var2");
2431 if (fSplit.size() == 2)
2434 "Filename variable mapping not valid "
2435 "when using * as a variable inside "
2436 "function '" + functionStr +
"'.");
2439 varSplit, fSplit[1], boost::is_any_of(
","));
2440 ASSERTL0(varSplit.size() == variableList.size(),
2441 "Filename variables should contain the "
2442 "same number of variables defined in "
2443 "VAR in function " + functionStr +
"'.");
2450 stringstream tagcontent;
2451 tagcontent << *variable;
2454 "Identifier " + conditionType +
" in function "
2455 + std::string(function->Attribute(
"NAME"))
2456 +
" is not recognised in XML element: \n\t'"
2457 + tagcontent.str() +
"'");
2463 for (
unsigned int i = 0; i < variableList.size(); ++i)
2465 for(
unsigned int j = 0; j < domainList.size(); ++j)
2468 pair<std::string,int> key(variableList[i],domainList[j]);
2470 = functionVarMap.find(key);
2471 ASSERTL0(fcnsIter == functionVarMap.end(),
2472 "Error setting expression '" + variableList[i]
2474 + boost::lexical_cast<std::string>(domainList[j])
2475 +
"' in function '" + functionStr +
"'. "
2476 "Expression has already been defined.");
2478 if (varSplit.size() > 0)
2482 functionVarMap[key] = funcDef2;
2486 functionVarMap[key] = funcDef;
2491 variable = variable->NextSiblingElement();
2494 m_functions[functionStr] = functionVarMap;
2495 function =
function->NextSiblingElement(
"FUNCTION");
2503 void SessionReader::ReadFilters(TiXmlElement *filters)
2512 TiXmlElement *filter = filters->FirstChildElement(
"FILTER");
2515 ASSERTL0(filter->Attribute(
"TYPE"),
2516 "Missing attribute 'TYPE' for filter.");
2517 std::string typeStr = filter->Attribute(
"TYPE");
2519 std::map<std::string, std::string> vParams;
2521 TiXmlElement *param = filter->FirstChildElement(
"PARAM");
2525 "Missing attribute 'NAME' for parameter in filter "
2527 std::string nameStr = param->Attribute(
"NAME");
2529 ASSERTL0(param->GetText(),
"Empty value string for param.");
2530 std::string valueStr = param->GetText();
2532 vParams[nameStr] = valueStr;
2534 param = param->NextSiblingElement(
"PARAM");
2537 m_filters.push_back(
2538 std::pair<std::string, FilterParams>(typeStr, vParams));
2540 filter = filter->NextSiblingElement(
"FILTER");
2544 void SessionReader::ParseEquals(
2545 const std::string &line,
2550 int beg = line.find_first_not_of(
" ");
2551 int end = line.find_first_of(
"=");
2553 if (beg == end)
throw 1;
2555 if (end != line.find_last_of(
"="))
throw 1;
2557 if (end == std::string::npos)
throw 1;
2559 lhs = line.substr(line.find_first_not_of(
" "),
2561 lhs = lhs .substr(0, lhs.find_last_not_of(
" ")+1);
2562 rhs = line.substr(line.find_last_of(
"=")+1);
2563 rhs = rhs .substr(rhs.find_first_not_of(
" "));
2564 rhs = rhs .substr(0, rhs.find_last_not_of(
" ")+1);
2570 void SessionReader::CmdLineOverride()
2573 if (m_cmdLineOptions.count(
"solverinfo"))
2575 std::vector<std::string> solverInfoList =
2576 m_cmdLineOptions[
"solverinfo"].as<
2577 std::vector<std::string> >();
2579 for (
int i = 0; i < solverInfoList.size(); ++i)
2581 std::string
lhs, rhs;
2585 ParseEquals(solverInfoList[i], lhs, rhs);
2589 ASSERTL0(
false,
"Parse error with command line "
2590 "option: "+solverInfoList[i]);
2593 std::string lhsUpper = boost::to_upper_copy(lhs);
2594 m_solverInfo[lhsUpper] = rhs;
2598 if (m_cmdLineOptions.count(
"parameter"))
2600 std::vector<std::string> parametersList =
2601 m_cmdLineOptions[
"parameter"].as<
2602 std::vector<std::string> >();
2604 for (
int i = 0; i < parametersList.size(); ++i)
2606 std::string
lhs, rhs;
2610 ParseEquals(parametersList[i], lhs, rhs);
2614 ASSERTL0(
false,
"Parse error with command line "
2615 "option: "+parametersList[i]);
2618 std::string lhsUpper = boost::to_upper_copy(lhs);
2622 m_parameters[lhsUpper] =
2627 ASSERTL0(
false,
"Unable to convert string: "+rhs+
2628 "to double value.");
2634 void SessionReader::SetUpXmlDoc(
void)
2636 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
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()