In [1]:
%matplotlib inline
In [2]:
import os, csv
import pandas as pd
sub_dir = 'deviated_og/11_5'
filename = 'deviated_og-FIP.txt'
In [3]:
class Dataset(object):
def __init__(self, filename, subdir):
cur_dir = os.getcwd()
target_dir = os.path.join(cur_dir, sub_dir)
with open(os.path.join(target_dir, filename), "r") as f:
df = pd.read_csv(f, delimiter="\t")
self.time = df['Time (s)']
coarse_sandstone_1_oip = df['COARSE-SANDSTONE-1\'s OIP (m3)']
coarse_sandstone_1_wip = df['COARSE-SANDSTONE-1\'s WIP (m3)']
faults_oip = df['FAULT\'s OIP (m3)']
faults_wip = df['FAULT\'s WIP (m3)']
fine_sandstone_1_oip = df['FINE-SANDSTONE-1\'s OIP (m3)']
fine_sandstone_1_wip = df['FINE-SANDSTONE-1\'s WIP (m3)']
grainstone_1_oip = df['GRAINSTONE-1\'s OIP (m3)']
grainstone_1_wip = df['GRAINSTONE-1\'s WIP (m3)']
grainstone_2_oip = df['GRAINSTONE-2\'s OIP (m3)']
grainstone_2_wip = df['GRAINSTONE-2\'s WIP (m3)']
grainstone_3_oip = df['GRAINSTONE-3\'s OIP (m3)']
grainstone_3_wip = df['GRAINSTONE-3\'s WIP (m3)']
grainstone_4_oip = df['GRAINSTONE-4\'s OIP (m3)']
grainstone_4_wip = df['GRAINSTONE-4\'s WIP (m3)']
grainstone_5_oip = df['GRAINSTONE-5\'s OIP (m3)']
grainstone_5_wip = df['GRAINSTONE-5\'s WIP (m3)']
grainstone_6_oip = df['GRAINSTONE-6\'s OIP (m3)']
grainstone_6_wip = df['GRAINSTONE-6\'s WIP (m3)']
grainstone_7_oip = df['GRAINSTONE-7\'s OIP (m3)']
grainstone_7_wip = df['GRAINSTONE-7\'s WIP (m3)']
grainstone_8_oip = df['GRAINSTONE-8\'s OIP (m3)']
grainstone_8_wip = df['GRAINSTONE-8\'s WIP (m3)']
grainstone_9_oip = df['GRAINSTONE-9\'s OIP (m3)']
grainstone_9_wip = df['GRAINSTONE-9\'s WIP (m3)']
marl_1_oip = df['MARL-1\'s OIP (m3)']
marl_1_wip = df['MARL-1\'s WIP (m3)']
marl_2_oip = df['MARL-2\'s OIP (m3)']
marl_2_wip = df['MARL-2\'s WIP (m3)']
marl_3_oip = df['MARL-3\'s OIP (m3)']
marl_3_wip = df['MARL-3\'s WIP (m3)']
marl_4_oip = df['MARL-4\'s OIP (m3)']
marl_4_wip = df['MARL-4\'s WIP (m3)']
marl_5_oip = df['MARL-5\'s OIP (m3)']
marl_5_wip = df['MARL-5\'s WIP (m3)']
marl_6_oip = df['MARL-6\'s OIP (m3)']
marl_6_wip = df['MARL-6\'s WIP (m3)']
marl_7_oip = df['MARL-7\'s OIP (m3)']
marl_7_wip = df['MARL-7\'s WIP (m3)']
marl_8_oip = df['MARL-8\'s OIP (m3)']
marl_8_wip = df['MARL-8\'s WIP (m3)']
medium_sandstone_1_oip = df['MEDIUM-SANDSTONE-1\'s OIP (m3)']
medium_sandstone_1_wip = df['MEDIUM-SANDSTONE-1\'s WIP (m3)']
medium_sandstone_2_oip = df['MEDIUM-SANDSTONE-2\'s OIP (m3)']
medium_sandstone_2_wip = df['MEDIUM-SANDSTONE-2\'s WIP (m3)']
medium_sandstone_3_oip = df['MEDIUM-SANDSTONE-3\'s OIP (m3)']
medium_sandstone_3_wip = df['MEDIUM-SANDSTONE-3\'s WIP (m3)']
mudstone_1_oip = df['MUDSTONE-1\'s OIP (m3)']
mudstone_1_wip = df['MUDSTONE-1\'s WIP (m3)']
mudstone_2_oip = df['MUDSTONE-2\'s OIP (m3)']
mudstone_2_wip = df['MUDSTONE-2\'s WIP (m3)']
mudstone_3_oip = df['MUDSTONE-3\'s OIP (m3)']
mudstone_3_wip = df['MUDSTONE-3\'s WIP (m3)']
mudstone_4_oip = df['MUDSTONE-4\'s OIP (m3)']
mudstone_4_wip = df['MUDSTONE-4\'s WIP (m3)']
mudstone_5_oip = df['MUDSTONE-5\'s OIP (m3)']
mudstone_5_wip = df['MUDSTONE-5\'s WIP (m3)']
models_oip = df['Model\'s OIP (m3)']
models_wip = df['Model\'s WIP (m3)']
packstone_1_oip = df['PACKSTONE-1\'s OIP (m3)']
packstone_1_wip = df['PACKSTONE-1\'s WIP (m3)']
top_seal_oip = df['TOP-SEAL\'s OIP (m3)']
top_seal_wip = df['TOP-SEAL\'s WIP (m3)']
unknown_1_oip = df['UNKNOWN-1\'s OIP (m3)']
unknown_1_wip = df['UNKNOWN-1\'s WIP (m3)']
unknown_2_oip = df['UNKNOWN-2\'s OIP (m3)']
unknown_2_wip = df['UNKNOWN-2\'s WIP (m3)']
unknown_3_oip = df['UNKNOWN-3\'s OIP (m3)']
unknown_3_wip = df['UNKNOWN-3\'s WIP (m3)']
wackstone_1_oip = df['WACKSTONE-1\'s OIP (m3)']
wackstone_1_wip = df['WACKSTONE-1\'s WIP (m3)']
well_1_oip = df['WELL-1\'s OIP (m3)']
well_1_wip = df['WELL-1\'s WIP (m3)']
well_2_oip = df['WELL-2\'s OIP (m3)']
well_2_wip = df['WELL-2\'s WIP (m3)']
mudstones_gip = sum([mudstone_1_oip, mudstone_2_oip, mudstone_3_oip, mudstone_4_oip, mudstone_5_oip])
mudstones_oip = sum([mudstone_1_wip, mudstone_2_wip, mudstone_3_wip, mudstone_4_wip, mudstone_5_wip])
sandstones_gip = sum([medium_sandstone_1_oip, medium_sandstone_2_oip, medium_sandstone_3_oip,
fine_sandstone_1_oip, coarse_sandstone_1_oip])
sandstones_oip = sum([medium_sandstone_1_wip, medium_sandstone_2_wip, medium_sandstone_3_wip,
fine_sandstone_1_wip, coarse_sandstone_1_wip])
unknown_gip = sum([unknown_1_oip, unknown_2_oip, unknown_3_oip])
unknown_oip = sum([unknown_1_wip, unknown_2_wip, unknown_3_wip])
grainstones_gip = sum([grainstone_1_oip, grainstone_2_oip, grainstone_3_oip, grainstone_4_oip, grainstone_5_oip, grainstone_6_oip,
grainstone_7_oip, grainstone_8_oip, grainstone_9_oip])
grainstones_oip = sum([grainstone_1_wip, grainstone_2_wip, grainstone_3_wip, grainstone_4_wip, grainstone_5_wip, grainstone_6_wip,
grainstone_7_wip, grainstone_8_wip, grainstone_9_wip])
marls_gip = sum([marl_1_oip, marl_2_oip, marl_3_oip, marl_4_oip, marl_5_oip, marl_6_oip, marl_7_oip, marl_8_oip])
marls_oip = sum([marl_1_wip, marl_2_wip, marl_3_wip, marl_4_wip, marl_5_wip, marl_6_wip, marl_7_wip, marl_8_wip])
packstones_gip = sum([packstone_1_oip])
packstones_oip = sum([packstone_1_wip])
wackstones_gip = sum([wackstone_1_oip])
wackstones_oip = sum([wackstone_1_wip])
active_model_gip_check = models_oip-top_seal_oip-faults_oip-well_1_oip-well_2_oip
active_model_oip_check = models_wip-top_seal_wip-faults_wip-well_1_wip-well_2_wip
active_model_gip = mudstones_gip+sandstones_gip+unknown_gip+grainstones_gip+marls_gip+packstones_gip+wackstones_gip
active_model_oip = mudstones_oip+sandstones_oip+unknown_oip+grainstones_oip+marls_oip+packstones_oip+wackstones_oip
df['active_model_gip'] = active_model_gip
df['active_model_oip'] = active_model_oip
ts = df.set_index('Time (s)').diff()
dt = df.diff()['Time (s)']
oil_volume_change = -1*ts['active_model_oip']
self.oil_production_rate = oil_volume_change/dt.values
ts['oil_production_rate'] = self.oil_production_rate
gas_volume_change = ts['active_model_gip']
self.gas_injection_rate = gas_volume_change/dt.values
ts['gas_injection_rate'] = self.gas_injection_rate
self.cummulative_oil_production = oil_volume_change.cumsum()
ts['cummulative_oil_production'] = self.cummulative_oil_production
self.cummulative_gas_injection = gas_volume_change.cumsum()
self.active_pore_volume = (active_model_gip+active_model_oip)
self.pore_volumes_injected = self.cummulative_gas_injection/self.active_pore_volume.values
self.recovery_factor = (self.cummulative_oil_production/self.active_pore_volume.values)
self.reciprocal_oil_rate = 1.0/self.oil_production_rate
self.cummulative_oil_over_oil_rate = self.cummulative_oil_production/self.oil_production_rate.values
In [4]:
ds1 = Dataset(filename, sub_dir)
In [5]:
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
In [64]:
fig, ax = plt.subplots(figsize=(10,8))
ax.set_title(r'$Auxilary \ Diagnostic \ Plot \ Log(\frac{1}{q_{o}}) \ vs. \ Log(\frac{N_{p}}{q_{o}})$', fontsize=16)
ax.set_ylabel(r'$Log(\frac{1}{Oil \ Production \ Rate \ q}) Log(\frac{1}{q_{o}}) \ \frac{s}{m^3}$', fontsize=16)
ax.set_xlabel(r'$Log(\frac{Cummulative \ Oil \ Production}{Oil \ Production \ Rate \ q}) Log(\frac{N_{p}}{q_{o}}) \ [seconds]$', fontsize=16)
ax.loglog(ds1.cummulative_oil_over_oil_rate.values, ds1.reciprocal_oil_rate.values,
color="black", marker="s", label='$Log(Reciprocal \ oil \ production)$', markersize=3)
plt.grid()
plt.legend(fontsize=16, loc=4)
plt.savefig('auxilary_deviated_og_11_5.png', dpi=300)
plt.show()
In [65]:
fig, ax = plt.subplots(figsize=(8,8))
ax.set_xlim(left=0.0,right=3.5e9)
ax.set_ylim(bottom=1e-9, top=1e-4)
ax.set_title(r'$Logarithm \ of \ oil \ production \ rate \ versus \ time \ log(q_{o}) \ vs. \ t$', fontsize=16)
ax.set_xlabel(r'$Time \ t \ [seconds]$', fontsize=16)
ax.set_ylabel(r'$Logarithm \ of \ oil \ production \ rate \ log(q_{o}) \ \frac{m^3}{s}$', fontsize=16)
ax.semilogy()
ax.plot(ds1.time.values, ds1.oil_production_rate.values, color="black", marker="x", label='$Log(Oil \ Production \ Rate)$', markersize=1)
plt.grid()
plt.legend(fontsize=16)
plt.savefig('log_oil_deviate_og_11_5.png', dpi=300)
plt.show()
In [66]:
x_left = 1.e6
x_right = 1.e10
fig, ax1 = plt.subplots(figsize=(8,8))
#ax.set_ylim(bottom=2500, top=6500)
ax1.set_title(r'$Historical \ production \ data \ plot \ log(q_{o}) \ and \ log(N_{p}) \ versus \ log(t)$', fontsize=16)
ax1.set_xlim(left=x_left,right=x_right)
ax2 = ax1.twinx()
ax2.set_xlim(left=x_left,right=x_right)
ax2.set_ylim(bottom=1e1, top=1.e6)
ax1.loglog(ds1.time.values, ds1.oil_production_rate.values,
color="red", marker="x", label='$Log(Oil \ Production \ Rate)$', markersize=2)
ax2.loglog(ds1.time.values, ds1.cummulative_oil_production.values,
color="blue", marker="x", label='$Log(Cummulative \ Oil \ Production)$', markersize=2)
ax1.set_xlabel(r'$Logarithm \ of \ time \ log(t) \ [seconds]$', fontsize=16)
ax1.set_ylabel(r'$Logarithm \ of \ oil \ production \ rate \ log(q_{o}) \ \frac{m^3}{s}$', fontsize=16)
ax2.set_ylabel(r'$Logarithm \ of \ cummulative \ oil \ production \ log(N_{p}) \ m^3$', fontsize=16)
ax1.axvline(x=4.7e7, linewidth=1, color='grey', linestyle='dashed')
ax1.axvline(x=2.8e8, linewidth=1, color='grey', linestyle='dashed')
ax1.annotate('', (1.0e6, 1.2e-9), (4.7e7, 1.2e-9), arrowprops={'arrowstyle':'<->'},color='black')
ax1.annotate('Region A', (5.0e6, 1.3e-9),color='black')
ax1.annotate('', (4.7e7, 1.2e-9), (2.8e8, 1.2e-9), arrowprops={'arrowstyle':'<->'},color='black')
ax1.annotate('Region B', (7.0e7, 1.3e-9),color='black')
ax1.annotate('', (2.8e8, 1.2e-9), (1.e10, 1.2e-9), arrowprops={'arrowstyle':'<->'},color='black')
ax1.annotate('Region C', (1.0e9, 1.3e-9),color='black')
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
legend = ax1.legend(h1+h2, l1+l2, fontsize=14)
frame = legend.get_frame()
frame.set_facecolor('white')
plt.grid()
plt.savefig('historical_deviated_og_11_5.png', dpi=300)
plt.show()
In [67]:
x_left = 3.e7
x_right = 4.e8
fig, ax1 = plt.subplots(figsize=(8,8))
#ax.set_ylim(bottom=2500, top=6500)
ax1.set_title(r'$Historical \ production \ data \ plot \ log(q_{o}) \ and \ log(N_{p}) \ versus \ log(t)$', fontsize=16)
ax1.set_xlim(left=x_left,right=x_right)
ax1.set_ylim(bottom=1.e-6, top=4.e-5)
ax2 = ax1.twinx()
ax2.set_xlim(left=x_left,right=x_right)
ax2.set_ylim(bottom=1.e2, top=4.e3)
ax1.loglog(ds1.time.values, ds1.oil_production_rate.values, color="red", marker="x", label='$Log(q_{o})$')
ax2.loglog(ds1.time.values, ds1.cummulative_oil_production.values, color="blue", marker="x", label='$Log(N_{p})$')
fit_start1 = 22
fit_end1 = 28
log_t1 = np.log(ds1.time.values[fit_start1:fit_end1])
log_q1 = np.log(ds1.oil_production_rate.values[fit_start1:fit_end1])
coeffs1, residual1, rank1, singular_values1, rcond1 = np.polyfit(log_t1,log_q1,deg=1, full=True)
poly1 = np.poly1d(coeffs1)
yfit1 = lambda x: np.exp(poly1(np.log(x)))
ax1.plot(ds1.time.values[fit_start1-3:fit_end1+20],yfit1(ds1.time.values[fit_start1-3:fit_end1+20]), color="black", linestyle='-')
fit_start4 = 29
fit_end4 = 53
log_t4 = np.log(ds1.time.values[fit_start4:fit_end4])
log_q4 = np.log(ds1.oil_production_rate.values[fit_start4:fit_end4])
coeffs4, residual4, rank4, singular_values4, rcond4 = np.polyfit(log_t4,log_q4,deg=1, full=True)
poly4 = np.poly1d(coeffs4)
yfit4 = lambda x: np.exp(poly4(np.log(x)))
ax1.plot(ds1.time.values[fit_start4-6:fit_end4+20],yfit4(ds1.time.values[fit_start4-6:fit_end4+20]), color="black", linestyle='-')
fit_start2 = 53
fit_end2 = 110
log_t2 = np.log(ds1.time.values[fit_start2:fit_end2])
log_q2 = np.log(ds1.oil_production_rate.values[fit_start2:fit_end2])
coeffs2, residual2, rank2, singular_values2, rcond2 = np.polyfit(log_t2,log_q2,deg=1, full=True)
poly2 = np.poly1d(coeffs2)
yfit2 = lambda x: np.exp(poly2(np.log(x)))
ax1.plot(ds1.time.values[fit_start2-20:fit_end2+30],yfit2(ds1.time.values[fit_start2-20:fit_end2+30]), color="black", linestyle='-')
fit_start3 = 111
fit_end3 = 186
log_t3 = np.log(ds1.time.values[fit_start3:fit_end3])
log_q3 = np.log(ds1.oil_production_rate.values[fit_start3:fit_end3])
coeffs3, residual3, rank3, singular_values3, rcond3 = np.polyfit(log_t3,log_q3,deg=1, full=True)
poly3 = np.poly1d(coeffs3)
yfit3 = lambda x: np.exp(poly3(np.log(x)))
ax1.plot(ds1.time.values[fit_start3-50:fit_end3+50],yfit3(ds1.time.values[fit_start3-50:fit_end3+50]), color="black", linestyle='-')
ax1.set_xlabel(r'$Logarithm \ of \ time \ log(t) \ [seconds]$', fontsize=16)
ax1.set_ylabel(r'$Logarithm \ of \ oil \ production \ rate \ log(q_{o}) \ \frac{m^3}{s}$', fontsize=16)
ax2.set_ylabel(r'$Logarithm \ of \ cummulative \ oil \ production \ log(N_{p}) \ m^3$', fontsize=16)
ax1.axvline(x=4.7e7, linewidth=1, color='grey', linestyle='dashed')
ax1.axvline(x=5.4e7, linewidth=1, color='grey', linestyle='dashed')
ax1.axvline(x=7.25e7, linewidth=1, color='grey', linestyle='dashed')
ax1.axvline(x=1.3e8, linewidth=1, color='grey', linestyle='dashed')
ax1.axvline(x=2.8e8, linewidth=1, color='grey', linestyle='dashed')
ax1.annotate('', (3.e7, 1.1e-6), (4.7e7, 1.1e-6), arrowprops={'arrowstyle':'<->'},color='black')
ax1.annotate('Region A', (3.3e7, 1.2e-6),color='black')
ax1.annotate('', (4.7e7, 1.1e-6), (5.4e7, 1.1e-6), arrowprops={'arrowstyle':'<->'},color='black')
ax1.annotate('B', (5e7, 1.2e-6),color='black')
ax1.annotate('', (5.4e7, 1.1e-6), (7.25e7, 1.1e-6), arrowprops={'arrowstyle':'<->'}, color='black')
ax1.annotate('Region C', (5.55e7, 1.2e-6),color='black')
ax1.annotate('', (7.25e7, 1.1e-6), (1.3e8, 1.1e-6), arrowprops={'arrowstyle':'<->'}, color='black')
ax1.annotate('Region D', (8.5e7, 1.2e-6),color='black')
ax1.annotate('', (1.3e8, 1.1e-6), (2.8e8, 1.1e-6), arrowprops={'arrowstyle':'<->'},color='black')
ax1.annotate('Region E', (1.7e8, 1.2e-6),color='black')
ax1.annotate('', (2.8e8, 1.1e-6), (4.e8, 1.1e-6), arrowprops={'arrowstyle':'<->'},color='black')
ax1.annotate('Region F', (3.0e8, 1.2e-6),color='black')
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1+h2, l1+l2, fontsize=16)
plt.grid(b=True, which='major', color='black', linestyle='-')
plt.grid(b=True, which='minor', color='grey', linestyle='--')
ax1.annotate('$Deviated \ Only \ Grainstones \ 11.5$', xy=(3.2e7, 3.5e-5), fontsize=16)
plt.savefig('historical_deviated_og_11_5_zoom.png', dpi=300)
plt.show()
In [ ]: