comparison src/SbpOperators/volumeops/laplace/laplace.jl @ 704:a7efedbdede9 feature/laplace_opset

Update docs
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Mon, 15 Feb 2021 17:31:32 +0100
parents 3cd582257072
children 693f5487ddba
comparison
equal deleted inserted replaced
703:988e9cfcd58d 704:a7efedbdede9
1 """ 1 """
2 Laplace{T,Dim,...}() 2 Laplace{T, Dim, ...} <: TensorMapping{T,Dim,Dim}
3 Laplace(grid::EquidistantGrid, fn; order) 3 Laplace(grid::EquidistantGrid, 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 quadrature, 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::EquidistantGrid, fn; order) creates the Laplace operator on an 9 Laplace(grid::EquidistantGrid, fn; order) creates the Laplace operator on an
10 equidistant grid, where the operators are read from a TOML. The laplace operator 10 equidistant grid, where the operators are read from a TOML. The differential operator
11 is created using laplace(grid,...). 11 is created using `laplace(grid,...)`.
12 """ 12 """
13 struct Laplace{T, Dim, Rb, TMdiffop<:TensorMapping{T,Dim,Dim}, # Differential operator tensor mapping 13 struct Laplace{T, Dim, Rb, TMdiffop<:TensorMapping{T,Dim,Dim}, # Differential operator
14 TMqop<:TensorMapping{T,Dim,Dim}, # Quadrature operator tensor mapping 14 TMipop<:TensorMapping{T,Dim,Dim}, # Inner product operator
15 TMbop<:TensorMapping{T,Rb,Dim}, # Boundary operator tensor mapping 15 TMbop<:TensorMapping{T,Rb,Dim}, # Boundary operator
16 TMbqop<:TensorMapping{T,Rb,Rb}, # Boundary quadrature tensor mapping 16 TMbqop<:TensorMapping{T,Rb,Rb}, # Boundary quadrature
17 BID<:BoundaryIdentifier} <: TensorMapping{T,Dim,Dim} 17 BID<:BoundaryIdentifier} <: TensorMapping{T,Dim,Dim}
18 D::TMdiffop # Difference operator 18 D::TMdiffop # Difference operator
19 H::TMqop # Quadrature (norm) operator 19 H::TMipop # Inner product operator
20 H_inv::TMqop # Inverse quadrature (norm) operator 20 H_inv::TMipop # Inverse inner product operator
21 e::Dict{BID,TMbop} # Boundary restriction operators 21 e::Dict{BID,TMbop} # Boundary restriction operators
22 d::Dict{BID,TMbop} # Normal derivative operators 22 d::Dict{BID,TMbop} # Normal derivative operators
23 H_boundary::Dict{BID,TMbqop} # Boundary quadrature operators 23 H_boundary::Dict{BID,TMbqop} # Boundary quadrature operators
24 end 24 end
25 export Laplace 25 export Laplace
51 51
52 LazyTensors.range_size(L::Laplace) = LazyTensors.range_size(L.D) 52 LazyTensors.range_size(L::Laplace) = LazyTensors.range_size(L.D)
53 LazyTensors.domain_size(L::Laplace) = LazyTensors.domain_size(L.D) 53 LazyTensors.domain_size(L::Laplace) = LazyTensors.domain_size(L.D)
54 LazyTensors.apply(L::Laplace, v::AbstractArray, I...) = LazyTensors.apply(L.D,v,I...) 54 LazyTensors.apply(L::Laplace, v::AbstractArray, I...) = LazyTensors.apply(L.D,v,I...)
55 55
56 quadrature(L::Laplace) = L.H 56 inner_product(L::Laplace) = L.H
57 export quadrature 57 export inner_product
58 inverse_quadrature(L::Laplace) = L.H_inv 58 inverse_inner_product(L::Laplace) = L.H_inv
59 export inverse_quadrature 59 export inverse_inner_product
60 boundary_restriction(L::Laplace,bid::BoundaryIdentifier) = L.e[bid] 60 boundary_restriction(L::Laplace,bid::BoundaryIdentifier) = L.e[bid]
61 export boundary_restriction 61 export boundary_restriction
62 normal_derivative(L::Laplace,bid::BoundaryIdentifier) = L.d[bid] 62 normal_derivative(L::Laplace,bid::BoundaryIdentifier) = L.d[bid]
63 export normal_derivative 63 export normal_derivative
64 boundary_quadrature(L::Laplace,bid::BoundaryIdentifier) = L.H_boundary[bid] 64 boundary_quadrature(L::Laplace,bid::BoundaryIdentifier) = L.H_boundary[bid]
65 export boundary_quadrature 65 export boundary_quadrature
66 66
67 """ 67 """
68 laplace(grid::EquidistantGrid{Dim}, inner_stencil, closure_stencils) 68 laplace(grid::EquidistantGrid, inner_stencil, closure_stencils)
69 69
70 Creates the Laplace operator operator `Δ` as a `TensorMapping` 70 Creates the Laplace operator operator `Δ` as a `TensorMapping`
71 71
72 `Δ` approximates the Laplace operator ∑d²/xᵢ² , i = 1,...,`Dim` on `grid`, using 72 `Δ` approximates the Laplace operator ∑d²/xᵢ² , i = 1,...,N on the N-dimensional
73 the stencil `inner_stencil` in the interior and a set of stencils `closure_stencils` 73 `grid`, using the stencil `inner_stencil` in the interior and a set of stencils
74 for the points in the closure regions. 74 `closure_stencils` for the points in the closure regions.
75 75
76 On a one-dimensional `grid`, `Δ` is equivalent to `second_derivative`. On a 76 On a one-dimensional `grid`, `Δ` is equivalent to `second_derivative`. On a
77 multi-dimensional `grid`, `Δ` is the sum of multi-dimensional `second_derivative`s 77 multi-dimensional `grid`, `Δ` is the sum of multi-dimensional `second_derivative`s
78 where the sum is carried out lazily. 78 where the sum is carried out lazily.
79 """ 79 """
80 function laplace(grid::EquidistantGrid{Dim}, inner_stencil, closure_stencils) where Dim 80 function laplace(grid::EquidistantGrid, inner_stencil, closure_stencils)
81 Δ = second_derivative(grid, inner_stencil, closure_stencils, 1) 81 Δ = second_derivative(grid, inner_stencil, closure_stencils, 1)
82 for d = 2:Dim 82 for d = 2:dimension(grid)
83 Δ += second_derivative(grid, inner_stencil, closure_stencils, d) 83 Δ += second_derivative(grid, inner_stencil, closure_stencils, d)
84 end 84 end
85 return Δ 85 return Δ
86 end 86 end
87 export laplace 87 export laplace