comparison src/SbpOperators/volumeops/laplace/laplace.jl @ 755:36adc15d3935 feature/laplace_opset

Reduce the number of type perameters used by Laplace.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Sun, 28 Mar 2021 15:48:06 +0200
parents dc38e57ebd1b
children 1970ebceabe4
comparison
equal deleted inserted replaced
754:dc38e57ebd1b 755:36adc15d3935
1 """ 1 """
2 Laplace{T, Dim, ...} <: TensorMapping{T,Dim,Dim} 2 Laplace{T, Dim, TMdiffop} <: TensorMapping{T,Dim,Dim}
3 Laplace(grid::AbstractGrid, fn; order) 3 Laplace(grid::AbstractGrid, fn; order)
4 4
5 Implements the Laplace operator, approximating ∑d²/xᵢ² , i = 1,...,`Dim` as a 5 Implements the Laplace operator, approximating ∑d²/xᵢ² , i = 1,...,`Dim` as a
6 `TensorMapping`. Additionally, `Laplace` stores the inner product and boundary 6 `TensorMapping`. Additionally, `Laplace` stores the inner product and boundary
7 operators relevant for constructing a SBP finite difference scheme as `TensorMapping`s. 7 operators relevant for constructing a SBP finite difference scheme as `TensorMapping`s.
8 8
9 Laplace(grid, fn; order) creates the Laplace operator defined on `grid`, 9 Laplace(grid, fn; order) creates the Laplace operator defined on `grid`,
10 where the operators are read from TOML. The differential operator is created 10 where the operators are read from TOML. The differential operator is created
11 using `laplace(grid::AbstractGrid,...)`. 11 using `laplace(grid::AbstractGrid,...)`.
12
13 Note that all properties of Laplace, excluding the Differential operator `D`, are
14 abstract types. For performance reasons, they should therefore be
15 accessed via the provided getter functions (e.g `inner_product(::Laplace)`).
16
12 """ 17 """
13 struct Laplace{T, Dim, Rb, TMdiffop<:TensorMapping{T,Dim,Dim}, # Differential operator 18 struct Laplace{T, Dim, TMdiffop<:TensorMapping{T,Dim,Dim}} <: TensorMapping{T,Dim,Dim}
14 TMipop<:TensorMapping{T,Dim,Dim}, # Inner product operator
15 TMbop<:TensorMapping{T,Rb,Dim}, # Boundary operator
16 TMbqop<:TensorMapping{T,Rb,Rb}, # Boundary quadrature
17 BID<:BoundaryIdentifier} <: TensorMapping{T,Dim,Dim}
18 D::TMdiffop # Differential operator 19 D::TMdiffop # Differential operator
19 H::TMipop # Inner product operator 20 H::TensorMapping # Inner product operator
20 H_inv::TMipop # Inverse inner product operator 21 H_inv::TensorMapping # Inverse inner product operator
21 e::StaticDict{BID,TMbop} # Boundary restriction operators 22 e::StaticDict{<:BoundaryIdentifier,<:TensorMapping} # Boundary restriction operators.
22 d::StaticDict{BID,TMbop} # Normal derivative operators 23 d::StaticDict{<:BoundaryIdentifier,<:TensorMapping} # Normal derivative operators
23 H_boundary::StaticDict{BID,TMbqop} # Boundary quadrature operators 24 H_boundary::StaticDict{<:BoundaryIdentifier,<:TensorMapping} # Boundary quadrature operators # TODO: Boundary inner product?
24 end 25 end
25 export Laplace 26 export Laplace
26 27
27 function Laplace(grid::AbstractGrid, fn; order) 28 function Laplace(grid::AbstractGrid, fn; order)
28 # TODO: Removed once we can construct the volume and 29 # TODO: Removed once we can construct the volume and
48 Hᵧ_pairs = ntuple(i -> ids[i] => inner_product(boundary_grid(grid,ids[i]),H_closure_stencils),n_ids) 49 Hᵧ_pairs = ntuple(i -> ids[i] => inner_product(boundary_grid(grid,ids[i]),H_closure_stencils),n_ids)
49 50
50 return Laplace(Δ, H, H⁻¹, StaticDict(e_pairs), StaticDict(d_pairs), StaticDict(Hᵧ_pairs)) 51 return Laplace(Δ, H, H⁻¹, StaticDict(e_pairs), StaticDict(d_pairs), StaticDict(Hᵧ_pairs))
51 end 52 end
52 53
54
55 Base.show(io::IO, L::Laplace{T, Dim}) where {T,Dim} = print(io, "Laplace{$T, $Dim}(", L.D, L.H, L.H_inv, L.e, L.d, L.H_boundary, ")")
56
53 LazyTensors.range_size(L::Laplace) = LazyTensors.range_size(L.D) 57 LazyTensors.range_size(L::Laplace) = LazyTensors.range_size(L.D)
54 LazyTensors.domain_size(L::Laplace) = LazyTensors.domain_size(L.D) 58 LazyTensors.domain_size(L::Laplace) = LazyTensors.domain_size(L.D)
55 LazyTensors.apply(L::Laplace, v::AbstractArray, I...) = LazyTensors.apply(L.D,v,I...) 59 LazyTensors.apply(L::Laplace, v::AbstractArray, I...) = LazyTensors.apply(L.D,v,I...)
56 60
61
62 """
63 inner_product(L::Lapalace)
64
65 Returns the inner product operator associated with `L`
66
67 """
57 inner_product(L::Laplace) = L.H 68 inner_product(L::Laplace) = L.H
58 export inner_product 69 export inner_product
70
71
72 """
73 inverse_inner_product(L::Lapalace)
74
75 Returns the inverse of the inner product operator associated with `L`
76
77 """
59 inverse_inner_product(L::Laplace) = L.H_inv 78 inverse_inner_product(L::Laplace) = L.H_inv
60 export inverse_inner_product 79 export inverse_inner_product
80
81
82 """
83 boundary_restriction(L::Lapalace,id::BoundaryIdentifier)
84 boundary_restriction(L::Lapalace,ids::NTuple{N,BoundaryIdentifier})
85 boundary_restriction(L::Lapalace,ids...)
86
87 Returns boundary restriction operator(s) associated with `L` for the boundary(s)
88 identified by id(s).
89
90 """
61 boundary_restriction(L::Laplace,id::BoundaryIdentifier) = L.e[id] 91 boundary_restriction(L::Laplace,id::BoundaryIdentifier) = L.e[id]
62 boundary_restriction(L::Laplace,ids::NTuple{N,BoundaryIdentifier}) where N = ntuple(i->L.e[ids[i]],N) 92 boundary_restriction(L::Laplace,ids::NTuple{N,BoundaryIdentifier}) where N = ntuple(i->L.e[ids[i]],N)
63 boundary_restriction(L::Laplace,ids::Vararg{BoundaryIdentifier,N}) where N = ntuple(i->L.e[ids[i]],N) 93 boundary_restriction(L::Laplace,ids::Vararg{BoundaryIdentifier,N}) where N = ntuple(i->L.e[ids[i]],N)
64 export boundary_restriction 94 export boundary_restriction
95
96
97 """
98 normal_derivative(L::Lapalace,id::BoundaryIdentifier)
99 normal_derivative(L::Lapalace,ids::NTuple{N,BoundaryIdentifier})
100 normal_derivative(L::Lapalace,ids...)
101
102 Returns normal derivative operator(s) associated with `L` for the boundary(s)
103 identified by id(s).
104
105 """
65 normal_derivative(L::Laplace,id::BoundaryIdentifier) = L.d[id] 106 normal_derivative(L::Laplace,id::BoundaryIdentifier) = L.d[id]
66 normal_derivative(L::Laplace,ids::NTuple{N,BoundaryIdentifier}) where N = ntuple(i->L.d[ids[i]],N) 107 normal_derivative(L::Laplace,ids::NTuple{N,BoundaryIdentifier}) where N = ntuple(i->L.d[ids[i]],N)
67 normal_derivative(L::Laplace,ids::Vararg{BoundaryIdentifier,N}) where N = ntuple(i->L.d[ids[i]],N) 108 normal_derivative(L::Laplace,ids::Vararg{BoundaryIdentifier,N}) where N = ntuple(i->L.d[ids[i]],N)
68 export normal_derivative 109 export normal_derivative
110
111
69 # TODO: boundary_inner_product? 112 # TODO: boundary_inner_product?
113 """
114 boundary_quadrature(L::Lapalace,id::BoundaryIdentifier)
115 boundary_quadrature(L::Lapalace,ids::NTuple{N,BoundaryIdentifier})
116 boundary_quadrature(L::Lapalace,ids...)
117
118 Returns boundary quadrature operator(s) associated with `L` for the boundary(s)
119 identified by id(s).
120
121 """
70 boundary_quadrature(L::Laplace,id::BoundaryIdentifier) = L.H_boundary[id] 122 boundary_quadrature(L::Laplace,id::BoundaryIdentifier) = L.H_boundary[id]
71 boundary_quadrature(L::Laplace,ids::NTuple{N,BoundaryIdentifier}) where N = ntuple(i->L.H_boundary[ids[i]],N) 123 boundary_quadrature(L::Laplace,ids::NTuple{N,BoundaryIdentifier}) where N = ntuple(i->L.H_boundary[ids[i]],N)
72 boundary_quadrature(L::Laplace,ids::Vararg{BoundaryIdentifier,N}) where N = ntuple(i->L.H_boundary[ids[i]],N) 124 boundary_quadrature(L::Laplace,ids::Vararg{BoundaryIdentifier,N}) where N = ntuple(i->L.H_boundary[ids[i]],N)
73 export boundary_quadrature 125 export boundary_quadrature
126
74 127
75 """ 128 """
76 laplace(grid, inner_stencil, closure_stencils) 129 laplace(grid, inner_stencil, closure_stencils)
77 130
78 Creates the Laplace operator operator `Δ` as a `TensorMapping` 131 Creates the Laplace operator operator `Δ` as a `TensorMapping`