Open AlPaPet opened 8 months ago
I can provide an answer, but it may or may not be satisfactory.
In a physical system, small droplets will dissolve relatively quickly due to Ostwald ripening. SInce a small droplet has a high capillary pressure, Henry's law will cause these droplets to dissolve more quickly than larger droplets. The equilibrium condition is that all droplets should have an equal curvature (and therefore equal capillary pressure). This situation will be most evident in a liquid-gas system where water vapor exchanges mass between droplets.
In an oil-water system where the miscibility is very low (i.e. only a very small amount of oil dissolves in water), the Ostwald ripening process will happen extremely slowly. From the standpoint of a numerical model, it is in this situation useful to minimize the flux of mass across the oil-water interface. This is effectively what the interface rule for the color model accomplishes.
Minimizing the mass flux across the interface has a consequence, which is that small droplets may form and they will not dissolve, since the Ostwald ripening process will be effectively killed by the numerical rule at the interface. These little droplets form within films along the solid grain, driven by heterogeneities of the surface. If the surface is flat, they won't form. If there is curvature then the film thickness will vary accordingly and cause droplets to form within small cavities, which may break off from the surface.
Many people working with the color model have been troubled by these small droplets. In a practical simulation case (e.g. as you perform above), what you should care about is how much much these droplets impact the overall rate of mass transport. In a well-resolved system this should be small (our studies have shown this, including comparison with experiments). The subphase analysis module (see https://lbpm-sim.org/userGuide/models/color/analysis/subphase.html) provides a way to estimate this, since transport due to the largerst blob (by volume) is separated from the "disconnected blobs" (which will include all of the small droplets). An advantage of the color model is that, since trapped fluids will not dissolve, representation of the residual oil endpoint will be persistent. Having some film dynamics represented is an advantage, although there are always going to be some questions about whether these physics are represented accurately. Since LBMs are a mesoscopic method, they can represent films better than you might first expect. In any case, the contribution of these effects should be relatively small in a well-resolved image.
In LBMs more generally, small droplets can be eliminated by other methods. The key factor is how the Ostwald ripening mechanism is represented. Shan-Chen methods will reproduce the Ostwald ripening mechanism, but it can be difficult to control the timescale for dissollution (since this is controlled by the same parameter that controls interfacial tension in a "basic" Shan-Chen model). Free energy methods can also capture this effect, but one has to be very careful that the particular scheme conserves mass (many formulations do not). Some of these models are also implemented in LBPM, but they are less mature compared to the color model. For most digital rock applications, the color model is probably the most pragmatic choice. Thousands of alternative schemes have been published, and some of these are certainly worth exploring if addressing this issue is something that you would like to explore.
Thank you very much for your comprehensive answer!
Dear Professor McClure, I'am trying to test your code for imbitition simulation on a simple artificial porous medium sample (basically just a regular array of vertical solid columns), and noticed a strange thing considering the fluid/fluid interface. When the surface of the columns sides is smooth, the fluid/fluid interface looks normal. If the surface of the columns sides is rugous, multiple small droplets of the invading fluid are observed at quite a significant distance from the main advancing fluid/fluid interface. The issue is present for different contact angles. Do you know what could be causing this behavior of the code? The input parameters for lbpm_color_simulator look like: Domain { Filename = "VoxelFile_LBPM_566_600_610_s0p1_SWAP.dat" ReadType = "8bit" // data type nproc = 1, 3, 2 // process grid n = 566, 200, 305 // sub-domain size
N = 566, 600, 610 // size of original image voxel_length = 1.0 // voxel length (in microns) ReadValues = 0, 1, 2 // labels within the original image WriteValues = 0, 1, 2 // associated labels to be used by LBPM BC = 4 // boundary condition type (4 for flux) } Color { tauA = 1.0; // relaxation time for fluid A (labeled as "1") tauB = 1.0; // relaxation time for fluid B (labeled as "2") rhoA = 1.0; // density for fluid A (in lattice units) rhoB = 1.0; // density for fluid B (in lattice units) alpha = 2.0e-4; // controls the surface tension beta = 0.9; // controls the interface width F = 0, 0, 0 // controls the external force Restart = false // initialize simulation from restart file? timestepMax = 2100000 // maximum number of timesteps to perform before exit ComponentLabels = 0 // number of immobile component labels in the input image ComponentAffinity = -0.5 // wetting condition for each immobile component flux = -60.0 // volumetric flux at the z-inlet in voxels per timestep } Analysis { analysis_interval = 10000 // Frequency to perform analysis visualization_interval = 100000 // Frequency to write visualization data restart_interval = 100000 // Frequency to write restart data restart_file = "Restart" // Filename to use for restart file (will append rank) N_threads = 1 // Number of threads to use for analysis load_balance = "independent" // Load balance method to use: "none", "default", "independent" } Visualization { format = "hdf5" 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 = true // save pressure field within SILO database save_velocity = true // save velocity field within SILO database } FlowAdaptor { } Thank you for your answer.