sparkl2d/dynamics/timestep/
elasticity_sound_speed_timestep_bound.rs1use 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.density0())
24 .sqrt();
25 let max_denom = particle.velocity.norm().max(c_dir);
26 self.alpha * cell_width / max_denom
27 }
28}