Skip to main content

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

1use super::super::{Block, node::solid::elastic_hyperviscous::ElasticHyperviscousElement};
2use crate::{
3    constitutive::{ConstitutiveError, solid::elastic_hyperviscous::ElasticHyperviscous},
4    domain::{ElementModelError, NodalCoordinates, NodalVelocities},
5    math::Quantity,
6    units::Power,
7};
8
9pub use crate::domain::solid::elastic_hyperviscous::ElasticHyperviscousElements;
10
11impl<C> ElasticHyperviscousElements<3> for Block<C>
12where
13    C: ElasticHyperviscous,
14{
15    fn viscous_dissipation(
16        &self,
17        nodal_coordinates: &NodalCoordinates<3>,
18        nodal_velocities: &NodalVelocities<3>,
19    ) -> Result<Quantity<Power>, ElementModelError> {
20        self.nodes
21            .iter()
22            .map(|node| {
23                node.viscous_dissipation(
24                    &self.constitutive_model,
25                    nodal_coordinates,
26                    nodal_velocities,
27                )
28            })
29            .sum::<Result<_, ConstitutiveError>>()
30            .map_err(|error| ElementModelError::upstream(error, self))
31    }
32    fn dissipation_potential(
33        &self,
34        nodal_coordinates: &NodalCoordinates<3>,
35        nodal_velocities: &NodalVelocities<3>,
36    ) -> Result<Quantity<Power>, ElementModelError> {
37        self.nodes
38            .iter()
39            .map(|node| {
40                node.dissipation_potential(
41                    &self.constitutive_model,
42                    nodal_coordinates,
43                    nodal_velocities,
44                )
45            })
46            .sum::<Result<_, ConstitutiveError>>()
47            .map_err(|error| ElementModelError::upstream(error, self))
48    }
49}