<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>multiPhysicsFoam – VOF</title><link>https://multiphysicsfoam.com/tags/vof/</link><description>Recent content in VOF on multiPhysicsFoam</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://multiphysicsfoam.com/tags/vof/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: interFluid</title><link>https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/interfluid/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/interfluid/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>interFluid&lt;/code> solves the flow of two incompressible, isothermal, immiscible
fluids (for example water and air) on one mesh. It captures the interface with
the algebraic &lt;strong>Volume-of-Fluid (VOF)&lt;/strong> method: one phase-fraction field
$\alpha_1$ is transported with a MULES-limited, interface-compressed equation,
and a single mixture momentum equation is solved with the &lt;strong>PIMPLE&lt;/strong>
algorithm. The momentum equation is written in terms of the pressure minus its
hydrostatic part, $p_{rgh}$. The region type is a port of OpenFOAM&amp;rsquo;s
&lt;code>interFoam&lt;/code> solver into the &lt;code>regionType&lt;/code> framework, built on the same pattern
as &lt;code>pimpleFluid&lt;/code>. It supports laminar, RANS and LES turbulence modelling,
surface tension (CSF), MRF, &lt;code>fvOptions&lt;/code> and mesh motion through
&lt;code>dynamicFvMesh&lt;/code>. It can run standalone, or as the fluid side of a
&lt;strong>fluid-structure interaction&lt;/strong> (FSI) case. For FSI it provides the Cauchy
stress tensor &lt;code>sigma&lt;/code> to &lt;code>fsiInterface&lt;/code>, it supports mesh motion driven by the
solid&amp;rsquo;s displacement, and it is laminar only. It cannot take part in any other
kind of inter-region coupling yet.&lt;/p>
&lt;h2 id="governing-equations">Governing Equations&lt;/h2>
&lt;h3 id="continuity">Continuity&lt;/h3>
$$
\nabla \cdot \mathbf{U} = 0
$$
&lt;h3 id="phase-fraction-transport">Phase-fraction transport&lt;/h3>
$$
\frac{\partial \alpha_1}{\partial t} + \nabla \cdot \left(\alpha_1 \mathbf{U}\right) + \nabla \cdot \left(\alpha_1 (1 - \alpha_1)\,\mathbf{U}_r\right) = 0,
\qquad \alpha_2 = 1 - \alpha_1
$$
&lt;p>The third term is an artificial &lt;strong>interface-compression&lt;/strong> term. It is non-zero
only inside the transition region ($0 &lt; \alpha_1 &lt; 1$) and works against the
numerical smearing of the interface. The compression velocity is never
assembled as a vector field. The code uses its face flux directly:&lt;/p>
$$
\phi_r = c_\alpha \left| \frac{\phi}{|\mathbf{S}_f|} \right| \hat{\mathbf{n}}_f \cdot \mathbf{S}_f
$$
&lt;p>$\phi_r$ is set to zero on all non-coupled boundary faces, so compression
never moves phase across a domain boundary.&lt;/p>
&lt;h3 id="mixture-properties">Mixture properties&lt;/h3>
$$
\rho = \alpha_1 \rho_1 + \alpha_2 \rho_2,
\qquad
\mu = \alpha_1 \rho_1 \nu_1 + \alpha_2 \rho_2 \nu_2,
\qquad
\nu = \mu / \rho
$$
&lt;h3 id="momentum">Momentum&lt;/h3>
$$
\frac{\partial (\rho \mathbf{U})}{\partial t} + \nabla \cdot \left(\rho \mathbf{U}\mathbf{U}\right) - \nabla \cdot \mathbf{R}
= -\nabla p_{rgh} - (\mathbf{g} \cdot \mathbf{h})\,\nabla \rho + \mathbf{F}_\sigma + \mathbf{S}_U
$$
&lt;p>In the discrete momentum equation the convective term uses the mass flux
&lt;code>rhoPhi&lt;/code>. This flux is rebuilt from the bounded MULES phase flux (see below),
so momentum and phase transport stay consistent.&lt;/p>
&lt;h3 id="surface-tension-csf">Surface tension (CSF)&lt;/h3>
$$
\mathbf{F}_\sigma = \sigma \kappa \nabla \alpha_1,
\qquad
\kappa = -\nabla \cdot \hat{\mathbf{n}},
\qquad
\hat{\mathbf{n}}_f = \frac{(\nabla \alpha_1)_f}{|(\nabla \alpha_1)_f| + \delta_N}
$$
&lt;p>At walls with an &lt;code>alphaContactAngle&lt;/code>-type boundary condition, the interface
normal is rotated so that the interface meets the wall at the prescribed
contact angle.&lt;/p>
&lt;h3 id="gravity-decomposition-and-pressure-recovery">Gravity decomposition and pressure recovery&lt;/h3>
$$
p_{rgh} = p - \rho\, \mathbf{g} \cdot \mathbf{h},
\qquad
gh = \mathbf{g} \cdot \mathbf{x}_C - gh_\text{ref},
\qquad
gh_f = \mathbf{g} \cdot \mathbf{x}_{C_f} - gh_\text{ref}
$$
&lt;p>The solver solves for $p_{rgh}$. The static pressure $p = p_{rgh} + \rho\,gh$
is recovered after each pressure correction.&lt;/p>
&lt;h3 id="stress-tensor-for-fsi-coupling">Stress tensor (for FSI coupling)&lt;/h3>
&lt;p>After each &lt;code>pressureCorrector()&lt;/code> call (once per outer corrector) the Cauchy
stress tensor is updated:&lt;/p>
$$
\boldsymbol{\sigma} = -p\,\mathbf{I} + \mu\left[\nabla\mathbf{U} + (\nabla\mathbf{U})^T - \tfrac{2}{3}(\nabla\cdot\mathbf{U})\,\mathbf{I}\right]
$$
&lt;p>The bracket is OpenFOAM&amp;rsquo;s &lt;code>devTwoSymm(fvc::grad(U))&lt;/code>. Since
$\nabla\cdot\mathbf{U} = 0$, its trace term vanishes up to discretisation
error. The pressure is $p$,
which is already dimensional, so unlike &lt;code>pimpleFluid&lt;/code> no $\rho$ factor is
needed. $\mu$ is the local &lt;strong>mixture&lt;/strong> dynamic viscosity, so the viscous
traction switches between water and air values across the interface. The
field is &lt;code>sigma&lt;/code>, and &lt;code>fsiInterface&lt;/code> uses it to compute the traction on the
solid side (via &lt;code>regionCoupledTraction&lt;/code>).&lt;/p>
&lt;p>This is the stress formula of &lt;code>pimpleFluid&lt;/code> with only the molecular viscosity
kept:
$\rho\left(-p_\text{kin}\mathbf{I} - \mathbf{R}^\text{dev}\right) = -p\,\mathbf{I} + \mu_\text{eff}\,\texttt{devTwoSymm}(\nabla\mathbf{U})$
with $\mu_\text{eff} \to \mu$. The turbulent (Reynolds-stress) part is
&lt;strong>not&lt;/strong> included, because the VOF turbulence wrapper
(&lt;code>incompressibleInterPhaseTransportModel&lt;/code>) has no public &lt;code>devRhoReff()&lt;/code>. The
expression is exact for laminar flow.&lt;/p>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;p>The field &lt;code>sigma&lt;/code> (Cauchy stress, Pa) is not the same thing as the entry
&lt;code>sigma&lt;/code> in &lt;code>transportProperties&lt;/code> (surface tension coefficient, N/m). They
only share a name.&lt;/p>
&lt;/div>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$\alpha_1$, $\alpha_2$&lt;/td>
&lt;td>Phase fraction of phase 1 / phase 2&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{U}$&lt;/td>
&lt;td>Mixture velocity (shared by both phases)&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi$&lt;/td>
&lt;td>Volumetric face flux&lt;/td>
&lt;td>m³/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$p$&lt;/td>
&lt;td>Static pressure&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$p_{rgh}$&lt;/td>
&lt;td>Pressure minus hydrostatic contribution&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\rho_1$, $\rho_2$ / $\rho$&lt;/td>
&lt;td>Phase densities / mixture density&lt;/td>
&lt;td>kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\nu_1$, $\nu_2$ / $\mu$&lt;/td>
&lt;td>Phase kinematic viscosities / mixture dynamic viscosity&lt;/td>
&lt;td>m²/s / Pa·s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{R}$&lt;/td>
&lt;td>Effective stress tensor (viscous + turbulent)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{U}_r$, $\phi_r$&lt;/td>
&lt;td>Compression velocity / compression flux&lt;/td>
&lt;td>m/s / m³/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$c_\alpha$&lt;/td>
&lt;td>Interface-compression coefficient (&lt;code>cAlpha&lt;/code>)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\sigma$&lt;/td>
&lt;td>Surface tension coefficient&lt;/td>
&lt;td>N/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa$&lt;/td>
&lt;td>Interface curvature&lt;/td>
&lt;td>1/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\hat{\mathbf{n}}$&lt;/td>
&lt;td>Interface unit normal&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{g}$&lt;/td>
&lt;td>Gravitational acceleration&lt;/td>
&lt;td>m/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$h_\text{ref}$&lt;/td>
&lt;td>Reference height (&lt;code>constant/hRef&lt;/code>, optional)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{F}_\sigma$&lt;/td>
&lt;td>Surface tension force&lt;/td>
&lt;td>N/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{S}_U$&lt;/td>
&lt;td>Momentum source (from &lt;code>fvOptions&lt;/code>)&lt;/td>
&lt;td>N/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\sigma}$&lt;/td>
&lt;td>Cauchy stress tensor (FSI)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="numerical-algorithm">Numerical Algorithm&lt;/h2>
&lt;p>The framework drives &lt;code>interFluid&lt;/code> through the &lt;code>regionType&lt;/code> PIMPLE phases.
For every outer corrector (&lt;code>nOuterCorrectors&lt;/code>), &lt;code>regionTypeList::solvePIMPLE()&lt;/code>
calls &lt;code>prePredictor()&lt;/code>, then &lt;code>momentumPredictor()&lt;/code>, then
&lt;code>pressureCorrector()&lt;/code>. This is the same order as the loop body of stock
&lt;code>interFoam&lt;/code>.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Mesh motion&lt;/strong> (&lt;code>prePredictor()&lt;/code>, dynamic meshes only). Runs
&lt;code>mesh().controlledUpdate()&lt;/code> once per time step, or on every outer corrector
if &lt;code>moveMeshOuterCorrectors yes&lt;/code>. Then it recomputes &lt;code>gh&lt;/code>/&lt;code>ghf&lt;/code>, updates
MRF and, if &lt;code>correctPhi&lt;/code> is on, restores a divergence-free flux on the moved
mesh. It also corrects &lt;code>Uf&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Phase-fraction transport&lt;/strong> (&lt;code>prePredictor()&lt;/code>). Re-reads the alpha
controls, then solves the $\alpha_1$ equation with MULES. There are two
options:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>explicit MULES&lt;/strong> (&lt;code>MULESCorr no&lt;/code>), which applies a limited flux in one
step, or&lt;/li>
&lt;li>&lt;strong>semi-implicit MULES&lt;/strong> (&lt;code>MULESCorr yes&lt;/code>), which first solves an implicit,
upwind-bounded predictor and then applies &lt;code>nAlphaCorr&lt;/code> limited
high-order correction passes.&lt;/li>
&lt;/ul>
&lt;p>With &lt;code>nAlphaSubCycles &amp;gt; 1&lt;/code> this step is sub-cycled and the mass flux
&lt;code>rhoPhi&lt;/code> is averaged over time across the sub-cycles. Afterwards
$\rho = \alpha_1\rho_1 + \alpha_2\rho_2$ is updated, and
&lt;code>mixture.correct()&lt;/code> recomputes the normals, curvature and surface-tension
force.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Momentum predictor&lt;/strong> (&lt;code>momentumPredictor()&lt;/code>). Builds the momentum matrix
with &lt;code>rho&lt;/code>/&lt;code>rhoPhi&lt;/code> and caches it. If &lt;code>momentumPredictor yes&lt;/code>, it solves the
matrix against the explicit surface-tension, buoyancy and $p_{rgh}$-gradient
forcing, reconstructed from face fluxes.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Pressure correction, PISO loop&lt;/strong> (&lt;code>pressureCorrector()&lt;/code>). Runs
&lt;code>nCorrectors&lt;/code> times. It builds $r_{AU} = 1/A$, $\mathbf{H}/A$ and a
Rhie–Chow-consistent &lt;code>phiHbyA&lt;/code> (including &lt;code>ddtCorr&lt;/code>, which is aware of mesh
motion). It adds the surface-tension and gravity flux:&lt;/p>
&lt;/li>
&lt;/ol>
$$
\phi_g = \left(\mathbf{F}_{\sigma,f} - gh_f\,\nabla^\perp_f \rho\right) r_{AU,f}\,|\mathbf{S}_f|
$$
&lt;p>and solves the pressure equation:&lt;/p>
$$
\nabla \cdot \left( r_{AU,f}\,\nabla p_{rgh} \right) = \nabla \cdot \phi_{HbyA}
$$
&lt;p>The non-orthogonal corrector sub-loop is controlled by
&lt;code>nNonOrthogonalCorrectors&lt;/code>. On the final non-orthogonal iteration the
solver corrects the flux and the velocity:&lt;/p>
$$
\phi = \phi_{HbyA} - \left(r_{AU,f}\nabla p_{rgh}\right)_f,
\qquad
\mathbf{U} = \mathbf{H}/A + r_{AU}\,\mathcal{R}\!\left(\frac{\phi_g - \left(r_{AU,f}\nabla p_{rgh}\right)_f}{r_{AU,f}}\right)
$$
&lt;p>where $\mathcal{R}$ is the face-to-cell reconstruction (&lt;code>fvc::reconstruct&lt;/code>).
It then reports continuity errors, corrects &lt;code>Uf&lt;/code>, makes the flux relative to
the mesh motion and recovers $p = p_{rgh} + \rho\,gh$. For closed domains it
also applies the reference-pressure shift.
5. &lt;strong>Turbulence correction&lt;/strong> (end of &lt;code>pressureCorrector()&lt;/code>). Calls
&lt;code>turbulence-&amp;gt;correct()&lt;/code> when &lt;code>pimple.turbCorr()&lt;/code> is true.
6. &lt;strong>Stress update&lt;/strong> (end of &lt;code>pressureCorrector()&lt;/code>). Recomputes &lt;code>sigma&lt;/code> from
the new $p$ and $\mathbf{U}$ for FSI coupling. This runs on every outer
corrector, including in standalone runs.&lt;/p>
&lt;p>The scheme is fully segregated. $\alpha_1$, $\mathbf{U}$/$p_{rgh}$ and the
turbulence fields are each solved with the other fields frozen, and the outer
correctors provide the non-linear coupling between them.&lt;/p>
&lt;h3 id="time-step-control">Time-step control&lt;/h3>
&lt;p>&lt;code>getMinDeltaT()&lt;/code> computes the flow Courant number over all cells and the
interface Courant number $\mathrm{Co}_\alpha$ over cells with
$0.01 &lt; \alpha_1 &lt; 0.99$. It returns:&lt;/p>
$$
\Delta t_\text{stab} = \Delta t \cdot \min\!\left(
\frac{\mathrm{Co}_\text{max}}{\mathrm{Co} + \epsilon},\;
\frac{\mathrm{Co}_{\alpha,\text{max}}}{\mathrm{Co}_\alpha + \epsilon}
\right)
$$
&lt;p>The solver&amp;rsquo;s &lt;code>setDeltaT.H&lt;/code> then limits how fast the step can grow (at most a
factor of 1.2 per step, damped) and caps it at &lt;code>maxDeltaT&lt;/code>.&lt;/p>
&lt;h2 id="sub-models">Sub-Models&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Sub-model&lt;/th>
&lt;th>Selection mechanism&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Two-phase mixture&lt;/td>
&lt;td>&lt;code>constant/transportProperties&lt;/code>&lt;/td>
&lt;td>&lt;code>immiscibleIncompressibleTwoPhaseMixture&lt;/code>; &lt;code>phases (&amp;lt;phase1&amp;gt; &amp;lt;phase2&amp;gt;)&lt;/code> plus a per-phase &lt;code>transportModel&lt;/code>/&lt;code>nu&lt;/code>/&lt;code>rho&lt;/code> sub-dict&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Surface tension&lt;/td>
&lt;td>&lt;code>constant/transportProperties&lt;/code> (&lt;code>sigma&lt;/code>)&lt;/td>
&lt;td>Run-time selectable &lt;code>surfaceTensionModel&lt;/code>; a constant value is enough&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Turbulence (laminar / RANS / LES)&lt;/td>
&lt;td>&lt;code>constant/turbulenceProperties&lt;/code>&lt;/td>
&lt;td>&lt;code>incompressibleInterPhaseTransportModel&lt;/code>, evaluated on mixture properties&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Gravity / reference height&lt;/td>
&lt;td>&lt;code>constant/g&lt;/code>, &lt;code>constant/hRef&lt;/code> (optional)&lt;/td>
&lt;td>&lt;code>hRef&lt;/code> defaults to 0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Moving Reference Frame (MRF)&lt;/td>
&lt;td>&lt;code>constant/MRFProperties&lt;/code>&lt;/td>
&lt;td>&lt;code>IOMRFZoneList&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>fvOptions&lt;/code>&lt;/td>
&lt;td>&lt;code>system/fvOptions&lt;/code>&lt;/td>
&lt;td>Explicit/implicit momentum sources, porosity&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mesh motion&lt;/td>
&lt;td>&lt;code>constant/dynamicMeshDict&lt;/code>&lt;/td>
&lt;td>Any stock &lt;code>dynamicFvMesh&lt;/code> + &lt;code>motionSolver&lt;/code> (e.g. &lt;code>dynamicMotionSolverFvMesh&lt;/code>)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="required-fields">Required Fields&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>alpha.&amp;lt;phase1&amp;gt;&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Phase fraction of the first phase listed in &lt;code>phases&lt;/code> (e.g. &lt;code>alpha.water&lt;/code>)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>U&lt;/code>&lt;/td>
&lt;td>&lt;code>volVectorField&lt;/code>&lt;/td>
&lt;td>Velocity&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>p_rgh&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Pressure minus hydrostatic contribution&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Turbulence fields&lt;/td>
&lt;td>–&lt;/td>
&lt;td>As required by the selected model (e.g. &lt;code>k&lt;/code>, &lt;code>epsilon&lt;/code>, &lt;code>omega&lt;/code>, &lt;code>nut&lt;/code>)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Additionally created at runtime:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Condition&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>phi&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceScalarField&lt;/code>&lt;/td>
&lt;td>Volumetric face flux (written)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Static pressure $p_{rgh} + \rho\,gh$ (written)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>alphaPhi0.&amp;lt;phase1&amp;gt;&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceScalarField&lt;/code>&lt;/td>
&lt;td>MULES phase flux (written; read back on restart)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>rho&lt;/code>, &lt;code>rhoPhi&lt;/code>&lt;/td>
&lt;td>vol / surface scalar&lt;/td>
&lt;td>Mixture density and mass flux (not written)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gh&lt;/code>, &lt;code>ghf&lt;/code>&lt;/td>
&lt;td>vol / surface scalar&lt;/td>
&lt;td>$\mathbf{g}\cdot\mathbf{h}$ at cell and face centres (not written)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>alphaPhiUn&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceScalarField&lt;/code>&lt;/td>
&lt;td>Unlimited compressed flux, registered for the &lt;code>scalarTransport&lt;/code> function object (not written)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>sigma&lt;/code>&lt;/td>
&lt;td>&lt;code>volSymmTensorField&lt;/code>&lt;/td>
&lt;td>Cauchy stress tensor $-p\mathbf{I} + \mu\,\texttt{devTwoSymm}(\nabla\mathbf{U})$ (written)&lt;/td>
&lt;td>always (FSI)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Uf&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceVectorField&lt;/code>&lt;/td>
&lt;td>Face velocity&lt;/td>
&lt;td>moving mesh only&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>uniform/cumulativeContErr&lt;/code>&lt;/td>
&lt;td>&lt;code>uniformDimensionedScalarField&lt;/code>&lt;/td>
&lt;td>Cumulative continuity error&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="case-setup">Case Setup&lt;/h2>
&lt;h3 id="required-dictionaries">Required dictionaries&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="n">constant&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">transportProperties&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">phases&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">per&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">phase&lt;/span> &lt;span class="n">nu&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rho&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sigma&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">constant&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">turbulenceProperties&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">turbulence&lt;/span> &lt;span class="n">model&lt;/span> &lt;span class="n">selection&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">constant&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">g&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">gravitational&lt;/span> &lt;span class="n">acceleration&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">system&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">fvSolution&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">alpha&lt;/span> &lt;span class="n">solver&lt;/span> &lt;span class="n">controls&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">PIMPLE&lt;/span> &lt;span class="n">sub&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">dict&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">linear&lt;/span> &lt;span class="n">solvers&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">system&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">fvSchemes&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">discretisation&lt;/span> &lt;span class="n">schemes&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Optional: &lt;code>constant/hRef&lt;/code>, &lt;code>constant/MRFProperties&lt;/code>, &lt;code>system/fvOptions&lt;/code>,
&lt;code>constant/dynamicMeshDict&lt;/code>.&lt;/p>
&lt;h3 id="transportproperties">&lt;code>transportProperties&lt;/code>&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">phases (water air);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">water
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> transportModel Newtonian;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nu 1e-06;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rho 1000;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">air
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> transportModel Newtonian;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nu 1.48e-05;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rho 1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sigma 0.07;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="multiregionproperties-entry">&lt;code>multiRegionProperties&lt;/code> entry&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">regions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ( fluid (interFluid) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For FSI, pair it with a solid region:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">regions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ( fluid (interFluid) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ( solid (solidStVK) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="controldict-singleregionmode">&lt;code>controlDict&lt;/code> (singleRegionMode)&lt;/h3>
&lt;p>When running as a standalone single-region case via &lt;code>singleRegionMode&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">application multiPhysicsFoam;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">singleRegionMode yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">regionType interFluid;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="key-fvsolution-settings">Key &lt;code>fvSolution&lt;/code> settings&lt;/h3>
&lt;p>The alpha controls are read from the solver entry that matches
&lt;code>alpha.&amp;lt;phase1&amp;gt;&lt;/code> on every time step. &lt;code>nAlphaCorr&lt;/code> and &lt;code>nAlphaSubCycles&lt;/code> are
&lt;strong>mandatory&lt;/strong>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">solvers
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;alpha.water.*&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nAlphaCorr 2; // MULES correction passes (mandatory)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nAlphaSubCycles 1; // alpha sub-cycles per time step (mandatory)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> cAlpha 1; // interface compression (0 = off)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> MULESCorr yes; // semi-implicit MULES predictor-corrector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nLimiterIter 5; // MULES limiter iterations
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> alphaApplyPrevCorr no; // reuse previous correction flux
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> icAlpha 0; // isotropic compression coefficient
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> scAlpha 0; // shear compression coefficient
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> solver smoothSolver; // used for the MULESCorr predictor
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> smoother symGaussSeidel;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tolerance 1e-8;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relTol 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;pcorr.*&amp;#34; { solver PCG; preconditioner DIC; tolerance 1e-5; relTol 0; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> p_rgh { solver PCG; preconditioner DIC; tolerance 1e-7; relTol 0.05; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> p_rghFinal { $p_rgh; relTol 0; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> U { solver smoothSolver; smoother symGaussSeidel; tolerance 1e-6; relTol 0; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PIMPLE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> momentumPredictor no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nOuterCorrectors 1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nCorrectors 3;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nNonOrthogonalCorrectors 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Moving mesh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> correctPhi yes; // defaults to yes if mesh is dynamic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> checkMeshCourantNo no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> moveMeshOuterCorrectors no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Pressure reference (closed domains)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> p_rghRefCell 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pRefValue 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="key-fvschemes-entries">Key &lt;code>fvSchemes&lt;/code> entries&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">divSchemes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> div(rhoPhi,U) Gauss linearUpwind grad(U);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> div(phi,alpha) Gauss vanLeer; // bounded TVD scheme for advection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> div(phirb,alpha) Gauss linear; // compression term
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>ddt(alpha)&lt;/code> accepts &lt;code>Euler&lt;/code> or &lt;code>CrankNicolson&lt;/code> (with an off-centering
coefficient). &lt;code>localEuler&lt;/code> (LTS) is not supported.&lt;/p>
&lt;h3 id="adjustable-time-stepping-controldict">Adjustable time stepping (&lt;code>controlDict&lt;/code>)&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">adjustTimeStep yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">maxCo 1; // maximum flow Courant number
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">maxAlphaCo 1; // maximum interface Courant number
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">maxDeltaT 1; // upper bound on time-step size
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="coupling">Coupling&lt;/h2>
&lt;p>&lt;code>interFluid&lt;/code> participates in the following multi-region interfaces:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Interface type&lt;/th>
&lt;th>Exchanged fields&lt;/th>
&lt;th>Coupling modes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>fsiInterface&lt;/code>&lt;/td>
&lt;td>Displacement &lt;code>D&lt;/code>, traction &lt;code>sigma·n&lt;/code>&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>FSI works the same way as for &lt;code>pimpleFluid&lt;/code>, and nothing FSI-specific is
needed in the fluid&amp;rsquo;s own boundary conditions:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Fluid → solid (traction).&lt;/strong> The solid&amp;rsquo;s &lt;code>regionCoupledTraction&lt;/code> boundary
condition looks up the fluid&amp;rsquo;s registered &lt;code>sigma&lt;/code> field by name on the
neighbour mesh and takes &lt;code>sigma·n&lt;/code> on the interface patch. &lt;code>sigma&lt;/code> only has
to exist under that name, so it does not need to be listed in
&lt;code>coupledFields&lt;/code>. Because $p$ includes the hydrostatic part ($p_{rgh} +
\rho\,gh$) and $\mu$ is the mixture viscosity, the traction is correct
whether the wall is wetted by water or by air.&lt;/li>
&lt;li>&lt;strong>Solid → fluid (displacement).&lt;/strong> The fluid mesh follows the solid through
a &lt;code>dynamicMeshDict&lt;/code> (a &lt;code>dynamicMotionSolverFvMesh&lt;/code> plus a motion solver),
set up as in the &lt;code>pimpleFluid&lt;/code> FSI tutorials (e.g. &lt;code>HronTurekFsi3&lt;/code>). The DNA
loop calls &lt;code>meshMotionCorrector()&lt;/code> for the &lt;code>D&lt;/code> field. The fluid interface patch uses
standard boundary conditions, e.g. &lt;code>movingWallVelocity&lt;/code> for &lt;code>U&lt;/code> and
&lt;code>fixedFluxPressure&lt;/code> for &lt;code>p_rgh&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>&lt;code>setCoupledEqns&lt;/code> is still a no-op, and the region registers no
self-coupled fields of its own. Other interface types
(&lt;code>heatTransferInterface&lt;/code>, &lt;code>capillaryInterface&lt;/code>, &lt;code>massTransferInterface&lt;/code>)
are not supported, since the region has no temperature field and no
interface-coupled boundary conditions.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>FSI is the only coupling.&lt;/strong> Only &lt;code>fsiInterface&lt;/code> (partitioned, DNA) is
supported. There is no monolithic coupling and no thermal or
mass-transfer coupling (see &lt;a href="https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/interfluid/#coupling">Coupling&lt;/a>).&lt;/li>
&lt;li>&lt;strong>Laminar FSI traction.&lt;/strong> &lt;code>sigma&lt;/code> contains only the molecular viscous
stress. With a RAS/LES model the fluid flow itself is turbulent, but the
traction passed to the solid misses the Reynolds-stress part. That part is
usually small compared with the pressure at a wall, but it is not zero.&lt;/li>
&lt;li>&lt;strong>No FSI tutorial yet.&lt;/strong> Coupling with &lt;code>solidStVK&lt;/code> has been shown to run,
but there is no complete, validated VOF-FSI tutorial in the repository yet.&lt;/li>
&lt;li>&lt;strong>Two incompressible phases only.&lt;/strong> Both densities are constant. There is
no compressibility, no more than two phases, and no phase change (the
&lt;code>Su&lt;/code>/&lt;code>Sp&lt;/code> alpha sources are zero). For phase change across a sharp
interface, &lt;code>interTrackFluid&lt;/code> with &lt;code>massTransferInterface&lt;/code> is intended
(currently disabled in &lt;code>src/multiRegionSystem/Make/files&lt;/code>).&lt;/li>
&lt;li>&lt;strong>Isothermal.&lt;/strong> No energy equation is solved.&lt;/li>
&lt;li>&lt;strong>No local time stepping (LTS).&lt;/strong> The &lt;code>localEuler&lt;/code> branch in the alpha
equation is kept for fidelity with the stock code, but it is dead code.&lt;/li>
&lt;li>&lt;strong>Simplified &lt;code>correctPhi&lt;/code> after mesh motion.&lt;/strong> The flux correction uses a
constant &lt;code>rAUf = 1&lt;/code> instead of stock &lt;code>interFoam&lt;/code>&amp;rsquo;s time-persisted
&lt;code>1/UEqn.A()&lt;/code>. The PISO loop still enforces continuity on the new mesh; only
the initial flux guess is affected.&lt;/li>
&lt;li>&lt;strong>Mesh motion not yet validated.&lt;/strong> The code path follows &lt;code>pimpleFluid&lt;/code>, but
no finished tutorial uses a &lt;code>dynamicMeshDict&lt;/code> yet.&lt;/li>
&lt;li>&lt;strong>&lt;code>sigma&lt;/code> is always computed and written.&lt;/strong> This adds a &lt;code>grad(U)&lt;/code>
evaluation per outer corrector and one more field per write time, even in
standalone runs where nothing reads it.&lt;/li>
&lt;li>&lt;strong>No wave generation.&lt;/strong> &lt;code>waveModels&lt;/code> is linked but not used by this region.&lt;/li>
&lt;li>&lt;strong>Diffuse interface.&lt;/strong> As with any algebraic VOF/CSF method, the interface
is smeared over a few cells and parasitic currents can appear near the
interface in surface-tension-dominated flows.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial path&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>tutorials/singleRegion/interFluid/damBreak&lt;/code>&lt;/td>
&lt;td>2D laminar collapse of a water column over an obstacle, adapted from &lt;code>interFoam/laminar/damBreak&lt;/code> (static mesh, single-region, adjustable time step)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Alkfri, A., Habes, C., Marschall, H., &lt;em>multiRegionFoam: A Unified Multiphysics Framework for Multi-Region Coupled Continuum-Physical Problems&lt;/em>, Engineering with Computers, 2023.
DOI: &lt;a href="https://doi.org/10.1007/s00366-024-01974-4">10.1007/s00366-024-01974-4&lt;/a>&lt;/li>
&lt;li>Rusche, H., &lt;em>Computational Fluid Dynamics of Dispersed Two-Phase Flows at High Phase Fractions&lt;/em>, PhD thesis, Imperial College London, 2002.&lt;/li>
&lt;li>Brackbill, J. U., Kothe, D. B., Zemach, C., &lt;em>A continuum method for modeling surface tension&lt;/em>, Journal of Computational Physics 100(2), 335–354, 1992.
DOI: &lt;a href="https://doi.org/10.1016/0021-9991(92)90240-Y">10.1016/0021-9991(92)90240-Y&lt;/a>&lt;/li>
&lt;li>Deshpande, S. S., Anumolu, L., Trujillo, M. F., &lt;em>Evaluating the performance of the two-phase flow solver interFoam&lt;/em>, Computational Science &amp;amp; Discovery 5, 014016, 2012.
DOI: &lt;a href="https://doi.org/10.1088/1749-4699/5/1/014016">10.1088/1749-4699/5/1/014016&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>