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 test_interpolate_wo_pc(swl, dswcr, dswlhigh, sorw, a_l, a_h, b_l, b_h): """ Generate two random WaterOil curves, interpolate pc 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() wo_high.add_corey_water() wo_low.add_corey_oil() wo_high.add_corey_oil() wo_low.add_simple_J(a=a_l, b=b_l) wo_high.add_simple_J(a=a_h, b=b_h) ips = [] ip_dist = 0.05 for t in np.arange(0, 1 + ip_dist, ip_dist): wo_ip = utils.interpolate_wo(wo_low, wo_high, t) check_table(wo_ip.table) ips.append(wo_ip) assert 0 < wo_ip.crosspoint() < 1 # Distances between low and interpolants: dists = [(wo_low.table - interp.table)[["pc"]].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)[["pc"]].sum().sum() < 0.01 # Distances between low and interpolants: dists = [(wo_low.table - interp.table)[["pc"]].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) from matplotlib import pyplot as plt _, mpl_ax = plt.subplots() wo_low.plotpc(mpl_ax=mpl_ax, color="red", logyscale=True) wo_high.plotpc(mpl_ax=mpl_ax, color="blue", logyscale=True) for interp in ips: interp.plotpc(mpl_ax=mpl_ax, color="green", logyscale=True) plt.show() assert False
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])