55 lines
1.6 KiB
C++
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_
|