Source code for openpnm.models.geometry.pore_surface_area._funcs

import numpy as _np
from openpnm.models.geometry import _geodocs
import logging


logger = logging.getLogger(__name__)


__all__ = ["sphere",
           "circle",
           "cube",
           "square"
           ]


[docs] @_geodocs def sphere( network, pore_diameter='pore.diameter', throat_cross_sectional_area='throat.cross_sectional_area', amin=0, ): r""" Calculates internal surface area of pore bodies assuming they are spheres, then subtracts the areas of the neighboring throats Parameters ---------- %(network)s %(Dp)s %(Act)s amin : float The lower limit for surface area, useful for preventing Returns ------- surface_areas : ndarray Numpy ndarry containing pore surface area values Notes ----- This function subtracts the area of the neighboring throats in a crude way, by simply considering the throat cross-sectional area, thus not accounting for the actual curvature of the intersection. """ R = network[pore_diameter] / 2 value = 4 * _np.pi * R**2 Tca = network[throat_cross_sectional_area] _np.subtract.at(value, network.conns[:, 0], Tca) _np.subtract.at(value, network.conns[:, 1], Tca) if amin is not None: value = _np.clip(value, amin, _np.inf) elif _np.any(value < 0): logger.warn('Negative pore surface areas found') return value
[docs] @_geodocs def circle( network, pore_diameter='pore.diameter', throat_cross_sectional_area='throat.cross_sectional_area', amin=0, ): r""" Calculates internal surface area of pore bodies assuming they are circular then subtracts the area of the neighboring throats. Parameters ---------- %(network)s %(Dp)s %(Act)s amin : float The lower limit for surface area, useful for preventing Returns ------- Notes ----- """ value = _np.pi * network[pore_diameter] Tca = network[throat_cross_sectional_area] _np.subtract.at(value, network.conns[:, 0], Tca) _np.subtract.at(value, network.conns[:, 1], Tca) if amin is not None: value = _np.clip(value, amin, _np.inf) elif _np.any(value < 0): logger.warn('Negative pore surface areas found') return value
[docs] def cube( network, pore_diameter='pore.diameter', throat_cross_sectional_area='throat.cross_sectional_area', amin=0, ): r""" Calculates internal surface area of pore bodies assuming they are cubes then subtracts the area of the neighboring throats. Parameters ---------- %(network)s %(Dp)s %(Act)s amin : float The lower limit for surface area, useful for preventing Returns ------- """ D = network[pore_diameter] value = 6.0 * D**2 Tca = network[throat_cross_sectional_area] _np.subtract.at(value, network.conns[:, 0], Tca) _np.subtract.at(value, network.conns[:, 1], Tca) if amin is not None: value = _np.clip(value, amin, _np.inf) elif _np.any(value < 0): logger.warn('Negative pore surface areas found') return value
[docs] def square( network, pore_diameter='pore.diameter', throat_cross_sectional_area='throat.cross_sectional_area', amin=0, ): r""" Calculates internal surface area of pore bodies assuming they are squares then subtracts the area of the neighboring throats. Parameters ---------- %(network)s %(Dp)s %(Act)s amin : float The lower limit for surface area, useful for preventing Returns ------- """ D = network[pore_diameter] value = 4.0 * D Tca = network[throat_cross_sectional_area] _np.subtract.at(value, network.conns[:, 0], Tca) _np.subtract.at(value, network.conns[:, 1], Tca) if amin is not None: value = _np.clip(value, amin, _np.inf) elif _np.any(value < 0): logger.warn('Negative pore surface areas found') return value