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

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