Skip to content

Commit 0b09f65

Browse files
adds test
renames ports (same as Modelica)
1 parent 30845e5 commit 0b09f65

File tree

4 files changed

+87
-41
lines changed

4 files changed

+87
-41
lines changed

src/Thermal/HeatTransfer/ideal_components.jl

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -89,28 +89,28 @@ end
8989
Lumped thermal element for heat convection.
9090
9191
# States:
92-
- `dT`: [`K`] Temperature difference across the component solid_port.T - fluid_port.T
93-
- `Q_flow`: [`W`] Heat flow rate from `solid_port` -> `fluid_port`
92+
- `dT`: [`K`] Temperature difference across the component solid.T - fluid.T
93+
- `Q_flow`: [`W`] Heat flow rate from `solid` -> `fluid`
9494
9595
# Connectors:
96-
- `solid_port`
97-
- `fluid_port`
96+
- `solid`
97+
- `fluid`
9898
9999
# Parameters:
100100
- `G`: [W/K] Convective thermal conductance
101101
"""
102102
function ConvectiveConductor(; name, G)
103-
@named solid_port = HeatPort()
104-
@named fluid_port = HeatPort()
103+
@named solid = HeatPort()
104+
@named fluid = HeatPort()
105105
@parameters G=G
106106
sts = @variables Q_flow(t) dT(t)
107107
eqs = [
108-
dT ~ solid_port.T - fluid_port.T
109-
solid_port.Q_flow ~ Q_flow
110-
fluid_port.Q_flow ~ -Q_flow
108+
dT ~ solid.T - fluid.T
109+
solid.Q_flow ~ Q_flow
110+
fluid.Q_flow ~ -Q_flow
111111
dT ~ G*Q_flow
112112
]
113-
ODESystem(eqs, t, sts, [G]; systems=[solid_port, fluid_port], name=name)
113+
ODESystem(eqs, t, sts, [G]; systems=[solid, fluid], name=name)
114114
end
115115

116116
"""
@@ -119,28 +119,28 @@ end
119119
Lumped thermal element for heat convection.
120120
121121
# States:
122-
- `dT`: [`K`] Temperature difference across the component solid_port.T - fluid_port.T
123-
- `Q_flow`: [`W`] Heat flow rate from `solid_port` -> `fluid_port`
122+
- `dT`: [`K`] Temperature difference across the component solid.T - fluid.T
123+
- `Q_flow`: [`W`] Heat flow rate from `solid` -> `fluid`
124124
125125
# Connectors:
126-
- `solid_port`
127-
- `fluid_port`
126+
- `solid`
127+
- `fluid`
128128
129129
# Parameters:
130130
- `R`: [`K/W`] Constant thermal resistance of material
131131
"""
132132
function ConvectiveResistor(; name, R)
133-
@named solid_port = HeatPort()
134-
@named fluid_port = HeatPort()
133+
@named solid = HeatPort()
134+
@named fluid = HeatPort()
135135
@parameters R=R
136136
sts = @variables Q_flow(t) dT(t)
137137
eqs = [
138-
dT ~ solid_port.T - fluid_port.T
139-
solid_port.Q_flow ~ Q_flow
140-
fluid_port.Q_flow ~ -Q_flow
138+
dT ~ solid.T - fluid.T
139+
solid.Q_flow ~ Q_flow
140+
fluid.Q_flow ~ -Q_flow
141141
dT ~ R*Q_flow
142142
]
143-
ODESystem(eqs, t, sts, [R]; systems=[solid_port, fluid_port], name=name)
143+
ODESystem(eqs, t, sts, [R]; systems=[solid, fluid], name=name)
144144
end
145145

146146
"""

