Skip to main content
Version: 3.4 (unreleased)

Seismic Modelling from Meshes

VRGS can turn a classified triangulated mesh into a synthetic seismic section. Where two facies meet across the mesh, that contact reflects energy; VRGS sums those reflections into seismic traces using a band-limited Kirchhoff diffraction stack and displays the result as a vertical panel hung along the acquisition line. Given a regional dip, the line is shot along the dip direction and the dip is flattened out, so dipping beds image as horizontal bands. The contributing facies and impedance can be overlaid on the same panel.

This is useful for tying outcrop interpretation to seismic, for testing how a geological contact would appear under a given acquisition geometry, and for building intuition about which contacts image well and which only diffract.

What you get

A new Seismic Section object in the project tree, rendered as a textured panel above the mesh. It is saved with the project and has its own display properties (clip, gain, polarity, colormap).

Prerequisites

Before you can create a model, the mesh must carry two per-vertex attribute layers:

AttributePurposeTypical name
Facies / classIdentifies which facies each vertex belongs to. Contacts are detected where this value differs across a facet.Facies
ImpedanceAcoustic impedance (density × velocity) per vertex. Drives the reflection strength.Impedance
Classify the mesh first

The facies layer is normally produced by classifying or painting the mesh (for example with ANN Classify or the facies-painting tools). The seismic step reads whichever attribute layers you point it at — it does not classify for you.

Just want to try it?

Right-click the mesh and choose Add Test Facies + Impedance… to generate synthetic Facies and Impedance layers split into elevation bands. The contacts then fall on horizontal boundaries — a quick way to see the section (and the dipping/orthographic projection) working before classifying real geology.

If a layer named Facies or Impedance exists, VRGS pre-selects it in the dialog; otherwise pick the correct layers yourself.

Creating a model

  1. In the Project Data tree, select the triangulated mesh and make sure it is loaded into memory.
  2. Right-click the mesh and choose Create Seismic….
  3. Set the parameters in the dialog (see reference).
  4. Click OK. The model runs on a background worker; a new Seismic Section node appears under the seismic group and fills in when the computation finishes.
Start with the defaults

The defaults shoot a dense zero-offset line above the cliff with a 30 Hz Ricker wavelet. Run once, look at the panel, then adjust frequency, velocity, and geometry from there.

How it works

Understanding the method makes the parameters meaningful.

Reflecting elements

VRGS walks every facet of the mesh. A facet is a reflector only if its three vertices do not all share one facies — i.e. it straddles a contact. Facets sitting entirely inside a single facies contribute nothing.

Each reflecting facet gets:

  • a normal-incidence reflection coefficient from the impedance jump across the contact,

    R=ZhiZloZhi+ZloR = \frac{Z_{hi} - Z_{lo}}{Z_{hi} + Z_{lo}}

    where ZhiZ_{hi} and ZloZ_{lo} are the mean impedances of the facies on either side of the contact (for a facet touching three facies, the contact with the largest contrast wins);

  • an area and a centroid in true 3D world coordinates.

The reflector normal (the 2D-extrusion assumption)

The reflector normal is deliberately not the cliff-face normal. It is the impedance gradient across the facet, projected into the acquisition plane. This is the explicit form of the 2D-extrusion assumption: each contact is treated as extending perpendicular to the section.

That is why a horizontal bed reflects strongly to a source directly above it, while a vertical fault is weak at zero offset but still diffracts off its tips.

Replacing the assumption with data

If you have measured dip vectors per vertex, they can be substituted for the computed impedance gradient (reflector_normal_from_gradient in the engine), turning the extrusion assumption into measured geometry.

The forward sum

For every source–receiver pair and every reflecting element xx:

  • traveltime uses straight rays in a constant background velocity V0V_0:

    t=xs+xgV0t = \frac{|x - s| + |x - g|}{V_0}

  • amplitude is RAobliquity/(rsrg)R \cdot A \cdot \text{obliquity} / (r_s \cdot r_g), where rs=xsr_s = |x-s| and rg=xgr_g = |x-g|;

  • the contribution is deposited into the trace with linear interpolation between the two nearest samples.

Each finished trace is convolved once with the chosen wavelet (Ricker or Klauder). The default acquisition is a zero-offset line above the cliff, but the geometry is general — fixed offsets or custom trajectories are supported.

Facies and impedance overlays

As it sums the reflections, VRGS also records which contact produced each event — the facies and impedance on the high-impedance side — and exposes them as two overlays on the same panel (see Working with the result).

These overlays are projected geometrically onto the section, not along the diffraction traveltime used for the amplitude. Each contact is placed at its true depth on the trace nearest it, and where geology lies off the section the element closest to it wins. The practical consequences:

  • a horizontal contact images as a horizontal band, not an arch;
  • with a regional dip set (Dip > 0°) the dip is flattened out: each contact is shifted by its own dip ramp, so dipping bed-parallel contacts collapse to thin horizontal bands instead of dipping reflectors.

