Source code for openpnm.models.physics.capillary_pressure._funcs
import logging
import numpy as _np
from transforms3d import _gohlketransforms as tr
from openpnm.models import physics as pm
from openpnm.models import _doctxt
from openpnm.models.physics._utils import _get_key_props
logger = logging.getLogger(__name__)
__all__ = [
"washburn",
"purcell",
]
[docs]
@_doctxt
def washburn(phase,
surface_tension="throat.surface_tension",
contact_angle="throat.contact_angle",
diameter="throat.diameter"):
r"""
Computes the capillary entry pressure assuming the throat in a
cylindrical tube.
Parameters
----------
%(phase)s
surface_tension : str
%(dict_blurb)s surface tension. If a pore property is given, it is
interpolated to a throat list.
contact_angle : str
%(dict_blurb)s contact angle. If a pore property is given, it is
interpolated to a throat list.
diameter : str
%(dict_blurb)s throat diameter
Returns
-------
%(return_arr)s capillary entry pressure
Notes
-----
The Washburn equation is:
.. math::
P_c = -\frac{2\sigma(cos(\theta))}{r}
This is the most basic approach to calculating entry pressure and is
suitable for highly non-wetting invading phases in most materials.
"""
network = phase.network
sigma = phase[surface_tension]
theta = phase[contact_angle]
r = network[diameter] / 2
value = -2 * sigma * _np.cos(_np.radians(theta)) / r
if diameter.split(".")[0] == "throat":
pass
else:
value = value[phase.pores()]
value[_np.absolute(value) == _np.inf] = 0
return value
[docs]
@_doctxt
def purcell(phase,
r_toroid,
surface_tension="throat.surface_tension",
contact_angle="throat.contact_angle",
diameter="throat.diameter"):
r"""
Computes the throat capillary entry pressure assuming the throat is a
toroid.
Parameters
----------
%(phase)s
r_toroid : float or array_like
The radius of the toroid surrounding the pore
surface_tension : str
%(dict_blurb)s surface tension.
contact_angle : str
%(dict_blurb)s contact angle.
diameter : str
%(dict_blurb)s throat diameter
Returns
-------
%(return_arr)s capillary entry pressure
Notes
-----
This approach accounts for the converging-diverging nature of many throat
types. Advancing the meniscus beyond the apex of the toroid requires an
increase in capillary pressure beyond that for a cylindical tube of the
same radius. The details of this equation are described by Mason and
Morrow [1]_, and explored by Gostick [2]_ in the context of a pore network
model.
References
----------
.. [1] G. Mason, N. R. Morrow, Effect of contact angle on capillary
displacement curvatures in pore throats formed by spheres. J.
Colloid Interface Sci. 168, 130 (1994).
.. [2] J. Gostick, Random pore network modeling of fibrous PEMFC gas
diffusion media using Voronoi and Delaunay tessellations. J.
Electrochem. Soc. 160, F731 (2013).
"""
network = phase.network
sigma = phase[surface_tension]
theta = phase[contact_angle]
r = network[diameter] / 2
R = r_toroid
alpha = (
theta - 180 + _np.rad2deg(_np.arcsin(_np.sin(_np.radians(theta)) / (1 + r / R)))
)
value = (-2 * sigma / r) * (
_np.cos(_np.radians(theta - alpha))
/ (1 + R / r * (1 - _np.cos(_np.radians(alpha))))
)
if diameter.split(".")[0] == "throat":
pass
else:
value = value[phase.pores()]
return value