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