comparison src/SbpOperators/volumeops/laplace/laplace.jl @ 1616:e41eddc640f3 feature/boundary_conditions

Docs
author Vidar Stiernström <vidar.stiernstrom@gmail.com>
date Sun, 09 Jun 2024 17:51:57 -0700
parents 8315c456e3b4
children 1937be9502a7
comparison
equal deleted inserted replaced
1615:b74e1a21265f 1616:e41eddc640f3
51 end 51 end
52 return Δ 52 return Δ
53 end 53 end
54 laplace(g::EquidistantGrid, stencil_set) = second_derivative(g, stencil_set) 54 laplace(g::EquidistantGrid, stencil_set) = second_derivative(g, stencil_set)
55 55
56
57 """ 56 """
58 sat_tensors(Δ::Laplace, g::Grid, bc::DirichletCondition; tuning) 57 sat_tensors(Δ::Laplace, g::Grid, bc::DirichletCondition; H_tuning, R_tuning)
59 58
60 The operators required to construct the SAT for imposing a Dirichlet condition. 59 The operators required to construct the SAT for imposing a Dirichlet condition.
61 `tuning` specifies the strength of the penalty. See 60 `H_tuning` and `R_tuning` are used to specify the strength of the penalty.
62 61
63 See also: [`sat`,`DirichletCondition`, `positivity_decomposition`](@ref). 62 See also: [`sat`](@ref),[`DirichletCondition`](@ref),[`positivity_decomposition`](@ref).
64 """ 63 """
65 function sat_tensors(Δ::Laplace, g::Grid, bc::DirichletCondition; H_tuning = 1., R_tuning = 1.) 64 function sat_tensors(Δ::Laplace, g::Grid, bc::DirichletCondition; H_tuning = 1., R_tuning = 1.)
66 id = boundary(bc) 65 id = boundary(bc)
67 set = Δ.stencil_set 66 set = Δ.stencil_set
68 H⁻¹ = inverse_inner_product(g,set) 67 H⁻¹ = inverse_inner_product(g,set)
73 penalty_tensor = H⁻¹∘(d' - B*e')∘Hᵧ 72 penalty_tensor = H⁻¹∘(d' - B*e')∘Hᵧ
74 return penalty_tensor, e 73 return penalty_tensor, e
75 end 74 end
76 75
77 """ 76 """
78 sat_tensors(Δ::Laplace, g::Grid, bc::NeumannCondition) 77 sat_tensors(Δ::Laplace, g::Grid, bc::NeumannCondition)
79 78
80 The operators required to construct the SAT for imposing a Neumann condition 79 The operators required to construct the SAT for imposing a Neumann condition
81 80
82 81 See also: [`sat`](@ref),[`NeumannCondition`](@ref).
83 See also: [`sat`,`NeumannCondition`](@ref).
84 """ 82 """
85 function sat_tensors(Δ::Laplace, g::Grid, bc::NeumannCondition) 83 function sat_tensors(Δ::Laplace, g::Grid, bc::NeumannCondition)
86 id = boundary(bc) 84 id = boundary(bc)
87 set = Δ.stencil_set 85 set = Δ.stencil_set
88 H⁻¹ = inverse_inner_product(g,set) 86 H⁻¹ = inverse_inner_product(g,set)
92 90
93 penalty_tensor = -H⁻¹∘e'∘Hᵧ 91 penalty_tensor = -H⁻¹∘e'∘Hᵧ
94 return penalty_tensor, d 92 return penalty_tensor, d
95 end 93 end
96 94
95 """
96 positivity_decomposition(Δ::Laplace, g::Grid, bc::DirichletCondition; H_tuning, R_tuning)
97 97
98 Constructs the scalar `B` such that `d' - 1/2*B*e'` is symmetric positive definite with respect to
99 the boundary quadrature. Here `d` is the normal derivative and `e` is the boundary restriction operator.
100 `B` can then be used to form a symmetric and energy stable penalty for a Dirichlet condition.
101 The parameters `H_tuning` and `R_tuning` are used to specify the strength of the penalty and
102 must be greater than 1. For details we refer to https://doi.org/10.1016/j.jcp.2020.109294
103 """
98 function positivity_decomposition(Δ::Laplace, g::Grid, bc::DirichletCondition; H_tuning, R_tuning) 104 function positivity_decomposition(Δ::Laplace, g::Grid, bc::DirichletCondition; H_tuning, R_tuning)
105 @assert(H_tuning ≥ 1.)
106 @assert(R_tuning ≥ 1.)
99 Nτ_H, τ_R = positivity_limits(Δ,g,bc) 107 Nτ_H, τ_R = positivity_limits(Δ,g,bc)
100 return H_tuning*Nτ_H + R_tuning*τ_R 108 return H_tuning*Nτ_H + R_tuning*τ_R
101 end 109 end
102
103 110
104 # TODO: We should consider implementing a proper BoundaryIdentifier for EquidistantGrid and then 111 # TODO: We should consider implementing a proper BoundaryIdentifier for EquidistantGrid and then
105 # change bc::BoundaryCondition to id::BoundaryIdentifier 112 # change bc::BoundaryCondition to id::BoundaryIdentifier
106 function positivity_limits(Δ::Laplace, g::EquidistantGrid, bc::DirichletCondition) 113 function positivity_limits(Δ::Laplace, g::EquidistantGrid, bc::DirichletCondition)
107 h = spacing(g) 114 h = spacing(g)