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