Enable combined stellar LDU gravity Schur Newton experiment
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user