feat(preconditioner): major work on preconditioner system

first preconditioner MVP
This commit is contained in:
2026-09-04 07:54:10 -04:00
parent 25510008dd
commit 71423d543f
61 changed files with 15920 additions and 422 deletions

View File

@@ -1,4 +1,5 @@
#include <catch2/catch_test_macros.hpp>
#include <cstdint>
#include <mfem.hpp>
import mean_field;
@@ -50,6 +51,8 @@ TEST_CASE(
CHECK(initial_report.DidAnyWork());
const auto &geometry_context = context.GetGeometryContext();
CHECK(geometry_context.GetMassOperator().HasVariationData());
CHECK(geometry_context.GetSourceOperator().HasVariationData());
CHECK(geometry_context.GetDivergenceOperator().Width() == f.gravityFluxFes->GetTrueVSize());
CHECK(geometry_context.GetDivergenceOperator().Height() == f.gravityPotentialFes->GetTrueVSize());
CHECK(geometry_context.GetTransposeDivergenceOperator().Width() == f.gravityPotentialFes->GetTrueVSize());
@@ -122,6 +125,51 @@ TEST_CASE(
CHECK(context.GetGeometryContext().GetSourceOperator().GetPreparationCount() == 1);
}
TEST_CASE(
"Gravity Field Geometry Context Distinguishes Primal And Linearization Preparation",
tags::gravity_context
) {
auto args = test_utils::setup_args();
fem::FEM f = fem::setup_fem(args.mesh_file, args, 0);
gravity_context::GravityFieldGeometryContext context(f, *f.domainMapperStateless);
const mfem::Vector displacement = context.GetDisplacementMap().gather(prepared_test::make_displacement(f, 0.25));
const gravity_context::GravityFieldGeometryPreparation primal_report =
context.PreparePrimal(displacement, {.value = 0}, {.value = 0});
REQUIRE(context.IsPrepared());
CHECK(primal_report.reconstructed_operators);
CHECK(primal_report.rebuilt_mass_operator);
CHECK(primal_report.rebuilt_source_operator);
CHECK(primal_report.rebuilt_divergence_operator);
CHECK_FALSE(primal_report.refreshed_variation_state);
CHECK_FALSE(context.GetMassOperator().HasVariationData());
CHECK_FALSE(context.GetSourceOperator().HasVariationData());
const std::uint64_t primal_mass_preparations = context.GetMassOperator().GetPreparationCount();
const std::uint64_t primal_source_preparations = context.GetSourceOperator().GetPreparationCount();
const gravity_context::GravityFieldGeometryPreparation repeated_primal_report =
context.PreparePrimal(displacement, {.value = 0}, {.value = 0});
CHECK_FALSE(repeated_primal_report.DidAnyWork());
CHECK(context.GetMassOperator().GetPreparationCount() == primal_mass_preparations);
CHECK(context.GetSourceOperator().GetPreparationCount() == primal_source_preparations);
const gravity_context::GravityFieldGeometryPreparation upgrade_report =
context.Prepare(displacement, {.value = 0}, {.value = 0});
CHECK_FALSE(upgrade_report.reconstructed_operators);
CHECK(upgrade_report.rebuilt_mass_operator);
CHECK(upgrade_report.rebuilt_source_operator);
CHECK_FALSE(upgrade_report.rebuilt_divergence_operator);
CHECK(upgrade_report.refreshed_variation_state);
CHECK(context.GetMassOperator().HasVariationData());
CHECK(context.GetSourceOperator().HasVariationData());
CHECK(context.GetMassOperator().GetPreparationCount() == primal_mass_preparations + 1);
CHECK(context.GetSourceOperator().GetPreparationCount() == primal_source_preparations + 1);
}
TEST_CASE(
"Gravity Field Linearization Context Owns Frozen Base Fields",
tags::gravity_context

View File

@@ -2889,6 +2889,8 @@ TEST_CASE(
operators::ReducedGravityFieldPreconditioner reduced_preconditioner(f, reduced_geometry_context);
REQUIRE(reduced_geometry_context.IsPrepared());
REQUIRE_FALSE(reduced_geometry_context.GetMassOperator().HasVariationData());
REQUIRE_FALSE(reduced_geometry_context.GetSourceOperator().HasVariationData());
REQUIRE(reduced_operator.Width() == layout.residual_offsets().Last());
REQUIRE(reduced_operator.Height() == layout.residual_offsets().Last());
REQUIRE(reduced_operator.Width() == reduced_operator.Height());

View File

@@ -91,8 +91,10 @@ TEST_CASE(
STATIC_CHECK(
std::same_as<
typename BaseProblem::CompiledSurfaceConstraintType,
surface::CompiledPressureSurfaceConstraintT<surface::BarotropicSurfaceFormulation, eos::Polytrope>>
surface::CompiledPressureSurfaceConstraintT<
typename BaseProblem::ThermodynamicEquationsType::PressureSurfaceFormulation, eos::Polytrope>>
);
STATIC_CHECK(material::CompiledThermodynamicEquations<typename BaseProblem::ThermodynamicEquationsType>);
}
TEST_CASE(