Source code for openpnm.models.physics.ad_dif_conductance._funcs
import numpy as _np
from openpnm.models import _doctxt
__all__ = ["ad_dif"]
[docs]
@_doctxt
def ad_dif(
phase,
pore_pressure='pore.pressure',
throat_hydraulic_conductance='throat.hydraulic_conductance',
throat_diffusive_conductance='throat.diffusive_conductance',
s_scheme='powerlaw'
):
r"""
Calculates the advective-diffusive conductance of conduits in network.
Parameters
----------
%(phase)s
pore_pressure : str
%(dict_blurb)s pore pressure
throat_hydraulic_conductance : str
%(dict_blurb)s hydraulic conductance
throat_diffusive_conductance : str
%(dict_blurb)s throat diffusive conductance
s_scheme : str
Name of the space discretization scheme to use
Returns
-------
%(return_arr)s advection-diffuvsion conductance values
Notes
-----
This function calculates the specified property for the *entire*
network then extracts the values for the appropriate throats at the
end.
This function assumes cylindrical throats with constant cross-section
area. Corrections for different shapes and variable cross-section area
can be imposed by passing the proper conduit_shape_factors argument
when computing the diffusive and hydraulic conductances.
shape_factor depends on the physics of the problem, i.e.
diffusion-like processes and fluid flow need different shape factors.
"""
network = phase.project.network
cn = network['throat.conns']
# Find g for half of pore 1, throat, and half of pore 2
P = phase[pore_pressure]
gh = phase[throat_hydraulic_conductance]
gd = phase[throat_diffusive_conductance]
if gd.size == network.Nt:
gd = _np.tile(gd, 2)
# Special treatment when gd is not Nt by 1 (ex. mass partitioning)
elif gd.size == 2 * network.Nt:
gd = gd.reshape(network.Nt * 2, order='F')
else:
raise Exception(f"Shape of {throat_diffusive_conductance} must either"
r" be (Nt,1) or (Nt,2)")
Qij = -gh * _np.diff(P[cn], axis=1).squeeze()
Qij = _np.append(Qij, -Qij)
Peij = Qij / gd
Peij[(Peij < 1e-10) & (Peij >= 0)] = 1e-10
Peij[(Peij > -1e-10) & (Peij <= 0)] = -1e-10
# Correct the flow rate
Qij = Peij * gd
if s_scheme == 'upwind':
w = gd + _np.maximum(0, -Qij)
elif s_scheme == 'hybrid':
w = _np.maximum(0, _np.maximum(-Qij, gd - Qij / 2))
elif s_scheme == 'powerlaw':
w = gd * _np.maximum(0, (1 - 0.1 * _np.absolute(Peij))**5) + \
_np.maximum(0, -Qij)
elif s_scheme == 'exponential':
w = -Qij / (1 - _np.exp(Peij))
else:
raise Exception('Unrecognized discretization scheme: ' + s_scheme)
w = w.reshape(network.Nt, 2, order='F')
return w