Skip to main content

runmat_analysis_fea/assembly/elements/solid/
material.rs

1use serde::{Deserialize, Serialize};
2use thiserror::Error;
3
4#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
5pub struct SolidMaterial {
6    pub youngs_modulus_pa: f64,
7    pub poisson_ratio: f64,
8}
9
10#[derive(Debug, Error, Clone, PartialEq)]
11pub enum SolidMaterialError {
12    #[error("solid material Young's modulus must be positive and finite")]
13    InvalidYoungsModulus,
14    #[error("solid material Poisson ratio must be finite and in (-1, 0.5)")]
15    InvalidPoissonRatio,
16}
17
18impl SolidMaterial {
19    pub fn validate(self) -> Result<(), SolidMaterialError> {
20        if !self.youngs_modulus_pa.is_finite() || self.youngs_modulus_pa <= 0.0 {
21            return Err(SolidMaterialError::InvalidYoungsModulus);
22        }
23        if !self.poisson_ratio.is_finite()
24            || self.poisson_ratio <= -1.0
25            || self.poisson_ratio >= 0.5
26        {
27            return Err(SolidMaterialError::InvalidPoissonRatio);
28        }
29        Ok(())
30    }
31
32    pub fn lame_lambda_pa(self) -> Result<f64, SolidMaterialError> {
33        self.validate()?;
34        Ok(self.youngs_modulus_pa * self.poisson_ratio
35            / ((1.0 + self.poisson_ratio) * (1.0 - 2.0 * self.poisson_ratio)))
36    }
37
38    pub fn shear_modulus_pa(self) -> Result<f64, SolidMaterialError> {
39        self.validate()?;
40        Ok(self.youngs_modulus_pa / (2.0 * (1.0 + self.poisson_ratio)))
41    }
42}