diff --git a/crates-ptx/Cargo.lock b/crates-ptx/Cargo.lock index 705a03f..475f6bb 100644 --- a/crates-ptx/Cargo.lock +++ b/crates-ptx/Cargo.lock @@ -345,9 +345,9 @@ checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" [[package]] name = "nalgebra" -version = "0.32.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6515c882ebfddccaa73ead7320ca28036c4bc84c9bcca3cc0cbba8efe89223a" +checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" dependencies = [ "approx", "bytemuck", @@ -363,9 +363,9 @@ dependencies = [ [[package]] name = "nalgebra-macros" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232c68884c0c99810a5a4d333ef7e47689cfd0edc85efc9e54e1e6bf5212766" +checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" dependencies = [ "proc-macro2", "quote", @@ -482,9 +482,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parry2d" -version = "0.13.0" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2342b33d77a0393879b1b85eac2a30cc4b36d10b30e111f55a5e9280cf5eb87" +checksum = "104ae65232e20477a98f9f1e75ca9850eae24a2ea846a2b1a0af03ad752136ce" dependencies = [ "approx", "arrayvec", @@ -502,9 +502,9 @@ dependencies = [ [[package]] name = "parry3d" -version = "0.13.0" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2852a4cf8f65177e6f3755a725fdc0a433cca4fa6a97a07ae8c8abd7a4b52ea" +checksum = "b55dc0e6db79bddbc5fd583569f7356cdcc63e1e9b2b93a9ab70dd8e717160e0" dependencies = [ "approx", "arrayvec", @@ -740,7 +740,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.16", + "semver 1.0.20", ] [[package]] @@ -769,9 +769,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.16" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "semver-parser" @@ -821,9 +821,9 @@ dependencies = [ [[package]] name = "simba" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50582927ed6f77e4ac020c057f37a268fc6aebc29225050365aacbb9deeeddc4" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" dependencies = [ "approx", "cuda_std", @@ -1020,9 +1020,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vek" -version = "0.15.9" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02eeed9a6ab91448e2aea59ffa21e644e22dc373ab0a187ac34ada660c2cb9de" +checksum = "8085882662f9bc47fc8b0cdafa5e19df8f592f650c02b9083da8d45ac9eebd17" dependencies = [ "approx", "num-integer", diff --git a/src_kernels/cuda/grid_update.rs b/src_kernels/cuda/grid_update.rs index 9984a35..20d6ab4 100644 --- a/src_kernels/cuda/grid_update.rs +++ b/src_kernels/cuda/grid_update.rs @@ -108,11 +108,12 @@ fn update_single_cell( } } BoundaryHandling::Friction | BoundaryHandling::FrictionZUp => { - if let Some((mut normal, dist)) = + if let Some((mut normal, mut dist)) = Unit::try_new_and_get(cell.projection_scaled_dir, 1.0e-5) { if is_inside { normal = -normal; + dist = 0.0; } #[cfg(feature = "dim2")] @@ -125,25 +126,29 @@ fn update_single_cell( if apply_friction { let normal_vel = cell_velocity.dot(&normal); + let dist_with_margin = (dist - cell_width * 0.5).max(0.0); - if normal_vel < 0.0 { - let dist_with_margin = dist - cell_width; - if is_inside || dist_with_margin <= 0.0 { - let tangent_vel = - cell_velocity - normal_vel * normal.into_inner(); - let tangent_vel_norm = tangent_vel.norm(); - - cell_velocity = tangent_vel; - - if tangent_vel_norm > 1.0e-10 { - let friction = collider.friction; - cell_velocity = tangent_vel / tangent_vel_norm - * (tangent_vel_norm + normal_vel * friction).max(0.0); - } - } else if -normal_vel * dt > dist_with_margin { - cell_velocity -= - (dist_with_margin / dt + normal_vel) * normal.into_inner(); - } + if -normal_vel * dt > dist_with_margin { + // NOTE: if we enter this code, normal_vel is negative. + let tangent_vel = cell_velocity - normal_vel * normal.into_inner(); + let tangent_vel_norm = tangent_vel.norm(); + + let new_normal_vel = normal_vel.max(-dist_with_margin / dt); + + // NOTE: removed_normal_vel is always positive. + let removed_normal_vel = new_normal_vel - normal_vel; + + let new_tangent_vel = if tangent_vel_norm > 1.0e-6 { + tangent_vel / tangent_vel_norm + * (tangent_vel_norm + - removed_normal_vel * collider.friction) + .max(0.0) + } else { + Vector::zeros() + }; + + cell_velocity = + new_normal_vel * normal.into_inner() + new_tangent_vel; } } }