|
245 | 245 | function check_convergence(mode::AbsNormModes, duₙ, _, __, abstol, ___)
|
246 | 246 | return Utils.apply_norm(mode.internalnorm, duₙ) ≤ abstol
|
247 | 247 | end
|
| 248 | + |
| 249 | +# High-Level API with defaults. |
| 250 | +## This is mostly for internal usage in NonlinearSolve and SimpleNonlinearSolve |
| 251 | +function default_termination_mode( |
| 252 | + ::Union{ImmutableNonlinearProblem, NonlinearProblem}, ::Val{:simple}) |
| 253 | + return AbsNormTerminationMode(Base.Fix1(maximum, abs)) |
| 254 | +end |
| 255 | +function default_termination_mode(::NonlinearLeastSquaresProblem, ::Val{:simple}) |
| 256 | + return AbsNormTerminationMode(Base.Fix2(norm, 2)) |
| 257 | +end |
| 258 | + |
| 259 | +function default_termination_mode( |
| 260 | + ::Union{ImmutableNonlinearProblem, NonlinearProblem}, ::Val{:regular}) |
| 261 | + return AbsNormSafeBestTerminationMode(Base.Fix1(maximum, abs); max_stalled_steps = 32) |
| 262 | +end |
| 263 | + |
| 264 | +function default_termination_mode(::NonlinearLeastSquaresProblem, ::Val{:regular}) |
| 265 | + return AbsNormSafeBestTerminationMode(Base.Fix2(norm, 2); max_stalled_steps = 32) |
| 266 | +end |
| 267 | + |
| 268 | +function init_termination_cache( |
| 269 | + prob::AbstractNonlinearProblem, abstol, reltol, du, u, ::Nothing, callee::Val) |
| 270 | + return init_termination_cache( |
| 271 | + prob, abstol, reltol, du, u, default_termination_mode(prob, callee), callee) |
| 272 | +end |
| 273 | + |
| 274 | +function init_termination_cache(::AbstractNonlinearProblem, abstol, reltol, du, |
| 275 | + u, tc::AbstractNonlinearTerminationMode, ::Val) |
| 276 | + T = promote_type(eltype(du), eltype(u)) |
| 277 | + abstol = get_tolerance(abstol, T) |
| 278 | + reltol = get_tolerance(reltol, T) |
| 279 | + cache = init(du, u, tc; abstol, reltol) |
| 280 | + return abstol, reltol, cache |
| 281 | +end |
0 commit comments