#[cfg(fem)]
mod fem;
use std::ops::Deref;
#[cfg(fem)]
pub use fem::*;
#[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)]
pub struct SegmentSingularModes {
mode_nodes: Vec<Vec<f64>>,
actuator_nodes: Vec<Vec<f64>>,
raw_modes: Vec<f64>,
modes: Vec<f64>,
mode_2_force: Vec<f64>,
shape: (usize, usize),
}
impl SegmentSingularModes {
pub fn new(
mode_nodes: Vec<Vec<f64>>,
actuator_nodes: Vec<Vec<f64>>,
raw_modes: Vec<f64>,
modes: Vec<f64>,
mode_2_force: Vec<f64>,
shape: (usize, usize),
) -> Self {
Self {
mode_nodes,
actuator_nodes,
raw_modes,
modes,
mode_2_force,
shape,
}
}
#[cfg(feature = "faer")]
pub fn mat_ref(&self) -> faer::mat::MatRef<f64> {
let (ns, na) = self.shape;
faer::mat::MatRef::from_column_major_slice(&self.raw_modes, ns, na)
}
#[cfg(feature = "faer")]
pub fn mode2force_mat_ref(&self) -> faer::mat::MatRef<f64> {
let (_, na) = self.shape;
let ns = self.mode_2_force.len() / na;
faer::mat::MatRef::from_column_major_slice(&self.mode_2_force, na, ns)
}
pub fn mode2force(&self) -> nalgebra::DMatrix<f64> {
let (_, na) = self.shape;
let ns = self.mode_2_force.len() / na;
nalgebra::DMatrix::from_column_slice(na, ns, &self.mode_2_force)
}
pub fn raw_modes_into_mat(&self) -> nalgebra::DMatrix<f64> {
let (ns, na) = self.shape;
nalgebra::DMatrix::from_column_slice(ns, na, &self.raw_modes)
}
pub fn modes_into_mat(&self) -> nalgebra::DMatrix<f64> {
let (ns, ..) = self.shape;
nalgebra::DMatrix::from_column_slice(ns, self.modes.len() / ns, &self.modes)
}
pub fn shape(&self) -> (usize, usize) {
self.shape
}
pub fn raw_modes_iter(&self) -> impl Iterator<Item = &f64> {
self.raw_modes.iter()
}
}
#[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)]
pub struct SingularModes(Vec<SegmentSingularModes>);
impl Deref for SingularModes {
type Target = [SegmentSingularModes];
fn deref(&self) -> &Self::Target {
self.0.as_slice()
}
}
impl SingularModes {
pub fn push(&mut self, segment: SegmentSingularModes) {
self.0.push(segment);
}
pub fn modes_into_mat(&self) -> Vec<nalgebra::DMatrix<f64>> {
self.iter()
.map(|segment| segment.modes_into_mat())
.collect()
}
pub fn raw_modes_into_mat(&self) -> Vec<nalgebra::DMatrix<f64>> {
self.iter()
.map(|segment| segment.raw_modes_into_mat())
.collect()
}
pub fn mode2force(&self) -> Vec<nalgebra::DMatrix<f64>> {
self.iter().map(|segment| segment.mode2force()).collect()
}
}