Skip to content

Commit 700c781

Browse files
ven-kChrisRackauckas
authored andcommitted
refactor&test: Mechanical/TranslationalModelica with @mtkmodel
- And enable its tests.
1 parent ad2b3a5 commit 700c781

File tree

5 files changed

+131
-134
lines changed

5 files changed

+131
-134
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
Fixed(;name, s0=0.0)
2+
Fixed(; name, s0 = 0.0)
33
44
Flange fixed in housing at a given position.
55
@@ -11,52 +11,57 @@ Flange fixed in housing at a given position.
1111
1212
- `flange: 1-dim. translational flange`
1313
"""
14-
function Fixed(; name, s0 = 0.0)
15-
pars = @parameters s0 = s0
16-
vars = []
17-
18-
@named flange = Flange()
19-
20-
eqs = [flange.s ~ s0]
21-
22-
return compose(ODESystem(eqs, t, vars, pars; name = name, defaults = [flange.s => s0]),
23-
flange)
14+
@mtkmodel Fixed begin
15+
@parameters begin
16+
s0
17+
end
18+
19+
@components begin
20+
flange = Flange(; s = 0.0)
21+
end
22+
23+
@equations begin
24+
flange.s ~ s0
25+
end
2426
end
2527

2628
"""
27-
Mass(; name, m, s0 = 0.0, v0 = 0.0)
29+
Mass(; name, m, s, v = 0.0)
2830
2931
Sliding mass with inertia
3032
3133
# Parameters:
3234
3335
- `m`: [kg] Mass of sliding mass
34-
- `s0`: [m] Initial value of absolute position of sliding mass
35-
- `v0`: [m/s] Initial value of absolute linear velocity of sliding mass
3636
3737
# States:
3838
39-
- `s`: [m] Absolute position of sliding mass
40-
- `v`: [m/s] Absolute linear velocity of sliding mass (= D(s))
39+
- `s`: [m] Absolute position of sliding mass. It accepts intial value and defaults to 0.0.
40+
- `v`: [m/s] Absolute linear velocity of sliding mass (= D(s)). It accepts intial value and defaults to 0.0.
4141
4242
# Connectors:
4343
4444
- `flange: 1-dim. translational flange of mass`
4545
"""
46-
function Mass(m; name, s0 = 0.0, v0 = 0.0)
47-
@named pr = PartialRigid(; L = 0, s0)
48-
@unpack flange_a, flange_b, s = pr
49-
@parameters m=m [description = "Mass of sliding mass [kg]"]
50-
@variables v(t)=v0 [description = "Absolute linear velocity of sliding mass [m/s]"]
51-
@variables a(t)=0 [description = "Absolute linear acceleration of sliding mass [m/s^2]"]
52-
eqs = [v ~ D(s)
46+
@mtkmodel Mass begin
47+
@parameters begin
48+
m = 0.0, [description = "Mass of sliding mass [kg]"]
49+
end
50+
@variables begin
51+
s
52+
v(t) = 0.0, [description = "Absolute linear velocity of sliding mass [m/s]"]
53+
a(t) = 0.0, [description = "Absolute linear acceleration of sliding mass [m/s^2]"]
54+
end
55+
@extend flange_a, flange_b, s = pr = PartialRigid(; L = 0.0, s = s)
56+
@equations begin
57+
v ~ D(s)
5358
a ~ D(v)
54-
m * a ~ flange_a.f + flange_b.f]
55-
return extend(ODESystem(eqs, t; name), pr)
59+
m * a ~ flange_a.f + flange_b.f
60+
end
5661
end
5762

5863
"""
59-
Spring(c; name, s_rel0=0)
64+
Spring(; c= 0.0, name, s_rel0 = 0)
6065
6166
Linear 1D translational spring
6267
@@ -70,18 +75,20 @@ Linear 1D translational spring
7075
- `flange_a: 1-dim. translational flange on one side of spring`
7176
- `flange_b: 1-dim. translational flange on opposite side of spring` #default function
7277
"""
73-
function Spring(c; name, s_rel0 = 0)
74-
@named pc = PartialCompliant()
75-
@unpack flange_a, flange_b, s_rel, f = pc
76-
@parameters c=c [description = "Spring constant [N/m]"]
77-
@parameters s_rel0=s_rel0 [description = "Unstretched spring length [m]"]
78-
79-
eqs = [f ~ c * (s_rel - s_rel0)]
80-
return extend(ODESystem(eqs, t; name), pc)
78+
@mtkmodel Spring begin
79+
@extend flange_a, flange_b, s_rel, f = pc = PartialCompliant()
80+
@parameters begin
81+
c = 0.0, [description = "Spring constant [N/m]"]
82+
s_rel0 = 0.0, [description = "Unstretched spring length [m]"]
83+
end
84+
85+
@equations begin
86+
f ~ c * (s_rel - s_rel0)
87+
end
8188
end
8289

8390
"""
84-
Damper(d; name)
91+
Damper(; name, d = 0.0)
8592
8693
Linear 1D translational damper
8794
@@ -94,11 +101,16 @@ Linear 1D translational damper
94101
- `flange_a: 1-dim. translational flange on one side of damper`
95102
- `flange_b: 1-dim. translational flange on opposite side of damper`
96103
"""
97-
function Damper(d; name)
98-
@named pc = PartialCompliantWithRelativeStates()
99-
@unpack flange_a, flange_b, v_rel, f = pc
100-
@parameters d=d [description = "Damping constant [Ns/m]"]
101-
@variables lossPower(t)=0 [description = "Power dissipated by the damper [W]"]
102-
eqs = [f ~ d * v_rel; lossPower ~ f * v_rel]
103-
return extend(ODESystem(eqs, t; name), pc)
104+
@mtkmodel Damper begin
105+
@extend flange_a, flange_b, v_rel, f = pc = PartialCompliantWithRelativeStates()
106+
@parameters begin
107+
d = 0.0, [description = "Damping constant [Ns/m]"]
108+
end
109+
@variables begin
110+
lossPower(t) = 0.0, [description = "Power dissipated by the damper [W]"]
111+
end
112+
@equations begin
113+
f ~ d * v_rel
114+
lossPower ~ f * v_rel
115+
end
104116
end
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
"""
2-
Force(;name)
2+
Force(;name)
33
44
Input signal acting as external force on a flange
55
"""
6-
function Force(; name, use_support = false)
7-
@named partial_element = PartialElementaryOneFlangeAndSupport2(use_support = use_support)
8-
@unpack flange = partial_element
9-
@named f = RealInput() # Accelerating force acting at flange (= -flange.tau)
10-
eqs = [flange.f ~ -f.u]
11-
return extend(ODESystem(eqs, t, [], []; name = name, systems = [f]), partial_element)
6+
@mtkmodel Force begin
7+
@parameters begin
8+
use_support
9+
end
10+
@extend (flange,) = partial_element = PartialElementaryOneFlangeAndSupport2(use_support = use_support)
11+
@components begin
12+
f = RealInput() # Accelerating force acting at flange (= -flange.tau)
13+
end
14+
@equations begin
15+
flange.f ~ -f.u
16+
end
1217
end
+54-69
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
@connector function Flange(; name)
2-
vars = @variables begin
3-
s(t)
4-
f(t), [connect = Flow]
5-
end
6-
ODESystem(Equation[], t, vars, [], name = name, defaults = Dict(f => 0.0))
1+
@connector Flange begin
2+
s(t)
3+
f(t), [connect = Flow]
74
end
85
Base.@doc """
96
Flange(;name)
@@ -15,9 +12,9 @@ Base.@doc """
1512
- `f`: [N] Cut force into the flange
1613
""" Flange
1714

