annotate src/SbpOperators/stencil.jl @ 671:e14627e79a54 feature/stencil_convenience

Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
author Jonatan Werpers <jonatan@werpers.com>
date Sat, 06 Feb 2021 21:42:57 +0100
parents 03ef4d4740ab
children 59a81254fefc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
671
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
1 export CenteredStencil
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
2
84
48079bd39969 Change to using tuples in stencils and ops
Jonatan Werpers <jonatan@werpers.com>
parents: 69
diff changeset
3 struct Stencil{T<:Real,N}
48079bd39969 Change to using tuples in stencils and ops
Jonatan Werpers <jonatan@werpers.com>
parents: 69
diff changeset
4 range::Tuple{Int,Int}
48079bd39969 Change to using tuples in stencils and ops
Jonatan Werpers <jonatan@werpers.com>
parents: 69
diff changeset
5 weights::NTuple{N,T}
126
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
6
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
7 function Stencil(range::Tuple{Int,Int},weights::NTuple{N,T}) where {T <: Real, N}
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
8 @assert range[2]-range[1]+1 == N
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
9 new{T,N}(range,weights)
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
10 end
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
11 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12
584
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
13 """
595
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
14 Stencil(weights::NTuple; center::Int)
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
15
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
16 Create a stencil with the given weights with element `center` as the center of the stencil.
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
17 """
671
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
18 function Stencil(weights::Vararg{Number}; center::Int)
595
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
19 N = length(weights)
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
20 range = (1, N) .- center
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
21
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
22 return Stencil(range, weights)
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
23 end
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
24
671
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
25
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
26 function CenteredStencil(weights::Vararg)
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
27 if iseven(length(weights))
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
28 throw(ArgumentError("a centered stencil must have an odd number of weights."))
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
29 end
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
30
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
31 r = length(weights) ÷ 2
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
32
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
33 return Stencil((-r, r), weights)
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
34 end
e14627e79a54 Add stencil constructor for centered stencils and change from tuple to vararg in stencil constructor taking cneter
Jonatan Werpers <jonatan@werpers.com>
parents: 595
diff changeset
35
595
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
36 """
584
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
37 scale(s::Stencil, a)
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
38
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
39 Scale the weights of the stencil `s` with `a` and return a new stencil.
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
40 """
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
41 function scale(s::Stencil, a)
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
42 return Stencil(s.range, a.*s.weights)
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
43 end
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
44
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
45 Base.eltype(::Stencil{T}) where T = T
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
46
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47 function flip(s::Stencil)
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
48 range = (-s.range[2], -s.range[1])
84
48079bd39969 Change to using tuples in stencils and ops
Jonatan Werpers <jonatan@werpers.com>
parents: 69
diff changeset
49 return Stencil(range, reverse(s.weights))
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
50 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
51
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
52 # Provides index into the Stencil based on offset for the root element
128
7c0b9bb7ab4d Improve stencil application code to make it more friendly to compiler optimizations
Jonatan Werpers <jonatan@werpers.com>
parents: 122
diff changeset
53 @inline function Base.getindex(s::Stencil, i::Int)
71
18d0d794d3bb Make stencils respond to @ inbounds
Jonatan Werpers <jonatan@werpers.com>
parents: 67
diff changeset
54 @boundscheck if i < s.range[1] || s.range[2] < i
584
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
55 return zero(eltype(s))
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56 end
71
18d0d794d3bb Make stencils respond to @ inbounds
Jonatan Werpers <jonatan@werpers.com>
parents: 67
diff changeset
57 return s.weights[1 + i - s.range[1]]
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
58 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
59
269
ccef055233a2 Move general methods for D2 to ConstantStencilOperator and increase verbosity of method names for clarity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 219
diff changeset
60 Base.@propagate_inbounds @inline function apply_stencil(s::Stencil{T,N}, v::AbstractVector, i::Int) where {T,N}
131
8569c637d923 Enable compiler loop-unrolling in apply_backwards
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
61 w = s.weights[1]*v[i + s.range[1]]
129
1aaeb46ba5f4 Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 128
diff changeset
62 @simd for k ∈ 2:N
131
8569c637d923 Enable compiler loop-unrolling in apply_backwards
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
63 w += s.weights[k]*v[i + s.range[1] + k-1]
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
64 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
65 return w
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
66 end
122
6c6979ff17f4 Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
67
269
ccef055233a2 Move general methods for D2 to ConstantStencilOperator and increase verbosity of method names for clarity
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 219
diff changeset
68 Base.@propagate_inbounds @inline function apply_stencil_backwards(s::Stencil{T,N}, v::AbstractVector, i::Int) where {T,N}
131
8569c637d923 Enable compiler loop-unrolling in apply_backwards
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
69 w = s.weights[N]*v[i - s.range[2]]
8569c637d923 Enable compiler loop-unrolling in apply_backwards
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
70 @simd for k ∈ N-1:-1:1
8569c637d923 Enable compiler loop-unrolling in apply_backwards
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
71 w += s.weights[k]*v[i - s.range[1] - k + 1]
122
6c6979ff17f4 Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
72 end
6c6979ff17f4 Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
73 return w
6c6979ff17f4 Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
74 end