comparison src/SbpOperators/volumeops/laplace/laplace.jl @ 1607:7216448d0c5a feature/boundary_conditions

REVIEW: Suggest deduplication of positivity decompostion code
author Jonatan Werpers <jonatan@werpers.com>
date Sun, 09 Jun 2024 00:02:40 +0200
parents 93b86625fcfd
children 8315c456e3b4
comparison
equal deleted inserted replaced
1606:93b86625fcfd 1607:7216448d0c5a
92 92
93 penalty_tensor = -H⁻¹∘e'∘Hᵧ 93 penalty_tensor = -H⁻¹∘e'∘Hᵧ
94 return penalty_tensor, d 94 return penalty_tensor, d
95 end 95 end
96 96
97
98 function positivity_decomposition(Δ::Laplace, g::Grid, bc::DirichletCondition; H_tuning, R_tuning)
99 Nτ_H, τ_R = positivity_limits(Δ,g,bc)
100 return H_tuning*Nτ_H + R_tuning*τ_R
101 end
102
103
97 # TODO: We should consider implementing a proper BoundaryIdentifier for EquidistantGrid and then 104 # TODO: We should consider implementing a proper BoundaryIdentifier for EquidistantGrid and then
98 # change bc::BoundaryCondition to id::BoundaryIdentifier 105 # change bc::BoundaryCondition to id::BoundaryIdentifier
99 106 function positivity_limits(Δ::Laplace, g::EquidistantGrid, bc::DirichletCondition)
100 function positivity_decomposition(Δ::Laplace, g::EquidistantGrid, bc::BoundaryCondition; H_tuning, R_tuning)
101 pos_prop = positivity_properties(Δ) 107 pos_prop = positivity_properties(Δ)
102 h = spacing(g) 108 h = spacing(g)
103 θ_H = pos_prop.theta_H 109 θ_H = pos_prop.theta_H
104 τ_H = H_tuning*ndims(g)/(h*θ_H) 110 τ_H = 1/(h*θ_H)
105 θ_R = pos_prop.theta_R 111 θ_R = pos_prop.theta_R
106 τ_R = R_tuning/(h*θ_R) 112 τ_R = 1/(h*θ_R)
107 B = τ_H + τ_R 113 return τ_H, τ_R
108 return B
109 end 114 end
110 115
111 function positivity_decomposition(Δ::Laplace, g::TensorGrid, bc::BoundaryCondition; H_tuning, R_tuning) 116 function positivity_limits(Δ::Laplace, g::TensorGrid, bc::DirichletCondition)
112 pos_prop = positivity_properties(Δ) 117 τ_H, τ_R = positivity_limits(Δ, g.grids[grid_id(boundary(bc))], bc)
113 h = spacing(g.grids[grid_id(boundary(bc))]) # grid spacing of the 1D grid normal to the boundary 118 return τ_H*ndims(g), τ_R
114 θ_H = pos_prop.theta_H
115 τ_H = H_tuning*ndims(g)/(h*θ_H)
116 θ_R = pos_prop.theta_R
117 τ_R = R_tuning/(h*θ_R)
118 B = τ_H + τ_R
119 return B
120 end 119 end
120
121 121
122 function positivity_properties(Δ::Laplace) 122 function positivity_properties(Δ::Laplace)
123 D2_pos_prop = parse_named_tuple(Δ.stencil_set["D2"]["positivity"]) 123 D2_pos_prop = parse_named_tuple(Δ.stencil_set["D2"]["positivity"])
124 H_closure = parse_tuple(Δ.stencil_set["H"]["closure"]) 124 H_closure = parse_tuple(Δ.stencil_set["H"]["closure"])
125 return merge(D2_pos_prop, (theta_H = H_closure[1],)) 125 return merge(D2_pos_prop, (theta_H = H_closure[1],))