Exemplo n.º 1
0
 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
Exemplo n.º 2
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
Exemplo n.º 3
0
 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
Exemplo n.º 4
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
Exemplo n.º 5
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
Exemplo n.º 6
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
Exemplo n.º 7
0
 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)
Exemplo n.º 8
0
 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)
Exemplo n.º 9
0
 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
Exemplo n.º 10
0
 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
Exemplo n.º 11
0
    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
Exemplo n.º 12
0
 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)
Exemplo n.º 13
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
Exemplo n.º 14
0
    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
Exemplo n.º 15
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
Exemplo n.º 16
0
 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)
Exemplo n.º 17
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
Exemplo n.º 18
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
Exemplo n.º 19
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)
Exemplo n.º 20
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)