depth conversion with Gocad


Gocad offers conversion of horizons and seismic in the time domain to the depth domain and vice versa. A velocity model is required in the form of a voxet.

Here we will go through a time to depth conversion of a 2d seismic survey in the Sichuan basin using a velocity model provided in depth.

The basic steps are:

  1. prepare velocity model: smoothing and replacement of infill velocities; truncate/extend to expected seismic datum of survey
  2. time convert velocity model using itself: shift top to 0; calculate average velocity; use linear interpolation at conversion
  3. prepare time converted velocity model: recalculate average velocity in time converted velocity model; requires replacement of any no-data values with infill velocity
  4. depth convert seismic survey: define sub-region in model; transfer average velocity to seismic survey as additional property; depth convert

Prepare Velocity Model


In order to avoid any ungeologic features being introduced by the depth conversion it is often advisable to severely smooth an existing velocity model. As a result it should have very gradual changes in velocity which will then preserve geometries imaged by careful processing of the seismic and avoid artefacts.

We can use the Compute-Apply Median/Average Filter for Voxets which applies a running average. It is necessary to experiment with the window size. Given the CVM velocity model of the Sichuan basin a 2 by 2 by 10 half window length size was picked. This model also has a very fast layer which was smoothed out by the filter but increases average velocities. So another depth conversion with a velocity model with more regular velocities in this layer was also performed. It is possible to simply replace velocities in this layer with no-data values and refilter. The filter will replace the no-data with average values.

Replace Infill Velocity

The smoothing will smear out velocities into the above ground/sea floor level. It is necessary to reassign proper velocities for these regions. For offshore surveys the seismic velocity of water is often used (1480 m/s). For onshore surveys there is no standard. Sometimes the seismic datum (the elevation where travel time in the processed seismic is set to 0ms) is set below the ground surface because imaging is not viable close to the ground. In this case there is no need for an infill velocity. If the seismic data do include above ground levels, it is necessary to find out about the infill velocity. Ideally it is known from the processing of the seismic. If not, it can be estimated by knowing the seismic datum (s) and the position of the ground level in time (two way travel time) in the seismic (twt) and the corresponding elevation (e). The ratio of the difference between the seismic datum and the ground level (s-e) and the travel time (twt) is the infill velocity. Here is how this can be accomplished for a large number of trace position:

  1. digitize ground level on seismic as curve in time (twt)
  2. transfer elevation from DEM (e) to ground level curve
  3. use 2d cross plot to plot elevation versus time; the average slope is the average infill velocity

In the example this procedure results in 1600 m/s. Since this calculation uses two way time, the result needs to be doubled to convert to interval velocity. In the example paper records shows infill velocities of 3500 m/s and 4000 m/s. Therefore a value of 3500 m/s was adopted.

Truncate/Extend to Seismic Datum

It is necessary to have the top of the velocity model at the same elevation as the seismic datum of the seismic survey to be depth converted. This is a limitation of how gocad implements the depth conversion. Although the depth conversion function gocad offers has a way to provide it with an arbitrary seismic datum it is inconsistent on how it uses that information and is better be managed carefully by the user directly.

If the seismic datum of the seismic survey is not known, it has to be estimated. Sea level is often used but there is no standard. Well tops can help if their position is known in time and depth. Seismic interpretation software may have project information which includes the seismic datum. If the source of the seismic survey in gocad is such software, this can be helpful. For example, Seisworks has a setting for a default seismic datum. Finally, if the ground level in the seismic data can be identified, its elevation can be looked up from a DEM. Its elevation should correspond to the seismic datum in the positions where it approaches 0ms travel time. In the example the seismic datum 2000 m asl.

It is convenient to use New-Extracted from Voxet to crop the velocity model such that its top is identical to the seismic datum. In the example it was cropped from 7000m asl to 2000 m asl.

Time Convert Velocity Model

Shift Top to 0

After making sure that the top of the model corresponds to the seismic datum, it is necessary to shift the complete model vertically. As a result the top of the model will need to be at 0m elevation. This is necessary because the implementation of the computation of the average velocity works correctly only that way. In effect, the implementation assumes that the seismic datum is at 0 m. Use Tools-Resize Voxet with Vectors and provide a new Z value for the origin which will then shift the voxet to proper amount. In the example, the origin was at 40000 m depth and the voxet needed to be shifted down 2000 m after truncation. So the new Z value became 42000 m.

Calculate Average Velocity

We will need to calculate the average velocity because the depth conversion requires it as input rather than interval velocities. The average velocity is simply the sum of all velocity samples above the point of interest divided by the number of samples. For depth conversion the average velocity will then multiplied by the travel time to arrive at depth. In addition the depth conversion also needs to interpolate between points of known depth because the depth grid will not coincide with those points. In order to calculate the average velocity, use Convert Velocity Type: In One Domain. The Input Velocity is the smoothed and filled interval velocity of the model, the Velocity Type is Depth Interval and the Unit is m/s (one way time). The output velocity can be named v_ave, and has a Velocity Type of Depth Average. Visually quality check the result. The property should be smooth and increase in value downwards except above ground where it should be constant.

