conspire/constitutive/hybrid/
mod.rs1mod elastic;
4mod hyperelastic;
5
6use crate::{constitutive::ConstitutiveError, mechanics::DeformationGradient};
7
8pub trait Hybrid<C1, C2> {
10    fn construct(constitutive_model_1: C1, constitutive_model_2: C2) -> Self;
12    fn constitutive_model_1(&self) -> &C1;
14    fn constitutive_model_2(&self) -> &C2;
16}
17
18#[derive(Debug)]
20pub struct Additive<C1, C2> {
21    constitutive_model_1: C1,
22    constitutive_model_2: C2,
23}
24
25#[derive(Debug)]
27pub struct Multiplicative<C1, C2> {
28    constitutive_model_1: C1,
29    constitutive_model_2: C2,
30}
31
32pub 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}