src/Gradient.jl

changeset 8
c5aabb2c41d9
parent 7
ab7d59b47140
equal deleted inserted replaced
7:ab7d59b47140 8:c5aabb2c41d9
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

mercurial