Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/OMSimulatorLib/Component.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ namespace oms

virtual oms_status_enu_t initialize() = 0;
virtual oms_status_enu_t instantiate() = 0;
virtual oms_status_enu_t enterInitializationMode() { return oms_status_ok; }
virtual oms_status_enu_t registerSignalsForResultFile(ResultWriter& resultFile) = 0;
virtual oms_status_enu_t removeSignalsFromResults(const char* regex) = 0;
virtual oms_status_enu_t reset() = 0;
Expand Down
10 changes: 7 additions & 3 deletions src/OMSimulatorLib/ComponentFMU3CS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -684,15 +684,19 @@ oms_status_enu_t oms::ComponentFMU3CS::instantiate()
{
setResourcesHelper1(values);
}
// enterInitialization
time = getModel().getStartTime();

return oms_status_ok;
}

oms_status_enu_t oms::ComponentFMU3CS::enterInitializationMode()
{
double relativeTolerance = 0.0;
getParentSystem()->getTolerance(&relativeTolerance);

fmi3Status status_ = fmi3_enterInitializationMode(fmu, fmi3False, relativeTolerance, time, fmi3False, getModel().getStopTime());
fmi3Status status = fmi3_enterInitializationMode(fmu, fmi3False, relativeTolerance, time, fmi3False, getModel().getStopTime());

if (fmi3OK != status_) return logError_FMUCall("fmi3_enterInitializationMode", this);
if (fmi3OK != status) return logError_FMUCall("fmi3_enterInitializationMode", this);

return oms_status_ok;
}
Expand Down
1 change: 1 addition & 0 deletions src/OMSimulatorLib/ComponentFMU3CS.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ namespace oms
oms_status_enu_t exportToSSVTemplate(pugi::xml_node& ssvNode, Snapshot& snapshot);
oms_status_enu_t exportToSSMTemplate(pugi::xml_node& ssmNode);
oms_status_enu_t instantiate();
oms_status_enu_t enterInitializationMode();
oms_status_enu_t initialize();
oms_status_enu_t terminate();
oms_status_enu_t reset();
Expand Down
19 changes: 16 additions & 3 deletions src/OMSimulatorLib/ComponentFMU3ME.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -670,15 +670,28 @@ oms_status_enu_t oms::ComponentFMU3ME::instantiate()
setResourcesHelper1(values);
}

// enterInitialization
const double& startTime = getModel().getStartTime();

newDiscreteStatesNeeded = fmi3False;
terminateSimulation = fmi3False;
nominalsOfContinuousStatesChanged = fmi3False;
valuesOfContinuousStatesChanged = fmi3True;
nextEventTimeDefined = fmi3False;
nextEventTime = -0.0;

return oms_status_ok;
}

oms_status_enu_t oms::ComponentFMU3ME::enterInitializationMode()
{
const double& startTime = getModel().getStartTime();

double relativeTolerance = 0.0;
getParentSystem()->getTolerance(&relativeTolerance);

fmi3Status status_ = fmi3_enterInitializationMode(fmu, fmi3False, relativeTolerance, startTime, fmi3False, getModel().getStopTime());
fmi3Status status = fmi3_enterInitializationMode(fmu, fmi3False, relativeTolerance, startTime, fmi3False, getModel().getStopTime());

if (fmi3OK != status_) return logError_FMUCall("fmi3_enterInitializationMode", this);
if (fmi3OK != status) return logError_FMUCall("fmi3_enterInitializationMode", this);

newDiscreteStatesNeeded = fmi3False;
terminateSimulation = fmi3False;
Expand Down
1 change: 1 addition & 0 deletions src/OMSimulatorLib/ComponentFMU3ME.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ namespace oms
oms_status_enu_t exportToSSVTemplate(pugi::xml_node& ssvNode, Snapshot& snapshot);
oms_status_enu_t exportToSSMTemplate(pugi::xml_node& ssmNode);
oms_status_enu_t instantiate();
oms_status_enu_t enterInitializationMode();
oms_status_enu_t initialize();
oms_status_enu_t terminate();
oms_status_enu_t reset();
Expand Down
11 changes: 8 additions & 3 deletions src/OMSimulatorLib/ComponentFMUCS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -671,16 +671,21 @@ oms_status_enu_t oms::ComponentFMUCS::instantiate()
setResourcesHelper1(values);
}

// enterInitialization
// setup experiment
time = getModel().getStartTime();
double relativeTolerance = 0.0;
getParentSystem()->getTolerance(&relativeTolerance);

fmi2Status status = fmi2_setupExperiment(fmu, fmi2True, relativeTolerance, time, fmi2False, 1.0);
if (fmi2OK != status) return logError_FMUCall("fmi2_setupExperiment", this);

fmi2Status status_ = fmi2_enterInitializationMode(fmu);
if (fmi2OK != status_) return logError_FMUCall("fmi2_enterInitializationMode", this);
return oms_status_ok;
}

