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