18-
@connector function Support(; name)
19-
@named flange = Flange()
20-
extend(ODESystem(Equation[], t, name = name), flange)
15+
@connector Support begin
16+
s(t)
17+
f(t), [connect = Flow]
2118
end
2219
Base.@doc """
2320
Support(;name)
@@ -29,78 +26,66 @@ Support/housing 1-dim. translational flange.
2926
- `f`: [N] Cut force into the flange
3027
""" Support
3128

32-
function PartialTwoFlanges(; name)
33-
@named flange_a = Flange() # (left) driving flange (flange axis directed into cut plane, e. g. from left to right)
34-
@named flange_b = Flange() # (right) driven flange (flange axis directed out of cut plane)
35-
compose(ODESystem([], t; name), flange_a, flange_b)
29+
@mtkmodel PartialTwoFlanges begin
30+
@components begin
31+
flange_a = Flange() # (left) driving flange (flange axis directed into cut plane, e. g. from left to right)
32+
flange_b = Flange() # (right) driven flange (flange axis directed out of cut plane)
33+
end
3634
end
3735

3836
"""
39-
PartialCompliant(;name, s_rel_start=0.0, f_start=0.0)
37+
PartialCompliant(; name, s_rel = 0.0, f = 0.0)
4038
4139
Partial model for the compliant connection of two translational 1-dim. flanges.
4240
43-
# Parameters:
44-
45-
- `s_rel_start`: [m] Initial relative distance between the flanges
46-
- `f_start`: [N] Initial force between flanges
47-
4841
# States:
4942
50-
- `s_rel`: [m] Relative distance (= flange_b.s - flange_a.s)
51-
- `f`: [N] Force between flanges (= flange_b.f)
43+
- `s_rel`: [m] Relative distance (= flange_b.s - flange_a.s). It accepts intial value and defaults to 0.0.
44+
- `f`: [N] Force between flanges (= flange_b.f). It accepts intial value and defaults to 0.0.
5245
"""
53-
function PartialCompliant(; name, s_rel_start = 0.0, f_start = 0.0)
54-
@named pt = PartialTwoFlanges()
55-
@unpack flange_a, flange_b = pt
56-
@variables s_rel(t)=s_rel_start [
57-
description = "Relative distance between flanges flange_b.s - flange_a.s",
58-
]
59-
@variables f(t)=f_start [
60-
description = "Force between flanges (positive in direction of flange axis R)",
61-
]
46+
@mtkmodel PartialCompliant begin
47+
@extend (flange_a, flange_b) = pt = PartialTwoFlanges()
48+
@variables begin
49+
s_rel(t) = 0.0, [description = "Relative distance between flanges flange_b.s - flange_a.s"]
50+
f(t) = 0.0, [description = "Force between flanges (positive in direction of flange axis R)"]
51+
end
6252

