Skip to main content

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

1use crate::{
2    constitutive::solid::elastic_hyperviscous::ElasticHyperviscous,
3    domain::{
4        ElementModelError,
5        solid::{
6            elastic_hyperviscous::ElasticHyperviscousElements, viscoelastic::ViscoelasticElements,
7        },
8    },
9    math::Quantity,
10    units::Power,
11    vem::{
12        NodalCoordinates, NodalVelocities,
13        block::{
14            Block,
15            element::{
16                VirtualElementError, solid::elastic_hyperviscous::ElasticHyperviscousVirtualElement,
17            },
18        },
19    },
20};
21
22impl<C, F> ElasticHyperviscousElements<3> for Block<C, F>
23where
24    C: ElasticHyperviscous,
25    F: ElasticHyperviscousVirtualElement<C>,
26    Self: ViscoelasticElements<3>,
27{
28    fn viscous_dissipation(
29        &self,
30        nodal_coordinates: &NodalCoordinates,
31        nodal_velocities: &NodalVelocities,
32    ) -> Result<Quantity<Power>, ElementModelError> {
33        self.elements()
34            .iter()
35            .zip(self.elements_nodes())
36            .map(|(element, nodes)| {
37                element.viscous_dissipation(
38                    self.constitutive_model(),
39                    &Self::element_coordinates(nodal_coordinates, nodes),
40                    &Self::element_coordinates(nodal_velocities, nodes),
41                )
42            })
43            .sum::<Result<_, VirtualElementError>>()
44            .map_err(|error| ElementModelError::upstream(error, self))
45    }
46    fn dissipation_potential(
47        &self,
48        nodal_coordinates: &NodalCoordinates,
49        nodal_velocities: &NodalVelocities,
50    ) -> Result<Quantity<Power>, ElementModelError> {
51        self.elements()
52            .iter()
53            .zip(self.elements_nodes())
54            .map(|(element, nodes)| {
55                element.dissipation_potential(
56                    self.constitutive_model(),
57                    &Self::element_coordinates(nodal_coordinates, nodes),
58                    &Self::element_coordinates(nodal_velocities, nodes),
59                )
60            })
61            .sum::<Result<_, VirtualElementError>>()
62            .map_err(|error| ElementModelError::upstream(error, self))
63    }
64}