conspire/constitutive/hybrid/
mod.rs

1//! Hybrid constitutive models.
2
3mod elastic;
4mod hyperelastic;
5
6use crate::{constitutive::ConstitutiveError, mechanics::DeformationGradient};
7
8/// Required methods for hybrid constitutive models.
9pub trait Hybrid<C1, C2> {
10    /// Constructs and returns a new hybrid constitutive model.
11    fn construct(constitutive_model_1: C1, constitutive_model_2: C2) -> Self;
12    /// Returns a reference to the first constitutive model.
13    fn constitutive_model_1(&self) -> &C1;
14    /// Returns a reference to the second constitutive model.
15    fn constitutive_model_2(&self) -> &C2;
16}
17
18/// A hybrid constitutive model based on the additive decomposition.
19#[derive(Debug)]
20pub struct Additive<C1, C2> {
21    constitutive_model_1: C1,
22    constitutive_model_2: C2,
23}
24
25/// A hybrid constitutive model based on the multiplicative decomposition.
26#[derive(Debug)]
27pub struct Multiplicative<C1, C2> {
28    constitutive_model_1: C1,
29    constitutive_model_2: C2,
30}
31
32/// Required methods for hybrid constitutive models based on the multiplicative decomposition.
33pub trait MultiplicativeTrait {
34    fn deformation_gradients(
35        &self,
36        deformation_gradient: &DeformationGradient,
37    ) -> Result<(DeformationGradient, DeformationGradient), ConstitutiveError>;
38}
39
40impl<C1, C2> Hybrid<C1, C2> for Additive<C1, C2> {
41    fn construct(constitutive_model_1: C1, constitutive_model_2: C2) -> Self {
42        Self {
43            constitutive_model_1,
44            constitutive_model_2,
45        }
46    }
47    fn constitutive_model_1(&self) -> &C1 {
48        &self.constitutive_model_1
49    }
50    fn constitutive_model_2(&self) -> &C2 {
51        &self.constitutive_model_2
52    }
53}
54
55impl<C1, C2> Hybrid<C1, C2> for Multiplicative<C1, C2> {
56    fn construct(constitutive_model_1: C1, constitutive_model_2: C2) -> Self {
57        Self {
58            constitutive_model_1,
59            constitutive_model_2,
60        }
61    }
62    fn constitutive_model_1(&self) -> &C1 {
63        &self.constitutive_model_1
64    }
65    fn constitutive_model_2(&self) -> &C2 {
66        &self.constitutive_model_2
67    }
68}