annotate src/SbpOperators/stencil.jl @ 1763:65fd5331caa5 feature/jet_aqua

Fix more ambiguities
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 13 Sep 2024 16:03:06 +0200
parents d28562d5ca8f
children 244311761969
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
867
313648b01504 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}
899
18f63f1a0c44 Fix bugs from stencil refactor
Jonatan Werpers <jonatan@werpers.com>
parents: 898
diff changeset
5 range::UnitRange{Int64}
84
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
1759
d28562d5ca8f Remove unbound parameter for Stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 1758
diff changeset
8 function Stencil(range::UnitRange,weights::NTuple{N,Any}) where N
d28562d5ca8f Remove unbound parameter for Stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 1758
diff changeset
9 T = eltype(weights)
d28562d5ca8f Remove unbound parameter for Stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 1758
diff changeset
10
897
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
11 @assert length(range) == N
126
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
12 new{T,N}(range,weights)
66c239678a21 Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents: 85
diff changeset
13 end
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
14 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
15
584
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
16 """
1759
d28562d5ca8f Remove unbound parameter for Stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 1758
diff changeset
17 Stencil(weights...; 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
18
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 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
20 """
897
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
21 function Stencil(weights...; center::Int)
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
22 weights = promote(weights...)
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
23 N = length(weights)
897
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
24 range = (1:N) .- center
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
25
03ef4d4740ab Add a constructor for Stencil where you can specify the center of the stencil
Jonatan Werpers <jonatan@werpers.com>
parents: 584
diff changeset
26 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
27 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
28
897
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
29 Stencil{T,N}(s::Stencil{S,N}) where {T,S,N} = Stencil(s.range, T.(s.weights))
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
30 Stencil{T}(s::Stencil) where T = Stencil{T,length(s)}(s)
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
31
897
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
32 Base.convert(::Type{Stencil{T1,N}}, s::Stencil{T2,N}) where {T1,T2,N} = Stencil{T1,N}(s)
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
33 Base.convert(::Type{Stencil{T1}}, s::Stencil{T2,N}) where {T1,T2,N} = Stencil{T1,N}(s)
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
34
897
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
35 Base.promote_rule(::Type{Stencil{T1,N}}, ::Type{Stencil{T2,N}}) where {T1,T2,N} = Stencil{promote_type(T1,T2),N}
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
36
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
37 function CenteredStencil(weights...)
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
38 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
39 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
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
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
42 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
43
897
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
44 return Stencil(-r:r, weights)
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
45 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
46
672
59a81254fefc Formatting
Jonatan Werpers <jonatan@werpers.com>
parents: 671
diff changeset
47
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
48 """
584
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
49 scale(s::Stencil, a)
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
50
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
51 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
52 """
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
53 function scale(s::Stencil, a)
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
54 return Stencil(s.range, a.*s.weights)
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
55 end
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
56
887
0be29e65521e Add length method for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 880
diff changeset
57 Base.eltype(::Stencil{T,N}) where {T,N} = T
0be29e65521e Add length method for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 880
diff changeset
58 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
59
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
60 function flip(s::Stencil)
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
61 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
62 return Stencil(range, reverse(s.weights))
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
63 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
64
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
65 # 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
66 @inline function Base.getindex(s::Stencil, i::Int)
897
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
67 @boundscheck if i โˆ‰ s.range
584
4aa7fe13a984 Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
68 return zero(eltype(s))
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
69 end
71
18d0d794d3bb Make stencils respond to @ inbounds
Jonatan Werpers <jonatan@werpers.com>
parents: 67
diff changeset
70 return s.weights[1 + i - s.range[1]]
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
71 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
72
897
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
73 Base.@propagate_inbounds @inline function apply_stencil(s::Stencil, v::AbstractVector, i::Int)
1544
7cfa729e256d Remove ineffective @inline
Jonatan Werpers <jonatan@werpers.com>
parents: 1460
diff changeset
74 return sum(enumerate(s.weights)) do (k,w) #TBD: Which optimizations are needed here?
1459
c8cca833862d Try to sum over more static objects
Jonatan Werpers <jonatan@werpers.com>
parents: 1457
diff changeset
75 w*v[i + @inbounds s.range[k]]
8
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
76 end
433008d3b7d3 Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
77 end
122
6c6979ff17f4 Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
78
897
737cd68318c7 Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents: 896
diff changeset
79 Base.@propagate_inbounds @inline function apply_stencil_backwards(s::Stencil, v::AbstractVector, i::Int)
1544
7cfa729e256d Remove ineffective @inline
Jonatan Werpers <jonatan@werpers.com>
parents: 1460
diff changeset
80 return sum(enumerate(s.weights)) do (k,w) #TBD: Which optimizations are needed here?
1459
c8cca833862d Try to sum over more static objects
Jonatan Werpers <jonatan@werpers.com>
parents: 1457
diff changeset
81 w*v[i - @inbounds s.range[k]]
122
6c6979ff17f4 Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
82 end
6c6979ff17f4 Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
83 end
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
84
1546
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
85 # There are many options for the implementation of `apply_stencil` and
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
86 # `apply_stencil_backwards`. Some alternatives were tried on the branch
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
87 # bugfix/sbp_operators/stencil_return_type and can be found at the following
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
88 # revision:
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
89 #
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
90 # * 237b980ffb91 (baseline)
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
91 # * a72bab15228e (mapreduce)
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
92 # * ffd735354d54 (multiplication)
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
93 # * b5abd5191f2c (promote_op)
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
94 # * 8d56846185fc (return_type)
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
95 #
8b9cdadb845a Add some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1544
diff changeset
96
1032
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
97 function left_pad(s::Stencil, N)
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
98 weights = LazyTensors.left_pad_tuple(s.weights, zero(eltype(s)), N)
1072
14cb97284373 Merge default
Jonatan Werpers <jonatan@werpers.com>
parents: 1032 905
diff changeset
99 range = (first(s.range) - (N - length(s.weights))):last(s.range)
1032
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
100
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
101 return Stencil(range, weights)
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
102 end
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
103
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
104 function right_pad(s::Stencil, N)
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
105 weights = LazyTensors.right_pad_tuple(s.weights, zero(eltype(s)), N)
1072
14cb97284373 Merge default
Jonatan Werpers <jonatan@werpers.com>
parents: 1032 905
diff changeset
106 range = first(s.range):(last(s.range) + (N - length(s.weights)))
1032
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
107
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
108 return Stencil(range, weights)
11767fbb29f4 Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
109 end
1072
14cb97284373 Merge default
Jonatan Werpers <jonatan@werpers.com>
parents: 1032 905
diff changeset
110
14cb97284373 Merge default
Jonatan Werpers <jonatan@werpers.com>
parents: 1032 905
diff changeset
111
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
112
880
f74189c954d6 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 879
diff changeset
113 struct NestedStencil{T,N,M}
f74189c954d6 Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents: 879
diff changeset
114 s::Stencil{Stencil{T,N},M}
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
115 end
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
116
1763
65fd5331caa5 Fix more ambiguities
Jonatan Werpers <jonatan@werpers.com>
parents: 1759
diff changeset
117 NestedStencil(;center) = NestedStencil(Stencil(;center))
65fd5331caa5 Fix more ambiguities
Jonatan Werpers <jonatan@werpers.com>
parents: 1759
diff changeset
118 CenteredNestedStencil() = NestedStencil(CenteredStencil())
65fd5331caa5 Fix more ambiguities
Jonatan Werpers <jonatan@werpers.com>
parents: 1759
diff changeset
119
879
011d3ff65e9f Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents: 868
diff changeset
120 # Stencil input
898
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
121 NestedStencil(s::Vararg{Stencil}; center) = NestedStencil(Stencil(s... ; center))
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
122 CenteredNestedStencil(s::Vararg{Stencil}) = NestedStencil(CenteredStencil(s...))
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
123
879
011d3ff65e9f Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents: 868
diff changeset
124 # Tuple input
1758
d8fabe814d06 Fix unbound parameters for NestedStencil
Jonatan Werpers <jonatan@werpers.com>
parents: 1546
diff changeset
125 function NestedStencil(weights::Vararg{NTuple{N,Any} where N}; center)
868
e37ee63bf9ac Add some tests and fix some bugs
Jonatan Werpers <jonatan@werpers.com>
parents: 867
diff changeset
126 inner_stencils = map(w -> Stencil(w...; center), weights)
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
127 return NestedStencil(Stencil(inner_stencils... ; center))
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
128 end
1758
d8fabe814d06 Fix unbound parameters for NestedStencil
Jonatan Werpers <jonatan@werpers.com>
parents: 1546
diff changeset
129
d8fabe814d06 Fix unbound parameters for NestedStencil
Jonatan Werpers <jonatan@werpers.com>
parents: 1546
diff changeset
130 function CenteredNestedStencil(weights::Vararg{NTuple{N,Any} where N})
879
011d3ff65e9f Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents: 868
diff changeset
131 inner_stencils = map(w->CenteredStencil(w...), weights)
011d3ff65e9f Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents: 868
diff changeset
132 return CenteredNestedStencil(inner_stencils...)
011d3ff65e9f Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents: 868
diff changeset
133 end
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
134
894
54e36688dab8 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 887
diff changeset
135 # Conversion
898
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
136 function NestedStencil{T,N,M}(ns::NestedStencil{S,N,M}) where {T,S,N,M}
894
54e36688dab8 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 887
diff changeset
137 return NestedStencil(Stencil{Stencil{T}}(ns.s))
54e36688dab8 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 887
diff changeset
138 end
54e36688dab8 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 887
diff changeset
139
898
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
140 function NestedStencil{T}(ns::NestedStencil{S,N,M}) where {T,S,N,M}
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
141 NestedStencil{T,N,M}(ns)
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
142 end
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
143
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
144 function Base.convert(::Type{NestedStencil{T,N,M}}, s::NestedStencil{S,N,M}) where {T,S,N,M}
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
145 return NestedStencil{T,N,M}(s)
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
146 end
1763
65fd5331caa5 Fix more ambiguities
Jonatan Werpers <jonatan@werpers.com>
parents: 1759
diff changeset
147 Base.convert(::Type{NestedStencil{T}}, stencil::NestedStencil) where T = NestedStencil{T}(stencil)
894
54e36688dab8 Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 887
diff changeset
148
898
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
149 function Base.promote_rule(::Type{NestedStencil{T,N,M}}, ::Type{NestedStencil{S,N,M}}) where {T,S,N,M}
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
150 return NestedStencil{promote_type(T,S),N,M}
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
151 end
cd6d71781137 Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents: 897
diff changeset
152
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
153 Base.eltype(::NestedStencil{T}) where T = T
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
154
896
004324d7ed35 Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 894
diff changeset
155 function scale(ns::NestedStencil, a)
004324d7ed35 Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 894
diff changeset
156 range = ns.s.range
004324d7ed35 Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 894
diff changeset
157 weights = ns.s.weights
004324d7ed35 Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 894
diff changeset
158
004324d7ed35 Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 894
diff changeset
159 return NestedStencil(Stencil(range, scale.(weights,a)))
004324d7ed35 Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 894
diff changeset
160 end
004324d7ed35 Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 894
diff changeset
161
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
162 function flip(ns::NestedStencil)
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
163 s_flip = flip(ns.s)
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
164 return NestedStencil(Stencil(s_flip.range, flip.(s_flip.weights)))
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
165 end
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
166
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
167 Base.getindex(ns::NestedStencil, i::Int) = ns.s[i]
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
168
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
169 "Apply inner stencils to `c` and get a concrete stencil"
868
e37ee63bf9ac Add some tests and fix some bugs
Jonatan Werpers <jonatan@werpers.com>
parents: 867
diff changeset
170 Base.@propagate_inbounds function apply_inner_stencils(ns::NestedStencil, c::AbstractVector, i::Int)
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
171 weights = apply_stencil.(ns.s.weights, Ref(c), i)
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
172 return Stencil(ns.s.range, weights)
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
173 end
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
174
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
175 "Apply the whole nested stencil"
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
176 Base.@propagate_inbounds function apply_stencil(ns::NestedStencil, c::AbstractVector, v::AbstractVector, i::Int)
868
e37ee63bf9ac Add some tests and fix some bugs
Jonatan Werpers <jonatan@werpers.com>
parents: 867
diff changeset
177 s = apply_inner_stencils(ns,c,i)
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
178 return apply_stencil(s, v, i)
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
179 end
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
180
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
181 "Apply inner stencils backwards to `c` and get a concrete stencil"
868
e37ee63bf9ac Add some tests and fix some bugs
Jonatan Werpers <jonatan@werpers.com>
parents: 867
diff changeset
182 Base.@propagate_inbounds @inline function apply_inner_stencils_backwards(ns::NestedStencil, c::AbstractVector, i::Int)
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
183 weights = apply_stencil_backwards.(ns.s.weights, Ref(c), i)
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
184 return Stencil(ns.s.range, weights)
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
185 end
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
186
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
187 "Apply the whole nested stencil backwards"
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
188 Base.@propagate_inbounds @inline function apply_stencil_backwards(ns::NestedStencil, c::AbstractVector, v::AbstractVector, i::Int)
868
e37ee63bf9ac Add some tests and fix some bugs
Jonatan Werpers <jonatan@werpers.com>
parents: 867
diff changeset
189 s = apply_inner_stencils_backwards(ns,c,i)
867
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
190 return apply_stencil_backwards(s, v, i)
313648b01504 Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents: 826
diff changeset
191 end