Distinguish strategy failures and expose the actual trial tangent
This commit is contained in:
@@ -1307,9 +1307,14 @@ export namespace mean_field::solver {
|
||||
}
|
||||
|
||||
if (!strategy.CaptureDirection(state, diagnostics.numericalStrategies)) {
|
||||
NotifyAfter(iteration, nonlinear::IterationDisposition::globalization_failure, false, 0.0, 0,
|
||||
const bool linearFailure = strategy.DirectionSolveFailed();
|
||||
NotifyAfter(iteration, linearFailure ? nonlinear::IterationDisposition::linear_solve_failure :
|
||||
nonlinear::IterationDisposition::globalization_failure, false, 0.0, 0,
|
||||
diagnostics.initialResidualNorm, acceptedMetric, acceptedMetric, linearReport, timings, state);
|
||||
return Failure(state, std::move(diagnostics), StellarEquilibriumFailureReason::globalization_failure,
|
||||
return Failure(state, std::move(diagnostics), linearFailure ?
|
||||
StellarEquilibriumFailureReason::linear_solve_failure :
|
||||
StellarEquilibriumFailureReason::globalization_failure,
|
||||
linearFailure ? "Lifting the repaired direction failed its checked gravity solve." :
|
||||
"No certified enthalpy repair with a decreasing linear merit was available.");
|
||||
}
|
||||
|
||||
@@ -1780,7 +1785,8 @@ export namespace mean_field::solver {
|
||||
.candidateNormalizedState = detail::ReadOnlySpan(state.trialNormalizedState),
|
||||
.candidateNormalizedResidual = residualAvailable
|
||||
? detail::ReadOnlySpan(state.trialNormalizedResidual)
|
||||
: std::span<const mfem::real_t>{}
|
||||
: std::span<const mfem::real_t>{},
|
||||
.normalizedDirection = detail::ReadOnlySpan(state.normalizedCorrection)
|
||||
};
|
||||
const Clock::time_point observerStart = Clock::now();
|
||||
nonlinear::detail::InvokeAfterLineSearchTrial(m_observer, event);
|
||||
|
||||
Reference in New Issue
Block a user