37 #include <boost/algorithm/string.hpp> 
   38 #include <boost/program_options.hpp> 
   45 int main(
int argc, 
char* argv[])
 
   50     po::options_description desc(
"Available options");
 
   53                 "Produce this help message.")
 
   55                 "Print the list of available modules.")
 
   56         (
"output-points,n", po::value<int>(),
 
   57                 "Output at n equipspaced points along the collapsed coordinates (for .dat, .vtk).")
 
   58         (
"output-points-hom-z", po::value<int>(),
 
   59                 "Number of planes in the z-direction for output of Homogeneous 1D expansion(for .dat, .vtk).")
 
   61                 "Write error of fields for regression checking")
 
   63                 "Force the output to be written without any checks")
 
   64         (
"range,r", po::value<string>(),
 
   65                 "Define output range i.e. (-r xmin,xmax,ymin,ymax,zmin,zmax) " 
   66                 "in which any vertex is contained.")
 
   67         (
"noequispaced",
"Do not use equispaced output. Currently stops the output-points option")
 
   68         (
"nprocs", po::value<int>(),
 
   69                 "Used to define nprocs if running serial problem to mimic " 
   71         (
"npz", po::value<int>(),
 
   72                 "Used to define number of partitions in z for Homogeneous1D " 
   73                 "expansions for parallel runs.")
 
   74         (
"onlyshape", po::value<string>(),
 
   75                  "Only use element with defined shape type i.e. -onlyshape " 
   77         (
"part-only", po::value<int>(),
 
   78                 "Partition into specfiied npart partitions and exit")
 
   79         (
"part-only-overlapping", po::value<int>(),
 
   80                 "Partition into specfiied npart overlapping partitions and exit")
 
   81         (
"procid", po::value<int>(),
 
   82                 "Process as single procid of a partition of size nproc " 
   83                 "(-nproc must be specified).")
 
   84         (
"modules-opt,p", po::value<string>(),
 
   85                 "Print options for a module.")
 
   86         (
"module,m", po::value<vector<string> >(),
 
   87                 "Specify modules which are to be used.")
 
   88         (
"useSessionVariables",
 
   89                 "Use variables defined in session for output")
 
   91                 "Enable verbose mode.");
 
   93     po::options_description hidden(
"Hidden options");
 
   95         (
"input-file",   po::value<vector<string> >(), 
"Input filename");
 
   97     po::options_description cmdline_options;
 
   98     cmdline_options.add(hidden).add(desc);
 
  100     po::options_description visible(
"Allowed options");
 
  103     po::positional_options_description p;
 
  104     p.add(
"input-file", -1);
 
  106     po::variables_map vm;
 
  110         po::store(po::command_line_parser(argc, argv).
 
  111                   options(cmdline_options).positional(p).run(), vm);
 
  114     catch (
const std::exception& e)
 
  116         cerr << e.what() << endl;
 
  122     if (vm.count(
"modules-list"))
 
  128     if (vm.count(
"modules-opt"))
 
  131         boost::split(tmp1, vm[
"modules-opt"].as<string>(),
 
  132                      boost::is_any_of(
":"));
 
  134         if (tmp1.size() != 2)
 
  136             cerr << 
"ERROR: To specify a module, use one of in, out or proc " 
  137                  << 
"together with the filename; for example in:vtk." << endl;
 
  141         if (tmp1[0] != 
"in" && tmp1[0] != 
"out" && tmp1[0] != 
"proc")
 
  143             cerr << 
"ERROR: Invalid module type " << tmp1[0] << endl;
 
  153         else if (tmp1[0] == 
"out")
 
  157         else if (tmp1[0] == 
"proc")
 
  165         cerr << 
"Options for module " << tmp1[1] << 
":" << endl;
 
  170     if (vm.count(
"help") || vm.count(
"input-file") != 1) {
 
  171         cerr << 
"Usage: FieldConvert [options] inputfile.ext1 outputfile.ext2" 
  175         cout << 
"Example Usage: \n" << endl;
 
  176         cout << 
"\t FieldConvert -m vorticity file.xml file.fld file_vort.fld " 
  178         cout << 
"(This will add vorticity to file file.fld and put it in a " 
  179                 "new file file_vort.fld) " << endl;
 
  181         cout << 
"\t FieldConvert file.xml file_vort.fld file_vort.dat " << endl;
 
  182         cout << 
"(process file_vort.fld and make a tecplot output " 
  183                 "file_vort.dat) " << endl;
 
  189              "Must specify input(s) and/or output file.");
 
  190     vector<string> inout = vm[
"input-file"].as<vector<string> >();
 
  206         if(vm.count(
"procid"))
 
  211                      "Must specify --nprocs when using --procid option");
 
  212             nprocs = vm[
"nprocs"].as<
int>();
 
  213             rank   = vm[
"procid"].as<
int>();
 
  215             f->m_comm = boost::shared_ptr<FieldConvertComm>(
 
  219             vm.insert(std::make_pair(
"forceoutput", po::variable_value()));
 
  224                                                     "ParallelMPI", argc, argv);
 
  230                                                     "Serial", argc, argv);
 
  234     vector<ModuleSharedPtr> modules;
 
  235     vector<string>          modcmds;
 
  238     if (vm.count(
"verbose"))
 
  243     if (vm.count(
"module"))
 
  245         modcmds = vm[
"module"].as<vector<string> >();
 
  249     modcmds.insert(modcmds.begin(), inout.begin(), inout.end()-1);
 
  250     modcmds.push_back(*(inout.end()-1));
 
  252     int nInput = inout.size()-1;
 
  258     if(vm.count(
"part-only")||vm.count(
"part-only-overlapping"))
 
  260         nInput = inout.size();
 
  265     for (
int i = 0; i < modcmds.size(); ++i)
 
  272         boost::split(tmp1, modcmds[i], boost::is_any_of(
":"));
 
  274         if (i < nInput || i == modcmds.size() - 1)
 
  285             if (tmp1.size() == 1)
 
  287                 int    dot    = tmp1[0].find_last_of(
'.') + 1;
 
  288                 string ext    = tmp1[0].substr(dot, tmp1[0].length() - dot);
 
  292                     string tmp2 = tmp1[0].substr(0,dot-1);
 
  293                     dot = tmp2.find_last_of(
'.') + 1;
 
  294                     ext = tmp1[0].substr(dot,tmp1[0].length()-dot);
 
  298                 tmp1.push_back(
string(i < nInput ? 
"infile=" : 
"outfile=")
 
  303                 module.second = tmp1[1];
 
  304                 tmp1.push_back(
string(i < nInput ? 
"infile=" : 
"outfile=")
 
  312             module.second = tmp1[0];
 
  318         modules.push_back(mod);
 
  322             inputModule = boost::dynamic_pointer_cast<
InputModule>(mod);
 
  323             inputModule->
AddFile(module.second, tmp1[0]);
 
  327         for (
int j = offset; j < tmp1.size(); ++j)
 
  330             boost::split(tmp2, tmp1[j], boost::is_any_of(
"="));
 
  332             if (tmp2.size() == 1)
 
  334                 mod->RegisterConfig(tmp2[0], 
"1");
 
  336             else if (tmp2.size() == 2)
 
  338                 mod->RegisterConfig(tmp2[0], tmp2[1]);
 
  342                 cerr << 
"ERROR: Invalid module configuration: format is " 
  343                      << 
"either :arg or :arg=val" << endl;
 
  353    if(vm.count(
"noequispaced"))
 
  355         for (
int i = 0; i < modules.size(); ++i)
 
  357             modules[i]->SetRequireEquiSpaced(
false);
 
  362         bool RequiresEquiSpaced = 
false;
 
  363         for (
int i = 0; i < modules.size(); ++i)
 
  365             if(modules[i]->GetRequireEquiSpaced())
 
  367                 RequiresEquiSpaced = 
true;
 
  370         if (RequiresEquiSpaced)
 
  372             for (
int i = 0; i < modules.size(); ++i)
 
  374                 modules[i]->SetRequireEquiSpaced(
true);
 
  380     for (
int i = 0; i < modules.size(); ++i)
 
  382         if(f->m_verbose && f->m_comm->TreatAsRankZero())
 
  386         modules[i]->Process(vm);
 
  388         if(f->m_verbose && f->m_comm->TreatAsRankZero())
 
  394             ss << cpuTime << 
"s";
 
  395             cout << modules[i]->GetModuleName()
 
  396                  << 
" CPU Time: " << setw(8) << left
 
  403         if(f->m_comm->TreatAsRankZero())
 
  409             ss << cpuTime << 
"s";
 
  410             cout << 
"Total CPU Time: " << setw(8) << left
 
#define ASSERTL0(condition, msg)
 
void PrintAvailableClasses(std::ostream &pOut=std::cout)
Prints the available classes to stdout. 
 
pair< ModuleType, string > ModuleKey
 
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. 
 
CommFactory & GetCommFactory()
 
boost::shared_ptr< InputModule > InputModuleSharedPtr
 
bool ModuleExists(tKey idKey)
Checks if a particular module is available. 
 
boost::shared_ptr< Module > ModuleSharedPtr
 
boost::shared_ptr< Field > FieldSharedPtr
 
NekDouble TimePerTest(unsigned int n)
Returns amount of seconds per iteration in a test with n iterations. 
 
ModuleFactory & GetModuleFactory()
 
int main(int argc, char *argv[])