OMSimulatorLib
The OMSimulator project is a FMI-based co-simulation environment.
Flags.h
Go to the documentation of this file.
1 /*
2  * This file is part of OpenModelica.
3  *
4  * Copyright (c) 1998-CurrentYear, Open Source Modelica Consortium (OSMC),
5  * c/o Linköpings universitet, Department of Computer and Information Science,
6  * SE-58183 Linköping, Sweden.
7  *
8  * All rights reserved.
9  *
10  * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF GPL VERSION 3 LICENSE OR
11  * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.2.
12  * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES
13  * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GPL VERSION 3,
14  * ACCORDING TO RECIPIENTS CHOICE.
15  *
16  * The OpenModelica software and the Open Source Modelica
17  * Consortium (OSMC) Public License (OSMC-PL) are obtained
18  * from OSMC, either from the above address,
19  * from the URLs: http://www.ida.liu.se/projects/OpenModelica or
20  * http://www.openmodelica.org, and in the OpenModelica distribution.
21  * GNU version 3 is obtained from: http://www.gnu.org/copyleft/gpl.html.
22  *
23  * This program is distributed WITHOUT ANY WARRANTY; without
24  * even the implied warranty of MERCHANTABILITY or FITNESS
25  * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH
26  * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL.
27  *
28  * See the full OSMC Public License conditions for more details.
29  *
30  */
31 
32 #pragma once
33 
34 #include "OMSimulator/Types.h"
35 
36 #include <array>
37 #include <map>
38 #include <string>
39 #include <vector>
40 
41 namespace oms
42 {
43  class Flags
44  {
45  private:
46  Flags();
47  ~Flags();
48  void setDefaults();
49 
50  // stop the compiler generating methods copying the object
51  Flags(Flags const &);
52  Flags &operator=(Flags const &);
53 
54  public:
55  static Flags &GetInstance();
56 
57  static oms_status_enu_t SetCommandLineOption(const std::string &cmd);
58 
59  static bool AddParametersToCSV() { return GetInstance().FlagAddParametersToCSV.value == "true"; }
60  static bool DefaultModeIsCS() { return GetInstance().FlagMode.value == "cs"; }
61  static bool DeleteTempFiles() { return GetInstance().FlagDeleteTempFiles.value == "true"; }
63  static bool DumpAlgLoops() { return GetInstance().FlagDumpAlgLoops.value == "true"; }
64  static bool EmitEvents() { return GetInstance().FlagEmitEvents.value == "true"; }
65  static bool IgnoreInitialUnknowns() { return GetInstance().FlagIgnoreInitialUnknowns.value == "true"; }
66  static bool InputExtrapolation() { return GetInstance().FlagInputExtrapolation.value == "true"; }
67  static bool ProgressBar() { return GetInstance().FlagProgressBar.value == "true"; }
68  static bool RealTime() { return GetInstance().FlagRealTime.value == "true"; }
69  static bool SkipCSVHeader() { return GetInstance().FlagSkipCSVHeader.value == "true"; }
70  static bool SolverStats() { return GetInstance().FlagSolverStats.value == "true"; }
71  static bool StripRoot() { return GetInstance().FlagStripRoot.value == "true"; }
72  static bool SuppressPath() { return GetInstance().FlagSuppressPath.value == "true"; }
73  static bool WallTime() { return GetInstance().FlagWallTime.value == "true"; }
74  static bool ZeroNominal() { return GetInstance().FlagZeroNominal.value == "true"; }
75  static double InitialStepSize() { return atof(GetInstance().FlagInitialStepSize.value.c_str()); }
76  static double MaximumStepSize() { return atof(GetInstance().FlagStepSize.value.c_str()); }
77  static double MinimumStepSize() { return atof(GetInstance().FlagMinimumStepSize.value.c_str()); }
78  static double StartTime() { return atof(GetInstance().FlagStartTime.value.c_str()); }
79  static double StopTime() { return atof(GetInstance().FlagStopTime.value.c_str()); }
80  static double Timeout() { return atof(GetInstance().FlagTimeout.value.c_str()); }
81  static double Tolerance() { return atof(GetInstance().FlagTolerance.value.c_str()); }
82  static int CVODEMaxErrTestFails() { return atoi(GetInstance().FlagCVODEMaxErrTestFails.value.c_str()); }
83  static int CVODEMaxNLSFailures() { return atoi(GetInstance().FlagCVODEMaxNLSFailures.value.c_str()); }
84  static int CVODEMaxNLSIterations() { return atoi(GetInstance().FlagCVODEMaxNLSIterations.value.c_str()); }
85  static int CVODEMaxSteps() { return atoi(GetInstance().FlagCVODEMaxSteps.value.c_str()); }
86  static oms_alg_solver_enu_t AlgLoopSolver();
87  static oms_solver_enu_t MasterAlgorithm();
88  static oms_solver_enu_t Solver();
89  static std::string ResultFile() { return GetInstance().FlagResultFile.value; }
90  static unsigned int Intervals() { return atoi(GetInstance().FlagIntervals.value.c_str()); }
91  static unsigned int MaxEventIteration() { return atoi(GetInstance().FlagMaxEventIteration.value.c_str()); }
92  static unsigned int MaxLoopIteration() { return atoi(GetInstance().FlagMaxLoopIteration.value.c_str()); }
93  static unsigned int NumProcs() { return atoi(GetInstance().FlagNumProcs.value.c_str()); }
94 
95  private:
96  std::map<std::string, unsigned int> lookup;
97  std::vector<std::string> files;
98 
99  const std::string re_void = "";
100  const std::string re_default = ".+";
101  const std::string re_bool = "(true|false)";
102  const std::string re_mode = "(me|cs)";
103  const std::string re_double = "((\\+|-)?[[:digit:]]+)(\\.(([[:digit:]]+)?))?((e|E)((\\+|-)?)[[:digit:]]+)?";
104  const std::string re_number = "[[:digit:]]+";
105  const std::string re_filename = ".+(\\.fmu|\\.ssp|\\.lua)";
106  const std::string re_solver = "(euler|cvode)";
107 
108  public:
109  struct Flag
110  {
111  const std::string name;
112  const std::string abbr;
113  std::string value;
114  const std::string defaultValue;
115  const std::string desc;
116  const std::string regex;
117  oms_status_enu_t (*action)(const std::string &value);
118  const bool interrupt;
119  const bool settings;
121  };
122 
123  Flag FlagFilename{"", "", "", "", "FMU or SSP file to be loaded", re_filename, Flags::Filename, false, false, false};
124  Flag FlagAddParametersToCSV{"--addParametersToCSV", "", "", "false", "Export parameters to a .csv file", re_bool, nullptr, false, false, false};
125  Flag FlagAlgLoopSolver{"--algLoopSolver", "", "", "kinsol", "Specifies the loop solver method (fixedpoint, kinsol) used for algebraic loops spanning multiple components.", re_default, nullptr, false, false, false};
126  Flag FlagClearAllOptions{"--clearAllOptions", "", "", "", "Reset all flags to their default values", re_void, Flags::ClearAllOptions, false, false, false};
127  Flag FlagCVODEMaxErrTestFails{"--CVODEMaxErrTestFails", "", "", "100", "Maximum number of error test failures for CVODE", re_number, nullptr, false, false, false};
128  Flag FlagCVODEMaxNLSFailures{"--CVODEMaxNLSFailures", "", "", "100", "Maximum number of nonlinear convergence failures for CVODE", re_number, nullptr, false, false, false};
129  Flag FlagCVODEMaxNLSIterations{"--CVODEMaxNLSIterations", "", "", "5", "Maximum number of nonlinear solver iterations for CVODE", re_number, nullptr, false, false, false};
130  Flag FlagCVODEMaxSteps{"--CVODEMaxSteps", "", "", "1000", "Maximum number of steps for CVODE", re_number, nullptr, false, false, false};
131  Flag FlagDeleteTempFiles{"--deleteTempFiles", "", "", "true", "Delete temporary files as soon as they are no longer needed", re_bool, nullptr, false, false, false};
132  Flag FlagDirectionalDerivatives{"--directionalDerivatives", "", "", "true", "Use directional derivatives to calculate the Jacobian for algebraic loops", re_bool, nullptr, false, false, false};
133  Flag FlagDumpAlgLoops{"--dumpAlgLoops", "", "", "false", "Dump information for algebraic loops", re_bool, nullptr, false, false, false};
134  Flag FlagEmitEvents{"--emitEvents", "", "", "true", "Emit events during simulation", re_bool, nullptr, false, false, false};
135  Flag FlagHelp{"--help", "-h", "", "", "Display the help text", re_void, Flags::Help, true, false, false};
136  Flag FlagIgnoreInitialUnknowns{"--ignoreInitialUnknowns", "", "", "false", "Ignore initial unknowns from the modelDescription.xml", re_bool, nullptr, false, false, false};
137  Flag FlagInitialStepSize{"--initialStepSize", "", "", "1e-6", "Specify the initial step size", re_double, nullptr, false, false, false};
138  Flag FlagInputExtrapolation{"--inputExtrapolation", "", "", "false", "Enable input extrapolation using derivative information", re_bool, nullptr, false, false, false};
139  Flag FlagIntervals{"--intervals", "-i", "", "500", "Specify the number of communication points (arg > 1)", re_number, nullptr, false, false, false};
140  Flag FlagLogFile{"--logFile", "-l", "", "", "Specify the log file (stdout is used if no log file is specified)", re_default, nullptr, false, false, false};
141  Flag FlagLogLevel{"--logLevel", "", "", "0", "Set the log level (0: default, 1: debug, 2: debug+trace)", re_number, nullptr, false, false, false};
142  Flag FlagMasterAlgorithm{"--master", "", "", "ma", "Specify the master algorithm (ma)", re_default, nullptr, false, false, false};
143  Flag FlagMaxEventIteration{"--maxEventIteration", "", "", "100", "Specify the maximum number of iterations for handling a single event", re_number, nullptr, false, false, false};
144  Flag FlagMaxLoopIteration{"--maxLoopIteration", "", "", "10", "Specify the maximum number of iterations for solving algebraic loops between system-level components. Internal algebraic loops of components are not affected.", re_number, nullptr, false, false, false};
145  Flag FlagMinimumStepSize{"--minimumStepSize", "", "", "1e-12", "Specify the minimum step size", re_double, nullptr, false, false, false};
146  Flag FlagMode{"--mode", "-m", "", "me", "Force a certain FMI mode if the FMU provides both cs and me (cs, me)", re_mode, nullptr, false, false, false};
147  Flag FlagNumProcs{"--numProcs", "-n", "", "1", "Specify the maximum number of processors to use (0=auto, 1=default)", re_number, nullptr, false, false, false};
148  Flag FlagProgressBar{"--progressBar", "", "", "false", "Show a progress bar for the simulation progress in the terminal", re_bool, nullptr, false, false, false};
149  Flag FlagRealTime{"--realTime", "", "", "false", "Enable experimental feature for (soft) real-time co-simulation", re_bool, nullptr, false, false, false};
150  Flag FlagResultFile{"--resultFile", "-r", "", "<default>", "Specify the name of the output result file", re_default, nullptr, false, false, false};
151  Flag FlagSkipCSVHeader{"--skipCSVHeader", "", "", "true", "Skip exporting the CSV delimiter in the header", re_bool, nullptr, false, false, false};
152  Flag FlagSolver{"--solver", "", "", "cvode", "Specify the integration method (euler, cvode)", re_solver, nullptr, false, false, false};
153  Flag FlagSolverStats{"--solverStats", "", "", "false", "Add solver stats to the result file, e.g., step size; not supported for all solvers", re_bool, nullptr, false, false, false};
154  Flag FlagStartTime{"--startTime", "-s", "", "0", "Specify the start time", re_double, nullptr, false, false, false};
155  Flag FlagStepSize{"--stepSize", "", "", "1e-3", "Specify the (maximum) step size", re_double, nullptr, false, false, false};
156  Flag FlagStopTime{"--stopTime", "-t", "", "1", "Specify the stop time", re_double, nullptr, false, false, false};
157  Flag FlagStripRoot{"--stripRoot", "", "", "false", "Remove the root system prefix from all exported signals", re_bool, nullptr, false, false, false};
158  Flag FlagSuppressPath{"--suppressPath", "", "", "false", "Suppress path information in info messages; especially useful for testing", re_bool, nullptr, false, false, false};
159  Flag FlagTempDir{"--tempDir", "", "", ".", "Specify the temporary directory", re_default, nullptr, false, true, false};
160  Flag FlagTimeout{"--timeout", "", "", "0", "Specify the maximum allowed time in seconds for running a simulation (0 disables)", re_number, nullptr, false, false, false};
161  Flag FlagTolerance{"--tolerance", "", "", "1e-4", "Specify the relative tolerance", re_double, nullptr, false, false, false};
162  Flag FlagVersion{"--version", "-v", "", "", "Display version information", re_void, Flags::Version, false, false, false};
163  Flag FlagWallTime{"--wallTime", "", "", "false", "Add wall time information to the result file", re_bool, nullptr, false, false, false};
164  Flag FlagWorkingDir{"--workingDir", "", "", ".", "Specify the working directory", re_default, nullptr, false, true, false};
165  Flag FlagZeroNominal{"--zeroNominal", "", "", "false", "Accept FMUs with invalid nominal values and replace the invalid nominal values with 1.0", re_bool, nullptr, false, false, false};
166 
167  private:
168  std::array<Flag *, 43> flags = {
169  &FlagFilename,
181  &FlagHelp,
185  &FlagIntervals,
186  &FlagLogFile,
187  &FlagLogLevel,
192  &FlagMode,
193  &FlagNumProcs,
195  &FlagRealTime,
198  &FlagSolver,
200  &FlagStartTime,
201  &FlagStepSize,
202  &FlagStopTime,
203  &FlagStripRoot,
205  &FlagTempDir,
206  &FlagTimeout,
207  &FlagTolerance,
208  &FlagVersion,
209  &FlagWallTime,
211  &FlagZeroNominal};
212 
213  static oms_status_enu_t SetFlag(size_t flag_id, const std::string &value);
214 
215  static oms_status_enu_t ClearAllOptions(const std::string &value);
216  static oms_status_enu_t Filename(const std::string &value);
217  static oms_status_enu_t Help(const std::string &value);
218  static oms_status_enu_t Version(const std::string &value);
219  };
220 }
Definition: Flags.h:44
Flags(Flags const &)
not implemented
static double MaximumStepSize()
Definition: Flags.h:76
static bool DefaultModeIsCS()
Definition: Flags.h:60
static oms_solver_enu_t MasterAlgorithm()
Definition: Flags.cpp:317
Flag FlagMasterAlgorithm
Definition: Flags.h:142
const std::string re_bool
Definition: Flags.h:101
static unsigned int MaxEventIteration()
Definition: Flags.h:91
static oms_status_enu_t Help(const std::string &value)
Definition: Flags.cpp:249
Flag FlagWorkingDir
Definition: Flags.h:164
static unsigned int Intervals()
Definition: Flags.h:90
Flag FlagIntervals
Definition: Flags.h:139
Flag FlagMaxLoopIteration
Definition: Flags.h:144
const std::string re_default
Definition: Flags.h:100
static double Tolerance()
Definition: Flags.h:81
const std::string re_mode
Definition: Flags.h:102
Flag FlagMaxEventIteration
Definition: Flags.h:143
Flags & operator=(Flags const &)
not implemented
Flag FlagAddParametersToCSV
Definition: Flags.h:124
static oms_status_enu_t Filename(const std::string &value)
Definition: Flags.cpp:243
static bool WallTime()
Definition: Flags.h:73
static int CVODEMaxNLSIterations()
Definition: Flags.h:84
Flag FlagStopTime
Definition: Flags.h:156
Flag FlagStartTime
Definition: Flags.h:154
Flag FlagVersion
Definition: Flags.h:162
static bool DumpAlgLoops()
Definition: Flags.h:63
std::map< std::string, unsigned int > lookup
Definition: Flags.h:96
Flag FlagAlgLoopSolver
Definition: Flags.h:125
static int CVODEMaxErrTestFails()
Definition: Flags.h:82
Flag FlagCVODEMaxSteps
Definition: Flags.h:130
Flag FlagStepSize
Definition: Flags.h:155
static bool RealTime()
Definition: Flags.h:68
Flag FlagSolver
Definition: Flags.h:152
static double StopTime()
Definition: Flags.h:79
std::array< Flag *, 43 > flags
Definition: Flags.h:168
static int CVODEMaxNLSFailures()
Definition: Flags.h:83
static bool SuppressPath()
Definition: Flags.h:72
static bool EmitEvents()
Definition: Flags.h:64
static oms_alg_solver_enu_t AlgLoopSolver()
Definition: Flags.cpp:306
const std::string re_filename
Definition: Flags.h:105
static double Timeout()
Definition: Flags.h:80
Flag FlagDirectionalDerivatives
Definition: Flags.h:132
static oms_status_enu_t SetFlag(size_t flag_id, const std::string &value)
Definition: Flags.cpp:145
static double InitialStepSize()
Definition: Flags.h:75
static oms_solver_enu_t Solver()
Definition: Flags.cpp:326
static int CVODEMaxSteps()
Definition: Flags.h:85
Flag FlagProgressBar
Definition: Flags.h:148
static bool SkipCSVHeader()
Definition: Flags.h:69
Flag FlagStripRoot
Definition: Flags.h:157
static bool ZeroNominal()
Definition: Flags.h:74
Flag FlagLogLevel
Definition: Flags.h:141
void setDefaults()
Definition: Flags.cpp:120
static bool ProgressBar()
Definition: Flags.h:67
Flag FlagWallTime
Definition: Flags.h:163
Flag FlagLogFile
Definition: Flags.h:140
static bool DeleteTempFiles()
Definition: Flags.h:61
Flag FlagCVODEMaxNLSFailures
Definition: Flags.h:128
static double StartTime()
Definition: Flags.h:78
Flag FlagCVODEMaxErrTestFails
Definition: Flags.h:127
static bool InputExtrapolation()
Definition: Flags.h:66
static bool IgnoreInitialUnknowns()
Definition: Flags.h:65
Flag FlagDumpAlgLoops
Definition: Flags.h:133
static bool AddParametersToCSV()
Definition: Flags.h:59
static Flags & GetInstance()
Definition: Flags.cpp:62
static std::string ResultFile()
Definition: Flags.h:89
Flag FlagTempDir
Definition: Flags.h:159
Flag FlagEmitEvents
Definition: Flags.h:134
Flag FlagDeleteTempFiles
Definition: Flags.h:131
Flag FlagHelp
Definition: Flags.h:135
static unsigned int MaxLoopIteration()
Definition: Flags.h:92
const std::string re_solver
Definition: Flags.h:106
Flag FlagSuppressPath
Definition: Flags.h:158
static bool DirectionalDerivatives()
Definition: Flags.h:62
static oms_status_enu_t ClearAllOptions(const std::string &value)
Definition: Flags.cpp:237
Flag FlagTimeout
Definition: Flags.h:160
const std::string re_void
Definition: Flags.h:99
std::vector< std::string > files
Definition: Flags.h:97
static bool SolverStats()
Definition: Flags.h:70
static unsigned int NumProcs()
Definition: Flags.h:93
static oms_status_enu_t SetCommandLineOption(const std::string &cmd)
Definition: Flags.cpp:180
Flags()
Definition: Flags.cpp:46
Flag FlagInputExtrapolation
Definition: Flags.h:138
Flag FlagNumProcs
Definition: Flags.h:147
Flag FlagZeroNominal
Definition: Flags.h:165
Flag FlagClearAllOptions
Definition: Flags.h:126
Flag FlagMode
Definition: Flags.h:146
Flag FlagFilename
Definition: Flags.h:123
const std::string re_number
Definition: Flags.h:104
Flag FlagResultFile
Definition: Flags.h:150
const std::string re_double
Definition: Flags.h:103
Flag FlagRealTime
Definition: Flags.h:149
Flag FlagSkipCSVHeader
Definition: Flags.h:151
Flag FlagMinimumStepSize
Definition: Flags.h:145
~Flags()
Definition: Flags.cpp:58
Flag FlagSolverStats
Definition: Flags.h:153
static bool StripRoot()
Definition: Flags.h:71
Flag FlagInitialStepSize
Definition: Flags.h:137
Flag FlagCVODEMaxNLSIterations
Definition: Flags.h:129
static oms_status_enu_t Version(const std::string &value)
Definition: Flags.cpp:288
Flag FlagTolerance
Definition: Flags.h:161
static double MinimumStepSize()
Definition: Flags.h:77
Flag FlagIgnoreInitialUnknowns
Definition: Flags.h:136
Definition: AlgLoop.h:45
Definition: Flags.h:110
const std::string name
Definition: Flags.h:111
bool explicitlySet
Definition: Flags.h:120
const bool interrupt
Definition: Flags.h:118
const std::string defaultValue
Definition: Flags.h:114
const bool settings
Definition: Flags.h:119
oms_status_enu_t(* action)(const std::string &value)
Definition: Flags.h:117
const std::string abbr
Definition: Flags.h:112
std::string value
Definition: Flags.h:113
const std::string desc
Definition: Flags.h:115
const std::string regex
Definition: Flags.h:116