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::{Block, element::solid::elastic_hyperviscous::ElasticHyperviscousFiniteElement},
6        solid::{
7            elastic_hyperviscous::ElasticHyperviscousElements, viscoelastic::ViscoelasticElements,
8        },
9    },
10    math::Scalar,
11};
12
13impl<C, F, const G: usize, const M: usize, const N: usize, const P: usize>
14    ElasticHyperviscousElements<3> for Block<C, F, G, M, N, P>
15where
16    C: ElasticHyperviscous,
17    F: ElasticHyperviscousFiniteElement<C, G, M, N, P>,
18    Self: ViscoelasticElements<3>,
19{
20    fn viscous_dissipation(
21        &self,
22        nodal_coordinates: &NodalCoordinates<3>,
23        nodal_velocities: &NodalVelocities<3>,
24    ) -> Result<Scalar, ElementModelError> {
25        match self
26            .elements()
27            .iter()
28            .zip(self.connectivity())
29            .map(|(element, nodes)| {
30                element.viscous_dissipation(
31                    self.constitutive_model(),
32                    &Self::element_coordinates(nodal_coordinates, nodes),
33                    &Self::element_coordinates(nodal_velocities, nodes),
34                )
35            })
36            .sum()
37        {
38            Ok(viscous_dissipation) => Ok(viscous_dissipation),
39            Err(error) => Err(ElementModelError::Upstream(
40                format!("{error}"),
41                format!("{self:?}"),
42            )),
43        }
44    }
45    fn dissipation_potential(
46        &self,
47        nodal_coordinates: &NodalCoordinates<3>,
48        nodal_velocities: &NodalVelocities<3>,
49    ) -> Result<Scalar, ElementModelError> {
50        match self
51            .elements()
52            .iter()
53            .zip(self.connectivity())
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()
62        {
63            Ok(dissipation_potential) => Ok(dissipation_potential),
64            Err(error) => Err(ElementModelError::Upstream(
65                format!("{error}"),
66                format!("{self:?}"),
67            )),
68        }
69    }
70}