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