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} |
