Discrete Fracture Network (DFN) User Guide
This guide covers the Discrete Fracture Network (DFN) modeling capabilities in VRGS, including generation, visualization, and analysis features.
If you have interpreted trace polylines or structural measurements and want the DFN to match them — derived Fisher statistics, observation-driven P32, placement biased toward your outcrop, validation against observed traces — see the companion DFN Interpretation Matching guide.
Overview
A Discrete Fracture Network (DFN) is a stochastic representation of fracture systems in rock masses. VRGS allows you to:
- Generate statistically-controlled fracture networks from orientation data
- Compute fracture-fracture intersections and fracture traces on outcrop meshes
- Analyze network connectivity and topology using graph theory
- Model stress-controlled fracture propagation
- Create cross-sections through the network
- Filter fractures by proximity to outcrops
- Colour fractures by computed geometric, connectivity, topology, and stress attributes
Creating a DFN
A DFN is created from one or more orientation (plane attitude) groups:
- In the Interpretation tree, select the orientation group(s) you want to base the network on (each group becomes one fracture set)
- Right-click and choose Create DFN from Selected Groups
For each group, VRGS derives the set's mean orientation and Fisher concentration (K) from the measured poles. If the group's planes carry trace geometry, a size distribution is also fitted to the trace lengths (see Distribution Fitting); otherwise sensible defaults are used. The source of each derived value is shown in the properties panel (P32 Source, Size Distribution Source).
The names of the source orientation groups are stored with the DFN, so you can later right-click the DFN and choose Re-derive from Source Orientation Groups to re-run the derivation against updated data.
Setting the Domain
The DFN domain defines the 3D bounding box where fractures are generated. It is set from the data extents at creation and can be edited in the properties panel under Domain (Min/Max X, Y, Z).
Fracture Sets
A DFN consists of one or more fracture sets, each with distinct statistical properties. Sets correspond to the orientation groups the DFN was created from; each can be enabled/disabled individually (Enable Set).
Fracture Set Parameters
All parameters are edited in the properties panel under Fracture Sets.
Orientation (Fisher Distribution)
| Parameter | Description |
|---|---|
| Mean Dip | Average dip angle (0-90 degrees from horizontal) |
| Mean Azimuth | Average dip direction (0-360 degrees, 0=North) |
| Fisher K | Fisher concentration parameter. Higher values = tighter clustering around mean |
- Fisher K ≈ 1-5: Strongly dispersed orientations
- Fisher K = 10-20: Moderate clustering
- Fisher K = 50+: Tight clustering around mean
When derived from measurements, K is estimated from the resultant length of the pole population using the spherical (3D) Fisher maximum-likelihood estimator and clamped to the range [0.1, 1000].
Size Distribution
| Parameter | Description |
|---|---|
| Size Distribution | Power Law, Lognormal, Exponential, or Uniform |
| Min Radius | Minimum fracture radius |
| Max Radius | Maximum fracture radius |
| Exponent | For power law distribution (typically 2.0-3.5) |
| Lognormal Mean / Stddev | Parameters of ln(r) for the lognormal distribution. Sampled by exact inverse-CDF truncation to [Min Radius, Max Radius] |
| Exponential Rate | Rate λ of P(r) ~ exp(-λ·r) for the exponential distribution. Larger λ means more small fractures. Leave at 0 to derive it from the size bounds; fitting a size distribution from measurements sets it automatically |
| Aspect Ratio | Major/minor axis ratio for elliptical fractures (1.0 = circular) |
Rather than typing sizes and intensities, Derive DFN Statistics… (right-click the DFN) lets each set take each statistic from a named source — an orientation group, a trace group, a scanline, or a P21/P32 attribute layer — and cross-checks the intensity routes against each other.
It also handles the fact that a mapped trace is a chord, not a fracture diameter, so sizes fitted from traces are not systematically too small. See DFN — Matching Interpretations §4.
Intensity (P32)
| Parameter | Description |
|---|---|
| P32 Intensity | Fracture area per unit volume (m²/m³) |
P32 is the most robust intensity measure as it is scale-independent. The generator calibrates the fracture count from the expected fracture area of the size distribution (not the mean radius), computed in closed form, so the realized P32 matches the target even for broad power-law size distributions.
Under boundary truncation, fractures centred outside the domain that cross into it are generated too — for every spatial model, not just Poisson. Without that buffer, clipping removes fracture area near the faces with nothing flowing in to replace it, and the realized intensity lands below target (measured at about 11% low for the clustered, stratified and region-mask models before this was added).
The Set Statistics to CSV export reports target against realized P32 per set, and the validation report shows the same comparison graphically.
Spatial Model
| Model | Description |
|---|---|
| Poisson | Completely random (uniform) fracture centres |
| Clustered | Neyman-Scott clustering: a reduced set of parent centres each spawns several fractures within Cluster Radius; Fractures per Cluster sets the mean number of fractures per parent |
| Stratified | Grid-stratified sampling — more even spatial coverage than Poisson |
| Region Mask | Placement biased toward a mask mesh with a Gaussian falloff (Region Mask Falloff); see the Interpretation Matching guide |
Termination Rule
| Rule | Description |
|---|---|
| None | Fractures extend beyond the domain unmodified |
| Truncate at Boundary | Fracture polygons are clipped to the domain box |
| Abutting | Younger fractures terminate against older ones with probability Abutting Probability |
Modelled surfaces are handled separately from this rule — see Model Surfaces below. A set normally wants boundary truncation and bed confinement at the same time, so they are independent settings rather than alternatives.
Model Surfaces
Surfaces produced by the surface gridding can be attached to a DFN to give it a shape other than a box. Right-click the DFN and choose Model Surfaces….
Each attached surface has a role:
| Role | Effect |
|---|---|
| Upper limit | The model exists below the surface. Fractures are clipped at it. |
| Lower limit | The model exists above the surface. |
| Internal barrier | A fracture reaching the surface either crosses it or stops, decided by the crossing probability. |
An upper and a lower limit together define a bed, and a set generated inside it comes out with fractures as high as the bed rather than as high as its fitted size distribution. That is the point: bed-confined (stratabound) fracturing is one of the commonest fabrics in outcrop, and a box cannot express it.
Crossing probability
An internal barrier's crossing probability is the chance that a fracture reaching it carries on through:
- 1.0 — transparent. The surface changes nothing. This is the default, so attaching a surface never alters a model until you tell it to.
- 0.0 — impermeable. No fracture crosses; every set is confined between barriers.
- Anything between — that fraction of fractures crosses.
Each fracture set also has a Surface Crossing Probability in the property bar, which overrides the surface's own value:
| Set value | Meaning |
|---|---|
| -1 (default) | Use whatever each surface says |
| 0 | This set is bed-confined, whatever the surfaces say |
| 1 | This set cuts straight through every surface |
The set wins rather than the two being multiplied together, because a product could never express a through-going master joint set cutting a strong bedding plane — and that is a real and common fabric. With an override, a weak bedding plane can stop the bed-confined sets while the master joints cut it.
Coverage, and where a surface is not mapped
A modelled surface rarely spans the whole domain footprint. Where it does not, it is simply not there: fractures pass through freely and bounding surfaces do not clip. VRGS never extrapolates a surface beyond the data it was gridded from.
That is the honest behaviour, but it is invisible in the result — a bed boundary covering a third of the model produces a network that looks perfectly reasonable and is only bed-confined in a third of its volume. The dialog therefore shows a Coverage column for every surface. If it reads 35%, only 35% of your model is constrained by it.
The volume, and what P32 now means
P32 is fracture area per unit volume, and bounding surfaces change the volume.
Once upper/lower limits are attached, intensity is measured against the bounded volume — the rock between the surfaces — not against the domain box. The dialog states the bounded volume and its share of the box for exactly this reason.
This is the right behaviour: a target P32 of 2 m²/m³ in a 10 m bed means 2 m² of fracture per cubic metre of that bed, which is what a geologist means by it. But it does mean that attaching a bounding surface to an existing model changes what its intensity numbers refer to, so re-check any P32 you derived before.
Target and realised intensity both use the bounded volume, so the two stay comparable and the validation report's intensity panel stays meaningful.
Surfaces that cannot be used
| Source | How its side is decided |
|---|---|
Gridded surface (Grid, from surface gridding) | The mesh is rasterised into a height field in the surface's own frame — its normal, not vertical, so a steep surface works |
| Implicit surface (from the 3D potential field) | The potential field itself, carried straight through. A level set has no preferred axis, so an overturned or recumbent fold works |
Overturned folds therefore bound a DFN correctly. That comes from using the potential rather than the triangles: the sign is stratigraphic, not geometric, so "below the upper limit" means below it in the sequence. On an overturned limb that is the only reading that makes sense — a vertical line crosses the same horizon three times, and a geometric "below" would get the middle crossing wrong.
Two cases are still refused, both with a message rather than a silent approximation:
- A gridded surface that folds back on itself. The gridding cannot produce one, but an imported or hand-edited mesh can. Use an implicit surface instead.
- An implicit surface that has not been generated yet. After reopening a project the generator is re-attached but not re-solved. Regenerate the surface and the DFN will pick it up.
Beyond the region the implicit surface was solved over, the potential is extrapolation rather than data, so the constraint lapses there exactly as a gridded surface lapses outside its footprint — visible in the Coverage column.
Generating the Network
- Right-click on the DFN in the Interpretation tree
- Select Regenerate
Each regeneration uses a fresh random seed, producing a new statistical realization with the same parameters. The Grow menu item regenerates and then runs fracture propagation (see below).
Visualization
Visibility Options
- Visible: Toggle the fracture network on/off
- Show Vertices: Toggle rendering of fracture intersection points
Render Mode
The Render Mode selector in the properties panel controls how fractures are drawn:
| Mode | Description |
|---|---|
| Disks | Filled fracture polygons, coloured by fracture set |
| Outlines | Polygon edges only |
| Colour by Property | Filled polygons coloured by the active attribute layer through the colour map |
Generating an attribute automatically switches to Colour by Property so the result is visible immediately; switch back to Disks at any time without losing the attribute layer.
Stereonet and Rose Diagram
A visible DFN plots on any stereonet — the Charts panel's, or a stereonet window opened from Home → Windows → Stereonet Window — just like measured orientation data (see the Stereonet User Guide):
- Poles: each fracture's pole is plotted, coloured by fracture set (a fixed per-set palette, distinct from the bedding/fracture/cleavage colours used for measured data). Very large networks are uniformly decimated to keep the display responsive while remaining statistically representative.
- Density contours: the Kamb/Schmidt contouring includes DFN poles.
- Rose diagram: fracture azimuths (or strikes, with Strike Values) contribute to the rose petals, density ring, and azimuth dots.
- SVG export includes the DFN poles, mirroring the on-screen display.
To validate a generated network against its source data, check both the DFN and its source orientation groups in the stereonet window — generated and observed poles plot together with distinguishable colours.
Slicers and proximity filtering
See Slicers and Proximity Filtering below.
Intersection Analysis
Fracture-Fracture Intersections
Compute where fractures intersect each other:
- Right-click on the DFN
- Select Fracture Intersections
This creates line segments at all fracture-fracture intersections and automatically builds the connectivity graph from them.
Mesh Intersections
Compute where fractures intersect mesh surfaces (e.g., outcrop models):
- Ensure the target mesh(es) are visible
- Right-click on the DFN
- Select Mesh Intersections
This creates polylines representing the fracture traces on the mesh surface. Each fracture's intersection segments are automatically merged into continuous polylines.
It also records which fractures reached the mesh, so they can be displayed on their own — see Outcrop-Constrained Display below.
Outcrop-Constrained Display
Show Outcrop-Constrained Fractures Only (right-click menu) hides every fracture that does not cut the outcrop, leaving only the ones that should correspond to mapped traces. Most of a network never reaches the exposure, so this is the difference between eyeballing a comparable subset and eyeballing a cloud.
The subset comes from the last cut against a mesh (Mesh Intersections, or Score DFN against Selected Traces…), so run one of those first. Regenerating the DFN clears it — fracture identities are reused on rebuild, so a stale subset would name the wrong fractures.
Full guide: DFN — Validating Against Outcrop.
Truncating Against the Boundary
Truncate Against Boundary (right-click menu) clips all existing fracture polygons to the current domain box without regenerating the network.
Connectivity Graph
The fracture graph represents network topology using nodes (intersection points) and edges (intersection-line segments between nodes). It is built automatically when you run Fracture Intersections.