In this section, we describe in some detail the pore network model used in this study, the numerical methods used to solve it and the procedure for calculating the time-averaged quantities described in the previous section.
The pore network model is a dynamic model that takes both viscous and capillary forces into account. It keeps track of the fluid–fluid interface locations and evolves these in time according to the calculated pressures and flow rates in each pore. This provides a time series of the fluctuating total quantities \(\tilde{Q}_\text {w}\), \(\tilde{Q}_\text {n}\) and \(\Delta \tilde{p}\) for the entire network, in steady state. Subsequently, these time series are averaged to get time-averaged steady-state flow properties.
Validation of the pore network modeling approach is provided through earlier works. These include Aker et al. (1998a, 2000), Erpelding et al. (2013), Sinha et al. (2017) and the benchmark study by Zhao et al. (2019).
Pore Network Model
The model describes flow of two incompressible and immiscible fluids (\(\text {w}\) and \(\text {n}\)) in a porous medium. The porous medium is represented by a network consisting of N nodes that are connected by M links. The nodes are each given an index \(i \in \left[ 0, \ldots , N-1\right]\), and the links are identified by the two nodes ij that they connect. An example pore network is shown in Fig. 2. The nodes have no volume, and the pore space volume is thus assigned to the links. Furthermore, it is assumed that each fluid fills the entire link cross sections. The location of a fluid–fluid interface can then be described by a single number which gives its position in the link. For each link, the vector \(\mathbf {z}_{ij}\) contains the positions of the fluid interfaces in that link.
The flow in each link is treated in a one-dimensional fashion, averaged over the link cross sections. We consider flows in relatively small cross sections only and therefore neglect any effects of fluid inertia. The volumetric flow rate from node j to node i through the link connecting the two nodes is then given by,
$$\begin{aligned} q_{ij}&= -\lambda _{ij} \left( \mathbf {z}_{ij} \right) \left\{ p_i - p_j - c_{ij} \left( \mathbf {z}_{ij} \right) \right\} . \end{aligned}$$
(15)
Herein, \(p_i\) is the pressure in node i, \(\lambda _{ij}\) is the link’s mobility and \(c_{ij}\) is the net pressure difference across the link due to its fluid interfaces. Both \(\lambda _{ij}\) and \(c_{ij}\) depend on the interface positions \(\mathbf {z}_{ij}\). For two nodes i and j not connected by a link, \(\lambda _{ij} = 0\). Applying mass conservation at each node i yields,
$$\begin{aligned} \sum _j q_{ij}&= 0. \end{aligned}$$
(16)
The cross-sectional area of link ij is \(a_{ij}\). The interface positions \(\mathbf {z}_{ij}\) therefore evolve in time according to the advection equation,
$$\begin{aligned} \frac{\text {d}}{\text {d}t} \mathbf {z}_{ij} = \frac{q_{ij}}{a_{ij}}, \end{aligned}$$
(17)
when sufficiently far away from the nodes. Close to the nodes, they are subject to additional models that account for interface interactions in the nodes. This is further described in Gjennestad et al. (2018).
Link Mobility Model
The link mobility depends on link geometry and fluid viscosities. We assume cylindrical links when computing the mobilities and thus
$$\begin{aligned} \lambda _{ij} \left( \mathbf {z}_{ij} \right)&= \frac{\pi r_{ij}^4}{8 L_{ij} \mu _{ij} \left( \mathbf {z}_{ij} \right) }. \end{aligned}$$
(18)
Here, \(L_{ij}\) is the link length, \(r_{ij}\) is the link radius and \(\mu _{ij} \left( \mathbf {z}_{ij} \right)\) is the volume-weighted average of the fluid viscosities \(\mu _\text {w}\) and \(\mu _\text {n}\).
Interfacial Pressure Discontinuity Model
There may be zero, one or more interfaces in each link. Their positions along the link are contained in \(\mathbf {z}_{ij}\). Each element in \(\mathbf {z}_{ij}\) is thus between 0 and \(L_{ij}\). The symbol \(c_{ij}\) denotes the sum of the interfacial pressure discontinuities in link ij. We assume that the links are much wider near the ends than in the middle and that the pressure discontinuities become negligibly small for interfaces near the ends. The pressure discontinuities are therefore modeled by
$$\begin{aligned} c_{ij} \left( \mathbf {z}_{ij} \right)&= \frac{2 \sigma _{\text {w}\text {n}}}{r_{ij}} \sum _{z \in \mathbf {z}_{ij}} \left( \pm 1 \right) \left\{ 1 - \cos \left( 2 \pi \chi \left( z \right) \right) \right\} . \end{aligned}$$
(19)
Herein, \(\sigma _{\text {w}\text {n}}\) is the interfacial tension and
$$\begin{aligned} \chi \left( z \right)&= {\left\{ \begin{array}{ll} 0, &{}\quad \text {if} \ z< r_{ij}, \\ \frac{z - r_{ij}}{L_{ij} - 2 r_{ij}}, &{}\quad \text {if} \ r_{ij}< z < L_{ij} - r_{ij}, \\ 1, &{}\quad \text {if} \ z > L_{ij} - r_{ij}. \end{array}\right. } \end{aligned}$$
(20)
The effect of the \(\chi\)-function is to introduce zones of length \(r_{ij}\) at each end of the links where the pressure discontinuity of any interface is zero.
Numerical Solution Method
Solving the pore network model numerically involves stepping the fluid–fluid interface locations forward in time, from one discrete point in time to the next. This is be accomplished by applying a Runge–Kutta method to the M ODEs, one for each link, given by (17). Each evaluation of the right-hand sides during the integration requires simultaneously solving the mass conservation equations (16) and the constitutive equations (15) for the flow rate in each link.
The time at the discrete point n is
$$\begin{aligned} t^{\left( n \right) }&= \sum _{i=0}^{n-1} \Delta t^{\left( i \right) }, \end{aligned}$$
(21)
where the time step length \(\Delta t^{\left( i \right) }\) is the difference between \(t^{\left( i+1 \right) }\) and \(t^{\left( i \right) }\). For ease of notation, we let quantities evaluated at the discrete time points be denoted by their associated time point index in superscript, e.g.,
$$\begin{aligned} q^{\left( n \right) }_{ij}&= q_{ij} \left( t^{\left( n \right) } \right) . \end{aligned}$$
(22)
Mobilities and pressure discontinuities with superscripts are evaluated with the interface positions at the time point indicated,
$$\begin{aligned} \lambda ^{\left( n \right) }_{ij}&= \lambda _{ij} \left( \mathbf {z}^{\left( n \right) }_{ij} \right) , \end{aligned}$$
(23)
$$\begin{aligned} c^{\left( n \right) }_{ij}&= c_{ij} \left( \mathbf {z}^{\left( n \right) }_{ij} \right) . \end{aligned}$$
(24)
In this work, we use the forward Euler method to integrate the ODEs (17). However, other and more sophisticated solution methods can also be used (Gjennestad et al. 2018). Applying the forward Euler method to (17), we get
$$\begin{aligned} \mathbf {z}_{ij}^{\left( n+1 \right) }&= \mathbf {z}_{ij}^{\left( n \right) } + \Delta t^{\left( n \right) } \frac{q_{ij}^{\left( n \right) }}{a_{ij}}. \end{aligned}$$
(25)
The link flow rates herein are calculated by introducing the constitutive equation (15), evaluated at the current interface positions,
$$\begin{aligned} q_{ij}^{\left( n \right) }&= -\lambda ^{\left( n \right) }_{ij} \left\{ p_i^{\left( n \right) } - p_{j}^{\left( n \right) } - c_{ij}^{\left( n \right) } \right\} , \end{aligned}$$
(26)
into the mass conservation equations (16). This yields a system of linear equations, with one equation
$$\begin{aligned} \sum _j \lambda _{ij}^{\left( n \right) } p_j^{\left( n \right) } - p_i^{\left( n \right) } \sum _j \lambda _{ij}^{\left( n \right) }&= -\sum _j \lambda _{ij}^{\left( n \right) } c_{ij}^{\left( n \right) }, \end{aligned}$$
(27)
for each node i with an unknown pressure.
One forward Euler time step is then taken by first obtaining the pressure in each node by solving the linear system, using the current interface positions. Subsequently, the link flow rates are calculated using (26) and the interface positions updated according to (25).
Time Step Restrictions
Since we use the explicit forward Euler method to integrate the interface positions in time, short enough time steps must be chosen to ensure numerical stability. The length of time step n is set according to the criteria in Gjennestad et al. (2018),
$$\begin{aligned} \Delta t^{(n)} = \min \left( \Delta t^{(n)}_\text {c}, \Delta t^{(n)}_\text {a}\right) , \end{aligned}$$
(28)
where
$$\begin{aligned} \Delta t^{(n)}_\text {a}&= C_\text {a}\min _{ij} \left( \frac{a_{ij} L_{ij}}{q_{ij}^{(n)}} \right) , \end{aligned}$$
(29)
$$\begin{aligned} \Delta t^{(n)}_\text {c}&= C_\text {c}\min _{ij} \left( \frac{2 a_{ij} }{ \lambda _{ij}^{(n)} \left| \sum _{z \in \mathbf {z}_{ij}^{(n)}} \frac{\partial c_{ij}}{\partial z} \right| } \right) , \end{aligned}$$
(30)
and the parameters \(C_\text {a}\) and \(C_\text {c}\) are set to 0.1 and 0.9, respectively.
Boundary Conditions
We carry out simulations in a network that can be laid out in two dimensions, as illustrated in Fig. 2b. The network is periodic both in the flow direction and in the transverse direction. Two different boundary conditions are explored: (1) A constant pressure difference of \(\Delta p\) is applied across the periodic boundary in the flow direction, and (2) a constant total flow rate Q is prescribed. The length of the network in the flow direction is denoted \(\Delta x\) and the average pressure gradient in the network is thus \(\Delta p/\Delta x\).
The boundary conditions corresponding to a constant applied \(\Delta p\) can be incorporated directly into the linear system (27) when this is solved during each time step. This is done by adding to or subtracting from each equation i in the linear system a term \(\lambda _{ij}^{\left( n \right) } \Delta p\) for each link ij that extends across the periodic boundary.
The boundary conditions corresponding to a prescribed flow rate Q are applied as follows. Since the model is linear, the total flow rate is related to the current pressure drop by
$$\begin{aligned} Q&= C_1 + C_2 \Delta \tilde{p}, \end{aligned}$$
(31)
where the constants \(C_1\) and \(C_2\) depend on the current interface positions in a non-trivial way. By selecting two different, but otherwise arbitrary, pressure drops \(\Delta \tilde{p}_1\) and \(\Delta \tilde{p}_2\) and solving the linear system (27) for both of them, we obtain the corresponding total flow rates \(Q_1\) and \(Q_2\). The quantities \(C_1\) and \(C_2\) can then be calculated from,
$$\begin{aligned} C_1&= \frac{Q_2 - Q_1}{\Delta \tilde{p}_2 - \Delta \tilde{p}_1}, \end{aligned}$$
(32)
$$\begin{aligned} C_2&= \frac{Q_2 \Delta \tilde{p}_1 - Q_1 \Delta \tilde{p}_2}{\Delta \tilde{p}_1 - \Delta \tilde{p}_2}. \end{aligned}$$
(33)
Subsequently, (31) can be solved for the pressure difference \(\Delta \tilde{p}\) necessary to get the prescribed total flow rate Q, and a forward Euler time step can be taken with this pressure difference incorporated into the linear system (27).
Computation of Steady-State Time Averages from Network Simulations
The porous medium we consider is modeled by a network of links, and the total volume of the links is the pore volume \(V_\text {p}\). The network is embedded in a three-dimensional block of solid material with thickness \(\Delta x\) in the flow direction and cross-sectional area A. The volume V of the porous block and its porosity \(\varphi\) are then easily calculated by (1) and (2), respectively.
The saturation \(S_\text {w}\) may be computed at any time during the simulation, by adding up the fluid volumes for all links. However, since we use periodic boundary conditions, \(S_\text {w}\) is a constant in each simulation. So is \(S_\text {n}= 1 - S_\text {w}\).
In the case of constant applied pressure gradient \(\Delta p/\Delta x\), the quantities that we need to compute from the actual simulations are Q, \(Q_\text {w}\) and \(Q_\text {n}\). These are time averages of the fluctuating quantities \(\tilde{Q}\), \(\tilde{Q}_\text {w}\) and \(\tilde{Q}_\text {n}\). The model is stepped forward in time as described in the previous section. We approximate the time-average Q by summing over the total flow rates \(\tilde{Q}^{\left( n\right) }\) at each time step n (after steady state has been reached),
$$\begin{aligned} Q = \frac{\sum _n \tilde{Q}^{\left( n\right) } \Delta t^{\left( n\right) } }{\sum _n \Delta t^{\left( n\right) }}. \end{aligned}$$
(34)
The time-averaged quantities \(Q_\text {w}\) and \(Q_\text {n}\) are calculated from \(\tilde{Q}_\text {w}^{\left( n\right) }\) and \(\tilde{Q}_\text {w}^{\left( n\right) }\) in an analogous manner.
The instantaneous flow rate \(\tilde{Q}^{\left( n\right) }\) can be computed by constructing a plane cutting through the network, transverse to the flow direction, and adding together the flow rates \(q_{ij}^{\left( n\right) }\) of all links intersecting the plane. We denote the set of intersecting links by B and add up,
$$\begin{aligned} \tilde{Q}^{\left( n\right) } = \sum _{ij \in B} q_{ij}^{\left( n\right) }. \end{aligned}$$
(35)
Since the fluids are incompressible, it does not matter where this cut is made.
The instantaneous flow rate \(\tilde{Q}^{\left( n\right) }_\text {w}\) is computed by making several cuts, denote the set of cuts by C, and computing the sum
$$\begin{aligned} \tilde{Q}^{\left( n\right) }_\text {w}= \frac{1}{\left| C \right| } \sum _{B \in C} \sum _{ij \in B} s_{ij}^{\left( n\right) } q_{ij }^{\left( n\right) }. \end{aligned}$$
(36)
Herein, \(\left| C \right|\) denotes the number of elements in C, i.e., the number of cuts, and \(s_{ij}^{\left( n\right) }\) is the volume fraction of wetting fluid in the volume of fluid that flowed past the middle of link ij during time step n. \(\tilde{Q}_\text {n}^{\left( n\right) }\) is computed in an analogous manner. Having computed the time averages Q, \(Q_\text {w}\) and \(Q_\text {n}\) we may the obtain the time-averaged flow velocity, mobility, fractional flow and relative permeabilities using (6), (7), (5), (8) and (9).
If Q is fixed instead of \(\Delta p/\Delta x\), the time-averaged value of the pressure gradient is computed by
$$\begin{aligned} \frac{\Delta p}{\Delta x} = \frac{\sum _n \Delta \tilde{p}^{\left( n\right) } \Delta t^{\left( n\right) } }{\Delta x \sum _n \Delta t^{\left( n\right) }}, \end{aligned}$$
(37)
where \(\Delta \tilde{p}^{\left( n\right) }\) is the pressure difference across the network during time step n.
Using steady-state averages calculated as described above, the capillary number is computed according to,
$$\begin{aligned} \text {Ca}&= \frac{\mu \left| Q \right| }{\varphi A \sigma _{\text {w}\text {n}}}, \end{aligned}$$
(38)
where the average viscosity \(\mu\) is defined as,
$$\begin{aligned} \mu&= S_\text {w}\mu _\text {w}+ S_\text {n}\mu _\text {n}. \end{aligned}$$
(39)
Dimensional Analysis
As can be surmised from the description above, the network and five numbers are given as input to steady-state simulations. In the case of constant pressure-difference boundary conditions, the five numbers are the fluid viscosities \(\mu _\text {w}\) and \(\mu _\text {n}\), the fluid–fluid interfacial tension \(\sigma _{\text {w}\text {n}}\), the pressure gradient \(\Delta p/\Delta x\) and the saturation \(S_\text {w}\). Any change in the steady-state averages is the response of the model to variations in these inputs. If we consider the network topology and aspect ratios fixed, and only allow for a linear scaling of the network size, any variations in the network can be described by a single length scale. We choose the average pore radius \(\bar{r}\).
By the Buckingham \(\pi\) theorem (Rayleigh 1892), the total of six dimensional input variables can be reduced to three dimensionless variables. This means that any combination of the six inputs that give the same three dimensionless variables is similar and differs only in scale. Any dimensionless output from the model is therefore the same for the same values of the dimensionless input variables. One choice of dimensionless variables is
$$\begin{aligned} S_\text {w}, \end{aligned}$$
(40)
$$\begin{aligned} M&= \frac{\mu _\text {n}}{\mu _\text {w}}, \end{aligned}$$
(41)
$$\begin{aligned} \Pi&= \left| \frac{\Delta p}{\Delta x} \right| \frac{\bar{r}^2}{2 \sigma _{\text {w}\text {n}}}, \end{aligned}$$
(42)
where M is the viscosity ratio. The variable \(\Pi\) is a dimensionless pressure gradient. It represents the ratio of the average pressure drop over a length \(\bar{r}\) to the Young–Laplace pressure difference over an interface in a pore of radius \(\bar{r}\). In particular, when \(\Pi = 1\), we have
$$\begin{aligned} \left| \frac{\Delta p}{\Delta x} \right| \bar{r} = \frac{2 \sigma _{\text {w}\text {n}}}{\bar{r}}, \end{aligned}$$
(43)
and the average pressure drop over the length \(\bar{r}\) is equal to the typical Young–Laplace pressure difference.
Since it relates the average pressure drop to the capillary forces, \(\Pi\) may be expected to play a similar role as the capillary number. This should be true at least when capillary numbers are high and the average pressure drop is dominated by viscous contributions. However, \(\Pi\) is perhaps even more closely related to the ganglion mobilization number. This was defined by Avraam and Payatakes (1995) as the ratio between the driving force exerted on a ganglion and its resistance to motion resulting from capillary forces.
Simulations
Steady-state simulations were performed using the pore network model described in this section. All simulations were run on \(72 \times 48\) hexagonal networks, similar to that shown in Fig. 2b. These networks consisted of 3456 nodes and 5184 links. All links had the same length L, and link radii were uniformly distributed between 0.1L and 0.4L. For each of the 288 combinations of the input parameters listed in Table 1, 21 values of \(S_\text {w}\) were used, evenly spaced on the interval \(\left[ 0, 1\right]\). In total, \(288\times 21 = 6048\) simulations were run. As this paper is concerned with immiscible two-phase flow, we do not use vanishingly small values of the interfacial tension. Time-averaged quantities were calculated from simulation results as described in Sect. 3.3. The averaging time corresponded to 10 pore volumes of flow.
Table 1 Range of input parameters used in the steady-state pore network model simulations. For each combination of the input parameters listed, 21 values of \(S_\text {w}\), evenly spaced on the interval \(\left[ 0, 1\right]\), were used. The corresponding ranges of the dimensionless variables M, \(\Pi\) and \(\text {Ca}\) are also given