Skip to main content

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

1use crate::{
2    constitutive::solid::viscoelastic::Viscoelastic,
3    fem::{
4        ElementModelError, NodalCoordinates, NodalVelocities,
5        block::{
6            Block,
7            element::{FiniteElementError, solid::viscoelastic::ViscoelasticFiniteElement},
8        },
9        solid::{NodalForcesSolid, NodalStiffnessesSolid, viscoelastic::ViscoelasticElements},
10    },
11    mechanics::DeformationGradientRateList,
12};
13
14impl<C, F, const G: usize, const M: usize, const N: usize, const P: usize> Block<C, F, G, M, N, P>
15where
16    C: Viscoelastic,
17    F: ViscoelasticFiniteElement<C, G, M, N, P>,
18{
19    pub fn deformation_gradient_rates(
20        &self,
21        nodal_coordinates: &NodalCoordinates<3>,
22        nodal_velocities: &NodalVelocities<3>,
23    ) -> Vec<DeformationGradientRateList<G>> {
24        self.elements()
25            .iter()
26            .zip(self.connectivity())
27            .map(|(element, nodes)| {
28                element.deformation_gradient_rates(
29                    &Self::element_coordinates(nodal_coordinates, nodes),
30                    &Self::element_coordinates(nodal_velocities, nodes),
31                )
32            })
33            .collect()
34    }
35}
36
37impl<C, F, const G: usize, const M: usize, const N: usize, const P: usize> ViscoelasticElements<3>
38    for Block<C, F, G, M, N, P>
39where
40    C: Viscoelastic,
41    F: ViscoelasticFiniteElement<C, G, M, N, P>,
42{
43    fn nodal_forces_into(
44        &self,
45        nodal_coordinates: &NodalCoordinates<3>,
46        nodal_velocities: &NodalVelocities<3>,
47        nodal_forces: &mut NodalForcesSolid<3>,
48    ) -> Result<(), ElementModelError> {
49        match self
50            .elements()
51            .iter()
52            .zip(self.connectivity())
53            .try_for_each(|(element, nodes)| {
54                element
55                    .nodal_forces(
56                        self.constitutive_model(),
57                        &Self::element_coordinates(nodal_coordinates, nodes),
58                        &Self::element_coordinates(nodal_velocities, nodes),
59                    )?
60                    .into_iter()
61                    .zip(nodes)
62                    .for_each(|(nodal_force, &node)| nodal_forces[node] += nodal_force);
63                Ok::<(), FiniteElementError>(())
64            }) {
65            Ok(()) => Ok(()),
66            Err(error) => Err(ElementModelError::Upstream(
67                format!("{error}"),
68                format!("{self:?}"),
69            )),
70        }
71    }
72    fn nodal_stiffnesses_into(
73        &self,
74        nodal_coordinates: &NodalCoordinates<3>,
75        nodal_velocities: &NodalVelocities<3>,
76        nodal_stiffnesses: &mut NodalStiffnessesSolid<3>,
77    ) -> Result<(), ElementModelError> {
78        match self
79            .elements()
80            .iter()
81            .zip(self.connectivity())
82            .try_for_each(|(element, nodes)| {
83                element
84                    .nodal_stiffnesses(
85                        self.constitutive_model(),
86                        &Self::element_coordinates(nodal_coordinates, nodes),
87                        &Self::element_coordinates(nodal_velocities, nodes),
88                    )?
89                    .into_iter()
90                    .zip(nodes)
91                    .for_each(|(object, &node_a)| {
92                        object
93                            .into_iter()
94                            .zip(nodes)
95                            .for_each(|(nodal_stiffness, &node_b)| {
96                                nodal_stiffnesses[node_a][node_b] += nodal_stiffness
97                            })
98                    });
99                Ok::<(), FiniteElementError>(())
100            }) {
101            Ok(()) => Ok(()),
102            Err(error) => Err(ElementModelError::Upstream(
103                format!("{error}"),
104                format!("{self:?}"),
105            )),
106        }
107    }
108}