36 #include <boost/algorithm/string.hpp>
37 #include <boost/program_options.hpp>
52 int main(
int argc,
char* argv[])
57 po::options_description desc(
"Available options");
60 "Produce this help message.")
62 "Print the list of available modules.")
63 (
"output-points,n", po::value<int>(),
64 "Output at n equipspaced points along the "
65 "collapsed coordinates (for .dat, .vtu).")
66 (
"output-points-hom-z", po::value<int>(),
67 "Number of planes in the z-direction for output of "
68 "Homogeneous 1D expansion(for .dat, .vtu).")
70 "Write error of fields for regression checking")
72 "Force the output to be written without any checks")
73 (
"range,r", po::value<string>(),
74 "Define output range i.e. (-r xmin,xmax,ymin,ymax,zmin,zmax) "
75 "in which any vertex is contained.")
77 "Do not use equispaced output.")
78 (
"nparts", po::value<int>(),
79 "Define nparts if running serial problem to mimic "
80 "parallel run with many partitions.")
81 (
"npz", po::value<int>(),
82 "Used to define number of partitions in z for Homogeneous1D "
83 "expansions for parallel runs.")
84 (
"onlyshape", po::value<string>(),
85 "Only use element with defined shape type i.e. -onlyshape "
87 (
"part-only", po::value<int>(),
88 "Partition into specified npart partitions and exit")
89 (
"part-only-overlapping", po::value<int>(),
90 "Partition into specified npart overlapping partitions and exit")
91 (
"modules-opt,p", po::value<string>(),
92 "Print options for a module.")
93 (
"module,m", po::value<vector<string> >(),
94 "Specify modules which are to be used.")
95 (
"useSessionVariables",
96 "Use variables defined in session for output")
97 (
"useSessionExpansion",
98 "Use expansion defined in session.")
100 "Enable verbose mode.");
102 po::options_description hidden(
"Hidden options");
104 (
"input-file", po::value<vector<string> >(),
"Input filename");
106 po::options_description cmdline_options;
107 cmdline_options.add(hidden).add(desc);
109 po::options_description visible(
"Allowed options");
112 po::positional_options_description
p;
113 p.add(
"input-file", -1);
115 po::variables_map vm;
119 po::store(po::command_line_parser(argc, argv).
120 options(cmdline_options).positional(
p).
run(), vm);
123 catch (
const std::exception& e)
125 cerr << e.what() << endl;
130 #ifdef NEKTAR_DISABLE_BACKUPS
131 vm.insert(std::make_pair(
"forceoutput", po::variable_value()));
135 if (vm.count(
"modules-list"))
141 if (vm.count(
"modules-opt"))
144 boost::split(tmp1, vm[
"modules-opt"].as<string>(),
145 boost::is_any_of(
":"));
147 if (tmp1.size() != 2)
149 cerr <<
"ERROR: To specify a module, use one of in, out or proc "
150 <<
"together with the filename; for example in:vtk." << endl;
154 if (tmp1[0] !=
"in" && tmp1[0] !=
"out" && tmp1[0] !=
"proc")
156 cerr <<
"ERROR: Invalid module type " << tmp1[0] << endl;
166 else if (tmp1[0] ==
"out")
170 else if (tmp1[0] ==
"proc")
178 cerr <<
"Options for module " << tmp1[1] <<
":" << endl;
183 if (vm.count(
"help") || vm.count(
"input-file") != 1)
185 cerr <<
"Usage: FieldConvert [options] inputfile.ext1 outputfile.ext2"
189 cout <<
"Example Usage: \n" << endl;
190 cout <<
"\t FieldConvert -m vorticity file.xml file.fld file_vort.fld "
192 cout <<
"(This will add vorticity to file file.fld and put it in a "
193 "new file file_vort.fld) " << endl;
195 cout <<
"\t FieldConvert file.xml file_vort.fld file_vort.dat " << endl;
196 cout <<
"(process file_vort.fld and make a tecplot output "
197 "file_vort.dat) " << endl;
203 "Must specify input(s) and/or output file.");
204 vector<string> inout = vm[
"input-file"].as<vector<string> >();
226 "ParallelMPI", argc, argv);
228 if(vm.count(
"nparts"))
231 MPInprocs = MPIComm->GetSize();
232 MPIrank = MPIComm->GetRank();
234 nParts = vm[
"nparts"].as<
int>();
237 "Serial", argc, argv);
246 if(vm.count(
"nparts"))
248 nParts = vm[
"nparts"].as<
int>();
252 "Serial", argc, argv);
255 vector<ModuleSharedPtr> modules;
256 vector<string> modcmds;
260 if (vm.count(
"verbose"))
265 if (vm.count(
"module"))
267 modcmds = vm[
"module"].as<vector<string> >();
271 modcmds.insert(modcmds.begin(), inout.begin(), inout.end()-1);
272 modcmds.push_back(*(inout.end()-1));
274 int nInput = inout.size()-1;
280 if(vm.count(
"part-only")||vm.count(
"part-only-overlapping"))
282 nInput = inout.size();
288 for (
int i = 0; i < modcmds.size(); ++i)
294 boost::split(tmp1, modcmds[i], boost::is_any_of(
":"));
296 if (i < nInput || i == modcmds.size() - 1)
300 if (tmp1.size() > 1 && tmp1.back()==
"out")
313 if (tmp1.size() == 1)
321 guess = InputModule::GuessFormat(tmp1[0]);
329 cout <<
"Using input module " << guess <<
" for: "
333 module.second = guess;
334 tmp1.push_back(
string(
"infile="+tmp1[0]));
338 int dot = tmp1[0].find_last_of(
'.') + 1;
339 string ext = tmp1[0].substr(dot, tmp1[0].length() - dot);
343 if(ext.back() == fs::path::preferred_separator)
350 string tmp2 = tmp1[0].substr(0,dot-1);
351 dot = tmp2.find_last_of(
'.') + 1;
352 ext = tmp1[0].substr(dot,tmp1[0].length()-dot);
356 tmp1.push_back(
string(module.first ==
eInputModule ?
"infile=" :
357 "outfile=") +tmp1[0]);
362 module.second = tmp1[1];
363 tmp1.push_back(
string(module.first ==
eInputModule ?
"infile=" :
"outfile=")
371 module.second = tmp1[0];
376 modules.push_back(mod);
380 inputModule = std::dynamic_pointer_cast<InputModule>(mod);
381 inputModule->AddFile(module.second, tmp1[0]);
385 outfilename = tmp1[0];
390 mod->RegisterConfig(
"writemultiplefiles");
394 for (
int j = offset; j < tmp1.size(); ++j)
397 boost::split(tmp2, tmp1[j], boost::is_any_of(
"="));
399 if (tmp2.size() == 1)
401 mod->RegisterConfig(tmp2[0]);
403 else if (tmp2.size() == 2)
405 mod->RegisterConfig(tmp2[0], tmp2[1]);
409 cerr <<
"ERROR: Invalid module configuration: format is "
410 <<
"either :arg or :arg=val" << endl;
421 for (
int i = 0; i < modules.size(); ++i)
423 ++modulesCount[modules[i]->GetModulePriority()];
430 module.second = string(
"equispacedoutput");
432 modules.push_back(mod);
439 if (vm.count(
"range") && f->m_declareExpansionAsContField)
441 ASSERTL0(
false,
"Can't use range option with module requiring "
442 "a continuous expansion.");
445 bool verbose = (f->m_verbose && f->m_comm->TreatAsRankZero());
455 for(
int p = MPIrank;
p < nParts;
p += MPInprocs)
461 cout << endl <<
"Processing partition: " <<
p << endl;
465 partComm = std::shared_ptr<FieldConvertComm>(
478 f->m_comm = partComm;
486 for (
int i = 0; i < modules.size(); ++i)
488 if(modules[i]->GetModulePriority() == priority)
501 for (i = 0; i < modules.size(); ++i)
503 if (boost::iequals(modules[i]->GetModuleName(),
"OutputFld"))
509 if (i != modules.size())
519 module.second = string(
"info");
522 mod->RegisterConfig(
"nparts",
523 boost::lexical_cast<string>(nParts));
526 if (f->m_writeBndFld)
529 int dot = outfilename.find_last_of(
'.') + 1;
531 outfilename.substr(dot, outfilename.length() - dot);
532 string name = outfilename.substr(0, dot - 1);
534 for (
int b = 0; b < f->m_bndRegionsToWrite.size(); ++b)
536 string outfilenew =
name +
"_b" +
537 boost::lexical_cast<string>(
538 f->m_bndRegionsToWrite[b]) +
540 mod->RegisterConfig(
"outfile", outfilenew);
546 mod->RegisterConfig(
"outfile", outfilename);
559 ss << cpuTime <<
"s";
560 cout <<
"Total CPU Time: " << setw(8) << left
578 for (
int i = 0; i < modules.size(); ++i)
580 ++modulesCount[modules[i]->GetModulePriority()];
589 for (
int i = 0; i < modules.size(); ++i)
593 ss << modules[i]->GetModuleName()<<
" ";
596 ss <<
"require fld input.";
608 for (
int i = 0; i < modules.size(); ++i)
610 if(modules[i]->GetModulePriority() ==
eFillExp)
612 ss << modules[i]->GetModuleName()<<
" ";
615 ss <<
"require xml input without fld input.";
627 for (
int i = 0; i < modules.size(); ++i)
629 if(modules[i]->GetModulePriority() ==
eModifyExp ||
632 ss << modules[i]->GetModuleName()<<
" ";
635 ss <<
"require xml input.";
646 for (
int i = 0; i < modules.size(); ++i)
648 if(modules[i]->GetModulePriority() ==
eCreatePts)
650 ss << modules[i]->GetModuleName()<<
" ";
653 ss <<
"should not use xml or fld inputs.";
666 for (
int i = 0; i < modules.size(); ++i)
670 ss << modules[i]->GetModuleName()<<
" ";
673 ss <<
"require xml input.";
680 for (
int i = 0; i < modules.size(); ++i)
684 ss << modules[i]->GetModuleName()<<
" ";
687 ss <<
"is not compatible with module(s): ";
688 for (
int i = 0; i < modules.size(); ++i)
692 ss << modules[i]->GetModuleName()<<
" ";
704 cout <<
"Execution sequence:" << endl;
708 for (
int i = 0; i < modules.size(); ++i)
710 if(modules[i]->GetModulePriority() == priority)
714 cout <<
"\t" << modules[i]->GetModuleName();
719 cout <<
" -> " << modules[i]->GetModuleName();
734 cout << module->GetModuleName() <<
": "
735 << module->GetModuleDescription() << endl;
745 ss << cpuTime <<
"s";
746 cout << module->GetModuleName()
747 <<
" CPU Time: " << setw(8) << left
#define ASSERTL0(condition, msg)
int main(int argc, char *argv[])
void PrintExecutionSequence(vector< ModuleSharedPtr > &modules)
void RunModule(ModuleSharedPtr module, po::variables_map &vm, bool verbose)
void CheckModules(vector< ModuleSharedPtr > &modules)
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
void PrintAvailableClasses(std::ostream &pOut=std::cout)
Prints the available classes to stdout.
NekDouble TimePerTest(unsigned int n)
Returns amount of seconds per iteration in a test with n iterations.
std::shared_ptr< Field > FieldSharedPtr
std::pair< ModuleType, std::string > ModuleKey
std::shared_ptr< InputModule > InputModuleSharedPtr
std::shared_ptr< Module > ModuleSharedPtr
ModuleFactory & GetModuleFactory()
CommFactory & GetCommFactory()
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
The above copyright notice and this permission notice shall be included.