comparison DiffOps/src/laplace.jl @ 259:5571d2c5bf0f boundary_conditions

Implement BaoundaryQuadrature for Laplace
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 28 Jun 2019 14:17:13 +0200
parents 3ea8c60ccef3
children f1e90a92ad74
comparison
equal deleted inserted replaced
258:3ea8c60ccef3 259:5571d2c5bf0f
31 apply(L, v, I) 31 apply(L, v, I)
32 end 32 end
33 33
34 boundary_value(L::Laplace, bId::CartesianBoundary) = BoundaryValue(L.op, L.grid, bId) 34 boundary_value(L::Laplace, bId::CartesianBoundary) = BoundaryValue(L.op, L.grid, bId)
35 normal_derivative(L::Laplace, bId::CartesianBoundary) = NormalDerivative(L.op, L.grid, bId) 35 normal_derivative(L::Laplace, bId::CartesianBoundary) = NormalDerivative(L.op, L.grid, bId)
36 boundary_quadrature(L::Laplace, bId::CartesianBoundary) = throw(MethodError) # TODO: Implement this 36 boundary_quadrature(L::Laplace, bId::CartesianBoundary) = BoundaryQuadrature(L.op, L.grid, bId)
37 37
38 38
39 """ 39 """
40 BoundaryValue{T,N,M,K} <: TensorMapping{T,2,1} 40 BoundaryValue{T,N,M,K} <: TensorMapping{T,2,1}
41 41
98 function LazyTensors.apply_transpose(d::NormalDerivative, v::AbstractArray, I::NTuple{1,Int}) 98 function LazyTensors.apply_transpose(d::NormalDerivative, v::AbstractArray, I::NTuple{1,Int})
99 u = selectdim(v,3-dim(d.bId),I[1]) 99 u = selectdim(v,3-dim(d.bId),I[1])
100 return apply_d_T(d.op, d.grid.inverse_spacing[dim(d.bId)], u, region(d.bId)) 100 return apply_d_T(d.op, d.grid.inverse_spacing[dim(d.bId)], u, region(d.bId))
101 end 101 end
102 102
103 """
104 BoundaryQuadrature{T,N,M,K} <: TensorOperator{T,1}
105
106 Implements the boundary operator `q` as a TensorOperator
107 """
108 struct BoundaryQuadrature{T,N,M,K} <: TensorOperator{T,1}
109 op::D2{T,N,M,K}
110 grid::EquidistantGrid{2}
111 bId::CartesianBoundary
112 end
113 export BoundaryQuadrature
114
115 # TODO: Make this independent of dimension
116 function LazyTensors.apply(q::BoundaryQuadrature{T}, v::AbstractArray{T,1}, I::NTuple{1,Int}) where T
117 h = spacing(q.grid)[3-dim(q.bId)]
118 N = size(v)
119 return apply_quadrature(q.op, h, v[I[1]], I[1], N[1])
120 end
121
122 LazyTensors.apply_transpose(q::BoundaryQuadrature{T}, v::AbstractArray{T,1}, I::NTuple{1,Int}) where T = apply(q,v,I)
123
124
103 125
104 126
105 struct Neumann{Bid<:BoundaryIdentifier} <: BoundaryCondition end 127 struct Neumann{Bid<:BoundaryIdentifier} <: BoundaryCondition end
106 128
107 function sat(L::Laplace{2,T}, bc::Neumann{Bid}, v::AbstractArray{T,2}, g::AbstractVector{T}, I::CartesianIndex{2}) where {T,Bid} 129 function sat(L::Laplace{2,T}, bc::Neumann{Bid}, v::AbstractArray{T,2}, g::AbstractVector{T}, I::CartesianIndex{2}) where {T,Bid}