Ejemplo n.º 1
0
def optimize_bowers_trace(depth_tr, vel_tr, obp_tr, hydro_tr,
                          depth_upper, depth_lower):

    es_data = np.array(obp_tr) - np.array(hydro_tr)
    depth = np.array(depth_tr)

    mask = depth < depth_lower
    mask *= depth > depth_upper

    vel_interval = np.array(vel_tr)[mask]
    es_interval = es_data[mask]

    vel_to_fit = pick_sparse(vel_interval, 3)
    es_to_fit = pick_sparse(es_interval, 3)

    popt, _ = curve_fit(virgin_curve, es_to_fit, vel_to_fit)
    a, b = popt

    return a, b
Ejemplo n.º 2
0
def optimize_bowers_trace(depth_tr, vel_tr, obp_tr, hydro_tr, depth_upper,
                          depth_lower):

    es_data = np.array(obp_tr) - np.array(hydro_tr)
    depth = np.array(depth_tr)

    mask = depth < depth_lower
    mask *= depth > depth_upper

    vel_interval = np.array(vel_tr)[mask]
    es_interval = es_data[mask]

    vel_to_fit = pick_sparse(vel_interval, 3)
    es_to_fit = pick_sparse(es_interval, 3)

    popt, _ = curve_fit(virgin_curve, es_to_fit, vel_to_fit)
    a, b = popt

    return a, b
Ejemplo n.º 3
0
def optimize_nct_trace(depth, vel, fit_start, fit_stop, pick=True):

    mask = depth > fit_start
    mask *= depth < fit_stop
    mask *= np.isfinite(vel)

    depth_interval = np.array(depth)[mask]
    vel_interval = np.array(vel)[mask]

    if pick is True:
        depth_to_fit = pick_sparse(depth_interval, 3)
        vel_to_fit = pick_sparse(vel_interval, 3)
    else:
        depth_to_fit = depth_interval
        vel_to_fit = vel_interval

    dt = vel_to_fit**(-1)
    log_dt = np.log(dt)

    popt, _ = curve_fit(normal_dt, depth_to_fit, log_dt)
    a, b = popt

    return a, b
Ejemplo n.º 4
0
def optimize_nct_trace(depth, vel, fit_start, fit_stop, pick=True):

    mask = depth > fit_start
    mask *= depth < fit_stop
    mask *= np.isfinite(vel)

    depth_interval = np.array(depth)[mask]
    vel_interval = np.array(vel)[mask]

    if pick is True:
        depth_to_fit = pick_sparse(depth_interval, 3)
        vel_to_fit = pick_sparse(vel_interval, 3)
    else:
        depth_to_fit = depth_interval
        vel_to_fit = vel_interval

    dt = vel_to_fit**(-1)
    log_dt = np.log(dt)

    popt, _ = curve_fit(normal_dt, depth_to_fit, log_dt)
    a, b = popt

    return a, b
Ejemplo n.º 5
0
def optimize_bowers_virgin(well, vel_log, obp_log, upper, lower,
                           pres_log='loading', mode='nc', nnc=5):
    """
    Optimizer for Bowers loading curve

    Parameters
    ----------
    well : Well
    vel_log : Log or str
        Log object or well log name stored in well
    obp_log : Log or str
        Log object or well log name stored in well
    upper : float or str
        upper bound of nct, depth value or horizon name
    lower : float or str
        lower bound of nct, depth value or horizon name
    pres_log : Log or str
        Log object storing measured pressure value or Pressure name
        stored in well
    mode : {'nc', 'pres', 'both'}
        which pressure to use for optimization,
        - 'nc' : points on NCT
        - 'pres' : points in pres_log
        - 'both' : both of them
    nnc : int
        number of points to pick on NCT

    Returns
    -------
    a, b : tuple of floats
        optimized bowers loading curve coefficients
    rms_err : float
        root mean square error of pressure
    """
    if isinstance(upper, (bytes, str)):
        depth_upper = well.params['horizon'][upper]
    else:
        depth_upper = upper
    if isinstance(upper, (bytes, str)):
        depth_lower = well.params['horizon'][lower]
    else:
        depth_lower = lower
    if isinstance(vel_log, (bytes, str)):
        vel_log = well.get_log(vel_log)
    if isinstance(obp_log, (bytes, str)):
        obp_log = well.get_log(obp_log)
    if isinstance(pres_log, (bytes, str)):
        # pres_log = well.get_loading_pressure()
        pres_log = well.get_pressure(pres_log)
    depth = np.array(obp_log.depth)

    nct_vel_to_fit = []
    nct_es_to_fit = []
    pres_vel_to_fit = []
    pres_es_to_fit = []
    if mode == 'nct' or mode == 'both':
        nct_es_data = np.array(obp_log.data) - np.array(well.hydrostatic)
        nct_mask = depth < depth_lower
        nct_mask *= depth > depth_upper
        nct_mask *= depth < vel_log.stop

        nct_vel_interval = np.array(vel_log.data)[nct_mask]
        nct_es_interval = nct_es_data[nct_mask]

        nct_vel_to_fit = np.array(pick_sparse(nct_vel_interval, nnc))
        nct_es_to_fit = np.array(pick_sparse(nct_es_interval, nnc))
    if mode == 'pres' or mode == 'both':
        vel = list()
        obp = list()
        pres = list()
        for dp in pres_log.depth:
            idx = np.searchsorted(depth, dp)
            vel.append(vel_log.data[idx])
            obp.append(obp_log.data[idx])
        vel, obp, pres = np.array(vel), np.array(obp), np.array(pres_log.data)
        es = obp - pres

        pres_vel_to_fit = vel
        pres_es_to_fit = es
    vel_to_fit = np.append(nct_vel_to_fit, pres_vel_to_fit)
    es_to_fit = np.append(nct_es_to_fit, pres_es_to_fit)

    popt, _ = curve_fit(virgin_curve, es_to_fit, vel_to_fit)
    a, b = popt

    es_predicted = invert_virgin(vel_to_fit, a, b)
    rms_err = rmse(es_to_fit, es_predicted)

    return a, b, rms_err
