Skip to main content

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

1use crate::{
2    constitutive::solid::elastic::Elastic,
3    domain::{ElementModelError, solid::elastic::ElasticElements},
4    vem::{
5        NodalCoordinates,
6        block::{
7            Block,
8            element::{VirtualElementError, solid::elastic::ElasticVirtualElement},
9            solid::{NodalForcesSolid, NodalStiffnessesSolid},
10        },
11    },
12};
13
14impl<C, F> ElasticElements<3> for Block<C, F>
15where
16    C: Elastic,
17    F: ElasticVirtualElement<C>,
18{
19    fn nodal_forces_into(
20        &self,
21        nodal_coordinates: &NodalCoordinates,
22        nodal_forces: &mut NodalForcesSolid,
23    ) -> Result<(), ElementModelError> {
24        self.elements()
25            .iter()
26            .zip(self.elements_nodes())
27            .try_for_each(|(element, nodes)| {
28                element
29                    .nodal_forces(
30                        self.constitutive_model(),
31                        &Self::element_coordinates(nodal_coordinates, nodes),
32                    )?
33                    .into_iter()
34                    .zip(nodes)
35                    .for_each(|(nodal_force, &node)| nodal_forces[node] += nodal_force);
36                Ok::<(), VirtualElementError>(())
37            })
38            .map_err(|error| ElementModelError::upstream(error, self))
39    }
40    fn nodal_stiffnesses_into(
41        &self,
42        nodal_coordinates: &NodalCoordinates,
43        nodal_stiffnesses: &mut NodalStiffnessesSolid,
44    ) -> Result<(), ElementModelError> {
45        self.elements()
46            .iter()
47            .zip(self.elements_nodes())
48            .try_for_each(|(element, nodes)| {
49                element
50                    .nodal_stiffnesses(
51                        self.constitutive_model(),
52                        &Self::element_coordinates(nodal_coordinates, nodes),
53                    )?
54                    .into_iter()
55                    .zip(nodes)
56                    .for_each(|(object, &node_a)| {
57                        object
58                            .into_iter()
59                            .zip(nodes)
60                            .for_each(|(nodal_stiffness, &node_b)| {
61                                nodal_stiffnesses[node_a][node_b] += nodal_stiffness
62                            })
63                    });
64                Ok::<(), VirtualElementError>(())
65            })
66            .map_err(|error| ElementModelError::upstream(error, self))
67    }
68}