comparison src/SbpOperators/boundaryops/boundary_restriction.jl @ 570:a8fe91861116 feature/boundary_ops

Change order of type parameters R and N to allow skipping N
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 01 Dec 2020 15:36:35 +0100
parents 2a7a258eaaa6
children 205238c342da
comparison
equal deleted inserted replaced
569:2a7a258eaaa6 570:a8fe91861116
19 return I⊗e 19 return I⊗e
20 end 20 end
21 export boundary_restriction 21 export boundary_restriction
22 22
23 """ 23 """
24 BoundaryRestriction{T,N,R} <: TensorMapping{T,0,1} 24 BoundaryRestriction{T,R,N} <: TensorMapping{T,0,1}
25 25
26 Implements the boundary operator `e` for 1D as a TensorMapping 26 Implements the boundary operator `e` for 1D as a TensorMapping
27 `e` is the restriction of a grid function to the boundary using some `closureStencil`. 27 `e` is the restriction of a grid function to the boundary using some `closureStencil`.
28 The boundary to restrict to is determined by `R`. 28 The boundary to restrict to is determined by `R`.
29 29
30 `e'` is the prolongation of a zero dimensional array to the whole grid using the same `closureStencil`. 30 `e'` is the prolongation of a zero dimensional array to the whole grid using the same `closureStencil`.
31 """ 31 """
32 struct BoundaryRestriction{T,N,R<:Region} <: TensorMapping{T,0,1} 32 struct BoundaryRestriction{T,R<:Region,N} <: TensorMapping{T,0,1}
33 stencil::Stencil{T,N} 33 stencil::Stencil{T,N}
34 size::NTuple{1,Int} 34 size::Int
35 end 35 end
36 export BoundaryRestriction 36 export BoundaryRestriction
37 37
38 function BoundaryRestriction(grid::EquidistantGrid{1}, closureStencil::Stencil{T,N}, region::Region) where {T,N} 38 function BoundaryRestriction(grid::EquidistantGrid{1}, closureStencil::Stencil{T,N}, region::Region) where {T,N}
39 return BoundaryRestriction{T,N,typeof(region)}(closureStencil,size(grid)) 39 return BoundaryRestriction{T,typeof(region),N}(closureStencil,size(grid)[1])
40 end 40 end
41 41
42 LazyTensors.range_size(e::BoundaryRestriction) = () 42 LazyTensors.range_size(e::BoundaryRestriction) = ()
43 LazyTensors.domain_size(e::BoundaryRestriction) = e.size 43 LazyTensors.domain_size(e::BoundaryRestriction) = (e.size,)
44 44
45 function LazyTensors.apply(e::BoundaryRestriction{T,N,Lower}, v::AbstractVector{T}) where {T,N} 45 function LazyTensors.apply(e::BoundaryRestriction{T,Lower}, v::AbstractVector{T}) where T
46 apply_stencil(e.stencil,v,1) 46 apply_stencil(e.stencil,v,1)
47 end 47 end
48 48
49 function LazyTensors.apply(e::BoundaryRestriction{T,N,Upper}, v::AbstractVector{T}) where {T,N} 49 function LazyTensors.apply(e::BoundaryRestriction{T,Upper}, v::AbstractVector{T}) where T
50 apply_stencil_backwards(e.stencil,v,e.size[1]) 50 apply_stencil_backwards(e.stencil,v,e.size)
51 end 51 end
52 52
53 function LazyTensors.apply_transpose(e::BoundaryRestriction{T,N,Lower}, v::AbstractArray{T,0}, i) where {T,N} 53 function LazyTensors.apply_transpose(e::BoundaryRestriction{T,Lower}, v::AbstractArray{T,0}, i) where T
54 @boundscheck if !(0 < Int(i) <= e.size[1]) 54 @boundscheck if !(0 < Int(i) <= e.size)
55 throw(BoundsError()) 55 throw(BoundsError())
56 end 56 end
57 return e.stencil[Int(i)-1]*v[] 57 return e.stencil[Int(i)-1]*v[]
58 end 58 end
59 59
60 function LazyTensors.apply_transpose(e::BoundaryRestriction{T,N,Upper}, v::AbstractArray{T,0}, i) where {T,N} 60 function LazyTensors.apply_transpose(e::BoundaryRestriction{T,Upper}, v::AbstractArray{T,0}, i) where T
61 @boundscheck if !(0 < Int(i) <= e.size[1]) 61 @boundscheck if !(0 < Int(i) <= e.size)
62 throw(BoundsError()) 62 throw(BoundsError())
63 end 63 end
64 return e.stencil[e.size[1] - Int(i)]*v[] 64 return e.stencil[e.size[1] - Int(i)]*v[]
65 end 65 end