Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/src/equations/laplace_diffusion_1d.jl
2055 views
1
@doc raw"""
2
LaplaceDiffusion1D(diffusivity, equations)
3
4
`LaplaceDiffusion1D` represents a scalar diffusion term ``\nabla \cdot (\kappa\nabla u))``
5
with diffusivity ``\kappa`` applied to each solution component defined by `equations`.
6
"""
7
struct LaplaceDiffusion1D{E, N, T} <: AbstractLaplaceDiffusion{1, N}
8
diffusivity::T
9
equations_hyperbolic::E
10
end
11
12
function LaplaceDiffusion1D(diffusivity, equations_hyperbolic)
13
LaplaceDiffusion1D{typeof(equations_hyperbolic), nvariables(equations_hyperbolic),
14
typeof(diffusivity)}(diffusivity, equations_hyperbolic)
15
end
16
17
function varnames(variable_mapping, equations_parabolic::LaplaceDiffusion1D)
18
varnames(variable_mapping, equations_parabolic.equations_hyperbolic)
19
end
20
21
function flux(u, gradients, orientation::Integer, equations_parabolic::LaplaceDiffusion1D)
22
dudx = gradients
23
# orientation == 1
24
return equations_parabolic.diffusivity * dudx
25
end
26
27
# Dirichlet and Neumann boundary conditions for use with parabolic solvers in weak form.
28
# Note that these are general, so they apply to LaplaceDiffusion in any spatial dimension.
29
@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,
30
normal::AbstractVector,
31
x, t,
32
operator_type::Gradient,
33
equations_parabolic::AbstractLaplaceDiffusion)
34
return boundary_condition.boundary_value_function(x, t, equations_parabolic)
35
end
36
37
@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,
38
normal::AbstractVector,
39
x, t,
40
operator_type::Divergence,
41
equations_parabolic::AbstractLaplaceDiffusion)
42
return flux_inner
43
end
44
45
@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,
46
normal::AbstractVector,
47
x, t,
48
operator_type::Divergence,
49
equations_parabolic::AbstractLaplaceDiffusion)
50
return boundary_condition.boundary_normal_flux_function(x, t, equations_parabolic)
51
end
52
53
@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,
54
normal::AbstractVector,
55
x, t,
56
operator_type::Gradient,
57
equations_parabolic::AbstractLaplaceDiffusion)
58
return flux_inner
59
end
60
61