Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/test/test_structured_3d.jl
2055 views
1
module TestExamples3DStructured
2
3
using Test
4
using Trixi
5
6
include("test_trixi.jl")
7
8
EXAMPLES_DIR = joinpath(examples_dir(), "structured_3d_dgsem")
9
10
# Start with a clean environment: remove Trixi.jl output directory if it exists
11
outdir = "out"
12
isdir(outdir) && rm(outdir, recursive = true)
13
14
@testset "StructuredMesh3D" begin
15
#! format: noindent
16
17
@trixi_testset "elixir_advection_basic.jl" begin
18
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_advection_basic.jl"),
19
# Expected errors are exactly the same as with TreeMesh!
20
l2=[0.00016263963870641478],
21
linf=[0.0014537194925779984])
22
# Ensure that we do not have excessive memory allocations
23
# (e.g., from type instabilities)
24
let
25
t = sol.t[end]
26
u_ode = sol.u[end]
27
du_ode = similar(u_ode)
28
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
29
end
30
end
31
32
@trixi_testset "elixir_advection_free_stream.jl" begin
33
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_advection_free_stream.jl"),
34
l2=[1.2908196366970896e-14],
35
linf=[1.0262901639634947e-12],
36
atol=8e-13,)
37
# Ensure that we do not have excessive memory allocations
38
# (e.g., from type instabilities)
39
let
40
t = sol.t[end]
41
u_ode = sol.u[end]
42
du_ode = similar(u_ode)
43
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
44
end
45
end
46
47
@trixi_testset "elixir_advection_nonperiodic_curved.jl" begin
48
@test_trixi_include(joinpath(EXAMPLES_DIR,
49
"elixir_advection_nonperiodic_curved.jl"),
50
l2=[0.0004483892474201268],
51
linf=[0.009201820593762955])
52
# Ensure that we do not have excessive memory allocations
53
# (e.g., from type instabilities)
54
let
55
t = sol.t[end]
56
u_ode = sol.u[end]
57
du_ode = similar(u_ode)
58
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
59
end
60
end
61
62
@trixi_testset "elixir_advection_restart.jl" begin
63
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_advection_restart.jl"),
64
l2=[0.0025903889347585777],
65
linf=[0.018407576968841655])
66
# Ensure that we do not have excessive memory allocations
67
# (e.g., from type instabilities)
68
let
69
t = sol.t[end]
70
u_ode = sol.u[end]
71
du_ode = similar(u_ode)
72
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
73
end
74
end
75
76
@trixi_testset "elixir_euler_source_terms.jl" begin
77
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_euler_source_terms.jl"),
78
# Expected errors are exactly the same as with TreeMesh!
79
l2=[
80
0.010385936842224346,
81
0.009776048833895767,
82
0.00977604883389591,
83
0.009776048833895733,
84
0.01506687097416608
85
],
86
linf=[
87
0.03285848350791731,
88
0.0321792316408982,
89
0.032179231640894645,
90
0.032179231640895534,
91
0.0655408023333299
92
])
93
# Ensure that we do not have excessive memory allocations
94
# (e.g., from type instabilities)
95
let
96
t = sol.t[end]
97
u_ode = sol.u[end]
98
du_ode = similar(u_ode)
99
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
100
end
101
end
102
103
@trixi_testset "elixir_euler_free_stream.jl" begin
104
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_euler_free_stream.jl"),
105
l2=[
106
2.8815700334367128e-15,
107
9.361915278236651e-15,
108
9.95614203619935e-15,
109
1.6809941842374106e-14,
110
1.4815037041566735e-14
111
],
112
linf=[
113
4.1300296516055823e-14,
114
2.0444756998472258e-13,
115
1.0133560657266116e-13,
116
2.0627943797535409e-13,
117
2.8954616482224083e-13
118
])
119
# Ensure that we do not have excessive memory allocations
120
# (e.g., from type instabilities)
121
let
122
t = sol.t[end]
123
u_ode = sol.u[end]
124
du_ode = similar(u_ode)
125
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
126
end
127
end
128
129
# Up to version 0.13.0, `max_abs_speed_naive` was used as the default wave speed estimate of
130
# `const flux_lax_friedrichs = FluxLaxFriedrichs(), i.e., `FluxLaxFriedrichs(max_abs_speed = max_abs_speed_naive)`.
131
# In the `StepsizeCallback`, though, the less diffusive `max_abs_speeds` is employed which is consistent with `max_abs_speed`.
132
# Thus, we exchanged in PR#2458 the default wave speed used in the LLF flux to `max_abs_speed`.
133
# To ensure that every example still runs we specify explicitly `FluxLaxFriedrichs(max_abs_speed_naive)`.
134
# We remark, however, that the now default `max_abs_speed` is in general recommended due to compliance with the
135
# `StepsizeCallback` (CFL-Condition) and less diffusion.
136
@trixi_testset "elixir_euler_free_stream.jl with FluxRotated(FluxLaxFriedrichs(max_abs_speed_naive))" begin
137
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_euler_free_stream.jl"),
138
surface_flux=FluxRotated(FluxLaxFriedrichs(max_abs_speed_naive)),
139
l2=[
140
2.8815700334367128e-15,
141
9.361915278236651e-15,
142
9.95614203619935e-15,
143
1.6809941842374106e-14,
144
1.4815037041566735e-14
145
],
146
linf=[
147
4.1300296516055823e-14,
148
2.0444756998472258e-13,
149
1.0133560657266116e-13,
150
2.0627943797535409e-13,
151
2.8954616482224083e-13
152
])
153
# Ensure that we do not have excessive memory allocations
154
# (e.g., from type instabilities)
155
let
156
t = sol.t[end]
157
u_ode = sol.u[end]
158
du_ode = similar(u_ode)
159
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
160
end
161
end
162
163
@trixi_testset "elixir_euler_source_terms_nonperiodic_curved.jl" begin
164
@test_trixi_include(joinpath(EXAMPLES_DIR,
165
"elixir_euler_source_terms_nonperiodic_curved.jl"),
166
l2=[
167
0.0032940531178824463,
168
0.003275679548217804,
169
0.0030020672748714084,
170
0.00324007343451744,
171
0.005721986362580164
172
],
173
linf=[
174
0.03156756290660656,
175
0.033597629023726316,
176
0.02095783702361409,
177
0.03353574465232212,
178
0.05873635745032857
179
])
180
# Ensure that we do not have excessive memory allocations
181
# (e.g., from type instabilities)
182
let
183
t = sol.t[end]
184
u_ode = sol.u[end]
185
du_ode = similar(u_ode)
186
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
187
end
188
end
189
190
@trixi_testset "elixir_euler_ec.jl" begin
191
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_euler_ec.jl"),
192
l2=[
193
0.011367083018614027,
194
0.007022020327490176,
195
0.006759580335962235,
196
0.006820337637760632,
197
0.02912659127566544
198
],
199
linf=[
200
0.2761764220925329,
201
0.20286331858055706,
202
0.18763944865434593,
203
0.19313636558790004,
204
0.707563913727584
205
],
206
tspan=(0.0, 0.25),)
207
# Ensure that we do not have excessive memory allocations
208
# (e.g., from type instabilities)
209
let
210
t = sol.t[end]
211
u_ode = sol.u[end]
212
du_ode = similar(u_ode)
213
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
214
end
215
end
216
217
@trixi_testset "elixir_euler_sedov.jl" begin
218
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_euler_sedov.jl"),
219
l2=[
220
5.30310390e-02,
221
2.53167260e-02,
222
2.64276438e-02,
223
2.52195992e-02,
224
3.56830295e-01
225
],
226
linf=[
227
6.16356950e-01,
228
2.50600049e-01,
229
2.74796377e-01,
230
2.46448217e-01,
231
4.77888479e+00
232
],
233
tspan=(0.0, 0.3))
234
# Ensure that we do not have excessive memory allocations
235
# (e.g., from type instabilities)
236
let
237
t = sol.t[end]
238
u_ode = sol.u[end]
239
du_ode = similar(u_ode)
240
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
241
end
242
end
243
244
@trixi_testset "elixir_mhd_ec.jl" begin
245
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_mhd_ec.jl"),
246
l2=[0.009082353008355219, 0.007128360330314966,
247
0.0069703300260751545, 0.006898850266164216,
248
0.033020091335659474, 0.003203389281512797,
249
0.0030774985678369746, 0.00307400076520122,
250
4.192572922118587e-5],
251
linf=[0.28839460197220435, 0.25956437090703427,
252
0.26143649456148177, 0.24617277684934058,
253
1.1370439348603143, 0.12780410700666367,
254
0.13347392283166903,
255
0.145756208548534,
256
0.0021181795153149053],
257
tspan=(0.0, 0.25))
258
# Ensure that we do not have excessive memory allocations
259
# (e.g., from type instabilities)
260
let
261
t = sol.t[end]
262
u_ode = sol.u[end]
263
du_ode = similar(u_ode)
264
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
265
end
266
end
267
268
@trixi_testset "elixir_mhd_alfven_wave.jl" begin
269
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_mhd_alfven_wave.jl"),
270
l2=[0.003015390232128414, 0.0014538563096541798,
271
0.000912478356719486, 0.0017715065044433436,
272
0.0013017575272262197, 0.0014545437537522726,
273
0.0013322897333898482, 0.0016493009787844212,
274
0.0013747547738038235],
275
linf=[0.027577067632765795, 0.027912829563483885,
276
0.01282206030593043, 0.03911437990598213,
277
0.021962225923304324, 0.03169774571258743,
278
0.021591564663781426, 0.034028148178115364,
279
0.020084593242858988])
280
# Ensure that we do not have excessive memory allocations
281
# (e.g., from type instabilities)
282
let
283
t = sol.t[end]
284
u_ode = sol.u[end]
285
du_ode = similar(u_ode)
286
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
287
end
288
end
289
290
# Up to version 0.13.0, `max_abs_speed_naive` was used as the default wave speed estimate of
291
# `const flux_lax_friedrichs = FluxLaxFriedrichs(), i.e., `FluxLaxFriedrichs(max_abs_speed = max_abs_speed_naive)`.
292
# In the `StepsizeCallback`, though, the less diffusive `max_abs_speeds` is employed which is consistent with `max_abs_speed`.
293
# Thus, we exchanged in PR#2458 the default wave speed used in the LLF flux to `max_abs_speed`.
294
# To ensure that every example still runs we specify explicitly `FluxLaxFriedrichs(max_abs_speed_naive)`.
295
# We remark, however, that the now default `max_abs_speed` is in general recommended due to compliance with the
296
# `StepsizeCallback` (CFL-Condition) and less diffusion.
297
@trixi_testset "elixir_mhd_alfven_wave.jl with FluxLaxFriedrichs(max_abs_speed_naive)" begin
298
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_mhd_alfven_wave.jl"),
299
l2=[0.0030477691235949685, 0.00145609137038748,
300
0.0009092809766088607, 0.0017949926915475929,
301
0.0012981612165627713, 0.0014525841626158234,
302
0.0013275465154956557, 0.0016728767532610933,
303
0.0013751925705271012],
304
linf=[0.02778552932540901, 0.027511633996169835,
305
0.012637649797178449, 0.03920805095546112,
306
0.02126543791857216, 0.031563506812970266,
307
0.02116105422516923, 0.03419432640106229,
308
0.020324891223351533],
309
surface_flux=(FluxLaxFriedrichs(max_abs_speed_naive),
310
flux_nonconservative_powell),)
311
# Ensure that we do not have excessive memory allocations
312
# (e.g., from type instabilities)
313
let
314
t = sol.t[end]
315
u_ode = sol.u[end]
316
du_ode = similar(u_ode)
317
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
318
end
319
end
320
321
@trixi_testset "elixir_mhd_ec_shockcapturing.jl" begin
322
@test_trixi_include(joinpath(EXAMPLES_DIR, "elixir_mhd_ec_shockcapturing.jl"),
323
l2=[0.009352631216098996, 0.008058649096024162,
324
0.00802704129788766, 0.008071417834885589,
325
0.03490914976431044, 0.003930194255268652,
326
0.003921907459117296, 0.003906321239858786,
327
4.1971260184918575e-5],
328
linf=[0.307491045404509, 0.26790087991041506,
329
0.2712430701672931, 0.2654540237991884,
330
0.9620943261873176, 0.181632512204141,
331
0.15995711137712265, 0.1791807940466812,
332
0.015138421396338456],
333
tspan=(0.0, 0.25),)
334
# Ensure that we do not have excessive memory allocations
335
# (e.g., from type instabilities)
336
let
337
t = sol.t[end]
338
u_ode = sol.u[end]
339
du_ode = similar(u_ode)
340
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
341
end
342
end
343
end
344
345
# Clean up afterwards: delete Trixi.jl output directory
346
@test_nowarn rm(outdir, recursive = true)
347
348
end # module
349
350