Skip to content

Commit acb56d9

Browse files
authored
propagate export name to all connectors (#1537)
1 parent 923e806 commit acb56d9

9 files changed

Lines changed: 162 additions & 11 deletions

File tree

src/OMSimulatorLib/ComponentFMU3CS.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,19 @@ oms_status_enu_t oms::ComponentFMU3CS::initializeDependencyGraph_outputs()
611611
return oms_status_ok;
612612
}
613613

614+
oms_status_enu_t oms::ComponentFMU3CS::setExportName(const std::string& exportName)
615+
{
616+
this->exportName = exportName;
617+
for (auto &connector : connectors)
618+
{
619+
if (connector)
620+
{
621+
connector->setExportName(exportName);
622+
}
623+
}
624+
return oms_status_ok;
625+
}
626+
614627
oms_status_enu_t oms::ComponentFMU3CS::instantiate()
615628
{
616629
// TODO investigate fmi3IntermediateUpdateCallback = NULL

src/OMSimulatorLib/ComponentFMU3CS.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ namespace oms
123123
oms_status_enu_t newResources(const std::string& ssvFilename, const std::string& ssmFilename, bool externalResources);
124124
oms_status_enu_t setResourcesHelper1(Values value);
125125
oms_status_enu_t setResourcesHelper2(Values value);
126-
oms_status_enu_t setExportName(const std::string & exportName) { this->exportName = exportName; return oms_status_ok;};
126+
oms_status_enu_t setExportName(const std::string & exportName);
127127
std::string getExportName() const { return this->exportName; }
128128
oms_status_enu_t deleteReferencesInSSD(const std::string& filename);
129129
oms_status_enu_t deleteResourcesInSSP(const std::string& filename);

src/OMSimulatorLib/ComponentFMUCS.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,19 @@ oms_status_enu_t oms::ComponentFMUCS::exportToSSD(pugi::xml_node& node, Snapshot
394394
return oms_status_ok;
395395
}
396396

397+
oms_status_enu_t oms::ComponentFMUCS::setExportName(const std::string& exportName)
398+
{
399+
this->exportName = exportName;
400+
for (auto &connector : connectors)
401+
{
402+
if (connector)
403+
{
404+
connector->setExportName(exportName);
405+
}
406+
}
407+
return oms_status_ok;
408+
}
409+
397410
void oms::ComponentFMUCS::getFilteredUnitDefinitionsToSSD(std::map<std::string, std::map<std::string, std::string>>& unitDefinitions)
398411
{
399412
// get units from connectors

src/OMSimulatorLib/ComponentFMUCS.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ namespace oms
107107

108108
oms_status_enu_t getRealOutputDerivative(const ComRef& cref, SignalDerivative& der);
109109
oms_status_enu_t setRealInputDerivative(const ComRef& cref, const SignalDerivative& der);
110-
oms_status_enu_t setExportName(const std::string & exportName) { this->exportName = exportName; return oms_status_ok;};
110+
oms_status_enu_t setExportName(const std::string & exportName);
111111
std::string getExportName() const { return this->exportName; }
112112
oms_status_enu_t registerSignalsForResultFile(ResultWriter& resultFile);
113113
oms_status_enu_t updateSignals(ResultWriter& resultWriter);

src/OMSimulatorLib/ComponentFMUME.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,19 @@ oms_status_enu_t oms::ComponentFMUME::exportToSSD(pugi::xml_node& node, Snapshot
394394
return oms_status_ok;
395395
}
396396

397+
oms_status_enu_t oms::ComponentFMUME::setExportName(const std::string& exportName)
398+
{
399+
this->exportName = exportName;
400+
for (auto &connector : connectors)
401+
{
402+
if (connector)
403+
{
404+
connector->setExportName(exportName);
405+
}
406+
}
407+
return oms_status_ok;
408+
}
409+
397410
void oms::ComponentFMUME::getFilteredUnitDefinitionsToSSD(std::map<std::string, std::map<std::string, std::string>>& unitDefinitions)
398411
{
399412
// get units from connectors

src/OMSimulatorLib/ComponentFMUME.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ namespace oms
123123
oms_status_enu_t newResources(const std::string& ssvFilename, const std::string& ssmFilename, bool externalResources);
124124
oms_status_enu_t setResourcesHelper1(Values value);
125125
oms_status_enu_t setResourcesHelper2(Values value);
126-
oms_status_enu_t setExportName(const std::string & exportName) { this->exportName = exportName; return oms_status_ok;};
126+
oms_status_enu_t setExportName(const std::string & exportName);
127127
std::string getExportName() const { return this->exportName; }
128128
oms_status_enu_t deleteReferencesInSSD(const std::string& filename);
129129
oms_status_enu_t deleteResourcesInSSP(const std::string& filename);

src/OMSimulatorLib/DirectedGraph.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -261,11 +261,13 @@ void oms::DirectedGraph::calculateSortedConnections()
261261
scc_t scc;
262262
for (int j = 0; j < components[i].size(); ++j)
263263
{
264-
Connector conA = nodes[edges.connections[components[i][j]].first];
265-
Connector conB = nodes[edges.connections[components[i][j]].second];
266-
267-
if (oms::Connection::isValid(conA.getName(), conB.getName(), conA, conB))
264+
Connector& conA = nodes[edges.connections[components[i][j]].first];
265+
Connector& conB = nodes[edges.connections[components[i][j]].second];
266+
if (oms::Connection::isValid(conA.getName(), conB.getName(), conA, conB) ||
267+
oms::Connection::isValidExportConnectorName(conA, conB))
268268
{
269+
// std::cout << "\n valid connection from " << conA.getName().c_str() << " ==> " << conB.getName().c_str();
270+
// std::cout << "\n*******" << std::endl;
269271
scc.connections.push_back(std::pair<int, int>(edges.connections[components[i][j]]));
270272
scc.component_names.insert(conA.getOwner());
271273
scc.component_names.insert(conB.getOwner());
@@ -355,16 +357,19 @@ void oms::DirectedGraph::setUnits(Connector* conA, Connector* conB, bool suppres
355357

356358
for (auto &it : nodes)
357359
{
358-
// std::cout << "\n after edge:" << it.getName().c_str() << "==>" << crefA.c_str() << "==>" << crefB.c_str();
359360
if (it.getName() == crefA)
360361
{
361362
for (const auto &con : conA->connectorUnits)
362363
it.connectorUnits[con.first] = con.second;
364+
// set the export name for the connector
365+
it.setExportName(conA->getExportName());
363366
}
364367
if (it.getName() == crefB)
365368
{
366369
for (const auto &con : conB->connectorUnits)
367370
it.connectorUnits[con.first] = con.second;
371+
// set the export name for the connector
372+
it.setExportName(conB->getExportName());
368373
}
369374
}
370375
}

testsuite/simulation/SimpleSimulation15.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@
4646
#print(instantiated_model.dumpApiCalls())
4747

4848
instantiated_model.setResultFile("SimpleSimulation15_res.mat")
49-
instantiated_model.setValue(CRef('default', 'sub-system', 'u'), 400.0)
49+
instantiated_model.setValue(CRef('default', 'Add1', 'u1'), 400.0)
5050

5151
instantiated_model.initialize()
5252
instantiated_model.simulate()
53-
print(f"info: default.sub-system.u: {instantiated_model.getValue(CRef('default', 'sub-system', 'u'))}", flush=True)
53+
print(f"info: default.sub-system.u : {instantiated_model.getValue(CRef('default', 'sub-system', 'u'))}", flush=True)
5454
print(f"info: default.sub-system.Add2.u1: {instantiated_model.getValue(CRef('default', 'sub-system', 'Add2', 'u1'))}", flush=True)
5555
print(f"info: default.sub-system.Add2.u2: {instantiated_model.getValue(CRef('default', 'sub-system', 'Add2', 'u2'))}", flush=True)
5656
print(f"info: default.sub-system.Add2.y : {instantiated_model.getValue(CRef('default', 'sub-system', 'Add2', 'y'))}", flush=True)
@@ -110,7 +110,7 @@
110110
## |-- DefaultExperiment
111111
## |-- |-- startTime: 0.0
112112
## |-- |-- stopTime: 1.0
113-
## info: default.sub-system.u: 400.0
113+
## info: default.sub-system.u : 400.0
114114
## info: default.sub-system.Add2.u1: 400.0
115115
## info: default.sub-system.Add2.u2: 400.0
116116
## info: default.sub-system.Add2.y : 800.0
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
## status: correct
2+
## teardown_command: rm -rf SimpleSimulation16_res.mat
3+
## linux: yes
4+
## ucrt64: yes
5+
## win: yes
6+
## mac: yes
7+
8+
from OMSimulator import SSP, CRef, Connector, Causality, SignalType
9+
10+
model = SSP()
11+
model.addResource('../resources/Modelica.Blocks.Math.Add.fmu', new_name='resources/Add.fmu')
12+
model.addResource('../resources/Modelica.Blocks.Sources.Sine.fmu', new_name='resources/Sine.fmu')
13+
14+
model.addComponent(CRef("default", "Add"), "resources/Add.fmu")
15+
model.addComponent(CRef("default", "Sine"), "resources/Sine.fmu")
16+
model.addConnection(CRef("default", "Sine", "y"), CRef("default", "Add", "u1"))
17+
model.addConnection(CRef("default", "Sine", "y"), CRef("default", "Add", "u2"))
18+
19+
model.addSystem(CRef("default", "sub-system"))
20+
subsystem = model.activeVariant.system.elements[CRef("sub-system")]
21+
22+
model.addComponent(CRef("default", "sub-system", "Add2"), "resources/Add.fmu")
23+
24+
subsystem.addConnector(Connector(CRef("u"), Causality.input, SignalType.Real))
25+
subsystem.addConnection("", "u", "Add2", "u1")
26+
subsystem.addConnection("", "u", "Add2", "u2")
27+
28+
model.addConnection(CRef("default", "Sine", "y"), CRef("default", "sub-system", "u"))
29+
30+
model.list()
31+
print(flush=True)
32+
instantiated = model.instantiate()
33+
instantiated.setResultFile("SimpleSimulation16_res.mat")
34+
instantiated.initialize()
35+
instantiated.simulate()
36+
print(f"default.Sine.y : {instantiated.getValue(CRef('default', 'Sine', 'y'))}", flush=True)
37+
print(f"default.sub-system.u : {instantiated.getValue(CRef('default', 'sub-system', 'u'))}", flush=True)
38+
print(f"default.sub-system.Add2.u1: {instantiated.getValue(CRef('default', 'sub-system', 'Add2', 'u1'))}", flush=True)
39+
print(f"default.sub-system.Add2.u2: {instantiated.getValue(CRef('default', 'sub-system', 'Add2', 'u2'))}", flush=True)
40+
instantiated.terminate()
41+
instantiated.delete()
42+
43+
44+
## Result:
45+
## <class 'OMSimulator.ssp.SSP'>
46+
## |-- Resources:
47+
## |-- resources/Add.fmu
48+
## |-- resources/Sine.fmu
49+
## |-- Active Variant: default
50+
## |-- <class 'OMSimulator.ssd.SSD'>
51+
## |-- Variant "default": None
52+
## |-- |-- System: default 'None'
53+
## |-- |-- |-- Connectors:
54+
## |-- |-- |-- Elements:
55+
## |-- |-- |-- |-- FMU: Add 'None'
56+
## |-- |-- |-- |-- |-- path: resources/Add.fmu
57+
## |-- |-- |-- |-- |-- Connectors:
58+
## |-- |-- |-- |-- |-- |-- (u1, Causality.input, SignalType.Real, None, 'Connector of Real input signal 1')
59+
## |-- |-- |-- |-- |-- |-- (u2, Causality.input, SignalType.Real, None, 'Connector of Real input signal 2')
60+
## |-- |-- |-- |-- |-- |-- (y, Causality.output, SignalType.Real, None, 'Connector of Real output signal')
61+
## |-- |-- |-- |-- |-- |-- (k1, Causality.parameter, SignalType.Real, None, 'Gain of input signal 1')
62+
## |-- |-- |-- |-- |-- |-- (k2, Causality.parameter, SignalType.Real, None, 'Gain of input signal 2')
63+
## |-- |-- |-- |-- FMU: Sine 'None'
64+
## |-- |-- |-- |-- |-- path: resources/Sine.fmu
65+
## |-- |-- |-- |-- |-- Connectors:
66+
## |-- |-- |-- |-- |-- |-- (y, Causality.output, SignalType.Real, None, 'Connector of Real output signal')
67+
## |-- |-- |-- |-- |-- |-- (amplitude, Causality.parameter, SignalType.Real, None, 'Amplitude of sine wave')
68+
## |-- |-- |-- |-- |-- |-- (f, Causality.parameter, SignalType.Real, Hz, 'Frequency of sine wave')
69+
## |-- |-- |-- |-- |-- |-- (offset, Causality.parameter, SignalType.Real, None, 'Offset of output signal y')
70+
## |-- |-- |-- |-- |-- |-- (phase, Causality.parameter, SignalType.Real, rad, 'Phase of sine wave')
71+
## |-- |-- |-- |-- |-- |-- (startTime, Causality.parameter, SignalType.Real, s, 'Output y = offset for time < startTime')
72+
## |-- |-- |-- |-- System: sub-system 'None'
73+
## |-- |-- |-- |-- |-- Connectors:
74+
## |-- |-- |-- |-- |-- |-- (u, Causality.input, SignalType.Real, None, 'None')
75+
## |-- |-- |-- |-- |-- Elements:
76+
## |-- |-- |-- |-- |-- |-- FMU: Add2 'None'
77+
## |-- |-- |-- |-- |-- |-- |-- path: resources/Add.fmu
78+
## |-- |-- |-- |-- |-- |-- |-- Connectors:
79+
## |-- |-- |-- |-- |-- |-- |-- |-- (u1, Causality.input, SignalType.Real, None, 'Connector of Real input signal 1')
80+
## |-- |-- |-- |-- |-- |-- |-- |-- (u2, Causality.input, SignalType.Real, None, 'Connector of Real input signal 2')
81+
## |-- |-- |-- |-- |-- |-- |-- |-- (y, Causality.output, SignalType.Real, None, 'Connector of Real output signal')
82+
## |-- |-- |-- |-- |-- |-- |-- |-- (k1, Causality.parameter, SignalType.Real, None, 'Gain of input signal 1')
83+
## |-- |-- |-- |-- |-- |-- |-- |-- (k2, Causality.parameter, SignalType.Real, None, 'Gain of input signal 2')
84+
## |-- |-- |-- |-- |-- Connections:
85+
## |-- |-- |-- |-- |-- |-- .u -> Add2.u1
86+
## |-- |-- |-- |-- |-- |-- .u -> Add2.u2
87+
## |-- |-- |-- Connections:
88+
## |-- |-- |-- |-- Sine.y -> Add.u1
89+
## |-- |-- |-- |-- Sine.y -> Add.u2
90+
## |-- |-- |-- |-- Sine.y -> sub-system.u
91+
## |-- UnitDefinitions:
92+
## |-- |-- Unit: s
93+
## |-- |-- |-- BaseUnit: s: 1
94+
## |-- |-- Unit: rad
95+
## |-- |-- |-- BaseUnit:
96+
## |-- |-- Unit: Hz
97+
## |-- |-- |-- BaseUnit: s: -1
98+
## |-- DefaultExperiment
99+
## |-- |-- startTime: 0.0
100+
## |-- |-- stopTime: 1.0
101+
##
102+
## info: Result file: SimpleSimulation16_res.mat (bufferSize=1)
103+
## default.Sine.y : -2.4492127076447545e-16
104+
## default.sub-system.u : -2.4492127076447545e-16
105+
## default.sub-system.Add2.u1: -2.4492127076447545e-16
106+
## default.sub-system.Add2.u2: -2.4492127076447545e-16
107+
## endResult

0 commit comments

Comments
 (0)