#ifndef FESA_RESULTS_GLOBAL_EQUILIBRIUM_RECOVERY_H_ #define FESA_RESULTS_GLOBAL_EQUILIBRIUM_RECOVERY_H_ #include "fesa/core/status.h" #include "fesa/fem/dof_manager.h" #include "fesa/math/sparse_matrix.h" #include "fesa/math/vector.h" #include "fesa/model/domain.h" #include "results/recovery_candidate.h" namespace fesa::results_internal { /// @brief Owns full residual, reaction evidence, and free equilibrium scale. struct GlobalEquilibriumResult { Vector internal_force; Vector residual; Vector reaction; double normalized_free_residual{0.0}; }; /// @brief Computes K*d-F, full reaction evidence, and free residual metric. /// @return The complete global residual candidate or a structured failure. Result GlobalEquilibriumRecovery( const Domain& domain, const DofManager& dofs, const SparseMatrix& full_stiffness, const Vector& full_displacement, const Vector& full_external_force); /// @brief Adds shell global force and moment equilibrium evidence. /// @note Moments are taken about the fixed global origin. Status RecoverShellGlobalEvidence(const Domain& domain, const DofManager& dofs, const Vector& external_force, const GlobalEquilibriumResult& global, RecoveryCandidate& candidate); } // namespace fesa::results_internal #endif // FESA_RESULTS_GLOBAL_EQUILIBRIUM_RECOVERY_H_