31 #include <boost/program_options/parsers.hpp> 32 #include <boost/program_options/variables_map.hpp> 33 #include <boost/program_options/options_description.hpp> 34 #include <boost/filesystem.hpp> 54 #ifndef FLOW123D_COMPILER_FLAGS_ 55 #define FLOW123D_COMPILER_FLAGS_ "(unknown compiler flags)" 65 "Version of Flow123d for which the input file was created." 66 "Flow123d only warn about version incompatibility. " 67 "However, external tools may use this information to provide conversion " 68 "of the input file to the structure required by another version of Flow123d.")
70 "Simulation problem to be solved.")
72 "If true, the program will wait for key press before it terminates.")
92 #ifdef FLOW123D_HAVE_PYTHON 93 PythonLoader::initialize(python_path);
102 rev_num_data.
version = string(FLOW123D_VERSION_NAME_);
103 rev_num_data.
revision = string(FLOW123D_GIT_REVISION_);
104 rev_num_data.
branch = string(FLOW123D_GIT_BRANCH_);
105 rev_num_data.
url = string(FLOW123D_GIT_URL_);
115 string build = string(__DATE__) +
", " + string(__TIME__)
119 MessageOut().fmt(
"This is Flow123d, version {} commit: {}\n",
121 MessageOut().fmt(
"Branch: {}\nBuild: {}\nFetch URL: {}\n",
122 rev_num_data.
branch, build, rev_num_data.
url );
131 cout <<
"Usage error: The main input file has to be specified through -s parameter.\n\n";
148 namespace po = boost::program_options;
152 po::options_description desc(
"Allowed options");
154 (
"help",
"produce help message")
155 (
"solve,s", po::value< string >(),
"Main input file to solve.")
156 (
"input_dir,i", po::value< string >()->default_value(
"input"),
"Directory for the $INPUT_DIR$ placeholder in the main input file.")
157 (
"output_dir,o", po::value< string >()->default_value(
"output"),
"Directory for all produced output files.")
158 (
"log,l", po::value< string >()->default_value(
"flow123"),
"Set base name for log files.")
159 (
"version",
"Display version and build information and exit.")
160 (
"no_log",
"Turn off logging.")
161 (
"no_signal_handler",
"Turn off signal handling. Useful for debugging with valgrind.")
162 (
"no_profiler,no-profiler",
"Turn off profiler output.")
163 (
"profiler_path,profiler-path", po::value< string >(),
"Path to the profiler file")
164 (
"input_format", po::value< string >(),
"Writes full structure of the main input file into given file.")
165 (
"petsc_redirect", po::value<string>(),
"Redirect all PETSc stdout and stderr to given file.")
166 (
"yaml_balance",
"Redirect balance output to YAML format too (simultaneously with the selected balance output format).");
174 po::variables_map vm;
175 auto parser = po::basic_command_line_parser<char>(argc, argv)
177 .allow_unregistered();
178 po::parsed_options parsed = parser.run();
179 po::store(parsed, vm);
183 vector<string> to_pass_further = po::collect_unrecognized(parsed.options, po::include_positional);
201 if (vm.count(
"no_profiler")) {
205 if (vm.count(
"profiler_path")) {
210 if (vm.count(
"help")) {
213 cout <<
"Usage:" << endl;
214 cout <<
" flow123d -s <main_input>.yaml <other options> <PETSC options>" << endl;
215 cout <<
" flow123d <main_input>.yaml <other options> <PETSC options>" << endl;
216 cout << desc <<
"\n";
220 if (vm.count(
"version")) {
226 if (vm.count(
"input_format")) {
228 ofstream json_stream;
239 if (vm.count(
"petsc_redirect")) {
243 if (vm.count(
"no_signal_handler")) {
248 string input_filename =
"";
251 if (to_pass_further.size()) {
252 string file_candidate = to_pass_further[0];
253 if (file_candidate[0] !=
'-') {
255 input_filename = file_candidate;
256 to_pass_further.erase(to_pass_further.begin());
260 if (vm.count(
"solve")) {
261 input_filename = vm[
"solve"].as<
string>();
264 if (input_filename ==
"")
265 THROW(ExcMessage() << EI_Message(
"Main input file not specified (option -s)."));
272 if (vm.count(
"input_dir")) {
273 input_dir = vm[
"input_dir"].as<
string>();
275 if (vm.count(
"output_dir")) {
276 output_dir = vm[
"output_dir"].as<
string>();
282 }
catch (FilePath::ExcMkdirFail &e) {
287 if (vm.count(
"log")) {
291 if (vm.count(
"no_log")) {
314 using namespace Input;
316 std::regex version_re(
"([^.]*)[.]([^.]*)[.]([^.]*)");
318 std::string version(FLOW123D_VERSION_NAME_);
320 if ( std::regex_match(version, match, version_re) ) {
321 ver_fields[0]=match[1];
322 ver_fields[1]=match[2];
323 ver_fields[2]=match[3];
325 OLD_ASSERT(1,
"Bad Flow123d version format: %s\n", version.c_str() );
328 std::string input_version = i_rec.
val<
string>(
"flow123d_version");
330 if ( std::regex_match(input_version, match, version_re) ) {
331 iver_fields[0]=match[1];
332 iver_fields[1]=match[2];
333 iver_fields[2]=match[3];
335 THROW( ExcVersionFormat() << EI_InputVersionStr(input_version) );
338 if ( iver_fields[0] != ver_fields[0] || iver_fields[1] > ver_fields[1] ) {
339 WarningOut().fmt(
"Input file with version: '{}' is no compatible with the program version: '{}' \n",
340 input_version, version);
355 THROW( ExcUnknownProblem() );
368 printf(
"\nPress <ENTER> for closing the window\n");
380 std::this_thread::sleep_for(std::chrono::microseconds(10));
420 int main(
int argc,
char **argv) {
423 app.
init(argc, argv);
425 }
catch (std::exception & e) {
426 _LOG( Logger::MsgType::error ).every_proc() << e.what();
430 _LOG( Logger::MsgType::error ).every_proc() <<
"Unknown exception" << endl;
#define MPI_Test(request, flag, status)
static Input::Type::Abstract & get_input_type()
Input::Type::RevNumData get_rev_num_data()
Get version of program and other base data from rev_num.h and store them to map.
virtual void parse_cmd_line(const int argc, char **argv)
#define MessageOut()
Macro defining 'message' record of log.
string main_input_filename_
filename of main input file
static bool petsc_initialized
Application(const std::string &python_path)
Application constructor.
string profiler_path
location of the profiler report file
void set_program_info(string, string, string, string, string)
bool use_profiler
If true, we do output of profiling information.
static string set_dirs_from_input(const string main_yaml, const string input, const string output)
Method for set input and output directories.
string petsc_redirect_file_
static void set_yaml_output()
Set global variable to output balance files into YAML format (in addition to the table format)...
HC_ExplicitSequential * problem_
Main Flow123d problem.
void open_stream(Stream &stream) const
static void uninitialize()
static const int exit_failure
void output(MPI_Comm, ostream &)
static const int exit_success
Return codes of application.
#define _LOG(type)
Internal macro defining universal record of log.
bool yaml_balance_output_
If true, preserves output of balance in YAML format.
#define START_TIMER(tag)
Starts a timer with specified tag.
bool signal_handler_off_
Turn off signal handling useful to debug with valgrind.
static Input::Type::Record & get_input_type()
Root of the Input::Type tree. Description of whole input structure.
int main(int argc, char **argv)
void init(int argc, char **argv)
Dedicated class for storing path to input and output files.
static const int exit_output
string program_arguments_desc_
Description of possible command line arguments.
#define WarningOut()
Macro defining 'warning' record of log.
#define END_TIMER(tag)
Ends a timer with specified tag.
static const Input::Type::Record & get_input_type()
static Profiler * instance(bool clear=false)
Class for solution of steady or unsteady flow with sequentially coupled explicit transport.
virtual ~Application()
Destructor.
#define FLOW123D_COMPILER_FLAGS_
named version of the program
Input::Record root_record
root input record
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
Input::Record read_input()
void printf(BasicWriter< Char > &w, BasicCStringRef< Char > format, ArgList args)
void transform_profiler_data(const string &, const string &)