Path: blob/main/src/equations/laplace_diffusion_entropy_variables.jl
2055 views
@doc raw"""1LaplaceDiffusionEntropyVariables1D(equations)2LaplaceDiffusionEntropyVariables2D(equations)3LaplaceDiffusionEntropyVariables3D(equations)45This represent a symmetrized Laplacian diffusion6``\nabla \cdot (\kappa\frac{\partial u}{\partial w}\nabla w(u)))``,7where ``w(u)`` denotes the mapping between conservative and entropy variables.8Compared with `LaplaceDiffusion` (see [`LaplaceDiffusion1D`](@ref),9[`LaplaceDiffusion2D`](@ref), and [`LaplaceDiffusion3D`](@ref)), `LaplaceDiffusionEntropyVariables` is10guaranteed to dissipate entropy.11"""12struct LaplaceDiffusionEntropyVariables{NDIMS, E, N, T} <:13AbstractLaplaceDiffusion{NDIMS, N}14diffusivity::T15equations_hyperbolic::E16end1718function varnames(variable_mapping, equations_parabolic::LaplaceDiffusionEntropyVariables)19varnames(variable_mapping, equations_parabolic.equations_hyperbolic)20end2122function gradient_variable_transformation(::LaplaceDiffusionEntropyVariables)23cons2entropy24end2526function cons2entropy(u, equations::LaplaceDiffusionEntropyVariables)27cons2entropy(u, equations.equations_hyperbolic)28end2930function entropy2cons(w, equations::LaplaceDiffusionEntropyVariables)31entropy2cons(w, equations.equations_hyperbolic)32end3334# This is used to compute the diffusivity tensor for LaplaceDiffusionEntropyVariables.35# This is the generic fallback using AD (assuming entropy2cons exists)36function jacobian_entropy2cons(w, equations)37return equations.diffusivity * ForwardDiff.jacobian(w -> entropy2cons(w, equations), w)38end3940# Dirichlet and Neumann boundary conditions for use with parabolic solvers in weak form.41# Note that these are general, so they apply to LaplaceDiffusionEntropyVariables in any42# spatial dimension.43@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,44normal::AbstractVector,45x, t,46operator_type::Gradient,47equations_parabolic::LaplaceDiffusionEntropyVariables)48return boundary_condition.boundary_value_function(x, t, equations_parabolic)49end5051@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,52normal::AbstractVector,53x, t,54operator_type::Divergence,55equations_parabolic::LaplaceDiffusionEntropyVariables)56return flux_inner57end5859@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,60normal::AbstractVector,61x, t,62operator_type::Divergence,63equations_parabolic::LaplaceDiffusionEntropyVariables)64return boundary_condition.boundary_normal_flux_function(x, t, equations_parabolic)65end6667@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,68normal::AbstractVector,69x, t,70operator_type::Gradient,71equations_parabolic::LaplaceDiffusionEntropyVariables)72return flux_inner73end747576