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:
@@ -58,14 +58,25 @@ namespace rotational_displacement_force_test_utils {
|
||||
);
|
||||
|
||||
[[nodiscard]] mean_field::operators::RotationalDisplacementForceLayout make_layout(const mean_field::fem::FEM &f) {
|
||||
using DomainSchema = gravity_prepared_test_utils::DomainSchema;
|
||||
|
||||
const auto densityMap = gravity_prepared_test_utils::make_field_map<mean_field::field::Density>(f);
|
||||
const auto displacementMap = gravity_prepared_test_utils::make_field_map<mean_field::field::Displacement>(f);
|
||||
const auto gravityFluxMap =
|
||||
mean_field::field::make_field_dof_map<mean_field::field::Gravity, DomainSchema>(*f.gravityFluxFes);
|
||||
const auto gravityPotentialMap =
|
||||
mean_field::field::make_field_dof_map<mean_field::field::Gravity, DomainSchema>(*f.gravityPotentialFes);
|
||||
const auto enthalpyMap =
|
||||
mean_field::field::make_field_dof_map<mean_field::field::Enthalpy, DomainSchema>(*f.enthalpyFes);
|
||||
|
||||
const std::array<int, CoupledForm::value_block_count> valueSizes{
|
||||
f.densityFes->GetTrueVSize(), f.displacementFes->GetTrueVSize(), f.gravityFluxFes->GetTrueVSize(),
|
||||
f.gravityPotentialFes->GetTrueVSize(), f.enthalpyFes->GetTrueVSize(), 1
|
||||
densityMap.reduced_size(), displacementMap.reduced_size(), gravityFluxMap.reduced_size(),
|
||||
gravityPotentialMap.reduced_size(), enthalpyMap.reduced_size(), 1
|
||||
};
|
||||
|
||||
const std::array<int, CoupledForm::residual_block_count> residualSizes{
|
||||
f.gravityFluxFes->GetTrueVSize(), f.gravityPotentialFes->GetTrueVSize(), f.densityFes->GetTrueVSize(),
|
||||
f.displacementFes->GetTrueVSize(), f.enthalpyFes->GetTrueVSize(), 1
|
||||
gravityFluxMap.reduced_size(), gravityPotentialMap.reduced_size(), densityMap.reduced_size(),
|
||||
displacementMap.reduced_size(), enthalpyMap.reduced_size(), 1
|
||||
};
|
||||
|
||||
return {valueSizes, residualSizes};
|
||||
@@ -275,7 +286,7 @@ namespace rotational_displacement_force_test_utils {
|
||||
TEST_CASE(
|
||||
"Rotational Displacement Force Query Includes Density Test And Linear "
|
||||
"Position",
|
||||
tags::centrifugal &tags::quadrature &tags::unit
|
||||
tags::rotation_prepared_unit
|
||||
) {
|
||||
using DisplacementField = mean_field::field::Field<mean_field::field::Displacement>;
|
||||
|
||||
@@ -300,7 +311,7 @@ TEST_CASE(
|
||||
TEST_CASE(
|
||||
"Rotational Displacement Force Uses Negative Rotation-Potential "
|
||||
"Gradient And Excludes Vacuum",
|
||||
tags::centrifugal &tags::kernels &tags::integration &tags::accuracy
|
||||
tags::rotation_kernel_accuracy
|
||||
) {
|
||||
mean_field::utils::Args args = test_utils::setup_args();
|
||||
|
||||
@@ -368,7 +379,7 @@ TEST_CASE(
|
||||
|
||||
TEST_CASE(
|
||||
"Prepared Rotational Displacement Force Reprepares Selectively",
|
||||
tags::centrifugal &tags::prepared &tags::integration
|
||||
tags::rotation_prepared
|
||||
) {
|
||||
mean_field::utils::Args args = test_utils::setup_args();
|
||||
|
||||
@@ -376,9 +387,9 @@ TEST_CASE(
|
||||
|
||||
REQUIRE(f.okay());
|
||||
|
||||
mfem::Vector density = rotational_displacement_force_test_utils::make_density(f, 0.37);
|
||||
mfem::Vector densityTrue = rotational_displacement_force_test_utils::make_density(f, 0.37);
|
||||
|
||||
const mfem::Vector displacement = gravity_prepared_test_utils::make_displacement(f, 0.53);
|
||||
const mfem::Vector displacementTrue = gravity_prepared_test_utils::make_displacement(f, 0.53);
|
||||
|
||||
mean_field::physics::RigidRotation rotation = rotational_displacement_force_test_utils::make_rotation(0.81);
|
||||
|
||||
@@ -386,6 +397,10 @@ TEST_CASE(
|
||||
|
||||
mean_field::operators::PreparedRotationalDisplacementForceOperator preparedOperator(f, *f.domainMapperStateless);
|
||||
|
||||
const auto &context = preparedOperator.GetContext();
|
||||
mfem::Vector density = context.GetDensityMap().gather(densityTrue);
|
||||
const mfem::Vector displacement = context.GetDisplacementMap().gather(displacementTrue);
|
||||
|
||||
const auto initialReport =
|
||||
preparedOperator.Prepare({.density = density, .displacement = displacement}, dependencies, rotation);
|
||||
|
||||
@@ -400,19 +415,22 @@ TEST_CASE(
|
||||
preparedOperator.BuildResidual(preparedResidual);
|
||||
|
||||
mean_field::operators::kernels::apply_rotational_displacement_force_residual(
|
||||
f, *f.domainMapperStateless, rotation, density, displacement, kernelResidual
|
||||
f, *f.domainMapperStateless, rotation, densityTrue, displacementTrue, kernelResidual
|
||||
);
|
||||
|
||||
const mfem::Vector kernelResidualReduced = context.GetDisplacementMap().gather(kernelResidual);
|
||||
|
||||
CHECK(
|
||||
rotational_displacement_force_test_utils::relative_difference(
|
||||
preparedResidual, kernelResidual, f.mesh->GetComm()
|
||||
preparedResidual, kernelResidualReduced, f.mesh->GetComm()
|
||||
) < 2.0e-12
|
||||
);
|
||||
|
||||
CHECK_FALSE(preparedOperator.Prepare({.density = density, .displacement = displacement}, dependencies, rotation)
|
||||
.DidAnyWork());
|
||||
|
||||
density = rotational_displacement_force_test_utils::make_density(f, 0.79);
|
||||
densityTrue = rotational_displacement_force_test_utils::make_density(f, 0.79);
|
||||
density = context.GetDensityMap().gather(densityTrue);
|
||||
|
||||
++dependencies.density.revision;
|
||||
|
||||
@@ -438,7 +456,7 @@ TEST_CASE(
|
||||
TEST_CASE(
|
||||
"Rotational Displacement Force Jacobian Matches Both Columns And "
|
||||
"Centered Differences",
|
||||
tags::centrifugal &tags::prepared &tags::jacobian &tags::accuracy
|
||||
tags::rotation_prepared_jacobian_accuracy
|
||||
) {
|
||||
mean_field::utils::Args args = test_utils::setup_args();
|
||||
|
||||
@@ -446,18 +464,25 @@ TEST_CASE(
|
||||
|
||||
REQUIRE(f.okay());
|
||||
|
||||
const mfem::Vector density = rotational_displacement_force_test_utils::make_density(f, 0.43);
|
||||
const mfem::Vector densityTrue = rotational_displacement_force_test_utils::make_density(f, 0.43);
|
||||
|
||||
const mfem::Vector densityDirection = rotational_displacement_force_test_utils::make_density_direction(f, 0.59);
|
||||
const mfem::Vector densityDirectionTrue = rotational_displacement_force_test_utils::make_density_direction(f, 0.59);
|
||||
|
||||
const mfem::Vector displacement = gravity_prepared_test_utils::make_displacement(f, 0.61);
|
||||
const mfem::Vector displacementTrue = gravity_prepared_test_utils::make_displacement(f, 0.61);
|
||||
|
||||
const mfem::Vector displacementDirection = rotational_displacement_force_test_utils::make_displacement_direction(f);
|
||||
const mfem::Vector displacementDirectionTrue =
|
||||
rotational_displacement_force_test_utils::make_displacement_direction(f);
|
||||
|
||||
const mean_field::physics::RigidRotation rotation = rotational_displacement_force_test_utils::make_rotation(0.93);
|
||||
|
||||
mean_field::operators::PreparedRotationalDisplacementForceOperator preparedOperator(f, *f.domainMapperStateless);
|
||||
|
||||
const auto &context = preparedOperator.GetContext();
|
||||
const mfem::Vector density = context.GetDensityMap().gather(densityTrue);
|
||||
const mfem::Vector densityDirection = context.GetDensityMap().gather(densityDirectionTrue);
|
||||
const mfem::Vector displacement = context.GetDisplacementMap().gather(displacementTrue);
|
||||
const mfem::Vector displacementDirection = context.GetDisplacementMap().gather(displacementDirectionTrue);
|
||||
|
||||
preparedOperator.Prepare(
|
||||
{.density = density, .displacement = displacement},
|
||||
rotational_displacement_force_test_utils::make_dependencies(), rotation
|
||||
@@ -482,26 +507,30 @@ TEST_CASE(
|
||||
) < 2.0e-12
|
||||
);
|
||||
|
||||
mfem::Vector zeroDensity(densityDirection.Size());
|
||||
mfem::Vector zeroDisplacement(displacementDirection.Size());
|
||||
zeroDensity = 0.0;
|
||||
zeroDisplacement = 0.0;
|
||||
mfem::Vector zeroDensityTrue(densityDirectionTrue.Size());
|
||||
mfem::Vector zeroDisplacementTrue(displacementDirectionTrue.Size());
|
||||
zeroDensityTrue = 0.0;
|
||||
zeroDisplacementTrue = 0.0;
|
||||
|
||||
constexpr double step = 1.0e-5;
|
||||
constexpr double step = 1.0e-5;
|
||||
|
||||
const mfem::Vector densityDifference = rotational_displacement_force_test_utils::centered_difference(
|
||||
f, rotation, density, densityDirection, displacement, zeroDisplacement, step
|
||||
const mfem::Vector densityDifferenceTrue = rotational_displacement_force_test_utils::centered_difference(
|
||||
f, rotation, densityTrue, densityDirectionTrue, displacementTrue, zeroDisplacementTrue, step
|
||||
);
|
||||
|
||||
const mfem::Vector displacementDifference = rotational_displacement_force_test_utils::centered_difference(
|
||||
f, rotation, density, zeroDensity, displacement, displacementDirection, step
|
||||
const mfem::Vector displacementDifferenceTrue = rotational_displacement_force_test_utils::centered_difference(
|
||||
f, rotation, densityTrue, zeroDensityTrue, displacementTrue, displacementDirectionTrue, step
|
||||
);
|
||||
|
||||
const mfem::Vector completeDifference = rotational_displacement_force_test_utils::centered_difference(
|
||||
f, rotation, density, densityDirection, displacement, displacementDirection, step
|
||||
const mfem::Vector completeDifferenceTrue = rotational_displacement_force_test_utils::centered_difference(
|
||||
f, rotation, densityTrue, densityDirectionTrue, displacementTrue, displacementDirectionTrue, step
|
||||
);
|
||||
|
||||
const double densityError = rotational_displacement_force_test_utils::relative_difference(
|
||||
const mfem::Vector densityDifference = context.GetDisplacementMap().gather(densityDifferenceTrue);
|
||||
const mfem::Vector displacementDifference = context.GetDisplacementMap().gather(displacementDifferenceTrue);
|
||||
const mfem::Vector completeDifference = context.GetDisplacementMap().gather(completeDifferenceTrue);
|
||||
|
||||
const double densityError = rotational_displacement_force_test_utils::relative_difference(
|
||||
densityAction, densityDifference, f.mesh->GetComm()
|
||||
);
|
||||
|
||||
@@ -524,7 +553,7 @@ TEST_CASE(
|
||||
|
||||
TEST_CASE(
|
||||
"Prepared Rotational Displacement Force MFEM Adapter Routes Only R-d",
|
||||
tags::centrifugal &tags::prepared &tags::mfem_operators &tags::unit
|
||||
tags::rotation_prepared_unit
|
||||
) {
|
||||
mean_field::utils::Args args = test_utils::setup_args();
|
||||
|
||||
@@ -532,18 +561,25 @@ TEST_CASE(
|
||||
|
||||
REQUIRE(f.okay());
|
||||
|
||||
const mfem::Vector density = rotational_displacement_force_test_utils::make_density(f, 0.47);
|
||||
const mfem::Vector densityTrue = rotational_displacement_force_test_utils::make_density(f, 0.47);
|
||||
|
||||
const mfem::Vector densityDirection = rotational_displacement_force_test_utils::make_density_direction(f, 0.63);
|
||||
const mfem::Vector densityDirectionTrue = rotational_displacement_force_test_utils::make_density_direction(f, 0.63);
|
||||
|
||||
const mfem::Vector displacement = gravity_prepared_test_utils::make_displacement(f, 0.57);
|
||||
const mfem::Vector displacementTrue = gravity_prepared_test_utils::make_displacement(f, 0.57);
|
||||
|
||||
const mfem::Vector displacementDirection = rotational_displacement_force_test_utils::make_displacement_direction(f);
|
||||
const mfem::Vector displacementDirectionTrue =
|
||||
rotational_displacement_force_test_utils::make_displacement_direction(f);
|
||||
|
||||
const mean_field::physics::RigidRotation rotation = rotational_displacement_force_test_utils::make_rotation(0.87);
|
||||
|
||||
mean_field::operators::PreparedRotationalDisplacementForceOperator preparedOperator(f, *f.domainMapperStateless);
|
||||
|
||||
const auto &context = preparedOperator.GetContext();
|
||||
const mfem::Vector density = context.GetDensityMap().gather(densityTrue);
|
||||
const mfem::Vector densityDirection = context.GetDensityMap().gather(densityDirectionTrue);
|
||||
const mfem::Vector displacement = context.GetDisplacementMap().gather(displacementTrue);
|
||||
const mfem::Vector displacementDirection = context.GetDisplacementMap().gather(displacementDirectionTrue);
|
||||
|
||||
preparedOperator.Prepare(
|
||||
{.density = density, .displacement = displacement},
|
||||
rotational_displacement_force_test_utils::make_dependencies(), rotation
|
||||
|
||||
Reference in New Issue
Block a user