conspire/domain/cbm/block/solid/hyperelastic_viscoplastic/
mod.rs1use super::super::{
2 Block, node::solid::hyperelastic_viscoplastic::HyperelasticViscoplasticElement,
3};
4use crate::{
5 constitutive::{ConstitutiveError, solid::hyperelastic_viscoplastic::HyperelasticViscoplastic},
6 domain::{
7 ElementModelError, NodalCoordinates, block::solid::viscoplastic::ViscoplasticStateVariables,
8 },
9 math::{Differentiable, Quantity, Tensor},
10 units::Energy,
11};
12
13pub use crate::domain::solid::hyperelastic_viscoplastic::HyperelasticViscoplasticElements;
14
15impl<C, Y> HyperelasticViscoplasticElements<ViscoplasticStateVariables<1, Y>, 3> for Block<C>
16where
17 C: HyperelasticViscoplastic<Y>,
18 Y: Differentiable + Tensor,
19{
20 fn helmholtz_free_energy(
21 &self,
22 nodal_coordinates: &NodalCoordinates<3>,
23 state_variables: &ViscoplasticStateVariables<1, Y>,
24 ) -> Result<Quantity<Energy>, ElementModelError> {
25 self.nodes
26 .iter()
27 .zip(state_variables)
28 .map(|(node, state_variables_node)| {
29 node.helmholtz_free_energy(
30 &self.constitutive_model,
31 nodal_coordinates,
32 state_variables_node,
33 )
34 })
35 .sum::<Result<_, ConstitutiveError>>()
36 .map_err(|error| ElementModelError::upstream(error, self))
37 }
38}