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])
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')
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", }
def test_init(self): self.sw = mixtures.SalineWater(network=self.net) assert isinstance(self.sw, mixtures.GenericMixture)