Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/examples/structured_1d_dgsem/elixir_linearizedeuler_characteristic_system.jl
2802 views
1
using OrdinaryDiffEqLowStorageRK
2
using LinearAlgebra: dot
3
using Trixi
4
5
###############################################################################
6
# semidiscretization of the linearized Euler equations
7
8
rho_0 = 1.0
9
v_0 = 1.0
10
c_0 = 1.0
11
equations = LinearizedEulerEquations1D(rho_0, v_0, c_0)
12
13
solver = DGSEM(polydeg = 3, surface_flux = flux_hll)
14
15
coordinates_min = (0.0,) # minimum coordinate
16
coordinates_max = (1.0,) # maximum coordinate
17
cells_per_dimension = (64,)
18
19
mesh = StructuredMesh(cells_per_dimension, coordinates_min, coordinates_max,
20
periodicity = true)
21
22
# For eigensystem of the linearized Euler equations see e.g.
23
# https://www.nas.nasa.gov/assets/nas/pdf/ams/2018/introtocfd/Intro2CFD_Lecture1_Pulliam_Euler_WaveEQ.pdf
24
# Linearized Euler: Eigensystem
25
lin_euler_eigvals = [v_0 - c_0; v_0; v_0 + c_0]
26
lin_euler_eigvecs = [-rho_0/c_0 1 rho_0/c_0;
27
1 0 1;
28
-rho_0*c_0 0 rho_0*c_0]
29
lin_euler_eigvecs_inv = inv(lin_euler_eigvecs)
30
31
# Trace back characteristics.
32
# See https://metaphor.ethz.ch/x/2019/hs/401-4671-00L/literature/mishra_hyperbolic_pdes.pdf, p.95
33
function compute_char_initial_pos(x, t)
34
return SVector(x[1], x[1], x[1]) .- t * lin_euler_eigvals
35
end
36
37
function compute_primal_sol(char_vars)
38
return lin_euler_eigvecs * char_vars
39
end
40
41
# Initial condition is in principle arbitrary, only periodicity is required
42
function initial_condition_entropy_wave(x, t, equations::LinearizedEulerEquations1D)
43
# Parameters
44
alpha = 1.0
45
beta = 150.0
46
center = 0.5
47
48
rho_prime = alpha * exp(-beta * (x[1] - center)^2)
49
v_prime = 0.0
50
p_prime = 0.0
51
52
return SVector(rho_prime, v_prime, p_prime)
53
end
54
55
function initial_condition_char_vars(x, t, equations::LinearizedEulerEquations1D)
56
# Trace back characteristics
57
x_char = compute_char_initial_pos(x, t)
58
59
# Employ periodicity
60
for p in 1:3
61
while x_char[p] < coordinates_min[1]
62
x_char[p] += coordinates_max[1] - coordinates_min[1]
63
end
64
while x_char[p] > coordinates_max[1]
65
x_char[p] -= coordinates_max[1] - coordinates_min[1]
66
end
67
end
68
69
# Set up characteristic variables
70
w = zeros(3)
71
t_0 = 0 # Assumes t_0 = 0
72
for p in 1:3
73
u_char = initial_condition_entropy_wave(x_char[p], t_0, equations)
74
w[p] = dot(lin_euler_eigvecs_inv[p, :], u_char)
75
end
76
77
return compute_primal_sol(w)
78
end
79
80
initial_condition = initial_condition_char_vars
81
82
semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver;
83
boundary_conditions = boundary_condition_periodic)
84
85
###############################################################################
86
# ODE solvers, callbacks etc.
87
88
tspan = (0.0, 0.3)
89
ode = semidiscretize(semi, tspan)
90
91
summary_callback = SummaryCallback()
92
93
analysis_interval = 100
94
analysis_callback = AnalysisCallback(semi, interval = analysis_interval)
95
96
alive_callback = AliveCallback(analysis_interval = analysis_interval)
97
98
stepsize_callback = StepsizeCallback(cfl = 1.0)
99
100
# Create a CallbackSet to collect all callbacks such that they can be passed to the ODE solver
101
callbacks = CallbackSet(summary_callback, analysis_callback, alive_callback,
102
stepsize_callback)
103
104
###############################################################################
105
# run the simulation
106
107
sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false);
108
dt = 1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
109
ode_default_options()..., callback = callbacks);
110
111