feat(analysis): execute solid generalized frequency pencil
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
#ifndef FESA_ANALYSIS_SOLID_FREQUENCY_PROCEDURE_H_
|
||||
#define FESA_ANALYSIS_SOLID_FREQUENCY_PROCEDURE_H_
|
||||
|
||||
#include "fesa/analysis/solid_frequency_state.h"
|
||||
|
||||
namespace fesa {
|
||||
class Domain;
|
||||
/// @brief Executes unloaded reference-state C3D8 generalized frequency
|
||||
/// analysis.
|
||||
class SolidFrequencyProcedureExecutor final {
|
||||
public:
|
||||
/// @brief Returns lowest requested modes after validating every returned
|
||||
/// pair.
|
||||
/// @note Domain is immutable and must remain alive during execution.
|
||||
Result<SolidFrequencyState> Execute(const Domain& domain) const;
|
||||
};
|
||||
} // namespace fesa
|
||||
#endif // FESA_ANALYSIS_SOLID_FREQUENCY_PROCEDURE_H_
|
||||
@@ -0,0 +1,54 @@
|
||||
#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/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<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_
|
||||
Reference in New Issue
Block a user