Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/test/test_parabolic_3d.jl
2055 views
1
module TestExamplesParabolic3D
2
3
using Test
4
using Trixi
5
6
include("test_trixi.jl")
7
8
EXAMPLES_DIR = examples_dir()
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 "SemidiscretizationHyperbolicParabolic (3D)" begin
15
#! format: noindent
16
17
@trixi_testset "DGMulti: elixir_navierstokes_convergence.jl" begin
18
@test_trixi_include(joinpath(EXAMPLES_DIR, "dgmulti_3d",
19
"elixir_navierstokes_convergence.jl"),
20
cells_per_dimension=(4, 4, 4), tspan=(0.0, 0.1),
21
l2=[
22
0.0005532846479614563,
23
0.000659263463988067,
24
0.0007776436003494915,
25
0.000659263463988129,
26
0.0038073624941206956
27
],
28
linf=[
29
0.001703986341275776,
30
0.0026285618026252733,
31
0.00353105737957371,
32
0.002628561802588858,
33
0.015587831432887
34
])
35
# Ensure that we do not have excessive memory allocations
36
# (e.g., from type instabilities)
37
let
38
t = sol.t[end]
39
u_ode = sol.u[end]
40
du_ode = similar(u_ode)
41
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
42
end
43
end
44
45
@trixi_testset "DGMulti: elixir_navierstokes_convergence_curved.jl" begin
46
@test_trixi_include(joinpath(EXAMPLES_DIR, "dgmulti_3d",
47
"elixir_navierstokes_convergence_curved.jl"),
48
cells_per_dimension=(4, 4, 4), tspan=(0.0, 0.1),
49
l2=[
50
0.0014027227340680359,
51
0.0021322235583299425,
52
0.002787374145873934,
53
0.002458747307842109,
54
0.009978368214450204
55
],
56
linf=[
57
0.006341750448945582,
58
0.010306014425485621,
59
0.015207402553448324,
60
0.010968264060799426,
61
0.04745438898236998
62
])
63
# Ensure that we do not have excessive memory allocations
64
# (e.g., from type instabilities)
65
let
66
t = sol.t[end]
67
u_ode = sol.u[end]
68
du_ode = similar(u_ode)
69
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
70
end
71
end
72
73
@trixi_testset "DGMulti: elixir_navierstokes_taylor_green_vortex.jl" begin
74
@test_trixi_include(joinpath(EXAMPLES_DIR, "dgmulti_3d",
75
"elixir_navierstokes_taylor_green_vortex.jl"),
76
cells_per_dimension=(4, 4, 4), tspan=(0.0, 0.25),
77
l2=[
78
0.00018257125088549987,
79
0.015589736346235174,
80
0.015589736346235415,
81
0.021943924698669025,
82
0.019273688367502154
83
],
84
linf=[
85
0.0006268461326666142,
86
0.03218881686243058,
87
0.03218881686357877,
88
0.053872494644958,
89
0.05183811394229565
90
])
91
# Ensure that we do not have excessive memory allocations
92
# (e.g., from type instabilities)
93
let
94
t = sol.t[end]
95
u_ode = sol.u[end]
96
du_ode = similar(u_ode)
97
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
98
end
99
end
100
101
@trixi_testset "TreeMesh3D: elixir_navierstokes_convergence.jl" begin
102
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
103
"elixir_navierstokes_convergence.jl"),
104
initial_refinement_level=2, tspan=(0.0, 0.1),
105
l2=[
106
0.0019582188528520267,
107
0.002653449504302849,
108
0.002898264205184317,
109
0.0026534495043028534,
110
0.009511572365092744
111
],
112
linf=[
113
0.013680656759089693,
114
0.03569104501543785,
115
0.023526343547761893,
116
0.03569104501543733,
117
0.11482570604049513
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
@trixi_testset "TreeMesh3D: elixir_navierstokes_convergence.jl (isothermal walls)" begin
130
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
131
"elixir_navierstokes_convergence.jl"),
132
initial_refinement_level=2, tspan=(0.0, 0.1),
133
heat_bc_top_bottom=Isothermal((x, t, equations) -> Trixi.temperature(initial_condition_navier_stokes_convergence_test(x,
134
t,
135
equations),
136
equations)),
137
l2=[
138
0.001954686519653731,
139
0.0026554367897028506,
140
0.0028927304027240026,
141
0.0026554367897028437,
142
0.00959635179660988
143
],
144
linf=[
145
0.013680508110646583,
146
0.03567344635942522,
147
0.024024936779738822,
148
0.035673446359425674,
149
0.11839497110814179
150
])
151
# Ensure that we do not have excessive memory allocations
152
# (e.g., from type instabilities)
153
let
154
t = sol.t[end]
155
u_ode = sol.u[end]
156
du_ode = similar(u_ode)
157
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
158
end
159
end
160
161
@trixi_testset "TreeMesh3D: elixir_navierstokes_convergence.jl (Entropy gradient variables)" begin
162
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
163
"elixir_navierstokes_convergence.jl"),
164
initial_refinement_level=2, tspan=(0.0, 0.1),
165
gradient_variables=GradientVariablesEntropy(),
166
l2=[
167
0.0019770444875097737,
168
0.002652475094640119,
169
0.0029086003083239236,
170
0.002652475094640097,
171
0.009509568981441823
172
],
173
linf=[
174
0.013879361129145007,
175
0.035262606093049195,
176
0.02355419709739138,
177
0.03526260609304984,
178
0.11719963716518933
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 "TreeMesh3D: elixir_navierstokes_convergence.jl (Entropy gradient variables, isothermal walls)" begin
191
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
192
"elixir_navierstokes_convergence.jl"),
193
initial_refinement_level=2, tspan=(0.0, 0.1),
194
gradient_variables=GradientVariablesEntropy(),
195
heat_bc_top_bottom=Isothermal((x, t, equations) -> Trixi.temperature(initial_condition_navier_stokes_convergence_test(x,
196
t,
197
equations),
198
equations)),
199
l2=[
200
0.0019746314233993435,
201
0.0026547682591448896,
202
0.0029070310636460494,
203
0.0026547682591448922,
204
0.00958779288300152
205
],
206
linf=[
207
0.013879193801400458,
208
0.03524408452641245,
209
0.023986146220843566,
210
0.035244084526412915,
211
0.1200505651257302
212
])
213
# Ensure that we do not have excessive memory allocations
214
# (e.g., from type instabilities)
215
let
216
t = sol.t[end]
217
u_ode = sol.u[end]
218
du_ode = similar(u_ode)
219
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
220
end
221
end
222
223
@trixi_testset "TreeMesh3D: elixir_navierstokes_convergence.jl (flux differencing)" begin
224
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
225
"elixir_navierstokes_convergence.jl"),
226
initial_refinement_level=2, tspan=(0.0, 0.1),
227
volume_integral=VolumeIntegralFluxDifferencing(flux_central),
228
l2=[
229
0.0019582188528208754,
230
0.0026534495043017935,
231
0.002898264205195059,
232
0.0026534495043017917,
233
0.009511572364832972
234
],
235
linf=[
236
0.013680656758958687,
237
0.03569104501523916,
238
0.02352634354684648,
239
0.03569104501523987,
240
0.11482570603774533
241
])
242
# Ensure that we do not have excessive memory allocations
243
# (e.g., from type instabilities)
244
let
245
t = sol.t[end]
246
u_ode = sol.u[end]
247
du_ode = similar(u_ode)
248
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
249
end
250
end
251
252
@trixi_testset "TreeMesh3D: elixir_navierstokes_convergence.jl (Refined mesh)" begin
253
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
254
"elixir_navierstokes_convergence.jl"),
255
tspan=(0.0, 0.0))
256
LLID = Trixi.local_leaf_cells(mesh.tree)
257
num_leaves = length(LLID)
258
@assert num_leaves % 16 == 0
259
Trixi.refine!(mesh.tree, LLID[1:Int(num_leaves / 16)])
260
tspan = (0.0, 0.25)
261
semi = SemidiscretizationHyperbolicParabolic(mesh, (equations, equations_parabolic),
262
initial_condition, solver;
263
boundary_conditions = (boundary_conditions,
264
boundary_conditions_parabolic),
265
source_terms = source_terms_navier_stokes_convergence_test)
266
ode = semidiscretize(semi, tspan)
267
analysis_callback = AnalysisCallback(semi, interval = analysis_interval)
268
callbacks = CallbackSet(summary_callback, alive_callback, analysis_callback)
269
sol = solve(ode, RDPK3SpFSAL49(); abstol = time_int_tol, reltol = time_int_tol,
270
dt = 1e-5,
271
ode_default_options()..., callback = callbacks)
272
l2_error, linf_error = analysis_callback(sol)
273
@test l2_error
274
[0.00031093362536287433;
275
0.0006473493036800964;
276
0.0007705277238221976;
277
0.0006280517917194624;
278
0.0009039277899421355]
279
@test linf_error
280
[0.0023694155363713776;
281
0.01063493262248095;
282
0.006772070862041679;
283
0.010640551561807883;
284
0.019256819037817507]
285
# Ensure that we do not have excessive memory allocations
286
# (e.g., from type instabilities)
287
let
288
t = sol.t[end]
289
u_ode = sol.u[end]
290
du_ode = similar(u_ode)
291
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
292
end
293
end
294
295
@trixi_testset "TreeMesh3D: elixir_navierstokes_taylor_green_vortex.jl" begin
296
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
297
"elixir_navierstokes_taylor_green_vortex.jl"),
298
initial_refinement_level=2, tspan=(0.0, 0.25),
299
l2=[
300
0.00024173250389635442,
301
0.015684268393762454,
302
0.01568426839376248,
303
0.021991909545192333,
304
0.02825413672911425
305
],
306
linf=[
307
0.0008410587892853094,
308
0.04740176181772552,
309
0.04740176181772507,
310
0.07483494924031157,
311
0.150181591534448
312
])
313
# Ensure that we do not have excessive memory allocations
314
# (e.g., from type instabilities)
315
let
316
t = sol.t[end]
317
u_ode = sol.u[end]
318
du_ode = similar(u_ode)
319
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
320
end
321
end
322
323
@trixi_testset "TreeMesh3D: elixir_navierstokes_taylor_green_vortex.jl (Refined mesh)" begin
324
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
325
"elixir_navierstokes_taylor_green_vortex.jl"),
326
tspan=(0.0, 0.0))
327
LLID = Trixi.local_leaf_cells(mesh.tree)
328
num_leaves = length(LLID)
329
@assert num_leaves % 32 == 0
330
Trixi.refine!(mesh.tree, LLID[1:Int(num_leaves / 32)])
331
tspan = (0.0, 0.1)
332
semi = SemidiscretizationHyperbolicParabolic(mesh, (equations, equations_parabolic),
333
initial_condition, solver)
334
ode = semidiscretize(semi, tspan)
335
analysis_callback = AnalysisCallback(semi, interval = analysis_interval,
336
save_analysis = true,
337
extra_analysis_integrals = (energy_kinetic,
338
energy_internal,
339
enstrophy))
340
callbacks = CallbackSet(summary_callback, alive_callback, analysis_callback)
341
# Use CarpenterKennedy2N54 since `RDPK3SpFSAL49` gives slightly different results on different machines
342
sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false);
343
dt = 5e-3,
344
ode_default_options()..., callback = callbacks)
345
l2_error, linf_error = analysis_callback(sol)
346
@test l2_error [
347
7.314319856736271e-5,
348
0.006266480163542894,
349
0.006266489911815533,
350
0.008829222305770226,
351
0.0032859166842329228
352
]
353
@test linf_error [
354
0.0002943968186086554,
355
0.013876261980614757,
356
0.013883619864959451,
357
0.025201279960491936,
358
0.018679364985388247
359
]
360
# Ensure that we do not have excessive memory allocations
361
# (e.g., from type instabilities)
362
let
363
t = sol.t[end]
364
u_ode = sol.u[end]
365
du_ode = similar(u_ode)
366
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 100
367
@test (@allocated Trixi.rhs_parabolic!(du_ode, u_ode, semi, t)) < 100
368
end
369
end
370
371
@trixi_testset "P4estMesh3D: elixir_navierstokes_convergence.jl" begin
372
@test_trixi_include(joinpath(EXAMPLES_DIR, "p4est_3d_dgsem",
373
"elixir_navierstokes_convergence.jl"),
374
initial_refinement_level=2, tspan=(0.0, 0.1),
375
l2=[
376
0.00026599105557723507,
377
0.00046187779448444603,
378
0.0005424899076194272,
379
0.00046187779448445546,
380
0.0015846392584275121
381
],
382
linf=[
383
0.0025241668964857134,
384
0.006308461684409397,
385
0.004334939668473314,
386
0.006308461684396753,
387
0.03176343483364796
388
])
389
# Ensure that we do not have excessive memory allocations
390
# (e.g., from type instabilities)
391
let
392
t = sol.t[end]
393
u_ode = sol.u[end]
394
du_ode = similar(u_ode)
395
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
396
end
397
end
398
399
@trixi_testset "P4estMesh3D: elixir_navierstokes_taylor_green_vortex.jl" begin
400
@test_trixi_include(joinpath(EXAMPLES_DIR, "p4est_3d_dgsem",
401
"elixir_navierstokes_taylor_green_vortex.jl"),
402
initial_refinement_level=2, tspan=(0.0, 0.25),
403
surface_flux=FluxHLL(min_max_speed_naive),
404
l2=[
405
0.0001547509861140407,
406
0.015637861347119624,
407
0.015637861347119687,
408
0.022024699158522523,
409
0.009711013505930812
410
],
411
linf=[
412
0.0006696415247340326,
413
0.03442565722527785,
414
0.03442565722577423,
415
0.06295407168705314,
416
0.032857472756916195
417
])
418
# Ensure that we do not have excessive memory allocations
419
# (e.g., from type instabilities)
420
let
421
t = sol.t[end]
422
u_ode = sol.u[end]
423
du_ode = similar(u_ode)
424
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
425
end
426
end
427
428
@trixi_testset "TreeMesh3D: elixir_advection_diffusion_amr.jl" begin
429
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
430
"elixir_advection_diffusion_amr.jl"),
431
initial_refinement_level=2,
432
base_level=2,
433
med_level=3,
434
max_level=4,
435
l2=[0.0003687746805397333],
436
linf=[0.0015844326511498252])
437
# Ensure that we do not have excessive memory allocations
438
# (e.g., from type instabilities)
439
let
440
t = sol.t[end]
441
u_ode = sol.u[end]
442
du_ode = similar(u_ode)
443
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
444
end
445
end
446
447
@trixi_testset "TreeMesh3D: elixir_advection_diffusion_amr.jl (LDG)" begin
448
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
449
"elixir_advection_diffusion_amr.jl"),
450
solver_parabolic=ViscousFormulationLocalDG(),
451
initial_refinement_level=2,
452
base_level=2,
453
med_level=3,
454
max_level=4,
455
l2=[0.00036862382924645736],
456
linf=[0.0015952118405399007])
457
# Ensure that we do not have excessive memory allocations
458
# (e.g., from type instabilities)
459
let
460
t = sol.t[end]
461
u_ode = sol.u[end]
462
du_ode = similar(u_ode)
463
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
464
end
465
end
466
467
@trixi_testset "TreeMesh3D: elixir_advection_diffusion_nonperiodic.jl" begin
468
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
469
"elixir_advection_diffusion_nonperiodic.jl"),
470
l2=[0.0009808996243280868],
471
linf=[0.01732621559135459])
472
# Ensure that we do not have excessive memory allocations
473
# (e.g., from type instabilities)
474
let
475
t = sol.t[end]
476
u_ode = sol.u[end]
477
du_ode = similar(u_ode)
478
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
479
end
480
end
481
482
@trixi_testset "TreeMesh3D: elixir_advection_diffusion_nonperiodic.jl (LDG)" begin
483
@test_trixi_include(joinpath(EXAMPLES_DIR, "tree_3d_dgsem",
484
"elixir_advection_diffusion_nonperiodic.jl"),
485
solver_parabolic=ViscousFormulationLocalDG(),
486
l2=[0.0009432415534931421], linf=[0.016955330290404563])
487
# Ensure that we do not have excessive memory allocations
488
# (e.g., from type instabilities)
489
let
490
t = sol.t[end]
491
u_ode = sol.u[end]
492
du_ode = similar(u_ode)
493
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
494
end
495
end
496
497
@trixi_testset "P4estMesh3D: elixir_navierstokes_taylor_green_vortex_amr.jl" begin
498
@test_trixi_include(joinpath(EXAMPLES_DIR, "p4est_3d_dgsem",
499
"elixir_navierstokes_taylor_green_vortex_amr.jl"),
500
initial_refinement_level=0,
501
max_level=2,
502
tspan=(0.0, 0.1),
503
l2=[
504
0.001106911564430018,
505
0.013872454764036899,
506
0.013872454764036934,
507
0.012060120516483785,
508
0.14491994688373158
509
],
510
linf=[
511
0.004408900465271981,
512
0.05154019951528149,
513
0.05154019951517075,
514
0.035283556918085636,
515
0.6804797525555557
516
])
517
# Ensure that we do not have excessive memory allocations
518
# (e.g., from type instabilities)
519
let
520
t = sol.t[end]
521
u_ode = sol.u[end]
522
du_ode = similar(u_ode)
523
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
524
end
525
end
526
527
@trixi_testset "P4estMesh3D: elixir_navierstokes_blast_wave_amr.jl" begin
528
@test_trixi_include(joinpath(EXAMPLES_DIR, "p4est_3d_dgsem",
529
"elixir_navierstokes_blast_wave_amr.jl"),
530
tspan=(0.0, 0.01),
531
l2=[
532
0.009472104410520866, 0.0017883742549557149,
533
0.0017883742549557147, 0.0017883742549557196,
534
0.024388540048562748
535
],
536
linf=[
537
0.6782397526873181, 0.17663702154066238,
538
0.17663702154066266, 0.17663702154066238, 1.7327849844825238
539
])
540
# Ensure that we do not have excessive memory allocations
541
# (e.g., from type instabilities)
542
let
543
t = sol.t[end]
544
u_ode = sol.u[end]
545
du_ode = similar(u_ode)
546
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
547
end
548
end
549
550
@trixi_testset "P4estMesh3D: elixir_navierstokes_viscous_shock.jl" begin
551
@test_trixi_include(joinpath(EXAMPLES_DIR, "p4est_3d_dgsem",
552
"elixir_navierstokes_viscous_shock.jl"),
553
l2=[
554
0.0002576235461250765,
555
0.0001433693418567713,
556
1.5583069105517042e-16,
557
1.257551423107977e-16,
558
0.00017369872990116004
559
],
560
linf=[
561
0.0016731930282756213,
562
0.0010638586882356638,
563
2.738015991633e-15,
564
3.281831854493919e-15,
565
0.0011495231318404686
566
])
567
# Ensure that we do not have excessive memory allocations
568
# (e.g., from type instabilities)
569
let
570
t = sol.t[end]
571
u_ode = sol.u[end]
572
du_ode = similar(u_ode)
573
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
574
end
575
end
576
577
@trixi_testset "P4estMesh3D: elixir_navierstokes_viscous_shock_dirichlet_bc.jl" begin
578
@test_trixi_include(joinpath(EXAMPLES_DIR, "p4est_3d_dgsem",
579
"elixir_navierstokes_viscous_shock_dirichlet_bc.jl"),
580
l2=[
581
0.0002576236289909761,
582
0.00014336952925040063,
583
1.446929414778897e-16,
584
1.1843685819074592e-16,
585
0.00017369912976070335
586
],
587
linf=[
588
0.0016731934566309725,
589
0.0010638647433908188,
590
2.9923988317619584e-15,
591
3.501658589636682e-15,
592
0.0011495334919645606
593
])
594
# Ensure that we do not have excessive memory allocations
595
# (e.g., from type instabilities)
596
let
597
t = sol.t[end]
598
u_ode = sol.u[end]
599
du_ode = similar(u_ode)
600
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
601
end
602
end
603
604
@trixi_testset "P4estMesh3D: elixir_navierstokes_crm.jl" begin
605
@test_trixi_include(joinpath(EXAMPLES_DIR, "p4est_3d_dgsem",
606
"elixir_navierstokes_crm.jl"),
607
l2=[
608
2.2353998537135728e-10,
609
6.438639847871375e-8,
610
4.8159768090963756e-8,
611
6.287534321002294e-8,
612
7.596958320246443e-5
613
],
614
linf=[
615
0.36753460935979454,
616
209.1460932734352,
617
51.3036359192352,
618
41.461135962058904,
619
113004.3158457772
620
],
621
tspan=(0.0, 1e-10))
622
# Ensure that we do not have excessive memory allocations
623
# (e.g., from type instabilities)
624
let
625
t = sol.t[end]
626
u_ode = sol.u[end]
627
du_ode = similar(u_ode)
628
@test (@allocated Trixi.rhs!(du_ode, u_ode, semi, t)) < 1000
629
end
630
end
631
end
632
633
# Clean up afterwards: delete Trixi.jl output directory
634
@test_nowarn isdir(outdir) && rm(outdir, recursive = true)
635
636
end # module
637
638