Skip to content

Commit 5272736

Browse files
committed
add mass-spring-damper system
1 parent 4c65c46 commit 5272736

7 files changed

Lines changed: 402 additions & 0 deletions

File tree

examples/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ add_subdirectory(ExternalSharedLib)
77
add_subdirectory(ExternalInterfaceLib)
88
add_subdirectory(Identity)
99
add_subdirectory(Dahlquist)
10+
add_subdirectory(mass_spring_damper)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
2+
set(MODEL_PATH "${CMAKE_BINARY_DIR}/models/spring_mass_damper")
3+
4+
generateFMU("mass"
5+
SOURCES
6+
"mass.cpp"
7+
FMI_VERSIONS
8+
"fmi2;fmi3"
9+
WITH_SOURCES
10+
DESTINATION
11+
"${MODEL_PATH}"
12+
)
13+
14+
generateFMU("spring"
15+
SOURCES
16+
"spring.cpp"
17+
FMI_VERSIONS
18+
"fmi2;fmi3"
19+
WITH_SOURCES
20+
DESTINATION
21+
"${MODEL_PATH}"
22+
)
23+
24+
generateFMU("damper"
25+
SOURCES
26+
"damper.cpp"
27+
FMI_VERSIONS
28+
"fmi2;fmi3"
29+
WITH_SOURCES
30+
DESTINATION
31+
"${MODEL_PATH}"
32+
)
33+
34+
configure_file(
35+
"${CMAKE_CURRENT_SOURCE_DIR}/SystemStructure.ssd.in"
36+
"${MODEL_PATH}/SystemStructure.ssd"
37+
@ONLY
38+
)
39+
40+
file(COPY "ChartConfig.xml" DESTINATION "${MODEL_PATH}")
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ecos:ChartConfig xmlns:ecos="http://github.com/Ecos-platform/libecos/resources/schema/ChartConfig">
3+
4+
<ecos:chart>
5+
<ecos:timeseries title="Spring-Mass-Damper System" label="Position [m]">
6+
7+
<ecos:series>
8+
9+
<!-- Mass position -->
10+
<ecos:component name="mass">
11+
<ecos:variable name="position"/>
12+
</ecos:component>
13+
14+
</ecos:series>
15+
16+
</ecos:timeseries>
17+
</ecos:chart>
18+
19+
</ecos:ChartConfig>
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ssd:SystemStructureDescription name="SpringMassDamperSystem" version="1.0"
3+
xmlns:ssd="http://ssp-standard.org/SSP1/SystemStructureDescription"
4+
xmlns:ssc="http://ssp-standard.org/SSP1/SystemStructureCommon"
5+
xmlns:osp="http://opensimulationplatform.com/SSP/OSPAnnotations">
6+
7+
<ssd:System name="root">
8+
9+
<!-- Mass FMU -->
10+
<ssd:Elements>
11+
<ssd:Component
12+
name="mass"
13+
source="@MODEL_PATH@/fmi3/mass.fmu">
14+
<ssd:Connectors>
15+
<ssd:Connector name="position" kind="output">
16+
<ssc:Real/>
17+
</ssd:Connector>
18+
<ssd:Connector name="velocity" kind="output">
19+
<ssc:Real/>
20+
</ssd:Connector>
21+
<ssd:Connector name="force_spring" kind="input">
22+
<ssc:Real/>
23+
</ssd:Connector>
24+
<ssd:Connector name="force_damper" kind="input">
25+
<ssc:Real/>
26+
</ssd:Connector>
27+
<ssd:Connector name="force_external" kind="input">
28+
<ssc:Real/>
29+
</ssd:Connector>
30+
</ssd:Connectors>
31+
<ssd:ParameterBindings>
32+
<ssd:ParameterBinding>
33+
<ssd:ParameterValues>
34+
<ssv:ParameterSet version="1.0" name="initial_values">
35+
<ssv:Parameters>
36+
<ssv:Parameter name="position">
37+
<ssv:Real value="1.0"/>
38+
</ssv:Parameter>
39+
<ssv:Parameter name="mass">
40+
<ssv:Real value="1.0"/>
41+
</ssv:Parameter>
42+
</ssv:Parameters>
43+
</ssv:ParameterSet>
44+
</ssd:ParameterValues>
45+
</ssd:ParameterBinding>
46+
</ssd:ParameterBindings>
47+
</ssd:Component>
48+
49+
<!-- Spring FMU -->
50+
<ssd:Component
51+
name="spring"
52+
source="@MODEL_PATH@/fmi3/spring.fmu">
53+
<ssd:Connectors>
54+
<ssd:Connector name="position" kind="input">
55+
<ssc:Real/>
56+
</ssd:Connector>
57+
<ssd:Connector name="force" kind="output">
58+
<ssc:Real/>
59+
</ssd:Connector>
60+
</ssd:Connectors>
61+
<ssd:ParameterBindings>
62+
<ssd:ParameterBinding>
63+
<ssd:ParameterValues>
64+
<ssv:ParameterSet version="1.0" name="initial_values">
65+
<ssv:Parameters>
66+
<ssv:Parameter name="stiffness">
67+
<ssv:Real value="10"/>
68+
</ssv:Parameter>
69+
</ssv:Parameters>
70+
</ssv:ParameterSet>
71+
</ssd:ParameterValues>
72+
</ssd:ParameterBinding>
73+
</ssd:ParameterBindings>
74+
</ssd:Component>
75+
76+
<!-- Damper FMU -->
77+
<ssd:Component
78+
name="damper"
79+
source="@MODEL_PATH@/fmi3/damper.fmu">
80+
<ssd:Connectors>
81+
<ssd:Connector name="velocity" kind="input">
82+
<ssc:Real/>
83+
</ssd:Connector>
84+
<ssd:Connector name="force" kind="output">
85+
<ssc:Real/>
86+
</ssd:Connector>
87+
</ssd:Connectors>
88+
<ssd:ParameterBindings>
89+
<ssd:ParameterBinding>
90+
<ssd:ParameterValues>
91+
<ssv:ParameterSet version="1.0" name="initial_values">
92+
<ssv:Parameters>
93+
<ssv:Parameter name="damping">
94+
<ssv:Real value="1.0"/>
95+
</ssv:Parameter>
96+
</ssv:Parameters>
97+
</ssv:ParameterSet>
98+
</ssd:ParameterValues>
99+
</ssd:ParameterBinding>
100+
</ssd:ParameterBindings>
101+
</ssd:Component>
102+
103+
</ssd:Elements>
104+
105+
106+
<!-- Connections -->
107+
<ssd:Connections>
108+
109+
<!-- Mass → Spring -->
110+
<ssd:Connection
111+
startElement="mass"
112+
startConnector="position"
113+
endElement="spring"
114+
endConnector="position"/>
115+
116+
<!-- Mass → Damper -->
117+
<ssd:Connection
118+
startElement="mass"
119+
startConnector="velocity"
120+
endElement="damper"
121+
endConnector="velocity"/>
122+
123+
<!-- Spring → Mass -->
124+
<ssd:Connection
125+
startElement="spring"
126+
startConnector="force"
127+
endElement="mass"
128+
endConnector="force_spring"/>
129+
130+
<!-- Damper → Mass -->
131+
<ssd:Connection
132+
startElement="damper"
133+
startConnector="force"
134+
endElement="mass"
135+
endConnector="force_damper"/>
136+
137+
</ssd:Connections>
138+
139+
</ssd:System>
140+
141+
<ssd:DefaultExperiment startTime="0">
142+
<ssd:Annotations>
143+
<ssc:Annotation type="com.opensimulationplatform">
144+
<osp:Algorithm>
145+
<osp:FixedStepAlgorithm baseStepSize="1e-4"/>
146+
</osp:Algorithm>
147+
</ssc:Annotation>
148+
</ssd:Annotations>
149+
</ssd:DefaultExperiment>
150+
151+
</ssd:SystemStructureDescription>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
2+
#include <fmu4cpp/fmu_base.hpp>
3+
4+
using namespace fmu4cpp;
5+
6+
class Damper : public fmu_base {
7+
8+
public:
9+
FMU4CPP_CTOR(Damper) {
10+
11+
register_real("velocity", &state_.v_)
12+
.setCausality(causality_t::INPUT)
13+
.setVariability(variability_t::CONTINUOUS)
14+
.setDescription("Mass velocity");
15+
16+
register_real("damping", &state_.c_)
17+
.setCausality(causality_t::PARAMETER)
18+
.setVariability(variability_t::FIXED)
19+
.setDescription("Damping coefficient");
20+
21+
register_real("force", &state_.F_)
22+
.setCausality(causality_t::OUTPUT)
23+
.setVariability(variability_t::CONTINUOUS)
24+
.setDescription("Damper force");
25+
26+
register_state(&Damper::state_);
27+
}
28+
29+
bool do_step(double) override {
30+
state_.F_ = -state_.c_ * state_.v_;
31+
return true;
32+
}
33+
34+
private:
35+
struct State {
36+
double v_ = 0.0;
37+
double c_ = 1.0;
38+
double F_ = 0.0;
39+
};
40+
41+
State state_;
42+
};
43+
44+
model_info fmu4cpp::get_model_info() {
45+
model_info info;
46+
info.modelName = "Damper";
47+
info.description = "A damper model";
48+
info.canGetAndSetFMUstate = true;
49+
info.canSerializeFMUstate = true;
50+
return info;
51+
}
52+
53+
FMU4CPP_INSTANTIATE(Damper);
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
2+
#include <fmu4cpp/fmu_base.hpp>
3+
4+
using namespace fmu4cpp;
5+
6+
class Mass : public fmu_base {
7+
8+
public:
9+
FMU4CPP_CTOR(Mass) {
10+
11+
register_real("position", &state_.x_)
12+
.setCausality(causality_t::OUTPUT)
13+
.setVariability(variability_t::CONTINUOUS)
14+
.setInitial(initial_t::EXACT)
15+
.setDescription("Mass position");
16+
17+
register_real("velocity", &state_.v_)
18+
.setCausality(causality_t::OUTPUT)
19+
.setVariability(variability_t::CONTINUOUS)
20+
.setDescription("Mass velocity");
21+
22+
register_real("mass", &state_.m_)
23+
.setCausality(causality_t::PARAMETER)
24+
.setVariability(variability_t::FIXED)
25+
.setDescription("Mass value");
26+
27+
register_real("force_spring", &state_.F_spring_)
28+
.setCausality(causality_t::INPUT)
29+
.setVariability(variability_t::CONTINUOUS)
30+
.setDescription("Force from spring");
31+
32+
register_real("force_damper", &state_.F_damper_)
33+
.setCausality(causality_t::INPUT)
34+
.setVariability(variability_t::CONTINUOUS)
35+
.setDescription("Force from damper");
36+
37+
register_real("force_external", &state_.F_external_)
38+
.setCausality(causality_t::INPUT)
39+
.setVariability(variability_t::CONTINUOUS)
40+
.setDescription("External applied force");
41+
42+
register_state(&Mass::state_);
43+
}
44+
45+
bool do_step(double dt) override {
46+
47+
double F = state_.F_spring_ + state_.F_damper_ + state_.F_external_;
48+
double a = F / state_.m_;
49+
50+
state_.v_ += a * dt;
51+
state_.x_ += state_.v_ * dt;
52+
53+
return true;
54+
}
55+
56+
private:
57+
struct State {
58+
double x_ = 0.5;
59+
double v_ = 0.0;
60+
double m_ = 1.0;
61+
62+
double F_spring_ = 0.0;
63+
double F_damper_ = 0.0;
64+
double F_external_ = 0.0;
65+
};
66+
67+
State state_;
68+
};
69+
70+
model_info fmu4cpp::get_model_info() {
71+
model_info info;
72+
info.modelName = "Mass";
73+
info.description = "A mass model";
74+
info.canGetAndSetFMUstate = true;
75+
info.canSerializeFMUstate = true;
76+
return info;
77+
}
78+
79+
FMU4CPP_INSTANTIATE(Mass);

0 commit comments

Comments
 (0)