Mercurial > repos > public > sbplib_julia
comparison DiffOps/src/laplace.jl @ 262:f1e90a92ad74 boundary_conditions
Add Quadrature and InverseQuadrature for Laplace as TensorMappings. Implement and test the 2D case. Fix implementation of apply_transpose for BoundaryQuadrature and add tests.
| author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
|---|---|
| date | Tue, 26 Nov 2019 08:28:26 -0800 |
| parents | 5571d2c5bf0f |
| children | 9ad447176ba1 |
comparison
equal
deleted
inserted
replaced
| 261:01017d2b46b0 | 262:f1e90a92ad74 |
|---|---|
| 29 function apply(L::Laplace{2}, v::AbstractArray{T,2} where T, i::CartesianIndex{2}) | 29 function apply(L::Laplace{2}, v::AbstractArray{T,2} where T, i::CartesianIndex{2}) |
| 30 I = Index{Unknown}.(Tuple(i)) | 30 I = Index{Unknown}.(Tuple(i)) |
| 31 apply(L, v, I) | 31 apply(L, v, I) |
| 32 end | 32 end |
| 33 | 33 |
| 34 quadrature(L::Laplace) = Quadrature(L.op, L.grid) | |
| 35 inverse_quadrature(L::Laplace) = InverseQuadrature(L.op, L.grid) | |
| 34 boundary_value(L::Laplace, bId::CartesianBoundary) = BoundaryValue(L.op, L.grid, bId) | 36 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) | 37 normal_derivative(L::Laplace, bId::CartesianBoundary) = NormalDerivative(L.op, L.grid, bId) |
| 36 boundary_quadrature(L::Laplace, bId::CartesianBoundary) = BoundaryQuadrature(L.op, L.grid, bId) | 38 boundary_quadrature(L::Laplace, bId::CartesianBoundary) = BoundaryQuadrature(L.op, L.grid, bId) |
| 37 | 39 |
| 40 """ | |
| 41 Quadrature{Dim,T<:Real,N,M,K} <: TensorMapping{T,Dim,Dim} | |
| 42 | |
| 43 Implements the quadrature operator `H` of Dim dimension as a TensorMapping | |
| 44 """ | |
| 45 struct Quadrature{Dim,T<:Real,N,M,K} <: TensorMapping{T,Dim,Dim} | |
| 46 op::D2{T,N,M,K} | |
| 47 grid::EquidistantGrid{Dim,T} | |
| 48 end | |
| 49 export Quadrature | |
| 50 | |
| 51 LazyTensors.range_size(H::Quadrature{2}, domain_size::NTuple{2,Integer}) where T = size(H.grid) | |
| 52 LazyTensors.domain_size(H::Quadrature{2}, range_size::NTuple{2,Integer}) where T = size(H.grid) | |
| 53 | |
| 54 # TODO: Dispatch on Tuple{Index{R1},Index{R2}}? | |
| 55 @inline function LazyTensors.apply(H::Quadrature{2}, v::AbstractArray{T,2} where T, I::NTuple{2,Integer}) | |
| 56 I = CartesianIndex(I); | |
| 57 N = size(H.grid) | |
| 58 # Quadrature in x direction | |
| 59 @inbounds q = apply_quadrature(H.op, H.grid.spacing[1], v[I] , I[1], N[1]) | |
| 60 # Quadrature in y-direction | |
| 61 @inbounds q = apply_quadrature(H.op, H.grid.spacing[2], q, I[2], N[2]) | |
| 62 return q | |
| 63 end | |
| 64 | |
| 65 LazyTensors.apply_transpose(H::Quadrature{2}, v::AbstractArray{T,2} where T, I::NTuple{2,Integer}) = LazyTensors.apply(H,v,I) | |
| 66 | |
| 67 """ | |
| 68 InverseQuadrature{Dim,T<:Real,N,M,K} <: TensorMapping{T,Dim,Dim} | |
| 69 | |
| 70 Implements the inverse quadrature operator `inv(H)` of Dim dimension as a TensorMapping | |
| 71 """ | |
| 72 struct InverseQuadrature{Dim,T<:Real,N,M,K} <: TensorMapping{T,Dim,Dim} | |
| 73 op::D2{T,N,M,K} | |
| 74 grid::EquidistantGrid{Dim,T} | |
| 75 end | |
| 76 export InverseQuadrature | |
| 77 | |
| 78 LazyTensors.range_size(H_inv::InverseQuadrature{2}, domain_size::NTuple{2,Integer}) where T = size(H_inv.grid) | |
| 79 LazyTensors.domain_size(H_inv::InverseQuadrature{2}, range_size::NTuple{2,Integer}) where T = size(H_inv.grid) | |
| 80 | |
| 81 # TODO: Dispatch on Tuple{Index{R1},Index{R2}}? | |
| 82 @inline function LazyTensors.apply(H_inv::InverseQuadrature{2}, v::AbstractArray{T,2} where T, I::NTuple{2,Integer}) | |
| 83 I = CartesianIndex(I); | |
| 84 N = size(H_inv.grid) | |
| 85 # Inverse quadrature in x direction | |
| 86 @inbounds q_inv = apply_inverse_quadrature(H_inv.op, H_inv.grid.inverse_spacing[1], v[I] , I[1], N[1]) | |
| 87 # Inverse quadrature in y-direction | |
| 88 @inbounds q_inv = apply_inverse_quadrature(H_inv.op, H_inv.grid.inverse_spacing[2], q_inv, I[2], N[2]) | |
| 89 return q_inv | |
| 90 end | |
| 91 | |
| 92 LazyTensors.apply_transpose(H_inv::InverseQuadrature{2}, v::AbstractArray{T,2} where T, I::NTuple{2,Integer}) = LazyTensors.apply(H_inv,v,I) | |
| 38 | 93 |
| 39 """ | 94 """ |
| 40 BoundaryValue{T,N,M,K} <: TensorMapping{T,2,1} | 95 BoundaryValue{T,N,M,K} <: TensorMapping{T,2,1} |
| 41 | 96 |
| 42 Implements the boundary operator `e` as a TensorMapping | 97 Implements the boundary operator `e` as a TensorMapping |
| 63 | 118 |
| 64 function LazyTensors.apply_transpose(e::BoundaryValue, v::AbstractArray, I::NTuple{1,Int}) | 119 function LazyTensors.apply_transpose(e::BoundaryValue, v::AbstractArray, I::NTuple{1,Int}) |
| 65 u = selectdim(v,3-dim(e.bId),I[1]) | 120 u = selectdim(v,3-dim(e.bId),I[1]) |
| 66 return apply_e_T(e.op, u, region(e.bId)) | 121 return apply_e_T(e.op, u, region(e.bId)) |
| 67 end | 122 end |
| 68 | |
| 69 | |
| 70 | 123 |
| 71 """ | 124 """ |
| 72 NormalDerivative{T,N,M,K} <: TensorMapping{T,2,1} | 125 NormalDerivative{T,N,M,K} <: TensorMapping{T,2,1} |
| 73 | 126 |
| 74 Implements the boundary operator `d` as a TensorMapping | 127 Implements the boundary operator `d` as a TensorMapping |
| 111 bId::CartesianBoundary | 164 bId::CartesianBoundary |
| 112 end | 165 end |
| 113 export BoundaryQuadrature | 166 export BoundaryQuadrature |
| 114 | 167 |
| 115 # TODO: Make this independent of dimension | 168 # TODO: Make this independent of dimension |
| 169 # TODO: Dispatch directly on Index{R}? | |
| 116 function LazyTensors.apply(q::BoundaryQuadrature{T}, v::AbstractArray{T,1}, I::NTuple{1,Int}) where T | 170 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)] | 171 h = q.grid.spacing[3-dim(q.bId)] |
| 118 N = size(v) | 172 N = size(v) |
| 119 return apply_quadrature(q.op, h, v[I[1]], I[1], N[1]) | 173 return apply_quadrature(q.op, h, v[I[1]], I[1], N[1]) |
| 120 end | 174 end |
| 121 | 175 |
| 122 LazyTensors.apply_transpose(q::BoundaryQuadrature{T}, v::AbstractArray{T,1}, I::NTuple{1,Int}) where T = apply(q,v,I) | 176 LazyTensors.apply_transpose(q::BoundaryQuadrature{T}, v::AbstractArray{T,1}, I::NTuple{1,Int}) where T = LazyTensors.apply(q,v,I) |
| 123 | 177 |
| 124 | 178 |
| 125 | 179 |
| 126 | 180 |
| 127 struct Neumann{Bid<:BoundaryIdentifier} <: BoundaryCondition end | 181 struct Neumann{Bid<:BoundaryIdentifier} <: BoundaryCondition end |
