conspire/domain/vem/block/solid/hyperviscoelastic/
mod.rs1use crate::{
2 constitutive::solid::hyperviscoelastic::Hyperviscoelastic,
3 domain::{
4 ElementModelError,
5 solid::{
6 elastic_hyperviscous::ElasticHyperviscousElements,
7 hyperviscoelastic::HyperviscoelasticElements,
8 },
9 },
10 math::Quantity,
11 units::Energy,
12 vem::{
13 NodalCoordinates,
14 block::{
15 Block,
16 element::{
17 VirtualElementError, solid::hyperviscoelastic::HyperviscoelasticVirtualElement,
18 },
19 },
20 },
21};
22
23impl<C, F> HyperviscoelasticElements<3> for Block<C, F>
24where
25 C: Hyperviscoelastic,
26 F: HyperviscoelasticVirtualElement<C>,
27 Self: ElasticHyperviscousElements<3>,
28{
29 fn helmholtz_free_energy(
30 &self,
31 nodal_coordinates: &NodalCoordinates,
32 ) -> Result<Quantity<Energy>, ElementModelError> {
33 self.elements()
34 .iter()
35 .zip(self.elements_nodes())
36 .map(|(element, nodes)| {
37 element.helmholtz_free_energy(
38 self.constitutive_model(),
39 &Self::element_coordinates(nodal_coordinates, nodes),
40 )
41 })
42 .sum::<Result<_, VirtualElementError>>()
43 .map_err(|error| ElementModelError::upstream(error, self))
44 }
45}