sparkl2d/dynamics/timestep/
elasticity_sound_speed_timestep_bound.rs

1use crate::dynamics::Particle;
2use crate::math::Real;
3
4#[derive(Copy, Clone, Debug)]
5pub struct ElasticitySoundSpeedTimestepBound {
6    pub alpha: Real,
7    pub bulk_modulus: Real,
8    pub shear_modulus: Real,
9}
10
11impl ElasticitySoundSpeedTimestepBound {
12    pub fn new(alpha: Real, young_modulus: Real, poisson_ratio: Real) -> Self {
13        Self {
14            alpha,
15            bulk_modulus: crate::utils::bulk_modulus(young_modulus, poisson_ratio),
16            shear_modulus: crate::utils::shear_modulus(young_modulus, poisson_ratio),
17        }
18    }
19
20    pub fn timestep_bound(&self, particle: &Particle, cell_width: Real) -> Real {
21        let c_dir = ((self.bulk_modulus + 4.0 / 3.0 * self.shear_modulus)
22            * 1.0 // particle.deformation_gradient.determinant()
23            / particle.density0())
24        .sqrt();
25        let max_denom = particle.velocity.norm().max(c_dir);
26        self.alpha * cell_width / max_denom
27    }
28}