Skip to main content

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

1use crate::{
2    constitutive::solid::hyperviscoelastic::Hyperviscoelastic,
3    fem::{
4        ElementModelError, NodalCoordinates,
5        block::{
6            Block, element::FiniteElementError,
7            element::solid::hyperviscoelastic::HyperviscoelasticFiniteElement,
8        },
9        solid::{
10            elastic_hyperviscous::ElasticHyperviscousElements,
11            hyperviscoelastic::HyperviscoelasticElements,
12        },
13    },
14    math::Quantity,
15    units::Energy,
16};
17
18impl<C, F, const G: usize, const M: usize, const N: usize, const P: usize>
19    HyperviscoelasticElements<3> for Block<C, F, G, M, N, P>
20where
21    C: Hyperviscoelastic,
22    F: HyperviscoelasticFiniteElement<C, G, M, N, P>,
23    Self: ElasticHyperviscousElements<3>,
24{
25    fn helmholtz_free_energy(
26        &self,
27        nodal_coordinates: &NodalCoordinates<3>,
28    ) -> Result<Quantity<Energy>, ElementModelError> {
29        self.elements()
30            .iter()
31            .zip(self.connectivity())
32            .map(|(element, nodes)| {
33                element.helmholtz_free_energy(
34                    self.constitutive_model(),
35                    &Self::element_coordinates(nodal_coordinates, nodes),
36                )
37            })
38            .sum::<Result<_, FiniteElementError>>()
39            .map_err(|error| ElementModelError::upstream(error, self))
40    }
41}