comparison DiffOps/src/laplace.jl @ 266:9ad447176ba1 boundary_conditions

Minor work on implementation of SATs for laplace
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Thu, 05 Dec 2019 09:27:31 +0100
parents f1e90a92ad74
children f67ce2eb6019
comparison
equal deleted inserted replaced
265:4308b500d6e7 266:9ad447176ba1
179 179
180 180
181 struct Neumann{Bid<:BoundaryIdentifier} <: BoundaryCondition end 181 struct Neumann{Bid<:BoundaryIdentifier} <: BoundaryCondition end
182 182
183 function sat(L::Laplace{2,T}, bc::Neumann{Bid}, v::AbstractArray{T,2}, g::AbstractVector{T}, I::CartesianIndex{2}) where {T,Bid} 183 function sat(L::Laplace{2,T}, bc::Neumann{Bid}, v::AbstractArray{T,2}, g::AbstractVector{T}, I::CartesianIndex{2}) where {T,Bid}
184 e = boundary_value(L.op, Bid()) 184 e = boundary_value(L, Bid())
185 d = normal_derivative(L.op, Bid()) 185 d = normal_derivative(L, Bid())
186 Hᵧ = boundary_quadrature(L.op, Bid()) 186 Hᵧ = boundary_quadrature(L, Bid())
187 187 H⁻¹ = inverse_quadrature(L)
188 return -L.Hi*e*Hᵧ*(d'*v - g) 188 return (-H⁻¹*e*Hᵧ*(d'*v - g))[I]
189 # Need to handle d'*v - g so that it is an AbstractArray that TensorMappings can act on
190 end 189 end
191 190
192 struct Dirichlet{Bid<:BoundaryIdentifier} <: BoundaryCondition 191 struct Dirichlet{Bid<:BoundaryIdentifier} <: BoundaryCondition
193 tau::Float64 192 tau::Float64
194 end 193 end
195 194
196 function sat(L::Laplace{2,T}, bc::Dirichlet{Bid}, v::AbstractArray{T,2}, g::AbstractVector{T}, i::CartesianIndex{2}) where {T,Bid} 195 function sat(L::Laplace{2,T}, bc::Dirichlet{Bid}, v::AbstractArray{T,2}, g::AbstractVector{T}, i::CartesianIndex{2}) where {T,Bid}
197 e = boundary_value(L.op, Bid()) 196 e = boundary_value(L, Bid())
198 d = normal_derivative(L.op, Bid()) 197 d = normal_derivative(L, Bid())
199 Hᵧ = boundary_quadrature(L.op, Bid()) 198 Hᵧ = boundary_quadrature(L, Bid())
200 199 H⁻¹ = inverse_quadrature(L)
201 return -L.Hi*(tau/h*e + d)*Hᵧ*(e'*v - g) 200 return (-H⁻¹*(tau/h*e + d)*Hᵧ*(e'*v - g))[I]
202 # Need to handle scalar multiplication and addition of TensorMapping 201 # Need to handle scalar multiplication and addition of TensorMapping
203 end 202 end
204 203
205 # function apply(s::MyWaveEq{D}, v::AbstractArray{T,D}, i::CartesianIndex{D}) where D 204 # function apply(s::MyWaveEq{D}, v::AbstractArray{T,D}, i::CartesianIndex{D}) where D
206 # return apply(s.L, v, i) + 205 # return apply(s.L, v, i) +