sparkl2d_kernels/
gpu_plastic_model.rs1use 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}