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    fem::{
11        NodalCoordinates,
12        block::{Block, element::solid::SolidFiniteElement},
13    },
14    mechanics::DeformationGradientList,
15};
16
17pub trait SolidElements<C, F, const G: usize, const M: usize, const N: usize, const P: usize>
18where
19    F: SolidFiniteElement<G, M, N, P>,
20{
21    fn deformation_gradients(
22        &self,
23        nodal_coordinates: &NodalCoordinates<3>,
24    ) -> Vec<DeformationGradientList<G>>;
25}
26
27impl<C, F, const G: usize, const M: usize, const N: usize, const P: usize>
28    SolidElements<C, F, G, M, N, P> for Block<C, F, G, M, N, P>
29where
30    F: SolidFiniteElement<G, M, N, P>,
31{
32    fn deformation_gradients(
33        &self,
34        nodal_coordinates: &NodalCoordinates<3>,
35    ) -> Vec<DeformationGradientList<G>> {
36        self.elements()
37            .iter()
38            .zip(self.connectivity())
39            .map(|(element, nodes)| {
40                element.deformation_gradients(&Self::element_coordinates(nodal_coordinates, nodes))
41            })
42            .collect()
43    }
44}