#ifndef FESA_ANALYSIS_SOLID_FREQUENCY_STATE_H_ #define FESA_ANALYSIS_SOLID_FREQUENCY_STATE_H_ #include #include #include #include #include #include "fesa/math/matrix.h" #include "fesa/solvers/eigen/mkl_feast_eigen_solver.h" namespace fesa { /// @brief Identifies a source-ordered physical Solid eigenmode. struct SolidEigenMode { std::size_t mode_id; double eigenvalue; std::uint8_t classification; std::size_t cluster_id; std::optional frequency; }; /// @brief Stores original free K/M validation for every backend pair. struct SolidEigenpairCheck { std::size_t sorted_rank; std::size_t solver_column; double eigenvalue; double modal_mass; double rayleigh_quotient; double eta_r; double eta_norm; double eta_energy; }; /// @brief Owns a completed modal candidate, independent of response frames. /// @note Vectors are requested-mode by full source node/UX,UY,UZ order. struct SolidFrequencyState { explicit SolidFrequencyState(FeastEigenResult result) : backend{std::move(result)} {} std::size_t full_dof_count{0U}; std::size_t free_dof_count{0U}; double classification_scale{0.0}; double mass_ideal_lower_bound{0.0}; double mass_roundoff_guard{0.0}; double mass_lower_bound{0.0}; double eta_gram{0.0}; double max_eta_orth{0.0}; std::vector constraint_mask; std::vector prescribed_displacement; std::vector modes; Matrix vectors{0U, 0U}; std::vector eigenpair_checks; FeastEigenResult backend; }; } // namespace fesa #endif // FESA_ANALYSIS_SOLID_FREQUENCY_STATE_H_