Skip to content

Commit bd451f9

Browse files
committed
Improved/updated Project.toml files + added examples from ModiaLang
1 parent fc30432 commit bd451f9

File tree

13 files changed

+1930
-20
lines changed

13 files changed

+1930
-20
lines changed

Manifest.toml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -672,10 +672,10 @@ deps = ["Libdl"]
672672
uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
673673

674674
[[LogExpFunctions]]
675-
deps = ["DocStringExtensions"]
676-
git-tree-sha1 = "49c5c32deda5999d15378b64ee10f2e87831ab25"
675+
deps = ["DocStringExtensions", "LinearAlgebra"]
676+
git-tree-sha1 = "ed26854d7c2c867d143f0e07c198fc9e8b721d10"
677677
uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
678-
version = "0.2.2"
678+
version = "0.2.3"
679679

680680
[[Logging]]
681681
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
@@ -832,9 +832,9 @@ version = "0.4.0"
832832

833833
[[OffsetArrays]]
834834
deps = ["Adapt"]
835-
git-tree-sha1 = "b3dfef5f2be7d7eb0e782ba9146a5271ee426e90"
835+
git-tree-sha1 = "87a728aebb76220bd72855e1c85284c5fdb9774c"
836836
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
837-
version = "1.6.2"
837+
version = "1.7.0"
838838

839839
[[Ogg_jll]]
840840
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -854,9 +854,9 @@ version = "1.1.1+6"
854854

855855
[[OpenSpecFun_jll]]
856856
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
857-
git-tree-sha1 = "9db77584158d0ab52307f8c04f8e7c08ca76b5b3"
857+
git-tree-sha1 = "b9b8b8ed236998f91143938a760c2112dceeb2b4"
858858
uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
859-
version = "0.5.3+4"
859+
version = "0.5.4+0"
860860

