perf(jacobian-action): major updates to jacobian action application by removing redudant quadrature work. ~5x increase in speed
This commit is contained in:
@@ -9,7 +9,9 @@ export module mean_field:operators.prepared_mass_normalization;
|
||||
|
||||
export import :fem;
|
||||
export import :mapping.domain_mapper;
|
||||
export import :model.compiled_fixed_mass;
|
||||
export import :operators.context.gravity_field;
|
||||
export import :operators.prepared_constraint;
|
||||
export import :utils.blocks;
|
||||
|
||||
export namespace mean_field::operators {
|
||||
@@ -33,6 +35,16 @@ export namespace mean_field::operators {
|
||||
double targetMass{0.0};
|
||||
};
|
||||
|
||||
struct FixedMassJacobianInput final {
|
||||
const mfem::Vector &densityVariation;
|
||||
const mfem::Vector &displacementVariation;
|
||||
};
|
||||
|
||||
struct FixedMassJacobianTransposeOutput final {
|
||||
mfem::Vector &densityDual;
|
||||
mfem::Vector &displacementDual;
|
||||
};
|
||||
|
||||
struct PreparedMassNormalizationReport final {
|
||||
bool rebuiltStaticPlan{false};
|
||||
bool refreshedGeometry{false};
|
||||
@@ -43,12 +55,15 @@ export namespace mean_field::operators {
|
||||
[[nodiscard]] bool DidAnyWork() const noexcept {
|
||||
return rebuiltStaticPlan || refreshedGeometry || refreshedDensity || updatedTargetMass || assembledResidual;
|
||||
}
|
||||
|
||||
constexpr auto operator<=>(const PreparedMassNormalizationReport &) const = default;
|
||||
};
|
||||
|
||||
struct PreparedMassNormalizationActionStatistics final {
|
||||
std::uint64_t densityApplications{0};
|
||||
std::uint64_t displacementApplications{0};
|
||||
std::uint64_t completeApplications{0};
|
||||
std::uint64_t transposeApplications{0};
|
||||
|
||||
constexpr auto operator<=>(const PreparedMassNormalizationActionStatistics &) const = default;
|
||||
};
|
||||
@@ -66,6 +81,13 @@ export namespace mean_field::operators {
|
||||
*/
|
||||
class PreparedMassNormalizationOperator final {
|
||||
public:
|
||||
using SpecificationType = models::FixedTotalMass;
|
||||
using CompiledConstraintType = models::CompiledFixedMass;
|
||||
using Dependencies = MassNormalizationDependencies;
|
||||
using Report = PreparedMassNormalizationReport;
|
||||
using JacobianInput = FixedMassJacobianInput;
|
||||
using JacobianTransposeOutput = FixedMassJacobianTransposeOutput;
|
||||
|
||||
PreparedMassNormalizationOperator(
|
||||
const fem::FEM &f,
|
||||
const mapping::DomainMapper &domainMapper,
|
||||
@@ -82,6 +104,11 @@ export namespace mean_field::operators {
|
||||
const MassNormalizationDependencies &dependencies
|
||||
);
|
||||
|
||||
PreparedMassNormalizationReport Prepare(
|
||||
const models::CompiledFixedMass &constraint,
|
||||
const MassNormalizationDependencies &dependencies
|
||||
);
|
||||
|
||||
void BuildResidual(mfem::Vector &residual) const;
|
||||
|
||||
void ApplyDensityJacobianAction(
|
||||
@@ -100,6 +127,22 @@ export namespace mean_field::operators {
|
||||
mfem::Vector &action
|
||||
) const;
|
||||
|
||||
void ApplyJacobian(
|
||||
const FixedMassJacobianInput &input,
|
||||
mfem::Vector &action
|
||||
) const;
|
||||
|
||||
void ApplyCompleteJacobianTransposeAction(
|
||||
double residualDual,
|
||||
mfem::Vector &densityDual,
|
||||
mfem::Vector &displacementDual
|
||||
) const;
|
||||
|
||||
void ApplyJacobianTranspose(
|
||||
const mfem::Vector &residualDual,
|
||||
FixedMassJacobianTransposeOutput output
|
||||
) const;
|
||||
|
||||
[[nodiscard]] bool IsPrepared() const noexcept;
|
||||
[[nodiscard]] double GetCurrentMass() const;
|
||||
[[nodiscard]] double GetTargetMass() const;
|
||||
@@ -145,6 +188,16 @@ export namespace mean_field::operators {
|
||||
|
||||
[[nodiscard]] double EvaluateDisplacementActionLocal(const mfem::Vector &displacementVariation) const;
|
||||
|
||||
void AssembleDensityTransposeAction(
|
||||
double residualDual,
|
||||
mfem::Vector &densityDual
|
||||
) const;
|
||||
|
||||
void AssembleDisplacementTransposeAction(
|
||||
double residualDual,
|
||||
mfem::Vector &displacementDual
|
||||
) const;
|
||||
|
||||
[[nodiscard]] double GlobalSum(double localValue) const;
|
||||
|
||||
const fem::FEM &m_fem;
|
||||
@@ -167,6 +220,10 @@ export namespace mean_field::operators {
|
||||
bool m_isPrepared{false};
|
||||
};
|
||||
|
||||
using PreparedFixedMass = PreparedMassNormalizationOperator;
|
||||
|
||||
static_assert(PreparedConstraint<PreparedFixedMass>);
|
||||
|
||||
using MassNormalizationLayout = utils::blocks::form_layout<utils::blocks::barotropic_equilibrium_form>;
|
||||
|
||||
class PreparedMassNormalizationJacobianOperator final : public mfem::Operator {
|
||||
@@ -181,6 +238,11 @@ export namespace mean_field::operators {
|
||||
mfem::Vector &action
|
||||
) const override;
|
||||
|
||||
void MultTranspose(
|
||||
const mfem::Vector &residualDual,
|
||||
mfem::Vector &stateDual
|
||||
) const override;
|
||||
|
||||
[[nodiscard]] const MassNormalizationLayout &GetLayout() const noexcept;
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user