Skip to content

Commit ad2b3a5

Browse files
ven-kChrisRackauckas
authored andcommitted
refactor: Mechanical/translational.jl
1 parent 99826ab commit ad2b3a5

File tree

6 files changed

+108
-124
lines changed

6 files changed

+108
-124
lines changed

src/Mechanical/Translational/Translational.jl

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Library to model 1-dimensional, translational mechanical systems
44
module Translational
55

66
using ModelingToolkit, Symbolics
7+
using ModelingToolkit: getdefault
78

89
using ModelingToolkitStandardLibrary.Blocks: RealInput, RealOutput
910
using IfElse: ifelse

src/Mechanical/Translational/components.jl

+34-34
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,34 @@ Use to close a system that has un-connected `MechanicalPort`'s where the force s
77
88
- `flange`: 1-dim. translational flange
99
"""
10-
@component function Free(; name)
11-
@named flange = MechanicalPort()
12-
vars = @variables f(t) = 0
13-
eqs = [
14-
flange.f ~ f,
15-
]
16-
return compose(ODESystem(eqs, t, vars, []; name, defaults = [flange.v => 0]),
17-
flange)
10+
@mtkmodel Free begin
11+
@components begin
12+
flange = MechanicalPort()
13+
end
14+
@variables begin
15+
f(t) = 0.0
16+
end
17+
@equations begin
18+
flange.f ~ f
19+
end
1820
end
1921

2022
"""
21-
Fixed(;name)
23+
Fixed(; name)
2224
2325
Fixes a flange position (velocity = 0)
2426
2527
# Connectors:
2628
2729
- `flange`: 1-dim. translational flange
2830
"""
29-
@component function Fixed(; name)
30-
@named flange = MechanicalPort()
31-
eqs = [flange.v ~ 0]
32-
return compose(ODESystem(eqs, t, [], []; name = name, defaults = [flange.v => 0]),
33-
flange)
31+
@mtkmodel Fixed begin
32+
@components begin
33+
flange = MechanicalPort()
34+
end
35+
@equations begin
36+
flange.v ~ 0
37+
end
3438
end
3539

3640
"""
@@ -175,41 +179,37 @@ const ABS = Val(:absolute)
175179
end
176180

177181
"""
178-
Damper(; name, d, v_a_0=0.0, v_b_0=0.0)
182+
Damper(; name, d, flange_a.v = 0.0, flange_b.v = 0.0)
179183
180184
Linear 1D translational damper
181185
182186
# Parameters:
183187
184188
- `d`: [N.s/m] Damping constant
185-
- `v_a_0`: [m/s] Initial value of absolute linear velocity at flange_a (default 0 m/s)
186-
- `v_b_0`: [m/s] Initial value of absolute linear velocity at flange_b (default 0 m/s)
187189
188190
# Connectors:
189191
190-
- `flange_a`: 1-dim. translational flange on one side of damper
191-
- `flange_b`: 1-dim. translational flange on opposite side of damper
192+
- `flange_a`: 1-dim. translational flange on one side of damper. Initial value of state `v` is set to 0.0 m/s.
193+
- `flange_b`: 1-dim. translational flange on opposite side of damper. Initial value of state `v` is set to 0.0 m/s.
192194
"""
193-
@component function Damper(; name, d, v_a_0 = 0.0, v_b_0 = 0.0)
194-
pars = @parameters begin
195-
d = d
196-
v_a_0 = v_a_0
197-
v_b_0 = v_b_0
195+
@mtkmodel Damper begin
196+
@parameters begin
197+
d
198198
end
199-
vars = @variables begin
200-
v(t) = v_a_0 - v_b_0
199+
@variables begin
200+
v(t)
201201
f(t) = 0.0
202202
end
203203

204-
@named flange_a = MechanicalPort()
205-
@named flange_b = MechanicalPort()
204+
@components begin
205+
flange_a = MechanicalPort(; v = 0.0)
206+
flange_b = MechanicalPort(; v = 0.0)
207+
end
206208

207-
eqs = [v ~ flange_a.v - flange_b.v
209+
@equations begin
210+
v ~ flange_a.v - flange_b.v
208211
f ~ v * d
209212
flange_a.f ~ +f
210-
flange_b.f ~ -f]
211-
return compose(ODESystem(eqs, t, vars, pars; name = name,
212-
defaults = [flange_a.v => v_a_0, flange_b.v => v_b_0]),
213-
flange_a,
214-
flange_b) #flange_a.f => +(v_a_0 - v_b_0)*d, flange_b.f => -(v_a_0 - v_b_0)*d
213+
flange_b.f ~ -f
214+
end
215215
end

