Source code for openpnm.topotools._perctools
import logging
import numpy as np
import scipy.sparse as sprs
from scipy.sparse import csgraph
from openpnm.utils import PrintableDict, Workspace
from openpnm._skgraph import simulations
from openpnm._skgraph import queries
from collections import namedtuple
logger = logging.getLogger(__name__)
ws = Workspace()
__all__ = [
'ispercolating',
'find_isolated_clusters',
'trim_disconnected_clusters',
'site_percolation',
'bond_percolation',
'find_clusters',
'find_path',
]
[docs]
def find_path(network, pore_pairs, weights=None):
return queries.find_path(network=network, pairs=pore_pairs, weights=weights)
find_path.__doc__ = queries.find_path.__doc__
[docs]
def ispercolating(network, inlets, outlets):
if np.array(inlets).dtype == bool:
inlets = np.where(inlets)[0]
if np.array(outlets).dtype == bool:
outlets = np.where(outlets)[0]
flag = simulations.ispercolating(
conns=network.conns,
occupied=np.ones(network.Nt, dtype=bool),
inlets=inlets,
outlets=outlets
)
return flag
ispercolating.__doc__ = simulations.ispercolating.__doc__
[docs]
def site_percolation(network, occupied_sites):
return simulations.site_percolation(network.conns, occupied_sites)
site_percolation.__doc__ = simulations.site_percolation.__doc__
[docs]
def bond_percolation(network, occupied_bonds):
return simulations.bond_percolation(network.conns, occupied_bonds)
bond_percolation.__doc__ = simulations.bond_percolation.__doc__
[docs]
def trim_disconnected_clusters(**kwargs):
return simulations.trim_disconnected_clusters(**kwargs)
trim_disconnected_clusters.__doc__ = \
simulations.trim_disconnected_clusters.__doc__
[docs]
def find_isolated_clusters(network, mask, inlets):
r"""
Identifies pores and throats that are invaded but not connected to the inlets
Parameters
----------
network : dict
The OpenPNM Network
mask : ndarray
A boolean mask of either Nt or Np length with ``True`` values
indicating invaded bonds or sites. If this array is Nt-long then
then bond percolation is used to identify clusters, whereas site
percolation is used if it is Np-long.
inlets : ndarray
A array containing indices of the pores which define the inlets. Any
clusters not connected to these sites are considered isolated.
Returns
-------
sites : ndarray
An ndarray containing the indices of invaded pores which are not
connected to the given ``inlets``.
"""
labels = find_clusters(network=network, mask=mask)
isolated = np.in1d(labels.pore_labels, labels.pore_labels[inlets], invert=True)
isolated = np.where(isolated)[0]
return isolated
[docs]
def find_clusters(network, mask=[]):
r"""
Identify connected clusters of pores and throats in the network.
Either site and bond percolation can be considered, see description of
``mask`` argument for details.
Parameters
----------
network : Network
The network
mask : array_like, boolean
A list of open bonds or sites (throats or pores). If the mask is
Np-long, then the method will perform a site percolation to identify
clusters, and if the mask is Nt-long bond percolation will be
performed.
Returns
-------
p_labels, t_labels : tuple of ndarrays
A tuple containing an Np-long array of pore cluster labels, and an
Nt-long array of throat cluster labels. The label numbers correspond
such that pores and throats with the same label are part of the same
cluster. Uninvaded locations are set to -1.
"""
# Parse the input arguments
mask = np.array(mask, ndmin=1)
if mask.dtype != bool:
raise Exception('Mask must be a boolean array of Np or Nt length')
# If pore mask was given perform site percolation
if np.size(mask) == network.Np:
(p_clusters, t_clusters) = \
simulations.site_percolation(network.conns, mask)
# If pore mask was given perform bond percolation
elif np.size(mask) == network.Nt:
(p_clusters, t_clusters) = \
simulations.bond_percolation(network.conns, mask)
else:
raise Exception('Mask received was neither Nt nor Np long')
result = namedtuple('result', ('pore_labels', 'throat_labels'))
result.pore_labels = p_clusters
result.throat_labels = t_clusters
return result