Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/examples/dgmulti_1d/elixir_euler_modified_sod.jl
5586 views
1
using OrdinaryDiffEqSSPRK
2
using Trixi
3
4
surface_flux = FluxPlusDissipation(flux_ranocha, DissipationMatrixWintersEtal())
5
volume_flux = flux_ranocha
6
dg = DGMulti(polydeg = 3, element_type = Line(), approximation_type = SBP(),
7
surface_integral = SurfaceIntegralWeakForm(surface_flux),
8
volume_integral = VolumeIntegralFluxDifferencing(volume_flux))
9
10
equations = CompressibleEulerEquations1D(1.4)
11
12
"""
13
initial_condition_modified_sod(x, t, equations::CompressibleEulerEquations1D)
14
15
Modified Sod shock tube problem, presented in Section 6.4 of Toro's book.
16
This problem consists of a left sonic rarefaction wave and is useful for testing whether numerical solutions
17
violate the entropy condition.
18
An entropy-satisfying solution should produce a smooth(!) rarefaction wave.
19
20
## References
21
- Toro (2009).
22
Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction, 3rd Edition.
23
[DOI: 10.1007/b79761](https://doi.org/10.1007/b79761)
24
25
- Lin, Chan (2014)
26
High order entropy stable discontinuous Galerkin spectral element methods through subcell limiting
27
[DOI: 10.1016/j.jcp.2023.112677](https://doi.org/10.1016/j.jcp.2023.112677)
28
"""
29
function initial_condition_modified_sod(x, t, ::CompressibleEulerEquations1D)
30
if x[1] < 0.3
31
return prim2cons(SVector(1, 0.75, 1), equations)
32
else
33
return prim2cons(SVector(0.125, 0.0, 0.1), equations)
34
end
35
end
36
37
initial_condition = initial_condition_modified_sod
38
39
cells_per_dimension = (50,)
40
mesh = DGMultiMesh(dg, cells_per_dimension,
41
coordinates_min = (0.0,), coordinates_max = (1.0,), periodicity = false)
42
semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg;
43
boundary_conditions = boundary_condition_periodic)
44
45
tspan = (0.0, 0.2)
46
ode = semidiscretize(semi, tspan)
47
48
summary_callback = SummaryCallback()
49
alive_callback = AliveCallback(alive_interval = 100)
50
analysis_interval = 1000
51
analysis_callback = AnalysisCallback(semi, interval = analysis_interval, uEltype = real(dg))
52
callbacks = CallbackSet(summary_callback,
53
analysis_callback,
54
alive_callback)
55
56
###############################################################################
57
# run the simulation
58
59
sol = solve(ode, SSPRK43(); adaptive = false,
60
dt = 0.5 * estimate_dt(mesh, dg),
61
ode_default_options()...,
62
callback = callbacks);
63
64