runmat-analysis-fea 0.6.0

Finite element assembly/solve/post scaffolding for RunMat
Documentation
use serde::{Deserialize, Serialize};
use thiserror::Error;

#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct SolidMaterial {
    pub youngs_modulus_pa: f64,
    pub poisson_ratio: f64,
}

#[derive(Debug, Error, Clone, PartialEq)]
pub enum SolidMaterialError {
    #[error("solid material Young's modulus must be positive and finite")]
    InvalidYoungsModulus,
    #[error("solid material Poisson ratio must be finite and in (-1, 0.5)")]
    InvalidPoissonRatio,
}

impl SolidMaterial {
    pub fn validate(self) -> Result<(), SolidMaterialError> {
        if !self.youngs_modulus_pa.is_finite() || self.youngs_modulus_pa <= 0.0 {
            return Err(SolidMaterialError::InvalidYoungsModulus);
        }
        if !self.poisson_ratio.is_finite()
            || self.poisson_ratio <= -1.0
            || self.poisson_ratio >= 0.5
        {
            return Err(SolidMaterialError::InvalidPoissonRatio);
        }
        Ok(())
    }

    pub fn lame_lambda_pa(self) -> Result<f64, SolidMaterialError> {
        self.validate()?;
        Ok(self.youngs_modulus_pa * self.poisson_ratio
            / ((1.0 + self.poisson_ratio) * (1.0 - 2.0 * self.poisson_ratio)))
    }

    pub fn shear_modulus_pa(self) -> Result<f64, SolidMaterialError> {
        self.validate()?;
        Ok(self.youngs_modulus_pa / (2.0 * (1.0 + self.poisson_ratio)))
    }
}