Skip to main content

conspire/domain/fem/block/solid/
mod.rs

1pub mod elastic;
2pub mod elastic_hyperviscous;
3pub mod elastic_viscoplastic;
4pub mod hyperelastic;
5pub mod hyperelastic_viscoplastic;
6pub mod hyperviscoelastic;
7pub mod viscoelastic;
8
9use crate::{
10    constitutive::solid::Solid,
11    fem::{
12        NodalCoordinates, NodalVelocities,
13        block::{Block, element::solid::SolidFiniteElement},
14    },
15    mechanics::{DeformationGradientList, DeformationGradientRateList},
16};
17
18pub use crate::domain::solid::SolidElements;
19
20impl<C, F, const G: usize, const M: usize, const N: usize, const P: usize> SolidElements
21    for Block<C, F, G, M, N, P>
22where
23    C: Solid,
24    F: SolidFiniteElement<G, M, N, P>,
25{
26    type DeformationGradients = DeformationGradientList<G>;
27    type DeformationGradientRates = DeformationGradientRateList<G>;
28    fn deformation_gradients(
29        &self,
30        nodal_coordinates: &NodalCoordinates<3>,
31    ) -> Vec<Self::DeformationGradients> {
32        self.elements()
33            .iter()
34            .zip(self.connectivity())
35            .map(|(element, nodes)| {
36                element.deformation_gradients(&Self::element_coordinates(nodal_coordinates, nodes))
37            })
38            .collect()
39    }
40    fn deformation_gradient_rates(
41        &self,
42        nodal_coordinates: &NodalCoordinates<3>,
43        nodal_velocities: &NodalVelocities<3>,
44    ) -> Vec<Self::DeformationGradientRates> {
45        self.elements()
46            .iter()
47            .zip(self.connectivity())
48            .map(|(element, nodes)| {
49                element.deformation_gradient_rates(
50                    &Self::element_coordinates(nodal_coordinates, nodes),
51                    &Self::element_coordinates(nodal_velocities, nodes),
52                )
53            })
54            .collect()
55    }
56}