At zero offset the amplitude event for a contact lands on the same sample as its overlay on-axis, so the colour and the wiggle stay aligned (approximately so for off-plane or strongly-dipping geometry).

Parameter reference

Wavelet

ParameterDefaultNotes
Ricker / KlauderRickerChoose the wavelet by clicking its icon.
Frequency (Hz)30Ricker peak frequency. Higher = sharper, thinner reflections.
Klauder F1 / F2 (Hz)8 / 80Sweep low/high frequencies (Klauder only).
Klauder sweep length (s)8Sweep duration (Klauder only).

Modelling

ParameterDefaultValid rangeNotes
V0 — background velocity25001 – 100 000m/s (or world units/s) for straight-ray traveltimes.
dt — sample interval0.0021e-6 – 10Seconds for a time axis; world units for a depth axis.
Number of samples10001 – 1 000 000Trace length. Record length ≈ (samples − 1) × dt (≈ 2 s by default).
AxisTimeTime / DepthTime uses t=(rs+rg)/V0t=(r_s+r_g)/V_0; Depth uses the half-distance.

Acquisition geometry

The line is auto-centred on the mesh footprint; you override the details here.

ParameterDefaultNotes
Strike (°)90Bedding strike of the target layering. 0 = North, increasing clockwise. The acquisition line is shot perpendicular to the strike — along the dip direction — making this a dip section: strike 0 runs the line East (+X); strike 90 runs it North–South (Y).
Dip (°)0The regional/bedding dip to flatten. 0 = a plain vertical section. With a dip set, the line is shot along the dip direction and the dip is removed, so dipping beds image as horizontal bands. Use the bedding/structural dip (typically shallow).
Get…Pick a nearby orientation measurement (the regional dip) to fill Strike and Dip from it. The measurements are listed nearest-first to the mesh; choosing one shoots the line perpendicular to that strike (along the dip) and flattens the dip.
Height above top100Stations sit this far above the top of the mesh.
Station spacing5Distance between stations (world units).
Number of stations200One trace per station.
Offset modeZero offsetZero offset co-locates source and receiver; Fixed offset separates them.
Offset distance0Source–receiver separation along the line when using fixed offset.
Flatten the regional dip

Leave Dip at 0 for a conventional vertical section. To flatten a regionally dipping sequence, click Get… and pick the nearest orientation measurement (or type a Strike and Dip): the line is shot along the dip (perpendicular to strike) and the regional dip is removed, so dipping beds read as horizontal bands.

Attribute layers

ParameterNotes
Facies layerPer-vertex facies/class used to detect contacts.
Impedance layerPer-vertex acoustic impedance used for RR and the gradient normal.

Working with the result

Select the Seismic Section in the tree to edit its display properties:

PropertyEffect
Clip min / maxAmplitude range mapped to the colormap. Leave both at 0 to auto-scale on first draw.
GainAmplitude multiplier.
Polarity flipNegates amplitudes.
OpacityPanel transparency (0–1).
ColormapDiverging RWB, Grayscale, Seismic (default), or Viridis.

The panel hangs from the acquisition line with sample 0 at the top and time (or depth) increasing into the section (across bedding for a flattened section). For a time axis, the vertical extent maps two-way time to depth using V0 / 2.

Amplitude, facies, and impedance layers

Each section carries three attribute layers under its tree node — Amplitude (the seismic), Facies, and Impedance. Click a layer to colour the panel by it: Amplitude uses the seismic colormaps and clip/gain/polarity above; Facies and Impedance use their own colour ramp over their value range. Each layer has a histogram and a value filter, so you can, for example, show only the reflections produced by one facies, or only impedance contrasts above a threshold — filtered and empty cells become transparent. The facies/impedance overlays are projected orthogonally onto the section plane (see above), so they read as the true geology rather than the diffraction pattern.

Persistence

The section — including its trace data and display state — is saved inside the project. It reappears, correctly positioned, when the project is reopened.

Tips and troubleshooting

"Load the mesh into memory" message

Create Seismic… needs the mesh resident in memory. Load it from the tree first, then retry.

  • "… attribute layer not found" — the chosen Facies or Impedance layer does not exist on the mesh. Pick existing layers, or classify/add the impedance attribute first.
  • The panel is blank / flat — most often there are no contacts: the mesh may be a single facies, or the impedance contrast is zero. Confirm the facies layer actually varies across the mesh and that impedance differs between facies.
  • A vertical fault barely shows — expected at zero offset. It diffracts off its tips; shoot fixed offsets or a custom trajectory to image it better.
  • Reflections look too thick or too thin — adjust the frequency (wavelet bandwidth) and dt (sampling).
  • Performance — cost scales with (reflecting facets × stations × samples). Very dense meshes with many stations take longer; the model runs in the background so the UI stays responsive. Reduce Number of stations or decimate the mesh for a faster preview.
  • Mesh classification (ANN Classify, facies painting) — produces the facies layer this tool reads.
  • Seismic Volume — for loading and displaying recorded SEG-Y data alongside your synthetic section.