src/Mechanical/Translational/sensors.jl

+17-19
Original file line numberDiff line numberDiff line change
@@ -8,47 +8,45 @@ Linear 1D force input sensor.
88
- `flange`: 1-dim. translational flange
99
- `output`: real output
1010
"""
11-
@component function ForceSensor(; name)
12-
systems = @named begin
11+
@mtkmodel ForceSensor begin
12+
@components begin
1313
flange = MechanicalPort()
1414
output = RealOutput()
1515
end
1616

17-
vars = pars = []
18-
eqs = [
19-
flange.f ~ -output.u,
20-
]
21-
22-
ODESystem(eqs, t, vars, pars; name, systems)
17+
@equations begin
18+
flange.f ~ -output.u
19+
end
2320
end
2421

2522
"""
26-
PositionSensor(; s_0 = 0, name)
23+
PositionSensor(; s = 0, name)
2724
2825
Linear 1D position input sensor.
2926
30-
# Parameters:
27+
# States:
3128
32-
- `s_0`: [m] initial value of absolute position
29+
- `s`: [m] absolute position (with initial value of 0.0)
3330
3431
# Connectors:
3532
3633
- `flange`: 1-dim. translational flange
3734
- `output`: real output
3835
"""
39-
@component function PositionSensor(; s_0 = 0, name)
40-
systems = @named begin
36+
@mtkmodel PositionSensor begin
37+
@components begin
4138
flange = MechanicalPort()
4239
output = RealOutput()
4340
end
4441

45-
pars = @parameters s_0 = s_0
46-
vars = @variables s(t) = s_0
42+
@variables begin
43+
s(t) = 0.0
44+
end
4745

48-
eqs = [D(s) ~ flange.v
46+
@equations begin
47+
D(s) ~ flange.v
4948
output.u ~ s
50-
flange.f ~ 0]
49+
flange.f ~ 0.0
50+
end
5151

52-
ODESystem(eqs, t, vars, pars; name, systems,
53-
defaults = [flange.v => 0, output.u => s_0])
5452
end

src/Mechanical/Translational/sources.jl

+47-55
Original file line numberDiff line numberDiff line change
@@ -6,84 +6,76 @@ Linear 1D force input source
66
# Connectors:
77
88
- `flange`: 1-dim. translational flange
9-
- `f`: real input
9+
- `f`: real input
1010
"""
11-
@component function Force(; name)
12-
systems = @named begin
13-
flange = MechanicalPort()
11+
@mtkmodel Force begin
12+
@components begin
13+
flange = MechanicalPort(; v = 0.0)
1414
f = RealInput()
1515
end
1616

17-
vars = pars = []
18-
eqs = [
19-
flange.f ~ -f.u,
20-
]
21-
22-
ODESystem(eqs, t, vars, pars; name, systems, defaults = [flange.v => 0])
17+
@equations begin
18+
flange.f ~ -f.u
19+
end
2320
end
2421

2522
"""
26-
Position(; s_0 = 0, name)
23+
Position(; s.u_start = 0.0, name)
2724
2825
Linear 1D position input source
2926
30-
# Parameters:
31-
32-
- `s_0`: [m] initial value of absolute position
33-
3427
# Connectors:
3528
3629
- `flange`: 1-dim. translational flange
37-
- `s`: real input
30+
- `s`: real input. `s.u_start` accepts initial value and defaults to 0.0.
3831
"""
39-
@component function Position(solves_force = true; s_0 = 0, name)
40-
systems = @named begin
41-
flange = MechanicalPort()
42-
s = RealInput()
32+
@mtkmodel Position begin
33+
@parameters begin
34+
solves_force = false
35+
end
36+
@components begin
37+
flange = MechanicalPort(; v = 0.0)
38+
s = RealInput(; u_start = 0.0)
39+
end
40+
@variables begin
41+
x(t)
42+
end
43+
@equations begin
44+
D(x) ~ flange.v
45+
s.u ~ x
46+
!getdefault(solves_force) && 0 ~ flange.f
4347
end
44-
45-
pars = @parameters s_0 = s_0
46-
vars = @variables x(t) = s_0
47-
48-
eqs = [D(x) ~ flange.v
49-
s.u ~ x]
50-
51-
!solves_force && push!(eqs, 0 ~ flange.f)
52-
53-
ODESystem(eqs, t, vars, pars; name, systems, defaults = [flange.v => 0, s.u => s_0])
5448
end
5549

