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:
@@ -153,23 +153,16 @@ namespace stellar_equilibrium_test_utils {
|
||||
return map.gather(fullEnthalpy);
|
||||
}
|
||||
|
||||
[[nodiscard]] mfem::Vector pack_full_gravity_state(
|
||||
const mean_field::fem::FEM &f,
|
||||
const mfem::Vector &fullDensity,
|
||||
[[nodiscard]] mfem::Vector pack_gravity_state(
|
||||
const mfem::Vector &density,
|
||||
const mfem::Vector &displacement,
|
||||
const mfem::Vector &gravityGradient,
|
||||
const mfem::Vector &gravityPotential
|
||||
) {
|
||||
const std::array<int, 4> blockSizes{
|
||||
f.densityFes->GetTrueVSize(), f.displacementFes->GetTrueVSize(), f.gravityFluxFes->GetTrueVSize(),
|
||||
f.gravityPotentialFes->GetTrueVSize()
|
||||
density.Size(), displacement.Size(), gravityGradient.Size(), gravityPotential.Size()
|
||||
};
|
||||
|
||||
MFEM_VERIFY(fullDensity.Size() == blockSizes[0], "Full density has the wrong gravity-state size.");
|
||||
MFEM_VERIFY(displacement.Size() == blockSizes[1], "Displacement has the wrong gravity-state size.");
|
||||
MFEM_VERIFY(gravityGradient.Size() == blockSizes[2], "Gravity gradient has the wrong gravity-state size.");
|
||||
MFEM_VERIFY(gravityPotential.Size() == blockSizes[3], "Gravity potential has the wrong gravity-state size.");
|
||||
|
||||
const std::array<int, 5> offsets{
|
||||
0, blockSizes[0], blockSizes[0] + blockSizes[1], blockSizes[0] + blockSizes[1] + blockSizes[2],
|
||||
blockSizes[0] + blockSizes[1] + blockSizes[2] + blockSizes[3]
|
||||
@@ -178,7 +171,7 @@ namespace stellar_equilibrium_test_utils {
|
||||
mfem::Vector packed(offsets[4]);
|
||||
|
||||
const std::array<const mfem::Vector *, 4> blocks{
|
||||
&fullDensity, &displacement, &gravityGradient, &gravityPotential
|
||||
&density, &displacement, &gravityGradient, &gravityPotential
|
||||
};
|
||||
|
||||
for (int block = 0; block < 4; ++block) {
|
||||
@@ -494,27 +487,24 @@ namespace stellar_equilibrium_test_utils {
|
||||
const mfem::Vector &state
|
||||
) {
|
||||
const mean_field::operators::StellarEquilibriumLayout &layout = stellarOperator.GetLayout();
|
||||
const FieldMaps maps(f);
|
||||
|
||||
const mfem::Vector reducedDensity = const_value_view(state, layout, densityValue);
|
||||
const mfem::Vector displacement = const_value_view(state, layout, displacementValue);
|
||||
const mfem::Vector gravityGradient = const_value_view(state, layout, gravityGradientValue);
|
||||
const mfem::Vector gravityPotential = const_value_view(state, layout, gravityPotentialValue);
|
||||
|
||||
const mfem::Vector fullDensity = maps.density.scatter(reducedDensity);
|
||||
const mfem::Vector gravityState =
|
||||
pack_full_gravity_state(f, fullDensity, displacement, gravityGradient, gravityPotential);
|
||||
pack_gravity_state(reducedDensity, displacement, gravityGradient, gravityPotential);
|
||||
|
||||
mfem::Vector gravity;
|
||||
mfem::Vector closure;
|
||||
mfem::Vector displacementResidualValue;
|
||||
mfem::Vector fullHydrostatic;
|
||||
mfem::Vector hydrostatic;
|
||||
mfem::Vector mass;
|
||||
|
||||
stellarOperator.GetGravityOperator().Mult(gravityState, gravity);
|
||||
stellarOperator.GetBarotropicClosureOperator().BuildResidual(closure);
|
||||
stellarOperator.GetDisplacementOperator().BuildResidual(displacementResidualValue);
|
||||
stellarOperator.GetHydrostaticOperator().BuildResidual(fullHydrostatic);
|
||||
stellarOperator.GetHydrostaticOperator().BuildResidual(hydrostatic);
|
||||
stellarOperator.GetMassNormalizationOperator().BuildResidual(mass);
|
||||
|
||||
mfem::Vector result(layout.residual_offsets().Last());
|
||||
@@ -537,10 +527,7 @@ namespace stellar_equilibrium_test_utils {
|
||||
|
||||
residual_view(result, layout, displacementResidual) = displacementResidualValue;
|
||||
|
||||
{
|
||||
mfem::Vector reducedHydrostatic = residual_view(result, layout, enthalpyResidual);
|
||||
maps.enthalpy.gather(fullHydrostatic, reducedHydrostatic);
|
||||
}
|
||||
residual_view(result, layout, enthalpyResidual) = hydrostatic;
|
||||
|
||||
residual_view(result, layout, massResidual) = mass;
|
||||
|
||||
@@ -549,11 +536,9 @@ namespace stellar_equilibrium_test_utils {
|
||||
|
||||
[[nodiscard]] mfem::Vector explicit_jacobian_action(
|
||||
const mean_field::operators::PreparedStellarEquilibriumOperator &stellarOperator,
|
||||
const mean_field::fem::FEM &f,
|
||||
const mfem::Vector &direction
|
||||
) {
|
||||
const mean_field::operators::StellarEquilibriumLayout &layout = stellarOperator.GetLayout();
|
||||
const FieldMaps maps(f);
|
||||
|
||||
const mfem::Vector reducedDensityDirection = const_value_view(direction, layout, densityValue);
|
||||
const mfem::Vector displacementDirection = const_value_view(direction, layout, displacementValue);
|
||||
@@ -562,17 +547,14 @@ namespace stellar_equilibrium_test_utils {
|
||||
const mfem::Vector reducedEnthalpyDirection = const_value_view(direction, layout, enthalpyValue);
|
||||
const mfem::Vector bernoulliDirection = const_value_view(direction, layout, bernoulliValue);
|
||||
|
||||
const mfem::Vector fullDensityDirection = maps.density.scatter(reducedDensityDirection);
|
||||
const mfem::Vector fullEnthalpyDirection = maps.enthalpy.scatter(reducedEnthalpyDirection);
|
||||
|
||||
const mfem::Vector gravityDirection = pack_full_gravity_state(
|
||||
f, fullDensityDirection, displacementDirection, gravityGradientDirection, gravityPotentialDirection
|
||||
const mfem::Vector gravityDirection = pack_gravity_state(
|
||||
reducedDensityDirection, displacementDirection, gravityGradientDirection, gravityPotentialDirection
|
||||
);
|
||||
|
||||
mfem::Vector gravityAction;
|
||||
mfem::Vector closureAction;
|
||||
mfem::Vector displacementAction;
|
||||
mfem::Vector fullHydrostaticAction;
|
||||
mfem::Vector hydrostaticAction;
|
||||
mfem::Vector massAction;
|
||||
|
||||
stellarOperator.GetGravityJacobianOperator().Mult(gravityDirection, gravityAction);
|
||||
@@ -582,17 +564,17 @@ namespace stellar_equilibrium_test_utils {
|
||||
);
|
||||
|
||||
stellarOperator.GetDisplacementOperator().ApplyCompleteJacobianAction(
|
||||
fullDensityDirection, displacementDirection, gravityGradientDirection, fullEnthalpyDirection,
|
||||
reducedDensityDirection, displacementDirection, gravityGradientDirection, reducedEnthalpyDirection,
|
||||
displacementAction
|
||||
);
|
||||
|
||||
stellarOperator.GetHydrostaticOperator().ApplyCompleteJacobianAction(
|
||||
fullEnthalpyDirection, gravityPotentialDirection, bernoulliDirection(0), displacementDirection,
|
||||
fullHydrostaticAction
|
||||
reducedEnthalpyDirection, gravityPotentialDirection, bernoulliDirection(0), displacementDirection,
|
||||
hydrostaticAction
|
||||
);
|
||||
|
||||
stellarOperator.GetMassNormalizationOperator().ApplyCompleteJacobianAction(
|
||||
fullDensityDirection, displacementDirection, massAction
|
||||
reducedDensityDirection, displacementDirection, massAction
|
||||
);
|
||||
|
||||
mfem::Vector result(layout.residual_offsets().Last());
|
||||
@@ -615,10 +597,7 @@ namespace stellar_equilibrium_test_utils {
|
||||
|
||||
residual_view(result, layout, displacementResidual) = displacementAction;
|
||||
|
||||
{
|
||||
mfem::Vector reducedHydrostaticAction = residual_view(result, layout, enthalpyResidual);
|
||||
maps.enthalpy.gather(fullHydrostaticAction, reducedHydrostaticAction);
|
||||
}
|
||||
residual_view(result, layout, enthalpyResidual) = hydrostaticAction;
|
||||
|
||||
residual_view(result, layout, massResidual) = massAction;
|
||||
|
||||
@@ -719,7 +698,7 @@ TEST_CASE(
|
||||
|
||||
TEST_CASE(
|
||||
"Prepared Stellar Equilibrium Jacobian Is The Exact Restricted Full Child Jacobian",
|
||||
tags::barotrope &tags::prepared &tags::field &tags::jacobian &tags::integration &tags::accuracy
|
||||
tags::barotrope_prepared_jacobian_accuracy &tags::field
|
||||
) {
|
||||
mean_field::utils::Args args = test_utils::setup_args();
|
||||
mean_field::fem::FEM f = mean_field::fem::setup_fem(args.mesh_file, args, 0);
|
||||
@@ -742,7 +721,7 @@ TEST_CASE(
|
||||
stellarOperator.Mult(direction, rootAction);
|
||||
|
||||
const mfem::Vector explicitAction =
|
||||
stellar_equilibrium_test_utils::explicit_jacobian_action(stellarOperator, f, direction);
|
||||
stellar_equilibrium_test_utils::explicit_jacobian_action(stellarOperator, direction);
|
||||
|
||||
const double difference =
|
||||
stellar_equilibrium_test_utils::relative_difference(rootAction, explicitAction, f.mesh->GetComm());
|
||||
|
||||
Reference in New Issue
Block a user