Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/src/equations/laplace_diffusion_entropy_variables.jl
2055 views
1
@doc raw"""
2
LaplaceDiffusionEntropyVariables1D(equations)
3
LaplaceDiffusionEntropyVariables2D(equations)
4
LaplaceDiffusionEntropyVariables3D(equations)
5
6
This represent a symmetrized Laplacian diffusion
7
``\nabla \cdot (\kappa\frac{\partial u}{\partial w}\nabla w(u)))``,
8
where ``w(u)`` denotes the mapping between conservative and entropy variables.
9
Compared with `LaplaceDiffusion` (see [`LaplaceDiffusion1D`](@ref),
10
[`LaplaceDiffusion2D`](@ref), and [`LaplaceDiffusion3D`](@ref)), `LaplaceDiffusionEntropyVariables` is
11
guaranteed to dissipate entropy.
12
"""
13
struct LaplaceDiffusionEntropyVariables{NDIMS, E, N, T} <:
14
AbstractLaplaceDiffusion{NDIMS, N}
15
diffusivity::T
16
equations_hyperbolic::E
17
end
18
19
function varnames(variable_mapping, equations_parabolic::LaplaceDiffusionEntropyVariables)
20
varnames(variable_mapping, equations_parabolic.equations_hyperbolic)
21
end
22
23
function gradient_variable_transformation(::LaplaceDiffusionEntropyVariables)
24
cons2entropy
25
end
26
27
function cons2entropy(u, equations::LaplaceDiffusionEntropyVariables)
28
cons2entropy(u, equations.equations_hyperbolic)
29
end
30
31
function entropy2cons(w, equations::LaplaceDiffusionEntropyVariables)
32
entropy2cons(w, equations.equations_hyperbolic)
33
end
34
35
# This is used to compute the diffusivity tensor for LaplaceDiffusionEntropyVariables.
36
# This is the generic fallback using AD (assuming entropy2cons exists)
37
function jacobian_entropy2cons(w, equations)
38
return equations.diffusivity * ForwardDiff.jacobian(w -> entropy2cons(w, equations), w)
39
end
40
41
# Dirichlet and Neumann boundary conditions for use with parabolic solvers in weak form.
42
# Note that these are general, so they apply to LaplaceDiffusionEntropyVariables in any
43
# spatial dimension.
44
@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,
45
normal::AbstractVector,
46
x, t,
47
operator_type::Gradient,
48
equations_parabolic::LaplaceDiffusionEntropyVariables)
49
return boundary_condition.boundary_value_function(x, t, equations_parabolic)
50
end
51
52
@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,
53
normal::AbstractVector,
54
x, t,
55
operator_type::Divergence,
56
equations_parabolic::LaplaceDiffusionEntropyVariables)
57
return flux_inner
58
end
59
60
@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,
61
normal::AbstractVector,
62
x, t,
63
operator_type::Divergence,
64
equations_parabolic::LaplaceDiffusionEntropyVariables)
65
return boundary_condition.boundary_normal_flux_function(x, t, equations_parabolic)
66
end
67
68
@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,
69
normal::AbstractVector,
70
x, t,
71
operator_type::Gradient,
72
equations_parabolic::LaplaceDiffusionEntropyVariables)
73
return flux_inner
74
end
75
76