sparkl2d_kernels/
gpu_plastic_model.rs

1use crate::DevicePointer;
2use sparkl_core::dynamics::models::{
3    DruckerPragerPlasticity, NaccPlasticity, RankinePlasticity, SnowPlasticity,
4};
5use sparkl_core::dynamics::ParticleData;
6use sparkl_core::math::Real;
7use sparkl_core::prelude::ParticleVolume;
8
9#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
10#[derive(cust_core::DeviceCopy, Copy, Clone, PartialEq)]
11#[repr(C)]
12pub enum GpuPlasticModel {
13    DruckerPrager(DruckerPragerPlasticity, DevicePointer<ParticleData>),
14    Nacc(NaccPlasticity, DevicePointer<ParticleData>),
15    Rankine(RankinePlasticity, DevicePointer<ParticleData>),
16    Snow(SnowPlasticity, DevicePointer<ParticleData>),
17    Custom(u32),
18}
19
20impl GpuPlasticModel {
21    pub unsafe fn update_particle(
22        &self,
23        particle_id: u32,
24        particle_volume: &mut ParticleVolume,
25        particle_phase: Real,
26    ) {
27        match self {
28            Self::DruckerPrager(dp, d) => {
29                let plastic_hardening =
30                    &mut (*d.as_mut_ptr().add(particle_id as usize)).plastic_hardening;
31                let log_vol_gain = &mut (*d.as_mut_ptr().add(particle_id as usize)).log_vol_gain;
32
33                dp.update_particle(
34                    particle_phase,
35                    &mut particle_volume.deformation_gradient,
36                    &mut particle_volume.plastic_deformation_gradient_det,
37                    plastic_hardening,
38                    log_vol_gain,
39                );
40            }
41            Self::Nacc(nacc, d) => {
42                let nacc_alpha = &mut (*d.as_mut_ptr().add(particle_id as usize)).nacc_alpha;
43                nacc.update_particle(&mut particle_volume.deformation_gradient, nacc_alpha);
44            }
45            Self::Rankine(r, d) => {
46                let plastic_hardening =
47                    &mut (*d.as_mut_ptr().add(particle_id as usize)).plastic_hardening;
48                r.update_particle(&mut particle_volume.deformation_gradient, plastic_hardening);
49            }
50            Self::Snow(s, d) => {
51                let elastic_hardening =
52                    &mut (*d.as_mut_ptr().add(particle_id as usize)).elastic_hardening;
53                s.update_particle(
54                    &mut particle_volume.deformation_gradient,
55                    elastic_hardening,
56                    &mut particle_volume.plastic_deformation_gradient_det,
57                );
58            }
59            Self::Custom(_) => {}
60        }
61    }
62}