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

@@ -1,6 +1,7 @@
module;
#include <concepts>
#include <cstdint>
#include <type_traits>
#include <utility>
@@ -22,7 +23,7 @@ export namespace mean_field::solver::nonlinear {
struct GravitySolveOptions final {
LinearSolveControl control{.relativeTolerance = 1.0e-10, .absoluteTolerance = 1.0e-14,
.maximumIterations = 300};
linear::FGMRESOptions backend{.restartLength = 80};
linear::FGMRESOptions backend{.restartLength = 80, .printLevel = -1};
void Validate() const { control.Validate(); backend.Validate(); }
};
@@ -64,14 +65,18 @@ export namespace mean_field::solver::nonlinear {
template <typename Candidate>
concept NewtonNumericalConfiguration = IsNewtonNumerics<std::remove_cvref_t<Candidate>>::value;
enum class LinearReportSpace : std::uint8_t { full_system, reduced_system, gravity_subsystem };
struct NumericalStrategyDiagnostics final {
int polynomialChecks{0};
int directionRepairs{0};
double lastRepairFraction{0.0};
double lastMeritDirectionalDerivative{0.0};
int gravitySolves{0};
int gravityIterations{0};
int gravityFailures{0};
std::uint64_t gravitySolves{0};
std::uint64_t gravityIterations{0};
std::uint64_t gravityFailures{0};
std::uint64_t gravityPreparedFailures{0};
LinearReportSpace lastLinearReportSpace{LinearReportSpace::full_system};
double gravitySolveSeconds{0.0};
double lastGravityTrueResidual{0.0};
double lastGravityCorrectionNorm{0.0};