Time Convert the Velocity Model

Now we are prepared to time convert the model. It is constructed and provided in the depth domain. In order to apply it to depth conversion of seismic surveys in the time domain, the model itself also needs to be in the time domain. We can use the Time-Depth Conversion-Convert Seismic Cube function. The Voxet Seismic is the prepared velocity model voxet, the Seismic Properties are the original interval velocity, the smoothed and filled velocity and the calculated average velocity (v_ave).  We need to pick Depth to Time Conversion. Later, we will actually recalculate the average velocity in the time converted model but it is helpful to cross-check the results with the average velocity calculated in the previous step. For the Voxet Velocity Cube we also pick the prepared velocity model voxet. There is no problem using the same object again here. The Average Velocity is v_ave, and associated Velocity Unit m/s is (two way time). We need to pick two way time since the desired output should be in two way time. The Output Voxet Name can be time_VelMod, for example. The Starting Z should be 0 and the Ending Z as high as the deepest level of the seismic survey to be depth convert in milliseconds (for example 12000). The Number of Depth/Time Steps should be sufficiently high to capture the velocity model structure and have good control over the mapping of the model velocities to the seismic data. Since the seismic data often have a resolution of 4 ms, it makes sense to provide a number of time steps which results in a resolution of 4 ms for the time converted velocity model as well. In the example we provide 3000. The settings of the seismic output property are 32bit, unchecked Is signed and Store in memory (if available). It is very important to choose linear interpolation as Interpolation Method, not wavelet interpolation. Wavelet interpolation is meant to be used for actual seismic data, not velocity data. Finally, the Seismic Reference Datum needs to be set as Constant and at 0.

Prepare Time Converted Velocity Model

Replace no-data values

During the time conversion of the model, some no-data values are likely to be introduced to the time converted model when the process is not able to map corresponding depth data. These no-data values need to be replaced by reasonable values. In the example, no-data values show up at the top of model, in the region of infill velocities. We can use a property script to look for no-data (-99999 by default) or other unreasonable values such as negative velocities, and replace those with more reasonable values, such as the constant infill velocity in the example. We do this for the smoothed and filled interval velocities. Such a property script could simply read:

if (v_int_smooth_filled < 0){v_int_smooth_filled = 3500;}

and needs to applied to the time converted model (time_VelMod). If the time converted model was specified as reaching too deep, no-data values will appear at the bottom, and will need to be treated similarly.

Recalculate Average Velocity

Let's now recalculate the average velocity, this time in the time domain. In order to calculate the average velocity, use Convert Velocity Type: In One Domain. The Input Velocity is the smoothed and filled interval velocity of the model, the Velocity Type is two way time interval and the Unit is m/s (two way time). The output velocity can be named v_ave_t, and has a Velocity Type of two way time average. The result (v_ave_t) should be very similar to the average velocity calculated in the depth domain (v_ave) but without no-data values. We need the average velocity to depth convert the seismic survey in the next step.

Depth Convert Seismic Survey

Define Sub-Region in Model

This step is strictly not necessary but can critically speed up the transfer of the average velocity property to lines in the seismic survey, especially in cases with many lines and where the velocity model is much larger than the foot print of the survey. We need to define the region within the velocity model which actually covers the seismic survey. A convenient way to define this region is by first digitizing a closed curve or rectangle around the seismic survey in map view. In the example the curve is called survey_border. Then we can use this closed curve to define a region in the voxet by using the function Region-create inside closed polygons. As region name we can use survey, and the Curve Polygon will be the digitized curve (survey_border).

Transfer Average Velocity to Survey

The depth conversion function for 2d surveys requires that the average velocity is transferred to the survey as a property. In the Voxet menu use Property-Transfer From Nearby Grid Node or Cell in order to do so. The Point Property Client is the 2d survey to be depth converted, the Region for it is everywhere, the New Property Name can be v_ave_t, the Point Property Server is the time converted velocity model (time_VelMod), the From Region is the region defined in the previous step (survey), and the Property is the average velocity (v_ave_t). This step will iterate through all lines in the survey. If there are many lines this can take some time.

Depth Convert Survey

