Files

55 lines
1.6 KiB
C++

#ifndef FESA_ANALYSIS_SOLID_FREQUENCY_STATE_H_
#define FESA_ANALYSIS_SOLID_FREQUENCY_STATE_H_
#include <cstddef>
#include <cstdint>
#include <optional>
#include <utility>
#include <vector>
#include "fesa/math/matrix.h"
#include "fesa/solvers/eigen/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<double> 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<std::uint8_t> constraint_mask;
std::vector<double> prescribed_displacement;
std::vector<SolidEigenMode> modes;
Matrix vectors{0U, 0U};
std::vector<SolidEigenpairCheck> eigenpair_checks;
FeastEigenResult backend;
};
} // namespace fesa
#endif // FESA_ANALYSIS_SOLID_FREQUENCY_STATE_H_