Skip to content

Commit 913231f

Browse files
committed
Reuse jacobian_caches & use alg_autodiff to choose correct VecJac operator
1 parent 695840f commit 913231f

File tree

5 files changed

+23
-62
lines changed

5 files changed

+23
-62
lines changed

src/NonlinearSolve.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ function SciMLBase.__solve(prob::NonlinearProblem,
3434
end
3535

3636
include("utils.jl")
37-
include("jacobian.jl")
3837
include("raphson.jl")
3938
include("trustRegion.jl")
4039
include("levenberg.jl")
40+
include("jacobian.jl")
4141
include("ad.jl")
4242

4343
import PrecompileTools

src/jacobian.jl

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ function build_jac_and_jac_config(alg, f::F1, uf::F2, du1, u, tmp, du2) where {F
9292

9393
J = if !linsolve_needs_jac
9494
# We don't need to construct the Jacobian
95-
JacVec(uf, u; autodiff = AutoFiniteDiff())
95+
JacVec(uf, u; autodiff = alg_autodiff(alg) ? AutoForwardDiff() : AutoFiniteDiff())
9696
else
9797
if f.jac_prototype === nothing
9898
ArrayInterface.undefmatrix(u)
@@ -104,6 +104,27 @@ function build_jac_and_jac_config(alg, f::F1, uf::F2, du1, u, tmp, du2) where {F
104104
return J, jac_config
105105
end
106106

107+
# Build Jacobian Caches
108+
function jacobian_caches(alg::Union{NewtonRaphson, LevenbergMarquardt, TrustRegion}, f, u,
109+
p, ::Val{true})
110+
uf = JacobianWrapper(f, p)
111+
112+
du1 = zero(u)
113+
du2 = zero(u)
114+
tmp = zero(u)
115+
J, jac_config = build_jac_and_jac_config(alg, f, uf, du1, u, tmp, du2)
116+
117+
linprob = LinearProblem(J, _vec(zero(u)); u0 = _vec(zero(u)))
118+
weight = similar(u)
119+
recursivefill!(weight, true)
120+
121+
Pl, Pr = wrapprecs(alg.precs(J, nothing, u, p, nothing, nothing, nothing, nothing,
122+
nothing)..., weight)
123+
linsolve = init(linprob, alg.linsolve; alias_A = true, alias_b = true, Pl, Pr)
124+
125+
uf, linsolve, J, du1, jac_config
126+
end
127+
107128
function get_chunksize(jac_config::ForwardDiff.JacobianConfig{
108129
T,
109130
V,

src/levenberg.jl

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -226,26 +226,6 @@ mutable struct LevenbergMarquardtCache{iip, fType, algType, uType, duType, resTy
226226
end
227227
end
228228

229-
function jacobian_caches(alg::LevenbergMarquardt, f, u, p, ::Val{true})
230-
uf = JacobianWrapper(f, p)
231-
232-
du1 = zero(u)
233-
du2 = zero(u)
234-
tmp = zero(u)
235-
J, jac_config = build_jac_and_jac_config(alg, f, uf, du1, u, tmp, du2)
236-
237-
linprob = LinearProblem(J, _vec(zero(u)); u0 = _vec(zero(u)))
238-
weight = similar(u)
239-
# Q: Setting this to false leads to residual = 0 in GMRES?
240-
recursivefill!(weight, true)
241-
242-
Pl, Pr = wrapprecs(alg.precs(J, nothing, u, p, nothing, nothing, nothing, nothing,
243-
nothing)..., weight)
244-
linsolve = init(linprob, alg.linsolve; alias_A = true, alias_b = true, Pl, Pr)
245-
246-
uf, linsolve, J, du1, jac_config
247-
end
248-
249229
function jacobian_caches(alg::LevenbergMarquardt, f, u, p, ::Val{false})
250230
JacobianWrapper(f, p), nothing, ArrayInterface.undefmatrix(u), nothing, nothing
251231
end

src/raphson.jl

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -104,26 +104,6 @@ mutable struct NewtonRaphsonCache{iip, fType, algType, uType, duType, resType, p
104104
end
105105
end
106106

107-
function jacobian_caches(alg::NewtonRaphson, f, u, p, ::Val{true})
108-
uf = JacobianWrapper(f, p)
109-
110-
du1 = zero(u)
111-
du2 = zero(u)
112-
tmp = zero(u)
113-
J, jac_config = build_jac_and_jac_config(alg, f, uf, du1, u, tmp, du2)
114-
115-
linprob = LinearProblem(J, _vec(zero(u)); u0 = _vec(zero(u)))
116-
weight = similar(u)
117-
# Q: Setting this to false leads to residual = 0 in GMRES?
118-
recursivefill!(weight, true)
119-
120-
Pl, Pr = wrapprecs(alg.precs(J, nothing, u, p, nothing, nothing, nothing, nothing,
121-
nothing)..., weight)
122-
linsolve = init(linprob, alg.linsolve; alias_A = true, alias_b = true, Pl, Pr)
123-
124-
uf, linsolve, J, du1, jac_config
125-
end
126-
127107
function jacobian_caches(alg::NewtonRaphson, f, u, p, ::Val{false})
128108
JacobianWrapper(f, p), nothing, nothing, nothing, nothing
129109
end

src/trustRegion.jl

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -278,26 +278,6 @@ mutable struct TrustRegionCache{iip, fType, algType, uType, resType, pType,
278278
end
279279
end
280280

281-
function jacobian_caches(alg::TrustRegion, f, u, p, ::Val{true})
282-
uf = JacobianWrapper(f, p)
283-
284-
du1 = zero(u)
285-
du2 = zero(u)
286-
tmp = zero(u)
287-
J, jac_config = build_jac_and_jac_config(alg, f, uf, du1, u, tmp, du2)
288-
289-
linprob = LinearProblem(J, _vec(zero(u)); u0 = _vec(zero(u)))
290-
weight = similar(u)
291-
# Q: Setting this to false leads to residual = 0 in GMRES?
292-
recursivefill!(weight, true)
293-
294-
Pl, Pr = wrapprecs(alg.precs(J, nothing, u, p, nothing, nothing, nothing, nothing,
295-
nothing)..., weight)
296-
linsolve = init(linprob, alg.linsolve; alias_A = true, alias_b = true, Pl, Pr)
297-
298-
uf, linsolve, J, du1, jac_config
299-
end
300-
301281
function jacobian_caches(alg::TrustRegion, f, u, p, ::Val{false})
302282
J = ArrayInterface.undefmatrix(u)
303283
JacobianWrapper(f, p), nothing, J, zero(u), nothing

0 commit comments

Comments
 (0)