comparison src/SbpOperators/volumeops/laplace/laplace.jl @ 667:f3a0d1f7d842 feature/laplace_opset

Make Laplace a type storing relevant operators used when writing a scheme, e.g. quadratures, normal derivatives etc.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Sun, 31 Jan 2021 21:04:02 +0100
parents d6edde60909b
children 2d56a53a1646
comparison
equal deleted inserted replaced
666:94fe0761e6f9 667:f3a0d1f7d842
1 """ 1 """
2 Laplace(grid::EquidistantGrid{Dim}, inner_stencil, closure_stencils) 2 Laplace{T,Dim,...}()
3 Laplace(grid::EquidistantGrid, fn; order)
4
5 Implements the Laplace operator, approximating ∑d²/xᵢ² , i = 1,...,`Dim` as a
6 `TensorMapping`. Additionally, `Laplace` stores the quadrature, and boundary
7 operators relevant for constructing a SBP finite difference scheme as `TensorMapping`s.
8 """
9 struct Laplace{T, Dim, Rb, TMdiffop<:TensorMapping{T,Dim,Dim}, # Differential operator tensor mapping
10 TMqop<:TensorMapping{T,Dim,Dim}, # Quadrature operator tensor mapping
11 TMbop<:TensorMapping{T,Rb,Dim}, # Boundary operator tensor mapping
12 TMbqop<:TensorMapping{T,Rb,Rb}, # Boundary quadrature tensor mapping
13 BID<:BoundaryIdentifier} <: TensorMapping{T,Dim,Dim}
14 D::TMdiffop # Difference operator
15 H::TMqop # Quadrature (norm) operator
16 H_inv::TMqop # Inverse quadrature (norm) operator
17 e::Dict{BID,TMbop} # Boundary restriction operators
18 d::Dict{BID,TMbop} # Normal derivative operators
19 H_boundary::Dict{BID,TMbqop} # Boundary quadrature operators
20 end
21 export Laplace
22
23 function Laplace(grid::EquidistantGrid, fn; order)
24 # TODO: Removed once we can construct the volume and
25 # boundary operators by op(grid, fn; order,...).
26 # Read stencils
27 op = read_D2_operator(fn; order)
28 D_inner_stecil = op.innerStencil
29 D_closure_stencils = op.closureStencils
30 H_closure_stencils = op.quadratureClosure
31 e_closure_stencil = op.eClosure
32 d_closure_stencil = op.dClosure
33
34 # Volume operators
35 Δ = laplace(grid, D_inner_stecil, D_closure_stencils)
36 H = DiagonalQuadrature(grid, H_closure_stencils)
37 H⁻¹ = InverseDiagonalQuadrature(grid, H_closure_stencils)
38
39 # Pair boundary operators and boundary quadratures with the boundary ids
40 e_pairs = ()
41 d_pairs = ()
42 Hᵧ_pairs = ()
43 dims = collect(1:dimension(grid))
44 for id ∈ boundary_identifiers(grid)
45 # Boundary operators
46 e_pairs = (e_pairs...,Pair(id,BoundaryRestriction(grid,e_closure_stencil,id)))
47 d_pairs = (d_pairs...,Pair(id,NormalDerivative(grid,d_closure_stencil,id)))
48 # Boundary quadratures
49 # Construct these on the lower-dimensional grid in the
50 # coordinite directions orthogonal to dim(id)
51 orth_dims = dims[dims .!= dim(id)]
52 orth_grid = restrict(grid,orth_dims)
53 Hᵧ_pairs = (Hᵧ_pairs...,Pair(id,DiagonalQuadrature(orth_grid,H_closure_stencils)))
54 end
55 return Laplace(Δ, H, H⁻¹, Dict(e_pairs), Dict(d_pairs), Dict(Hᵧ_pairs))
56 end
57
58 LazyTensors.range_size(L::Laplace) = LazyTensors.range_size(L.D)
59 LazyTensors.domain_size(L::Laplace) = LazyTensors.domain_size(L.D)
60 LazyTensors.apply(L::Laplace, v::AbstractArray, I...) = LazyTensors.apply(L.D,v,I...)
61
62 quadrature(L::Laplace) = L.H
63 export quadrature
64 inverse_quadrature(L::Laplace) = L.H_inv
65 export inverse_quadrature
66 boundary_restriction(L::Laplace,bid::BoundaryIdentifier) = L.e[bid]
67 export boundary_restriction
68 normal_derivative(L::Laplace,bid::BoundaryIdentifier) = L.d[bid]
69 export normal_derivative
70 boundary_quadrature(L::Laplace,bid::BoundaryIdentifier) = L.H_boundary[bid]
71 export boundary_quadrature
72
73 """
74 laplace(grid::EquidistantGrid{Dim}, inner_stencil, closure_stencils)
3 75
4 Creates the Laplace operator operator `Δ` as a `TensorMapping` 76 Creates the Laplace operator operator `Δ` as a `TensorMapping`
5 77
6 `Δ` approximates the Laplace operator ∑d²/xᵢ² , i = 1,...,`Dim` on `grid`, using 78 `Δ` approximates the Laplace operator ∑d²/xᵢ² , i = 1,...,`Dim` on `grid`, using
7 the stencil `inner_stencil` in the interior and a set of stencils `closure_stencils` 79 the stencil `inner_stencil` in the interior and a set of stencils `closure_stencils`
8 for the points in the closure regions. 80 for the points in the closure regions.
9 81
10 On a one-dimensional `grid`, `Δ` is a `SecondDerivative`. On a multi-dimensional `grid`, `Δ` is the sum of 82 On a one-dimensional `grid`, `Δ` is a `SecondDerivative`. On a multi-dimensional `grid`, `Δ` is the sum of
11 multi-dimensional `SecondDerivative`s where the sum is carried out lazily. 83 multi-dimensional `SecondDerivative`s where the sum is carried out lazily.
12 """ 84 """
13 function Laplace(grid::EquidistantGrid{Dim}, inner_stencil, closure_stencils) where Dim 85 function laplace(grid::EquidistantGrid{Dim}, inner_stencil, closure_stencils) where Dim
14 Δ = SecondDerivative(grid, inner_stencil, closure_stencils, 1) 86 Δ = SecondDerivative(grid, inner_stencil, closure_stencils, 1)
15 for d = 2:Dim 87 for d = 2:Dim
16 Δ += SecondDerivative(grid, inner_stencil, closure_stencils, d) 88 Δ += SecondDerivative(grid, inner_stencil, closure_stencils, d)
17 end 89 end
18 return Δ 90 return Δ
19 end 91 end
20 export Laplace 92 export laplace