63-
eqs = [s_rel ~ flange_b.s - flange_a.s
53+
@equations begin
54+
s_rel ~ flange_b.s - flange_a.s
6455
flange_b.f ~ +f
65-
flange_a.f ~ -f]
66-
return extend(ODESystem(eqs, t; name = name), pt)
56+
flange_a.f ~ -f
57+
end
6758
end
6859

6960
"""
70-
PartialCompliantWithRelativeStates(;name, s_rel_start=0.0, v_rel_start=0.0, f_start=0.0)
61+
PartialCompliantWithRelativeStates(;name, s_rel = 0.0, v_rel = 0.0, f = 0.0)
7162
7263
Partial model for the compliant connection of two translational 1-dim. flanges.
7364
74-
# Parameters:
75-
76-
- `s_rel_start`: [m] Initial relative distance
77-
- `v_rel_start`: [m/s] Initial relative linear velocity (= der(s_rel))
78-
79-
# States:
65+
# States:
8066
81-
- `s_rel`: [m] Relative distance (= flange_b.phi - flange_a.phi)
82-
- `v_rel`: [m/s] Relative linear velocity (= der(s_rel))
83-
- `f`: [N] Force between flanges (= flange_b.f)
67+
- `s_rel`: [m] Relative distance (= flange_b.phi - flange_a.phi). It accepts intial value and defaults to 0.0.
68+
- `v_rel`: [m/s] Relative linear velocity (= der(s_rel)). It accepts intial value and defaults to 0.0.
69+
- `f`: [N] Force between flanges (= flange_b.f). It accepts intial value and defaults to 0.0.
8470
"""
85-
function PartialCompliantWithRelativeStates(; name, s_rel_start = 0, v_rel_start = 0,
86-
f_start = 0)
87-
@named pt = PartialTwoFlanges()
88-
@unpack flange_a, flange_b = pt
89-
@variables s_rel(t)=s_rel_start [
90-
description = "Relative distance between flanges flange_b.s - flange_a.s",
91-
]
92-
@variables v_rel(t)=v_rel_start [description = "Relative linear velocity (= D(s_rel))"]
93-
@variables f(t)=f_start [description = "Forces between flanges (= flange_b.f)"]
71+
@mtkmodel PartialCompliantWithRelativeStates begin
72+
@extend flange_a, flange_b = pt = PartialTwoFlanges()
73+
@variables begin
74+
s_rel(t) = 0.0, [description = "Relative distance between flanges flange_b.s - flange_a.s"]
75+
v_rel(t) = 0.0, [description = "Relative linear velocity (= D(s_rel))"]
76+
f(t) = 0.0, [description = "Forces between flanges (= flange_b.f)"]
77+
end
9478

