Path: blob/main/src/equations/linear_diffusion_equation_2d.jl
5586 views
# By default, Julia/LLVM does not use fused multiply-add operations (FMAs).1# Since these FMAs can increase the performance of many numerical algorithms,2# we need to opt-in explicitly.3# See https://ranocha.de/blog/Optimizing_EC_Trixi for further details.4@muladd begin5#! format: noindent67@doc raw"""8LinearDiffusionEquation2D(diffusivity)910The linear diffusion equation (or heat equation) in two space dimensions with constant `diffusivity` ``\kappa``:11```math12\partial_t u = \partial_1 \left( \kappa \partial_1 u \right)13+ \partial_2 \left( \kappa \partial_2 u \right).14```15Unlike [`LaplaceDiffusion2D`](@ref), which represents the parabolic part of a16hyperbolic-parabolic equation, `LinearDiffusionEquation2D` represents a purely parabolic17equation without any hyperbolic part.18"""19struct LinearDiffusionEquation2D{RealT <: Real} <: AbstractLaplaceDiffusion{2, 1}20diffusivity::RealT21end2223varnames(::typeof(cons2cons), ::LinearDiffusionEquation2D) = ("scalar",)24varnames(::typeof(cons2prim), ::LinearDiffusionEquation2D) = ("scalar",)25varnames(::typeof(cons2entropy), ::LinearDiffusionEquation2D) = ("scalar",)2627@inline cons2prim(u, equations::LinearDiffusionEquation2D) = u28@inline cons2entropy(u, equations::LinearDiffusionEquation2D) = u2930@inline entropy(u::Real, ::LinearDiffusionEquation2D) = 0.5f0 * u^231@inline entropy(u, equations::LinearDiffusionEquation2D) = entropy(u[1], equations)3233@inline function flux(u, gradients, orientation::Integer,34equations::LinearDiffusionEquation2D)35dudx, dudy = gradients36if orientation == 137return SVector(equations.diffusivity * dudx)38else # if orientation == 239return SVector(equations.diffusivity * dudy)40end41end42end # @muladd434445