I want to create a densely packed particle bed with the maximum possible packing density. For the monodisperse case, I can achieve a packing density of approximately 0.74 using HCPSampler. However, for polydisperse cases, I am having difficulty achieving a similarly dense initial packing. If I use HCPSampler with a spacing of , the larger particles overlap, so I have to use to avoid overlaps. However, this creates significant gaps between particles and results in a much lower packing density. Is there a way to generate an initially jammed or highly dense packing for a polydisperse particle system?
Hi Shahriar,
The short answer is that no sampler setting will get you there: HCPSampler and GridSampler place points on a lattice, and a lattice has exactly one characteristic spacing. There is no lattice that densely packs a polydisperse assembly. So you are not missing an option. You are asking the sampler to do a job it structurally cannot do.
Density in a polydisperse bed comes from dynamics, not from sampling. The standard recipe is to sample LOOSE on purpose, exactly as you did with 2*rmax, and then let gravity close the gaps:
1. Sample a batch with spacing based on the largest radius, so nothing overlaps at insertion.
2. Drop the batch in and run a couple of seconds of settling.
3. Repeat, adding batches on top of the settled material until the bed is as deep as you need.
4. Save the settled state and reuse it, so you pay this cost once.
Those gaps you are worried about are expected and they close during step 2. The sampler's only job is to place non-overlapping seeds.
If you are using DEM-Engine, this exact workflow is already written up as a demo series: DEMdemo_GRCPrep_Part1, Part2 and Part3 in src/demo/. It builds a bed of GRC lunar simulant, which is polydisperse in both size and shape, so it is your problem exactly. Part1 uses an HCPSampler at 2.2 times the largest scale (deliberately loose), adds particles in batches with a small downward velocity so they collapse rather than hang, runs about two seconds of settling per batch, and writes a checkpoint at the end. Part2 then replicates that settled bed to build thickness. Copy that pattern rather than reinventing it.
On the Chrono side the same idea appears in demo_DEM_repose.cpp and in the vehicle co-simulation granular terrain nodes, which generate in layers, advancing the insertion height by roughly one particle diameter per layer.
Two levers if you still want more density after that. First, run the settling phase with friction set very low or to zero and restore the real value afterwards. Friction is what locks a granular assembly into a loose state, so a near-frictionless settle reaches a noticeably denser packing. Second, finish with a light compression plate or a few taps rather than relying on gravity alone.
One expectation worth resetting, and I think this is the real answer to your question. The 0.74 you are getting in the monodisperse case is the HCP crystal value. That is an ordered lattice, not a physical granular packing. A real monodisperse granular bed random-close-packs at about 0.64, and starting a simulation from a perfect crystal is usually undesirable anyway, since crystalline beds shear along lattice planes and give you the wrong dilatancy. So a polydisperse bed that settles to something below 0.74 is not failing. It is behaving correctly. With a sufficiently wide size distribution, small particles fill the interstices between large ones and you can comfortably exceed the monodisperse 0.64, which is the number worth comparing against.
Good luck with it,
Dan
------------------------------------------------
Robert and Laura Hensel Professor
NVIDIA CUDA Fellow
Department of Mechanical & Aerospace Engineering
Department of Electrical & Computer Engineering
Department of Computer Science
University of Wisconsin - Madison
4150ME, 1513 University Avenue
Madison, WI 53706-1572
------------------------------------------------
--
You received this message because you are subscribed to the Google Groups "ProjectChrono" group.
To unsubscribe from this group and stop receiving emails from it, send an email to
projectchron...@googlegroups.com.
To view this discussion visit
https://groups.google.com/d/msgid/projectchrono/92e1b9ed-bbb3-44c3-8bfe-023879c83a4fn%40googlegroups.com.
I am encountering a problem after updating DEM-Engine. The same C++ simulation worked correctly with the previous version, but after updating to the current version, it fails with a “too many geometries in a bin” error during contact detection for all the codes with worked in previous version. I updated DEM-Engine because I had previously encountered the issue where the simulation would stop progressing while the GPU remained at 100% utilization, which was addressed by the recently merged fix I believe(#72; 1st GPU stuck at 100% and 2nd GPU 0% in the settling phase).
I reviewed the troubleshooting documentation and tried the recommended solutions, including performing clean rebuilds of both DEM-Engine and my application. However, the bin-related error persists. When I rebuild the application against the previous DEM-Engine version, the same simulation runs successfully again. The error -
-------- Simulation crashed "potentially" due to too many geometries in a bin --------
The dT reported max velocity is 0.000130473
------------------------------------
If the velocity is huge, then the simulation probably diverged due to encountering large particle velocities.
Decreasing the step size could help, and remember to check if your simulation objects are initially within the domain you specified.
------------------------------------
If the velocity is fair, and you *are* using a custom force model, one thing to do is to SetForceCalcThreadsPerBlock to a small number like 128 (see README.md troubleshooting for details).
If you are not using a custom model, one thing to do is to ensure the simulation world size (InstructBoxDomainDimension) is not orders of magnitude larger than the actual space the simulation entities take up.
If none works and you are going to discuss this on forum https://groups.google.com/g/projectchrono, please include a visual rendering of the simulation before crash.
terminate called after throwing an instance of 'std::runtime_error'
what(): GPU Assertion: an illegal memory access was encountered. This happened in /data/lab/boddeti/DEM-Engine/src/algorithms/DEMCubContactDetection.cu:464
My code (I have tried reducing Box dimesion too) -