conspire/constitutive/solid/elastic/almansi_hamel/
mod.rs1#[cfg(test)]
2mod test;
3
4use super::*;
5
6#[doc = include_str!("model.md")]
7#[derive(Debug)]
8pub struct AlmansiHamel<P> {
9 parameters: P,
10}
11
12impl<P> Constitutive<P> for AlmansiHamel<P>
13where
14 P: Parameters,
15{
16 fn new(parameters: P) -> Self {
17 Self { parameters }
18 }
19}
20
21impl<P> Solid for AlmansiHamel<P>
22where
23 P: Parameters,
24{
25 fn bulk_modulus(&self) -> &Scalar {
26 self.parameters.get(0)
27 }
28 fn shear_modulus(&self) -> &Scalar {
29 self.parameters.get(1)
30 }
31}
32
33impl<P> Elastic for AlmansiHamel<P>
34where
35 P: Parameters,
36{
37 #[doc = include_str!("cauchy_stress.md")]
38 fn cauchy_stress(
39 &self,
40 deformation_gradient: &DeformationGradient,
41 ) -> Result<CauchyStress, ConstitutiveError> {
42 let jacobian = self.jacobian(deformation_gradient)?;
43 let inverse_deformation_gradient = deformation_gradient.inverse();
44 let strain = (IDENTITY
45 - inverse_deformation_gradient.transpose() * &inverse_deformation_gradient)
46 * 0.5;
47 let (deviatoric_strain, strain_trace) = strain.deviatoric_and_trace();
48 Ok(deviatoric_strain * (2.0 * self.shear_modulus() / jacobian)
49 + IDENTITY * (self.bulk_modulus() * strain_trace / jacobian))
50 }
51 #[doc = include_str!("cauchy_tangent_stiffness.md")]
52 fn cauchy_tangent_stiffness(
53 &self,
54 deformation_gradient: &DeformationGradient,
55 ) -> Result<CauchyTangentStiffness, ConstitutiveError> {
56 let jacobian = self.jacobian(deformation_gradient)?;
57 let inverse_transpose_deformation_gradient = deformation_gradient.inverse_transpose();
58 let inverse_left_cauchy_green_deformation = &inverse_transpose_deformation_gradient
59 * inverse_transpose_deformation_gradient.transpose();
60 let strain = (IDENTITY - &inverse_left_cauchy_green_deformation) * 0.5;
61 let (deviatoric_strain, strain_trace) = strain.deviatoric_and_trace();
62 Ok((CauchyTangentStiffness::dyad_il_jk(
63 &inverse_transpose_deformation_gradient,
64 &inverse_left_cauchy_green_deformation,
65 ) + CauchyTangentStiffness::dyad_ik_jl(
66 &inverse_left_cauchy_green_deformation,
67 &inverse_transpose_deformation_gradient,
68 )) * (self.shear_modulus() / jacobian)
69 + CauchyTangentStiffness::dyad_ij_kl(
70 &IDENTITY,
71 &(inverse_left_cauchy_green_deformation
72 * &inverse_transpose_deformation_gradient
73 * ((self.bulk_modulus() - self.shear_modulus() * TWO_THIRDS) / jacobian)),
74 )
75 - CauchyTangentStiffness::dyad_ij_kl(
76 &(deviatoric_strain * (2.0 * self.shear_modulus() / jacobian)
77 + IDENTITY * (self.bulk_modulus() * strain_trace / jacobian)),
78 &inverse_transpose_deformation_gradient,
79 ))
80 }
81}