conspire/constitutive/fluid/hyperviscous/saint_venant_kirchhoff/
mod.rs1#[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 pub bulk_viscosity: Quantity<Viscosity>,
25 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}