Compressive VOF Module
Stream supports incompressible gas-liquid and multi-liquid interface capturing through the
compressive_vof module. The module solves transport equations for liquid volume fractions (VOF),
builds mixture density and viscosity from phase properties, and adds optional surface-tension and
contact-angle forcing to the momentum equation.
Enable the module by adding loadModule: compressive_vof to the run control file:
loadModule: compressive_vof
{
... standard run control file content
}
Control File Setup
The module expects phase property definitions and VOF state definitions in the run control file.
Phase Properties
Two run-control variables define phase properties:
liquidPhases: one or more named incompressible liquid phases.gasPhase: incompressible gas phase used for the non-liquid remainder.
Each phase must provide rho and mu.
liquidPhases: <
water=incompressible(rho=998.2 kg/m/m/m, mu=1.0e-3 kg/m/s),
oil=incompressible(rho=850.0 kg/m/m/m, mu=4.0e-3 kg/m/s)
>
gasPhase: <
air=incompressible(rho=1.225 kg/m/m/m, mu=1.8e-5 kg/m/s)
>
The liquid fraction for each phase is tracked separately. The gas fraction is computed as:
Initial Conditions
The module requires VOF initialization in initialCondition (uniform) or
initialConditionRegions (regional states), using a vof=[phase=value,...] list
whose phase names match those in liquidPhases.
initialCondition: <p=0 Pa, v=0.0 m/s, vof=[water=1.0, oil=0.0]>
initialConditionRegions: <
default=state(vof=[water=0.0, oil=0.0]),
slug=state(vof=[water=1.0, oil=0.0]),
regions=[
inBox(p1=[0.0, 0.0, 0.0], p2=[0.02, 0.002, 0.002], composition=slug)
]
>
Boundary Conditions
For incompressibleInlet, subsonicInlet, totalPressureInlet, inflow, and farfield
boundaries, a vof list is required.
subsonicInlet accepts velocity or flow-rate specifications and requires
T through the common inlet interface. With flowCompressibility: incompressible
and constant phase properties, this temperature does not enable heat transport
or change the phase densities. For example:
Inlet=subsonicInlet(mdot=0.144 lbm/s,T=68 F,vof=[water=1.0,oil=0.0])
incompressibleInlet can specify the same flow without T.
boundary_conditions: <
Inlet=incompressibleInlet(v=[0.2 m/s, 0.0 m/s, 0.0 m/s], vof=[water=1.0, oil=0.0]),
Outlet=fixedPressureOutlet(p=0.0 Pa),
Wall=noslip
>
Periodic boundaries obtain VOF from the paired cells; no vof list is needed.
Use the standard translational or rotational periodic setup.
For no-slip walls, an optional per-boundary static contact angle override can be provided:
Wall=noslip(contactAngle=35 deg)
If contactAngle is provided, units must be degrees and the value must be in [0,180].
VOF Transport and Property Options
The following variables control VOF transport and property blending.
Variable |
Allowed Values |
Default |
Description |
|---|---|---|---|
|
|
|
Inviscid flux for liquid-volume-fraction transport. |
|
real |
|
Extra numerical diffusion coefficient used in VOF assembly. |
|
|
|
Mixture laminar viscosity blending model. |
|
|
|
Enables face-level over/under-fill correction in non-FOU VOF advection. |
vofViscosityBlend=linear uses arithmetic blending by volume fraction.
vofViscosityBlend=harmonic uses harmonic blending and is often preferable for high viscosity-ratio flows.
The solver also performs a final boundedness projection on each VOF solve collapse:
individual liquid fractions are clipped to [0,1] and renormalized if their sum exceeds 1.
VOF Equation Solver Options
vofEquationOptions configures the VOF linear solve controls.
Entry |
Allowed Values |
Default |
Description |
|---|---|---|---|
|
|
|
Linear solver used for |
|
real in |
|
Relaxation factor for VOF equation update. |
|
integer |
|
Maximum VOF linear iterations per nonlinear iteration. |
Example:
vofEquationOptions: <linearSolver=SGS, relaxationFactor=0.6, maxIterations=8>
Nonlinear Convergence
Add vof to either convergence-tolerance list to include the liquid equations
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 each step, including restart entry. There is no
separate gas-fraction equation.
Tolerances must be finite, nonnegative numbers. 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 prints a
warning for any liquid that has not met its requested tolerance.
Surface Tension, Curvature, and Contact Angle
Surface tension is activated by defining sigma.
Variable |
Allowed Values |
Default |
Description |
|---|---|---|---|
|
real (N/m) |
not set |
Surface tension coefficient. |
|
|
|
Curvature source: geometric computation or constant value. |
|
real |
|
Constant curvature used when |
|
|
|
Optional post-processing regularization of computed curvature. |
|
real |
|
Absolute curvature limit for |
|
real in |
|
Apply clamp only for interface cells with |
|
|
|
Wall contact-angle model for no-slip boundaries. |
|
real in |
|
Baseline angle; for static model, this is the imposed value. |
|
real |
|
Dynamic angle coefficient in Cox-Voinov-lite relation. |
|
real in |
|
Lower bound for dynamic contact angle. |
|
real in |
|
Upper bound for dynamic contact angle. |
The dynamic contact-angle model uses:
where \(\theta_0\) is from vof_contact_angle_deg, \(C\) is
vof_dynamic_contact_angle_coeff, and \(Ca\) is a local wall-relative capillary number.
The computed angle is then clamped by the min/max dynamic bounds.
If a no-slip boundary supplies contactAngle=..., that boundary value overrides
the global vof_contact_angle_deg for that boundary patch.
This override is active only when vof_contact_angle_model is static or dynamic.
Output and Diagnostics
When plot output is written, the module writes per-phase VOF scalar fields:
output/vof_<liquidName>_sca.<cycle>_<modelName>output/vof_<gasName>_sca.<cycle>_<modelName>
Add vofResidual to plot_output to write residuals for all liquid phases
(disabled by default):
plot_output: vofResidual
Each liquid produces output/vofResidual_<liquidName>_sca.<cycle>_<modelName>.
There is no gas residual field because no separate gas-fraction equation is solved.
Values are signed, unnormalized liquid mass-equation residuals (kg/s), interpolated
to nodes. Plot the absolute value for magnitude; interpolation can smooth or cancel
neighboring residuals. The RV: log instead sums absolute cell residuals.
These fields follow the standard end-of-step residual timing and
plot_output_iteration setting described in Field Data Written to Output Directory.
Module scalar diagnostics:
output/liquidVolume.dat: total liquid volume for each liquid phase vs. cycle/time.output/capillaryDiagnostics.datwith columns:ncyclestimemaxAbsKappamaxCapillaryCFLtotalLiquidVolumeDriftAbstotalLiquidVolumeDriftRel
The capillary CFL diagnostic is estimated as:
evaluated near interface cells.
Complete Example
loadModule: compressive_vof
{
liquidPhases: <water=incompressible(rho=998.2 kg/m/m/m, mu=1.0e-3 kg/m/s)>
gasPhase: <air=incompressible(rho=1.225 kg/m/m/m, mu=1.8e-5 kg/m/s)>
initialCondition: <p=0 Pa, v=0.0 m/s, vof=[water=0.0]>
boundary_conditions: <
Inlet=incompressibleInlet(v=[0.1 m/s, 0.0 m/s, 0.0 m/s], vof=[water=1.0]),
TubeWall=noslip(contactAngle=35 deg),
Outlet=fixedPressureOutlet(p=0.0 Pa)
>
vofEquationOptions: <linearSolver=SGS, relaxationFactor=0.6, maxIterations=8>
vofInviscidFlux: MIG
vofViscosityBlend: harmonic
overUnderFillingCorrection: on
sigma: 0.072 N/m
vof_curvature_type: computed
vof_curvature_regularization_type: clamp
vof_curvature_abs_max: 2.0e4
vof_contact_angle_model: dynamic
vof_contact_angle_deg: 90.0
vof_dynamic_contact_angle_coeff: 9.0
vof_dynamic_contact_angle_min_deg: 20.0
vof_dynamic_contact_angle_max_deg: 160.0
}
Notes
The current surface-tension model uses a single
sigmavalue for all interfaces.Multiple liquid phases are supported in transport and property blending.
For
gasPhase, if multiple gas entries are provided, the last one read is used forrhoGasandmuGas.