|
| 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 |
0 commit comments