Color model – Core Flooding¶
The core flooding protocol is designed to mimic SCAL experiments where one immiscible fluid is injected into the sample at a constant rate, displacing the other fluid. The core flooding protocol relies on a flux boundary condition to ensure that fluid is injected into the sample at a constant rate. The flux boundary condition implements a time-varying pressure boundary condition that adapts to ensure a constant volumetric flux. Details for the flux boundary condition are available (see: https://doi.org/10.1016/j.compfluid.2020.104670)
protocol = "core flooding"
To match experimental conditions, it is usually important to match the capillary number, which is
\mbox{Ca} = \frac{\mu u_z}{\gamma}
where \mu is the dynamic viscosity, u_z is the fluid (usually water) velocity and \gamma is the interfacial tension. The volumetric flow rate is related to the fluid velocity based on
Q_z = \epsilon C_{xy} u_z
where C_{xy} is the cross-sectional area and \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 \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
use a high value for the numerical surface tension (e.g.
alpha=1.0e-2
)use a small value for the fluid viscosity (e.g.
tau_w = 0.7
andtau_n = 0.7
)determine the volumetric flow rate needed to match \mbox{Ca}
For the color LBM the interfacial tension is \gamma = 6 \alpha and the dynamic viscosity is \mu = \rho(\tau-1/2)/3, where the units are relative to the lattice spacing, timestep and mass density. Agreemetn between the experimental and simulated values for \mbox{Ca} is ensured by setting the volumetric flux
Q_z = \frac{\epsilon C_{xy} \gamma }{\mu} \mbox{Ca}
where the LB units of the volumetric flux will be voxels per timestep.
In some situations it may also be important to match other non-dimensional numbers, such as the viscosity ratio, density ratio, and/or Ohnesorge/Laplace number. This can be accomplished with an analogous procedure. Enforcing additional constraints will necessarily restrict the LB parameters that can be used, which are ultimately manifested as a constraint on the size of a timestep.
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 {
}