Skip to content

Implement Compatible Particle-In-Cel (CPIC) Particle-Rigid-Body Coupling - #3

Open
kurtkuehnert wants to merge 47 commits into
dimforge:masterfrom
kurtkuehnert:generate_cdf
Open

Implement Compatible Particle-In-Cel (CPIC) Particle-Rigid-Body Coupling#3
kurtkuehnert wants to merge 47 commits into
dimforge:masterfrom
kurtkuehnert:generate_cdf

Conversation

@kurtkuehnert

@kurtkuehnert kurtkuehnert commented Mar 14, 2023

Copy link
Copy Markdown
Contributor

This PR implements the CPIC algorithm of the "Moving Least Squares Material Point Method" paper.
Its purpose is to couple the GPU particle simulation (sparkl) with the CPU rigid body simulation (rapier).

Therefore we generate a set of evenly spaced rigid particles across the surface of all rigid bodies. These particles are then used to build the Colored Distance Field (CDF) stored as part of the simulation grid. The CDF is a convenient data structure for performing inside/outside queries against all colliders. It stores the adjacency information, a tag indicating, which side of the collider it is on, and the unsigned distance to the closest collider. This gird CDF is then interpolated using the robust MLS technique for each particle of the simulation. Subsequently, the CPIC algorithm partitions the grid nodes surrounding each particle into two sets (compatible/incompatible) based on their affinity and tag information. These sets are handled differently during particle-to-grid and grid-to-particle transfer. The compatible nodes (i.e. the nodes that the particle has not collided with) are the only ones that are influenced by the particle in the p2g phase.
For the g2p phase all compatible nodes are updated. The incompatible nodes (i.e. the node that the particle has collided with) are projected alongside the collider surface using the reconstructed CDF data. Thereby they apply an impulse on the rigid body and a penalty force onto themselves, to avoid penetrating the colliders.

Additionally, this PR updates the examples (and adds a couple of new ones) to showcase these new capabilities.
Finally, I have added a visualization UI to debug the state of the particles, the grid, and the rigid particles.

Todo:

  • Generate rigid particles
  • Visualize rigid particles
  • Write CDF update kernel (basic)
  • Visualize the grid
  • Visualize the CDF
  • Implement CDF triangle check
  • Improve the performance of the CDF generation (better threading)
  • Reconstruct particle CDF for a single collider
  • Visualize the particle CDF for a single collider
  • Reconstruct particle CDF for multiple colliders
  • Implement CPIC particle-to-grid
  • Implement CPIC grid-to-particle
  • Add a nice debug visualization UI
  • Add cutting example
  • Handle collisions with multiple colliders
  • Add 2D CDF generation
  • Update the 2D examples
  • Apply penalty force
  • Take collider velocity into account (proper one-way coupling)
  • Make CDF colliders optional
  • Clean up the examples
  • Apply impulse back to colliders (two-way coupling)
  • Add a waterwheel example
  • Update the PTX files before merging

Future Improvements:

  • Resolve all outstanding simulation issues (particle drifting, explosions, etc.)
  • Figure out a way to always use the CDF colliders instead of the grid-based ones
  • Sort rigid particles to avoid overwriting the tag during the CDF update (alternatively store signed distance per collider)

@sebcrozet sebcrozet left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! This approach is great. I think we can generalize it to 2D too.

Comment thread src/cuda/generate_rigid_particles.rs Outdated
@kurtkuehnert kurtkuehnert changed the title Generate CDF Implement Compatible Particle-In-Cel (CPIC) Particle-Rigid-Body Coupling Apr 7, 2023
@kurtkuehnert
kurtkuehnert marked this pull request as ready for review April 11, 2023 15:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants