def test_drainage_curve(self): net = self.net phys = self.phys phys['throat.entry_pressure'] = np.arange(0, net.Nt, dtype=float) phys['pore.entry_pressure'] = 0.0 IP_1 = mp(network=self.net) self.phase['pore.occupancy'] = False self.phase['throat.occupancy'] = False IP_1.settings['snap_off'] = False IP_1.setup(phase=self.phase) inv_points = np.arange(0, 100, 1, dtype=float) sat = np.zeros_like(inv_points) tot_vol = (np.sum(self.net['pore.volume']) + np.sum(self.net['throat.volume'])) for i, Pc in enumerate(inv_points): IP_1.reset() IP_1.set_inlets(pores=self.inlets) IP_1.set_residual(pores=self.phase['pore.occupancy']) IP_1.run(max_pressure=Pc) IP_1.results(Pc) Pinv_Pc = IP_1['pore.invasion_pressure'] Tinv_Pc = IP_1['throat.invasion_pressure'] sat[i] += np.sum(self.net['pore.volume'][Pinv_Pc<np.inf]) sat[i] += np.sum(self.net['throat.volume'][Tinv_Pc<np.inf]) assert sat.max()/tot_vol == 1.0
def run_mp(self, trapping=False, residual=False, snap=False, plot=False, flowrate=None): IP_1 = mp(network=self.net) if snap: IP_1.settings['snap_off'] = 'throat.snap_off' IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=self.inlets) if residual: IP_1.set_residual(pores=self.phase['pore.occupancy']) IP_1.run() if trapping: IP_1.set_outlets(self.outlets) IP_1.apply_trapping() inv_points = np.arange(0, 100, 1) # returns data as well as plotting alg_data = IP_1.get_intrusion_data(inv_points=inv_points) self.phase.update(IP_1.results(Pc=inv_points.max())) if plot: plt.figure() L = np.sqrt(self.net.Np).astype(int) plt.imshow(IP_1['pore.invasion_sequence'].reshape([L, L]), cmap=plt.get_cmap('Blues')) if flowrate is not None: IP_1.apply_flow(flowrate=flowrate) self.alg = IP_1 return alg_data
def test_drainage_curve(self): net = self.net phys = self.phys phys['throat.entry_pressure'] = np.arange(0, net.Nt, dtype=float) phys['pore.entry_pressure'] = 0.0 IP_1 = mp(network=self.net) self.phase['pore.occupancy'] = False self.phase['throat.occupancy'] = False IP_1.settings['snap_off'] = False IP_1.setup(phase=self.phase) inv_points = np.arange(0, 100, 1, dtype=float) sat = np.zeros_like(inv_points) tot_vol = (np.sum(self.net['pore.volume']) + np.sum(self.net['throat.volume'])) for i, Pc in enumerate(inv_points): IP_1.reset() IP_1.set_inlets(pores=self.inlets) IP_1.set_residual(pores=self.phase['pore.occupancy']) IP_1.run(max_pressure=Pc) IP_1.results(Pc) Pinv_Pc = IP_1['pore.invasion_pressure'] Tinv_Pc = IP_1['throat.invasion_pressure'] sat[i] += np.sum(self.net['pore.volume'][Pinv_Pc < np.inf]) sat[i] += np.sum(self.net['throat.volume'][Tinv_Pc < np.inf]) assert sat.max() / tot_vol == 1.0
def test_max_pressure(self): net = self.net phys = self.phys phys['throat.entry_pressure'] = np.arange(0, net.Nt, dtype=float) phys['pore.entry_pressure'] = 0.0 IP_1 = mp(network=self.net) IP_1.settings['partial_saturation'] = False IP_1.settings['snap_off'] = False IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=self.inlets) IP_1.run(max_pressure=20) IP_1.results(Pc=20) inv_Pc = IP_1['pore.invasion_pressure'] inv_Pc = inv_Pc[~np.isinf(inv_Pc)] assert inv_Pc.max() <= 20
def test_terminate_clusters(self): self.setup_class(Np=10) net = self.net phys = self.phys np.random.seed(1) phys['throat.entry_pressure']=0.0 phys['pore.entry_pressure']=np.random.random(net.Np)*net.Np inlets = net.pores('left') outlets = net.pores('right') IP_1 = mp(network=self.net) IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=inlets) IP_1.set_outlets(pores=outlets) IP_1.run() assert np.any(IP_1['throat.invasion_sequence'][outlets]>-1) assert np.any(IP_1['throat.invasion_sequence']==-1)
def test_terminate_clusters(self): self.setup_class(Np=10) net = self.net phys = self.phys np.random.seed(1) phys['throat.entry_pressure'] = 0.0 phys['pore.entry_pressure'] = np.random.random(net.Np) * net.Np inlets = net.pores('left') outlets = net.pores('right') IP_1 = mp(network=self.net) IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=inlets) IP_1.set_outlets(pores=outlets) IP_1.run() assert np.any(IP_1['throat.invasion_sequence'][outlets] > -1) assert np.any(IP_1['throat.invasion_sequence'] == -1)
def test_disconnected_residual_clusters(self): net = self.net phys = self.phys phys['throat.entry_pressure'] = np.arange(0, net.Nt, dtype=float) phys['pore.entry_pressure'] = np.arange(0, net.Np, dtype=float) IP_1 = mp(network=self.net) IP_1.settings['snap_off'] = False IP_1.setup(phase=self.phase) T = 20 [P1, P2] = self.net['throat.conns'][T] self.phase['pore.occupancy'] = False self.phase['throat.occupancy'] = False self.phase['pore.occupancy'][P1] = False self.phase['pore.occupancy'][P2] = True IP_1.set_inlets(pores=self.inlets) IP_1.set_residual(pores=self.phase['pore.occupancy']) assert len(IP_1.queue) == 2
def test_cluster_merging(self): phys = self.phys phys['throat.entry_pressure'] = 0.0 Pc = np.array([[0.0, 1.0, 2.0, 1.0, 0.0], [3.0, 4.0, 5.0, 4.0, 3.0], [6.0, 7.0, 8.0, 7.0, 6.0], [9.0, 10.0, 11.0, 10.0, 9.0], [12.0, 13.0, 14.0, 13.0, 12.0]]) phys['pore.entry_pressure'] = Pc.flatten() IP_1 = mp(network=self.net) IP_1.settings['partial_saturation'] = False IP_1.settings['snap_off'] = False IP_1.setup(phase=self.phase) # Set the inlets as the pores with zero entry Pc IP_1.set_inlets(clusters=[[0], [4]]) IP_1.run() # Clusters should merge on first row and all pores after the first row # should be part of the same cluster assert len(np.unique(IP_1['pore.cluster'][5:])) == 1
def test_invade_isolated_Ts(self): self.setup_class(Np=10) net = self.net phys = self.phys np.random.seed(1) phys['throat.entry_pressure'] = 0.0 phys['pore.entry_pressure'] = np.random.random(net.Np) * net.Np self.inlets = net.pores('left') self.outlets = None IP_1 = mp(network=self.net) IP_1.settings['invade_isolated_Ts'] = False IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=self.inlets) IP_1.run() save_seq = IP_1['throat.invasion_sequence'].copy() IP_1.settings['invade_isolated_Ts'] = True IP_1.reset() IP_1.set_inlets(pores=self.inlets) IP_1.run() assert np.any(IP_1['throat.invasion_sequence'] - save_seq != 0)
def test_big_clusters(self): self.setup_class(Np=10) net = self.net phys = self.phys np.random.seed(1) phys['throat.entry_pressure'] = 0.0 phys['pore.entry_pressure'] = np.random.random(net.Np) * net.Np self.inlets = net.pores('left') self.outlets = None np.random.seed(1) self.phase['pore.occupancy'] = False self.phase['throat.occupancy'] = False self.phase['pore.occupancy'] = np.random.random(net.Np) < 0.25 IP_1 = mp(network=self.net) IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=self.inlets) IP_1.set_residual(pores=self.phase['pore.occupancy']) IP_1.run() assert np.all(IP_1['pore.invasion_sequence'] > -1) assert len(np.unique(IP_1['pore.cluster'])) > 1
def test_big_clusters(self): self.setup_class(Np=10) net = self.net phys = self.phys np.random.seed(1) phys['throat.entry_pressure']=0.0 phys['pore.entry_pressure']=np.random.random(net.Np)*net.Np self.inlets = net.pores('left') self.outlets = None np.random.seed(1) self.phase['pore.occupancy'] = False self.phase['throat.occupancy'] = False self.phase['pore.occupancy'] = np.random.random(net.Np) < 0.25 IP_1 = mp(network=self.net) IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=self.inlets) IP_1.set_residual(pores=self.phase['pore.occupancy']) IP_1.run() assert np.all(IP_1['pore.invasion_sequence'] > -1) assert len(np.unique(IP_1['pore.cluster'])) > 1
def test_invade_isolated_Ts(self): self.setup_class(Np=10) net = self.net phys = self.phys np.random.seed(1) phys['throat.entry_pressure']=0.0 phys['pore.entry_pressure']=np.random.random(net.Np)*net.Np self.inlets = net.pores('left') self.outlets = None IP_1 = mp(network=self.net) IP_1.settings['invade_isolated_Ts']=False IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=self.inlets) IP_1.run() save_seq = IP_1['throat.invasion_sequence'].copy() IP_1.settings['invade_isolated_Ts']=True IP_1.reset() IP_1.set_inlets(pores=self.inlets) IP_1.run() assert np.any(IP_1['throat.invasion_sequence']-save_seq != 0)
def test_big_clusters_trapping(self): self.setup_class(Np=10) net = self.net phys = self.phys np.random.seed(1) phys['throat.entry_pressure'] = 0.0 phys['pore.entry_pressure'] = np.random.random(net.Np) * net.Np self.inlets = net.pores('left') self.outlets = net.pores('right') np.random.seed(1) self.phase['pore.occupancy'] = False self.phase['throat.occupancy'] = False self.phase['pore.occupancy'] = np.random.random(net.Np) < 0.25 IP_1 = mp(network=self.net) IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=self.inlets) IP_1.set_residual(pores=self.phase['pore.occupancy']) IP_1.run() IP_1.set_outlets(self.outlets) IP_1.apply_trapping() assert np.sum(IP_1['pore.trapped']) == 35
def test_big_clusters_trapping(self): self.setup_class(Np=10) net = self.net phys = self.phys np.random.seed(1) phys['throat.entry_pressure']=0.0 phys['pore.entry_pressure']=np.random.random(net.Np)*net.Np self.inlets = net.pores('left') self.outlets = net.pores('right') np.random.seed(1) self.phase['pore.occupancy'] = False self.phase['throat.occupancy'] = False self.phase['pore.occupancy'] = np.random.random(net.Np) < 0.25 IP_1 = mp(network=self.net) IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=self.inlets) IP_1.set_residual(pores=self.phase['pore.occupancy']) IP_1.run() IP_1.set_outlets(self.outlets) IP_1.apply_trapping() assert np.sum(IP_1['pore.trapped'])==35
def test_late_filling(self): self.setup_class(Np=100) net = self.net phys = self.phys np.random.seed(1) phys['throat.entry_pressure'] = np.random.random(net.Nt) * 10000 + 5000 phys['pore.entry_pressure'] = 0.0 phys.add_model(propname='pore.pc_star', model=op.models.misc.from_neighbor_throats, throat_prop='throat.entry_pressure', mode='min') phys.add_model(propname='pore.late_filling', model=op.models.physics.multiphase.late_filling, pressure='pore.pressure', Pc_star='pore.pc_star', eta=1, Swp_star=0.4) phys['throat.pc_star'] = phys['throat.entry_pressure'] phys.add_model(propname='throat.late_filling', model=op.models.physics.multiphase.late_filling, pressure='throat.pressure', Pc_star='throat.pc_star', eta=1, Swp_star=0.2) inlets = net.pores('left') outlets = net.pores('right') IP_1 = mp(network=self.net) IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=inlets) IP_1.set_outlets(pores=outlets) IP_1.run() inv_points = np.arange(phys['throat.entry_pressure'].min(), phys['throat.entry_pressure'].max(), 100) alg_data = IP_1.get_intrusion_data(inv_points=inv_points) IP_1.settings['late_pore_filling'] = 'pore.late_filling' IP_1.settings['late_throat_filling'] = 'throat.late_filling' alg_data_lpf = IP_1.get_intrusion_data(inv_points=inv_points) assert np.any(alg_data_lpf.S_tot - alg_data.S_tot < 0.0) assert ~np.any(alg_data_lpf.S_tot - alg_data.S_tot > 0.0)
def test_late_filling(self): self.setup_class(Np=100) net = self.net phys = self.phys np.random.seed(1) phys['throat.entry_pressure'] = np.random.random(net.Nt)*10000 + 5000 phys['pore.entry_pressure'] = 0.0 phys.add_model(propname='pore.pc_star', model=op.models.misc.from_neighbor_throats, throat_prop='throat.entry_pressure', mode='min') phys.add_model(propname='pore.late_filling', model=op.models.physics.multiphase.late_filling, pressure='pore.pressure', Pc_star='pore.pc_star', eta=1, Swp_star=0.4) phys['throat.pc_star'] = phys['throat.entry_pressure'] phys.add_model(propname='throat.late_filling', model=op.models.physics.multiphase.late_filling, pressure='throat.pressure', Pc_star='throat.pc_star', eta=1, Swp_star=0.2) inlets = net.pores('left') outlets = net.pores('right') IP_1 = mp(network=self.net) IP_1.setup(phase=self.phase) IP_1.set_inlets(pores=inlets) IP_1.set_outlets(pores=outlets) IP_1.run() inv_points = np.arange(phys['throat.entry_pressure'].min(), phys['throat.entry_pressure'].max(), 100) alg_data = IP_1.get_intrusion_data(inv_points=inv_points) IP_1.settings['late_pore_filling'] = 'pore.late_filling' IP_1.settings['late_throat_filling'] = 'throat.late_filling' alg_data_lpf = IP_1.get_intrusion_data(inv_points=inv_points) assert np.any(alg_data_lpf.S_tot - alg_data.S_tot < 0.0) assert ~np.any(alg_data_lpf.S_tot - alg_data.S_tot > 0.0)