runmat_analysis_fea/assembly/elements/solid/
material.rs1use 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}