@@ -65,107 +65,74 @@ function SciMLBase.__init(prob::NonlinearProblem{uType, iip}, alg::GeneralBroyde
65
65
termination_condition = nothing , internalnorm:: F = DEFAULT_NORM,
66
66
kwargs... ) where {uType, iip, F}
67
67
@unpack f, u0, p = prob
68
- u = alias_u0 ? u0 : deepcopy (u0)
68
+ u = __maybe_unaliased (u0, alias_u0 )
69
69
fu = evaluate_f (prob, u)
70
- du = _mutable_zero (u)
70
+ @bb du = copy (u)
71
71
J⁻¹ = __init_identity_jacobian (u, fu)
72
72
reset_tolerance = alg. reset_tolerance === nothing ? sqrt (eps (real (eltype (u)))) :
73
73
alg. reset_tolerance
74
74
reset_check = x -> abs (x) ≤ reset_tolerance
75
75
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
+
76
82
abstol, reltol, tc_cache = init_termination_cache (abstol, reltol, fu, u,
77
83
termination_condition)
78
84
trace = init_nonlinearsolve_trace (alg, u, fu, J⁻¹, du; uses_jac_inverse = Val (true ),
79
85
kwargs... )
80
86
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 ),
85
90
init_linesearch_cache (alg. linesearch, f, u, p, fu, Val (iip)), tc_cache, trace)
86
91
end
87
92
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)
104
95
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)
107
99
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)
117
102
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)
124
104
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)
140
105
141
106
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, α)
143
108
144
109
check_and_update! (cache, cache. fu2, cache. u, cache. u_prev)
145
110
cache. stats. nf += 1
146
111
147
112
cache. force_stop && return nothing
148
113
149
114
# Update the inverse jacobian
150
- cache. dfu = cache. fu2 .- cache. fu
115
+ @bb @. cache. dfu = cache. fu2 - cache. fu
116
+
151
117
if all (cache. reset_check, cache. du) || all (cache. reset_check, cache. dfu)
152
118
if cache. resets ≥ cache. max_resets
153
119
cache. retcode = ReturnCode. ConvergenceFailure
154
120
cache. force_stop = true
155
121
return nothing
156
122
end
157
- cache. J⁻¹ = __init_identity_jacobian (cache. u, cache . fu )
123
+ cache. J⁻¹ = __reinit_identity_jacobian!! (cache. J⁻¹ )
158
124
cache. resets += 1
159
125
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)
163
129
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⁻¹₂)
166
132
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)
169
136
170
137
return nothing
171
138
end
0 commit comments