Finally, we can depth convert the survey. There will be two steps. First, depth convert with a seismic datum of 0m. Second, shift depth converted survey to the actual seismic datum (2000m in the example). We will use the function Time-Depth Conversion-2D Survey Conversion. The 2D Survey Object is the survey to be depth converted, the Seismic Properties are its data properties (seismic by default), the Average Velocity is the average velocity transferred from the model (v_ave_t), the Velocity Unit is m/s (two way time), the Output Survey Name can be survey_depth, Starting Z is 0 and Ending Z is the maximum depth to be preserved (15000 in the example). The Number of Depth/Time Steps needs to be sufficient to preserve the resolution of the time data. Use a number similar to or somewhat higher than what the time survey grid has. In the example we use 3000. The Interpolation Method is wavelet interpolation, and the seismic reference datum is set to constant at 0.

After the depth conversion is completed, we need to shift the survey to the seismic datum. Use Tools-Move in the 2D Survey menu. Pick the depth converted survey (survey_depth) as Objects, choose Translate, and give the amount to be shifted as the Z component for the Translation (-2000 in example).

Finally, check the depth converted survey for unreasonably warped areas, reasonable dips and compare the vertical positioning of the ground level in the data with a DEM.

Floating Datum

The situation:

- velocity model is in time and has a floating datum. A floating datum varies with location. Often a floating datum is provided as a depth surface of where travel time is 0 ms in the seismic data. Here the floating datum is provided a a time surface of where elevation is 400 m a.s.l. This is called a TWT datum correction.

- the seismic data is 3d and has a delayed recording time specified in the binary trace header of the SEGY file. Gocad imports the SEGY file but puts the first sample in each trace at 0 ms. This was not consistent with the time scale on printed views of the data, and thus it was recognized that the delayed recording time (delrt) field needed to be taken into account. Fortunately, the delrt field is either -992 ms or -996 ms in all traces and can be considered constant. A simple shift of the imported voxet by -992 ms (upwards) then provides essentially correct times.

- as a result the seismic data has data with negative times.


- conceptually, it would be most straightforward to first apply the TWT datum correction to the seismic data by shifting each trace so that 0 ms corresponds to the 400 m a.s.l. datum. Then one could essentially follow the regular depth conversion steps as outline above. However, there is no easy way to do this, especially with a large voxet.

- Gocad has the capability to specify a floating datum for depth conversion. It expects a 2d grid with the depth at 0 ms. Therefore it is necessary to derive this floating datum from the provided TWT datum correction.

.. continued (but abandoned due to availability of time-depth well data).

Time-Depth tables at wells from check shot surveys

The situation:

In addition to stacking velocities well time-depth tables are available which were derived from checkshot surveys and carefully calibrated using prominent reflector of known depth. The goal is a velocity model which reproduces the time-depth pairs at well locations but is also benign in that it does not introduce sharp artefacts into the depth converted reflection seismic. This can be difficult because the original calibration may have been focussed on a reservoir level and been done without regard to realistic interval velocities at other levels, eg. time-depth tables at times imply extremely high interval velocities. Another complication is again the datum which may be defined below the surface, and as a consequence requires negative times in wells which sit high above the datum. This is problematic because depth conversion requires the calculation of average velocity which becomes inaccurate around 0s time (the datum level).


- time - depth tables need to be treated carefull since they may or may not have a time shift applied. Check if the datum level (say 400m) actually correponds to 0s time in the tables. If not, the times need to be shifted as the situation requires.


- calculate interval velocities from time-depth: the idea is that we will later shift the time-converted wells to deal with the datum, and will then need the interval velocities since they are independent from the datum. (abandoned)

- add one second to times in wells to avoid negative times, and calculate average velocity with new time and adjusted datum. new datum is old datum plus 1500m (for 1 second and 3km/s replacement velocity), eg. 400m + 1500m = 1900m.

[- time convert wells based strictly on time-depth tables: Gocal allows this, but it is unclear how the conversion is done outside the defined depth range of the table. It appears that gocad calculates the average velocity first. Probably it then extends the average velocity at the limits of the data range to the complete well.]

- time convert wells based on new average velocity which has better characteristics. However, it may still be necessary to micro-edit the average velocities if some problems in the original time-depth tables had not caught.

- then populate voxet with new well average velocities. For interpolation the additional property range constraint is very useful to stay within reasonable velocities outside the data are. Make sure to get a smooth model.

- now 0s (the datum) is at unknown higher level. To determine this level, depth convert 1s level (time 2dgrid) and observe difference to known level of original datum (400m). eg Z = 400 - Z; should be around 1900m.

- shift seismic up by one second to avoid negative times and to align with vel. model.

- Use 2dgrid as floating datum for time depth conversion of seismic.

- double check if well bottoms are at expected depth converted reflectors

- depth converted 2d seismic has data above well level in some places. However, the datum (0ms) is at the corret level (400m). This means that between 400m and the surface the average velocities are a bit too fast, eg. stretch too much, by about a factor of 2. The required modifications of the velocity model in that shallow depth range would lead to high gradients, eg. crowding relative to the time data.