Path: blob/main/src/equations/laplace_diffusion_1d.jl
5586 views
@doc raw"""1LaplaceDiffusion1D(diffusivity, equations)23`LaplaceDiffusion1D` represents a scalar diffusion term ``\nabla \cdot (\kappa\nabla u))``4with diffusivity ``\kappa`` applied to each solution component defined by `equations`.5This is intended for use as the parabolic part of a hyperbolic-parabolic system, where the6hyperbolic part is defined by `equations`. For a purely parabolic diffusion equation7without any hyperbolic part, see [`LinearDiffusionEquation1D`](@ref).8"""9struct LaplaceDiffusion1D{E, N, T} <: AbstractLaplaceDiffusion{1, N}10diffusivity::T11equations_hyperbolic::E12end1314function LaplaceDiffusion1D(diffusivity, equations_hyperbolic)15return LaplaceDiffusion1D{typeof(equations_hyperbolic),16nvariables(equations_hyperbolic),17typeof(diffusivity)}(diffusivity, equations_hyperbolic)18end1920function varnames(variable_mapping, equations_parabolic::LaplaceDiffusion1D)21return varnames(variable_mapping, equations_parabolic.equations_hyperbolic)22end2324function flux(u, gradients, orientation::Integer,25equations_parabolic::LaplaceDiffusion1D)26dudx, = gradients # Extract first (and only) component from gradients27# orientation == 128return equations_parabolic.diffusivity * dudx29end3031# Dirichlet and Neumann boundary conditions for use with parabolic solvers in weak form.32# Note that these are general, so they apply to LaplaceDiffusion in any spatial dimension.33@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,34normal::AbstractVector,35x, t,36operator_type::Gradient,37equations_parabolic::AbstractLaplaceDiffusion)38return boundary_condition.boundary_value_function(x, t, equations_parabolic)39end4041@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,42normal::AbstractVector,43x, t,44operator_type::Divergence,45equations_parabolic::AbstractLaplaceDiffusion)46return flux_inner47end4849# Required for the 1D (TreeMesh) case50@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,51orientation,52direction,53x, t,54operator_type::Gradient,55equations_parabolic::AbstractLaplaceDiffusion)56return boundary_condition.boundary_value_function(x, t, equations_parabolic)57end5859# Required for the 1D (TreeMesh) case60@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,61orientation,62direction,63x, t,64operator_type::Divergence,65equations_parabolic::AbstractLaplaceDiffusion)66return flux_inner67end6869@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,70normal::AbstractVector,71x, t,72operator_type::Divergence,73equations_parabolic::AbstractLaplaceDiffusion)74return boundary_condition.boundary_normal_flux_function(x, t, equations_parabolic)75end7677@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,78normal::AbstractVector,79x, t,80operator_type::Gradient,81equations_parabolic::AbstractLaplaceDiffusion)82return flux_inner83end8485# Required for the 1D (TreeMesh) case86@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,87orientation,88direction,89x, t,90operator_type::Divergence,91equations_parabolic::AbstractLaplaceDiffusion)92return boundary_condition.boundary_normal_flux_function(x, t, equations_parabolic)93end9495# Required for the 1D (TreeMesh) case96@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,97orientation,98direction,99x, t,100operator_type::Gradient,101equations_parabolic::AbstractLaplaceDiffusion)102return flux_inner103end104105106