SimSettings OMCFactory::readSimulationParameter(int argc, const char* argv[]) { int opt; int portnum; map<string, OutputPointType> outputPointTypeMap = MAP_LIST_OF "all", OPT_ALL MAP_LIST_SEP "step", OPT_STEP MAP_LIST_SEP "none", OPT_NONE MAP_LIST_END; map<string, OutputFormat> outputFormatMap = MAP_LIST_OF "csv", CSV MAP_LIST_SEP "mat", MAT MAP_LIST_SEP "buffer", BUFFER MAP_LIST_SEP "empty", EMPTY MAP_LIST_END; map<string, EmitResults> emitResultsMap = MAP_LIST_OF "all", EMIT_ALL MAP_LIST_SEP "public", EMIT_PUBLIC MAP_LIST_SEP "none", EMIT_NONE MAP_LIST_END; po::options_description desc("Allowed options"); //program options that can be overwritten by OMEdit must be declared as vector //so that the same value can be set multiple times //(e.g. 'executable -F arg1 -r=arg2' -> 'executable -F arg1 -F=arg2') //the variables of OMEdit are always the first elements of the result vectors, if they are set desc.add_options() ("help", "produce help message") ("nls-continue", po::bool_switch()->default_value(false), "non linear solver will continue if it can not reach the given precision") ("runtime-library,R", po::value<string>(), "path to cpp runtime libraries") ("modelica-system-library,M", po::value<string>(), "path to Modelica library") ("input-path", po::value< string >(), "directory with input files, like init xml (defaults to modelica-system-library)") ("output-path", po::value< string >(), "directory for output files, like results (defaults to modelica-system-library)") ("results-file,F", po::value<vector<string> >(),"name of results file") ("start-time,S", po::value< double >()->default_value(0.0), "simulation start time") ("stop-time,E", po::value< double >()->default_value(1.0), "simulation stop time") ("step-size,H", po::value< double >()->default_value(0.0), "simulation step size") ("solver,I", po::value< string >()->default_value("euler"), "solver method") ("lin-solver,L", po::value< string >()->default_value(_defaultLinSolver), "linear solver method") ("non-lin-solver,N", po::value< string >()->default_value(_defaultNonLinSolver), "non linear solver method") ("number-of-intervals,G", po::value< int >()->default_value(500), "number of intervals in equidistant grid") ("tolerance,T", po::value< double >()->default_value(1e-6), "solver tolerance") ("warn-all,W", po::bool_switch()->default_value(false), "issue all warning messages") ("log-settings,V", po::value< vector<string> >(), "log information: init, nls, ls, solver, output, events, model, other") ("log-format,X", po::value< string >()->default_value("txt"), "log format: txt, xml, xmltcp") ("log-port", po::value< int >()->default_value(0), "tcp port for log messages (default 0 meaning stdout/stderr)") ("alarm,A", po::value<unsigned int >()->default_value(360), "sets timeout in seconds for simulation") ("output-type,O", po::value< string >()->default_value("all"), "the points in time written to result file: all (output steps + events), step (just output points), none") ("output-format,P", po::value< string >()->default_value("mat"), "simulation results output format: csv, mat, buffer, empty") ("emit-results,U", po::value< string >()->default_value("public"), "emit results: all, public, none") ; // a group for all options that should not be visible if '--help' is set po::options_description descHidden("Hidden options"); descHidden.add_options() ("ignored", po::value<vector<string> >(), "ignored options") ("unrecognized", po::value<vector<string> >(), "unsupported options") ("solver-threads", po::value<int>()->default_value(1), "number of threads that can be used by the solver") ; po::options_description descAll("All options"); descAll.add(desc); descAll.add(descHidden); po::variables_map vm; boost::function<pair<string, string> (const string&)> parserFunction(boost::bind(&OMCFactory::parseIngoredAndWrongFormatOption, this, _1)); po::parsed_options parsed = po::command_line_parser(argc, argv) .options(descAll) .style((po::command_line_style::default_style | po::command_line_style::allow_long_disguise) & ~po::command_line_style::allow_guessing) .extra_parser(parserFunction) .allow_unregistered() .run(); po::store(parsed, vm); po::notify(vm); if (vm.count("help")) { cout << desc << endl; throw ModelicaSimulationError(MODEL_FACTORY, "Cannot parse command line arguments correctly, because the help message was requested.", "",true); } LogSettings logSettings = initializeLogger(vm); // warn about unrecognized command line options vector<string> unrecognized = po::collect_unrecognized(parsed.options, po::include_positional); if (vm.count("unrecognized")) { vector<string> opts = vm["unrecognized"].as<vector<string> >(); unrecognized.insert(unrecognized.begin(), opts.begin(), opts.end()); } if (unrecognized.size() > 0) { ostringstream os; os << "Warning: unrecognized command line options "; copy(unrecognized.begin(), unrecognized.end(), ostream_iterator<string>(os, " ")); LOGGER_WRITE(os.str(), LC_OTHER, LL_WARNING); } string runtime_lib_path; string modelica_lib_path; double starttime = vm["start-time"].as<double>(); double stoptime = vm["stop-time"].as<double>(); double stepsize =vm["step-size"].as<double>(); bool nlsContinueOnError = vm["nls-continue"].as<bool>(); int solverThreads = vm["solver-threads"].as<int>(); if (!(stepsize > 0.0)) stepsize = (stoptime - starttime) / vm["number-of-intervals"].as<int>(); double tolerance = vm["tolerance"].as<double>(); string solver = vm["solver"].as<string>(); string nonLinSolver = vm["non-lin-solver"].as<string>(); string linSolver = vm["lin-solver"].as<string>(); unsigned int timeOut = vm["alarm"].as<unsigned int>(); if (vm.count("runtime-library")) { //cout << "runtime library path set to " << vm["runtime-library"].as<string>() << endl; runtime_lib_path = vm["runtime-library"].as<string>(); normalizePath(runtime_lib_path); } else throw ModelicaSimulationError(MODEL_FACTORY,"runtime libraries path is not set"); if (vm.count("modelica-system-library")) { //cout << "Modelica library path set to " << vm["Modelica-system-library"].as<string>() << endl; modelica_lib_path = vm["modelica-system-library"].as<string>(); normalizePath(modelica_lib_path); } else throw ModelicaSimulationError(MODEL_FACTORY,"Modelica library path is not set"); string inputPath, outputPath; if (vm.count("input-path")) { inputPath = vm["input-path"].as<string>(); normalizePath(inputPath); } else inputPath = modelica_lib_path; if (vm.count("output-path")) { outputPath = vm["output-path"].as<string>(); normalizePath(outputPath); } else outputPath = modelica_lib_path; string resultsfilename; if (vm.count("results-file")) { //cout << "results file: " << vm["results-file"].as<string>() << endl; resultsfilename = vm["results-file"].as<vector<string> >().front(); } else throw ModelicaSimulationError(MODEL_FACTORY,"results-filename is not set"); OutputPointType outputPointType; if (vm.count("output-type")) { string outputType_str = vm["output-type"].as<string>(); if (outputPointTypeMap.find(outputType_str) != outputPointTypeMap.end()) outputPointType = outputPointTypeMap[outputType_str]; else throw ModelicaSimulationError(MODEL_FACTORY, "Unknown output-type " + outputType_str); } else throw ModelicaSimulationError(MODEL_FACTORY, "output-type is not set"); OutputFormat outputFormat; if (vm.count("output-format")) { string outputFormat_str = vm["output-format"].as<string>(); if (outputFormatMap.find(outputFormat_str) != outputFormatMap.end()) outputFormat = outputFormatMap[outputFormat_str]; else throw ModelicaSimulationError(MODEL_FACTORY, "Unknown output-format " + outputFormat_str); } else throw ModelicaSimulationError(MODEL_FACTORY, "output-format is not set"); EmitResults emitResults = EMIT_PUBLIC; // emit public per default for OMC use if (vm.count("emit-results")) { string emitResults_str = vm["emit-results"].as<string>(); if (emitResultsMap.find(emitResults_str) != emitResultsMap.end()) emitResults = emitResultsMap[emitResults_str]; else throw ModelicaSimulationError(MODEL_FACTORY, "Unknown emit-results " + emitResults_str); } fs::path libraries_path = fs::path( runtime_lib_path) ; fs::path modelica_path = fs::path( modelica_lib_path) ; libraries_path.make_preferred(); modelica_path.make_preferred(); SimSettings settings = {solver, linSolver, nonLinSolver, starttime, stoptime, stepsize, 1e-24, 0.01, tolerance, resultsfilename, timeOut, outputPointType, logSettings, nlsContinueOnError, solverThreads, outputFormat, emitResults, inputPath, outputPath}; _library_path = libraries_path.string(); _modelicasystem_path = modelica_path.string(); return settings; }
SimSettings OMCFactory::readSimulationParameter(int argc, const char* argv[]) { int opt; int portnum; map<string, LogCategory> logCatMap = MAP_LIST_OF "init", LC_INIT MAP_LIST_SEP "nls", LC_NLS MAP_LIST_SEP "ls", LC_LS MAP_LIST_SEP "solv", LC_SOLV MAP_LIST_SEP "output", LC_OUT MAP_LIST_SEP "event", LC_EVT MAP_LIST_SEP "model", LC_MOD MAP_LIST_SEP "other", LC_OTHER MAP_LIST_END; map<string, LogLevel> logLvlMap = MAP_LIST_OF "error", LL_ERROR MAP_LIST_SEP "warning", LL_WARNING MAP_LIST_SEP "info", LL_INFO MAP_LIST_SEP "debug", LL_DEBUG MAP_LIST_END; map<string, OutputPointType> outputPointTypeMap = MAP_LIST_OF "all", OPT_ALL MAP_LIST_SEP "step", OPT_STEP MAP_LIST_SEP "none", OPT_NONE MAP_LIST_END; map<string, OutputFormat> outputFormatTypeMap = MAP_LIST_OF "csv", CSV MAP_LIST_SEP "mat", MAT MAP_LIST_SEP "buffer", BUFFER MAP_LIST_SEP "empty", EMPTY MAP_LIST_END; po::options_description desc("Allowed options"); //program options that can be overwritten by OMEdit must be declared as vector //so that the same value can be set multiple times //(e.g. 'executable -F arg1 -r=arg2' -> 'executable -F arg1 -F=arg2') //the variables of OMEdit are always the first elements of the result vectors, if they are set desc.add_options() ("help", "produce help message") ("nls-continue", po::bool_switch()->default_value(false),"non linear solver will continue if it can not reach the given precision") ("runtime-library,R", po::value<string>(),"path to cpp runtime libraries") ("modelica-system-library,M", po::value<string>(), "path to Modelica library") ("results-file,F", po::value<vector<string> >(),"name of results file") ("start-time,S", po::value< double >()->default_value(0.0), "simulation start time") ("stop-time,E", po::value< double >()->default_value(1.0), "simulation stop time") ("step-size,H", po::value< double >()->default_value(0.0), "simulation step size") ("solver,I", po::value< string >()->default_value("euler"), "solver method") ("lin-solver,L", po::value< string >()->default_value(_defaultLinSolver), "linear solver method") ("non-lin-solver,N", po::value< string >()->default_value(_defaultNonLinSolver), "non linear solver method") ("number-of-intervals,G", po::value< int >()->default_value(500), "number of intervals in equidistant grid") ("tolerance,T", po::value< double >()->default_value(1e-6), "solver tolerance") ("log-settings,V", po::value< vector<string> >(), "log information: init, nls, ls, solv, output, event, model, other") ("alarm,A", po::value<unsigned int >()->default_value(360), "sets timeout in seconds for simulation") ("output-type,O", po::value< string >()->default_value("all"), "the points in time written to result file: all (output steps + events), step (just output points), none") ("output-format,P", po::value< string >()->default_value("mat"), "The simulation results output format") ; // a group for all options that should not be visible if '--help' is set po::options_description descHidden("Hidden options"); descHidden.add_options() ("ignored", po::value<vector<string> >(), "ignored options") ("unrecognized", po::value<vector<string> >(), "unsupported options") ("solverThreads", po::value<int>()->default_value(1), "number of threads that can be used by the solver") ; po::options_description descAll("All options"); descAll.add(desc); descAll.add(descHidden); po::variables_map vm; boost::function<pair<string, string> (const string&)> parserFunction(boost::bind(&OMCFactory::parseIngoredAndWrongFormatOption, this, _1)); po::parsed_options parsed = po::command_line_parser(argc, argv) .options(descAll) .style((po::command_line_style::default_style | po::command_line_style::allow_long_disguise) & ~po::command_line_style::allow_guessing) .extra_parser(parserFunction) .allow_unregistered() .run(); po::store(parsed, vm); po::notify(vm); if (vm.count("help")) { cout << desc << "\n"; throw ModelicaSimulationError(MODEL_FACTORY, "Cannot parse command line arguments correctly, because the help message was requested.", "",true); } // warn about unrecognized command line options, including OMEdit for now vector<string> unrecognized = po::collect_unrecognized(parsed.options, po::include_positional); if (vm.count("unrecognized")) { vector<string> opts = vm["unrecognized"].as<vector<string> >(); unrecognized.insert(unrecognized.begin(), opts.begin(), opts.end()); } if (unrecognized.size() > 0) { cerr << "Warning: unrecognized command line options "; copy(unrecognized.begin(), unrecognized.end(), ostream_iterator<string>(cerr, " ")); cerr << endl; } string runtime_lib_path; string modelica_lib_path; double starttime = vm["start-time"].as<double>(); double stoptime = vm["stop-time"].as<double>(); double stepsize =vm["step-size"].as<double>(); bool nlsContinueOnError = vm["nls-continue"].as<bool>(); int solverThreads = vm["solverThreads"].as<int>(); if (!(stepsize > 0.0)) stepsize = (stoptime - starttime) / vm["number-of-intervals"].as<int>(); double tolerance =vm["tolerance"].as<double>(); string solver = vm["solver"].as<string>(); string nonLinSolver = vm["non-lin-solver"].as<string>(); string linSolver = vm["lin-solver"].as<string>(); unsigned int timeOut = vm["alarm"].as<unsigned int>(); if (vm.count("runtime-library")) { //cout << "runtime library path set to " << vm["runtime-library"].as<string>() << endl; runtime_lib_path = vm["runtime-library"].as<string>(); } else throw ModelicaSimulationError(MODEL_FACTORY,"runtime libraries path is not set"); if (vm.count("modelica-system-library")) { //cout << "Modelica library path set to " << vm["Modelica-system-library"].as<string>() << endl; modelica_lib_path =vm["modelica-system-library"].as<string>(); } else throw ModelicaSimulationError(MODEL_FACTORY,"Modelica library path is not set"); string resultsfilename; if (vm.count("results-file")) { //cout << "results file: " << vm["results-file"].as<string>() << endl; resultsfilename = vm["results-file"].as<vector<string> >().front(); } else throw ModelicaSimulationError(MODEL_FACTORY,"results-filename is not set"); string outputPointType_str; OutputPointType outputPointType; if (vm.count("output-type")) { //cout << "results file: " << vm["results-file"].as<string>() << endl; outputPointType_str = vm["output-type"].as<string>(); outputPointType = outputPointTypeMap[outputPointType_str]; } else throw ModelicaSimulationError(MODEL_FACTORY, "output-type is not set"); LogSettings logSet; if (vm.count("log-settings")) { vector<string> log_vec = vm["log-settings"].as<vector<string> >(),tmpvec; for(unsigned i=0;i<log_vec.size();++i) { //cout << i << ". " << log_vec[i] << endl; tmpvec.clear(); boost::split(tmpvec,log_vec[i],boost::is_any_of("=")); if(tmpvec.size()>1 && logLvlMap.find(tmpvec[1]) != logLvlMap.end() && ( tmpvec[0] == "all" || logCatMap.find(tmpvec[0]) != logCatMap.end())) { if(tmpvec[0] == "all") { logSet.setAll(logLvlMap[tmpvec[1]]); break; } else logSet.modes[logCatMap[tmpvec[0]]] = logLvlMap[tmpvec[1]]; } else throw ModelicaSimulationError(MODEL_FACTORY,"log-settings flags not supported: " + log_vec[i] + "\n"); } } OutputFormat outputFormat; if (vm.count("output-format")) { string outputFormatType_str = vm["output-format"].as<string>(); outputFormat = outputFormatTypeMap[outputFormatType_str]; } else throw ModelicaSimulationError(MODEL_FACTORY, "output-format is not set"); fs::path libraries_path = fs::path( runtime_lib_path) ; fs::path modelica_path = fs::path( modelica_lib_path) ; libraries_path.make_preferred(); modelica_path.make_preferred(); SimSettings settings = {solver,linSolver,nonLinSolver,starttime,stoptime,stepsize,1e-24,0.01,tolerance,resultsfilename,timeOut,outputPointType,logSet,nlsContinueOnError,solverThreads,outputFormat}; _library_path = libraries_path.string(); _modelicasystem_path = modelica_path.string(); return settings; }