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

@@ -6,6 +6,8 @@ module;
#include <type_traits>
export module mean_field:utils.blocks;
export import :model.specifications;
export namespace mean_field::utils::blocks {
inline constexpr int dynamic_block_size = -1;
@@ -19,6 +21,18 @@ export namespace mean_field::utils::blocks {
static constexpr int static_block_size = dynamic_block_size;
};
template <typename GeneratedValue> struct generated_value_block final : value_block_base {
using GeneratedType = GeneratedValue;
static constexpr int static_block_size = static_cast<int>(GeneratedValue::scalarArity);
};
template <typename GeneratedResidual> struct generated_residual_block final : residual_block_base {
using GeneratedType = GeneratedResidual;
static constexpr int static_block_size = static_cast<int>(GeneratedResidual::scalarArity);
};
struct term { };
struct field { };
@@ -96,25 +110,44 @@ export namespace mean_field::utils::blocks {
static inline constexpr specific specific_term{};
};
struct barotropic_constant final : field {
struct mass_normalization final : term {
struct value final : value_block_base {
static constexpr int static_block_size = 1;
};
struct fixed_total_mass final : field {
using SpecificationType = models::FixedTotalMass;
using MultiplierType = models::MultiplierFor<SpecificationType>;
using ResidualType = models::ResidualFor<SpecificationType>;
struct residual final : residual_block_base {
static constexpr int static_block_size = 1;
};
struct mass_normalization final : term {
using value = generated_value_block<MultiplierType>;
using residual = generated_residual_block<ResidualType>;
};
static inline constexpr mass_normalization mass_normalization_term{};
};
struct fixed_central_density final : field {
using SpecificationType = models::FixedCentralDensity;
using BorderType = models::BorderFor<SpecificationType>;
using ResidualType = models::ResidualFor<SpecificationType>;
struct central_value final : term {
using value = generated_value_block<BorderType>;
using residual = generated_residual_block<ResidualType>;
};
static inline constexpr central_value central_value_term{};
};
// Compatibility name for the current barotropic formulation. The scalar
// is generated by FixedTotalMass; its realization in this formulation is
// the historical C coordinate.
using barotropic_constant = fixed_total_mass;
inline constexpr density density_field{};
inline constexpr displacement displacement_field{};
inline constexpr surface_deformation surface_deformation_field{};
inline constexpr gravity gravity_field{};
inline constexpr enthalpy enthalpy_field{};
inline constexpr fixed_total_mass fixed_total_mass_constraint{};
inline constexpr fixed_central_density fixed_central_density_phase{};
inline constexpr barotropic_constant barotropic_constant_field{};
template <typename... Types> struct type_list {
@@ -489,6 +522,61 @@ export namespace mean_field::utils::blocks {
density::mass::value,
surface_deformation::parameters::value>>;
// Bordered n=3 family closure. The original stellar coordinates remain a
// contiguous prefix and the phase border and row are appended last.
using central_density_bordered_stellar_equilibrium_form = block_form<
type_list<
density::mass::value,
surface_deformation::parameters::value,
gravity::gradient::value,
gravity::poisson::value,
enthalpy::specific::value,
barotropic_constant::mass_normalization::value,
fixed_central_density::central_value::value>,
type_list<
gravity::gradient::residual,
gravity::poisson::residual,
density::mass::residual,
surface_deformation::shape_equilibrium::residual,
enthalpy::specific::residual,
barotropic_constant::mass_normalization::residual,
fixed_central_density::central_value::residual>>;
using central_density_bordered_stellar_equilibrium_jacobian_form = type_list<
block_row<
gravity::gradient::residual,
gravity::gradient::value,
gravity::poisson::value,
surface_deformation::parameters::value>,
block_row<
gravity::poisson::residual,
gravity::gradient::value,
density::mass::value,
surface_deformation::parameters::value>,
block_row<
density::mass::residual,
density::mass::value,
enthalpy::specific::value,
surface_deformation::parameters::value>,
block_row<
surface_deformation::shape_equilibrium::residual,
density::mass::value,
surface_deformation::parameters::value,
gravity::gradient::value,
enthalpy::specific::value>,
block_row<
enthalpy::specific::residual,
enthalpy::specific::value,
gravity::poisson::value,
surface_deformation::parameters::value,
barotropic_constant::mass_normalization::value,
fixed_central_density::central_value::value>,
block_row<
barotropic_constant::mass_normalization::residual,
density::mass::value,
surface_deformation::parameters::value>,
block_row<fixed_central_density::central_value::residual, enthalpy::specific::value>>;
// Columns: [d, h]
// Rows: [R_d]
using pressure_force_form = block_form<
@@ -509,4 +597,8 @@ export namespace mean_field::utils::blocks {
static_assert(valid_jacobian_form<
surface_deformed_stellar_equilibrium_form,
surface_deformed_stellar_equilibrium_jacobian_form>);
static_assert(valid_jacobian_form<
central_density_bordered_stellar_equilibrium_form,
central_density_bordered_stellar_equilibrium_jacobian_form>);
} // namespace mean_field::utils::blocks