conspire/domain/vem/block/solid/elastic/
mod.rs1use 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}