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:
@@ -11,31 +11,36 @@ namespace prepared_test = gravity_prepared_test_utils;
|
||||
|
||||
TEST_CASE(
|
||||
"Prepared Mapped Gravity Source Matches Stateless Kernel",
|
||||
tags::integration &tags::mfem_operators &tags::prepared
|
||||
tags::gravity_prepared
|
||||
) {
|
||||
auto args = test_utils::setup_args();
|
||||
fem::FEM f = fem::setup_fem(args.mesh_file, args, 0);
|
||||
|
||||
operators::PreparedMappedGravitySourceOperator prepared_operator(f, *f.domainMapperStateless);
|
||||
REQUIRE(prepared_operator.Width() == f.densityFes->GetTrueVSize());
|
||||
REQUIRE(prepared_operator.Height() == f.gravityPotentialFes->GetTrueVSize());
|
||||
REQUIRE(prepared_operator.Width() == prepared_operator.GetDensityMap().reduced_size());
|
||||
REQUIRE(prepared_operator.Height() == prepared_operator.GetPotentialMap().reduced_size());
|
||||
|
||||
const mfem::Vector density = prepared_test::make_deterministic_vector(f.densityFes->GetTrueVSize(), 0.41);
|
||||
const MPI_Comm communicator = f.mesh->GetComm();
|
||||
const mfem::Vector density_true = prepared_test::make_deterministic_vector(f.densityFes->GetTrueVSize(), 0.41);
|
||||
const mfem::Vector density = prepared_operator.GetDensityMap().gather(density_true);
|
||||
const MPI_Comm communicator = f.mesh->GetComm();
|
||||
|
||||
mfem::Vector identity_action;
|
||||
mfem::Vector deformed_action;
|
||||
|
||||
for (const double deformation_scale : {0.0, 1.0}) {
|
||||
const mfem::Vector displacement = prepared_test::make_displacement(f, deformation_scale);
|
||||
const mfem::Vector displacement_true = prepared_test::make_displacement(f, deformation_scale);
|
||||
const mfem::Vector displacement = prepared_operator.GetDisplacementMap().gather(displacement_true);
|
||||
|
||||
prepared_operator.Prepare(displacement);
|
||||
|
||||
mfem::Vector prepared_action;
|
||||
mfem::Vector reference_action;
|
||||
|
||||
prepared_operator.Mult(density, prepared_action);
|
||||
operators::kernels::apply_mapped_source(f, *f.domainMapperStateless, density, displacement, reference_action);
|
||||
mfem::Vector reference_action_true;
|
||||
operators::kernels::apply_mapped_source(
|
||||
f, *f.domainMapperStateless, density_true, displacement_true, reference_action_true
|
||||
);
|
||||
const mfem::Vector reference_action = prepared_operator.GetPotentialMap().gather(reference_action_true);
|
||||
|
||||
const double relative_error = prepared_test::relative_error(prepared_action, reference_action, communicator);
|
||||
|
||||
@@ -64,28 +69,36 @@ TEST_CASE(
|
||||
|
||||
TEST_CASE(
|
||||
"Prepared Mapped Gravity Source Preserves Linearity And Excludes Vacuum",
|
||||
tags::integration &tags::gravity &tags::prepared
|
||||
tags::gravity_prepared
|
||||
) {
|
||||
auto args = test_utils::setup_args();
|
||||
fem::FEM f = fem::setup_fem(args.mesh_file, args, 0);
|
||||
|
||||
operators::PreparedMappedGravitySourceOperator prepared_operator(f, *f.domainMapperStateless);
|
||||
REQUIRE(prepared_operator.Width() == f.densityFes->GetTrueVSize());
|
||||
REQUIRE(prepared_operator.Height() == f.gravityPotentialFes->GetTrueVSize());
|
||||
const mfem::Vector displacement = prepared_test::make_displacement(f, 1.0);
|
||||
REQUIRE(prepared_operator.Width() == prepared_operator.GetDensityMap().reduced_size());
|
||||
REQUIRE(prepared_operator.Height() == prepared_operator.GetPotentialMap().reduced_size());
|
||||
const mfem::Vector displacement =
|
||||
prepared_operator.GetDisplacementMap().gather(prepared_test::make_displacement(f, 1.0));
|
||||
prepared_operator.Prepare(displacement);
|
||||
|
||||
const mfem::Vector first = prepared_test::make_deterministic_vector(f.densityFes->GetTrueVSize(), 0.27);
|
||||
const mfem::Vector second = prepared_test::make_deterministic_vector(f.densityFes->GetTrueVSize(), 0.79);
|
||||
const mfem::Vector combination = prepared_test::linear_combination(first, 1.3, second, -0.6);
|
||||
const mfem::Vector stellar_density = prepared_test::make_domain_supported_density(f, true);
|
||||
const mfem::Vector vacuum_density = prepared_test::make_domain_supported_density(f, false);
|
||||
const mfem::Vector first = prepared_operator.GetDensityMap().gather(
|
||||
prepared_test::make_deterministic_vector(f.densityFes->GetTrueVSize(), 0.27)
|
||||
);
|
||||
const mfem::Vector second = prepared_operator.GetDensityMap().gather(
|
||||
prepared_test::make_deterministic_vector(f.densityFes->GetTrueVSize(), 0.79)
|
||||
);
|
||||
const mfem::Vector combination = prepared_test::linear_combination(first, 1.3, second, -0.6);
|
||||
const mfem::Vector stellar_density =
|
||||
prepared_operator.GetDensityMap().gather(prepared_test::make_domain_supported_density(f, true));
|
||||
const mfem::Vector vacuum_density =
|
||||
prepared_operator.GetDensityMap().gather(prepared_test::make_domain_supported_density(f, false));
|
||||
|
||||
mfem::Vector first_action;
|
||||
mfem::Vector second_action;
|
||||
mfem::Vector combination_action;
|
||||
mfem::Vector stellar_action;
|
||||
mfem::Vector vacuum_action;
|
||||
mfem::Vector transpose_action;
|
||||
|
||||
prepared_operator.Mult(first, first_action);
|
||||
prepared_operator.Mult(second, second_action);
|
||||
@@ -93,6 +106,10 @@ TEST_CASE(
|
||||
prepared_operator.Mult(stellar_density, stellar_action);
|
||||
prepared_operator.Mult(vacuum_density, vacuum_action);
|
||||
|
||||
const mfem::Vector potential =
|
||||
prepared_test::make_deterministic_vector(prepared_operator.GetPotentialMap().reduced_size(), 1.17);
|
||||
prepared_operator.MultTranspose(potential, transpose_action);
|
||||
|
||||
const mfem::Vector expected_combination = prepared_test::linear_combination(first_action, 1.3, second_action, -0.6);
|
||||
const MPI_Comm communicator = f.mesh->GetComm();
|
||||
|
||||
@@ -100,6 +117,9 @@ TEST_CASE(
|
||||
prepared_test::relative_error(combination_action, expected_combination, communicator);
|
||||
const double stellar_norm = prepared_test::global_norm(stellar_action, communicator);
|
||||
const double vacuum_norm = prepared_test::global_norm(vacuum_action, communicator);
|
||||
const double forward_pairing = prepared_test::global_dot(first_action, potential, communicator);
|
||||
const double transpose_pairing = prepared_test::global_dot(first, transpose_action, communicator);
|
||||
const double transpose_error = prepared_test::relative_scalar_error(forward_pairing, transpose_pairing);
|
||||
const std::uint64_t preparation_count = prepared_operator.GetPreparationCount();
|
||||
|
||||
mfem::Vector repeated_action;
|
||||
@@ -108,10 +128,12 @@ TEST_CASE(
|
||||
INFO("Relative source linearity error = " << linearity_error);
|
||||
INFO("Stellar source norm = " << stellar_norm);
|
||||
INFO("Vacuum-only source norm = " << vacuum_norm);
|
||||
INFO("Relative source-transpose pairing error = " << transpose_error);
|
||||
|
||||
CHECK_THAT(linearity_error, WithinAbs(0.0, 2.0e-12));
|
||||
CHECK(stellar_norm > 0.0);
|
||||
CHECK(vacuum_norm <= 1.0e-13 * stellar_norm);
|
||||
CHECK_THAT(transpose_error, WithinAbs(0.0, 2.0e-12));
|
||||
CHECK(prepared_test::relative_error(repeated_action, first_action, communicator) < 2.0e-14);
|
||||
CHECK(prepared_operator.GetPreparationCount() == preparation_count);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user