Enable combined stellar LDU gravity Schur Newton experiment

This commit is contained in:
2026-09-17 17:36:48 -04:00
parent 107c66b192
commit 7b4f674ed5
2 changed files with 16 additions and 4 deletions

View File

@@ -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<int> 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 <class Model> 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) {

View File

@@ -13,7 +13,7 @@ namespace experiment::plateau_diagnostics {
template <class Policy, bool RefinedGravity>
concept NewtonBenchmarkPolicy =
(std::same_as<Policy, mean_field::preconditioning::IndependentStellarSubsystems> && RefinedGravity) ||
(std::same_as<Policy, mean_field::preconditioning::ApproximateStellarBlockLDU> && !RefinedGravity);
std::same_as<Policy, mean_field::preconditioning::ApproximateStellarBlockLDU>;
template <class Policy, bool RefinedGravity>
requires NewtonBenchmarkPolicy<Policy, RefinedGravity>
@@ -61,9 +61,15 @@ namespace experiment::plateau_diagnostics {
NewtonBenchmarkPreconditioner<mean_field::preconditioning::IndependentStellarSubsystems, true>;
using StellarLDUNewtonPreconditioner =
NewtonBenchmarkPreconditioner<mean_field::preconditioning::ApproximateStellarBlockLDU, false>;
using StellarLDUGravitySchurNewtonPreconditioner =
NewtonBenchmarkPreconditioner<mean_field::preconditioning::ApproximateStellarBlockLDU, true>;
static_assert(mean_field::preconditioning::StellarPreconditionerPrescription<GravitySchurNewtonPreconditioner>);
static_assert(mean_field::preconditioning::StellarPreconditionerPrescription<StellarLDUNewtonPreconditioner>);
static_assert(
mean_field::preconditioning::StellarPreconditionerPrescription<StellarLDUGravitySchurNewtonPreconditioner>
);
static_assert(std::is_trivially_copyable_v<StellarLDUGravitySchurNewtonPreconditioner>);
static_assert(std::is_trivially_copyable_v<GravitySchurNewtonPreconditioner>);
static_assert(std::is_trivially_copyable_v<StellarLDUNewtonPreconditioner>);
} // namespace experiment::plateau_diagnostics