Mercurial > repos > public > sbplib_julia
comparison src/SbpOperators/volumeops/laplace/laplace.jl @ 873:9929c99754fb laplace_benchmarks
Add some benchmarks using the Laplace Operator Set
| author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
|---|---|
| date | Wed, 19 Jan 2022 13:15:45 +0100 |
| parents | 1970ebceabe4 |
| children | 067a322e4f73 |
comparison
equal
deleted
inserted
replaced
| 865:545a6c1a0a0e | 873:9929c99754fb |
|---|---|
| 20 H::TensorMapping # Inner product operator | 20 H::TensorMapping # Inner product operator |
| 21 H_inv::TensorMapping # Inverse inner product operator | 21 H_inv::TensorMapping # Inverse inner product operator |
| 22 e::StaticDict{<:BoundaryIdentifier,<:TensorMapping} # Boundary restriction operators. | 22 e::StaticDict{<:BoundaryIdentifier,<:TensorMapping} # Boundary restriction operators. |
| 23 d::StaticDict{<:BoundaryIdentifier,<:TensorMapping} # Normal derivative operators | 23 d::StaticDict{<:BoundaryIdentifier,<:TensorMapping} # Normal derivative operators |
| 24 H_boundary::StaticDict{<:BoundaryIdentifier,<:TensorMapping} # Boundary quadrature operators # TODO: Boundary inner product? | 24 H_boundary::StaticDict{<:BoundaryIdentifier,<:TensorMapping} # Boundary quadrature operators # TODO: Boundary inner product? |
| 25 order::Int | |
| 25 end | 26 end |
| 26 export Laplace | 27 export Laplace |
| 27 | 28 |
| 28 function Laplace(grid::AbstractGrid, fn; order) | 29 function Laplace(grid::AbstractGrid, fn; order) |
| 29 # TODO: Removed once we can construct the volume and | 30 # TODO: Removed once we can construct the volume and |
| 46 n_ids = length(ids) | 47 n_ids = length(ids) |
| 47 e_pairs = ntuple(i -> ids[i] => boundary_restriction(grid,e_closure_stencil,ids[i]),n_ids) | 48 e_pairs = ntuple(i -> ids[i] => boundary_restriction(grid,e_closure_stencil,ids[i]),n_ids) |
| 48 d_pairs = ntuple(i -> ids[i] => normal_derivative(grid,d_closure_stencil,ids[i]),n_ids) | 49 d_pairs = ntuple(i -> ids[i] => normal_derivative(grid,d_closure_stencil,ids[i]),n_ids) |
| 49 Hᵧ_pairs = ntuple(i -> ids[i] => inner_product(boundary_grid(grid,ids[i]),H_closure_stencils),n_ids) | 50 Hᵧ_pairs = ntuple(i -> ids[i] => inner_product(boundary_grid(grid,ids[i]),H_closure_stencils),n_ids) |
| 50 | 51 |
| 51 return Laplace(Δ, H, H⁻¹, StaticDict(e_pairs), StaticDict(d_pairs), StaticDict(Hᵧ_pairs)) | 52 return Laplace(Δ, H, H⁻¹, StaticDict(e_pairs), StaticDict(d_pairs), StaticDict(Hᵧ_pairs), order) |
| 52 end | 53 end |
| 53 | 54 |
| 54 # TODO: Consider pretty printing of the following form | 55 # TODO: Consider pretty printing of the following form |
| 55 # Base.show(io::IO, L::Laplace{T, Dim}) where {T,Dim,TM} = print(io, "Laplace{$T, $Dim, $TM}(", L.D, L.H, L.H_inv, L.e, L.d, L.H_boundary, ")") | 56 # Base.show(io::IO, L::Laplace{T, Dim}) where {T,Dim,TM} = print(io, "Laplace{$T, $Dim, $TM}(", L.D, L.H, L.H_inv, L.e, L.d, L.H_boundary, ")") |
| 56 | 57 |
| 57 LazyTensors.range_size(L::Laplace) = LazyTensors.range_size(L.D) | 58 LazyTensors.range_size(L::Laplace) = LazyTensors.range_size(L.D) |
| 58 LazyTensors.domain_size(L::Laplace) = LazyTensors.domain_size(L.D) | 59 LazyTensors.domain_size(L::Laplace) = LazyTensors.domain_size(L.D) |
| 59 LazyTensors.apply(L::Laplace, v::AbstractArray, I...) = LazyTensors.apply(L.D,v,I...) | 60 LazyTensors.apply(L::Laplace, v::AbstractArray, I...) = LazyTensors.apply(L.D,v,I...) |
| 60 | 61 |
| 62 """ | |
| 63 closure_size(L::Lapalace) | |
| 64 | |
| 65 Returns the inner product operator associated with `L` | |
| 66 | |
| 67 """ | |
| 68 closure_size(L::Laplace) = closure_size(L.D) | |
| 69 export closure_size | |
| 61 | 70 |
| 62 """ | 71 """ |
| 63 inner_product(L::Lapalace) | 72 inner_product(L::Lapalace) |
| 64 | 73 |
| 65 Returns the inner product operator associated with `L` | 74 Returns the inner product operator associated with `L` |
| 122 boundary_quadrature(L::Laplace,id::BoundaryIdentifier) = L.H_boundary[id] | 131 boundary_quadrature(L::Laplace,id::BoundaryIdentifier) = L.H_boundary[id] |
| 123 boundary_quadrature(L::Laplace,ids::NTuple{N,BoundaryIdentifier}) where N = ntuple(i->L.H_boundary[ids[i]],N) | 132 boundary_quadrature(L::Laplace,ids::NTuple{N,BoundaryIdentifier}) 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) | 133 boundary_quadrature(L::Laplace,ids::Vararg{BoundaryIdentifier,N}) where N = ntuple(i->L.H_boundary[ids[i]],N) |
| 125 export boundary_quadrature | 134 export boundary_quadrature |
| 126 | 135 |
| 136 abstract type BoundaryConditionType end | |
| 137 struct NeumannBC <: BoundaryConditionType end | |
| 138 struct DirichletBC <: BoundaryConditionType end | |
| 139 export NeumannBC | |
| 140 | |
| 141 boundary_condition(L, id, ::NeumannBC) = neumann_bc(L, id) | |
| 142 boundary_condition(L, id, ::DirichletBC) = dirichlet_bc(L, id) | |
| 143 export boundary_condition | |
| 144 | |
| 145 function neumann_bc(L::Laplace, id::BoundaryIdentifier) | |
| 146 H_inv = inverse_inner_product(L) | |
| 147 e = boundary_restriction(L,id) | |
| 148 d = normal_derivative(L,id) | |
| 149 H_b = boundary_quadrature(L,id) | |
| 150 tau = H_inv∘e'∘H_b | |
| 151 closure = tau∘d | |
| 152 # TODO: Return penalty once we have implemented scalar scaling of the operators. | |
| 153 return closure | |
| 154 end | |
| 155 | |
| 156 function dirichlet_bc(L::Laplace, id::BoundaryIdentifier) | |
| 157 error("Not implemented") | |
| 158 # H_inv = inverse_inner_product(L) | |
| 159 # e = boundary_restriction(L,id) | |
| 160 # d = normal_derivative(L,id) | |
| 161 # H_b = boundary_quadrature(L,id) | |
| 162 # gamma = borrowing_parameter(L) | |
| 163 # tuning = 1.2 | |
| 164 # S = ScalingOperator(tuning * -1.0/gamma) | |
| 165 # tau = H_inv∘(S∘e' + d')∘H_b | |
| 166 # closure = tau∘e | |
| 167 # penalty = ScalingOperator(-1)∘tau | |
| 168 # return (closure, penalty) | |
| 169 end | |
| 170 | |
| 171 # function borrowing_parameter(L) | |
| 172 # if L.order == 2 | |
| 173 # return 0.4 | |
| 174 # elseif L.order == 4 | |
| 175 # return 0.2508 | |
| 176 # elseif L.order == 6 | |
| 177 # return 0.1878 | |
| 178 # elseif L.order == 8 | |
| 179 # return 0.0015 | |
| 180 # elseif L.order == 10 | |
| 181 # return 0.0351 | |
| 182 # end | |
| 183 # end | |
| 127 | 184 |
| 128 """ | 185 """ |
| 129 laplace(grid, inner_stencil, closure_stencils) | 186 laplace(grid, inner_stencil, closure_stencils) |
| 130 | 187 |
| 131 Creates the Laplace operator operator `Δ` as a `TensorMapping` | 188 Creates the Laplace operator operator `Δ` as a `TensorMapping` |
