72 function ∇₂!(v, u) |
72 function ∇₂!(v, u) |
73 ∇₂!(@view(v[1, :, :]), @view(v[2, :, :]), u) |
73 ∇₂!(@view(v[1, :, :]), @view(v[2, :, :]), u) |
74 end |
74 end |
75 |
75 |
76 @inline function ∇₂fold!(f!::Function, u, state) |
76 @inline function ∇₂fold!(f!::Function, u, state) |
77 g! = (state, pt) -> begin |
77 @inline function g!(state, pt) |
78 (i, j) = pt |
78 (i, j) = pt |
79 g = @inbounds [u[i+1, j]-u[i, j], u[i, j+1]-u[i, j]] |
79 g = @inbounds [u[i+1, j]-u[i, j], u[i, j+1]-u[i, j]] |
80 return f!(g, state, pt) |
80 return f!(g, state, pt) |
81 end |
81 end |
82 gr! = (state, pt) -> begin |
82 @inline function gr!(state, pt) |
83 (i, j) = pt |
83 (i, j) = pt |
84 g = @inbounds [u[i+1, j]-u[i, j], 0.0] |
84 g = @inbounds [u[i+1, j]-u[i, j], 0.0] |
85 return f!(g, state, pt) |
85 return f!(g, state, pt) |
86 end |
86 end |
87 gb! = (state, pt) -> begin |
87 @inline function gb!(state, pt) |
88 (i, j) = pt |
88 (i, j) = pt |
89 g = @inbounds [0.0, u[i, j+1]-u[i, j]] |
89 g = @inbounds [0.0, u[i, j+1]-u[i, j]] |
90 return f!(g, state, pt) |
90 return f!(g, state, pt) |
91 end |
91 end |
92 g0! = (state, pt) -> begin |
92 @inline function g0!(state, pt) |
93 return f!([0.0, 0.0], state, pt) |
93 return f!([0.0, 0.0], state, pt) |
94 end |
94 end |
95 return imfold₂′!(g!, g!, gr!, |
95 return imfold₂′!(g!, g!, gr!, |
96 g!, g!, gr!, |
96 g!, g!, gr!, |
97 gb!, gb!, g0!, |
97 gb!, gb!, g0!, |
131 end |
131 end |
132 end |
132 end |
133 |
133 |
134 @inline function ∇₂cfold!(f!::Function, u, state) |
134 @inline function ∇₂cfold!(f!::Function, u, state) |
135 n, m = size(u) |
135 n, m = size(u) |
136 g! = (state, pt) -> begin |
136 @inline function g!(state, pt) |
137 (i, j) = pt |
137 (i, j) = pt |
138 g = @inbounds [(u[i+1, j]-u[i-1, j])/2, (u[i, j+1]-u[i, j-1])/2] |
138 g = @inbounds [(u[i+1, j]-u[i-1, j])/2, (u[i, j+1]-u[i, j-1])/2] |
139 return f!(g, state, pt) |
139 return f!(g, state, pt) |
140 end |
140 end |
141 gb! = (state, pt) -> begin |
141 @inline function gb!(state, pt) |
142 (i, j) = pt |
142 (i, j) = pt |
143 g = @inbounds [(u[min(i+1,n), j]-u[max(i-1,1), j])/2, |
143 g = @inbounds [(u[min(i+1,n), j]-u[max(i-1,1), j])/2, |
144 (u[i, min(j+1,m)]-u[i, max(j-1,1)])/2] |
144 (u[i, min(j+1,m)]-u[i, max(j-1,1)])/2] |
145 return f!(g, state, pt) |
145 return f!(g, state, pt) |
146 end |
146 end |