Ejemplo n.º 6
0
def optimize_bowers_virgin(well,
                           vel_log,
                           obp_log,
                           upper,
                           lower,
                           pres_log='loading',
                           mode='nc',
                           nnc=5):
    """
    Optimizer for Bowers loading curve

    Parameters
    ----------
    well : Well
    vel_log : Log or str
        Log object or well log name stored in well
    obp_log : Log or str
        Log object or well log name stored in well
    upper : float or str
        upper bound of nct, depth value or horizon name
    lower : float or str
        lower bound of nct, depth value or horizon name
    pres_log : Log or str
        Log object storing measured pressure value or Pressure name
        stored in well
    mode : {'nc', 'pres', 'both'}
        which pressure to use for optimization,
        - 'nc' : points on NCT
        - 'pres' : points in pres_log
        - 'both' : both of them
    nnc : int
        number of points to pick on NCT

    Returns
    -------
    a, b : tuple of floats
        optimized bowers loading curve coefficients
    rms_err : float
        root mean square error of pressure
    """
    if isinstance(upper, (bytes, str)):
        depth_upper = well.params['horizon'][upper]
    else:
        depth_upper = upper
    if isinstance(upper, (bytes, str)):
        depth_lower = well.params['horizon'][lower]
    else:
        depth_lower = lower
    if isinstance(vel_log, (bytes, str)):
        vel_log = well.get_log(vel_log)
    if isinstance(obp_log, (bytes, str)):
        obp_log = well.get_log(obp_log)
    if isinstance(pres_log, (bytes, str)):
        # pres_log = well.get_loading_pressure()
        pres_log = well.get_pressure(pres_log)
    depth = np.array(obp_log.depth)

    nct_vel_to_fit = []
    nct_es_to_fit = []
    pres_vel_to_fit = []
    pres_es_to_fit = []
    if mode == 'nct' or mode == 'both':
        nct_es_data = np.array(obp_log.data) - np.array(well.hydrostatic)
        nct_mask = depth < depth_lower
        nct_mask *= depth > depth_upper
        nct_mask *= depth < vel_log.stop

        nct_vel_interval = np.array(vel_log.data)[nct_mask]
        nct_es_interval = nct_es_data[nct_mask]

        nct_vel_to_fit = np.array(pick_sparse(nct_vel_interval, nnc))
        nct_es_to_fit = np.array(pick_sparse(nct_es_interval, nnc))
    if mode == 'pres' or mode == 'both':
        vel = list()
        obp = list()
        pres = list()
        for dp in pres_log.depth:
            idx = np.searchsorted(depth, dp)
            vel.append(vel_log.data[idx])
            obp.append(obp_log.data[idx])
        vel, obp, pres = np.array(vel), np.array(obp), np.array(pres_log.data)
        es = obp - pres

        pres_vel_to_fit = vel
        pres_es_to_fit = es
    vel_to_fit = np.append(nct_vel_to_fit, pres_vel_to_fit)
    es_to_fit = np.append(nct_es_to_fit, pres_es_to_fit)

    popt, _ = curve_fit(virgin_curve, es_to_fit, vel_to_fit)
    a, b = popt

    es_predicted = invert_virgin(vel_to_fit, a, b)
    rms_err = rmse(es_to_fit, es_predicted)

    return a, b, rms_err
