Skip to main content

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

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