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