Skip to main content

conspire/domain/cbm/block/solid/hyperelastic_viscoplastic/
mod.rs

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