9 ############## |
9 ############## |
10 |
10 |
11 export ∇₂!, ∇₂ᵀ!, ∇₂fold!, |
11 export ∇₂!, ∇₂ᵀ!, ∇₂fold!, |
12 ∇₂_norm₂₂_est, ∇₂_norm₂₂_est², |
12 ∇₂_norm₂₂_est, ∇₂_norm₂₂_est², |
13 ∇₂_norm₂∞_est, ∇₂_norm₂∞_est², |
13 ∇₂_norm₂∞_est, ∇₂_norm₂∞_est², |
14 ∇₂c!, |
14 ∇₂c!, ∇₂cfold!, |
15 ∇₃!, ∇₃ᵀ!, |
15 ∇₃!, ∇₃ᵀ!, |
16 vec∇₃!, vec∇₃ᵀ! |
16 vec∇₃!, vec∇₃ᵀ! |
17 |
17 |
18 ################## |
18 ################## |
19 # Helper routines |
19 # Helper routines |
127 v[2, :, end] = (u[:, end] - u[:, end-1])/2 |
127 v[2, :, end] = (u[:, end] - u[:, end-1])/2 |
128 v[2, :, 1] = (u[:, 2] - u[:, 1])/2 |
128 v[2, :, 1] = (u[:, 2] - u[:, 1])/2 |
129 end |
129 end |
130 end |
130 end |
131 |
131 |
|
132 @inline function ∇₂cfold!(f!::Function, u, state) |
|
133 n, m = size(u) |
|
134 g! = (state, pt) -> begin |
|
135 (i, j) = pt |
|
136 g = @inbounds [(u[i+1, j]-u[i-1, j])/2, (u[i, j+1]-u[i, j-1])/2] |
|
137 return f!(g, state, pt) |
|
138 end |
|
139 gb! = (state, pt) -> begin |
|
140 (i, j) = pt |
|
141 g = @inbounds [(u[min(i+1,n), j]-u[max(i-1,1), j])/2, |
|
142 (u[i, min(j+1,m)]-u[i, max(j-1,1)])/2] |
|
143 return f!(g, state, pt) |
|
144 end |
|
145 return imfold₂′!(gb!, gb!, gb!, |
|
146 gb!, g!, gb!, |
|
147 gb!, gb!, gb!, |
|
148 size(u, 1), size(u, 2), state) |
|
149 end |
|
150 |
132 ######################### |
151 ######################### |
133 # 3D forward differences |
152 # 3D forward differences |
134 ######################### |
153 ######################### |
135 |
154 |
136 function ∇₃!(u₁,u₂,u₃,u) |
155 function ∇₃!(u₁,u₂,u₃,u) |