Source code for openpnm.models.physics.hydraulic_conductance._funcs

import numpy as _np
from openpnm.models import _doctxt


__all__ = [
    "generic_hydraulic",
    "hagen_poiseuille",
    "valvatne_blunt",
]


[docs] @_doctxt def generic_hydraulic( phase, pore_viscosity='pore.viscosity', throat_viscosity='throat.viscosity', size_factors='throat.hydraulic_size_factors' ): r""" Calculates the hydraulic conductance of conduits in network. Parameters ---------- %(phase)s pore_viscosity : str %(dict_blurb)s pore viscosity throat_viscosity : str %(dict_blurb)s throat viscosity size_factors : str %(dict_blurb)s conduit hydraulic size factors Returns ------- %(return_arr)s hydraulic conductance """ network = phase.network conns = network.conns mu1, mu2 = phase[pore_viscosity][conns].T mut = phase[throat_viscosity] SF = network[size_factors] if isinstance(SF, dict): # Legacy approach F1, Ft, F2 = SF.values() elif SF.ndim > 1: # Nt-by-3 array F1, Ft, F2 = SF.T else: # Nt array, like from network extraction predictions F1, Ft, F2 = _np.inf, SF, _np.inf g1 = F1 / mu1 gt = Ft / mut g2 = F2 / mu2 return 1 / (1/g1 + 1/gt + 1/g2)
[docs] @_doctxt def hagen_poiseuille( phase, pore_viscosity="pore.viscosity", throat_viscosity="throat.viscosity", size_factors="throat.hydraulic_size_factors" ): r""" Calculates the hydraulic conductance of conduits in network. Parameters ---------- %(phase)s pore_viscosity : str %(dict_blurb)s pore viscosity throat_viscosity : str %(dict_blurb)s throat viscosity size_factors : str %(dict_blurb)s conduit hydraulic size factors Returns ------- %(return_arr)s hydraulic conductance """ return generic_hydraulic(phase=phase, pore_viscosity=pore_viscosity, throat_viscosity=throat_viscosity, size_factors=size_factors)
[docs] @_doctxt def valvatne_blunt( phase, pore_viscosity="pore.viscosity", throat_viscosity="throat.viscosity", pore_shape_factor="pore.shape_factor", throat_shape_factor="throat.shape_factor", pore_area="pore.area", throat_area="throat.cross_sectional_area", conduit_lengths="throat.conduit_lengths", ): r""" Calculates the single phase hydraulic conductance of conduits. Function has been adapted for use with the Statoil imported networks and makes use of the shape factor in these networks to apply Hagen-Poiseuille flow for conduits of different shape classes: triangular, square and circular [2]. Parameters ---------- %(phase)s pore_viscosity : str %(dict_blurb)s pore viscosity throat_viscosity : str %(dict_blurb)s throat viscosity pore_shape_factor : str %(dict_blurb)s pore geometric shape factor throat_shape_factor : str %(dict_blurb)s throat geometric shape factor pore_area : str %(dict_blurb)s pore area The pore area is calculated using following formula: .. math:: A_P = \frac{R_P^2}{(4 \cdot SF_P)} where theoratical value of pore_shape_factor in a circular tube is calculated using following formula: .. math:: SF_P = \frac{A_P}{P_P^2} = 1/4π throat_area : str %(dict_blurb)s throat area. The throat area is calculated using following formula: .. math:: T_A = \frac{R_T^2}{(4 \cdot SF_T)} where theoratical value of throat shape factor in circular tube is calculated using : .. math:: SF_T = \frac{T_A}{T_P^2} = 1/4π conduit_lengths : str %(dict_blurb)s throat conduit lengths Returns ------- %(return_arr)s References ---------- [1] Valvatne, Per H., and Martin J. Blunt. "Predictive pore‐scale modeling of two‐phase flow in mixed wet media." Water Resources Research 40, no. 7 (2004). [2] Patzek, T. W., and D. B. Silin (2001), Shape factor and hydraulic conductance in noncircular capillaries I. One-phase creeping flow, J. Colloid Interface Sci., 236, 295–304. """ network = phase.network conns = network["throat.conns"] mu_p = phase[pore_viscosity] mu_t = phase[throat_viscosity] # Fetch model parameters L1, Lt, L2 = network[conduit_lengths].T Gp = network[pore_shape_factor] Gt = network[throat_shape_factor] Ap = network[pore_area] At = network[throat_area] # Throat portions tri = Gt <= _np.sqrt(3) / 36.0 circ = Gt >= 0.07 square = ~(tri | circ) ntri = _np.sum(tri) nsquare = _np.sum(square) ncirc = _np.sum(circ) kt = _np.ones_like(Gt) kt[tri] = 3.0 / 5.0 kt[square] = 0.5623 kt[circ] = 0.5 # Pore portions tri = Gp <= _np.sqrt(3) / 36.0 circ = Gp >= 0.07 square = ~(tri | circ) ntri += _np.sum(tri) nsquare += _np.sum(square) ncirc += _np.sum(circ) kp = _np.ones_like(Gp) kp[tri] = 3.0 / 5.0 kp[square] = 0.5623 kp[circ] = 0.5 # Calculate conductance values gp = kp * Ap**2 * Gp / mu_p gt = kt * At**2 * Gt / mu_t value = L1 / gp[conns[:, 0]] + Lt / gt + L2 / gp[conns[:, 1]] return 1 / value