Source code for openpnm.utils._health
import numpy as np
from openpnm.utils import HealthDict
__all__ = [
'check_data_health',
'check_network_health',
]
[docs]
def check_data_health(obj):
r"""
Checks the health of pore and throat data arrays.
Parameters
----------
obj : Base
A handle of the object to be checked
Returns
-------
health : dict
Returns a HealthDict object which is a basic dictionary with an
added ``health`` attribute that is ``True`` is all entries in the
dict are deemed healthy (empty lists), or ``False`` otherwise.
"""
health = HealthDict()
for item in obj.props():
health[item] = []
if obj[item].dtype == 'O':
health[item] = 'No checks on object'
elif np.sum(np.isnan(obj[item])) > 0:
health[item] = 'Has NaNs'
elif np.shape(obj[item])[0] != obj._count(item.split('.', 1)[0]):
health[item] = 'Wrong Length'
return health
[docs]
def check_network_health(network):
r"""
This method checks the topological health of the network
The following aspects are checked for:
(1) Isolated pores
(2) Disconnected clusters of pores
(3) Duplicate throats
(4) Headless throats
(5) Bidirectional throats
Returns
-------
health : dict
A dictionary containing the offending pores or throat numbers
under each named key.
Notes
-----
It also returns a list of which pores and throats should be trimmed
from the network to restore health. This list is a suggestion only,
and is based on keeping the largest cluster and trimming the others.
- Does not yet check for duplicate pores
- Does not yet suggest which throats to remove
- This is just a 'check' and does not 'fix' the problems it finds
"""
import openpnm.models.network as mods
health = HealthDict()
# Check for headless throats
headless = mods.headless_throats(network)
health['headless_throats'] = np.where(headless)[0].tolist()
# Check for throats that loop back onto the same pore
looped = mods.looped_throats(network)
health['looped_throats'] = np.where(looped)[0].tolist()
# Check for individual isolated pores
isolated = mods.isolated_pores(network)
health['isolated_pores'] = np.where(isolated)[0].tolist()
# Check for separated clusters of pores
size = mods.cluster_size(network)
mx = np.max(size)
health['disconnected_pores'] = np.where(size < mx)[0].tolist()
# Check for duplicate throats
dupes = mods.duplicate_throats(network)
health['duplicate_throats'] = np.where(dupes)[0].tolist()
# Check for bidirectional throats
bidir = mods.bidirectional_throats(network)
health['bidirectional_throats'] = np.where(bidir)[0].tolist()
return health