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 gravity_displacement_force_test_utils {
|
||||
);
|
||||
|
||||
[[nodiscard]] mean_field::operators::GravityDisplacementForceLayout 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};
|
||||
@@ -221,10 +232,10 @@ namespace gravity_displacement_force_test_utils {
|
||||
const mean_field::operators::context::gravity_field::GravityFieldRevisions &revisions
|
||||
) {
|
||||
context.Prepare(
|
||||
{.density = density,
|
||||
.displacement = displacement,
|
||||
.gravity_gradient = gravityGradient,
|
||||
.gravity_potential = gravityPotential},
|
||||
{.density = context.GetDensityMap().gather(density),
|
||||
.displacement = context.GetDisplacementMap().gather(displacement),
|
||||
.gravity_gradient = context.GetGravityGradientMap().gather(gravityGradient),
|
||||
.gravity_potential = context.GetGravityPotentialMap().gather(gravityPotential)},
|
||||
revisions
|
||||
);
|
||||
}
|
||||
@@ -314,7 +325,7 @@ namespace gravity_displacement_force_test_utils {
|
||||
|
||||
TEST_CASE(
|
||||
"Gravity Displacement Force Query Includes Every Registered Operand",
|
||||
tags::gravity &tags::quadrature &tags::unit
|
||||
tags::gravity_unit
|
||||
) {
|
||||
using DisplacementField = mean_field::field::Field<mean_field::field::Displacement>;
|
||||
|
||||
@@ -350,7 +361,7 @@ TEST_CASE(
|
||||
TEST_CASE(
|
||||
"Gravity Displacement Force Uses Positive Grad-Phi Sign And Excludes "
|
||||
"Vacuum",
|
||||
tags::gravity &tags::integration &tags::accuracy
|
||||
tags::gravity_kernel_accuracy
|
||||
) {
|
||||
mean_field::utils::Args args = test_utils::setup_args();
|
||||
|
||||
@@ -413,7 +424,7 @@ TEST_CASE(
|
||||
|
||||
TEST_CASE(
|
||||
"Prepared Gravity Displacement Force Reuses Shared Gravity Revisions",
|
||||
tags::gravity &tags::prepared &tags::integration
|
||||
tags::gravity_prepared
|
||||
) {
|
||||
mean_field::utils::Args args = test_utils::setup_args();
|
||||
|
||||
@@ -457,9 +468,11 @@ TEST_CASE(
|
||||
f, *f.domainMapperStateless, density, gravityGradient, displacement, kernelResidual
|
||||
);
|
||||
|
||||
const mfem::Vector kernelResidualReduced = gravityContext.GetDisplacementMap().gather(kernelResidual);
|
||||
|
||||
CHECK(
|
||||
gravity_displacement_force_test_utils::relative_difference(
|
||||
preparedResidual, kernelResidual, f.mesh->GetComm()
|
||||
preparedResidual, kernelResidualReduced, f.mesh->GetComm()
|
||||
) < 2.0e-12
|
||||
);
|
||||
|
||||
@@ -493,7 +506,7 @@ TEST_CASE(
|
||||
TEST_CASE(
|
||||
"Gravity Displacement Force Jacobian Matches All Columns And Centered "
|
||||
"Differences",
|
||||
tags::gravity &tags::prepared &tags::jacobian &tags::accuracy
|
||||
tags::gravity_prepared_jacobian_accuracy
|
||||
) {
|
||||
mean_field::utils::Args args = test_utils::setup_args();
|
||||
|
||||
@@ -532,19 +545,24 @@ TEST_CASE(
|
||||
|
||||
preparedOperator.Prepare();
|
||||
|
||||
const mfem::Vector densityDirectionReduced = gravityContext.GetDensityMap().gather(densityDirection);
|
||||
const mfem::Vector gravityGradientDirectionReduced =
|
||||
gravityContext.GetGravityGradientMap().gather(gravityGradientDirection);
|
||||
const mfem::Vector displacementDirectionReduced = gravityContext.GetDisplacementMap().gather(displacementDirection);
|
||||
|
||||
mfem::Vector densityAction;
|
||||
mfem::Vector gravityAction;
|
||||
mfem::Vector displacementAction;
|
||||
mfem::Vector completeAction;
|
||||
|
||||
preparedOperator.ApplyDensityJacobianAction(densityDirection, densityAction);
|
||||
preparedOperator.ApplyDensityJacobianAction(densityDirectionReduced, densityAction);
|
||||
|
||||
preparedOperator.ApplyGravityGradientJacobianAction(gravityGradientDirection, gravityAction);
|
||||
preparedOperator.ApplyGravityGradientJacobianAction(gravityGradientDirectionReduced, gravityAction);
|
||||
|
||||
preparedOperator.ApplyDisplacementJacobianAction(displacementDirection, displacementAction);
|
||||
preparedOperator.ApplyDisplacementJacobianAction(displacementDirectionReduced, displacementAction);
|
||||
|
||||
preparedOperator.ApplyCompleteJacobianAction(
|
||||
densityDirection, displacementDirection, gravityGradientDirection, completeAction
|
||||
densityDirectionReduced, displacementDirectionReduced, gravityGradientDirectionReduced, completeAction
|
||||
);
|
||||
|
||||
mfem::Vector summedColumns(densityAction);
|
||||
@@ -559,29 +577,34 @@ TEST_CASE(
|
||||
mfem::Vector zeroDensity(densityDirection.Size());
|
||||
mfem::Vector zeroGravity(gravityGradientDirection.Size());
|
||||
mfem::Vector zeroDisplacement(displacementDirection.Size());
|
||||
zeroDensity = 0.0;
|
||||
zeroGravity = 0.0;
|
||||
zeroDisplacement = 0.0;
|
||||
zeroDensity = 0.0;
|
||||
zeroGravity = 0.0;
|
||||
zeroDisplacement = 0.0;
|
||||
|
||||
constexpr double step = 1.0e-5;
|
||||
constexpr double step = 1.0e-5;
|
||||
|
||||
const mfem::Vector densityDifference = gravity_displacement_force_test_utils::centered_difference(
|
||||
const mfem::Vector densityDifferenceTrue = gravity_displacement_force_test_utils::centered_difference(
|
||||
f, density, densityDirection, gravityGradient, zeroGravity, displacement, zeroDisplacement, step
|
||||
);
|
||||
|
||||
const mfem::Vector gravityDifference = gravity_displacement_force_test_utils::centered_difference(
|
||||
const mfem::Vector gravityDifferenceTrue = gravity_displacement_force_test_utils::centered_difference(
|
||||
f, density, zeroDensity, gravityGradient, gravityGradientDirection, displacement, zeroDisplacement, step
|
||||
);
|
||||
|
||||
const mfem::Vector displacementDifference = gravity_displacement_force_test_utils::centered_difference(
|
||||
const mfem::Vector displacementDifferenceTrue = gravity_displacement_force_test_utils::centered_difference(
|
||||
f, density, zeroDensity, gravityGradient, zeroGravity, displacement, displacementDirection, step
|
||||
);
|
||||
|
||||
const mfem::Vector completeDifference = gravity_displacement_force_test_utils::centered_difference(
|
||||
const mfem::Vector completeDifferenceTrue = gravity_displacement_force_test_utils::centered_difference(
|
||||
f, density, densityDirection, gravityGradient, gravityGradientDirection, displacement, displacementDirection,
|
||||
step
|
||||
);
|
||||
|
||||
const mfem::Vector densityDifference = gravityContext.GetDisplacementMap().gather(densityDifferenceTrue);
|
||||
const mfem::Vector gravityDifference = gravityContext.GetDisplacementMap().gather(gravityDifferenceTrue);
|
||||
const mfem::Vector displacementDifference = gravityContext.GetDisplacementMap().gather(displacementDifferenceTrue);
|
||||
const mfem::Vector completeDifference = gravityContext.GetDisplacementMap().gather(completeDifferenceTrue);
|
||||
|
||||
const double densityError =
|
||||
gravity_displacement_force_test_utils::relative_difference(densityAction, densityDifference, f.mesh->GetComm());
|
||||
|
||||
@@ -609,7 +632,7 @@ TEST_CASE(
|
||||
|
||||
TEST_CASE(
|
||||
"Prepared Gravity Displacement Force MFEM Adapter Routes Only R-d",
|
||||
tags::gravity &tags::prepared &tags::mfem_operators &tags::unit
|
||||
tags::gravity_prepared_unit
|
||||
) {
|
||||
mean_field::utils::Args args = test_utils::setup_args();
|
||||
|
||||
@@ -648,22 +671,27 @@ TEST_CASE(
|
||||
|
||||
preparedOperator.Prepare();
|
||||
|
||||
const auto layout = gravity_displacement_force_test_utils::make_layout(f);
|
||||
const mfem::Vector densityDirectionReduced = gravityContext.GetDensityMap().gather(densityDirection);
|
||||
const mfem::Vector gravityGradientDirectionReduced =
|
||||
gravityContext.GetGravityGradientMap().gather(gravityGradientDirection);
|
||||
const mfem::Vector displacementDirectionReduced = gravityContext.GetDisplacementMap().gather(displacementDirection);
|
||||
|
||||
const auto layout = gravity_displacement_force_test_utils::make_layout(f);
|
||||
|
||||
mean_field::operators::PreparedGravityDisplacementForceJacobianOperator adapter(layout, preparedOperator);
|
||||
|
||||
mfem::BlockVector direction(layout.value_offsets());
|
||||
direction = 0.0;
|
||||
direction = 0.0;
|
||||
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::densityValue) = densityDirection;
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::densityValue) = densityDirectionReduced;
|
||||
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::displacementValue) = displacementDirection;
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::displacementValue) = displacementDirectionReduced;
|
||||
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::gravityGradientValue) = gravityGradientDirection;
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::gravityGradientValue) = gravityGradientDirectionReduced;
|
||||
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::gravityPotentialValue) = 0.29;
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::gravityPotentialValue) = 0.29;
|
||||
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::enthalpyValue) = -0.37;
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::enthalpyValue) = -0.37;
|
||||
|
||||
direction.GetBlock(gravity_displacement_force_test_utils::barotropicConstantValue) = 0.43;
|
||||
|
||||
@@ -673,7 +701,8 @@ TEST_CASE(
|
||||
mfem::Vector expectedDisplacementAction;
|
||||
|
||||
preparedOperator.ApplyCompleteJacobianAction(
|
||||
densityDirection, displacementDirection, gravityGradientDirection, expectedDisplacementAction
|
||||
densityDirectionReduced, displacementDirectionReduced, gravityGradientDirectionReduced,
|
||||
expectedDisplacementAction
|
||||
);
|
||||
|
||||
const mfem::Vector actualDisplacementAction = gravity_displacement_force_test_utils::copy_residual_block(
|
||||
@@ -707,4 +736,4 @@ TEST_CASE(
|
||||
for (const mfem::Vector &row : zeroRows) {
|
||||
CHECK(gravity_prepared_test_utils::global_norm(row, f.mesh->GetComm()) == 0.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user