Skip to content

Commit f7c50c9

Browse files
authored
use the DefaultExperiment settings from modeldescription.xml (#1273)
* use the DefaultExperiment settings from modeldescription.xml * set separate working directory for test
1 parent 614c663 commit f7c50c9

15 files changed

Lines changed: 112 additions & 51 deletions

include/OMSimulator/OMSimulator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ OMSAPI oms_status_enu_t OMSCALL oms_exportDependencyGraphs(const char* cref, con
8989
OMSAPI oms_status_enu_t OMSCALL oms_exportSnapshot(const char* cref, char** contents);
9090
OMSAPI oms_status_enu_t OMSCALL oms_exportSSMTemplate(const char * cref, const char * filename);
9191
OMSAPI oms_status_enu_t OMSCALL oms_exportSSVTemplate(const char* cref, const char* filename);
92-
OMSAPI oms_status_enu_t OMSCALL oms_extractFMIKind(const char* filename, oms_fmi_kind_enu_t* kind);
92+
OMSAPI oms_status_enu_t OMSCALL oms_extractFMIKind(const char* filename, oms_fmi_kind_enu_t* kind, oms_fmu_default_experiment_settings* defaultExperiment);
9393
OMSAPI oms_status_enu_t OMSCALL oms_fetchExternalModelInterfaces(const char* cref, char*** names, char*** domains, int** dimensions);
9494
OMSAPI void OMSCALL oms_freeMemory(void* obj);
9595
OMSAPI oms_status_enu_t OMSCALL oms_getBoolean(const char* cref, bool* value);

include/OMSimulator/Types.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,16 @@ typedef struct {
532532
unsigned int maxOutputDerivativeOrder;
533533
} oms_fmu_info_t;
534534

535+
/*
536+
* FMU default experiment settings from modeldescription.xml
537+
*/
538+
typedef struct {
539+
double startTime; // default startTime for simulation
540+
double stopTime; // default stoptTime for simulation
541+
double tolerance; // default relative integration tolerance
542+
double stepSize; // default stepSize
543+
} oms_fmu_default_experiment_settings;
544+
535545
/**
536546
* \brief External model specific attributes
537547
*/

src/OMSimulatorLib/OMSimulator.cpp

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,7 +1182,12 @@ oms_status_enu_t oms_RunFile(const char* filename)
11821182
std::string fmuName = systemName + (oms::ComRef::isValidIdent(path.stem().string()) ? ("." + path.stem().string()) : ".fmu");
11831183
oms_fmi_kind_enu_t kind;
11841184

1185-
status = oms_extractFMIKind(filename, &kind);
1185+
/* intialize the defaultExperiment with defaults set in Flags.cpp setDefaults() or
1186+
* values provided from user from commandLine (e.g) OMSimulator A.fmu --stopTime=10 --stepSize=10
1187+
*/
1188+
oms_fmu_default_experiment_settings defaultExperiment = {oms::Flags::StartTime(), oms::Flags::StopTime(), oms::Flags::Tolerance(), oms::Flags::MaximumStepSize()};
1189+
1190+
status = oms_extractFMIKind(filename, &kind, &defaultExperiment);
11861191
if (oms_status_ok != status) return logError("oms_extractFMIKind failed");
11871192

11881193
status = oms_newModel(modelName.c_str());
@@ -1204,9 +1209,12 @@ oms_status_enu_t oms_RunFile(const char* filename)
12041209

12051210
if (oms::Flags::ResultFile() != "<default>")
12061211
oms_setResultFile(modelName.c_str(), oms::Flags::ResultFile().c_str(), 1);
1207-
oms_setStartTime(modelName.c_str(), oms::Flags::StartTime());
1208-
oms_setStopTime(modelName.c_str(), oms::Flags::StopTime());
1209-
oms_setTolerance(modelName.c_str(), oms::Flags::Tolerance(), oms::Flags::Tolerance());
1212+
oms_setStartTime(modelName.c_str(), defaultExperiment.startTime);
1213+
oms_setStopTime(modelName.c_str(), defaultExperiment.stopTime);
1214+
oms_setTolerance(modelName.c_str(), defaultExperiment.tolerance, defaultExperiment.tolerance);
1215+
// set the maximum stepSize
1216+
oms_setVariableStepSize(modelName.c_str(), oms::Flags::InitialStepSize(), oms::Flags::MinimumStepSize(), defaultExperiment.stepSize);
1217+
12101218
if (kind == oms_fmi_kind_me_and_cs)
12111219
oms_setSolver(systemName.c_str(), oms::Flags::DefaultModeIsCS() ? oms::Flags::MasterAlgorithm() : oms::Flags::Solver());
12121220
else
@@ -1839,7 +1847,7 @@ oms_status_enu_t oms_getVariableStepSize(const char* cref, double* initialStepSi
18391847
return oms_status_ok;
18401848
}
18411849

1842-
oms_status_enu_t oms_extractFMIKind(const char* filename, oms_fmi_kind_enu_t* kind)
1850+
oms_status_enu_t oms_extractFMIKind(const char* filename, oms_fmi_kind_enu_t* kind, oms_fmu_default_experiment_settings* defaultExperiment)
18431851
{
18441852
if (!kind)
18451853
return logError("Invalid argument \"kind=NULL\"");
@@ -1870,6 +1878,37 @@ oms_status_enu_t oms_extractFMIKind(const char* filename, oms_fmi_kind_enu_t* ki
18701878
return oms_status_error;
18711879
}
18721880

1881+
// get default experiment settings if exists
1882+
if (node.child("DefaultExperiment"))
1883+
{
1884+
/* give priority for values provided from command line,
1885+
* if the user overrides those variables then we should take those values
1886+
* and not the default values from <DefaultExperiment> in modeldescription.xml
1887+
*/
1888+
if (defaultExperiment->startTime == 0.0)
1889+
{
1890+
if (node.child("DefaultExperiment").attribute("startTime").as_string() != "")
1891+
defaultExperiment->startTime = node.child("DefaultExperiment").attribute("startTime").as_double();
1892+
}
1893+
if (defaultExperiment->stopTime == 1.0)
1894+
{
1895+
if (node.child("DefaultExperiment").attribute("stopTime").as_string() != "")
1896+
defaultExperiment->stopTime = node.child("DefaultExperiment").attribute("stopTime").as_double();
1897+
}
1898+
if (defaultExperiment->tolerance == 1e-4)
1899+
{
1900+
if (node.child("DefaultExperiment").attribute("tolerance").as_string() != "")
1901+
defaultExperiment->tolerance = node.child("DefaultExperiment").attribute("tolerance").as_double();
1902+
}
1903+
if (defaultExperiment->stepSize == 1e-3) // maximumStepSize
1904+
{
1905+
if (node.child("DefaultExperiment").attribute("stepSize").as_string() != "")
1906+
defaultExperiment->stepSize = node.child("DefaultExperiment").attribute("stepSize").as_double();
1907+
else
1908+
defaultExperiment->stepSize = (defaultExperiment->stopTime - defaultExperiment->startTime) / 500;
1909+
}
1910+
}
1911+
18731912
return oms_status_ok;
18741913
}
18751914

testsuite/simulation/replaceSubmodel1.lua

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88

99
oms_setCommandLineOption("--suppressPath=true")
1010
oms_setTempDirectory("./replacesubmodel_01_lua/")
11+
oms_setWorkingDirectory("./replacesubmodel_01_lua/")
1112

1213
oms_newModel("model")
1314

1415
oms_addSystem("model.root", oms_system_wc)
1516

16-
oms_addSubModel("model.root.A", "../resources/replaceA.fmu")
17-
oms_addSubModel("model.root.B", "../resources/replaceB.fmu")
17+
oms_addSubModel("model.root.A", "../../resources/replaceA.fmu")
18+
oms_addSubModel("model.root.B", "../../resources/replaceB.fmu")
1819

1920
oms_setReal("model.root.A.u", 10.0)
2021
oms_setReal("model.root.A.t", -10.0)
@@ -42,7 +43,7 @@ oms_delete("model")
4243

4344
oms_importFile("replaceSubmodel1.ssp")
4445

45-
oms_replaceSubModel("model.root.A", "../resources/replaceA_extended.fmu", false)
46+
oms_replaceSubModel("model.root.A", "../../resources/replaceA_extended.fmu", false)
4647
src, status = oms_exportSnapshot("model")
4748
print(src)
4849

@@ -309,7 +310,7 @@ oms_delete("model")
309310
-- info: model.root.B.u1 : -13.0
310311
-- info: model.root.B.z : -15.0
311312
-- error: [getVariable] Unknown signal "model.root.A.dummy"
312-
-- warning: deleting connection "A.dummy ==> B.u1", as signal "dummy" couldn't be resolved to any signal in the replaced submodel "../resources/replaceA_extended.fmu"
313+
-- warning: deleting connection "A.dummy ==> B.u1", as signal "dummy" couldn't be resolved to any signal in the replaced submodel "../../resources/replaceA_extended.fmu"
313314
-- warning: deleting start value "A.t" in "inline" resources, because the identifier couldn't be resolved to any system signal in the replacing model
314315
-- <?xml version="1.0"?>
315316
-- <oms:snapshot

testsuite/simulation/replaceSubmodel10.lua

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88

99
oms_setCommandLineOption("--suppressPath=true")
1010
oms_setTempDirectory("./replacesubmodel_10_lua/")
11+
oms_setWorkingDirectory("./replacesubmodel_10_lua/")
1112

1213
oms_newModel("model")
1314

1415
oms_addSystem("model.root", oms_system_wc)
1516

16-
oms_addSubModel("model.root.A", "../resources/replaceA.fmu")
17-
oms_addSubModel("model.root.B", "../resources/replaceB.fmu")
17+
oms_addSubModel("model.root.A", "../../resources/replaceA.fmu")
18+
oms_addSubModel("model.root.B", "../../resources/replaceB.fmu")
1819

1920
oms_newResources("model.root:root.ssv")
2021

@@ -45,7 +46,7 @@ oms_delete("model")
4546
oms_importFile("replaceSubmodel10.ssp")
4647

4748
-- reimport the old snapshot and replacing is not done
48-
oms_replaceSubModel("model.root.A", "../resources/replaceA_extended.fmu", true)
49+
oms_replaceSubModel("model.root.A", "../../resources/replaceA_extended.fmu", true)
4950
src, status = oms_exportSnapshot("model")
5051
print(src)
5152

@@ -304,7 +305,7 @@ oms_delete("model")
304305
-- info: model.root.B.u1 : -13.0
305306
-- info: model.root.B.z : -15.0
306307
-- error: [getVariable] Unknown signal "model.root.A.dummy"
307-
-- warning: deleting connection "A.dummy ==> B.u1", as signal "dummy" couldn't be resolved to any signal in the replaced submodel "../resources/replaceA_extended.fmu"
308+
-- warning: deleting connection "A.dummy ==> B.u1", as signal "dummy" couldn't be resolved to any signal in the replaced submodel "../../resources/replaceA_extended.fmu"
308309
-- warning: deleting start value "A.t" in "resources/root.ssv" resources, because the identifier couldn't be resolved to any system signal in the replacing model
309310
-- <?xml version="1.0"?>
310311
-- <oms:snapshot

testsuite/simulation/replaceSubmodel11.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@
1111

1212
oms.setCommandLineOption("--suppressPath=true")
1313
oms.setTempDirectory("./replacesubmodel_11_py/")
14+
oms.setWorkingDirectory("./replacesubmodel_11_py/")
1415

1516
oms.newModel("model")
1617

1718
oms.addSystem("model.root", oms.system_wc)
1819

19-
oms.addSubModel("model.root.A", "../resources/Modelica.Blocks.Sources.Sine.fmu")
20-
oms.addSubModel("model.root.B", "../resources/Modelica.Blocks.Math.Gain.fmu")
20+
oms.addSubModel("model.root.A", "../../resources/Modelica.Blocks.Sources.Sine.fmu")
21+
oms.addSubModel("model.root.B", "../../resources/Modelica.Blocks.Math.Gain.fmu")
2122

2223
## add connections
2324
oms.addConnection("model.root.A.y", "model.root.B.u")
@@ -33,7 +34,7 @@
3334

3435
oms.importFile("replaceSubmodel11.ssp")
3536

36-
oms.replaceSubModel("model.root.B", "../resources/Modelica.Blocks.Math.Gain.fmu", False)
37+
oms.replaceSubModel("model.root.B", "../../resources/Modelica.Blocks.Math.Gain.fmu", False)
3738

3839
src, status = oms.exportSnapshot("model")
3940
print(src)

testsuite/simulation/replaceSubmodel12.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@
1111

1212
oms.setCommandLineOption("--suppressPath=true")
1313
oms.setTempDirectory("./replacesubmodel_12_py/")
14+
oms.setWorkingDirectory("./replacesubmodel_12_py/")
1415

1516
oms.newModel("model")
1617

1718
oms.addSystem("model.root", oms.system_wc)
1819

19-
oms.addSubModel("model.root.A", "../resources/Modelica.Blocks.Sources.Sine.fmu")
20-
oms.addSubModel("model.root.B", "../resources/Modelica.Blocks.Math.Gain.fmu")
20+
oms.addSubModel("model.root.A", "../../resources/Modelica.Blocks.Sources.Sine.fmu")
21+
oms.addSubModel("model.root.B", "../../resources/Modelica.Blocks.Math.Gain.fmu")
2122

2223
## add connections
2324
oms.addConnection("model.root.A.y", "model.root.B.u")
@@ -33,7 +34,7 @@
3334

3435
oms.importFile("replaceSubmodel12.ssp")
3536

36-
oms.replaceSubModel("model.root.B", "../resources/Modelica.Blocks.Sources.Step.fmu", False)
37+
oms.replaceSubModel("model.root.B", "../../resources/Modelica.Blocks.Sources.Step.fmu", False)
3738

3839
src, status = oms.exportSnapshot("model")
3940
print(src)
@@ -44,7 +45,7 @@
4445

4546
## Result:
4647
## error: [getVariable] Unknown signal "model.root.B.u"
47-
## warning: deleting connection "A.y ==> B.u", as signal "u" couldn't be resolved to any signal in the replaced submodel "../resources/Modelica.Blocks.Sources.Step.fmu"
48+
## warning: deleting connection "A.y ==> B.u", as signal "u" couldn't be resolved to any signal in the replaced submodel "../../resources/Modelica.Blocks.Sources.Step.fmu"
4849
## <?xml version="1.0"?>
4950
## <oms:snapshot
5051
## xmlns:oms="https://raw.githubusercontent.com/OpenModelica/OMSimulator/master/schema/oms.xsd"

testsuite/simulation/replaceSubmodel2.lua

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88

99
oms_setCommandLineOption("--suppressPath=true")
1010
oms_setTempDirectory("./replacesubmodel_02_lua/")
11+
oms_setWorkingDirectory("./replacesubmodel_02_lua/")
1112

1213
oms_newModel("model")
1314

1415
oms_addSystem("model.root", oms_system_wc)
1516

16-
oms_addSubModel("model.root.A", "../resources/replaceA.fmu")
17-
oms_addSubModel("model.root.B", "../resources/replaceB.fmu")
17+
oms_addSubModel("model.root.A", "../../resources/replaceA.fmu")
18+
oms_addSubModel("model.root.B", "../../resources/replaceB.fmu")
1819

1920
oms_newResources("model.root:root.ssv")
2021

@@ -44,7 +45,7 @@ oms_delete("model")
4445

4546
oms_importFile("replaceSubmodel2.ssp")
4647

47-
oms_replaceSubModel("model.root.A", "../resources/replaceA_extended.fmu", false)
48+
oms_replaceSubModel("model.root.A", "../../resources/replaceA_extended.fmu", false)
4849
src, status = oms_exportSnapshot("model")
4950
print(src)
5051

@@ -303,7 +304,7 @@ oms_delete("model")
303304
-- info: model.root.B.u1 : -13.0
304305
-- info: model.root.B.z : -15.0
305306
-- error: [getVariable] Unknown signal "model.root.A.dummy"
306-
-- warning: deleting connection "A.dummy ==> B.u1", as signal "dummy" couldn't be resolved to any signal in the replaced submodel "../resources/replaceA_extended.fmu"
307+
-- warning: deleting connection "A.dummy ==> B.u1", as signal "dummy" couldn't be resolved to any signal in the replaced submodel "../../resources/replaceA_extended.fmu"
307308
-- warning: deleting start value "A.t" in "resources/root.ssv" resources, because the identifier couldn't be resolved to any system signal in the replacing model
308309
-- <?xml version="1.0"?>
309310
-- <oms:snapshot

testsuite/simulation/replaceSubmodel3.lua

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@
88

99
oms_setCommandLineOption("--suppressPath=true")
1010
oms_setTempDirectory("./replacesubmodel_03_lua/")
11+
oms_setWorkingDirectory("./replacesubmodel_03_lua/")
1112

1213
oms_newModel("model")
1314

1415
oms_addSystem("model.root", oms_system_wc)
1516

16-
oms_addSubModel("model.root.A", "../resources/replaceA.fmu")
17+
oms_addSubModel("model.root.A", "../../resources/replaceA.fmu")
1718
oms_newResources("model.root.A:replaceA.ssv")
1819

19-
oms_addSubModel("model.root.B", "../resources/replaceB.fmu")
20+
oms_addSubModel("model.root.B", "../../resources/replaceB.fmu")
2021
oms_newResources("model.root.B:replaceB.ssv")
2122

2223
oms_setReal("model.root.A.u", 10.0)
@@ -45,7 +46,7 @@ oms_delete("model")
4546

4647
oms_importFile("replaceSubmodel3.ssp")
4748

48-
oms_replaceSubModel("model.root.A", "../resources/replaceA_extended.fmu", false)
49+
oms_replaceSubModel("model.root.A", "../../resources/replaceA_extended.fmu", false)
4950
src, status = oms_exportSnapshot("model")
5051
print(src)
5152

@@ -319,7 +320,7 @@ oms_delete("model")
319320
-- info: model.root.B.u1 : -13.0
320321
-- info: model.root.B.z : -15.0
321322
-- error: [getVariable] Unknown signal "model.root.A.dummy"
322-
-- warning: deleting connection "A.dummy ==> B.u1", as signal "dummy" couldn't be resolved to any signal in the replaced submodel "../resources/replaceA_extended.fmu"
323+
-- warning: deleting connection "A.dummy ==> B.u1", as signal "dummy" couldn't be resolved to any signal in the replaced submodel "../../resources/replaceA_extended.fmu"
323324
-- warning: deleting start value "A.t" in "resources/replaceA.ssv" resources, because the identifier couldn't be resolved to any system signal in the replacing model
324325
-- <?xml version="1.0"?>
325326
-- <oms:snapshot

testsuite/simulation/replaceSubmodel4.lua

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88

99
oms_setCommandLineOption("--suppressPath=true")
1010
oms_setTempDirectory("./replacesubmodel_04_lua/")
11+
oms_setWorkingDirectory("./replacesubmodel_04_lua/")
1112

12-
oms_importFile("../resources/replaceSubmodel4.ssp")
13+
oms_importFile("../../resources/replaceSubmodel4.ssp")
1314

1415
src, status = oms_exportSnapshot("model")
1516
print(src)
@@ -21,7 +22,7 @@ print("info: model.root.B.u : " .. oms_getReal("model.root.B.u"))
2122
print("info: model.root.B.u1 : " .. oms_getReal("model.root.B.u1"))
2223
print("info: model.root.B.z : " .. oms_getReal("model.root.B.z"))
2324

24-
oms_replaceSubModel("model.root.A", "../resources/replaceA_extended.fmu", false)
25+
oms_replaceSubModel("model.root.A", "../../resources/replaceA_extended.fmu", false)
2526

2627
src, status = oms_exportSnapshot("model")
2728
print(src)
@@ -290,7 +291,7 @@ oms_delete("model")
290291
-- info: model.root.B.u1 : -13.0
291292
-- info: model.root.B.z : -15.0
292293
-- error: [getVariable] Unknown signal "model.root.A.dummy"
293-
-- warning: deleting connection "A.dummy ==> B.u1", as signal "dummy" couldn't be resolved to any signal in the replaced submodel "../resources/replaceA_extended.fmu"
294+
-- warning: deleting connection "A.dummy ==> B.u1", as signal "dummy" couldn't be resolved to any signal in the replaced submodel "../../resources/replaceA_extended.fmu"
294295
-- warning: deleting start value "A.t" in "resources/root.ssm" resources, because the identifier couldn't be resolved to any system signal in the replacing model
295296
-- warning: deleting start value "A.t" in "resources/root.ssv" resources, because the identifier couldn't be resolved to any system signal in the replacing model
296297
-- <?xml version="1.0"?>

0 commit comments

Comments
 (0)