Source code for openpnm.models.geometry.throat_volume._funcs
import numpy as _np
from openpnm.models.geometry import _geodocs
__all__ = ["cylinder",
"cuboid",
"rectangle",
"extrusion",
"lens",
"pendular_ring"]
[docs]
@_geodocs
def cylinder(
network,
throat_diameter='throat.diameter',
throat_length='throat.length',
):
r"""
Calculate throat volume assuing a cylindrical shape
Parameters
----------
%(network)s
%(Dt)s
%(Lt)s
Returns
-------
volumes : ndarray
A numpy ndarray containing throat volume values
Notes
-----
This models does not account for the volume reprsented by the
intersection of the throat with a spherical pore body. Use the ``lens``
or ``pendular_ring`` models in addition to this one to account for this
volume.
"""
leng = network[throat_length]
diam = network[throat_diameter]
value = _np.pi/4*leng*diam**2
return value
[docs]
@_geodocs
def cuboid(
network,
throat_diameter='throat.diameter',
throat_length='throat.length',
):
r"""
Calculate throat volume assuing a square cross-section
Parameters
----------
%(network)s
%(Dt)s
%(Lt)s
Returns
-------
Notes
-----
At present this models does NOT account for the volume reprsented by the
intersection of the throat with a spherical pore body.
"""
leng = network[throat_length]
diam = network[throat_diameter]
value = leng*diam**2
return value
[docs]
@_geodocs
def rectangle(
network,
throat_diameter='throat.diameter',
throat_length='throat.length',
):
r"""
Calculate throat volume assuing a rectangular shape
Parameters
----------
%(network)s
%(Dt)s
%(Lt)s
Returns
-------
Notes
-----
At present this models does NOT account for the volume reprsented by the
intersection of the throat with a spherical pore body.
"""
return network[throat_length] * network[throat_diameter]
[docs]
@_geodocs
def extrusion(
network,
throat_length='throat.length',
throat_area='throat.cross_sectional_area',
):
r"""
Calculate throat volume from the throat area and the throat length. This
method is useful for abnormal shaped throats.
Parameters
----------
%(network)s
%(Lt)s
%(At)s
Returns
-------
Notes
-----
At present this models does NOT account for the volume reprsented by the
intersection of the throat with a spherical pore body.
"""
leng = network[throat_length]
area = network[throat_area]
value = leng*area
return value
[docs]
@_geodocs
def lens(
network,
throat_diameter='throat.diameter',
pore_diameter='pore.diameter',
):
r"""
Calculates the volume residing the hemispherical caps formed by the
intersection between cylindrical throats and spherical pores.
This volume should be subtracted from throat volumes if the throat lengths
were found using throat end points.
Parameters
----------
%(network)s
%(Dt)s
%(Dp)s
Returns
-------
Notes
-----
This model does not consider the possibility that multiple throats might
overlap in the same location which could happen if throats are large and
connectivity is random.
See Also
--------
pendular_ring
"""
conns = network['throat.conns']
Rp = network[pore_diameter]/2
Rt = network[throat_diameter]/2
a = _np.atleast_2d(Rt).T
q = _np.arcsin(a/Rp[conns])
b = Rp[conns]*_np.cos(q)
h = Rp[conns] - b
V = 1/6*_np.pi*h*(3*a**2 + h**2)
return _np.sum(V, axis=1)
[docs]
@_geodocs
def pendular_ring(
network,
throat_diameter='throat.diameter',
pore_diameter='pore.diameter',
):
r"""
Calculates the volume of the pendular rings residing between the end of
a cylindrical throat and spherical pores that are in contact but not
overlapping.
This volume should be added to the throat volume if the throat length was
found as the center-to-center distance less the pore radii.
Parameters
----------
%(network)s
%(Dt)s
%(Dp)s
Returns
-------
Notes
-----
This model does not consider the possibility that multiple throats might
overlap in the same location which could happen if throats are large and
connectivity is random.
See Also
--------
lens
"""
conns = network['throat.conns']
Rp = network[pore_diameter]/2
Rt = network[throat_diameter]/2
a = _np.atleast_2d(Rt).T
q = _np.arcsin(a/Rp[conns])
b = Rp[conns]*_np.cos(q)
h = Rp[conns] - b
Vlens = 1/6*_np.pi*h*(3*a**2 + h**2)
Vcyl = _np.pi*(a)**2*h
V = Vcyl - Vlens
return _np.sum(V, axis=1)