Hi David,
This issue is a weakness in the default assumption we made that a sphere can have at most 12 contacts. This assumption is made to save GPU memory and to help identify some large-penetration problems in simulation which is typical with insufficient time step size. This assumption is fine with near-rigid spherical contacts, but problematic when meshes are involved (each mesh facet in contact with a sphere eats up one slot as well). Imagine a sphere sitting on the tip of a needle made of mesh, it could have contacts with tens of mesh facets, and we haven't counted the sphere neighbors it can potentially have.
The fix is easy, please go to the file ChGpuDefines.h (in chrono\src\chrono_gpu), and replace
#define MAX_SPHERES_TOUCHED_BY_SPHERE 12
by
#define MAX_SPHERES_TOUCHED_BY_SPHERE 20
or some even larger number if you need it. Rebuild it and your script should run fine. Note the error messages are hard-coded to say 12 is not enough if
MAX_SPHERES_TOUCHED_BY_SPHERE is exceeded, so if 20 is not enough and you need even more, just change it and do not let the error messages confuse you.
Another thing is that it is better to use meshes with relatively uniform triangle sizes. I attached a rebuilt mesh based on your original one. It's optional and does not seem to affect this simulation, but it's a good practice.
To answer your other questions: Unfortunately C::GPU does not currently have an efficient way of streaming particles into the system. The method you are using (re-initialization) is probably what I would do too if I have to. With a problem size similar to yours, it should be fine. And C::GPU does not have an official API that enforces manual particle position changes. However this should be fairly straightforward to implement. The naive approach is of course, do it on the host side with a for loop. If you care about efficiency, then we should instead add one custom GPU kernel call at the end of each iteration, that scans the z coordinates of all particles, and add an offset to them if they are below a certain value. It would be nice if you can tailor it to your needs, but if you need help implementing this custom kernel you can let us know (it may be good to add it as a permanent feature).
Lastly, I don't know if you are interested or not but in the new generation of DEM simulator that we are currently developing, apart from supporting non-trivial particle geometries, there will be efficient ways to do both things (sleeper and active entities; periodic boundary with no extra cost). It is not out yet, however.
Thank you,
Ruochun
Hello,
I have been working on trying to use the GPU module in project chrono to fill a vessel with spherical particles. I have been able to successfully do so by using the method in the demos of generating particle sheets and allowing them to settle in the vessel. I have recently, however, been attempting to fill the vessel with a "particle source" method that continuously streams particles into the domain until a certain number of particles is reached. I am unsure if this method is officially supported with the GPU module, and I am encountering crash that continuously seems to happen. I receive the error No available contact pair slots for body # and body # after the simulation has progressed. It seems to occur sometime after the particles hit the bottom of the vessel. I have tried reducing my timestep, reducing the "flow rate" of incoming particles, changing the height of the particle inflow, and altering some stiffness/damping constants, but this error seems to always happen soon after the particles make contact with the vessel. I have attached my input files, any help would be appreciated.
An unrelated question, but does the GPU module support the changing of particle positions during the simulation (i.e. taking all particles below a certain z and moving them to the top to "recycle" them continuously during the simulation)?
Thanks!
David