Reuse prepared gravity force for stellar cross preconditioning

This commit is contained in:
2026-09-17 16:28:56 -04:00
parent 7f7d7b1cfa
commit fac147774a
3 changed files with 131 additions and 2 deletions

View File

@@ -413,6 +413,8 @@ export namespace mean_field::preconditioning {
m_gravityDirection(operation.GetGravityJacobianOperator().Width()),
m_volumeDisplacement(operation.GetDomainDeformation().volumeDisplacementSize()),
m_mechanicalAction(operation.GetDomainDeformation().volumeDisplacementSize()),
m_zeroDensity(operation.GetGravityContext().GetDensityMap().reduced_size()),
m_zeroDisplacement(operation.GetGravityContext().GetDisplacementMap().reduced_size()),
m_zeroEnthalpy(operation.GetBarotropicClosureOperator().GetEnthalpySize()) {
const auto &context = operation.GetGravityContext();
m_materialOffsets[0] = 0;
@@ -425,6 +427,8 @@ export namespace mean_field::preconditioning {
m_combinedOffsets[0] = 0;
m_combinedOffsets[1] = MaterialSize();
m_combinedOffsets[2] = Height();
m_zeroDensity = 0.0;
m_zeroDisplacement = 0.0;
m_zeroEnthalpy = 0.0;
}
@@ -488,8 +492,12 @@ export namespace mean_field::preconditioning {
auto enthalpyAction = MaterialBlock(materialAction, 2);
densityAction = 0.0;
m_operation->GetDisplacementOperator().ApplyGravityGradientJacobianAction(
gravityGradientDirection, m_mechanicalAction
// Restrict the same prepared tensor action used by the full Jacobian.
// The standalone gravity-gradient column still uses a legacy kernel
// that rebuilds geometry during every application. Zero variations
// select this column without changing its quadrature or derivative.
m_operation->GetDisplacementOperator().GetGravityOperator().ApplyCompleteJacobianAction(
m_zeroDensity, m_zeroDisplacement, gravityGradientDirection, m_mechanicalAction
);
m_operation->GetDomainDeformation().applyJacobianTranspose(
m_operation->GetSurfaceDeformationParameters(), m_mechanicalAction, surfaceAction
@@ -615,6 +623,8 @@ export namespace mean_field::preconditioning {
mutable mfem::Vector m_gravityDirection;
mutable mfem::Vector m_volumeDisplacement;
mutable mfem::Vector m_mechanicalAction;
mfem::Vector m_zeroDensity;
mfem::Vector m_zeroDisplacement;
mfem::Vector m_zeroEnthalpy;
};