Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/examples/tree_3d_dgsem/elixir_hypdiff_lax_friedrichs.jl
2055 views
1
using Trixi
2
3
###############################################################################
4
# semidiscretization of the hyperbolic diffusion equations
5
6
equations = HyperbolicDiffusionEquations3D()
7
8
function initial_condition_poisson_periodic(x, t, equations::HyperbolicDiffusionEquations3D)
9
# elliptic equation: -νΔϕ = f
10
# depending on initial constant state, c, for phi this converges to the solution ϕ + c
11
if iszero(t)
12
phi = 0.0
13
q1 = 0.0
14
q2 = 0.0
15
q3 = 0.0
16
else
17
phi = sin(2 * pi * x[1]) * sin(2 * pi * x[2]) * sin(2 * pi * x[3])
18
q1 = 2 * pi * cos(2 * pi * x[1]) * sin(2 * pi * x[2]) * sin(2 * pi * x[3])
19
q2 = 2 * pi * sin(2 * pi * x[1]) * cos(2 * pi * x[2]) * sin(2 * pi * x[3])
20
q3 = 2 * pi * sin(2 * pi * x[1]) * sin(2 * pi * x[2]) * cos(2 * pi * x[3])
21
end
22
return SVector(phi, q1, q2, q3)
23
end
24
initial_condition = initial_condition_poisson_periodic
25
26
@inline function source_terms_poisson_periodic(u, x, t,
27
equations::HyperbolicDiffusionEquations3D)
28
# elliptic equation: -νΔϕ = f
29
# analytical solution: phi = sin(2πx)*sin(2πy) and f = -8νπ^2 sin(2πx)*sin(2πy)
30
@unpack inv_Tr = equations
31
C = -12 * equations.nu * pi^2
32
33
x1, x2, x3 = x
34
tmp1 = sinpi(2 * x1)
35
tmp2 = sinpi(2 * x2)
36
tmp3 = sinpi(2 * x3)
37
du1 = -C * tmp1 * tmp2 * tmp3
38
du2 = -inv_Tr * u[2]
39
du3 = -inv_Tr * u[3]
40
du4 = -inv_Tr * u[4]
41
42
return SVector(du1, du2, du3, du4)
43
end
44
45
solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs)
46
47
coordinates_min = (0.0, 0.0, 0.0)
48
coordinates_max = (1.0, 1.0, 1.0)
49
mesh = TreeMesh(coordinates_min, coordinates_max,
50
initial_refinement_level = 3,
51
n_cells_max = 30_000)
52
53
semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,
54
source_terms = source_terms_poisson_periodic)
55
56
###############################################################################
57
# ODE solvers, callbacks etc.
58
59
tspan = (0.0, 2.0)
60
ode = semidiscretize(semi, tspan)
61
62
summary_callback = SummaryCallback()
63
64
resid_tol = 5.0e-12
65
steady_state_callback = SteadyStateCallback(abstol = resid_tol, reltol = 0.0)
66
67
analysis_interval = 200
68
analysis_callback = AnalysisCallback(semi, interval = analysis_interval,
69
extra_analysis_integrals = (entropy, energy_total))
70
71
alive_callback = AliveCallback(analysis_interval = analysis_interval)
72
73
save_solution = SaveSolutionCallback(interval = 100,
74
save_initial_solution = true,
75
save_final_solution = true,
76
solution_variables = cons2prim)
77
78
stepsize_callback = StepsizeCallback(cfl = 2.4)
79
80
callbacks = CallbackSet(summary_callback, steady_state_callback,
81
analysis_callback, alive_callback,
82
save_solution,
83
stepsize_callback)
84
85
###############################################################################
86
# run the simulation
87
88
sol = Trixi.solve(ode, Trixi.HypDiffN3Erk3Sstar52();
89
dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
90
ode_default_options()..., callback = callbacks);
91
92