Snapshot optimized solver and audit diagnostics before numerical experiments
This commit is contained in:
@@ -66,6 +66,9 @@ export namespace mean_field::operators {
|
||||
kernels::GravityDisplacementForceRejection>
|
||||
TryPrepare();
|
||||
|
||||
// Retained two-pass preparation for isolation benchmarks and validation.
|
||||
PreparedGravityDisplacementForceReport PrepareReference();
|
||||
|
||||
void BuildResidual(mfem::Vector &residual) const;
|
||||
|
||||
void ApplyDensityJacobianAction(
|
||||
@@ -90,6 +93,31 @@ export namespace mean_field::operators {
|
||||
mfem::Vector &action
|
||||
) const;
|
||||
|
||||
void ApplyCompleteJacobianActionReference(
|
||||
const mfem::Vector &densityVariation,
|
||||
const mfem::Vector &displacementVariation,
|
||||
const mfem::Vector &gravityGradientVariation,
|
||||
mfem::Vector &action
|
||||
) const;
|
||||
|
||||
void ApplyCompleteJacobianActionCachedReference(
|
||||
const mfem::Vector &densityVariation, const mfem::Vector &displacementVariation,
|
||||
const mfem::Vector &gravityGradientVariation, mfem::Vector &action
|
||||
) const;
|
||||
[[nodiscard]] int GetTensorElementCount() const noexcept {
|
||||
int count = 0;
|
||||
for (const auto &data : m_elements)
|
||||
if (data.fastApplication && data.displacementReferenceTable->HasTensorEvaluation3D() &&
|
||||
data.gravityReferenceTable && data.gravityReferenceTable->HasTensorEvaluation3D()) ++count;
|
||||
return count;
|
||||
}
|
||||
|
||||
[[nodiscard]] int GetFastElementCount() const noexcept {
|
||||
int count = 0;
|
||||
for (const auto &data : m_elements) count += data.fastApplication;
|
||||
return count;
|
||||
}
|
||||
|
||||
[[nodiscard]] bool IsPrepared() const noexcept;
|
||||
|
||||
[[nodiscard]] std::uint64_t GetResidualPreparationCount() const noexcept;
|
||||
@@ -124,16 +152,20 @@ export namespace mean_field::operators {
|
||||
[[nodiscard]] std::expected<
|
||||
void,
|
||||
kernels::GravityDisplacementForceRejection>
|
||||
TryPrepareElementData();
|
||||
TryPrepareElementData(bool assembleResidual);
|
||||
[[nodiscard]] std::expected<PreparedGravityDisplacementForceReport, kernels::GravityDisplacementForceRejection>
|
||||
TryPrepareImpl(bool useFastPreparation);
|
||||
void ApplyPreparedCompleteJacobianActionTrue(
|
||||
const mfem::Vector &densityVariationTrue,
|
||||
const mfem::Vector &displacementVariationTrue,
|
||||
const mfem::Vector &gravityGradientVariationTrue,
|
||||
mfem::Vector &actionTrue
|
||||
mfem::Vector &actionTrue,
|
||||
bool useFastPath = true, bool useTensorPath = true
|
||||
) const;
|
||||
|
||||
struct ElementPAData {
|
||||
int elementId{-1};
|
||||
bool fastApplication{false};
|
||||
mfem::Array<int> densityDofs;
|
||||
mfem::Array<int> gravityGradientDofs;
|
||||
mfem::Array<int> displacementDofs;
|
||||
@@ -168,6 +200,8 @@ export namespace mean_field::operators {
|
||||
mutable mfem::Vector m_gravityGradientVariationLocal;
|
||||
mutable mfem::Vector m_displacementVariationLocal;
|
||||
mutable mfem::Vector m_localAction;
|
||||
mutable mfem::Vector m_quadratureDensityVariation;
|
||||
mutable mfem::DenseMatrix m_quadratureForce;
|
||||
mutable mfem::Vector m_elementDensityVariation;
|
||||
mutable mfem::Vector m_elementGravityGradientVariation;
|
||||
mutable mfem::Vector m_elementDisplacementVariation;
|
||||
@@ -199,6 +233,9 @@ export namespace mean_field::operators {
|
||||
|
||||
mutable PreparedGravityDisplacementForceCompleteStatistics m_completeJacobianStatistics;
|
||||
|
||||
mutable mfem::DenseMatrix m_tensorDisplacement, m_tensorGravity, m_tensorElementDual;
|
||||
mutable mfem::Vector m_tensorWorkspace;
|
||||
bool m_preparedWithFastResidual{true};
|
||||
bool m_isPrepared{false};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user