コード例 #1
0
 def test_ionic_conductance_electroneutrality(self):
     sw = mixtures.SalineWater(network=self.net)
     Na = sw.components[f'Na_{sw.name}']
     Cl = sw.components[f'Cl_{sw.name}']
     self.phys = op.physics.GenericPhysics(network=self.net, phase=sw, geometry=self.geo)
     sw[f'pore.concentration.{Cl.name}'] = np.linspace(10, 20, 27) * 0.5
     sw[f'pore.concentration.{Na.name}'] = np.linspace(10, 20, 27)
     electroneutrality = op.models.physics.ionic_conductance.electroneutrality
     self.phys.add_model(propname='throat.ionic_conductance',
                         model=electroneutrality, ions=[Na.name, Cl.name])
     self.phys.regenerate_models()
     actual = np.mean(self.phys['throat.ionic_conductance'])
     assert_allclose(actual, desired=0.0116345, rtol=1e-5)
    def setup_class(self):
        # network
        np.random.seed(0)
        self.net = op.network.Cubic(shape=[6, 6, 1], spacing=1e-6)
        prs = (self.net['pore.back'] * self.net['pore.right'] +
               self.net['pore.back'] * self.net['pore.left'] +
               self.net['pore.front'] * self.net['pore.right'] +
               self.net['pore.front'] * self.net['pore.left'])
        prs = self.net.Ps[prs]
        thrts = self.net['throat.surface']
        thrts = self.net.Ts[thrts]
        op.topotools.trim(network=self.net, pores=prs, throats=thrts)
        np.random.seed(0)
        op.topotools.reduce_coordination(self.net, 3)

        # geometry
        np.random.seed(0)
        self.geo = op.geometry.StickAndBall(network=self.net,
                                            pores=self.net.Ps,
                                            throats=self.net.Ts)

        # phase
        self.sw = mixtures.SalineWater(network=self.net)
        # Retrieve handles to each species for use below
        self.Na = self.sw.components['Na_' + self.sw.name]
        self.Cl = self.sw.components['Cl_' + self.sw.name]
        self.H2O = self.sw.components['H2O_' + self.sw.name]

        # physics
        self.phys = op.physics.GenericPhysics(network=self.net,
                                              phase=self.sw,
                                              geometry=self.geo)
        modphys = op.models.physics
        self.flow = modphys.hydraulic_conductance.hagen_poiseuille
        self.phys.add_model(propname='throat.hydraulic_conductance',
                            pore_viscosity='pore.viscosity',
                            throat_viscosity='throat.viscosity',
                            model=self.flow,
                            regen_mode='normal')
        self.current = modphys.ionic_conductance.electroneutrality
        self.phys.add_model(propname='throat.ionic_conductance',
                            ions=[self.Na.name, self.Cl.name],
                            model=self.current,
                            regen_mode='normal')
        self.eA_dif = modphys.diffusive_conductance.ordinary_diffusion
        self.phys.add_model(
            propname=('throat.diffusive_conductance.' + self.Na.name),
            pore_diffusivity=('pore.diffusivity.' + self.Na.name),
            throat_diffusivity=('throat.diffusivity.' + self.Na.name),
            model=self.eA_dif,
            regen_mode='normal')
        self.eB_dif = modphys.diffusive_conductance.ordinary_diffusion
        self.phys.add_model(
            propname=('throat.diffusive_conductance.' + self.Cl.name),
            pore_diffusivity=('pore.diffusivity.' + self.Cl.name),
            throat_diffusivity=('throat.diffusivity.' + self.Cl.name),
            model=self.eB_dif,
            regen_mode='normal')

        scheme = 'powerlaw'
        self.ad_dif_mig_Na = modphys.ad_dif_mig_conductance.ad_dif_mig
        self.phys.add_model(propname=('throat.ad_dif_mig_conductance.' +
                                      self.Na.name),
                            pore_pressure='pore.pressure',
                            model=self.ad_dif_mig_Na,
                            ion=self.Na.name,
                            s_scheme=scheme)

        self.ad_dif_mig_Cl = modphys.ad_dif_mig_conductance.ad_dif_mig
        self.phys.add_model(propname=('throat.ad_dif_mig_conductance.' +
                                      self.Cl.name),
                            pore_pressure='pore.pressure',
                            model=self.ad_dif_mig_Cl,
                            ion=self.Cl.name,
                            s_scheme=scheme)

        # settings for algorithms
        setts1 = {
            'solver_max_iter': 5,
            'solver_tol': 1e-08,
            'solver_rtol': 1e-08,
            'nlin_max_iter': 10,
            'cache_A': False,
            'cache_b': False
        }
        setts2 = {
            'g_tol': 1e-4,
            'g_max_iter': 100,
            't_output': 1000,
            't_step': 500,
            't_final': 20000,
            't_scheme': 'implicit'
        }

        # algorithms
        self.sf = op.algorithms.StokesFlow(network=self.net,
                                           phase=self.sw,
                                           settings=setts1)
        self.sf.set_value_BC(pores=self.net.pores('right'), values=11)
        self.sf.set_value_BC(pores=self.net.pores('left'), values=10)

        self.p = op.algorithms.TransientIonicConduction(network=self.net,
                                                        phase=self.sw,
                                                        settings=setts1)
        self.p.set_value_BC(pores=self.net.pores('back'), values=0.02)
        self.p.set_value_BC(pores=self.net.pores('front'), values=0.01)
        self.p.settings['charge_conservation'] = 'laplace'

        self.eA = op.algorithms.TransientNernstPlanck(network=self.net,
                                                      phase=self.sw,
                                                      ion=self.Na.name,
                                                      settings=setts1)
        self.eA.set_value_BC(pores=self.net.pores('right'), values=20)
        self.eA.set_value_BC(pores=self.net.pores('left'), values=10)

        self.eB = op.algorithms.TransientNernstPlanck(network=self.net,
                                                      phase=self.sw,
                                                      ion=self.Cl.name,
                                                      settings=setts1)
        self.eB.set_value_BC(pores=self.net.pores('right'), values=20)
        self.eB.set_value_BC(pores=self.net.pores('left'), values=10)

        mnp = op.algorithms.TransientNernstPlanckMultiphysicsSolver
        self.mnp = mnp(network=self.net, phase=self.sw, settings=setts2)
        self.mnp.setup(potential_field=self.p.name,
                       ions=[self.eA.name, self.eB.name])
