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}