56-
@component function Velocity(solves_force = true; name)
57-
systems = @named begin
50+
@mtkmodel Velocity begin
51+
@parameters begin
52+
solves_force = false
53+
end
54+
@components begin
5855
flange = MechanicalPort()
5956
v = RealInput()
6057
end
61-
62-
pars = []
63-
vars = []
64-
65-
eqs = [
66-
v.u ~ flange.v,
67-
]
68-
69-
!solves_force && push!(eqs, 0 ~ flange.f)
70-
71-
ODESystem(eqs, t, vars, pars; name, systems, defaults = [flange.v => 0])
58+
@equations begin
59+
v.u ~ flange.v
60+
getdefault(solves_force) && 0 ~ flange.f
61+
end
7262
end
7363

74-
@component function Acceleration(solves_force = true; s_0 = 0, name)
75-
systems = @named begin
76-
flange = MechanicalPort()
64+
@mtkmodel Acceleration begin
65+
@parameters begin
66+
solves_force = false
67+
end
68+
@components begin
69+
flange = MechanicalPort(; v = 0.0)
7770
a = RealInput()
7871
end
72+
@variables begin
73+
v(t) = 0
74+
end
7975

80-
pars = []
81-
vars = @variables v(t) = 0
82-
83-
eqs = [v ~ flange.v
84-
D(v) ~ a.u]
85-
86-
!solves_force && push!(eqs, 0 ~ flange.f)
87-
88-
ODESystem(eqs, t, vars, pars; name, systems, defaults = [flange.v => 0])
76+
@equations begin
77+
v ~ flange.v
78+
D(v) ~ a.u
79+
!getdefault(solves_force) && 0 ~ flange.f
80+
end
8981
end

src/Mechanical/Translational/utils.jl

+3-10
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
1-
@connector function MechanicalPort(; name, f_int = 0, v_int = 0)
2-
pars = @parameters begin
3-
f_int = f_int
4-
v_int = v_int
5-
end
6-
vars = @variables begin
7-
v(t) = v_int
8-
f(t), [connect = Flow]
9-
end
10-
ODESystem(Equation[], t, vars, pars; name, defaults = [f => f_int])
1+
@connector MechanicalPort begin
2+
v(t) = 0.0
3+
f(t) = 0.0, [connect = Flow]
114
end
125
Base.@doc """
136
MechanicalPort(;name)

test/Mechanical/translational.jl

+6-6
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ D = Differential(t)
1010
@testset "Free" begin
1111
function System(; name)
1212
systems = @named begin
13-
acc = TV.Acceleration(false)
14-
a = Constant(k = -10)
13+
acc = TV.Acceleration()
14+
a = Constant(; k = -10)
1515
mass = TV.Mass(; m = 100)
1616
free = TV.Free()
1717
end
@@ -33,7 +33,7 @@ D = Differential(t)
3333
end
3434

3535
@testset "spring damper mass fixed" begin
36-
@named dv = TV.Damper(d = 1, v_a_0 = 1)
36+
@named dv = TV.Damper(d = 1, flange_a.v = 1)
3737
@named dp = TP.Damper(d = 1, v_a_0 = 1, s_a_0 = 3, s_b_0 = 1)
3838

3939
@named sv = TV.Spring(k = 1, v_a_0 = 1, delta_s_0 = 1)
@@ -70,7 +70,7 @@ end
7070
end
7171

7272
@testset "driven spring damper mass" begin
73-
@named dv = TV.Damper(d = 1, v_a_0 = 1)
73+
@named dv = TV.Damper(d = 1, flange_a.v = 1)
7474
@named dp = TP.Damper(d = 1, v_a_0 = 1, s_a_0 = 3, s_b_0 = 1)
7575

7676
@named sv = TV.Spring(k = 1, v_a_0 = 1, delta_s_0 = 1)
@@ -119,8 +119,8 @@ end
119119
@testset "sources & sensors" begin
120120
function System(; name)
121121
systems = @named begin
122-
pos = TV.Position(; s_0 = 0)
123-
pos_sensor = TV.PositionSensor(; s_0 = 1)
122+
pos = TV.Position(; s.u_start = 0)
123+
pos_sensor = TV.PositionSensor(; s = 1)
124124
force = TV.Force()
125125
force_sensor = TV.ForceSensor()
126126

0 commit comments

Comments
 (0)