annotate src/SbpOperators/stencil.jl @ 1058:c4f71d6f2d63 feature/nested_stencils

Add functions for converting the element type of nested stencils (grafted from 54e36688dab85d935058d31c82f9ec00f03637ff)
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 10 Feb 2022 10:57:00 +0100
parents 0728e84af0dc
children 004324d7ed35
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
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
2 export CenteredNestedStencil
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
3
806
9fc6d38da03f Remove type requirement for stencil weights
Jonatan Werpers <jonatan@werpers.com>
parents: 672
diff changeset
4 struct Stencil{T,N}
84
48079bd39969 Change to using tuples in stencils and ops
Jonatan Werpers <jonatan@werpers.com>
parents: 69
diff changeset
5 range::Tuple{Int,Int}
48079bd39969 Change to using tuples in stencils and ops
Jonatan Werpers <jonatan@werpers.com>
parents: 69
diff changeset
6 weights::NTuple{N,T}
126
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
7
806
9fc6d38da03f Remove type requirement for stencil weights
Jonatan Werpers <jonatan@werpers.com>
parents: 672
diff changeset
8 function Stencil(range::Tuple{Int,Int},weights::NTuple{N,T}) where {T, N}
126
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
9 @assert range[2]-range[1]+1 == N
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
10 new{T,N}(range,weights)
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
11 end
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
13
584
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
14 """
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
15 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
16
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 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
18 """
807
1fc6c4daec44 Add type parameter to Vararg to make better error messages when Stencil is called with incompatible weights
Jonatan Werpers <jonatan@werpers.com>
parents: 806
diff changeset
19 function Stencil(weights::Vararg{T}; center::Int) where T # Type parameter T makes sure the weights are valid for the Stencil constuctors and throws an earlier, more readable, error
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
20 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
21 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
22
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 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
24 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
25
826
4433be383840 Add stencil constructor to change the type of the weights along with a convert method
Jonatan Werpers <jonatan@werpers.com>
parents: 807
diff changeset
26 function Stencil{T}(s::Stencil) where T
4433be383840 Add stencil constructor to change the type of the weights along with a convert method
Jonatan Werpers <jonatan@werpers.com>
parents: 807
diff changeset
27 return Stencil(s.range, T.(s.weights))
4433be383840 Add stencil constructor to change the type of the weights along with a convert method
Jonatan Werpers <jonatan@werpers.com>
parents: 807
diff changeset
28 end
4433be383840 Add stencil constructor to change the type of the weights along with a convert method
Jonatan Werpers <jonatan@werpers.com>
parents: 807
diff changeset
29
4433be383840 Add stencil constructor to change the type of the weights along with a convert method
Jonatan Werpers <jonatan@werpers.com>
parents: 807
diff changeset
30 Base.convert(::Type{Stencil{T}}, stencil) where T = Stencil{T}(stencil)
4433be383840 Add stencil constructor to change the type of the weights along with a convert method
Jonatan Werpers <jonatan@werpers.com>
parents: 807
diff changeset
31
1056
fe83ea1db953 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 1055
diff changeset
32 function CenteredStencil(weights::Vararg{T}) where T
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
33 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
34 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
35 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
36
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
37 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
38
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
39 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
40 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
41
672
59a81254fefc Formatting
Jonatan Werpers <jonatan@werpers.com>
parents: 671
diff changeset
42
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
43 """
584
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
44 scale(s::Stencil, a)
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
45
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
46 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
47 """
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
48 function scale(s::Stencil, a)
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
49 return Stencil(s.range, a.*s.weights)
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
50 end
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
51
1057
0728e84af0dc Add length method for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 1056
diff changeset
52 Base.eltype(::Stencil{T,N}) where {T,N} = T
0728e84af0dc Add length method for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 1056
diff changeset
53 Base.length(::Stencil{T,N}) where {T,N} = N
584
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
54
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
55 function flip(s::Stencil)
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56 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
57 return Stencil(range, reverse(s.weights))
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
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
60 # 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
61 @inline function Base.getindex(s::Stencil, i::Int)
71
18d0d794d3bb Make stencils respond to @ inbounds
Jonatan Werpers <jonatan@werpers.com>
parents: 67
diff changeset
62 @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
63 return zero(eltype(s))
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
64 end
71
18d0d794d3bb Make stencils respond to @ inbounds
Jonatan Werpers <jonatan@werpers.com>
parents: 67
diff changeset
65 return s.weights[1 + i - s.range[1]]
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
66 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
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(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[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
70 @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
71 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
72 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
73 return w
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
74 end
122
6c6979ff17f4 Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
75
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
76 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
77 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
78 @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
79 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
80 end
6c6979ff17f4 Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
81 return w
6c6979ff17f4 Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
82 end
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
83
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
84
1056
fe83ea1db953 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 1055
diff changeset
85 struct NestedStencil{T,N,M}
fe83ea1db953 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 1055
diff changeset
86 s::Stencil{Stencil{T,N},M}
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
87 end
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
88
1056
fe83ea1db953 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 1055
diff changeset
89 # The exessive use of type parameters for the following constructors are to catch errors earlier with clearer error messages
fe83ea1db953 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 1055
diff changeset
90
1055
df498ce0cf52 Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents: 1053
diff changeset
91 # Stencil input
1056
fe83ea1db953 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 1055
diff changeset
92 NestedStencil(s::Vararg{Stencil{T,N}}; center) where {T,N} = NestedStencil(Stencil(s... ; center))
fe83ea1db953 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 1055
diff changeset
93 CenteredNestedStencil(s::Vararg{Stencil{T,N}}) where {T,N} = NestedStencil(CenteredStencil(s...))
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
94
1055
df498ce0cf52 Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents: 1053
diff changeset
95 # Tuple input
1056
fe83ea1db953 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 1055
diff changeset
96 function NestedStencil(weights::Vararg{NTuple{N,T}}; center) where {T,N}
1053
cb0a5f41be02 Add some tests and fix some bugs
Jonatan Werpers <jonatan@werpers.com>
parents: 1052
diff changeset
97 inner_stencils = map(w -> Stencil(w...; center), weights)
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
98 return NestedStencil(Stencil(inner_stencils... ; center))
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
99 end
1056
fe83ea1db953 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 1055
diff changeset
100 function CenteredNestedStencil(weights::Vararg{NTuple{N,T}}) where {T,N}
1055
df498ce0cf52 Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents: 1053
diff changeset
101 inner_stencils = map(w->CenteredStencil(w...), weights)
df498ce0cf52 Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents: 1053
diff changeset
102 return CenteredNestedStencil(inner_stencils...)
df498ce0cf52 Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents: 1053
diff changeset
103 end
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
104
1058
c4f71d6f2d63 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 1057
diff changeset
105
c4f71d6f2d63 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 1057
diff changeset
106 # Conversion
c4f71d6f2d63 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 1057
diff changeset
107 function NestedStencil{T}(ns::NestedStencil) where T
c4f71d6f2d63 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 1057
diff changeset
108 return NestedStencil(Stencil{Stencil{T}}(ns.s))
c4f71d6f2d63 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 1057
diff changeset
109 end
c4f71d6f2d63 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 1057
diff changeset
110
c4f71d6f2d63 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 1057
diff changeset
111 Base.convert(::Type{NestedStencil{T}}, stencil) where T = NestedStencil{T}(stencil)
c4f71d6f2d63 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 1057
diff changeset
112
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
113 Base.eltype(::NestedStencil{T}) where T = T
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
114
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
115 function flip(ns::NestedStencil)
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
116 s_flip = flip(ns.s)
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
117 return NestedStencil(Stencil(s_flip.range, flip.(s_flip.weights)))
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
118 end
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
119
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
120 Base.getindex(ns::NestedStencil, i::Int) = ns.s[i]
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
121
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
122 "Apply inner stencils to `c` and get a concrete stencil"
1053
cb0a5f41be02 Add some tests and fix some bugs
Jonatan Werpers <jonatan@werpers.com>
parents: 1052
diff changeset
123 Base.@propagate_inbounds function apply_inner_stencils(ns::NestedStencil, c::AbstractVector, i::Int)
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
124 weights = apply_stencil.(ns.s.weights, Ref(c), i)
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
125 return Stencil(ns.s.range, weights)
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
126 end
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
127
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
128 "Apply the whole nested stencil"
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
129 Base.@propagate_inbounds function apply_stencil(ns::NestedStencil, c::AbstractVector, v::AbstractVector, i::Int)
1053
cb0a5f41be02 Add some tests and fix some bugs
Jonatan Werpers <jonatan@werpers.com>
parents: 1052
diff changeset
130 s = apply_inner_stencils(ns,c,i)
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
131 return apply_stencil(s, v, i)
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
132 end
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
133
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
134 "Apply inner stencils backwards to `c` and get a concrete stencil"
1053
cb0a5f41be02 Add some tests and fix some bugs
Jonatan Werpers <jonatan@werpers.com>
parents: 1052
diff changeset
135 Base.@propagate_inbounds @inline function apply_inner_stencils_backwards(ns::NestedStencil, c::AbstractVector, i::Int)
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
136 weights = apply_stencil_backwards.(ns.s.weights, Ref(c), i)
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
137 return Stencil(ns.s.range, weights)
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
138 end
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
139
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
140 "Apply the whole nested stencil backwards"
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
141 Base.@propagate_inbounds @inline function apply_stencil_backwards(ns::NestedStencil, c::AbstractVector, v::AbstractVector, i::Int)
1053
cb0a5f41be02 Add some tests and fix some bugs
Jonatan Werpers <jonatan@werpers.com>
parents: 1052
diff changeset
142 s = apply_inner_stencils_backwards(ns,c,i)
1052
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
143 return apply_stencil_backwards(s, v, i)
ca718fd4e816 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
144 end