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.

Water-channel setup
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:

VOF linear solver

Entry

Default

Meaning

linearSolver

SGS

SGS is the only supported solver.

relaxationFactor

0.5

Finite value in (0,1].

maxIterations

5

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:

Boundedness diagnostics

Columns

Meaning

n, it, phase

Time-step index, nonlinear-iteration index, and phase name.

rawMin, rawMax

Cell-fraction extrema before the boundedness projection.

changedCells

Number of cells changed by clipping or rescaling.

deltaVolume, absDeltaVolume

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.