def test_plotting(): """Test that plotting code pass through (nothing displayed)""" wateroil = WaterOil(swl=0.1, h=0.1) wateroil.add_corey_water() wateroil.add_corey_oil() wateroil.plotkrwkrow(mpl_ax=matplotlib.pyplot.subplots()[1]) wateroil.add_simple_J() wateroil.plotpc(mpl_ax=matplotlib.pyplot.subplots()[1])
def test_interpolate_wo(): """Discrete test scenarios for wateroil interpolation""" swl_l = random.uniform(0, 0.1) swcr_l = swl_l + random.uniform(0, 0.1) sorw_l = random.uniform(0, 0.2) swl_h = random.uniform(0, 0.1) swcr_h = swl_h + random.uniform(0, 0.1) sorw_h = random.uniform(0, 0.2) wo_low = WaterOil(swl=swl_l, swcr=swcr_l, sorw=sorw_l, h=0.001) wo_high = WaterOil(swl=swl_h, swcr=swcr_h, sorw=sorw_h, h=0.001) wo_low.add_corey_water(nw=random.uniform(1, 3), krwend=random.uniform(0.5, 1)) wo_high.add_corey_water(nw=random.uniform(1, 3), krwend=random.uniform(0.5, 1)) wo_low.add_corey_oil(now=random.uniform(1, 3), kroend=random.uniform(0.5, 1)) wo_high.add_corey_oil(now=random.uniform(1, 3), kroend=random.uniform(0.5, 1)) wo_low.add_simple_J(a=random.uniform(0.1, 2), b=random.uniform(-2, -1)) wo_high.add_simple_J(a=random.uniform(0.1, 2), b=random.uniform(-2, 1)) print( " ** Low curve WaterOil (red):\n" + wo_low.swcomment + wo_low.krwcomment + wo_low.krowcomment + wo_low.pccomment ) print( " ** High curve WaterOil (blue):\n" + wo_high.swcomment + wo_high.krwcomment + wo_high.krowcomment + wo_high.pccomment ) _, mpl_ax = plt.subplots() wo_low.plotkrwkrow(mpl_ax, color="red") wo_high.plotkrwkrow(mpl_ax, color="blue") for tparam in np.arange(0, 1, 0.1): wo_ip = utils.interpolation.interpolate_wo(wo_low, wo_high, tparam, h=0.001) wo_ip.plotkrwkrow(mpl_ax, color="green") mpl_ax.set_title("WaterOil, random Corey, linear y-scale") plt.show() # Plot again with log yscale: _, mpl_ax = plt.subplots() wo_low.plotkrwkrow(mpl_ax, color="red") wo_high.plotkrwkrow(mpl_ax, color="blue") for tparam in np.arange(0, 1, 0.1): wo_ip = utils.interpolation.interpolate_wo(wo_low, wo_high, tparam, h=0.001) wo_ip.plotkrwkrow(mpl_ax, color="green", logyscale=True) mpl_ax.set_title("WaterOil, random Corey, log y-scale") plt.show() # Capillary pressure _, mpl_ax = plt.subplots() wo_low.plotpc(mpl_ax, color="red", logyscale=True) wo_high.plotpc(mpl_ax, color="blue", logyscale=True) for tparam in np.arange(0, 1, 0.1): wo_ip = utils.interpolation.interpolate_wo(wo_low, wo_high, tparam, h=0.001) wo_ip.plotpc(mpl_ax, color="green", logyscale=True) mpl_ax.set_title("WaterOil, capillary pressure") plt.show()
def testplot(): """Generate and plot relperm curves Use this as a template function. """ swof = WaterOil(tag="Testcurve", h=0.01, swirr=0.2, swl=0.2, sorw=0.1) swof.add_corey_water(nw=5, krwend=0.7, krwmax=0.9) swof.add_corey_oil(now=2, kroend=0.95) swof.add_LET_water(l=2, e=1, t=1.4, krwend=0.7, krwmax=0.9) swof.add_LET_oil(l=2, e=1, t=1.4, kroend=0.9) # Print the first 7 lines of SWOF: print("\n".join(swof.SWOF().split("\n")[0:8])) _, mpl_ax = plt.subplots() swof.plotkrwkrow(mpl_ax) plt.show()
def test_interpolate_wo( swl, dswcr, dswlhigh, sorw, nw_l, nw_h, now_l, now_h, krwend_l, krwend_h, kroend_l, kroend_h, ): # pylint: disable=too-many-arguments,too-many-locals """ Generate two random WaterOil curves, interpolate between them and check that the difference between each interpolant is small, this essentially checks that we can go continously between the two functions. """ wo_low = WaterOil(swl=swl, swcr=swl + dswcr, sorw=sorw) wo_high = WaterOil( swl=swl + dswlhigh, swcr=swl + dswlhigh + dswcr, sorw=max(sorw - 0.01, 0) ) wo_low.add_corey_water(nw=nw_l, krwend=krwend_l) wo_high.add_corey_water(nw=nw_h, krwend=krwend_h) wo_low.add_corey_oil(now=now_l, kroend=kroend_l) wo_high.add_corey_oil(now=now_h, kroend=kroend_h) ips = [] ip_dist = 0.05 for tparam in np.arange(0, 1 + ip_dist, ip_dist): wo_ip = interpolate_wo(wo_low, wo_high, tparam) check_table(wo_ip.table) assert wo_ip.tag ips.append(wo_ip) assert 0 < wo_ip.crosspoint() < 1 # Distances between low and interpolants: dists = [ (wo_low.table - interp.table)[["krw", "krow"]].sum().sum() for interp in ips ] assert np.isclose(dists[0], 0) # Distance between high and the last interpolant assert (wo_high.table - ips[-1].table)[["krw", "krow"]].sum().sum() < 0.01 # Distances between low and interpolants: dists = [ (wo_low.table - interp.table)[["krw", "krow"]].sum().sum() for interp in ips ] print( "Interpolation, mean: {}, min: {}, max: {}, std: {} ip-par-dist: {}".format( np.mean(dists), min(dists), max(dists), np.std(np.diff(dists[1:])), ip_dist ) ) assert np.isclose(dists[0], 0) # Reproducing wo_low # All curves that are close in parameter t, should be close in sum().sum(). # That means that diff of the distances should be similar, # that is the std.dev of the distances is low: ip_dist_std = np.std(np.diff(dists[1:])) # This number depends on 'h' and 't' range # (avoiding the first which reproduces go_low if ip_dist_std > 1.0: # Found by trial and error print("ip_dist_std: {}".format(ip_dist_std)) print(dists) _, mpl_ax = plt.subplots() wo_low.plotkrwkrow(mpl_ax=mpl_ax, color="red") wo_high.plotkrwkrow(mpl_ax=mpl_ax, color="blue") for interp in ips: interp.plotkrwkrow(mpl_ax=mpl_ax, color="green") plt.show() assert False
def test_letspan(): """Demonstration of how random LET (random individually and uncorrelated in L, eand T) curves span out the relperm-space between low and high LET curves If the low and high LET curves do not cross, the random curves are all between the low and high curves. """ matplotlib.style.use("ggplot") let_w = { "l": [2, 4], "e": [1, 2], "t": [2, 1], # first value should be larger than first to avoid crossing "krwend": [0.9, 0.5], "sorw": [0.05, 0.1], } # Parameter test set from SCAL group, first is pessimistic, second # is optimistic let_w = { "l": [2.323, 4.436], "e": [2, 8], "t": [1.329, 0.766], # first value should be larger # than first to avoid crossing "krwend": [0.9, 0.6], "sorw": [0.02, 0.137], } # LET oil: let_o = { "l": [4.944, 2.537], "e": [5, 2], "t": [0.68, 1.549], # first value should be larger # than first to avoid crossing "kroend": [1, 1], "sorw": [0.02, 0.137], } # We need sorted versions for the random function slimw = {x: sorted(let_w[x]) for x in let_w} slimo = {x: sorted(let_o[x]) for x in let_o} _, mpl_ax = pyplot.subplots() for _ in range(100): swof = WaterOil(h=0.01, swl=0.16, sorw=random.uniform(slimw["sorw"][0], slimw["sorw"][1])) swof.add_LET_water( l=random.uniform(slimw["l"][0], slimw["l"][1]), e=random.uniform(slimw["e"][0], slimw["e"][1]), t=random.uniform(slimw["t"][0], slimw["t"][1]), krwend=random.uniform(slimw["krwend"][0], slimw["krwend"][1]), ) swof.add_LET_oil( l=random.uniform(slimo["l"][0], slimo["l"][1]), e=random.uniform(slimo["e"][0], slimo["e"][1]), t=random.uniform(slimo["t"][0], slimo["t"][1]), ) swof.plotkrwkrow(mpl_ax=mpl_ax, alpha=0.1) # Boundary lines swof = WaterOil(h=0.01, sorw=let_w["sorw"][0], swl=0.16) swof.add_LET_water(l=let_w["l"][0], e=let_w["e"][0], t=let_w["t"][0], krwend=let_w["krwend"][0]) swof.add_LET_oil(l=let_o["l"][0], e=let_o["e"][0], t=let_o["t"][0]) swof.plotkrwkrow(mpl_ax=mpl_ax, color="red", label="Low") swof = WaterOil(h=0.01, sorw=let_w["sorw"][1], swl=0.16) swof.add_LET_water(l=let_w["l"][1], e=let_w["e"][1], t=let_w["t"][1], krwend=let_w["krwend"][1]) swof.add_LET_oil(l=let_o["l"][1], e=let_o["e"][1], t=let_o["t"][1]) swof.plotkrwkrow(mpl_ax=mpl_ax, color="red", label="High") pyplot.subplots_adjust(top=0.8) pyplot.title( "Blue LET curves go outside red boundaries, \n" "therefore SCAL-interpolation " "must be done\n on curves, not in LET-space.", fontsize=12, ) print("[Close windows to continue tests]") pyplot.show()
def letspan(): """Demonstration of how random LET (random individually and uncorrelated in L, eand T) curves span out the relperm-space between low and high LET curves If the low and high LET curves do not cross, the random curves are all between the low and high curves. """ import matplotlib.pyplot as plt import matplotlib matplotlib.style.use("ggplot") let_w = { "l": [2, 4], "e": [1, 2], "t": [2, 1], # first value should be larger than first to avoid crossing "krwend": [0.9, 0.5], "sorw": [0.05, 0.1], } # Parameter test set from SCAL group, first is pessimistic, second # is optimistic let_w = { "l": [2.323, 4.436], "e": [2, 8], "t": [1.329, 0.766], # first value should be larger # than first to avoid crossing "krwend": [0.9, 0.6], "sorw": [0.02, 0.137], } # LET oil: let_o = { "l": [4.944, 2.537], "e": [5, 2], "t": [0.68, 1.549], # first value should be larger # than first to avoid crossing "kroend": [1, 1], "sorw": [0.02, 0.137], } # We need sorted versions for the random function slimw = {x: sorted(let_w[x]) for x in let_w} slimo = {x: sorted(let_o[x]) for x in let_o} _, mpl_ax = plt.subplots() for _ in range(100): swof = WaterOil(h=0.01, swl=0.16, sorw=random.uniform(slimw["sorw"][0], slimw["sorw"][1])) swof.add_LET_water( l=random.uniform(slimw["l"][0], slimw["l"][1]), e=random.uniform(slimw["e"][0], slimw["e"][1]), t=random.uniform(slimw["t"][0], slimw["t"][1]), krwend=random.uniform(slimw["krwend"][0], slimw["krwend"][1]), ) swof.add_LET_oil( l=random.uniform(slimo["l"][0], slimo["l"][1]), e=random.uniform(slimo["e"][0], slimo["e"][1]), t=random.uniform(slimo["t"][0], slimo["t"][1]), ) swof.plotkrwkrow(mpl_ax=mpl_ax, alpha=0.1) # Boundary lines swof = WaterOil(h=0.01, sorw=let_w["sorw"][0], swl=0.16) swof.add_LET_water(l=let_w["l"][0], e=let_w["e"][0], t=let_w["t"][0], krwend=let_w["krwend"][0]) swof.add_LET_oil(l=let_o["l"][0], e=let_o["e"][0], t=let_o["t"][0]) swof.plotkrwkrow(mpl_ax=mpl_ax, color="red", label="Low") swof = WaterOil(h=0.01, sorw=let_w["sorw"][1], swl=0.16) swof.add_LET_water(l=let_w["l"][1], e=let_w["e"][1], t=let_w["t"][1], krwend=let_w["krwend"][1]) swof.add_LET_oil(l=let_o["l"][1], e=let_o["e"][1], t=let_o["t"][1]) swof.plotkrwkrow(mpl_ax=mpl_ax, color="red", label="High") # mpl_ax.set_yscale('log') plt.show()