Source code for pygeopressure.velocity.conversion

# -*- coding: utf-8 -*-
"""
Routines performing velocity type conversion
"""
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

from builtins import range

__author__ = "yuhao"

import numpy as np
from scipy import interpolate


[docs]def rms2int(twt, v_rms): r""" Convert rms velocity to interval velocity Parameters ---------- twt : 1-d ndarray input two-way-time array, in ms rms : 1-d nadarray rms velocity array, in m/s Returns ------- v_int : 1-d ndarray interval velocity array with the same length of twt and rms Notes ----- This routine uses Dix equation to comput inverval velocity. .. math:: V_{int}[i]^2 = \frac{V_{rms}[i]^2 t_{i} - V_{rms}[i-1]^2 \ t_{i-1}}{t_{i}-t_{i-1}} twt and rms should be of the same length of more than 2. Examples -------- >>> a = np.arange(10) >>> twt = np.arange(10) >>> rms2int(twt, a) array([ 0. , 1. , 2.64575131, 4.35889894, 6.08276253, 7.81024968, 9.53939201, 11.26942767, 13. , 14.73091986]) """ v_int = np.ones((len(twt), )) # v_int = np.copy(rms) twt = twt*0.001 v_int[0] = v_rms[0] v_int[1:] = np.sqrt( (v_rms[1:]**2 * twt[1:] - v_rms[:-1]**2 * twt[:-1]) / \ (twt[1:] - twt[:-1]) ) # for i in range(1, v_rms.shape[0]): # v_int[i] = np.sqrt( # (v_rms[i]**2 * twt[i] - v_rms[i-1]**2 * twt[i-1]) / \ # (twt[i] - twt[i-1]) # ) return v_int
[docs]def int2rms(twt, v_int): """ Parameters ---------- twt : 1-d ndarray v_int : 1-d ndarray Returns ------- v_rms : 1-d ndarray """ v_rms = np.ones((len(twt), )) twt = twt*0.001 v_rms[0] = v_int[0] # because of the accumulational effect of rms velocity, this func should # not use vectorized notation for i in range(1, v_int.shape[0]): v_rms[i] = np.sqrt( (v_int[i]**2 * (twt[i] - twt[i-1]) + v_rms[i-1]**2 * twt[i-1]) / twt[i] ) return v_rms
[docs]def int2avg(twt, v_int): r""" Parameters ---------- twt : 1-d ndarray v_int : 1-d ndarray Returns ------- v_avg : 1-d ndarray Notes ----- .. math:: V_{int}[i](t_{i} - t_{i-1}) = V_{avg}[i] t_{i} - \ V_{avg}[i-1] t_{i-1} """ v_avg = np.ones((len(twt), )) twt = twt * 0.001 v_avg[0] = v_int[0] for i in range(1, v_int.shape[0]): v_avg[i] = (v_avg[i-1] * twt[i-1] + v_int[i] * (twt[i] - twt[i-1])) / \ twt[i] return v_avg
[docs]def avg2int(twt, v_avg): """ Parameters ---------- twt : 1-d ndarray v_avg : 1-d ndarray Returns ------- v_int : 1-d ndarray """ v_int = np.ones((len(twt), )) twt = twt * 0.001 v_int[0] = v_avg[0] v_int[1:] = (v_avg[1:]*twt[1:] - v_avg[:-1]*twt[:-1]) /\ (twt[1:] - twt[:-1]) return v_int
[docs]def twt2depth(twt, v_avg, prop_2_convert, stepDepth=4, startDepth=None, endDepth=None): """ Parameters ---------- twt : 1-d ndarray v_avg : 1-d ndarray prop_2_convert: 1-d ndarray stepDepth : scalar startDpeth (optional): scalar endDepth (optional): scalar Returns ------- newDepth : 1-d ndarray new depth array new_prop_2_convert : 1-d ndarray average velocity in depth domain """ depth = np.ones((len(twt), )) twt = twt * 0.001 depth = twt * v_avg / 2.0 startDepth = depth[0] if startDepth is None else startDepth endDepth = depth[-1] if endDepth is None else endDepth newDepth = np.arange(startDepth, endDepth+0.01, stepDepth) f = interpolate.interp1d(depth, prop_2_convert, kind='cubic') new_prop_2_convert = f(newDepth) return (newDepth, new_prop_2_convert)