Mercurial > repos > public > sbplib_julia
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} |