コード例 #3
0
prs = net.Ps[prs]

thrts = net['throat.surface']
thrts = net.Ts[thrts]

op.topotools.trim(network=net, pores=prs, throats=thrts)

np.random.seed(0)
op.topotools.reduce_coordination(net, 3)

np.random.seed(0)
geo = op.geometry.CirclesAndRectangles(network=net,
                                       pores=net.Ps,
                                       throats=net.Ts)

sw = mixtures.SalineWater(network=net)
# Retrieve handles to each species for use below
Na = sw.components['Na_' + sw.name]
Cl = sw.components['Cl_' + sw.name]
H2O = sw.components['H2O_' + sw.name]

# Create physics
phys = op.physics.GenericPhysics(network=net, phase=sw, geometry=geo)

flow = op.models.physics.hydraulic_conductance.hagen_poiseuille
phys.add_model(propname='throat.hydraulic_conductance',
               pore_viscosity='pore.viscosity',
               throat_viscosity='throat.viscosity',
               model=flow,
               regen_mode='normal')
コード例 #4
0
    def setup_class(self):
        np.random.seed(0)
        self.net = op.network.Cubic(shape=[8, 8, 1], spacing=9e-4)

        prs = (self.net["pore.back"] * self.net["pore.right"] +
               self.net["pore.back"] * self.net["pore.left"] +
               self.net["pore.front"] * self.net["pore.right"] +
               self.net["pore.front"] * self.net["pore.left"])
        thrts = self.net["throat.surface"]
        op.topotools.trim(network=self.net,
                          pores=self.net.Ps[prs],
                          throats=self.net.Ts[thrts])

        self.geo = op.geometry.StickAndBall(network=self.net,
                                            pores=self.net.Ps,
                                            throats=self.net.Ts)

        pr_d = op.models.misc.constant
        trt_d = op.models.misc.constant
        self.geo.add_model(propname="pore.diameter", model=pr_d, value=1.5e-4)
        self.geo.add_model(propname="throat.diameter", model=trt_d, value=1e-4)
        self.geo.regenerate_models()

        self.phase = mixtures.SalineWater(network=self.net)
        # Retrieve handles to each species for use below
        self.Na = self.phase.components['Na_' + self.phase.name]
        self.Cl = self.phase.components['Cl_' + self.phase.name]
        self.H2O = self.phase.components['H2O_' + self.phase.name]

        # physics
        self.phys = op.physics.GenericPhysics(network=self.net,
                                              phase=self.phase,
                                              geometry=self.geo)

        flow = op.models.physics.hydraulic_conductance.hagen_poiseuille
        self.phys.add_model(
            propname="throat.hydraulic_conductance",
            pore_viscosity="pore.viscosity",
            throat_viscosity="throat.viscosity",
            model=flow,
            regen_mode="normal",
        )

        current = op.models.physics.ionic_conductance.electroneutrality
        self.phys.add_model(
            propname="throat.ionic_conductance",
            ions=[self.Na.name, self.Cl.name],
            model=current,
            regen_mode="normal",
        )

        eA_dif = op.models.physics.diffusive_conductance.ordinary_diffusion
        self.phys.add_model(
            propname="throat.diffusive_conductance." + self.Na.name,
            pore_diffusivity="pore.diffusivity." + self.Na.name,
            throat_diffusivity="throat.diffusivity." + self.Na.name,
            model=eA_dif,
            regen_mode="normal",
        )

        eB_dif = op.models.physics.diffusive_conductance.ordinary_diffusion
        self.phys.add_model(
            propname="throat.diffusive_conductance." + self.Cl.name,
            pore_diffusivity="pore.diffusivity." + self.Cl.name,
            throat_diffusivity="throat.diffusivity." + self.Cl.name,
            model=eB_dif,
            regen_mode="normal",
        )

        # settings for algorithms
        self.settings1 = {
            "solver_maxiter": 5,
            "solver_tol": 1e-08,
            "solver_rtol": 1e-08,
            "max_iter": 10,
        }
        self.settings2 = {
            "g_tol": 1e-4,
            "g_max_iter": 4,
            "t_output": 5000,
            "t_step": 500,
            "t_final": 20000,
            "t_scheme": "implicit",
        }
コード例 #5
0
ファイル: SalineWaterTest.py プロジェクト: zmhhaha/OpenPNM
 def test_init(self):
     self.sw = mixtures.SalineWater(network=self.net)
     assert isinstance(self.sw, mixtures.GenericMixture)