Skip to main content

conspire/domain/vem/block/solid/hyperviscoelastic/
mod.rs

1use 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}