Skip to main content

conspire/constitutive/solid/viscoelastic/canonical/
mod.rs

1#[cfg(test)]
2mod test;
3
4use crate::{
5    constitutive::{
6        ConstitutiveError,
7        canonical::Canonical,
8        fluid::{hyperviscous::Hyperviscous, viscous::Viscous},
9        solid::{elastic::Elastic, viscoelastic::Viscoelastic},
10    },
11    math::Quantity,
12    mechanics::{
13        CauchyRateTangentStiffness, CauchyStress, DeformationGradient, DeformationGradientRate,
14        FirstPiolaKirchhoffRateTangentStiffness, FirstPiolaKirchhoffStress,
15        SecondPiolaKirchhoffRateTangentStiffness, SecondPiolaKirchhoffStress,
16    },
17    units::{Dissipation, Viscosity},
18};
19
20impl<C1, C2> Viscous for Canonical<C1, C2>
21where
22    C1: Elastic,
23    C2: Viscous,
24{
25    fn bulk_viscosity(&self) -> Quantity<Viscosity> {
26        self.1.bulk_viscosity()
27    }
28    fn shear_viscosity(&self) -> Quantity<Viscosity> {
29        self.1.shear_viscosity()
30    }
31    fn viscous_cauchy_stress(
32        &self,
33        deformation_gradient: &DeformationGradient,
34        deformation_gradient_rate: &DeformationGradientRate,
35    ) -> Result<CauchyStress, ConstitutiveError> {
36        self.1
37            .viscous_cauchy_stress(deformation_gradient, deformation_gradient_rate)
38    }
39    fn viscous_cauchy_rate_tangent_stiffness(
40        &self,
41        deformation_gradient: &DeformationGradient,
42        deformation_gradient_rate: &DeformationGradientRate,
43    ) -> Result<CauchyRateTangentStiffness, ConstitutiveError> {
44        self.1
45            .viscous_cauchy_rate_tangent_stiffness(deformation_gradient, deformation_gradient_rate)
46    }
47    fn viscous_first_piola_kirchhoff_stress(
48        &self,
49        deformation_gradient: &DeformationGradient,
50        deformation_gradient_rate: &DeformationGradientRate,
51    ) -> Result<FirstPiolaKirchhoffStress, ConstitutiveError> {
52        self.1
53            .viscous_first_piola_kirchhoff_stress(deformation_gradient, deformation_gradient_rate)
54    }
55    fn viscous_first_piola_kirchhoff_rate_tangent_stiffness(
56        &self,
57        deformation_gradient: &DeformationGradient,
58        deformation_gradient_rate: &DeformationGradientRate,
59    ) -> Result<FirstPiolaKirchhoffRateTangentStiffness, ConstitutiveError> {
60        self.1.viscous_first_piola_kirchhoff_rate_tangent_stiffness(
61            deformation_gradient,
62            deformation_gradient_rate,
63        )
64    }
65    fn viscous_second_piola_kirchhoff_stress(
66        &self,
67        deformation_gradient: &DeformationGradient,
68        deformation_gradient_rate: &DeformationGradientRate,
69    ) -> Result<SecondPiolaKirchhoffStress, ConstitutiveError> {
70        self.1
71            .viscous_second_piola_kirchhoff_stress(deformation_gradient, deformation_gradient_rate)
72    }
73    fn viscous_second_piola_kirchhoff_rate_tangent_stiffness(
74        &self,
75        deformation_gradient: &DeformationGradient,
76        deformation_gradient_rate: &DeformationGradientRate,
77    ) -> Result<SecondPiolaKirchhoffRateTangentStiffness, ConstitutiveError> {
78        self.1
79            .viscous_second_piola_kirchhoff_rate_tangent_stiffness(
80                deformation_gradient,
81                deformation_gradient_rate,
82            )
83    }
84}
85
86impl<C1, C2> Viscoelastic for Canonical<C1, C2>
87where
88    C1: Elastic,
89    C2: Viscous,
90{
91    fn cauchy_stress(
92        &self,
93        deformation_gradient: &DeformationGradient,
94        deformation_gradient_rate: &DeformationGradientRate,
95    ) -> Result<CauchyStress, ConstitutiveError> {
96        Ok(self.0.cauchy_stress(deformation_gradient)?
97            + self
98                .1
99                .viscous_cauchy_stress(deformation_gradient, deformation_gradient_rate)?)
100    }
101    fn cauchy_rate_tangent_stiffness(
102        &self,
103        deformation_gradient: &DeformationGradient,
104        deformation_gradient_rate: &DeformationGradientRate,
105    ) -> Result<CauchyRateTangentStiffness, ConstitutiveError> {
106        self.1
107            .viscous_cauchy_rate_tangent_stiffness(deformation_gradient, deformation_gradient_rate)
108    }
109}
110
111impl<C1, C2> Hyperviscous for Canonical<C1, C2>
112where
113    C1: Elastic,
114    C2: Hyperviscous,
115{
116    fn viscous_dissipation(
117        &self,
118        deformation_gradient: &DeformationGradient,
119        deformation_gradient_rate: &DeformationGradientRate,
120    ) -> Result<Quantity<Dissipation>, ConstitutiveError> {
121        self.1
122            .viscous_dissipation(deformation_gradient, deformation_gradient_rate)
123    }
124}