Skip to main content

Geologically consistent Discrete Fracture Network generator

Project description

GeoDFN logo

GeoDFN

Geologically Consistent Discrete Fracture Network Generator

Generate ensembles of geologically plausible fracture networks from outcrop statistics - ready for flow and transport simulations.


Download for Windows


CI License: MIT Python DOI


Publication: Kamel Targhi et al. (2025) - From outcrop observations to dynamic simulations: an efficient workflow for generating ensembles of geologically plausible fracture networks and assessing their impact on flow and transport - Geoenergy


What is GeoDFN?

Fractures are ubiquitous in geological formations and can significantly influence heat and mass transfer in geothermal systems, groundwater management, and CO₂ storage. GeoDFN provides a computationally efficient workflow that bridges outcrop observations and dynamic flow simulations.

GeoDFN uses a hybrid mechanical-statistical approach: fracture lengths, orientations, and spacings are sampled from probability distributions fitted to field data, while fracture placement follows a mechanical rule - fractures are inserted sequentially (longest first), and each new fracture must respect the stress shadow (buffer zone) of existing fractures. This prevents unrealistically close spacing and produces fracture patterns that are geologically consistent without the high computational cost of full fracture growth simulations.

The result is an ensemble of equiprobable fracture networks that honour the statistical properties of the outcrop and can be fed directly into multi-purpose flow and transport simulators such as MRST, DuMux, DARTS, PorePy, and OpenCSMP.

It ships in two forms - a desktop app for interactive use, and a Python library for scripting and large-scale ensemble generation.


Get Started

Option A - Python API

For scripting, batch generation, or integration into simulation pipelines, install GeoDFN directly via pip:

pip install GeoDFN

Below is an example:

import numpy as np
from GeoDFN.Classes.DFNGenerator import DFNGenerator

gen = DFNGenerator(
    domainLengthX=300, domainLengthY=600,
    sets=[{
        'I': 0.01,
        'fractureLengthPDF': 'Log-Normal',
        'fractureLengthPDFParams': {'mu': 2.4, 'sigma': 0.73, 'Lmin': 2.59, 'Lmax': 57.48},
        'spatialDistributionPDF': 'Power-law',
        'spatialDistributionPDFParams': {'alpha': 0.51, 'min distance': 1, 'max distance': 600},
        'orientationDistributionPDF': 'Von-Mises',
        'orientationDistributionPDFParams': {'kappa': 8.55, 'loc': 1.4,
                                              'thetaMin': np.radians(30), 'thetaMax': np.radians(120)},
        'bufferZone': {'method': 'constant', 'constant': 1.4},
    }],
    apertureCalculationParameters={'method': 'subLinear', 'scalingCoefficient': 0.001, 'scalingExponent': 0.5},
    DFNName='my_dfn',
    numOfRealizations=10,
)

print(f"{len(gen.realizations)} realizations generated")

Option B - Desktop App (no Python required)

The easiest way to get started without any installation:

  1. Download the application
  2. Unzip the file
  3. Double-click GeoDFN.exe - your browser opens with the interface

Option C - Run the GUI locally

If you have Python installed, you can run the interface directly:

pip install GeoDFN
streamlit run app.py

Your browser will open automatically with the full interface.


GUI or Python API?

Desktop GUI Python API
Best for Visual exploration, parameter tuning, quick results Large ensembles, batch generation, simulation pipelines
Setup Download & double-click pip install GeoDFN
Realizations Interactive, one run at a time Hundreds to thousands, fully automated

For uncertainty quantification studies and generating training data for machine-learning emulators, we recommend the Python API. It allows full automation over the parameter space that defines the fracture network ensemble.


Capabilities

Feature Options
Fracture length Log-Normal · Power-law · Exponential · Constant
Orientation Von-Mises · Uniform · Constant
Spatial distribution Power-law · Log-Normal · Uniform
Stress shadow (buffer zone) Constant width · Linear scaling with fracture length
Aperture model Constant · Sub-linear scaling · Barton-Bandis · Lepillier
Stress correction Multi-azimuth stress-dependent aperture
Output Coordinates · Apertures · Statistics · Stereonets · Visualizations

Output

Each run writes results to DFNs/<name>/:

DFNs/<name>/
├── fractureCoordinates/       # Start/end (x, y) of each fracture
├── aperture/                  # Aperture values
├── fractureSet/               # Full fracture list per set
├── orientationStereographic/  # Stereonet plots
├── outputPropertiesTotal/     # Network statistics
└── pics/                      # DFN visualizations

For Developers

Installation, tests, and building the desktop app

Install with dev dependencies

pip install -e ".[dev]"

Run tests

pytest tests/

Build the desktop app

pip install pyinstaller
python -m PyInstaller geodfn.spec --noconfirm

Distributable is generated in dist/GeoDFN/. Share the entire folder - users double-click GeoDFN.exe.

Project structure

GeoDFN/
├── Classes/
│   ├── DFNGenerator.py                      # Random-seed generator
│   ├── DFNGeneratorWithSeed.py              # Fixed seed-point generator
│   ├── DFNGeneratorWithSeedAndExclusion.py  # Generator with exclusion zones
│   ├── _validation.py                       # Input validation
│   ├── fractureLengthPDFs.py
│   ├── orientationPDFs.py
│   ├── spatialDistributionPDFs.py
│   ├── apertureCalculator.py
│   └── bufferZoneCalculator.py
├── Example-BrazilRandomSeeds.py
├── Example-BrazilFixedSeeds.py
├── Example-BrazilFixedSeedsAndExclusion.py
├── Example-BrazilAperture.py
├── Examples.ipynb
└── PercolationAnalysis.ipynb
app.py          # Streamlit GUI
launcher.py     # Desktop app entry point
geodfn.spec     # PyInstaller build spec

Citation

If you use GeoDFN in your research, please cite:

Kamel Targhi, E., et al. "From outcrop observations to dynamic simulations: an efficient workflow for generating ensembles of geologically plausible fracture networks and assessing their impact on flow and transport." Geoenergy 3.1 (2025): geoenergy2025-028.


License

MIT License - © 2025 Elahe Kamel Targhi. See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

geodfn-2.0.0.tar.gz (29.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

geodfn-2.0.0-py3-none-any.whl (36.6 kB view details)

Uploaded Python 3

File details

Details for the file geodfn-2.0.0.tar.gz.

File metadata

  • Download URL: geodfn-2.0.0.tar.gz
  • Upload date:
  • Size: 29.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for geodfn-2.0.0.tar.gz
Algorithm Hash digest
SHA256 eff15c3442ba9e62fdfbfed9a0cc8780484d288fe917c9bcc5d9bd7fe429c0ab
MD5 e03338d9081c5dadb936c7aedccf8333
BLAKE2b-256 94c80a305f6e0402a34062c044935b19c148d1d7580bc08fb5ddf170d92196f5

See more details on using hashes here.

File details

Details for the file geodfn-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: geodfn-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 36.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for geodfn-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a322726f7906522bde0d868071de996d01b83f209faebfb41a3d63bb54adc343
MD5 1c2843cae7d66058041f9a4fd7eccb03
BLAKE2b-256 305c2b1c44f52b037f9342e1b0a8c6ad3931398a13c91e29e17f666c255acf5a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page