@@ -65,107 +65,74 @@ function SciMLBase.__init(prob::NonlinearProblem{uType, iip}, alg::GeneralBroyde
6565 termination_condition = nothing , internalnorm:: F = DEFAULT_NORM,
6666 kwargs... ) where {uType, iip, F}
6767 @unpack f, u0, p = prob
68- u = alias_u0 ? u0 : deepcopy (u0)
68+ u = __maybe_unaliased (u0, alias_u0 )
6969 fu = evaluate_f (prob, u)
70- du = _mutable_zero (u)
70+ @bb du = copy (u)
7171 J⁻¹ = __init_identity_jacobian (u, fu)
7272 reset_tolerance = alg. reset_tolerance === nothing ? sqrt (eps (real (eltype (u)))) :
7373 alg. reset_tolerance
7474 reset_check = x -> abs (x) ≤ reset_tolerance
7575
76+ @bb u_prev = copy (u)
77+ @bb fu2 = copy (fu)
78+ @bb dfu = similar (fu)
79+ @bb J⁻¹₂ = similar (u)
80+ @bb J⁻¹df = similar (u)
81+
7682 abstol, reltol, tc_cache = init_termination_cache (abstol, reltol, fu, u,
7783 termination_condition)
7884 trace = init_nonlinearsolve_trace (alg, u, fu, J⁻¹, du; uses_jac_inverse = Val (true ),
7985 kwargs... )
8086
81- return GeneralBroydenCache {iip} (f, alg, u, zero (u), du, fu, zero (fu),
82- zero (fu), p, J⁻¹, zero (_reshape (fu, 1 , :)), _mutable_zero (u), false , 0 ,
83- alg. max_resets, maxiters, internalnorm, ReturnCode. Default, abstol, reltol,
84- reset_tolerance, reset_check, prob, NLStats (1 , 0 , 0 , 0 , 0 ),
87+ return GeneralBroydenCache {iip} (f, alg, u, u_prev, du, fu, fu2, dfu, p, J⁻¹,
88+ J⁻¹₂, J⁻¹df, false , 0 , alg. max_resets, maxiters, internalnorm, ReturnCode. Default,
89+ abstol, reltol, reset_tolerance, reset_check, prob, NLStats (1 , 0 , 0 , 0 , 0 ),
8590 init_linesearch_cache (alg. linesearch, f, u, p, fu, Val (iip)), tc_cache, trace)
8691end
8792
88- function perform_step! (cache:: GeneralBroydenCache{true} )
89- @unpack f, p, du, fu, fu2, dfu, u, u_prev, J⁻¹, J⁻¹df, J⁻¹₂ = cache
90- T = eltype (u)
91-
92- mul! (_vec (du), J⁻¹, _vec (fu))
93- α = perform_linesearch! (cache. ls_cache, u, du)
94- _axpy! (- α, du, u)
95- f (fu2, u, p)
96-
97- update_trace_with_invJ! (cache. trace, cache. stats. nsteps + 1 , get_u (cache),
98- get_fu (cache), J⁻¹, du, α)
99-
100- check_and_update! (cache, fu2, u, u_prev)
101- cache. stats. nf += 1
102-
103- cache. force_stop && return nothing
93+ function perform_step! (cache:: GeneralBroydenCache{iip} ) where {iip}
94+ T = eltype (cache. u)
10495
105- # Update the inverse jacobian
106- dfu .= fu2 .- fu
96+ @bb cache. du = cache. J⁻¹ × vec (cache. fu)
97+ α = perform_linesearch! (cache. ls_cache, cache. u, cache. du)
98+ @bb axpy! (- α, cache. du, cache. u)
10799
108- if all (cache. reset_check, du) || all (cache. reset_check, dfu)
109- if cache. resets ≥ cache. max_resets
110- cache. retcode = ReturnCode. ConvergenceFailure
111- cache. force_stop = true
112- return nothing
113- end
114- fill! (J⁻¹, 0 )
115- J⁻¹[diagind (J⁻¹)] .= T (1 )
116- cache. resets += 1
100+ if iip
101+ cache. f (cache. fu2, cache. u, cache. p)
117102 else
118- du .*= - 1
119- mul! (_vec (J⁻¹df), J⁻¹, _vec (dfu))
120- mul! (J⁻¹₂, _vec (du)' , J⁻¹)
121- denom = dot (du, J⁻¹df)
122- du .= (du .- J⁻¹df) ./ ifelse (iszero (denom), T (1e-5 ), denom)
123- mul! (J⁻¹, _vec (du), J⁻¹₂, 1 , 1 )
103+ cache. fu2 = cache. f (cache. u, cache. p)
124104 end
125- fu .= fu2
126- @. u_prev = u
127-
128- return nothing
129- end
130-
131- function perform_step! (cache:: GeneralBroydenCache{false} )
132- @unpack f, p = cache
133-
134- T = eltype (cache. u)
135-
136- cache. du = _restructure (cache. du, cache. J⁻¹ * _vec (cache. fu))
137- α = perform_linesearch! (cache. ls_cache, cache. u, cache. du)
138- cache. u = cache. u .- α * cache. du
139- cache. fu2 = f (cache. u, p)
140105
141106 update_trace_with_invJ! (cache. trace, cache. stats. nsteps + 1 , get_u (cache),
142- get_fu ( cache) , cache. J⁻¹, cache. du, α)
107+ cache. fu2 , cache. J⁻¹, cache. du, α)
143108
144109 check_and_update! (cache, cache. fu2, cache. u, cache. u_prev)
145110 cache. stats. nf += 1
146111
147112 cache. force_stop && return nothing
148113
149114 # Update the inverse jacobian
150- cache. dfu = cache. fu2 .- cache. fu
115+ @bb @. cache. dfu = cache. fu2 - cache. fu
116+
151117 if all (cache. reset_check, cache. du) || all (cache. reset_check, cache. dfu)
152118 if cache. resets ≥ cache. max_resets
153119 cache. retcode = ReturnCode. ConvergenceFailure
154120 cache. force_stop = true
155121 return nothing
156122 end
157- cache. J⁻¹ = __init_identity_jacobian (cache. u, cache . fu )
123+ cache. J⁻¹ = __reinit_identity_jacobian!! (cache. J⁻¹ )
158124 cache. resets += 1
159125 else
160- cache. du = - cache . du
161- cache. J⁻¹df = _restructure ( cache. J⁻¹df, cache . J⁻¹ * _vec (cache. dfu) )
162- cache. J⁻¹₂ = _vec ( cache. du) ' * cache. J⁻¹
126+ @bb cache. du .* = - 1
127+ @bb cache. J⁻¹df = cache. J⁻¹ × vec (cache. dfu)
128+ @bb cache. J⁻¹₂ = cache. J⁻¹ × vec ( cache. du)
163129 denom = dot (cache. du, cache. J⁻¹df)
164- cache. du = (cache. du . - cache. J⁻¹df) . / ifelse (iszero (denom), T (1e-5 ), denom)
165- cache . J⁻¹ = cache. J⁻¹ .+ _vec (cache. du) * cache. J⁻¹₂
130+ @bb @. cache. du = (cache. du - cache. J⁻¹df) / ifelse (iszero (denom), T (1e-5 ), denom)
131+ @bb cache. J⁻¹ += vec (cache. du) × transpose ( cache. J⁻¹₂)
166132 end
167- cache. fu = cache. fu2
168- cache. u_prev = @. cache. u
133+
134+ @bb copyto! (cache. fu, cache. fu2)
135+ @bb copyto! (cache. u_prev, cache. u)
169136
170137 return nothing
171138end
0 commit comments