use super::SaintVenantKirchhoff;
crate::constitutive::solid::hyperelastic_viscoplastic::test::test_model!(SaintVenantKirchhoff);
#[test]
fn root_biaxial() -> Result<(), crate::math::assert::AssertionError> {
use crate::units::Time;
use crate::{
constitutive::solid::elastic_viscoplastic::{AppliedLoad, FirstOrderRoot},
math::{
Quantity, Vector, assert::Assert, integrate::DormandPrince, optimize::NewtonRaphson,
},
};
let model = SaintVenantKirchhoff {
bulk_modulus: Stress::pascals(13.0),
shear_modulus: Stress::pascals(3.0),
yield_stress: Stress::pascals(2.0),
hardening_slope: Stress::pascals(1.0),
rate_sensitivity: 0.25,
reference_flow_rate: Rate::per_second(0.1),
};
let (times, deformation_gradients, _) = model.root(
AppliedLoad::BiaxialStress(
|t: Quantity<Time>| 1.0 + t.value(),
|t: Quantity<Time>| 1.0 + t.value() / 2.0,
&[Quantity::new(0.0), Quantity::new(1.0)],
),
DormandPrince {
abs_tol: 1e-6,
rel_tol: 1e-6,
..Default::default()
},
NewtonRaphson::default(),
)?;
times
.iter()
.zip(deformation_gradients.iter())
.try_for_each(|(time, deformation_gradient)| {
Assert {
abs_tol: 1e-6,
rel_tol: 1e-6,
..Default::default()
}
.eq_within_tols(
Vector::from([
deformation_gradient[0][0].value(),
deformation_gradient[1][1].value(),
]),
&Vector::from([1.0 + time.value(), 1.0 + time.value() / 2.0]),
)
})
}