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()