Source code for well_profile.generator

from math import atan, degrees, radians, asin
from numpy import linspace
import pandas as pd
from .load_trajectory import load


[docs]def two_points(points, inner_points=20): """ Arguments: points: {'kickoff':{'north': num, 'east': num, 'tvd': num}, 'target': {'north': num, 'east': num, 'tvd': num}} inner_points: number of points between curved zone Returns: a wellpath object with 3D position """ if 'north' not in points['kickoff']: points['kickoff']['north'] = 0 if 'east' not in points['kickoff']: points['kickoff']['east'] = 0 point_1 = points['kickoff'] point_2 = points['target'] # set first section trajectory = [{'md': 0, 'inc': 0, 'azi': 0}, {'md': point_1['tvd'], 'inc': 0, 'azi': 0}] # calculate deltas delta = {'vertical': point_2['tvd'] - point_1['tvd'], 'north': point_2['north'] - point_1['north'], 'east': point_2['east'] - point_1['east']} delta['horizontal'] = (delta['north']**2 + delta['east']**2)**0.5 # Define azimuth azimuth = 0 if delta['north'] != 0 and delta['east'] != 0: beta = degrees(atan(delta['north'] / delta['east'])) if delta['east'] > 0: azimuth = 90 - beta else: azimuth = 270 - beta else: if delta['north'] == 0: if delta['east'] > 0: azimuth = 90 else: azimuth = 270 if delta['east'] == 0: if delta['north'] > 0: azimuth = 0 else: azimuth = 180 # 3 cases comparing vertical and horizontal displacement steps = inner_points + 1 if delta['vertical'] == delta['horizontal']: radius = delta['horizontal'] theta = 90 arc = radius * radians(theta) new_md = linspace(point_1['tvd']+arc/steps, point_1['tvd']+arc, steps) new_inc = linspace(theta/steps, theta, steps) for md, inc in zip(new_md, new_inc): trajectory.append({'md': md, 'inc': inc, 'azi': azimuth}) well = load(pd.DataFrame(trajectory), equidistant=False, set_start=point_1) return well if delta['vertical'] < delta['horizontal']: # curve section radius = delta['vertical'] theta = 90 arc = radius * radians(theta) new_md = linspace(point_1['tvd'] + arc / steps, point_1['tvd'] + arc, steps) new_inc = linspace(theta / steps, theta, steps) for md, inc in zip(new_md, new_inc): trajectory.append({'md': md, 'inc': inc, 'azi': azimuth}) # horizontal section trajectory.append({'md': trajectory[-1]['md']+(delta['horizontal']-delta['vertical']), 'inc': 90, 'azi': trajectory[-1]['azi']}) well = load(pd.DataFrame(trajectory), equidistant=False, set_start=point_1) return well if delta['vertical'] > delta['horizontal']: if delta['horizontal'] != 0: radius = (delta['horizontal']**2 + delta['vertical']**2)/(2*delta['horizontal']) theta = degrees(asin(delta['vertical']/radius)) arc = radius * radians(theta) new_md = linspace(point_1['tvd'] + arc / steps, point_1['tvd'] + arc, steps) new_inc = linspace(theta / steps, theta, steps) else: new_md = [point_2['tvd']] new_inc = [0] for md, inc in zip(new_md, new_inc): trajectory.append({'md': md, 'inc': inc, 'azi': azimuth}) well = load(pd.DataFrame(trajectory), equidistant=False, set_start=point_1) return well