diff --git a/experiments/plateau_diagnostic.cpp b/experiments/plateau_diagnostic.cpp index 1663f48..e2d7f43 100644 --- a/experiments/plateau_diagnostic.cpp +++ b/experiments/plateau_diagnostic.cpp @@ -154,8 +154,8 @@ Options Parse(int argc, char **argv) { } if (!o.preconditionerProbe) { if (o.preconditionerVariant != "independent" && o.preconditionerVariant != "gravity-schur" && - o.preconditionerVariant != "stellar-ldu") - throw std::invalid_argument("Newton preconditioner variants are independent, gravity-schur, or stellar-ldu"); + o.preconditionerVariant != "stellar-ldu" && o.preconditionerVariant != "stellar-ldu-gravity-schur") + throw std::invalid_argument("Newton preconditioner variants are independent, gravity-schur, stellar-ldu, or stellar-ldu-gravity-schur"); if (o.preconditionerVariant != "independent") { if (o.probes || o.pressureProbe || o.shapeCurvature || o.surfaceTrace || o.strategyProbe || o.positivityProbe || o.positivityCertificate || !o.probeState.empty() || !o.probeDirection.empty() || @@ -434,6 +434,8 @@ int RunContext(Context &context, const Options &o, const Scales &scales) { mfem::Vector residualFactors, stateFactors; std::vector centralRows; int centralOffset = -1; + const bool contextUsesGravitySchur = !o.preconditionerProbe && + (o.preconditionerVariant == "gravity-schur" || o.preconditionerVariant == "stellar-ldu-gravity-schur"); auto metadata = File(o.output / "metadata.txt"); metadata << "n=" << o.n << "\nK=" << scales.K << "\nrho_c=" << scales.rho << "\nJ=" << o.angularMomentum << "\nM=1\nR_reference=1\nxi1=" << scales.xi << "\nmu1=" << scales.mu << "\ncentral_phase=" << !o.noCentral @@ -449,7 +451,8 @@ int RunContext(Context &context, const Options &o, const Scales &scales) { << "\npreconditioner_variant=" << o.preconditionerVariant << "\ncontext_preconditioner_variant=" << (o.preconditionerProbe ? "independent" : o.preconditionerVariant) << "\ncontext_gravity_schur_sweeps=" - << (!o.preconditionerProbe && o.preconditionerVariant == "gravity-schur" ? o.schurCorrectionSweeps : 0) + << (contextUsesGravitySchur ? o.schurCorrectionSweeps : 0) + << "\ncontext_gravity_schur_relaxation=" << (contextUsesGravitySchur ? o.schurRelaxation : 0.0) << "\nschur_correction_sweeps=" << o.schurCorrectionSweeps << "\nschur_relaxation=" << o.schurRelaxation << "\ncompiler=" << __VERSION__ << "\ncompiled=" << __DATE__ << ' ' << __TIME__ << '\n'; metadata.flush(); @@ -780,6 +783,9 @@ template int Setup(Model model, fem::FEM f, const Options &o, cons if (o.preconditionerVariant == "stellar-ldu") return withRecipe(experiment::plateau_diagnostics::StellarLDUNewtonPreconditioner{ {.correctionSweeps = 0, .relaxation = 1.0}}); + if (o.preconditionerVariant == "stellar-ldu-gravity-schur") + return withRecipe(experiment::plateau_diagnostics::StellarLDUGravitySchurNewtonPreconditioner{ + {.correctionSweeps = o.schurCorrectionSweeps, .relaxation = o.schurRelaxation}}); throw std::logic_error("An unsupported Newton preconditioner bypassed option validation."); } int Run(const Options &o) { diff --git a/experiments/plateau_newton_preconditioner.hpp b/experiments/plateau_newton_preconditioner.hpp index 405a6d7..ffef687 100644 --- a/experiments/plateau_newton_preconditioner.hpp +++ b/experiments/plateau_newton_preconditioner.hpp @@ -13,7 +13,7 @@ namespace experiment::plateau_diagnostics { template concept NewtonBenchmarkPolicy = (std::same_as && RefinedGravity) || - (std::same_as && !RefinedGravity); + std::same_as; template requires NewtonBenchmarkPolicy @@ -61,9 +61,15 @@ namespace experiment::plateau_diagnostics { NewtonBenchmarkPreconditioner; using StellarLDUNewtonPreconditioner = NewtonBenchmarkPreconditioner; + using StellarLDUGravitySchurNewtonPreconditioner = + NewtonBenchmarkPreconditioner; static_assert(mean_field::preconditioning::StellarPreconditionerPrescription); static_assert(mean_field::preconditioning::StellarPreconditionerPrescription); + static_assert( + mean_field::preconditioning::StellarPreconditionerPrescription + ); + static_assert(std::is_trivially_copyable_v); static_assert(std::is_trivially_copyable_v); static_assert(std::is_trivially_copyable_v); } // namespace experiment::plateau_diagnostics