size_to_satn#

Converts values of invasion size into a saturation map

import numpy as np
import porespy as ps
import matplotlib.pyplot as plt
from edt import edt

ps.visualization.set_mpl_style()

Generate an image containing invasion sizes using the porosimetry function:

np.random.seed(0)
im = ps.generators.blobs([200, 200], porosity=0.5)
inv = ps.filters.porosimetry(im)

size#

The sizes are produced by porosimetry for instance:

satn = ps.filters.size_to_satn(size=inv)
fig, ax = plt.subplots(1, 2, figsize=[8, 4])
ax[0].imshow(inv / im, origin="lower", interpolation="none")
ax[0].set_title("Invasion map by size")
ax[0].axis(False)
ax[1].imshow(satn / im, origin="lower", interpolation="none")
ax[1].set_title("Invasion map by saturation")
ax[1].axis(False);
../../../_images/29aaa1c298bc53afa9076492f170696d7083fa98daed6add9acc435e88eeb62a.png

The saturation map makes it very easy to obtain a desired fluid configuration just by applying a threhold:

fig, ax = plt.subplots(1, 2, figsize=[8, 4])

s = 0.3
ax[0].imshow((satn < s) * (satn > 0) / im, origin="lower", interpolation="none")
ax[0].set_title(f"saturation = {s}")
ax[0].axis(False)

s = 0.6
ax[1].imshow((satn < s) * (satn > 0) / im, origin="lower", interpolation="none")
ax[1].set_title(f"saturation = {s}")
ax[1].axis(False);
../../../_images/530a1a3af8bf8a1cb1221bc8b1bf45804aa3c6a5c5a0088ef89261171f21a342.png

im#

The boolean image can be optionally passed into so that uninvaded regions can be differentiated from solid (if both are labelled 0).

fig, ax = plt.subplots(1, 2, figsize=[8, 4])

satn = ps.filters.size_to_satn(size=inv)
ax[0].imshow(satn, origin="lower", interpolation="none")
ax[0].set_title("Invasion map by size")
ax[0].axis(False)

satn = ps.filters.size_to_satn(size=inv, im=im)
ax[1].imshow(satn, origin="lower", interpolation="none")
ax[1].set_title("Invasion map by saturation")
ax[1].axis(False);
../../../_images/667b4941a43195455c3c70181cc1b39cdcdfe0513ee8e105280db4c9f3f1562f.png

The different between the two images above is that when im is not supplied, then uninvaded regions are given a lable of 0, matching solid. When im is supplied, the uninvaded regions are labelled -1.

bins#

The number of sequence values to when converting sizes. The default is 25.

fig, ax = plt.subplots(1, 2, figsize=[8, 4])

bins = 5
seq = ps.filters.size_to_satn(size=inv, bins=bins)
ax[0].imshow(seq, origin="lower", interpolation="none")
ax[0].set_title(f"bins = {bins}")
ax[0].axis(False)

bins = 25
seq = ps.filters.size_to_satn(size=inv, bins=bins)
ax[1].imshow(seq, origin="lower", interpolation="none")
ax[1].set_title(f"bins = {bins}")
ax[1].axis(False);
../../../_images/6834b726631756033a4fb98bdc345306f4c4e8e5bd70fbeec1f5ac233b164249.png