oms_status_enu_t oms::ComponentFMUCS::enterInitializationMode()
{
fmi2Status status = fmi2_enterInitializationMode(fmu);
if (fmi2OK != status) return logError_FMUCall("fmi2_enterInitializationMode", this);

return oms_status_ok;
}
Expand Down
1 change: 1 addition & 0 deletions src/OMSimulatorLib/ComponentFMUCS.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ namespace oms
oms_status_enu_t exportToSSVTemplate(pugi::xml_node& ssvNode, Snapshot& snapshot);
oms_status_enu_t exportToSSMTemplate(pugi::xml_node& ssmNode);
oms_status_enu_t instantiate();
oms_status_enu_t enterInitializationMode();
oms_status_enu_t initialize();
oms_status_enu_t terminate();
oms_status_enu_t reset();
Expand Down
18 changes: 15 additions & 3 deletions src/OMSimulatorLib/ComponentFMUME.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -701,16 +701,28 @@ oms_status_enu_t oms::ComponentFMUME::instantiate()
setResourcesHelper1(values);
}

// enterInitialization
// setup experiment
const double& startTime = getModel().getStartTime();
double relativeTolerance = 0.0;
getParentSystem()->getTolerance(&relativeTolerance);

fmi2Status status = fmi2_setupExperiment(fmu, fmi2True, relativeTolerance, startTime, fmi2False, 1.0);
if (fmi2OK != status) return logError_FMUCall("fmi2_setupExperiment", this);

fmi2Status status_ = fmi2_enterInitializationMode(fmu);
if (fmi2OK != status_) return logError_FMUCall("fmi2_enterInitializationMode", this);
eventInfo.newDiscreteStatesNeeded = fmi2False;
eventInfo.terminateSimulation = fmi2False;
eventInfo.nominalsOfContinuousStatesChanged = fmi2False;
eventInfo.valuesOfContinuousStatesChanged = fmi2True;
eventInfo.nextEventTimeDefined = fmi2False;
eventInfo.nextEventTime = -0.0;

return oms_status_ok;
}

oms_status_enu_t oms::ComponentFMUME::enterInitializationMode()
{
fmi2Status status = fmi2_enterInitializationMode(fmu);
if (fmi2OK != status) return logError_FMUCall("fmi2_enterInitializationMode", this);

eventInfo.newDiscreteStatesNeeded = fmi2False;
eventInfo.terminateSimulation = fmi2False;
Expand Down
1 change: 1 addition & 0 deletions src/OMSimulatorLib/ComponentFMUME.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ namespace oms
oms_status_enu_t exportToSSVTemplate(pugi::xml_node& ssvNode, Snapshot& snapshot);
oms_status_enu_t exportToSSMTemplate(pugi::xml_node& ssmNode);
oms_status_enu_t instantiate();
oms_status_enu_t enterInitializationMode();
oms_status_enu_t initialize();
oms_status_enu_t terminate();
oms_status_enu_t reset();
Expand Down
13 changes: 13 additions & 0 deletions src/OMSimulatorLib/System.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1503,6 +1503,19 @@ oms::Model& oms::System::getModel()
return *parentModel;
}

oms_status_enu_t oms::System::enterInitializationMode()
{
for (const auto& subsystem : getSubSystems())
if (oms_status_ok != subsystem.second->enterInitializationMode())
return oms_status_error;

for (const auto& component : getComponents())
if (oms_status_ok != component.second->enterInitializationMode())
return oms_status_error;

return oms_status_ok;
}

oms_status_enu_t oms::System::deleteAllConectionsTo(const oms::ComRef& cref)
{
for (int i=0; i<connections.size(); ++i)
Expand Down
1 change: 1 addition & 0 deletions src/OMSimulatorLib/System.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ namespace oms
virtual oms_status_enu_t updateSignals(ResultWriter& resultFile);
virtual oms_status_enu_t setSolver(oms_solver_enu_t solver) {return oms_status_error;}
virtual oms_status_enu_t instantiate() = 0;
oms_status_enu_t enterInitializationMode();
virtual oms_status_enu_t initialize() = 0;
virtual oms_status_enu_t terminate() = 0;
virtual oms_status_enu_t reset() = 0;
Expand Down
3 changes: 3 additions & 0 deletions src/OMSimulatorLib/SystemSC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,9 @@ oms_status_enu_t oms::SystemSC::initialize()
clock.reset();
CallClock callClock(clock);

if (oms_status_ok != enterInitializationMode())
return oms_status_error;

if (oms_status_ok != updateDependencyGraphs())
return oms_status_error;

Expand Down
3 changes: 3 additions & 0 deletions src/OMSimulatorLib/SystemWC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,9 @@ oms_status_enu_t oms::SystemWC::initialize()
clock.reset();
CallClock callClock(clock);

if (oms_status_ok != enterInitializationMode())
return oms_status_error;

if (oms_status_ok != updateDependencyGraphs())
return oms_status_error;

Expand Down
Loading