conspire/domain/fem/block/solid/elastic_hyperviscous/
mod.rs1use 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}