Wedge model and synthetic
A wedge model places a thin layer of one rock inside another, thickening from nothing at one end. Convolving its reflection coefficients with a wavelet gives a synthetic seismic section; where the top and base reflections of the wedge interfere most, the amplitude is largest. That thickness is the tuning thickness.
Ophiolite keeps three kinds of result here, each a small text file:
| Result | Holds | Made from |
|---|---|---|
| Wavelet | samples at a fixed interval (Make a wavelet) | a formula |
| Rock model section | a grid of rock numbers and, per rock, a name, P-wave velocity (m/s) and density (kg/m3) | the well log the rocks were measured on |
| Seismic section | a grid of values, two-way time down and distance across | exactly one rock model and one wavelet |
A synthetic section is published from its model and wavelet, never uploaded (“A synthetic section is published from its model and wavelet, not uploaded.”), and it records the exact version of each.
The examples use an excerpt of the HON-GT-01 composite log from NLOG.NL (DT and RHOB from 2479.8 to 2620.4 m; only the depth rows and the DEPTH, DT and RHOB curves were kept). The two rocks are the Rodenrijs Claystone (2480.0 to 2557.9 m) and the Delft Sandstone (2557.9 to 2620.22 m).
In the browser
Section titled “In the browser”Open the synthetic in Data: its Type reads “Synthetic seismic section” and its Method “Convolution of a rock model with a wavelet”.
- Made from lists “Rock model: Wedge model, Rodenrijs Claystone and Delft Sandstone (version 1)” and “Wavelet: Ricker 30 Hz (version 1)”, each with Open.
- The section is drawn in grey, symmetric around zero: “Two-way time 0 to 199 ms, every 1 ms. Distance 0 to 1500 m, every 25 m.” Click it or move with the arrow keys; the readout gives the stored value, for example “Distance 325 m, time 93 ms, value 0.08092525942667446”.
- Open the wavelet to see its shape, samples and frequency content; Back to Wedge synthetic, 30 Hz Ricker returns. Open the model to see its rocks in colour and the table “Rock / P-wave velocity / Density”; Back returns.
Opening is by exact version: when the model has a version 2, Open shows version 1 and says “This is version 1 of 2; a newer version exists.” An input you may not read is named by its role only: “A rock model you cannot open.” or “A wavelet you cannot open.”
In Python
Section titled “In Python”client is an ophiolite.Client for your project; see Build on Ophiolite for a key and the SDK.
Read DT and RHOB of the log and take, for each interval, the median P-wave velocity (304800 / DT, with DT in us/ft) and
the median density of the rows where both are present. An interval includes its top and not its base:
import statistics
log = next(a for a in client.assets() if a["name"] == "HON-GT-01 sonic and density")dt, rhob = client.read(log["asset_id"], log["revision"], ["DT", "RHOB"]).curvesrows = [(round(d, 3), 304800 / s, r * 1000) for d, s, r in zip(dt.axis, dt.values, rhob.values) if s is not None and r is not None]intervals = {"Rodenrijs Claystone": (2480.0, 2557.9), "Delft Sandstone": (2557.9, 2620.22)}rocks, counts = [], []for name, (top, base) in intervals.items(): inside = [(vp, rho) for d, vp, rho in rows if top <= d < base] counts.append(len(inside)) rocks.append({"name": name, "vp": float(round(statistics.median(v for v, _ in inside))), "density": float(round(statistics.median(r for _, r in inside)))}) print(f"{name}: {len(inside)} rows, {rocks[-1]['vp']:.0f} m/s, {rocks[-1]['density']:.0f} kg/m3")This prints 779 rows, 4073 m/s and 2629 kg/m3 for the claystone, and 624 rows, 4024 m/s and 2379 kg/m3 for the sandstone. Build the wedge (200 samples every 1 ms, 61 traces every 25 m; trace i holds i samples of sandstone from 80 ms), convolve it with a 30 Hz Ricker wavelet and read the tuning thickness:
from ophiolite.synthetics import ricker, synthetic, tuning_thickness, wedge
model = wedge(rocks)wavelet = ricker(30, 0.001, duration=0.128)section = synthetic(model, wavelet)tuning = tuning_thickness(section)print(f"Tuning thickness: {tuning.thickness * 1000:.0f} ms two-way time at trace {tuning.trace}")This prints Tuning thickness: 13 ms two-way time at trace 13, about 26 m at the sandstone’s velocity. Nothing is
resampled: a model and a wavelet with different sample intervals are refused. Publish the three. The model records the
log it was measured on, and the synthetic its model and wavelet at their exact versions:
import uuidfrom ophiolite.typed import ModelSection, SeismicSection, Wavelet
made = client.publish_derived(ModelSection.write(model), name="Wedge model, Rodenrijs Claystone and Delft Sandstone", from_=[(log["asset_id"], log["revision"])], method=model.method, command_id=str(uuid.uuid4()))uploaded = client.upload_data(Wavelet.write(wavelet).bytes, profile="wavelet-text/1", name="Ricker 30 Hz", filename="ricker-30.txt", attribution="Computed with ophiolite.synthetics", audience=[], rights_confirmed=True, command_id=str(uuid.uuid4()))published = client.publish_derived(SeismicSection.write(section), name="Wedge synthetic, 30 Hz Ricker", method=section.method, from_=[(made.asset_id, made.revision), (uploaded.asset_id, uploaded.revision)], command_id=str(uuid.uuid4()))read = client.read_data(published.asset_id, published.revision)print(read.origin, "section,", len(read.grid), "samples by", len(read.grid[0]), "traces; tuning at trace", tuning_thickness(read).trace)read_data returns the grid exactly as published. All three results are private to you until you share them.
A refusal says what to do. PermissionRefused: you may read the log but not build on it (ask its owner to allow reuse),
or your role in the project does not let you publish. “A synthetic section is made from a rock model and a wavelet;
name both.”: from_ must list exactly one rock model and one wavelet. ValidationFailed from ophiolite.synthetics
names the problem, for example “The model is sampled every 0.001 s and the wavelet every 0.002 s; make them equal
(nothing is resampled).”; nothing was published.
To try the same steps without a project, download the Make a wedge model notebook: it uses the rock values above and computes everything on your own computer.
