Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/src/equations/linear_diffusion_equation_2d.jl
5586 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
LinearDiffusionEquation2D(diffusivity)
10
11
The linear diffusion equation (or heat equation) in two space dimensions with constant `diffusivity` ``\kappa``:
12
```math
13
\partial_t u = \partial_1 \left( \kappa \partial_1 u \right)
14
+ \partial_2 \left( \kappa \partial_2 u \right).
15
```
16
Unlike [`LaplaceDiffusion2D`](@ref), which represents the parabolic part of a
17
hyperbolic-parabolic equation, `LinearDiffusionEquation2D` represents a purely parabolic
18
equation without any hyperbolic part.
19
"""
20
struct LinearDiffusionEquation2D{RealT <: Real} <: AbstractLaplaceDiffusion{2, 1}
21
diffusivity::RealT
22
end
23
24
varnames(::typeof(cons2cons), ::LinearDiffusionEquation2D) = ("scalar",)
25
varnames(::typeof(cons2prim), ::LinearDiffusionEquation2D) = ("scalar",)
26
varnames(::typeof(cons2entropy), ::LinearDiffusionEquation2D) = ("scalar",)
27
28
@inline cons2prim(u, equations::LinearDiffusionEquation2D) = u
29
@inline cons2entropy(u, equations::LinearDiffusionEquation2D) = u
30
31
@inline entropy(u::Real, ::LinearDiffusionEquation2D) = 0.5f0 * u^2
32
@inline entropy(u, equations::LinearDiffusionEquation2D) = entropy(u[1], equations)
33
34
@inline function flux(u, gradients, orientation::Integer,
35
equations::LinearDiffusionEquation2D)
36
dudx, dudy = gradients
37
if orientation == 1
38
return SVector(equations.diffusivity * dudx)
39
else # if orientation == 2
40
return SVector(equations.diffusivity * dudy)
41
end
42
end
43
end # @muladd
44
45