Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/src/equations/inviscid_burgers_1d.jl
2831 views
1
# By default, Julia/LLVM does not use fused multiply-add operations (FMAs).
2
# Since these FMAs can increase the performance of many numerical algorithms,
3
# we need to opt-in explicitly.
4
# See https://ranocha.de/blog/Optimizing_EC_Trixi for further details.
5
@muladd begin
6
#! format: noindent
7
8
@doc raw"""
9
InviscidBurgersEquation1D
10
11
The inviscid Burgers' equation
12
```math
13
\partial_t u + \frac{1}{2} \partial_1 u^2 = 0
14
```
15
in one space dimension.
16
"""
17
struct InviscidBurgersEquation1D <: AbstractInviscidBurgersEquation{1, 1} end
18
19
varnames(::typeof(cons2cons), ::InviscidBurgersEquation1D) = ("scalar",)
20
varnames(::typeof(cons2prim), ::InviscidBurgersEquation1D) = ("scalar",)
21
22
# Set initial conditions at physical location `x` for time `t`
23
"""
24
initial_condition_constant(x, t, equations::InviscidBurgersEquation1D)
25
26
A constant initial condition to test free-stream preservation.
27
"""
28
function initial_condition_constant(x, t, equation::InviscidBurgersEquation1D)
29
RealT = eltype(x)
30
return SVector(RealT(2))
31
end
32
33
"""
34
initial_condition_convergence_test(x, t, equations::InviscidBurgersEquation1D)
35
36
A smooth initial condition used for convergence tests.
37
"""
38
function initial_condition_convergence_test(x, t, equation::InviscidBurgersEquation1D)
39
RealT = eltype(x)
40
c = 2
41
A = 1
42
L = 1
43
f = 1.0f0 / L
44
omega = 2 * convert(RealT, pi) * f
45
scalar = c + A * sin(omega * (x[1] - t))
46
47
return SVector(scalar)
48
end
49
50
"""
51
source_terms_convergence_test(u, x, t, equations::InviscidBurgersEquation1D)
52
53
Source terms used for convergence tests in combination with
54
[`initial_condition_convergence_test`](@ref).
55
56
References for the method of manufactured solutions (MMS):
57
- Kambiz Salari and Patrick Knupp (2000)
58
Code Verification by the Method of Manufactured Solutions
59
[DOI: 10.2172/759450](https://doi.org/10.2172/759450)
60
- Patrick J. Roache (2002)
61
Code Verification by the Method of Manufactured Solutions
62
[DOI: 10.1115/1.1436090](https://doi.org/10.1115/1.1436090)
63
"""
64
@inline function source_terms_convergence_test(u, x, t,
65
equations::InviscidBurgersEquation1D)
66
# Same settings as in `initial_condition`
67
RealT = eltype(x)
68
c = 2
69
A = 1
70
L = 1
71
f = 1.0f0 / L
72
omega = 2 * convert(RealT, pi) * f
73
du = omega * A * cos(omega * (x[1] - t)) * (c - 1 + A * sin(omega * (x[1] - t)))
74
75
return SVector(du)
76
end
77
78
# Calculate 1D flux for a single point
79
@inline function flux(u, orientation::Integer, equation::InviscidBurgersEquation1D)
80
return SVector(0.5f0 * u[1]^2)
81
end
82
83
# Calculate maximum wave speed for local Lax-Friedrichs-type dissipation
84
@inline function max_abs_speed_naive(u_ll, u_rr, orientation::Integer,
85
equations::InviscidBurgersEquation1D)
86
u_L = u_ll[1]
87
u_R = u_rr[1]
88
89
return max(abs(u_L), abs(u_R))
90
end
91
92
# Calculate minimum and maximum wave speeds for HLL-type fluxes
93
@inline function min_max_speed_naive(u_ll, u_rr, orientation::Integer,
94
equations::InviscidBurgersEquation1D)
95
u_L = u_ll[1]
96
u_R = u_rr[1]
97
98
λ_min = min(u_L, u_R)
99
λ_max = max(u_L, u_R)
100
101
return λ_min, λ_max
102
end
103
104
@inline function max_abs_speeds(u, equation::InviscidBurgersEquation1D)
105
return (abs(u[1]),)
106
end
107
108
@doc raw"""
109
flux_ec(u_ll, u_rr, orientation, equations::InviscidBurgersEquation1D)
110
111
Entropy-conserving, symmetric flux for the inviscid Burgers' equation.
112
```math
113
F(u_L, u_R) = \frac{u_L^2 + u_L u_R + u_R^2}{6}
114
```
115
"""
116
function flux_ec(u_ll, u_rr, orientation, equation::InviscidBurgersEquation1D)
117
u_L = u_ll[1]
118
u_R = u_rr[1]
119
120
return SVector((u_L^2 + u_L * u_R + u_R^2) / 6)
121
end
122
123
"""
124
flux_godunov(u_ll, u_rr, orientation, equations::InviscidBurgersEquation1D)
125
126
Godunov (upwind) numerical flux for the inviscid Burgers' equation.
127
See https://metaphor.ethz.ch/x/2019/hs/401-4671-00L/literature/mishra_hyperbolic_pdes.pdf ,
128
section 4.1.5 and especially equation (4.16).
129
"""
130
function flux_godunov(u_ll, u_rr, orientation, equation::InviscidBurgersEquation1D)
131
u_L = u_ll[1]
132
u_R = u_rr[1]
133
134
return SVector(0.5f0 * max(max(u_L, 0)^2, min(u_R, 0)^2))
135
end
136
137
# See https://metaphor.ethz.ch/x/2019/hs/401-4671-00L/literature/mishra_hyperbolic_pdes.pdf ,
138
# section 4.2.5 and especially equation (4.34).
139
function flux_engquist_osher(u_ll, u_rr, orientation,
140
equation::InviscidBurgersEquation1D)
141
u_L = u_ll[1]
142
u_R = u_rr[1]
143
144
return SVector(0.5f0 * (max(u_L, 0)^2 + min(u_R, 0)^2))
145
end
146
147
"""
148
splitting_lax_friedrichs(u, orientation::Integer,
149
equations::InviscidBurgersEquation1D)
150
splitting_lax_friedrichs(u, which::Union{Val{:minus}, Val{:plus}}
151
orientation::Integer,
152
equations::InviscidBurgersEquation1D)
153
154
Naive local Lax-Friedrichs style flux splitting of the form `f⁺ = 0.5 (f + λ u)`
155
and `f⁻ = 0.5 (f - λ u)` where `λ = abs(u)`.
156
157
Returns a tuple of the fluxes "minus" (associated with waves going into the
158
negative axis direction) and "plus" (associated with waves going into the
159
positive axis direction). If only one of the fluxes is required, use the
160
function signature with argument `which` set to `Val{:minus}()` or `Val{:plus}()`.
161
162
!!! warning "Experimental implementation (upwind SBP)"
163
This is an experimental feature and may change in future releases.
164
"""
165
@inline function splitting_lax_friedrichs(u, orientation::Integer,
166
equations::InviscidBurgersEquation1D)
167
fm = splitting_lax_friedrichs(u, Val{:minus}(), orientation, equations)
168
fp = splitting_lax_friedrichs(u, Val{:plus}(), orientation, equations)
169
return fm, fp
170
end
171
172
@inline function splitting_lax_friedrichs(u, ::Val{:plus}, orientation::Integer,
173
equations::InviscidBurgersEquation1D)
174
f = 0.5f0 * u[1]^2
175
lambda = abs(u[1])
176
return SVector(0.5f0 * (f + lambda * u[1]))
177
end
178
179
@inline function splitting_lax_friedrichs(u, ::Val{:minus}, orientation::Integer,
180
equations::InviscidBurgersEquation1D)
181
f = 0.5f0 * u[1]^2
182
lambda = abs(u[1])
183
return SVector(0.5f0 * (f - lambda * u[1]))
184
end
185
186
# Convert conservative variables to primitive
187
@inline cons2prim(u, equation::InviscidBurgersEquation1D) = u
188
189
# Convert conservative variables to entropy variables
190
@inline cons2entropy(u, equation::InviscidBurgersEquation1D) = u
191
@inline entropy2cons(u, equation::InviscidBurgersEquation1D) = u
192
193
@doc raw"""
194
entropy(u, equations::InviscidBurgersEquation1D)
195
196
Calculate entropy for a conservative state `u` as
197
```math
198
S(u) = \frac{1}{2} u^2
199
```
200
"""
201
@inline entropy(u::Real, ::InviscidBurgersEquation1D) = 0.5f0 * u^2
202
@inline entropy(u, equation::InviscidBurgersEquation1D) = entropy(u[1], equation)
203
204
# Calculate total energy for a conservative state `u`
205
@inline energy_total(u::Real, ::InviscidBurgersEquation1D) = 0.5f0 * u^2
206
@inline function energy_total(u, equation::InviscidBurgersEquation1D)
207
return energy_total(u[1], equation)
208
end
209
end # @muladd
210
211