Skip to main content

conspire/constitutive/fluid/hyperviscous/saint_venant_kirchhoff/
mod.rs

1#[cfg(test)]
2mod test;
3
4use crate::{
5    constitutive::{
6        ConstitutiveError,
7        fluid::{
8            hyperviscous::{Hyperviscous, TWO_THIRDS},
9            viscous::Viscous,
10        },
11    },
12    math::{ContractWith, IDENTITY_00, Quantity, Rank2, TensorRank4},
13    mechanics::{
14        DeformationGradient, DeformationGradientRate, SecondPiolaKirchhoffRateTangentStiffness,
15        SecondPiolaKirchhoffStress,
16    },
17    units::{Dissipation, Viscosity},
18};
19
20#[doc = include_str!("doc.md")]
21#[derive(Clone, Debug)]
22pub struct SaintVenantKirchhoff {
23    /// The bulk viscosity $`\zeta`$.
24    pub bulk_viscosity: Quantity<Viscosity>,
25    /// The shear viscosity $`\eta`$.
26    pub shear_viscosity: Quantity<Viscosity>,
27}
28
29impl Viscous for SaintVenantKirchhoff {
30    fn bulk_viscosity(&self) -> Quantity<Viscosity> {
31        self.bulk_viscosity
32    }
33    fn shear_viscosity(&self) -> Quantity<Viscosity> {
34        self.shear_viscosity
35    }
36    #[doc = include_str!("viscous_second_piola_kirchhoff_stress.md")]
37    fn viscous_second_piola_kirchhoff_stress(
38        &self,
39        deformation_gradient: &DeformationGradient,
40        deformation_gradient_rate: &DeformationGradientRate,
41    ) -> Result<SecondPiolaKirchhoffStress, ConstitutiveError> {
42        let strain_rate_term = deformation_gradient_rate.transpose() * deformation_gradient;
43        let (deviatoric_strain_rate, strain_rate_trace) =
44            ((&strain_rate_term + strain_rate_term.transpose()) * 0.5).deviatoric_and_trace();
45        Ok(deviatoric_strain_rate * (2.0 * self.shear_viscosity())
46            + IDENTITY_00 * (self.bulk_viscosity() * strain_rate_trace))
47    }
48    #[doc = include_str!("viscous_second_piola_kirchhoff_rate_tangent_stiffness.md")]
49    fn viscous_second_piola_kirchhoff_rate_tangent_stiffness(
50        &self,
51        deformation_gradient: &DeformationGradient,
52        _: &DeformationGradientRate,
53    ) -> Result<SecondPiolaKirchhoffRateTangentStiffness, ConstitutiveError> {
54        let scaled_deformation_gradient_transpose =
55            deformation_gradient.transpose() * self.shear_viscosity();
56        Ok(
57            TensorRank4::dyad_ik_jl(&scaled_deformation_gradient_transpose, &IDENTITY_00)
58                + TensorRank4::dyad_il_jk(&IDENTITY_00, &scaled_deformation_gradient_transpose)
59                + TensorRank4::dyad_ij_kl(
60                    &(IDENTITY_00 * (self.bulk_viscosity() - TWO_THIRDS * self.shear_viscosity())),
61                    deformation_gradient,
62                ),
63        )
64    }
65}
66
67impl Hyperviscous for SaintVenantKirchhoff {
68    #[doc = include_str!("viscous_dissipation.md")]
69    fn viscous_dissipation(
70        &self,
71        deformation_gradient: &DeformationGradient,
72        deformation_gradient_rate: &DeformationGradientRate,
73    ) -> Result<Quantity<Dissipation>, ConstitutiveError> {
74        let strain_rate_term = deformation_gradient_rate.transpose() * deformation_gradient;
75        let strain_rate = (&strain_rate_term + strain_rate_term.transpose()) * 0.5;
76        let strain_rate_trace = strain_rate.trace();
77        Ok(
78            (&strain_rate * self.shear_viscosity()).contract_with(&strain_rate)
79                + (self.bulk_viscosity() - TWO_THIRDS * self.shear_viscosity())
80                    * strain_rate_trace
81                    * strain_rate_trace
82                    * 0.5,
83        )
84    }
85}