Skip to main content

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

1use 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}