perf(jacobian-action): major updates to jacobian action application by removing redudant quadrature work. ~5x increase in speed

This commit is contained in:
2026-09-02 17:01:50 -04:00
parent 85500fef3b
commit 25510008dd
74 changed files with 8967 additions and 814 deletions

View File

@@ -15,6 +15,7 @@ export import :fem;
export import :field.mfem;
export import :mapping.domain_mapper;
export import :model.stellar;
export import :model.typed_stellar;
export import :operators.context.gravity_field;
export import :operators.gravity_field;
export import :operators.gravity_field_jacobian;
@@ -23,6 +24,7 @@ export import :operators.prepared_displacement_residual;
export import :operators.prepared_hydrostatic_equilibrium;
export import :operators.prepared_mass_normalization;
export import :operators.prepared_surface_constraint;
export import :operators.root_manifest;
export import :physics.rigid_rotation;
export import :utils.blocks;
@@ -82,6 +84,16 @@ export namespace mean_field::operators {
using StellarEquilibriumLayout =
utils::blocks::form_layout<utils::blocks::surface_deformed_stellar_equilibrium_form>;
using StellarEquilibriumSpecificationModel =
model::StellarModel<models::SpecificationSet<eos::Polytrope, models::FixedTotalMass, surface::Isobaric>>;
using StellarEquilibriumSystemManifest = EquilibriumSystemManifest<
StellarEquilibriumSpecificationModel,
utils::blocks::surface_deformed_stellar_equilibrium_form,
utils::blocks::surface_deformed_stellar_equilibrium_jacobian_form>;
using StellarEquilibriumRootManifest = StellarEquilibriumSystemManifest;
class PreparedStellarEquilibriumOperator final : public mfem::Operator {
public:
template <models::StellarModelType Model>
@@ -101,12 +113,27 @@ export namespace mean_field::operators {
f,
domainMapper,
stellarModel.equationOfState(),
stellarModel.targetMass(),
models::compileConstraint(models::FixedTotalMass{dimensions::MassValue{stellarModel.targetMass()}}),
PressureSurfaceConstraintView{stellarModel.compiledSurfaceConstraint()},
deformation::PreparedDomainDeformationRuntime{stellarModel.compileDomainDeformation(f)}
) {
}
/*
* Authoritative construction path for a compiled equilibrium system.
* The caller owns the EOS and compiled surface constraint for this
* operator's lifetime; the remaining compiled contributions are
* transferred into the operator.
*/
PreparedStellarEquilibriumOperator(
fem::FEM &f,
const mapping::DomainMapper &domainMapper,
const eos::Polytrope &equationOfState,
models::CompiledFixedMass fixedMassConstraint,
PressureSurfaceConstraintView surfaceConstraint,
deformation::PreparedDomainDeformationRuntime domainDeformation
);
PreparedStellarEquilibriumOperator(const PreparedStellarEquilibriumOperator &) = delete;
PreparedStellarEquilibriumOperator &operator=(const PreparedStellarEquilibriumOperator &) = delete;
PreparedStellarEquilibriumOperator(PreparedStellarEquilibriumOperator &&) = delete;
@@ -128,6 +155,12 @@ export namespace mean_field::operators {
[[nodiscard]] bool IsPrepared() const noexcept;
[[nodiscard]] double GetTargetMass() const noexcept;
[[nodiscard]] const StellarEquilibriumLayout &GetLayout() const noexcept;
[[nodiscard]] const StellarEquilibriumRootManifest &GetRootManifest() const noexcept;
[[nodiscard]] RootStateView<utils::blocks::surface_deformed_stellar_equilibrium_form>
GetRootStateView(const mfem::Vector &state) const;
[[nodiscard]] ResidualView<utils::blocks::surface_deformed_stellar_equilibrium_form>
GetResidualView(mfem::Vector &residual) const;
[[nodiscard]] RootConstraintReport GetFixedMassReport() const;
[[nodiscard]] const StellarEquilibriumDependencies &GetDependencies() const;
[[nodiscard]] const PreparedStellarEquilibriumStatistics &GetStatistics() const noexcept;
@@ -160,16 +193,7 @@ export namespace mean_field::operators {
fem::FEM &f,
const mapping::DomainMapper &domainMapper,
const eos::Polytrope &equationOfState,
double targetMass,
PressureSurfaceConstraintView surfaceConstraint,
deformation::PreparedDomainDeformationRuntime domainDeformation
);
PreparedStellarEquilibriumOperator(
fem::FEM &f,
const mapping::DomainMapper &domainMapper,
const eos::Polytrope &equationOfState,
double targetMass,
models::CompiledFixedMass fixedMassConstraint,
PressureSurfaceConstraintView surfaceConstraint,
ConstructionData constructionData
);
@@ -177,7 +201,7 @@ export namespace mean_field::operators {
void AssembleResidual();
void VerifyPrepared() const;
StellarEquilibriumLayout m_layout;
StellarEquilibriumRootManifest m_rootManifest;
mfem::Array<int> m_gravityStateOffsets;
context::gravity_field::GravityFieldLinearizationContext m_gravityContext;
@@ -198,7 +222,7 @@ export namespace mean_field::operators {
mfem::Vector m_generatedVolumeDisplacement;
mfem::Vector m_fullMechanicalResidual;
mfem::Vector m_cachedResidual;
double m_targetMass{0.0};
models::CompiledFixedMass m_fixedMassConstraint;
mutable PreparedStellarEquilibriumStatistics m_statistics;
bool m_isPrepared{false};