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:
@@ -55,21 +55,29 @@ namespace {
|
||||
return {valueSizes, residualSizes};
|
||||
}
|
||||
|
||||
[[nodiscard]] mfem::Array<int> make_gravity_state_offsets(const mean_field::fem::FEM &f) {
|
||||
[[nodiscard]] mfem::Array<int> make_gravity_state_offsets(
|
||||
const mean_field::field::FieldDofMap &densityMap,
|
||||
const mean_field::field::FieldDofMap &displacementMap,
|
||||
const mean_field::field::FieldDofMap &gravityFluxMap,
|
||||
const mean_field::field::FieldDofMap &gravityPotentialMap
|
||||
) {
|
||||
mfem::Array<int> offsets(5);
|
||||
offsets[0] = 0;
|
||||
offsets[1] = offsets[0] + f.densityFes->GetTrueVSize();
|
||||
offsets[2] = offsets[1] + f.displacementFes->GetTrueVSize();
|
||||
offsets[3] = offsets[2] + f.gravityFluxFes->GetTrueVSize();
|
||||
offsets[4] = offsets[3] + f.gravityPotentialFes->GetTrueVSize();
|
||||
offsets[1] = offsets[0] + densityMap.reduced_size();
|
||||
offsets[2] = offsets[1] + displacementMap.reduced_size();
|
||||
offsets[3] = offsets[2] + gravityFluxMap.reduced_size();
|
||||
offsets[4] = offsets[3] + gravityPotentialMap.reduced_size();
|
||||
return offsets;
|
||||
}
|
||||
|
||||
[[nodiscard]] mfem::Array<int> make_gravity_residual_offsets(const mean_field::fem::FEM &f) {
|
||||
[[nodiscard]] mfem::Array<int> make_gravity_residual_offsets(
|
||||
const mean_field::field::FieldDofMap &gravityFluxMap,
|
||||
const mean_field::field::FieldDofMap &gravityPotentialMap
|
||||
) {
|
||||
mfem::Array<int> offsets(3);
|
||||
offsets[0] = 0;
|
||||
offsets[1] = f.gravityFluxFes->GetTrueVSize();
|
||||
offsets[2] = offsets[1] + f.gravityPotentialFes->GetTrueVSize();
|
||||
offsets[1] = gravityFluxMap.reduced_size();
|
||||
offsets[2] = offsets[1] + gravityPotentialMap.reduced_size();
|
||||
return offsets;
|
||||
}
|
||||
|
||||
@@ -295,8 +303,16 @@ namespace mean_field::operators {
|
||||
gravityPotentialMap,
|
||||
enthalpyMap
|
||||
)),
|
||||
gravityStateOffsets(make_gravity_state_offsets(f)),
|
||||
gravityResidualOffsets(make_gravity_residual_offsets(f)) {
|
||||
gravityStateOffsets(make_gravity_state_offsets(
|
||||
densityMap,
|
||||
displacementMap,
|
||||
gravityFluxMap,
|
||||
gravityPotentialMap
|
||||
)),
|
||||
gravityResidualOffsets(make_gravity_residual_offsets(
|
||||
gravityFluxMap,
|
||||
gravityPotentialMap
|
||||
)) {
|
||||
}
|
||||
};
|
||||
|
||||
@@ -386,12 +402,7 @@ namespace mean_field::operators {
|
||||
domainMapper,
|
||||
m_gravityContext
|
||||
),
|
||||
m_targetMass(targetMass),
|
||||
m_densityMap(std::move(constructionData.densityMap)),
|
||||
m_displacementMap(std::move(constructionData.displacementMap)),
|
||||
m_gravityFluxMap(std::move(constructionData.gravityFluxMap)),
|
||||
m_gravityPotentialMap(std::move(constructionData.gravityPotentialMap)),
|
||||
m_enthalpyMap(std::move(constructionData.enthalpyMap)) {
|
||||
m_targetMass(targetMass) {
|
||||
MFEM_VERIFY(
|
||||
std::isfinite(m_targetMass) && m_targetMass > 0.0,
|
||||
"PreparedStellarEquilibriumOperator requires a finite, positive target mass."
|
||||
@@ -402,35 +413,12 @@ namespace mean_field::operators {
|
||||
"PreparedStellarEquilibriumOperator has inconsistent block dimensions."
|
||||
);
|
||||
|
||||
MFEM_VERIFY(
|
||||
m_displacementMap.is_identity(), "PreparedStellarEquilibriumOperator currently requires Displacement "
|
||||
"support to span the full MFEM true-DOF space."
|
||||
);
|
||||
MFEM_VERIFY(
|
||||
m_gravityFluxMap.is_identity(), "PreparedStellarEquilibriumOperator currently requires gravity-flux "
|
||||
"support to span the full MFEM true-DOF space."
|
||||
);
|
||||
MFEM_VERIFY(
|
||||
m_gravityPotentialMap.is_identity(), "PreparedStellarEquilibriumOperator currently requires "
|
||||
"gravity-potential support to span the full MFEM true-DOF space."
|
||||
);
|
||||
m_gravityState.SetSize(m_gravityStateOffsets.Last());
|
||||
|
||||
m_fullDensity.SetSize(m_densityMap.full_size());
|
||||
m_fullEnthalpy.SetSize(m_enthalpyMap.full_size());
|
||||
m_fullGravityState.SetSize(m_gravityStateOffsets.Last());
|
||||
m_gravityDirection.SetSize(m_gravityStateOffsets.Last());
|
||||
|
||||
m_fullDensityVariation.SetSize(m_densityMap.full_size());
|
||||
m_fullEnthalpyVariation.SetSize(m_enthalpyMap.full_size());
|
||||
m_fullGravityDirection.SetSize(m_gravityStateOffsets.Last());
|
||||
m_fullEnthalpyAction.SetSize(m_enthalpyMap.full_size());
|
||||
|
||||
m_fullDensity = 0.0;
|
||||
m_fullEnthalpy = 0.0;
|
||||
m_fullGravityState = 0.0;
|
||||
m_fullDensityVariation = 0.0;
|
||||
m_fullEnthalpyVariation = 0.0;
|
||||
m_fullGravityDirection = 0.0;
|
||||
m_fullEnthalpyAction = 0.0;
|
||||
m_gravityState = 0.0;
|
||||
m_gravityDirection = 0.0;
|
||||
}
|
||||
|
||||
PreparedStellarEquilibriumReport PreparedStellarEquilibriumOperator::Prepare(
|
||||
@@ -502,16 +490,13 @@ namespace mean_field::operators {
|
||||
const mfem::Vector reducedEnthalpy = make_value_view(state, m_layout, enthalpyValue);
|
||||
const mfem::Vector bernoulli = make_value_view(state, m_layout, bernoulliValue);
|
||||
|
||||
m_densityMap.scatter(reducedDensity, m_fullDensity);
|
||||
m_enthalpyMap.scatter(reducedEnthalpy, m_fullEnthalpy);
|
||||
|
||||
pack_gravity_vector(
|
||||
m_fullGravityState, m_gravityStateOffsets, m_fullDensity, displacement, gravityGradient, gravityPotential
|
||||
m_gravityState, m_gravityStateOffsets, reducedDensity, displacement, gravityGradient, gravityPotential
|
||||
);
|
||||
|
||||
PreparedStellarEquilibriumReport report;
|
||||
|
||||
report.gravity = m_gravityOperator.Prepare(m_fullGravityState, make_gravity_revisions(dependencies));
|
||||
report.gravity = m_gravityOperator.Prepare(m_gravityState, make_gravity_revisions(dependencies));
|
||||
|
||||
report.barotropicClosure = m_barotropicClosureOperator.Prepare(
|
||||
{.density = reducedDensity, .enthalpy = reducedEnthalpy, .displacement = displacement},
|
||||
@@ -519,7 +504,7 @@ namespace mean_field::operators {
|
||||
);
|
||||
|
||||
report.hydrostatic = m_hydrostaticOperator.Prepare(
|
||||
{.enthalpy = m_fullEnthalpy,
|
||||
{.enthalpy = reducedEnthalpy,
|
||||
.gravityPotential = gravityPotential,
|
||||
.displacement = displacement,
|
||||
.bernoulliConstant = bernoulli(0)},
|
||||
@@ -563,12 +548,13 @@ namespace mean_field::operators {
|
||||
mfem::Vector gravity;
|
||||
mfem::Vector closure;
|
||||
mfem::Vector displacement;
|
||||
mfem::Vector hydrostatic;
|
||||
mfem::Vector mass;
|
||||
|
||||
m_gravityOperator.Mult(m_fullGravityState, gravity);
|
||||
m_gravityOperator.Mult(m_gravityState, gravity);
|
||||
m_barotropicClosureOperator.BuildResidual(closure);
|
||||
m_displacementOperator.BuildResidual(displacement);
|
||||
m_hydrostaticOperator.BuildResidual(m_fullEnthalpyAction);
|
||||
m_hydrostaticOperator.BuildResidual(hydrostatic);
|
||||
m_massNormalizationOperator.BuildResidual(mass);
|
||||
|
||||
m_cachedResidual.SetSize(Height());
|
||||
@@ -600,10 +586,10 @@ namespace mean_field::operators {
|
||||
"The displacement residual has the wrong size."
|
||||
);
|
||||
|
||||
{
|
||||
mfem::Vector reducedEnthalpyResidual = make_residual_view(m_cachedResidual, m_layout, enthalpyResidual);
|
||||
m_enthalpyMap.gather(m_fullEnthalpyAction, reducedEnthalpyResidual);
|
||||
}
|
||||
assign_residual_block(
|
||||
m_cachedResidual, m_layout, enthalpyResidual, hydrostatic,
|
||||
"The hydrostatic residual has the wrong size."
|
||||
);
|
||||
|
||||
assign_residual_block(
|
||||
m_cachedResidual, m_layout, massResidual, mass, "The mass-normalization residual has the wrong size."
|
||||
@@ -665,37 +651,35 @@ namespace mean_field::operators {
|
||||
const mfem::Vector reducedEnthalpyDirection = make_value_view(direction, m_layout, enthalpyValue);
|
||||
const mfem::Vector bernoulliDirection = make_value_view(direction, m_layout, bernoulliValue);
|
||||
|
||||
m_densityMap.scatter(reducedDensityDirection, m_fullDensityVariation);
|
||||
m_enthalpyMap.scatter(reducedEnthalpyDirection, m_fullEnthalpyVariation);
|
||||
|
||||
pack_gravity_vector(
|
||||
m_fullGravityDirection, m_gravityStateOffsets, m_fullDensityVariation, displacementDirection,
|
||||
m_gravityDirection, m_gravityStateOffsets, reducedDensityDirection, displacementDirection,
|
||||
gravityGradientDirection, gravityPotentialDirection
|
||||
);
|
||||
|
||||
mfem::Vector gravityAction;
|
||||
mfem::Vector closureAction;
|
||||
mfem::Vector displacementAction;
|
||||
mfem::Vector hydrostaticAction;
|
||||
mfem::Vector massAction;
|
||||
|
||||
m_gravityJacobianOperator.Mult(m_fullGravityDirection, gravityAction);
|
||||
m_gravityJacobianOperator.Mult(m_gravityDirection, gravityAction);
|
||||
|
||||
m_barotropicClosureOperator.Mult(
|
||||
reducedDensityDirection, reducedEnthalpyDirection, displacementDirection, closureAction
|
||||
);
|
||||
|
||||
m_displacementOperator.ApplyCompleteJacobianAction(
|
||||
m_fullDensityVariation, displacementDirection, gravityGradientDirection, reducedEnthalpyDirection,
|
||||
reducedDensityDirection, displacementDirection, gravityGradientDirection, reducedEnthalpyDirection,
|
||||
displacementAction
|
||||
);
|
||||
|
||||
m_hydrostaticOperator.ApplyCompleteJacobianAction(
|
||||
m_fullEnthalpyVariation, gravityPotentialDirection, bernoulliDirection(0), displacementDirection,
|
||||
m_fullEnthalpyAction
|
||||
reducedEnthalpyDirection, gravityPotentialDirection, bernoulliDirection(0), displacementDirection,
|
||||
hydrostaticAction
|
||||
);
|
||||
|
||||
m_massNormalizationOperator.ApplyCompleteJacobianAction(
|
||||
m_fullDensityVariation, displacementDirection, massAction
|
||||
reducedDensityDirection, displacementDirection, massAction
|
||||
);
|
||||
|
||||
action.SetSize(Height());
|
||||
@@ -727,10 +711,10 @@ namespace mean_field::operators {
|
||||
"The displacement Jacobian action has the wrong size."
|
||||
);
|
||||
|
||||
{
|
||||
mfem::Vector reducedEnthalpyAction = make_residual_view(action, m_layout, enthalpyResidual);
|
||||
m_enthalpyMap.gather(m_fullEnthalpyAction, reducedEnthalpyAction);
|
||||
}
|
||||
assign_residual_block(
|
||||
action, m_layout, enthalpyResidual, hydrostaticAction,
|
||||
"The hydrostatic Jacobian action has the wrong size."
|
||||
);
|
||||
|
||||
assign_residual_block(
|
||||
action, m_layout, massResidual, massAction, "The mass-normalization Jacobian action has the wrong size."
|
||||
|
||||
Reference in New Issue
Block a user