src/Thermal/HeatTransfer/sources.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ dependent losses (which are given an reference temperature T_ref).
7373
"""
7474
function PrescribedHeatFlow(; name, T_ref=293.15, alpha=0.0)
7575
pars = @parameters begin
76-
Q_flow=Q_flow
7776
T_ref=T_ref
7877
alpha=alpha
7978
end
@@ -105,5 +104,5 @@ function PrescribedTemperature(; name)
105104
eqs = [
106105
port.T ~ T.u
107106
]
108-
ODESystem(eqs, t, [], pars; systems=[port, T], name=name)
107+
ODESystem(eqs, t, [], []; systems=[port, T], name=name)
109108
end

test/Thermal/demo.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ using ModelingToolkitStandardLibrary.Thermal, ModelingToolkit, OrdinaryDiffEq, T
33
D = Differential(t)
44

55
# Modelica example
6-
begin
6+
@testset "demo" begin
77
@named mass1 = HeatCapacitor(C=15, T_start=373.15)
88
@named mass2 = HeatCapacitor(C=15, T_start=273.15)
99
@named conduction = ThermalConductor(G=10)

test/Thermal/thermal.jl

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using ModelingToolkitStandardLibrary.Thermal, ModelingToolkit, OrdinaryDiffEq, Test
2+
using ModelingToolkitStandardLibrary.Blocks: Constant, Step
23
@parameters t
34
D = Differential(t)
45

@@ -40,10 +41,10 @@ D = Differential(t)
4041
connect(T_sensor1.port, mass1.port, th_conductor.port_a)
4142
connect(th_conductor.port_b, mass2.port, T_sensor2.port)
4243
final_T ~ (mass1.C * mass1.T + mass2.C * mass2.T) /
43-
(mass1.C + mass2.C)
44+
(mass1.C + mass2.C)
4445
]
4546
@named h2 = ODESystem(eqs, t, [final_T], [],
46-
systems=[mass1, mass2, T_sensor1, T_sensor2, th_conductor])
47+
systems=[mass1, mass2, T_sensor1, T_sensor2, th_conductor])
4748
sys = structural_simplify(h2)
4849

4950
u0 = [
@@ -58,7 +59,7 @@ D = Differential(t)
5859

5960
@test sol.retcode == :Success
6061
m1, m2 = sol.u[end]
61-
@test m1 m2 atol=1e-1
62+
@test m1 m2 atol = 1e-1
6263
mass_T = reduce(hcat, sol.u)
6364
@test sol[T_sensor1.T] == mass_T[1, :]
6465
@test sol[T_sensor2.T] == mass_T[2, :]
@@ -82,14 +83,14 @@ end
8283
connect(th_resistor.port_b, hf_sensor1.port_b, hf_sensor2.port_b, th_ground.port)
8384
]
8485
@named h2 = ODESystem(eqs, t,
85-
systems=[mass1, hf_sensor1, hf_sensor2,
86-
th_resistor, flow_src, th_ground, th_conductor])
86+
systems=[mass1, hf_sensor1, hf_sensor2,
87+
th_resistor, flow_src, th_ground, th_conductor])
8788
sys = structural_simplify(h2)
8889

8990
u0 = [
9091
mass1.T => 10.0
9192
th_resistor.Q_flow => 1.0
92-
mass1.der_T => 1.0
93+
mass1.der_T => 1.0
9394
]
9495
prob = ODEProblem(sys, u0, (0, 3.0))
9596
sol = solve(prob, Tsit5())
@@ -116,10 +117,10 @@ end
116117

117118
@info "Building a piston-cylinder..."
118119
eqs = [
119-
connect(gas_tem.port, gas.solid_port)
120-
connect(gas.fluid_port, wall.port_a)
121-
connect(wall.port_b, coolant.fluid_port)
122-
connect(coolant.solid_port, coolant_tem.port)
120+
connect(gas_tem.port, gas.solid)
121+
connect(gas.fluid, wall.port_a)
122+
connect(wall.port_b, coolant.fluid)
123+
connect(coolant.solid, coolant_tem.port)
123124
]
124125
@named piston = ODESystem(eqs, t, systems=[gas_tem, wall, gas, coolant, coolant_tem])
125126
sys = structural_simplify(piston)
@@ -153,8 +154,8 @@ end
153154

154155
@info "Building a radiator..."
155156
eqs = [
156-
connect(gas_tem.port, radiator.port_a, base.port_a, dissipator.solid_port, mass.port)
157-
connect(coolant_tem.port, base.port_b, radiator.port_b, dissipator.fluid_port)
157+
connect(gas_tem.port, radiator.port_a, base.port_a, dissipator.solid, mass.port)
158+
connect(coolant_tem.port, base.port_b, radiator.port_b, dissipator.fluid)
158159
]
159160
@named rad = ODESystem(eqs, t, systems=[base, gas_tem, radiator, dissipator, coolant_tem, mass])
160161
sys = structural_simplify(rad)
@@ -169,7 +170,7 @@ end
169170

170171
@test sol.retcode == :Success
171172
@test sol[dissipator.dT] == sol[radiator.port_a.T] - sol[radiator.port_b.T]
172-
rad_Q_flow = G*σ*(T_gas^4 - T_coolant^4)
173+
rad_Q_flow = G * σ * (T_gas^4 - T_coolant^4)
173174
@test sol[radiator.Q_flow] == fill(rad_Q_flow, length(sol[radiator.Q_flow]))
174175
end
175176

@@ -189,21 +190,67 @@ end
189190
connect(hf_sensor.port_a, collector.port_b)
190191
connect(hf_sensor.port_b, mass.port, th_resistor.port_b)
191192
connect(mass.port, th_ground.port)
192-
]
193+
]
193194
@named coll = ODESystem(eqs, t,
194-
systems=[hf_sensor,flow_src, tem_src,
195-
collector, th_resistor, mass])
195+
systems=[hf_sensor, flow_src, tem_src,
196+
collector, th_resistor, mass])
196197
sys = structural_simplify(coll)
197198

198199
u0 = [
199200
th_resistor.Q_flow => 1.0,
200201
mass.T => 0.0,
201202
]
202203
prob = ODEProblem(sys, u0, (0, 3.0))
203-
sol = solve(prob, Rodas4())
204+
sol = solve(prob, Rodas4())
204205

205206
@test sol.retcode == :Success
206207
@test sol[collector.port_b.Q_flow] + sol[collector.port_a1.Q_flow] + sol[collector.port_a2.Q_flow] ==
207-
zeros(length(sol[collector.port_b.Q_flow]))
208+
zeros(length(sol[collector.port_b.Q_flow]))
208209
@test sol[collector.port_b.T] == sol[collector.port_a1.T] == sol[collector.port_a2.T]
209210
end
211+
212+
# https://doc.modelica.org/Modelica%204.0.0/Resources/helpWSM/Modelica/Modelica.Thermal.HeatTransfer.Examples.Motor.html
213+
@testset "demo" begin
214+
k2c(T) = T - 273.15
215+
T_amb = 293.15
216+
@named windingLosses = PrescribedHeatFlow(T_ref=k2c(95), alpha=3.03e-3)
217+
@named winding = HeatCapacitor(C=2500, T_start=T_amb)
218+
@named T_winding = TemperatureSensor()
219+
@named winding2core = ThermalConductor(G=10)
220+
@named coreLosses = PrescribedHeatFlow()
221+
@named core = HeatCapacitor(C=25000, T_start=T_amb)
222+
@named T_core = TemperatureSensor()
223+
@named convection = ConvectiveConductor(G=25)
224+
@named environment = PrescribedTemperature()
225+
@named amb = Constant(k=T_amb)
226+
@named core_losses_const = Constant(k=500)
227+
@named winding_losses = Step(height=900, offset=100, start_time=360, duration=Inf, smooth=false)
228+
connections = [
229+
connect(windingLosses.port, winding.port)
230+
connect(coreLosses.port, core.port)
231+
connect(winding.port, winding2core.port_a)
232+
connect(winding2core.port_b, core.port)
233+
connect(winding.port, T_winding.port)
234+
connect(core.port, T_core.port)
235+
connect(winding2core.port_b, convection.solid)
236+
connect(convection.fluid, environment.port)
237+
connect(amb.output, environment.T)
238+
connect(winding_losses.output, windingLosses.Q_flow)
239+
connect(core_losses_const.output, coreLosses.Q_flow)
240+
]
241+
242+
@named model = ODESystem(connections, t, systems=[
243+
windingLosses, winding, T_winding, winding2core, coreLosses, core,
244+
T_core, convection, environment, amb, core_losses_const, winding_losses])
245+
sys = structural_simplify(model)
246+
prob = ODEProblem(sys, Pair[], (0, 720.0))
247+
sol = solve(prob, Rodas4())
248+
249+
# plot(sol; vars=[T_winding.T, T_core.T])
250+
@test sol.retcode == :Success
251+
@test sol[T_winding.T] == sol[winding.T]
252+
@test sol[T_core.T] == sol[core.T]
253+
@test sol[-core.port.Q_flow] == sol[coreLosses.port.Q_flow + convection.solid.Q_flow + winding2core.port_b.Q_flow]
254+
@test sol[T_winding.T][end] >= 500 # not good but better than nothing
255+
@test sol[T_core.T] <= sol[T_winding.T]
256+
end

0 commit comments

Comments
 (0)