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
5586 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
This is intended for use as the parabolic part of a hyperbolic-parabolic system, where the
7
hyperbolic part is defined by `equations`. For a purely parabolic diffusion equation
8
without any hyperbolic part, see [`LinearDiffusionEquation1D`](@ref).
9
"""
10
struct LaplaceDiffusion1D{E, N, T} <: AbstractLaplaceDiffusion{1, N}
11
diffusivity::T
12
equations_hyperbolic::E
13
end
14
15
function LaplaceDiffusion1D(diffusivity, equations_hyperbolic)
16
return LaplaceDiffusion1D{typeof(equations_hyperbolic),
17
nvariables(equations_hyperbolic),
18
typeof(diffusivity)}(diffusivity, equations_hyperbolic)
19
end
20
21
function varnames(variable_mapping, equations_parabolic::LaplaceDiffusion1D)
22
return varnames(variable_mapping, equations_parabolic.equations_hyperbolic)
23
end
24
25
function flux(u, gradients, orientation::Integer,
26
equations_parabolic::LaplaceDiffusion1D)
27
dudx, = gradients # Extract first (and only) component from gradients
28
# orientation == 1
29
return equations_parabolic.diffusivity * dudx
30
end
31
32
# Dirichlet and Neumann boundary conditions for use with parabolic solvers in weak form.
33
# Note that these are general, so they apply to LaplaceDiffusion in any spatial dimension.
34
@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,
35
normal::AbstractVector,
36
x, t,
37
operator_type::Gradient,
38
equations_parabolic::AbstractLaplaceDiffusion)
39
return boundary_condition.boundary_value_function(x, t, equations_parabolic)
40
end
41
42
@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,
43
normal::AbstractVector,
44
x, t,
45
operator_type::Divergence,
46
equations_parabolic::AbstractLaplaceDiffusion)
47
return flux_inner
48
end
49
50
# Required for the 1D (TreeMesh) case
51
@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,
52
orientation,
53
direction,
54
x, t,
55
operator_type::Gradient,
56
equations_parabolic::AbstractLaplaceDiffusion)
57
return boundary_condition.boundary_value_function(x, t, equations_parabolic)
58
end
59
60
# Required for the 1D (TreeMesh) case
61
@inline function (boundary_condition::BoundaryConditionDirichlet)(flux_inner, u_inner,
62
orientation,
63
direction,
64
x, t,
65
operator_type::Divergence,
66
equations_parabolic::AbstractLaplaceDiffusion)
67
return flux_inner
68
end
69
70
@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,
71
normal::AbstractVector,
72
x, t,
73
operator_type::Divergence,
74
equations_parabolic::AbstractLaplaceDiffusion)
75
return boundary_condition.boundary_normal_flux_function(x, t, equations_parabolic)
76
end
77
78
@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,
79
normal::AbstractVector,
80
x, t,
81
operator_type::Gradient,
82
equations_parabolic::AbstractLaplaceDiffusion)
83
return flux_inner
84
end
85
86
# Required for the 1D (TreeMesh) case
87
@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,
88
orientation,
89
direction,
90
x, t,
91
operator_type::Divergence,
92
equations_parabolic::AbstractLaplaceDiffusion)
93
return boundary_condition.boundary_normal_flux_function(x, t, equations_parabolic)
94
end
95
96
# Required for the 1D (TreeMesh) case
97
@inline function (boundary_condition::BoundaryConditionNeumann)(flux_inner, u_inner,
98
orientation,
99
direction,
100
x, t,
101
operator_type::Gradient,
102
equations_parabolic::AbstractLaplaceDiffusion)
103
return flux_inner
104
end
105
106