1
1
using ModelingToolkitStandardLibrary. Thermal, ModelingToolkit, OrdinaryDiffEq, Test
2
+ using ModelingToolkitStandardLibrary. Blocks: Constant, Step
2
3
@parameters t
3
4
D = Differential (t)
4
5
@@ -40,10 +41,10 @@ D = Differential(t)
40
41
connect (T_sensor1. port, mass1. port, th_conductor. port_a)
41
42
connect (th_conductor. port_b, mass2. port, T_sensor2. port)
42
43
final_T ~ (mass1. C * mass1. T + mass2. C * mass2. T) /
43
- (mass1. C + mass2. C)
44
+ (mass1. C + mass2. C)
44
45
]
45
46
@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])
47
48
sys = structural_simplify (h2)
48
49
49
50
u0 = [
@@ -58,7 +59,7 @@ D = Differential(t)
58
59
59
60
@test sol. retcode == :Success
60
61
m1, m2 = sol. u[end ]
61
- @test m1 ≈ m2 atol= 1e-1
62
+ @test m1 ≈ m2 atol = 1e-1
62
63
mass_T = reduce (hcat, sol. u)
63
64
@test sol[T_sensor1. T] == mass_T[1 , :]
64
65
@test sol[T_sensor2. T] == mass_T[2 , :]
82
83
connect (th_resistor. port_b, hf_sensor1. port_b, hf_sensor2. port_b, th_ground. port)
83
84
]
84
85
@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])
87
88
sys = structural_simplify (h2)
88
89
89
90
u0 = [
90
91
mass1. T => 10.0
91
92
th_resistor. Q_flow => 1.0
92
- mass1. der_T => 1.0
93
+ mass1. der_T => 1.0
93
94
]
94
95
prob = ODEProblem (sys, u0, (0 , 3.0 ))
95
96
sol = solve (prob, Tsit5 ())
@@ -116,10 +117,10 @@ end
116
117
117
118
@info " Building a piston-cylinder..."
118
119
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)
123
124
]
124
125
@named piston = ODESystem (eqs, t, systems= [gas_tem, wall, gas, coolant, coolant_tem])
125
126
sys = structural_simplify (piston)
153
154
154
155
@info " Building a radiator..."
155
156
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 )
158
159
]
159
160
@named rad = ODESystem (eqs, t, systems= [base, gas_tem, radiator, dissipator, coolant_tem, mass])
160
161
sys = structural_simplify (rad)
169
170
170
171
@test sol. retcode == :Success
171
172
@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 )
173
174
@test sol[radiator. Q_flow] == fill (rad_Q_flow, length (sol[radiator. Q_flow]))
174
175
end
175
176
@@ -189,21 +190,67 @@ end
189
190
connect (hf_sensor. port_a, collector. port_b)
190
191
connect (hf_sensor. port_b, mass. port, th_resistor. port_b)
191
192
connect (mass. port, th_ground. port)
192
- ]
193
+ ]
193
194
@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])
196
197
sys = structural_simplify (coll)
197
198
198
199
u0 = [
199
200
th_resistor. Q_flow => 1.0 ,
200
201
mass. T => 0.0 ,
201
202
]
202
203
prob = ODEProblem (sys, u0, (0 , 3.0 ))
203
- sol = solve (prob, Rodas4 ())
204
+ sol = solve (prob, Rodas4 ())
204
205
205
206
@test sol. retcode == :Success
206
207
@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]))
208
209
@test sol[collector. port_b. T] == sol[collector. port_a1. T] == sol[collector. port_a2. T]
209
210
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