percolating_porosity#

This function computes the fraction of the void space which percolates along a given axis or between specified inlets and outlets.

import matplotlib.pyplot as plt
import numpy as np

import porespy as ps

im#

The image of the void space to analyze

eps = np.linspace(0.01, 0.99, 25)
perc = []
for e in eps:
    im = ps.generators.blobs([100, 100], porosity=e, seed=2)
    tmp = ps.metrics.percolating_porosity(im)
    perc.append(tmp)
fig, ax = plt.subplots(figsize=[4, 4])
ax.plot(eps, perc, 'b.-')
ax.set_xlabel('Total porosity')
ax.set_ylabel('Percolating porosity');
../../../_images/a390dd5ddcf68c371d92c5610297850dc0eec4df0d5506381eb0346624f0f102.png

axis vs inlets and outlets#

Since percolation is direction dependent it is necessary to specify the axis along which percolation should be checked. The default is axis=0, but this can be set to 1 or 2. Alternatively it is possible to specify inlets and outlets as a pair of boolean images with True values indicate the inlet and outlet pixels/voxels. For instance consider the following image which percolates from left to right, but not top to bottom:

im = ps.generators.blobs([100, 100], porosity=0.55, seed=5)
fig, ax = plt.subplots(figsize=[4, 4])
ax.imshow(im)
ax.axis(False);
../../../_images/621ee2d3b8854161efad18774808545734307140d8eb7884ce49ba30698e9d22.png
eps_0 = ps.metrics.percolating_porosity(im, axis=0)
eps_1 = ps.metrics.percolating_porosity(im, axis=1)

print(f"The percolating porosity in the x and y directions is {eps_0} and {eps_1}")
The percolating porosity in the x and y directions is 0.0 and 0.2621

conn#

The conn argument can be set to min or max and controls how pixels must be connected when looking for percolation. For min this means 4 and 8 neighbors in 2D and 3D respectively, while max means 8 and 26 for 3D.

im = ps.generators.blobs([100, 100], porosity=0.5, seed=4)
fig, ax = plt.subplots(figsize=[4, 4])
ax.imshow(im)
ax.axis(False);
../../../_images/53b21c742b671748342141c646b6d0640d8c33ee1e12de394421e105266c35ac.png

The above image has a cluster on the left side which is only connected to the percolating cluster via corners, so the percolating porosity will differ depending on the conn argument.

eps_min = ps.metrics.percolating_porosity(im, axis=1, conn='min')
eps_max = ps.metrics.percolating_porosity(im, axis=1, conn='max')

print(f"The percolating porosity in the x and y directions is {eps_min} and {eps_max}")
The percolating porosity in the x and y directions is 0.2703 and 0.3013