update to docx
This commit is contained in:
@@ -30,14 +30,76 @@ This is because a positive body force will favor a larger saturation of fluid A
|
||||
(positive capillary pressure ) whereas a negative body force will favor a lower
|
||||
saturation of fluid A (negative capillary pressure).
|
||||
|
||||
The simplest way to infer the capillary pressure is based on consideration of the average
|
||||
fluid pressures, which are logged to the output files ``timelog.csv`` and ``subphase.csv``.
|
||||
In the units of the lattice Boltzmann simulation, the interfacial tension is given
|
||||
as :math:`\gamma_{wn} = 6 \alpha`. Suppose that the physical interfacial tension is given by
|
||||
:math:`\gamma_{wn}^\prime`, provided in units of Pa-m. The capillary pressure in pascal will
|
||||
then be given by
|
||||
|
||||
To enable the ``centrifuge`` protocol such that the pressure of fluid B is higher than
|
||||
fluid A, the following keys can be set. Increasing the body force will lead to a larger
|
||||
capillary pressure
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
p_c^\prime = \frac{\gamma_{wn}^\prime (p_n - p_w)}{\gamma_{wn} \Delta x}
|
||||
$$
|
||||
|
||||
where :math:`\Delta x` is the voxel length in meters.
|
||||
|
||||
To enable the ``centrifuge`` protocol such that the effective pressure of fluid B is higher
|
||||
than fluid A, the input file can be specified as below. Increasing the body force will lead to
|
||||
a larger capillary pressure.
|
||||
|
||||
|
||||
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
Color {
|
||||
protocol = "centrifuge"
|
||||
timestepMax = 1000000 // maximum timtestep
|
||||
alpha = 0.005 // controls interfacial tension
|
||||
rhoA = 1.0 // controls the density of fluid A
|
||||
rhoB = 1.0 // controls the density of fluid B
|
||||
tauA = 0.7 // controls the viscosity of fluid A
|
||||
tauB = 0.7 // controls the viscosity of fluid B
|
||||
F = 0, 0, -1.0e-5 // body force
|
||||
din = 1.0 // inlet density (controls pressure)
|
||||
dout = 1.0 // outlet density (controls pressure)
|
||||
WettingConvention = "SCAL" // convention for sign of wetting affinity
|
||||
ComponentLabels = 0, -1, -2 // image labels for solid voxels
|
||||
ComponentAffinity = 1.0, 1.0, 0.6 // controls the wetting affinity for each label
|
||||
Restart = false
|
||||
}
|
||||
Domain {
|
||||
Filename = "Bentheimer_LB_sim_intermediate_oil_wet_Sw_0p37.raw"
|
||||
ReadType = "8bit" // data type
|
||||
N = 900, 900, 1600 // size of original image
|
||||
nproc = 2, 2, 2 // process grid
|
||||
n = 200, 200, 200 // sub-domain size
|
||||
offset = 300, 300, 300 // offset to read sub-domain
|
||||
voxel_length = 1.66 // voxel length (in microns)
|
||||
ReadValues = -2, -1, 0, 1, 2 // labels within the original image
|
||||
WriteValues = -2, -1, 0, 1, 2 // associated labels to be used by LBPM
|
||||
BC = 3 // boundary condition type (0 for periodic)
|
||||
}
|
||||
Analysis {
|
||||
analysis_interval = 1000 // logging interval for timelog.csv
|
||||
subphase_analysis_interval = 5000 // loggging interval for subphase.csv
|
||||
visualization_interval = 100000 // interval to write visualization files
|
||||
N_threads = 4 // number of analysis threads (GPU version only)
|
||||
restart_interval = 1000000 // interval to write restart file
|
||||
restart_file = "Restart" // base name of restart file
|
||||
}
|
||||
Visualization {
|
||||
write_silo = true // write SILO databases with assigned variables
|
||||
save_8bit_raw = true // write labeled 8-bit binary files with phase assignments
|
||||
save_phase_field = true // save phase field within SILO database
|
||||
save_pressure = false // save pressure field within SILO database
|
||||
save_velocity = false // save velocity field within SILO database
|
||||
}
|
||||
FlowAdaptor {
|
||||
}
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
protocol = "centrifuge"
|
||||
F = 0, 0, -1.0e-5
|
||||
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ The volumetric flow rate is related to the fluid velocity based on
|
||||
where :math:`C_{xy}` is the cross-sectional area and :math:`\epsilon`
|
||||
is the porosity. Given a particular experimental system
|
||||
self-similar conditions can be determined for the lattice Boltzmann
|
||||
simulation by matching the non-dimensional :math:`mbox{Ca}`. It is nearly
|
||||
simulation by matching the non-dimensional :math:`\mbox{Ca}`. It is nearly
|
||||
awlays advantageous for the timestep to be as large as possible so
|
||||
that time-to-solution will be more favorable. This is accomplished by
|
||||
|
||||
@@ -59,5 +59,51 @@ will necessarily restrict the LB parameters that can be used, which are ultimate
|
||||
manifested as a constraint on the size of a timestep.
|
||||
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
Color {
|
||||
protocol = "core flooding"
|
||||
capillary_number = 1e-4 // capillary number for the displacement
|
||||
timestepMax = 1000000 // maximum timtestep
|
||||
alpha = 0.005 // controls interfacial tension
|
||||
rhoA = 1.0 // controls the density of fluid A
|
||||
rhoB = 1.0 // controls the density of fluid B
|
||||
tauA = 0.7 // controls the viscosity of fluid A
|
||||
tauB = 0.7 // controls the viscosity of fluid B
|
||||
F = 0, 0, 0 // body force
|
||||
WettingConvention = "SCAL" // convention for sign of wetting affinity
|
||||
ComponentLabels = 0, -1, -2 // image labels for solid voxels
|
||||
ComponentAffinity = 1.0, 1.0, 0.6 // controls the wetting affinity for each label
|
||||
Restart = false
|
||||
}
|
||||
Domain {
|
||||
Filename = "Bentheimer_LB_sim_intermediate_oil_wet_Sw_0p37.raw"
|
||||
ReadType = "8bit" // data type
|
||||
N = 900, 900, 1600 // size of original image
|
||||
nproc = 2, 2, 2 // process grid
|
||||
n = 200, 200, 200 // sub-domain size
|
||||
offset = 300, 300, 300 // offset to read sub-domain
|
||||
voxel_length = 1.66 // voxel length (in microns)
|
||||
ReadValues = -2, -1, 0, 1, 2 // labels within the original image
|
||||
WriteValues = -2, -1, 0, 1, 2 // associated labels to be used by LBPM
|
||||
BC = 4 // boundary condition type (0 for periodic)
|
||||
}
|
||||
Analysis {
|
||||
analysis_interval = 1000 // logging interval for timelog.csv
|
||||
subphase_analysis_interval = 5000 // loggging interval for subphase.csv
|
||||
visualization_interval = 100000 // interval to write visualization files
|
||||
N_threads = 4 // number of analysis threads (GPU version only)
|
||||
restart_interval = 1000000 // interval to write restart file
|
||||
restart_file = "Restart" // base name of restart file
|
||||
}
|
||||
Visualization {
|
||||
write_silo = true // write SILO databases with assigned variables
|
||||
save_8bit_raw = true // write labeled 8-bit binary files with phase assignments
|
||||
save_phase_field = true // save phase field within SILO database
|
||||
save_pressure = false // save pressure field within SILO database
|
||||
save_velocity = false // save velocity field within SILO database
|
||||
}
|
||||
FlowAdaptor {
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -6,12 +6,110 @@ The fractional flow protocol is designed to perform steady-state relative
|
||||
permeability simulations by using an internal routine to change the fluid
|
||||
saturation by adding and subtracting mass to the fluid phases. The
|
||||
mass density is updated for each fluid based on the locations where
|
||||
the local rate of flow is high.
|
||||
the local rate of flow is high.
|
||||
|
||||
.. code-block:: bash
|
||||
Enabling the fractional flow protocol will automatically set the following default settings:
|
||||
|
||||
protocol = "fractional flow"
|
||||
* ``fractional_flow_increment = 0.05`` - target change in saturation between steady points
|
||||
* ``endpoint_threshold = 0.1`` - termination criterion based on the relative flow rates of fluids
|
||||
* ``mass_fraction_factor = 0.006`` - percentage change to the mass fraction (per iteration)
|
||||
* ``fractional_flow_epsilon = 5.0e-6`` - control the threshold velocity :math:`U_\epsilon`
|
||||
* ``skip_timesteps = 50000`` - timesteps to spend in adaptive part of algorithm
|
||||
* ``min_steady_timesteps = 1000000`` - minimum number of timesteps per steady point
|
||||
* ``max_steady_timesteps = 1000000`` - maximum number of timesteps per steady point
|
||||
|
||||
|
||||
|
||||
Any of these values can be manually overriden by setting the appropriate key to a custom value
|
||||
within the ``FlowAdaptor`` section of the input file database. The fractional flow
|
||||
will enforce periodic boundary conditions ``BC = 0``, and is not compatible with other
|
||||
boundary condition routines. A warning message will be printed if ``BC`` is set to a value
|
||||
other than ``0``.
|
||||
|
||||
|
||||
The basic idea for the fractional flow algorithm is to define an algorithm to modify the
|
||||
fluid saturation that will:
|
||||
|
||||
(1) minimize the introduction of end effects and gradients in saturation
|
||||
(2) respect the structure and connectivity of the fluid phases to the maximum extent
|
||||
(3) minimize the transient disruption to the flow behavior so that fewer timesteps are required to reach steady
|
||||
state
|
||||
|
||||
The strategy used to accomplish these objectives is to change saturation by either increasing
|
||||
or decreasing the mass within each fluid, depending on the sign of ``mass_fraction_factor``.
|
||||
If ``mass_fraction_factor`` is positive, the algorithm will remove mass from fluid A and add
|
||||
mass to fluid B. The opposite will happen if ``mass_fraction_factor`` is negative. The algorithm
|
||||
will selectively add mass to voxels where the local flow rate is high, since these will generally
|
||||
correspond to the mobile (i.e. not disconnected) fluid regions. A local weighting function is determined
|
||||
from the velocity :math:`\mathbf{u}_i`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
W_i = \frac{ U_\epsilon + |\mathbf{u}_i|}{U_\epsilon + \max{|\mathbf{u}_i|}}
|
||||
$$
|
||||
|
||||
where :math:`\max{|\mathbf{u}_i|}` is the maximum flow speed within fluid :math:`i` and
|
||||
:math:`U_\epsilon` is a threshold speed that is set to minimize the influence of spurious
|
||||
currents on the mass seeding algorithm. The sum of the weighting function is used to normalize
|
||||
the local weights so that the added mass will match the value specified by ``mass_fraction_factor``.
|
||||
If the flow is slower than :math:`\epsilon_m`, the algorithm will tend to add mass evenly to the system.
|
||||
For example, if the water is only present in films that flow very slowly, then mass will
|
||||
be evenly seeded throughout entire water film. Alternatively, if one or both fluids
|
||||
flows through distinct channels, the mass will be disproportionately added to these
|
||||
channels where the rate of flow is high. As system relaxes, the mass will redistribute
|
||||
spatially, causing a change to the fluid saturation.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
Color {
|
||||
protocol = "fractional flow"
|
||||
capillary_number = 1e-4 // capillary number for the displacement
|
||||
timestepMax = 1000000 // maximum timtestep
|
||||
alpha = 0.005 // controls interfacial tension
|
||||
rhoA = 1.0 // controls the density of fluid A
|
||||
rhoB = 1.0 // controls the density of fluid B
|
||||
tauA = 0.7 // controls the viscosity of fluid A
|
||||
tauB = 0.7 // controls the viscosity of fluid B
|
||||
F = 0, 0, 1.0e-5 // body force
|
||||
WettingConvention = "SCAL" // convention for sign of wetting affinity
|
||||
ComponentLabels = 0, -1, -2 // image labels for solid voxels
|
||||
ComponentAffinity = 1.0, 1.0, 0.6 // controls the wetting affinity for each label
|
||||
Restart = false
|
||||
}
|
||||
Domain {
|
||||
Filename = "Bentheimer_LB_RelPerm_intermediate_oil_wet_Sw_0p37.raw"
|
||||
ReadType = "8bit" // data type
|
||||
N = 900, 900, 1600 // size of original image
|
||||
nproc = 2, 2, 2 // process grid
|
||||
n = 200, 200, 200 // sub-domain size
|
||||
offset = 300, 300, 300 // offset to read sub-domain
|
||||
InletLayers = 0, 0, 6 // number of mixing layers at the inlet
|
||||
OutletLayers = 0, 0, 6 // number of mixing layers at the outlet
|
||||
voxel_length = 1.66 // voxel length (in microns)
|
||||
ReadValues = -2, -1, 0, 1, 2 // labels within the original image
|
||||
WriteValues = -2, -1, 0, 1, 2 // associated labels to be used by LBPM
|
||||
BC = 0 // boundary condition type (0 for periodic)
|
||||
}
|
||||
Analysis {
|
||||
analysis_interval = 1000 // logging interval for timelog.csv
|
||||
subphase_analysis_interval = 5000 // loggging interval for subphase.csv
|
||||
visualization_interval = 100000 // interval to write visualization files
|
||||
N_threads = 4 // number of analysis threads (GPU version only)
|
||||
restart_interval = 1000000 // interval to write restart file
|
||||
restart_file = "Restart" // base name of restart file
|
||||
}
|
||||
Visualization {
|
||||
write_silo = true // write SILO databases with assigned variables
|
||||
save_8bit_raw = true // write labeled 8-bit binary files with phase assignments
|
||||
save_phase_field = true // save phase field within SILO database
|
||||
save_pressure = false // save pressure field within SILO database
|
||||
save_velocity = false // save velocity field within SILO database
|
||||
}
|
||||
FlowAdaptor {
|
||||
min_steady_timesteps = 100000 // minimum number of timesteps per steady point
|
||||
max_steady_timesteps = 250000 // maximum number of timesteps per steady point
|
||||
mass_fraction_factor = 0.006 // controls the rate of mass seeding in adaptive step
|
||||
fractional_flow_increment = 0.05 // saturation change after each steady point
|
||||
endpoint_threshold = 0.1 // endpoint exit criterion (based on flow rates)
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,53 @@ To enable the image sequence protocol, the following keys should be set
|
||||
within the ``Color`` section of the input database
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
Color {
|
||||
protocol = "image sequence"
|
||||
image_sequence = "Bentheimer_LB_RelPerm_intermediate_oil_wet_Sw_0p37.raw", "Bentheimer_LB_RelPerm_intermediate_oil_wet_Sw_0p72.raw"
|
||||
// comma separated list of image names
|
||||
capillary_number = 1e-4 // capillary number for the displacement
|
||||
timestepMax = 1000000 // maximum timtestep
|
||||
alpha = 0.005 // controls interfacial tension
|
||||
rhoA = 1.0 // controls the density of fluid A
|
||||
rhoB = 1.0 // controls the density of fluid B
|
||||
tauA = 0.7 // controls the viscosity of fluid A
|
||||
tauB = 0.7 // controls the viscosity of fluid B
|
||||
F = 0, 0, 0 // body force
|
||||
WettingConvention = "SCAL" // convention for sign of wetting affinity
|
||||
ComponentLabels = 0, -1, -2 // image labels for solid voxels
|
||||
ComponentAffinity = 1.0, 1.0, 0.6 // controls the wetting affinity for each label
|
||||
Restart = false
|
||||
}
|
||||
Domain {
|
||||
Filename = "Bentheimer_LB_RelPerm_intermediate_oil_wet_Sw_0p37.raw"
|
||||
ReadType = "8bit" // data type
|
||||
N = 900, 900, 1600 // size of original image
|
||||
nproc = 2, 2, 2 // process grid
|
||||
n = 200, 200, 200 // sub-domain size
|
||||
offset = 300, 300, 300 // offset to read sub-domain
|
||||
voxel_length = 1.66 // voxel length (in microns)
|
||||
ReadValues = -2, -1, 0, 1, 2 // labels within the original image
|
||||
WriteValues = -2, -1, 0, 1, 2 // associated labels to be used by LBPM
|
||||
BC = 0 // boundary condition type (0 for periodic)
|
||||
}
|
||||
Analysis {
|
||||
analysis_interval = 1000 // logging interval for timelog.csv
|
||||
subphase_analysis_interval = 5000 // loggging interval for subphase.csv
|
||||
visualization_interval = 100000 // interval to write visualization files
|
||||
N_threads = 4 // number of analysis threads (GPU version only)
|
||||
restart_interval = 1000000 // interval to write restart file
|
||||
restart_file = "Restart" // base name of restart file
|
||||
}
|
||||
Visualization {
|
||||
write_silo = true // write SILO databases with assigned variables
|
||||
save_8bit_raw = true // write labeled 8-bit binary files with phase assignments
|
||||
save_phase_field = true // save phase field within SILO database
|
||||
save_pressure = false // save pressure field within SILO database
|
||||
save_velocity = false // save velocity field within SILO database
|
||||
}
|
||||
FlowAdaptor {
|
||||
min_steady_timesteps = 100000 // minimum number of timesteps per steady point
|
||||
max_steady_timesteps = 250000 // maximum number of timesteps per steady point
|
||||
}
|
||||
|
||||
protocol = "image sequence"
|
||||
image_sequence = "image1.raw", "image2.raw"
|
||||
|
||||
|
||||
@@ -16,3 +16,53 @@ protocol is described by Wang et al. ( https://doi.org/10.1016/j.jcp.2019.108966
|
||||
|
||||
|
||||
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
Color {
|
||||
protocol = "shell aggregation"
|
||||
capillary_number = 1e-4 // capillary number for the displacement
|
||||
timestepMax = 1000000 // maximum timtestep
|
||||
alpha = 0.005 // controls interfacial tension
|
||||
rhoA = 1.0 // controls the density of fluid A
|
||||
rhoB = 1.0 // controls the density of fluid B
|
||||
tauA = 0.7 // controls the viscosity of fluid A
|
||||
tauB = 0.7 // controls the viscosity of fluid B
|
||||
F = 0, 0, 0 // body force
|
||||
WettingConvention = "SCAL" // convention for sign of wetting affinity
|
||||
ComponentLabels = 0, -1, -2 // image labels for solid voxels
|
||||
ComponentAffinity = 1.0, 1.0, 0.6 // controls the wetting affinity for each label
|
||||
Restart = false
|
||||
}
|
||||
Domain {
|
||||
Filename = "Bentheimer_LB_sim_intermediate_oil_wet_Sw_0p37.raw"
|
||||
ReadType = "8bit" // data type
|
||||
N = 900, 900, 1600 // size of original image
|
||||
nproc = 2, 2, 2 // process grid
|
||||
n = 200, 200, 200 // sub-domain size
|
||||
offset = 300, 300, 300 // offset to read sub-domain
|
||||
InletLayers = 0, 0, 6 // number of mixing layers at the inlet
|
||||
OutletLayers = 0, 0, 6 // number of mixing layers at the outlet
|
||||
voxel_length = 1.66 // voxel length (in microns)
|
||||
ReadValues = -2, -1, 0, 1, 2 // labels within the original image
|
||||
WriteValues = -2, -1, 0, 1, 2 // associated labels to be used by LBPM
|
||||
BC = 0 // boundary condition type (0 for periodic)
|
||||
}
|
||||
Analysis {
|
||||
analysis_interval = 1000 // logging interval for timelog.csv
|
||||
subphase_analysis_interval = 5000 // loggging interval for subphase.csv
|
||||
visualization_interval = 100000 // interval to write visualization files
|
||||
N_threads = 4 // number of analysis threads (GPU version only)
|
||||
restart_interval = 1000000 // interval to write restart file
|
||||
restart_file = "Restart" // base name of restart file
|
||||
}
|
||||
Visualization {
|
||||
write_silo = true // write SILO databases with assigned variables
|
||||
save_8bit_raw = true // write labeled 8-bit binary files with phase assignments
|
||||
save_phase_field = true // save phase field within SILO database
|
||||
save_pressure = false // save pressure field within SILO database
|
||||
save_velocity = false // save velocity field within SILO database
|
||||
}
|
||||
FlowAdaptor {
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
=============================================
|
||||
Greyscale color model
|
||||
Greyscale Color Model
|
||||
=============================================
|
||||
|
||||
The LBPM greyscale lattice Boltzmann model is constructed to approximate the
|
||||
@@ -8,6 +8,155 @@ solution in open regions. A simple constitutive form is used to model the relati
|
||||
permeability in the grey regions,
|
||||
|
||||
|
||||
***************************
|
||||
Parameters
|
||||
***************************
|
||||
|
||||
The essential model parameters for the color model are
|
||||
|
||||
- ``alpha`` -- control the interfacial tension between fluids -- :math:`0 < \alpha < 0.01`
|
||||
- ``beta`` -- control the width of the interface -- :math:`\beta < 1`
|
||||
- ``tauA`` -- control the viscosity of fluid A -- :math:`0.7 < \tau_A < 1.5`
|
||||
- ``tauB`` -- control the viscosity of fluid B -- :math:`0.7 < \tau_B < 1.5`
|
||||
- ``rhoA`` -- control the viscosity of fluid A -- :math:`0.05 < \rho_A < 1.0`
|
||||
- ``rhoB`` -- control the viscosity of fluid B -- :math:`0.05 < \rho_B < 1.0`
|
||||
- ``greyscale_endpoint_A`` -- control the endpoint for greyscale components -- :math:`S_b^{r,a}`
|
||||
- ``greyscale_endpoint_B`` -- control the endpoint for greyscale components -- :math:`S_b^{r,b}`
|
||||
|
||||
|
||||
****************************
|
||||
Formulation
|
||||
****************************
|
||||
|
||||
The greyscale color model extends the conventional two-fluid color model such that flow through
|
||||
micro-porous "grey" voxels can also be treated. Extensions to the formulation are made to:
|
||||
(1) implement momentum transport behavior consistent with the single phase greyscale model
|
||||
(2) adapt the re-coloring term to allow for transport through microporosity.
|
||||
Mass transport LBEs are constructed to model the behavior for each fluid. Within the open pore
|
||||
regions, mass transport LBEs recover the behavior of the standard two-fluid color model.
|
||||
Within grey voxels the standard recoloring term is disabled so that the mass transport behavior
|
||||
can be described by a different rule within the microporous regions. The endpoints are
|
||||
specified based on the saturation of fluid B at which fluid A ceases to percolate, :math:`S_b^{r,a}`
|
||||
and the saturation of fluid B at which fluid B ceases to percolate, :math:`S_b^{r,b}`.
|
||||
The endpoints should be independently specified for each class of microporosity that is labeled
|
||||
in the input image. Between the endpoint values, the effective permeability is paramaterized based on the value
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
S_{ab} = \frac{S_b - S_b^{r,b}}{S_b^{r,a} - S_b^{r,b}}
|
||||
$$
|
||||
|
||||
|
||||
At the endpoints, the effective permeability is provided as an input parameter for
|
||||
each fluid. When :math:`S_b=S_b^{r,b}` the effective permeability of fluid B is
|
||||
zero and :math:`K_a=K^{r,a}`. Between the endpoints the Corey model predicts the
|
||||
effective permeability for fluid A according to
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
K_a = K^{r,a} (1-S_{ab})^{\lambda^a}
|
||||
$$
|
||||
|
||||
where :math:`\lambda^a=2` is the Corey exponent. Likewise,
|
||||
When :math:`S_b=S_b^{r,a}` the effective permeability for fluid A will be zero,
|
||||
and :math:`K_b=K^{r,b}` with
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
K_b = K^{r,b} S_{ab}^{\lambda^b}
|
||||
$$
|
||||
|
||||
|
||||
Two LBEs are constructed to model the mass transport,
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
A_q(\bm{x} + \bm{\xi}_q \delta t, t+\delta t) = w_q N_a \Big[1 + \frac{\bm{u} \cdot \bm{\xi}_q}{c_s^2}
|
||||
+ \beta \frac{N_b}{N_a+N_b} \bm{n} \cdot \bm{\xi}_q\Big] \;
|
||||
$$
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
B_q(\bm{x} + \bm{\xi}_q \delta t, t+\delta t) =
|
||||
w_q N_b \Big[1 + \frac{\bm{u} \cdot \bm{\xi}_q}{c_s^2}
|
||||
- \beta \frac{N_a}{N_a+N_b} \bm{n} \cdot \bm{\xi}_q\Big]\;,
|
||||
$$
|
||||
|
||||
The number density for each fluid is obtained from the sum of the mass transport distributions
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
N_a = \sum_q A_q\;, \quad N_b = \sum_q B_q\;
|
||||
$$
|
||||
|
||||
|
||||
The phase indicator field is then defined as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
\phi = \frac{N_a-N_b}{N_a+N_b}
|
||||
$$
|
||||
|
||||
The recoloring step incorporates the standard color model
|
||||
rule to model anti-diffusion at the interface within the open pores. Within grey regions,
|
||||
the anti-diffusion term must be disabled, since within grey voxels the length scale for fluid features
|
||||
is smaller than the interface width produced from the color model. Within grey voxels the
|
||||
two fluids are permitted to freely mix between the endpoints. Beyond the endpoints, the recoloring
|
||||
term is used to drive spontaneous imbibition into the grey voxels
|
||||
|
||||
|
||||
..math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
R_c =
|
||||
$$
|
||||
|
||||
The fluid density and kinematic viscosity are determined based on linear interpolation
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
\rho_0 = \frac{(1+\phi) \rho_n}{2}+ \frac{(1-\phi) \rho_w}{2} \;,
|
||||
$$
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
s_\nu = \frac{(1+\phi)}{2\tau_n} +\frac{(1-\phi)}{2\tau_w} \;,
|
||||
$$
|
||||
|
||||
where
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
\nu_w = \frac{1}{3}\Big(\tau_w - \frac{1}{2} \Big) \;, \quad
|
||||
\nu_n = \frac{1}{3}\Big(\tau_n - \frac{1}{2} \Big) \;.
|
||||
$$
|
||||
|
||||
|
||||
These values are then used to model the momentum transport.
|
||||
|
||||
|
||||
A D3Q19 LBE is constructed to describe the momentum transport
|
||||
|
||||
@@ -63,3 +212,119 @@ Combining the previous expressions,
|
||||
$$
|
||||
|
||||
|
||||
Where :math:`\bm{F}` is an external body force and :math:`c_s^2 = 1/3` is the speed of sound for the LB model.
|
||||
The moments are linearly indepdendent:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
m_k = \sum_{q=0}^{18} M_{qk} f_q\;.
|
||||
$$
|
||||
|
||||
|
||||
The relaxation parameters are determined from the relaxation time:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
\lambda_1 = \lambda_2= \lambda_9 = \lambda_{10}= \lambda_{11}= \lambda_{12}= \lambda_{13}= \lambda_{14}= \lambda_{15} = s_\nu \;,
|
||||
$$
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
\lambda_{4}= \lambda_{6}= \lambda_{8} = \lambda_{16} = \lambda_{17} = \lambda_{18}= \frac{8(2-s_\nu)}{8-s_\nu} \;,
|
||||
$$
|
||||
|
||||
The non-zero equilibrium moments are defined as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
m_1^{eq} = (j_x^2+j_y^2+j_z^2) - \alpha |\textbf{C}|, \\
|
||||
$$
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
m_9^{eq} = (2j_x^2-j_y^2-j_z^2)+ \alpha \frac{|\textbf{C}|}{2}(2n_x^2-n_y^2-n_z^2), \\
|
||||
$$
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
m_{11}^{eq} = (j_y^2-j_z^2) + \alpha \frac{|\textbf{C}|}{2}(n_y^2-n_z^2), \\
|
||||
$$
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
m_{13}^{eq} = j_x j_y + \alpha \frac{|\textbf{C}|}{2} n_x n_y\;, \\
|
||||
$$
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
m_{14}^{eq} = j_y j_z + \alpha \frac{|\textbf{C}|}{2} n_y n_z\;, \\
|
||||
$$
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
m_{15}^{eq} = j_x j_z + \alpha \frac{|\textbf{C}|}{2} n_x n_z\;,
|
||||
$$
|
||||
|
||||
where the color gradient is determined from the phase indicator field
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
\textbf{C}=\nabla \phi\;.
|
||||
$$
|
||||
|
||||
and the unit normal vector is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
$$
|
||||
\bm{n} = \frac{\textbf{C}}{|\textbf{C}|}\;.
|
||||
$$
|
||||
|
||||
|
||||
|
||||
|
||||
****************************
|
||||
Boundary Conditions
|
||||
****************************
|
||||
|
||||
|
||||
Due to the nature of the contribution of the porosity to the pressure term in the Chapman-Enskog
|
||||
expansion, periodic boundary conditions are recommended for ``lbpm_greyscaleColor_simulator``
|
||||
and can be set by setting the ``BC`` key values in the ``Domain`` section of the
|
||||
input file database
|
||||
|
||||
- ``BC = 0`` -- fully periodic boundary conditions
|
||||
|
||||
For ``BC = 0`` any mass that exits on one side of the domain will re-enter at the other
|
||||
side. If the pore-structure for the image is tight, the mismatch between the inlet and
|
||||
outlet can artificially reduce the permeability of the sample due to the blockage of
|
||||
flow pathways at the boundary. LBPM includes an internal utility that will reduce the impact
|
||||
of the boundary mismatch by eroding the solid labels within the inlet and outlet layers
|
||||
(https://doi.org/10.1007/s10596-020-10028-9) to create a mixing layer.
|
||||
The number mixing layers to use can be set using the key values in the ``Domain`` section
|
||||
of the input database
|
||||
|
||||
- ``InletLayers = 5`` -- set the number of mixing layers to ``5`` voxels at the inlet
|
||||
- ``OUtletLayers = 5`` -- set the number of mixing layers to ``5`` voxels at the outlet
|
||||
|
||||
|
||||
Reference in New Issue
Block a user