Distinguish strategy failures and expose the actual trial tangent

This commit is contained in:
2026-09-17 10:09:22 -04:00
parent 5f3eb0b18c
commit 2e31917269
6 changed files with 152 additions and 13 deletions

View File

@@ -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);