Discrete Element Model (DEM) User Guide
The Discrete Element Model simulates rock as an assembly of bonded spherical particles. Where a DFN generates a fracture network from statistics you supply, a DEM predicts one: you build a particle pack, cement it into rock, load it, and the fractures emerge from where the cement actually fails.
The DEM is under active development and parts of it are incomplete. Most importantly, DE volumes are not saved with your project — a model is lost when the project closes. Please read Current limitations before planning work around this feature.
The Discrete Element Model branch only appears in the Interpretation tree when your licence includes the DFN feature. Without it the branch is not created at all, so there is nothing to right-click. If you cannot find it, check your licence before looking for the tree node.
Overview
A DEM in VRGS lets you:
- Build a packed assembly of spherical particles at a target porosity
- Give the assembly rock properties — density, stiffness, friction, restitution
- Cement it, installing bonds that carry force and moment between touching particles
- Run the simulation and watch it in the 3D view while it steps
- Compress it in a virtual press and read off the stress–strain response
- Track damage as bonds break, permanently and irreversibly
- Export the resulting broken-bond population as a DFN with real dip and azimuth
The distinction that matters: bonds persist and break. The population of broken bonds is the fracture, and that is what the DFN export reads.
Creating a DE volume
Right-click Discrete Element Model in the Interpretation tree and choose New. VRGS creates a volume and immediately fills it with a random, non-overlapping particle pack using the current settings.
Select the volume to edit its properties in the Properties panel.
Building the particle pack
| Property | Meaning |
|---|---|
| Initial Elements | How many particles to place when the volume is created or reset |
| Minimum / Maximum Size | Particle radius range. Particles are drawn uniformly between these |
| Target Porosity | Void fraction to aim for when adding elements |
| X / Y / Z dimension | Size of the model box |
Particles are placed randomly and rejected if they would overlap, so the achievable packing density is limited. Two commands help you densify:
- Add Elements — keeps inserting particles until the target porosity is reached or placement saturates.
- Grow Elements — expands each particle into the gap to its nearest neighbour. This raises density without adding particles, and is usually the more effective of the two.
Current Porosity is shown read-only and updates as you go.
Material properties
These describe the particles themselves, and apply whether or not the model is cemented.
| Property | Meaning |
|---|---|
| Density | kg/m³. Particle masses follow it |
| Young's Modulus | Elastic modulus, Pa. Sets contact stiffness and the stable timestep |
| Poisson's Ratio | Used by the timestep stability criterion |
| Contact Stiffness | Read-only. Derived from the modulus and particle size |
| Restitution | Bounciness on collision, 0–1 |
| Friction | Coulomb friction coefficient |
Contact stiffness is derived, not set directly. A stiffness quoted in N/m is only valid at one particle size — weight grows as the cube of radius while a linear spring does not grow at all — so a single fixed value would let large particles sink through the floor and through each other while small ones behaved correctly. Specifying Young's modulus instead keeps the model correct at any particle size, and it is the property you are more likely to know for a given rock.
Stiffer contacts are shorter, so they need a smaller timestep and the simulation advances more slowly in real time. Granite's ~65 GPa is physically honest but expensive. Reducing the modulus is standard practice in discrete element modelling when you care about bulk behaviour rather than contact detail — it exaggerates how much particles deform at their contacts, but leaves packing and flow broadly intact, and it can speed a model up substantially.
The contact model cannot deliver very inelastic collisions. Requesting 0.2 gives about 0.32 in practice, and the response floors out near 0.21 however low you set it. Values of 0.5 and above behave as expected; treat anything lower as "as inelastic as this model gets".
Running the simulation
| Command | Effect |
|---|---|
| Start/Stop | Runs the simulation on a background thread. The 3D view updates live |
| Step Forward | Advances a single display step, for inspecting behaviour closely |
| Reset | Rebuilds the particle pack from scratch |
The view animates while the model runs. Progress appears in the Messages panel: elapsed time, RMS particle displacement, kinetic energy and contact count.
The simulation runs as fast as the physics allows and redraws about thirty times a second, so how much simulated time passes per second of real time depends on model size and timestep rather than on any setting. Steps per Batch controls how many physics steps run between checks for the next redraw; the default of 100 suits most models. Lower it if a heavy model makes the view feel unresponsive, raise it if you are running a small model unattended.
Timestep
The solver chooses its own timestep from the material and particle size, using the Rayleigh criterion — the standard stability bound for DEM. Two read-only values are shown:
- Critical Timestep — the stability limit for the current model
- Timestep (s) — what the solver is actually using
Timestep Safety (default 0.1) is the fraction of the critical timestep to use. It controls
accuracy as well as stability: a collision lasts roughly 1.1 / safety timesteps, so 0.1 resolves
one in about eleven steps. Halving it doubles the run time and roughly doubles the resolution. If
you set a timestep larger than the critical value the solver overrides it rather than integrating
something that would blow up.
Run the model for a while before cementing. A freshly generated pack is loose and randomly placed; letting it settle under gravity produces a denser, more realistic contact network for the cement to bond.
Cementing the model
Cement Model installs bonds between every pair of particles that are touching or nearly so. This is what turns a loose granular pack into rock. Until you do it the assembly is cohesionless: it can rearrange, but it cannot fracture.
| Property | Meaning |
|---|---|
| Bond Radius Multiplier | Bond cross-section radius, as a fraction of the smaller particle |
| Bond Normal / Shear Stiffness | Cement stiffness per unit bond area, Pa/m |
| Tensile Strength | Bond fails in tension above this stress, Pa |
| Cohesion | Shear strength at zero normal stress, Pa |
| Friction Angle | Slope of the Mohr–Coulomb failure envelope, degrees |
The bonds carry both force and moment. The moment matters: without it particles rotate too freely and the model comes out far weaker in compression relative to tension than real rock.
Re-running Cement Model heals the model — it replaces the bond set rather than adding to it.
Bonds act in parallel with particle contacts, so their stiffnesses add and the stable timestep gets shorter. The solver accounts for this automatically, but a heavily cemented model will step more slowly.
Loading the model
Cementing gives the model strength; loading is what makes it fail. Set Mode in the Loading group to Compression and the test begins immediately — one face of the domain becomes a platen and advances into the specimen at the strain rate you set, while the opposite face holds. Setting Mode back to Off stops the test.
| Property | Meaning |
|---|---|
| Mode | Off, Compression, or Tension |
| Axis | Which axis the platen travels along |
| Strain Rate | Fraction of the starting length per second |
| Max Strain | Loading stops once this much strain has accumulated |
| Axial Strain | Read-only. Strain applied so far |
| Axial Stress | Read-only. Load on the platen over the specimen cross-section |
| Peak Stress | Read-only. The highest stress reached |
Run the simulation with a mode selected and you are performing an unconfined compression test. Watch Axial Stress climb, then fall as bonds begin to break; Peak Stress holds the maximum, which for a cemented model is its unconfined compressive strength.
Starting a test switches off the four side walls, leaving only the two platens. This matters more than it sounds. A specimen under axial load expands sideways, and that expansion is what puts the transverse bonds into tension — tension being how compression actually breaks rock. Hold the sides rigid and no tension ever develops, while the axial bonds only get stronger under load, because their shear capacity rises with the stress pressing them together. A confined specimen in testing carried 145 times its own bond strength without breaking a single bond.
A high strain rate measures a dynamic impact response, not the quasi-static strength you are usually after. If peak stress looks implausibly high, lower the strain rate before doubting the material properties.
Reading damage
Three read-only values track failure:
- Bonds — how many were installed
- Broken Bonds — how many have failed. This population is the fracture
- Damage — broken bonds as a fraction of installed, 0–1
Breakage is permanent. A bond that fails never re-forms, even if the particles are pushed back together, because accumulated damage is the whole point.
Exporting fractures to a DFN
Export Fractures to DFN converts broken bonds into a fracture network and adds it to the Interpretation tree.
The export groups broken bonds into spatially connected clusters, fits a plane through each, and emits a fracture disc with the resulting dip and azimuth. Clusters that are not planar enough are rejected — rock accumulates diffuse microcracking as well as discrete fractures, and emitting a disc for every blob of damage would fill the DFN with features that do not exist.
Tensile and shear failures go into separate sets, so joints and shear bands stay distinguishable.
The Messages panel reports what happened, including what was rejected and why. If nothing is exported it tells you whether there were no broken bonds at all, or whether clusters were found but discarded as too small or insufficiently planar.
Once exported, the network is an ordinary DFN — see the DFN User Guide for connectivity, permeability and stress analysis.
Cut sections
Add Section XZ / YZ / XY creates a cut plane through the volume. Sections currently appear in the tree but are not drawn in the 3D view; see the limitations below.
Current limitations
The DEM is experimental. These are known and specific.
Only axial loading is available. The press applies compression or tension along one axis. There is no confining pressure, so triaxial tests are not possible, and no shear or bending. For unconfined compressive strength — the usual laboratory measurement — this is sufficient.
DE volumes are not saved. A volume is lost when the project closes. There is no persistence yet, so treat any model as a working session rather than something you can come back to.
Seeding from an existing DFN is not exposed. The engine can pre-break bonds that cross fractures from a mapped network, so a model can start with inherited discontinuities rather than as intact rock. This works but has no menu command yet.
Sections do not render. Add Section creates the tree entry and computes the intersection, but nothing is drawn.
Convert to Voxel Model produces an empty model. The command creates a correctly sized voxel grid and adds it to the project, but no voxels are filled.
Particles cast no shadows. The whole assembly is drawn in a single pass as camera-facing sprites shaded to look like spheres, which is what lets large models draw at all. Sprites do not take part in the shadow passes, so particles neither cast shadows on each other nor on the rest of the scene.
Very close zoom flattens the largest particles. Sprite size is capped by the graphics hardware. Zoom in far enough that a single particle fills a large part of the window and it stops growing with the others. This only appears at magnifications well past where a particle assembly is normally viewed.
The solver is single-threaded. Simulation runs on one core regardless of model size. Cost per step is proportional to particle count — measured across models from one thousand to twenty-seven thousand particles, the work per particle stays essentially constant — so doubling the model roughly halves the step rate. Cementing adds about a third again, because bonds are evaluated alongside particle contacts. On a large model the simulation, not the display, is now what you wait for.
A complete workflow
- Create a DE volume. It fills with a random particle pack.
- Run the simulation and let the pack settle under gravity, then stop it.
- Grow Elements if you want a denser pack.
- Cement Model to bond the settled assembly into rock.
- Set Loading Mode to Compression and Run again. Watch axial stress climb and damage accumulate.
- Export Fractures to DFN once bonds have broken.
That gives you a fracture network predicted from simulated rock failure rather than generated from statistics — which is the reason to use a DEM at all.
What the DEM is for
The DEM is most useful for exploring how a cemented granular assembly fails: how packing, particle size distribution and cement strength interact, what stress the assembly carries, and what the resulting damage looks like as a fracture network.
Treat the absolute numbers with care. Peak stress depends on your particle size, packing and cement parameters, and a discrete element model reproduces the character of rock failure far more reliably than it reproduces a specific rock's strength without calibration. Comparing models against each other is sounder than reading any single peak stress as a laboratory value.