Compressive VOF Module
The compressive_vof module transports liquid volume fractions in
incompressible, isothermal flow. Liquid and gas densities and viscosities are
constant; mixture properties vary with composition. The gas occupies the
fraction left over after summing the liquids.
Setup
Load the module and select flowCompressibility: incompressible and
transport_model: module. Define at least one liquid and exactly one gas.
The example below transports water through a filled channel. Use a VOG grid
with the boundary names shown, or change those names to match your grid.
loadModule: compressive_vof
{
// Grid
grid_file_info: <Lref=1 m>
// Boundaries
boundary_conditions: <
inlet=incompressibleInlet(v=[1 m/s, 0 m/s, 0 m/s], vof=[water=1]),
outlet=fixedPressureOutlet(p=101325 Pa),
y_min=slip,
y_max=slip,
z_min=slip,
z_max=slip
>
// Initial conditions
initialCondition: <p=101325 Pa, v=1 m/s, vof=[water=1]>
// Flow properties
flowRegime: laminar
flowCompressibility: incompressible
transport_model: module
// Time stepping
timeIntegrator: BDF
timeStep: 0.001
numTimeSteps: 10
maxIterationsPerTimeStep: 100
convergenceAbsoluteTolerance: <default=1e-8, vof=1e-8>
// Fluxes and equation solvers
inviscidFlux: FOU
momentumEquationOptions: <linearSolver=SGS, relaxationFactor=0.7, maxIterations=5>
pressureCorrectionEquationOptions: <linearSolver=HYPRE, relaxationFactor=0.4, maxIterations=20, incompressibleForm>
pressureBasedMethod: SIMPLEC
vofEquationOptions: <relaxationFactor=0.7, maxIterations=5>
// VOF settings
liquidPhases: <water=incompressible(rho=1000 kg/m/m/m, mu=0.001 kg/m/s)>
gasPhase: <air=incompressible(rho=1.225 kg/m/m/m, mu=1.8e-5 kg/m/s)>
vofInviscidFlux: MIG
// Output
print_freq: 1
plot_freq: 5
plot_output: vofResidual
}
Phase Properties
Each entry in liquidPhases and gasPhase uses
incompressible(rho=..., mu=...). Density must be finite and positive;
dynamic viscosity must be finite and nonnegative. Values accept compatible
units or bare SI numbers (kg/m³ and kg/(m s)). Gas and liquid names must differ.
Density and laminar viscosity are arithmetic, volume-weighted mixtures. There is no viscosity-blending selector.
Initialization and Boundaries
Use vof=[phase=value, ...] in initialCondition or the states in
initialConditionRegions. Omitted liquids have zero fraction. Each value
must be finite and in [0,1]; their sum must not exceed one, allowing
1e-12 roundoff. Duplicate or unknown liquid names are rejected.
The gas is implicit and must not appear in the list.
For regional initialization, replace initialCondition with, for example:
initialConditionRegions: <
default=state(p=101325 Pa, u=[1 m/s, 0 m/s, 0 m/s], vof=[water=0]),
slug=state(p=101325 Pa, u=[1 m/s, 0 m/s, 0 m/s], vof=[water=1]),
regions=[inBox(p1=[0, 0, 0], p2=[0.02, 0.1, 0.1], composition=slug)]
>
incompressibleInlet, subsonicInlet, totalPressureInlet, inflow,
and farfield require a vof list. Outlet fractions are extrapolated
from the adjacent cell, including during reverse flow. Wall fractions are
also extrapolated; contact-angle boundary conditions are not supported.
For incompressible VOF, subsonicInlet requires T, but its value is
ignored:
inlet=subsonicInlet(mdot=0.144 lbm/s, T=68 F, vof=[water=1])
incompressibleInlet does not require T.
Periodic boundaries obtain VOF from paired cells. Use the standard
translational or rotational setup;
no vof list is needed.
Advection and Boundedness
vofInviscidFlux selects FOU (default), IG, MIG, FBIC, or
TVD. FOU uses upwind fractions; the other choices reconstruct face values.
Bounded face reconstruction does not guarantee bounded intermediate cell
solutions or nonlinear convergence.
With overUnderFillingCorrection: off (default), each VOF linear solve
clips liquid fractions to [0,1] and rescales them if their sum exceeds one.
This projection can change phase inventory. Setting the option to on
disables that projection and enables the older face correction for IG, MIG,
and FBIC. FOU and TVD have no such face correction. Keep the default unless
specifically evaluating that alternative.
vofViscosity defaults to zero. It is a nonnegative implicit stabilization
coefficient in kg/(m s), with a compensating source contribution. It changes
the iterative solve, not the converged transport equation or physical mixture
viscosity.
Equation Solvers and Convergence
vofEquationOptions controls the inner linear iterations:
Entry |
Default |
Meaning |
|---|---|---|
|
|
SGS is the only supported solver. |
|
|
Finite value in |
|
|
Nonnegative integer inner-iteration limit; zero skips the linear updates. |
Add vof to either convergence-tolerance list to include every liquid
in the nonlinear stopping criterion:
convergenceAbsoluteTolerance: <default=1e-8, vof=1e-8>
convergenceRelativeTolerance: <vof=1e-4>
Every liquid must satisfy its absolute or relative tolerance, along with
the other active equations. Absolute tolerances use the RV: residuals in
kg/s. Relative tolerances use each liquid’s first positive residual in the
current time step; references reset at every step, including restart entry.
There is no separate gas-fraction equation.
Tolerances must be finite and nonnegative. Once enabled, vof overrides
default in each list; a missing entry uses 1e-30. An active legacy
convergenceTolerance overrides the absolute tolerance and sets the relative
tolerance to 1e-30. Omit it when using the lists above.
Without an explicit vof entry, VOF residuals do not affect stopping.
Reaching maxIterationsPerTimeStep still advances the solution and warns
for each liquid that has not met its requested tolerance.
Prescribed-Curvature Surface Tension
Surface tension requires exactly one liquid, sigma in N/m, and a finite
constant kappaAnalytical in 1/m. The module does not compute curvature from
the interface or impose static or dynamic contact angles.
Use inviscidFlux: FOU or SOU and momentum-interpolation form new
(the default), newer, or Denner. Other combinations are rejected.
For example, to prescribe a positive curvature of 100 1/m:
momentumInterpolationOptions: <form=Denner>
sigma: 0.072
kappaAnalytical: 100
sigma must be finite and nonnegative. This prescribed-curvature setup does
not model an interface whose curvature changes as it moves.
Output and Diagnostics
At plot times, the module writes vof_<phaseName> scalar fields for every
liquid and the gas. output/liquidVolume.dat records cycle, time, and the
volume of each liquid at print_freq. Liquid columns are sorted by phase
name (case-sensitive).
Add vofResidual to plot_output to write all liquid residual fields:
plot_output: vofResidual
Files are named output/vofResidual_<liquidName>_sca.<cycle>_<modelName>.
Values are signed, unnormalized mass-equation residuals (kg/s), interpolated
to nodes. Plot the absolute value for magnitude; interpolation can smooth or
cancel neighboring values. RV: instead sums absolute cell residuals.
The fields follow the standard end-of-step and plot_output_iteration
timing described in Field Data Written to Output Directory.
Enable vofBoundednessDiagnostics: on to write
output/vofBoundedness.dat (default off). Each nonlinear iteration
records one row per liquid and the implicit gas:
Columns |
Meaning |
|---|---|
|
Time-step index, nonlinear-iteration index, and phase name. |
|
Cell-fraction extrema before the boundedness projection. |
|
Number of cells changed by clipping or rescaling. |
|
Signed and absolute volume changes due to the projection, in m³. |
These are changes from one linear solve’s projection, not cumulative time-step
mass errors. With overUnderFillingCorrection: on, projection changes are
zero even when raw fractions exceed their bounds.