Skip to content

Network Validation

Network validation runs single-phase flow and diffusion on an extracted pore network, using OpenPNM,2 and reports the network's permeability and effective diffusivity. Put them next to the image-based permeability and diffusivity of the same sample and you can judge how well the network represents the pore space before you use it for anything else.

  • Solves Stokes flow and Fickian diffusion on the pore network, as a linear resistor network
  • Backend PoreSpy on CPU, solved with OpenPNM
  • Reports the network permeability \(k\) and \(D_\text{eff}/D_0\)
  • How to run it Network Validation in the User guide

PoreStore doesn't compare the numbers for you: it computes the network values. The comparison is yours to make.

The problem being solved

Each conduit, half a pore, then a throat, then half the next pore, is a set of resistors in series. Its hydraulic and diffusive conductances are

\[ g_h = \left( \frac{\mu}{F^h_1} + \frac{\mu}{F^h_t} + \frac{\mu}{F^h_2} \right)^{-1}, \qquad g_d = \left( \frac{1}{D_0 F^d_1} + \frac{1}{D_0 F^d_t} + \frac{1}{D_0 F^d_2} \right)^{-1}, \]

where the subscripts 1, \(t\) and 2 are the two pore halves and the throat, and \(F^h\) and \(F^d\) are their hydraulic and diffusive size factors, computed from their diameters and lengths under an assumed geometric shape (the shape model).

The method

With \(\mu = 1\) and \(D_0 = 1\):

  1. Trim the network. OpenPNM's health check flags isolated pores, pores outside the largest connected cluster, and headless, looped, duplicate or bidirectional throats, and all of them are removed in one step. Flow and diffusion are then solved on exactly the connected network that remains, whose pores and throats the result counts.
  2. Choose the faces. One marker point is placed just outside each face normal to the Flow direction, at 0.9 times the lowest and 1.1 times the highest pore coordinate along that axis, centred on the other two axes. The pores that OpenPNM's surface-pore search links to each marker by a Delaunay triangulation become the inlet and outlet. The side faces get no condition, so nothing flows or diffuses across them.
  3. Stokes flow. With \(p = 1\) at the inlet and \(p = 0\) at the outlet, solve the mass balance at every internal pore \(i\), summed over the pores \(j\) it shares a throat with: $$ \sum_{j} g_{h,ij}\,(p_i - p_j) = 0 . $$ Then, with \(Q\) the total flow rate through the inlet pores, $$ k = \frac{Q\,\mu\,L}{A\,\Delta p}. $$
  4. Fickian diffusion. With \(c = 1\) and \(c = 0\) at the same faces, solve the same balance with \(g_d\) and \(c\). Then, with \(\dot n\) the total molar flow rate through the inlet pores, $$ \frac{D_\text{eff}}{D_0} = \frac{\dot n\,L}{A\,D_0\,\Delta c}. $$

\(L\) is the image length along the flow direction, and \(A\) is the image's full cross-section, so \(D_\text{eff}/D_0\) includes porosity, as in the image-based diffusivity.

Boundary conditions

inlet pores p = 1, c = 1 marker at 0.9 × lowest pore coordinate outlet pores p = 0, c = 0 marker at 1.1 × highest pore coordinate Flow direction (x, y or z) → side faces: no condition set, so no flux wb wb L = image length along the flow axis (N voxels × voxel size) A = the image's whole cross-section normal to the flow axis dashed bands: SNOW boundary layers, wb voxels wide, present only when the extraction used boundary_width > 0
How the faces are chosen. After trimming, one marker point is placed just beyond each face normal to the flow direction, at 0.9 × the lowest and 1.1 × the highest pore coordinate along it and centred on the other two axes. The pores linked to that marker in a Delaunay triangulation become the inlet or outlet. No other pore gets a condition, so the side faces carry no flux. L is the length of the image itself, without padding, while a SNOW2 network's boundary pores sit in a boundary width of padding added beyond each face, so the network extends past L at both ends. In progress The drawing assumes the rule picks those boundary pores, the outermost ones; whether it does on a real network still needs a run to settle.

Shape models

The Geometry shape model decides how a pore or throat of a given diameter converts to a conductance. The default, Cones and Cylinders, treats each pore half as a truncated cone that narrows from the pore's diameter to the throat's, and the throat as a cylinder. It accepts throats wider than the pores they join, which SNOW2 and MAGNET networks nearly always contain. The options are OpenPNM's size-factor models:

Spheres and Cylinders · Cones and Cylinders · Cubes and Cuboids · Pyramids and Cuboids · Intersecting Cones · Intersecting Pyramids · N Cylinders in Series · Circles and Rectangles · Squares and Rectangles · Trapezoids and Rectangles

The last three are made of flat shapes; use one of the others for a network extracted from a 3D image.

Which diameters feed them is set by the Pore diameter key and Throat diameter key. The defaults are the equivalent diameters, which conserve each pore's volume and each throat's cross-sectional area. Inscribed diameters give smaller conductances. A diameter the network doesn't have, as a MAGNET network without throat areas lacks throat.equivalent_diameter, is refused rather than replaced with another, since the result would describe a different network.

D₁ Dₜ D₂ centre-to-centre distance Lctc pore 1 pore 2 L₁ = D₁/2 Lₜ = Lctc − L₁ − L₂ L₂ = D₂/2 μ/F₁ μ/Fₜ μ/F₂ g = 1 / (μ/F₁ + μ/Fₜ + μ/F₂)
One conduit under the default shape model, Cones and Cylinders. Each pore half is a truncated cone of length D/2 running from the pore's centre, where it has the pore's diameter, to the throat, where it has the throat's; the throat is a cylinder filling the rest of the distance between the pore centres. When two pores overlap, closer than (D₁ + D₂)/2, the halves are shortened to meet and the throat length goes to zero. The three size factors combine in series; the diffusive conductance combines its own size factors the same way. Other shape models change the segments, not the series sum.

Units

The network permeability is computed in voxel² and shown in m², and in millidarcy as the headline, once the image has a voxel size; \(D_\text{eff}/D_0\) is dimensionless. Changing the image's voxel size updates the permeability without a rerun. See Units and voxel size.

Reading the result

  • How close is close? A good extraction can come within a few percent of the image-based permeability: MAGNET's authors report 5% on their test image.1 Gaps of tens of percent are common, and usually come from the throat-size definition, so try another throat diameter key or shape model.
  • Consistency checks. A network that gets permeability right but diffusivity badly wrong, or the reverse, is usually misrepresenting pore volume or throat length.
  • Same faces, different conditions. The network sees no-flux side faces, like the diffusivity solvers, not the periodic ones the image-based permeability solvers use. Expect the largest gap on narrow samples.

References


  1. M. McKague, H. Fathiannasab, M. A. Sadeghi, J. T. Gostick, "MAGNET: Medial Axis Guided Network Extraction Tool," InterPore Journal 2 (2025) IPJ011225-7. doi:10.69631/g47x8w91 ↩

  2. J. Gostick et al., "OpenPNM: A pore network modeling package," Computing in Science & Engineering 18 (2016) 60–74. doi:10.1109/MCSE.2016.49 ↩