feat(support): continued migration to new field dof support system

mass normaliztion, gravity, displacement, and hydrostatic equilibrium are now migrated
This commit is contained in:
2026-08-24 15:44:24 -04:00
parent 0f3ca8050b
commit 177ae8b38a
48 changed files with 1738 additions and 935 deletions

View File

@@ -10,18 +10,19 @@ namespace gravity_context = operators::context::gravity_field;
TEST_CASE(
"Gravity Field Linearization Context Applies Selective Invalidation",
tags::integration &tags::gravity &tags::contexts
tags::gravity_context
) {
auto args = test_utils::setup_args();
fem::FEM f = fem::setup_fem(args.mesh_file, args, 0);
gravity_context::GravityFieldLinearizationContext context(f, *f.domainMapperStateless);
mfem::Vector density = prepared_test::make_deterministic_vector(f.densityFes->GetTrueVSize(), 0.11);
mfem::Vector displacement = prepared_test::make_displacement(f, 0.0);
mfem::Vector gravity_gradient = prepared_test::make_deterministic_vector(f.gravityFluxFes->GetTrueVSize(), 0.37);
mfem::Vector density = prepared_test::make_deterministic_vector(context.GetDensityMap().reduced_size(), 0.11);
mfem::Vector displacement = context.GetDisplacementMap().gather(prepared_test::make_displacement(f, 0.0));
mfem::Vector gravity_gradient =
prepared_test::make_deterministic_vector(context.GetGravityGradientMap().reduced_size(), 0.37);
mfem::Vector gravity_potential =
prepared_test::make_deterministic_vector(f.gravityPotentialFes->GetTrueVSize(), 0.63);
prepared_test::make_deterministic_vector(context.GetGravityPotentialMap().reduced_size(), 0.63);
gravity_context::GravityFieldRevisions revisions;
@@ -72,7 +73,7 @@ TEST_CASE(
CHECK(density_report.updated_density);
CHECK_FALSE(density_report.updated_gravity_gradient);
CHECK_FALSE(density_report.geometry.DidAnyWork());
CHECK(context.GetDensity()(0) == density(0));
CHECK(context.GetDensityTrue()(context.GetDensityMap().true_dof(0)) == density(0));
gravity_gradient(0) -= 0.4;
++revisions.gravity_gradient.value;
@@ -82,9 +83,9 @@ TEST_CASE(
CHECK_FALSE(gradient_report.updated_density);
CHECK(gradient_report.updated_gravity_gradient);
CHECK_FALSE(gradient_report.geometry.DidAnyWork());
CHECK(context.GetGravityGradient()(0) == gravity_gradient(0));
CHECK(context.GetGravityGradientTrue()(context.GetGravityGradientMap().true_dof(0)) == gravity_gradient(0));
displacement = prepared_test::make_displacement(f, 1.0);
displacement = context.GetDisplacementMap().gather(prepared_test::make_displacement(f, 1.0));
++revisions.displacement.value;
const gravity_context::GravityFieldPreparationReport displacement_report = context.Prepare(make_state(), revisions);
@@ -114,18 +115,19 @@ TEST_CASE(
TEST_CASE(
"Gravity Field Linearization Context Owns Frozen Base Fields",
tags::integration &tags::gravity &tags::contexts
tags::gravity_context
) {
auto args = test_utils::setup_args();
fem::FEM f = fem::setup_fem(args.mesh_file, args, 0);
gravity_context::GravityFieldLinearizationContext context(f, *f.domainMapperStateless);
mfem::Vector density = prepared_test::make_deterministic_vector(f.densityFes->GetTrueVSize(), 0.13);
mfem::Vector displacement = prepared_test::make_displacement(f, 0.4);
mfem::Vector gravity_gradient = prepared_test::make_deterministic_vector(f.gravityFluxFes->GetTrueVSize(), 0.47);
mfem::Vector density = prepared_test::make_deterministic_vector(context.GetDensityMap().reduced_size(), 0.13);
mfem::Vector displacement = context.GetDisplacementMap().gather(prepared_test::make_displacement(f, 0.4));
mfem::Vector gravity_gradient =
prepared_test::make_deterministic_vector(context.GetGravityGradientMap().reduced_size(), 0.47);
mfem::Vector gravity_potential =
prepared_test::make_deterministic_vector(f.gravityPotentialFes->GetTrueVSize(), 0.71);
prepared_test::make_deterministic_vector(context.GetGravityPotentialMap().reduced_size(), 0.71);
gravity_context::GravityFieldRevisions revisions;
@@ -137,24 +139,24 @@ TEST_CASE(
revisions
);
const mfem::Vector frozen_density = context.GetDensity();
const mfem::Vector frozen_displacement = context.GetGeometryContext().GetDisplacement();
const mfem::Vector frozen_gravity_gradient = context.GetGravityGradient();
const mfem::Vector frozen_density = context.GetDensityTrue();
const mfem::Vector frozen_displacement = context.GetGeometryContext().GetDisplacementTrue();
const mfem::Vector frozen_gravity_gradient = context.GetGravityGradientTrue();
density = 0.0;
displacement = 0.0;
gravity_gradient = 0.0;
gravity_potential = 0.0;
CHECK(prepared_test::relative_error(context.GetDensity(), frozen_density, f.mesh->GetComm()) == 0.0);
CHECK(prepared_test::relative_error(context.GetDensityTrue(), frozen_density, f.mesh->GetComm()) == 0.0);
CHECK(
prepared_test::relative_error(
context.GetGeometryContext().GetDisplacement(), frozen_displacement, f.displacementFes->GetComm()
context.GetGeometryContext().GetDisplacementTrue(), frozen_displacement, f.displacementFes->GetComm()
) == 0.0
);
CHECK(
prepared_test::relative_error(
context.GetGravityGradient(), frozen_gravity_gradient, f.gravityFluxFes->GetComm()
context.GetGravityGradientTrue(), frozen_gravity_gradient, f.gravityFluxFes->GetComm()
) == 0.0
);
@@ -167,22 +169,22 @@ TEST_CASE(
);
CHECK_FALSE(unchanged_revision_report.DidAnyWork());
CHECK(prepared_test::relative_error(context.GetDensity(), frozen_density, f.mesh->GetComm()) == 0.0);
CHECK(prepared_test::relative_error(context.GetDensityTrue(), frozen_density, f.mesh->GetComm()) == 0.0);
CHECK(
prepared_test::relative_error(
context.GetGeometryContext().GetDisplacement(), frozen_displacement, f.displacementFes->GetComm()
context.GetGeometryContext().GetDisplacementTrue(), frozen_displacement, f.displacementFes->GetComm()
) == 0.0
);
CHECK(
prepared_test::relative_error(
context.GetGravityGradient(), frozen_gravity_gradient, f.gravityFluxFes->GetComm()
context.GetGravityGradientTrue(), frozen_gravity_gradient, f.gravityFluxFes->GetComm()
) == 0.0
);
}
TEST_CASE(
"Gravity Field Geometry Contexts Have Independent Prepared State",
tags::integration &tags::gravity &tags::contexts
tags::gravity_context
) {
auto args = test_utils::setup_args();
fem::FEM f = fem::setup_fem(args.mesh_file, args, 0);
@@ -190,10 +192,13 @@ TEST_CASE(
gravity_context::GravityFieldGeometryContext first_context(f, *f.domainMapperStateless);
gravity_context::GravityFieldGeometryContext second_context(f, *f.domainMapperStateless);
const mfem::Vector first_displacement = prepared_test::make_displacement(f, 0.0);
const mfem::Vector second_displacement = prepared_test::make_displacement(f, 1.0);
const mfem::Vector gravity_gradient =
prepared_test::make_deterministic_vector(f.gravityFluxFes->GetTrueVSize(), 0.35);
const mfem::Vector first_displacement =
first_context.GetDisplacementMap().gather(prepared_test::make_displacement(f, 0.0));
const mfem::Vector second_displacement =
second_context.GetDisplacementMap().gather(prepared_test::make_displacement(f, 1.0));
const mfem::Vector gravity_gradient = prepared_test::make_field_map<field::Gravity>(f).gather(
prepared_test::make_deterministic_vector(f.gravityFluxFes->GetTrueVSize(), 0.35)
);
first_context.Prepare(first_displacement, {.value = 0}, {.value = 0});
second_context.Prepare(second_displacement, {.value = 0}, {.value = 0});
@@ -205,7 +210,8 @@ TEST_CASE(
first_context.GetMassOperator().Mult(gravity_gradient, first_action);
second_context.GetMassOperator().Mult(gravity_gradient, second_action_before);
const mfem::Vector updated_first_displacement = prepared_test::make_displacement(f, 0.6);
const mfem::Vector updated_first_displacement =
first_context.GetDisplacementMap().gather(prepared_test::make_displacement(f, 0.6));
first_context.Prepare(updated_first_displacement, {.value = 0}, {.value = 1});
second_context.GetMassOperator().Mult(gravity_gradient, second_action_after);