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