Ejemplo n.º 7
0
def plot_bowers_vrigin(ax,
                       a,
                       b,
                       well,
                       vel_log,
                       obp_log,
                       upper,
                       lower,
                       pres_log='loading',
                       mode='nc',
                       nnc=5):
    if isinstance(upper, (bytes, str)):
        depth_upper = well.params['horizon'][upper]
    else:
        depth_upper = upper
    if isinstance(upper, (bytes, str)):
        depth_lower = well.params['horizon'][lower]
    else:
        depth_lower = lower
    if isinstance(vel_log, (bytes, str)):
        vel_log = well.get_log(vel_log)
    if isinstance(obp_log, (bytes, str)):
        obp_log = well.get_log(obp_log)
    if isinstance(pres_log, (bytes, str)):
        # pres_log = well.get_loading_pressure()
        pres_log = well.get_pressure(pres_log)

    depth = np.array(obp_log.depth)

    nct_vel_to_fit = []
    nct_es_to_fit = []
    pres_vel_to_fit = []
    pres_es_to_fit = []
    if mode == 'nct' or mode == 'both':
        nct_es_data = np.array(obp_log.data) - np.array(well.hydrostatic)
        nct_mask = depth < depth_lower
        nct_mask *= depth > depth_upper
        nct_mask *= depth < vel_log.stop

        nct_vel_interval = np.array(vel_log.data)[nct_mask]
        nct_es_interval = nct_es_data[nct_mask]

        nct_vel_to_fit = np.array(pick_sparse(nct_vel_interval, nnc))
        nct_es_to_fit = np.array(pick_sparse(nct_es_interval, nnc))
        ax.scatter(nct_es_to_fit,
                   nct_vel_to_fit,
                   color='blue',
                   marker='d',
                   label='NCP')
    if mode == 'pres' or mode == 'both':
        vel = list()
        obp = list()
        pres = list()
        for dp in pres_log.depth:
            idx = np.searchsorted(depth, dp)
            vel.append(vel_log.data[idx])
            obp.append(obp_log.data[idx])
        vel, obp, pres = np.array(vel), np.array(obp), np.array(pres_log.data)
        es = obp - pres

        pres_vel_to_fit = vel
        pres_es_to_fit = es
        ax.scatter(pres_es_to_fit,
                   pres_vel_to_fit,
                   color='purple',
                   marker='s',
                   label='measured')

    es_curve = np.arange(0, 80, 1)
    vel_curve = virgin_curve(es_curve, a, b)
    ax.plot(es_curve, vel_curve, color='black', zorder=1, label="Loading")

    ax.set(title="Loading Curve - {}".format(well.well_name),
           xlabel="Effective Stress(MPa)",
           ylabel="Velocity(m/s)")
    ax.set_xlim(left=0)
    ax.set_ylim(bottom=1500)

    ax.legend(loc=4)
Ejemplo n.º 8
0
def plot_bowers_vrigin(ax, a, b, well, vel_log, obp_log, upper, lower,
                       pres_log='loading', mode='nc', nnc=5):
    if isinstance(upper, (bytes, str)):
        depth_upper = well.params['horizon'][upper]
    else:
        depth_upper = upper
    if isinstance(upper, (bytes, str)):
        depth_lower = well.params['horizon'][lower]
    else:
        depth_lower = lower
    if isinstance(vel_log, (bytes, str)):
        vel_log = well.get_log(vel_log)
    if isinstance(obp_log, (bytes, str)):
        obp_log = well.get_log(obp_log)
    if isinstance(pres_log, (bytes, str)):
        # pres_log = well.get_loading_pressure()
        pres_log = well.get_pressure(pres_log)

    depth = np.array(obp_log.depth)

    nct_vel_to_fit = []
    nct_es_to_fit = []
    pres_vel_to_fit = []
    pres_es_to_fit = []
    if mode == 'nct' or mode == 'both':
        nct_es_data = np.array(obp_log.data) - np.array(well.hydrostatic)
        nct_mask = depth < depth_lower
        nct_mask *= depth > depth_upper
        nct_mask *= depth < vel_log.stop

        nct_vel_interval = np.array(vel_log.data)[nct_mask]
        nct_es_interval = nct_es_data[nct_mask]

        nct_vel_to_fit = np.array(pick_sparse(nct_vel_interval, nnc))
        nct_es_to_fit = np.array(pick_sparse(nct_es_interval, nnc))
        ax.scatter(
            nct_es_to_fit, nct_vel_to_fit, color='blue', marker='d',
            label='NCP')
    if mode == 'pres' or mode == 'both':
        vel = list()
        obp = list()
        pres = list()
        for dp in pres_log.depth:
            idx = np.searchsorted(depth, dp)
            vel.append(vel_log.data[idx])
            obp.append(obp_log.data[idx])
        vel, obp, pres = np.array(vel), np.array(obp), np.array(pres_log.data)
        es = obp - pres

        pres_vel_to_fit = vel
        pres_es_to_fit = es
        ax.scatter(
            pres_es_to_fit, pres_vel_to_fit, color='purple', marker='s',
            label='measured')

    es_curve = np.arange(0, 80, 1)
    vel_curve = virgin_curve(es_curve, a, b)
    ax.plot(es_curve, vel_curve, color='black', zorder=1, label="Loading")

    ax.set(title="Loading Curve - {}".format(well.well_name),
           xlabel="Effective Stress(MPa)",
           ylabel="Velocity(m/s)")
    ax.set_xlim(left=0)
    ax.set_ylim(bottom=1500)

    ax.legend(loc=4)