Skip to main content

conspire/domain/cbm/block/solid/elastic/
mod.rs

1use super::super::{Block, node::solid::elastic::ElasticElement};
2use crate::{
3    constitutive::{ConstitutiveError, solid::elastic::Elastic},
4    domain::{
5        ElementModelError, NodalCoordinates,
6        solid::{NodalForcesSolid, NodalStiffnessesSolid},
7    },
8};
9
10pub use crate::domain::solid::elastic::ElasticElements;
11
12impl<C> ElasticElements<3> for Block<C>
13where
14    C: Elastic,
15{
16    fn nodal_forces_into(
17        &self,
18        nodal_coordinates: &NodalCoordinates<3>,
19        nodal_forces: &mut NodalForcesSolid<3>,
20    ) -> Result<(), ElementModelError> {
21        self.nodes
22            .iter()
23            .try_for_each(|node| {
24                node.nodal_forces(&self.constitutive_model, nodal_coordinates)?
25                    .into_iter()
26                    .zip(node.neighbors())
27                    .for_each(|(force, &neighbor)| nodal_forces[neighbor] += force);
28                Ok::<(), ConstitutiveError>(())
29            })
30            .map_err(|error| ElementModelError::upstream(error, self))
31    }
32    fn nodal_stiffnesses_into(
33        &self,
34        nodal_coordinates: &NodalCoordinates<3>,
35        nodal_stiffnesses: &mut NodalStiffnessesSolid<3>,
36    ) -> Result<(), ElementModelError> {
37        self.nodes
38            .iter()
39            .try_for_each(|node| {
40                node.nodal_stiffnesses(&self.constitutive_model, nodal_coordinates)?
41                    .into_iter()
42                    .zip(node.neighbors())
43                    .for_each(|(row, &neighbor_a)| {
44                        row.into_iter()
45                            .zip(node.neighbors())
46                            .for_each(|(block, &neighbor_b)| {
47                                nodal_stiffnesses[neighbor_a][neighbor_b] += block
48                            })
49                    });
50                Ok::<(), ConstitutiveError>(())
51            })
52            .map_err(|error| ElementModelError::upstream(error, self))
53    }
54}