Mercurial > repos > public > sbplib_julia
annotate src/SbpOperators/stencil.jl @ 1852:39890aed6fa0 feature/jet_aqua
Close before merge
| author | Jonatan Werpers <jonatan@werpers.com> |
|---|---|
| date | Sat, 11 Jan 2025 10:17:02 +0100 |
| parents | 244311761969 |
| children |
| rev | line source |
|---|---|
|
806
9fc6d38da03f
Remove type requirement for stencil weights
Jonatan Werpers <jonatan@werpers.com>
parents:
672
diff
changeset
|
1 struct Stencil{T,N} |
|
899
18f63f1a0c44
Fix bugs from stencil refactor
Jonatan Werpers <jonatan@werpers.com>
parents:
898
diff
changeset
|
2 range::UnitRange{Int64} |
|
84
48079bd39969
Change to using tuples in stencils and ops
Jonatan Werpers <jonatan@werpers.com>
parents:
69
diff
changeset
|
3 weights::NTuple{N,T} |
|
126
66c239678a21
Add Assertion in stencil constructor
Ylva Rydin <ylva.rydin@telia.com>
parents:
85
diff
changeset
|
4 |
|
1759
d28562d5ca8f
Remove unbound parameter for Stencil
Jonatan Werpers <jonatan@werpers.com>
parents:
1758
diff
changeset
|
5 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
|
6 T = eltype(weights) |
|
d28562d5ca8f
Remove unbound parameter for Stencil
Jonatan Werpers <jonatan@werpers.com>
parents:
1758
diff
changeset
|
7 |
|
897
737cd68318c7
Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents:
896
diff
changeset
|
8 @assert length(range) == N |
|
126
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 """ |
|
1759
d28562d5ca8f
Remove unbound parameter for Stencil
Jonatan Werpers <jonatan@werpers.com>
parents:
1758
diff
changeset
|
14 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
|
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 """ |
|
897
737cd68318c7
Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents:
896
diff
changeset
|
18 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
|
19 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
|
20 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
|
21 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
|
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 |
|
897
737cd68318c7
Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents:
896
diff
changeset
|
26 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
|
27 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
|
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 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
|
30 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
|
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.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
|
33 |
|
737cd68318c7
Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents:
896
diff
changeset
|
34 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
|
35 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
|
36 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
|
37 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
|
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 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
|
40 |
|
897
737cd68318c7
Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents:
896
diff
changeset
|
41 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
|
42 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
|
43 |
| 672 | 44 |
|
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
|
45 """ |
|
584
4aa7fe13a984
Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
333
diff
changeset
|
46 scale(s::Stencil, a) |
|
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 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
|
49 """ |
|
4aa7fe13a984
Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
333
diff
changeset
|
50 function scale(s::Stencil, a) |
|
4aa7fe13a984
Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
333
diff
changeset
|
51 return Stencil(s.range, a.*s.weights) |
|
4aa7fe13a984
Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
333
diff
changeset
|
52 end |
|
4aa7fe13a984
Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
333
diff
changeset
|
53 |
|
887
0be29e65521e
Add length method for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
880
diff
changeset
|
54 Base.eltype(::Stencil{T,N}) where {T,N} = T |
|
0be29e65521e
Add length method for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
880
diff
changeset
|
55 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
|
56 |
|
8
433008d3b7d3
Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
57 function flip(s::Stencil) |
|
433008d3b7d3
Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
58 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
|
59 return Stencil(range, reverse(s.weights)) |
|
8
433008d3b7d3
Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
60 end |
|
433008d3b7d3
Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
61 |
|
433008d3b7d3
Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
62 # 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
|
63 @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
|
64 @boundscheck if i ∉ s.range |
|
584
4aa7fe13a984
Add scale() and eltype() methods for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
333
diff
changeset
|
65 return zero(eltype(s)) |
|
8
433008d3b7d3
Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
66 end |
|
71
18d0d794d3bb
Make stencils respond to @ inbounds
Jonatan Werpers <jonatan@werpers.com>
parents:
67
diff
changeset
|
67 return s.weights[1 + i - s.range[1]] |
|
8
433008d3b7d3
Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
68 end |
|
433008d3b7d3
Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
69 |
|
897
737cd68318c7
Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents:
896
diff
changeset
|
70 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
|
71 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
|
72 w*v[i + @inbounds s.range[k]] |
|
8
433008d3b7d3
Move stencil to its own file
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
73 end |
|
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 |
|
897
737cd68318c7
Refactor code for regular stencils to use fewer type parameters and allow promotion
Jonatan Werpers <jonatan@werpers.com>
parents:
896
diff
changeset
|
76 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
|
77 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
|
78 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
|
79 end |
|
6c6979ff17f4
Introduce and use apply_backwards for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
85
diff
changeset
|
80 end |
|
867
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
81 |
| 1546 | 82 # There are many options for the implementation of `apply_stencil` and |
| 83 # `apply_stencil_backwards`. Some alternatives were tried on the branch | |
| 84 # bugfix/sbp_operators/stencil_return_type and can be found at the following | |
| 85 # revision: | |
| 86 # | |
| 87 # * 237b980ffb91 (baseline) | |
| 88 # * a72bab15228e (mapreduce) | |
| 89 # * ffd735354d54 (multiplication) | |
| 90 # * b5abd5191f2c (promote_op) | |
| 91 # * 8d56846185fc (return_type) | |
| 92 # | |
| 93 | |
|
1032
11767fbb29f4
Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
94 function left_pad(s::Stencil, N) |
|
11767fbb29f4
Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
95 weights = LazyTensors.left_pad_tuple(s.weights, zero(eltype(s)), N) |
| 1072 | 96 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
|
97 |
|
11767fbb29f4
Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
98 return Stencil(range, weights) |
|
11767fbb29f4
Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
99 end |
|
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 function right_pad(s::Stencil, N) |
|
11767fbb29f4
Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
102 weights = LazyTensors.right_pad_tuple(s.weights, zero(eltype(s)), N) |
| 1072 | 103 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
|
104 |
|
11767fbb29f4
Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
105 return Stencil(range, weights) |
|
11767fbb29f4
Add padding functions for stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
106 end |
| 1072 | 107 |
| 108 | |
|
867
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
109 |
|
880
f74189c954d6
Add argument restrictions to stencil constructors to get clearer error messages
Jonatan Werpers <jonatan@werpers.com>
parents:
879
diff
changeset
|
110 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
|
111 s::Stencil{Stencil{T,N},M} |
|
867
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
112 end |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
113 |
|
1763
65fd5331caa5
Fix more ambiguities
Jonatan Werpers <jonatan@werpers.com>
parents:
1759
diff
changeset
|
114 NestedStencil(;center) = NestedStencil(Stencil(;center)) |
|
65fd5331caa5
Fix more ambiguities
Jonatan Werpers <jonatan@werpers.com>
parents:
1759
diff
changeset
|
115 CenteredNestedStencil() = NestedStencil(CenteredStencil()) |
|
65fd5331caa5
Fix more ambiguities
Jonatan Werpers <jonatan@werpers.com>
parents:
1759
diff
changeset
|
116 |
|
879
011d3ff65e9f
Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents:
868
diff
changeset
|
117 # Stencil input |
|
898
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
118 NestedStencil(s::Vararg{Stencil}; center) = NestedStencil(Stencil(s... ; center)) |
|
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
119 CenteredNestedStencil(s::Vararg{Stencil}) = NestedStencil(CenteredStencil(s...)) |
|
867
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
120 |
|
879
011d3ff65e9f
Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents:
868
diff
changeset
|
121 # Tuple input |
|
1758
d8fabe814d06
Fix unbound parameters for NestedStencil
Jonatan Werpers <jonatan@werpers.com>
parents:
1546
diff
changeset
|
122 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
|
123 inner_stencils = map(w -> Stencil(w...; center), weights) |
|
867
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
124 return NestedStencil(Stencil(inner_stencils... ; center)) |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
125 end |
|
1758
d8fabe814d06
Fix unbound parameters for NestedStencil
Jonatan Werpers <jonatan@werpers.com>
parents:
1546
diff
changeset
|
126 |
|
d8fabe814d06
Fix unbound parameters for NestedStencil
Jonatan Werpers <jonatan@werpers.com>
parents:
1546
diff
changeset
|
127 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
|
128 inner_stencils = map(w->CenteredStencil(w...), weights) |
|
011d3ff65e9f
Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents:
868
diff
changeset
|
129 return CenteredNestedStencil(inner_stencils...) |
|
011d3ff65e9f
Add methods for CenteredNestedStencil with tuple input
Jonatan Werpers <jonatan@werpers.com>
parents:
868
diff
changeset
|
130 end |
|
867
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
131 |
|
894
54e36688dab8
Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
887
diff
changeset
|
132 # Conversion |
|
898
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
133 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
|
134 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
|
135 end |
|
54e36688dab8
Add functions for converting the element type of nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
887
diff
changeset
|
136 |
|
898
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
137 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
|
138 NestedStencil{T,N,M}(ns) |
|
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
139 end |
|
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
140 |
|
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
141 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
|
142 return NestedStencil{T,N,M}(s) |
|
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
143 end |
|
1763
65fd5331caa5
Fix more ambiguities
Jonatan Werpers <jonatan@werpers.com>
parents:
1759
diff
changeset
|
144 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
|
145 |
|
898
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
146 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
|
147 return NestedStencil{promote_type(T,S),N,M} |
|
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
148 end |
|
cd6d71781137
Add promotion functionality for NestedTuples
Jonatan Werpers <jonatan@werpers.com>
parents:
897
diff
changeset
|
149 |
|
867
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
150 Base.eltype(::NestedStencil{T}) where T = T |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
151 |
|
896
004324d7ed35
Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
894
diff
changeset
|
152 function scale(ns::NestedStencil, a) |
|
004324d7ed35
Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
894
diff
changeset
|
153 range = ns.s.range |
|
004324d7ed35
Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
894
diff
changeset
|
154 weights = ns.s.weights |
|
004324d7ed35
Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
894
diff
changeset
|
155 |
|
004324d7ed35
Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
894
diff
changeset
|
156 return NestedStencil(Stencil(range, scale.(weights,a))) |
|
004324d7ed35
Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
894
diff
changeset
|
157 end |
|
004324d7ed35
Add scale method for nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
894
diff
changeset
|
158 |
|
867
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
159 function flip(ns::NestedStencil) |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
160 s_flip = flip(ns.s) |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
161 return NestedStencil(Stencil(s_flip.range, flip.(s_flip.weights))) |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
162 end |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
163 |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
164 Base.getindex(ns::NestedStencil, i::Int) = ns.s[i] |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
165 |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
166 "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
|
167 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
|
168 weights = apply_stencil.(ns.s.weights, Ref(c), i) |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
169 return Stencil(ns.s.range, weights) |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
170 end |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
171 |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
172 "Apply the whole nested stencil" |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
173 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
|
174 s = apply_inner_stencils(ns,c,i) |
|
867
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
175 return apply_stencil(s, v, i) |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
176 end |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
177 |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
178 "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
|
179 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
|
180 weights = apply_stencil_backwards.(ns.s.weights, Ref(c), i) |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
181 return Stencil(ns.s.range, weights) |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
182 end |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
183 |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
184 "Apply the whole nested stencil backwards" |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
185 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
|
186 s = apply_inner_stencils_backwards(ns,c,i) |
|
867
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
187 return apply_stencil_backwards(s, v, i) |
|
313648b01504
Start implementing nested stencils
Jonatan Werpers <jonatan@werpers.com>
parents:
826
diff
changeset
|
188 end |