861861
[[Optim]]
862862
deps = ["Compat", "FillArrays", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
@@ -1326,9 +1326,9 @@ version = "1.7.0"
13261326

13271327
[[VectorizationBase]]
13281328
deps = ["ArrayInterface", "Hwloc", "IfElse", "Libdl", "LinearAlgebra", "Static"]
1329-
git-tree-sha1 = "51afeb432d4d8c446dd87d15af83a54046525839"
1329+
git-tree-sha1 = "5d66756d2d5c538e9ab0c39efcb4512e3a8c3361"
13301330
uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f"
1331-
version = "0.19.29"
1331+
version = "0.19.31"
13321332

13331333
[[VertexSafeGraphs]]
13341334
deps = ["LightGraphs"]

docs/src/tutorial/Modeling.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ y = -x + u
3838
is defined in an anonymous model `Model( y = :(-x + u) )`. This anonymous model is merged with `LowPassFilter` using the merge operator `|`:
3939

4040
```julia
41-
HighPassFilter = LowPassFilter | Model( y = :(-x + u) )
41+
HighPassFilter = LowPassFilter | Model( y = Var(:(-x + u) ) )
4242
```
4343

4444
The merging implies that the `output` property of `y` is kept, but the binding expression is changed from `:x` to `:(-x + u)`.
@@ -196,7 +196,6 @@ plot(bandPassFilter, ["u", "y"], figure=2)
196196

197197
![Band Pass Filter Plot](../../resources/images/BandPassFilterPlot.png)
198198

199-
The above examples are available in file `SimpleFilters.jl`.
200199

201200
## 2.5 Physically oriented modeling
202201

examples/CauerLowPassFilter.jl

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
module CauerLowPassFilterModel
2+
3+
using Modia, ModiaPlot
4+
5+
l1 = 1.304
6+
l2 = 0.8586
7+
c1 = 1.072*1u"F"
8+
c2 = 1/(1.704992^2*l1)*1u"F"
9+
c3 = 1.682*1u"F"
10+
c4 = 1/(1.179945^2*l2)*1u"F"
11+
c5 = 0.7262*1u"F"
12+
13+
CauerLowPassOPVWithoutNodes(i=1) = Model(
14+
# Cauer low pass filter with operational amplifiers
15+
16+
C1 = Modia.Capacitor | Map(C=c1 + c2),
17+
C2 = Modia.Capacitor | Map(C=c2, v=Var(init=nothing)),
18+
C3 = Modia.Capacitor | Map(C=l1*1u"F"),
19+
C4 = Modia.Capacitor | Map(C=c4*i, v=Var(init=nothing)),
20+
C5 = Modia.Capacitor | Map(C=c2, v=Var(init=nothing)),
21+
R1 = Modia.Resistor | Map(R=1u"Ω"),
22+
R2 = Modia.Resistor | Map(R=1u"Ω"),
23+
R3 = Modia.Resistor | Map(R=1u"Ω"),
24+
Op1 = Modia.IdealOpAmp3Pin,
25+
G = Modia.Ground,
26+
R4 = Modia.Resistor | Map(R=-1u"Ω"),
27+
R5 = Modia.Resistor | Map(R=-1u"Ω"),
28+
Op2 = Modia.IdealOpAmp3Pin,
29+
Op3 = Modia.IdealOpAmp3Pin,
30+
G1 = Modia.Ground,
31+
R6 = Modia.Resistor | Map(R=1u"Ω"),
32+
R7 = Modia.Resistor | Map(R=1u"Ω"),
33+
C6 = Modia.Capacitor | Map(C=c2 + c3 + c4, v=Var(init=nothing)),
34+
R8 = Modia.Resistor | Map(R=-1u"Ω"),
35+
R9 = Modia.Resistor | Map(R=-1u"Ω"),
36+
R10 = Modia.Resistor | Map(R=1u"Ω"),
37+
Op4 = Modia.IdealOpAmp3Pin,
38+
Op5 = Modia.IdealOpAmp3Pin,
39+
C7 = Modia.Capacitor | Map(C=l2*1u"F"),
40+
C8 = Modia.Capacitor | Map(C=c4, i=Var(start=0u"A")),
41+
C9 = Modia.Capacitor | Map(C=c4 + c5),
42+
R11 = Modia.Resistor | Map(R=1u"Ω"),
43+
44+
G2 = Modia.Ground,
45+
G3 = Modia.Ground,
46+
G4 = Modia.Ground,
47+
V = Modia.ConstantVoltage | Map(V=1.0u"V"),
48+
Ground1 = Modia.Ground,
49+
50+
connect = :[
51+
(Op1.in_p, G.p)
52+
(G1.p, Op2.in_p)
53+
(R1.n, Op1.in_n, C2.n, R2.n, C1.p, R3.p)
54+
(R3.n, C1.n, Op1.out, R4.p, C5.p)
55+
(R4.n, Op2.in_n, C3.p, R5.n)
56+
(C2.p, R5.p, Op3.out, C6.n, R9.p, C8.p)
57+
(C3.n, Op2.out, R2.p, R7.p)
58+
(R7.n, Op3.in_n, C5.n, R6.n, C6.p, C4.n)
59+
(C4.p, R8.p, R11.n, C9.n, Op5.out)
60+
(R9.n, R8.n, Op4.in_n, C7.p)
61+
(R6.p, C7.n, Op4.out, R10.p)
62+
(G2.p, Op3.in_p)
63+
(R11.p, C9.p, R10.n, Op5.in_n, C8.n)
64+
(Op4.in_p, G3.p)
65+
(Op5.in_p, G4.p)
66+
(V.p, Ground1.p)
67+
(V.n, R1.p) ]
68+
)
69+
70+
println("Build array of Cauer low pass filters")
71+
@time Filters = Model(
72+
filters = [CauerLowPassOPVWithoutNodes(0.1*i) for i in 1:10]
73+
)
74+
75+
model = @instantiateModel(Filters, logDetails=false, logTiming=true, unitless=true)
76+
77+
println("Simulate")
78+
@time simulate!(model, Tsit5(), stopTime = 60, requiredFinalStates =
79+
[-0.5000732186007855, -0.5002239998029879, 0.4996923410661849, -0.4996706636198064, -0.5000929741546876, -0.5001255383344897, -0.500147742207576, 0.49981113006573824, -0.4996196061432069, -0.5001392063603706, -0.5001815616147427, -0.5000459266587362, 0.49996685095395915, -0.49958392015463465, -0.5001886259176451, -0.5002389821958331, -0.4999173001411904, 0.5001611780149184, -0.49957016523210945, -0.5002393712119582, -0.5002944833191254, -0.49976183273648583, 0.5003940588092074, -0.49958591550449066, -0.5002887040151874, -0.500343478728503, -0.4995812991530469, 0.5006629055320556, -0.49963969356758026, -0.5003327561376948, -0.50037980690654, -0.49938004306850625, 0.5009615326279456, -0.4997407922705924, -0.5003662177501006, -0.500395375828166, -0.4991659724894459, 0.5012787730322307, -0.4998989295998676, -0.5003819572251011, -0.5003797586125351, -0.49895184523346914, 0.5015966895590688, -0.5001236602409048, -0.5003705619890064, -0.5003197458974357, -0.49875691633150787, 0.5018882791340892, -0.5004234377294563, -0.5003197904255381])
80+
plot(model, ["filters_1.C9.v", "filters_2.C9.v", "filters_3.C9.v"])
81+
82+
println("Total")
83+
end

examples/FilterCircuit.jl

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
module FilterCircuit
2+
3+
using Modia, ModiaPlot
4+
5+
setLogMerge(false)
6+
7+
Filter = Model(
8+
R = Modia.Resistor | Map(R=0.5u"Ω"),
9+
C = Modia.Capacitor | Map(C=2.0u"F", v=Var(init=0.1u"V")),
10+
V = Modia.ConstantVoltage | Map(V=10.0u"V"),
11+
ground = Modia.Ground,
12+
connect = :[
13+
(V.p, R.p)
14+
(R.n, C.p)
15+
(C.n, V.n, ground.p)
16+
]
17+
)
18+
19+
model = @instantiateModel(Filter, log=false, aliasReduction=true, logCode=false)
20+
@time simulate!(model, Tsit5(), stopTime = 10)
21+
#plot(model, [("R.v", "C.v")])
22+
23+
println("Simulate once more with different R.R")
24+
@time simulate!(model, Tsit5(), stopTime = 10, merge = Map(R = Map(R = 5u"Ω")), requiredFinalStates = [6.3579935215716095])
25+
plot(model, [("R.v", "C.v")])
26+
27+
# setLogMerge(true)
28+
println("Filter without ground and parameter propagation")
29+
Filter2 = Model(
30+
r = 2.0u"Ω",
31+
c = 1.0u"F",
32+
v = 10u"V",
33+
R = Modia.Resistor | Map(R=:r),
34+
C = Modia.Capacitor | Map(C=:c),
35+
V = Modia.ConstantVoltage | Map(V=:v),
36+
connect = :[
37+
(V.p, R.p)
38+
(R.n, C.p)
39+
(C.n, V.n)
40+
]
41+
)
42+
43+
# @showModel(Filter2)
44+
45+
model = @instantiateModel(Filter2, log=false, aliasReduction=true, logCode=false)
46+
simulate!(model, Tsit5(), stopTime = 10, requiredFinalStates = [9.932620374719848])
47+
plot(model, [("R.v", "C.v")])
48+
49+
50+
println("Voltage divider by redeclaring capacitor to resistor")
51+
Cpar = Map(C = 5.0u"F")
52+
53+
TwoFilters = Model( f1 = Filter | Map( R = Map(R = 10.0u"Ω"), C = Cpar), f2 = Filter)
54+
55+
VoltageDividerAndFilter = TwoFilters | Map(f1 = Map(C = Redeclare | Modia.Resistor | (R = 20.0u"Ω", v = Var(start = 0u"V"))))
56+
57+
model = @instantiateModel(VoltageDividerAndFilter, log=false, aliasReduction=true, logCode=false)
58+
simulate!(model, Tsit5(), stopTime = 10, requiredFinalStates = [9.999550454584188])
59+
plot(model, [("f1.R.v", "f1.C.v"), ("f2.R.v", "f2.C.v")])
60+
61+
62+
println("Build array of filters")
63+
Filters = Model(
64+
filters = [Filter | Map( R = Map(R = (10.0+5*i)*u"Ω")) for i in 1:10]
65+
)
66+
67+
setLogMerge(false)
68+
69+
model = @instantiateModel(Filters, log=false, aliasReduction=true, logCode=false)
70+
71+
simulate!(model, Tsit5(), stopTime = 10, requiredFinalStates =
72+
[2.9063400246452358, 2.2898722474751163, 1.8945655444974656, 1.6198309235728083, 1.4179087924692246, 1.2632806644107324, 1.1410907635368692, 1.0421095614435398, 0.9603029088053439, 0.8915602951695468])
73+
plot(model, [("filters_1.R.v", "filters_1.C.v"), ("filters_2.R.v", "filters_2.C.v")])
74+
75+
end

examples/MotorControl.jl

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
module MotorControl
2+
3+
println("\nMotorControl: Demonstrating the ability to simulate hierarchical mixed domain models")
4+
5+
using Modia, ModiaPlot, Measurements
6+
7+
export MotorControl2
8+
9+
MotorControl1 = Model(
10+
step = Modia.Step | Map(height=4.7*u"A", offset=0u"A"),
11+
feedback = Modia.Feedback,
12+
PI = Modia.PI | Map(T=0.005u"s", k=30, x = Var(init=0.0u"A")),
13+
firstOrder = Modia.FirstOrder | Map(k=1u"V/A", T=0.001u"s", x = Var(init=0.0u"V")),
14+
15+
signalVoltage = Modia.SignalVoltage,
16+
resistor = Modia.Resistor | Map(R=13.8u"Ω"),
17+
inductor = Modia.Inductor | Map(L=0.061u"H"),
18+
emf = Modia.EMF | Map(k=1.016u"N*m/A"),
19+
ground = Modia.Ground,
20+
currentSensor = Modia.CurrentSensor,
21+
22+
motorInertia = Modia.Inertia | Map(J=0.0025u"kg*m^2"),
23+
idealGear = Modia.IdealGear | Map(ratio=105),
24+
springDamper = Modia.SpringDamper | Map(c=5.0e5u"N*m/rad", d=500u"N*m*s/rad"),
25+
loadInertia = Modia.Inertia | Map(J=100u"kg*m^2"),
26+
tload = Modia.Torque,
27+
28+
equations = :[
29+
tload.tau = 0.0u"N*m",
30+
],
31+
32+
connect = :[
33+
(step.y, feedback.u1)
34+
(feedback.y, PI.u)
35+
(PI.y, firstOrder.u)
36+
(firstOrder.y, signalVoltage.v)
37+
38+
(signalVoltage.p, resistor.p)
39+
(resistor.n, inductor.p)
40+
(inductor.n, emf.p)
41+
(emf.n, ground.p, currentSensor.p)
42+
(currentSensor.n, signalVoltage.n)
43+
(currentSensor.i, feedback.u2)
44+
45+
(emf.flange, motorInertia.flange_a)
46+
(motorInertia.flange_b, idealGear.flange_a)
47+
(idealGear.flange_b, springDamper.flange_a)
48+
(springDamper.flange_b, loadInertia.flange_a)
49+
(tload.flange, loadInertia.flange_b) ]
50+
)
51+
52+
model = @instantiateModel(MotorControl1, log=false)
53+
println("Simulate")
54+
@time simulate!(model, stopTime=0.1, tolerance=1e-6, log=false, requiredFinalStates =
55+
[3.487844601078223, 106.82874860310305, 4.616087152802267, 2.014120727821878, 41.98048886114646, 0.018332432934516536, 0.3725930536373392])
56+
plot(model, [("currentSensor.i", "step.y"), "loadInertia.w"], figure=1)
57+
58+
59+
# Hierarchical model
60+
61+
ControlledMotor = Model(
62+
refCurrent = input,
63+
feedback = Modia.Feedback,
64+
PI = Modia.PI | Map(T=0.005u"s", k=30, x = Var(init=0.0u"A")),
65+
firstOrder = Modia.FirstOrder | Map(k=1u"V/A", T=0.001u"s", x = Var(init=0.0u"V")),
66+
67+
signalVoltage = Modia.SignalVoltage,
68+
resistor = Modia.Resistor | Map(R=13.8u"Ω"),
69+
inductor = Modia.Inductor | Map(L=0.061u"H"),
70+
emf = Modia.EMF | Map(k=1.016u"N*m/A"),
71+
ground = Modia.Ground,
72+
currentSensor = Modia.CurrentSensor,
73+
74+
motorInertia = Modia.Inertia | Map(J=0.0025u"kg*m^2"),
75+
flange = Modia.Flange,
76+
77+
connect = :[
78+
(refCurrent, feedback.u1)
79+
(feedback.y, PI.u)
80+
(PI.y, firstOrder.u)
81+
(firstOrder.y, signalVoltage.v)
82+
83+
(signalVoltage.p, resistor.p)
84+
(resistor.n, inductor.p)
85+
(inductor.n, emf.p)
86+
(emf.n, ground.p, currentSensor.p)
87+
(currentSensor.n, signalVoltage.n)
88+
(currentSensor.i, feedback.u2)
89+
90+
(emf.flange, motorInertia.flange_a)
91+
(motorInertia.flange_b, flange) ]
92+
)
93+
94+
MotorControl2 = Model(
95+
step = Modia.Step | Map(height=4.7*u"A", offset=0u"A"),
96+
97+
controlledMotor = ControlledMotor,
98+
99+
idealGear = Modia.IdealGear | Map(ratio=105),
100+
springDamper = Modia.SpringDamper | Map(c=5.0e5u"N*m/rad", d=500u"N*m*s/rad"),
101+
loadInertia = Modia.Inertia | Map(J=100.0u"kg*m^2"),
102+
tload = Modia.Torque,
103+
104+
equations = :[
105+
tload.tau = 0.0u"N*m",
106+
],
107+
108+
connect = :[
109+
(step.y, controlledMotor.refCurrent)
110+
111+
(controlledMotor.flange, idealGear.flange_a)
112+
(idealGear.flange_b, springDamper.flange_a)
113+
(springDamper.flange_b, loadInertia.flange_a)
114+
(tload.flange, loadInertia.flange_b) ]
115+
)
116+
117+
model = @instantiateModel(MotorControl2)
118+
println("Simulate")
119+
@time simulate!(model, stopTime=0.1, tolerance=1e-6, log=false, requiredFinalStates =
120+
[3.487844601078223, 106.82874860310305, 4.616087152802267, 2.014120727821878, 41.98048886114646, 0.018332432934516536, 0.3725930536373392])
121+
plot(model, [("controlledMotor.currentSensor.i", "step.y"), "loadInertia.w"], figure=1)
122+
123+
124+
# Model with uncertainties
125+
126+
MotorControlWithUncertainties = MotorControl2 | Map( loadInertia = Map(J=(100.0 ± 10)*u"kg*m^2"), controlledMotor = Map(PI = Map(k=30 ± 3) ) )
127+
128+
model = @instantiateModel(MotorControlWithUncertainties, FloatType = Measurement{Float64})
129+
println("Simulate")
130+
@time simulate!(model, stopTime=0.1, tolerance=1e-6, log=false)
131+
plot(model, [("controlledMotor.currentSensor.i", "step.y"), "loadInertia.w"], figure=1)
132+
133+
end
134+
135+
#=
136+
module MotorControlModuleMonteCarlo
137+
138+
using ModiaBase.ModiaLang
139+
using Unitful
140+
using Main.MotorControlModule
141+
include("../test/SimulateAndPlot.jl")
142+
143+
using MonteCarloMeasurements
144+
145+
# Model with Monte Carlo
146+
147+
MotorControlWithUncertainties = MotorControl2 | Map( loadInertia = Map(J=(100.0 ∓ 10)), controlledMotor = Map(PI = Map(k=30 ∓ 3) ) )
148+
149+
model = @instantiateModel(MotorControlWithUncertainties, FloatType = StaticParticles{Float64,100}, unitless=true)
150+
println("Simulate")
151+
@time simulate!(model, stopTime=0.1, tolerance=1e-6, log=false)
152+
plot(model, [("controlledMotor.currentSensor.i", "step.y"), "loadInertia.w"], figure=1)
153+
154+
end
155+
=#

0 commit comments

Comments
 (0)