95-
eqs = [s_rel ~ flange_b.s - flange_a.s
79+
@equations begin
80+
s_rel ~ flange_b.s - flange_a.s
9681
v_rel ~ D(s_rel)
9782
flange_b.f ~ f
98-
flange_a.f ~ -f]
99-
return extend(ODESystem(eqs, t; name = name), pt)
83+
flange_a.f ~ -f
84+
end
10085
end
10186

10287
"""
103-
PartialElementaryOneFlangeAndSupport2(;name, use_support=false)
88+
PartialElementaryOneFlangeAndSupport2(; name, use_support = false)
10489
10590
Partial model for a component with one translational 1-dim. shaft flange and a support used for textual modeling, i.e., for elementary models
10691
@@ -130,7 +115,7 @@ function PartialElementaryOneFlangeAndSupport2(; name, use_support = false)
130115
end
131116

132117
"""
133-
PartialElementaryTwoFlangesAndSupport2(;name, use_support=false)
118+
PartialElementaryTwoFlangesAndSupport2(; name, use_support = false)
134119
135120
Partial model for a component with two translational 1-dim. flanges and a support used for textual modeling, i.e., for elementary models
136121
@@ -161,16 +146,16 @@ function PartialElementaryTwoFlangesAndSupport2(; name, use_support = false)
161146
end
162147
end
163148

164-
function PartialRigid(; name, L = 0, s0 = 0)
165-
@named ptf = PartialTwoFlanges()
166-
@unpack flange_a, flange_b = ptf
167-
@variables s(t)=s0 [
168-
description = "Absolute position of center of component (s = flange_a.s + L/2 = flange_b.s - L/2)",
169-
]
170-
@parameters L=L [
171-
description = "Length of component, from left flange to right flange (= flange_b.s - flange_a.s)",
172-
]
173-
eqs = [flange_a.s ~ s - L / 2
174-
flange_b.s ~ s + L / 2]
175-
return extend(ODESystem(eqs, t; name = name), ptf)
149+
@mtkmodel PartialRigid begin
150+
@extend flange_a, flange_b = ptf = PartialTwoFlanges()
151+
@variables begin
152+
s(t) = 0.0, [description = "Absolute position of center of component (s = flange_a.s + L/2 = flange_b.s - L/2)"]
153+
end
154+
@parameters begin
155+
L = 0.0, [description = "Length of component, from left flange to right flange (= flange_b.s - flange_a.s)"]
156+
end
157+
@equations begin
158+
flange_a.s ~ s - L / 2
159+
flange_b.s ~ s + L / 2
160+
end
176161
end

test/Mechanical/translational_modelica.jl

+8-16
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,9 @@ import ModelingToolkitStandardLibrary.Mechanical.TranslationalModelica as TP
77
D = Differential(t)
88

99
@testset "spring damper mass fixed" begin
10-
@named damper = TP.Damper(1)
11-
12-
@named spring = TP.Spring(1; s_rel0 = 1)
13-
14-
@named mass = TP.Mass(1, v0 = 1)
15-
10+
@named damper = TP.Damper(; d = 1)
11+
@named spring = TP.Spring(; c = 1, s_rel0 = 1)
12+
@named mass = TP.Mass(; m = 1, v = 1)
1613
@named fixed = TP.Fixed(s0 = 1)
1714

1815
eqs = [connect(spring.flange_a, mass.flange_a, damper.flange_a)
@@ -32,16 +29,11 @@ D = Differential(t)
3229
end
3330

3431
@testset "driven spring damper mass" begin
35-
@named damper = TP.Damper(1)
36-
37-
@named spring = TP.Spring(1; s_rel0 = 1)
38-
39-
@named mass = TP.Mass(1, v0 = 1)
40-
41-
@named fixed = TP.Fixed(s0 = 1)
42-
43-
@named force = TP.Force()
44-
32+
@named damper = TP.Damper(; d = 1)
33+
@named spring = TP.Spring(; c = 1, s_rel0 = 1)
34+
@named mass = TP.Mass(; m = 1, v = 1)
35+
@named fixed = TP.Fixed(; s0 = 1)
36+
@named force = TP.Force(use_support = false)
4537
@named source = Sine(frequency = 3, amplitude = 2)
4638

4739
eqs = [connect(force.f, source.output)

test/runtests.jl

+3
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ end
5151
@safetestset "Mechanical Translation" begin
5252
include("Mechanical/translational.jl")
5353
end
54+
@safetestset "Mechanical Translation" begin
55+
include("Mechanical/translational_modelica.jl")
56+
end
5457
@safetestset "Multi-Domain" begin
5558
include("multi_domain.jl")
5659
end

0 commit comments

Comments
 (0)