<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>multiPhysicsFoam – Multiphase</title><link>https://multiphysicsfoam.com/tags/multiphase/</link><description>Recent content in Multiphase on multiPhysicsFoam</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://multiphysicsfoam.com/tags/multiphase/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: calcCurvature</title><link>https://multiphysicsfoam.com/docs/user-guide/utilities/calccurvature/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/utilities/calccurvature/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>calcCurvature&lt;/code> is a standalone application that builds the finite-area mesh
(&lt;code>faMesh&lt;/code>) of a case and evaluates the mean curvature of that surface for a
single time. It writes two volume fields, &lt;code>curvature&lt;/code> and &lt;code>curvatureNew&lt;/code>. Both
are zero everywhere except on the boundary patch named &lt;code>freeSurface&lt;/code> or
&lt;code>interface&lt;/code>. The curvature it computes is the same &lt;code>faMesh::faceCurvatures()&lt;/code>
that &lt;code>capillaryInterface&lt;/code> uses for the surface-tension pressure jump. Use it to
check the curvature quality of a surface mesh (e.g. a spherical bubble, where
$\kappa$ should be uniform) before running a capillary case. It is a single-mesh
tool: it does not read &lt;code>multiRegionProperties&lt;/code> and knows nothing about regions
beyond the standard &lt;code>-region&lt;/code> option.&lt;/p>
&lt;h2 id="method">Method&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Time and mesh.&lt;/strong> The time is selected with the standard time options (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/utilities/calccurvature/#usage">Usage&lt;/a>). The run time is set to the &lt;strong>first&lt;/strong> selected time, and only
that time is processed. The mesh is created as a &lt;code>dynamicFvMesh&lt;/code> (region
from &lt;code>-region&lt;/code>, default &lt;code>region0&lt;/code>). If &lt;code>constant/[&amp;lt;region&amp;gt;/]dynamicMeshDict&lt;/code>
is absent, a &lt;code>staticFvMesh&lt;/code> is used. The mesh is never moved.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Finite-area mesh.&lt;/strong> &lt;code>faMesh(mesh)&lt;/code> is constructed for the default area
name, i.e. it reads the &lt;code>faMesh&lt;/code> written by &lt;code>makeFaMesh&lt;/code>
(&lt;code>constant/[&amp;lt;region&amp;gt;/]faMesh&lt;/code>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Patch detection.&lt;/strong> The boundary is scanned for a patch named
&lt;code>freeSurface&lt;/code> or &lt;code>interface&lt;/code>. If both exist, the one with the higher patch
index wins. If neither exists, the application aborts with a bare
&lt;code>FatalError&lt;/code> (no message).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Curvature&lt;/strong> (&lt;code>curvature&lt;/code>). The &lt;code>faMesh&lt;/code> face curvature is copied into the
detected patch:&lt;/p>
$$
\mathbf{k}_N = \frac{1}{S_f}\sum_{e \in f} \mathbf{L}_e\, c_e,
\qquad
\kappa = \operatorname{sign}\!\left(\mathbf{k}_N\cdot\mathbf{n}_f\right)\,|\mathbf{k}_N|
$$
&lt;p>with $S_f$ the face area, $\mathbf{L}_e$ the edge length vectors (&lt;code>Le()&lt;/code>),
$c_e$ the edge length correction (&lt;code>edgeLengthCorrection()&lt;/code>,
$c_e = \cos\!\big(\tfrac{1}{2}\arcsin|\mathbf{n}_a\times\mathbf{n}_b|\big)$ from
the two edge point normals) and $\mathbf{n}_f$ the &lt;code>faMesh&lt;/code> face area normal.
$\kappa$ is therefore signed relative to the &lt;code>faMesh&lt;/code> normal.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Alternative curvature&lt;/strong> (&lt;code>curvatureNew&lt;/code>). The same edge sum
$\mathbf{k}_N$ is computed again. A unit &amp;ldquo;normal&amp;rdquo; is built from it,
$\hat{\mathbf{n}} = \mathbf{k}_N/|\mathbf{k}_N|$, falling back to the
&lt;code>fvPatch&lt;/code> face normal where $|S_f\,\mathbf{k}_N| \le$ &lt;code>SMALL&lt;/code>. The written
value is&lt;/p>
$$
\kappa_\text{new} = \hat{\mathbf{n}}\cdot\mathbf{k}_N
$$
&lt;p>Because $\hat{\mathbf{n}}$ is parallel to $\mathbf{k}_N$, this is
$|\mathbf{k}_N| = |\kappa|$ wherever the fallback is not active, i.e. the
&lt;strong>unsigned&lt;/strong> curvature.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Report.&lt;/strong> Min/max and arithmetic mean (unweighted by face area) of both
patch fields are printed to the log.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>Command line (standalone application):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">calcCurvature &lt;span class="o">[&lt;/span>-region &amp;lt;name&amp;gt;&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>-time &amp;lt;ranges&amp;gt; &lt;span class="p">|&lt;/span> -latestTime&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>-constant&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>-noZero&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Option&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>-region &amp;lt;name&amp;gt;&lt;/code>&lt;/td>
&lt;td>Mesh region to operate on. Default: &lt;code>region0&lt;/code> (case root).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-time &amp;lt;ranges&amp;gt;&lt;/code>&lt;/td>
&lt;td>Time ranges to select (e.g. &lt;code>0.1&lt;/code>, &lt;code>:10,20 40:70&lt;/code>). Only the &lt;strong>first&lt;/strong> selected time is processed.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-latestTime&lt;/code>&lt;/td>
&lt;td>Select the latest time. On its own, this processes the latest time; combined with other selections only the earliest one is processed.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-constant&lt;/code>&lt;/td>
&lt;td>Include &lt;code>constant/&lt;/code> in the time list.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-noZero&lt;/code>&lt;/td>
&lt;td>Exclude &lt;code>0/&lt;/code> from the time list.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Without time options all time directories (including &lt;code>0/&lt;/code>) are selected, so
the &lt;strong>earliest&lt;/strong> time is processed. If no time directory matches, &lt;code>constant/&lt;/code>
is used with a warning.&lt;/p>
&lt;p>Typical sequence for a single-mesh case:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">blockMesh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">makeFaMesh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">calcCurvature
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="input--output">Input / Output&lt;/h2>
&lt;p>&lt;strong>Read&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>File&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>constant/[&amp;lt;region&amp;gt;/]polyMesh&lt;/code>&lt;/td>
&lt;td>Volume mesh; must contain a patch named &lt;code>freeSurface&lt;/code> or &lt;code>interface&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>constant/[&amp;lt;region&amp;gt;/]faMesh&lt;/code>&lt;/td>
&lt;td>Finite-area mesh from &lt;code>makeFaMesh&lt;/code> on that patch&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>constant/[&amp;lt;region&amp;gt;/]dynamicMeshDict&lt;/code>&lt;/td>
&lt;td>Optional; selects the &lt;code>dynamicFvMesh&lt;/code> type (static if absent)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>system/[&amp;lt;region&amp;gt;/]faSchemes&lt;/code>, &lt;code>faSolution&lt;/code>&lt;/td>
&lt;td>Required by the &lt;code>faMesh&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>system/[&amp;lt;region&amp;gt;/]fvSchemes&lt;/code>, &lt;code>fvSolution&lt;/code>&lt;/td>
&lt;td>Required by the &lt;code>fvMesh&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Written&lt;/strong> to &lt;code>&amp;lt;time&amp;gt;/[&amp;lt;region&amp;gt;/]&lt;/code> of the processed time:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Unit&lt;/th>
&lt;th>Content&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>curvature&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>1/m&lt;/td>
&lt;td>0 in all cells and on all other patches; signed $\kappa$ on the free-surface/interface patch&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>curvatureNew&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>1/m&lt;/td>
&lt;td>0 in all cells and on all other patches; $\kappa_\text{new}$ (unsigned, see &lt;a href="https://multiphysicsfoam.com/docs/user-guide/utilities/calccurvature/#method">Method&lt;/a>) on that patch&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>All patches are of type &lt;code>calculated&lt;/code>. No other fields are read or written.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Single time only.&lt;/strong> The selected time list is not looped over. Only the
earliest selected time is processed, even if &lt;code>-time&lt;/code> selects several.&lt;/li>
&lt;li>&lt;strong>Fixed patch names.&lt;/strong> The patch must be called exactly &lt;code>freeSurface&lt;/code> or
&lt;code>interface&lt;/code>. There is no option to pick another name (e.g. &lt;code>interfaceShadow&lt;/code>).
A missing patch aborts with an empty error message.&lt;/li>
&lt;li>&lt;strong>faMesh must cover exactly that patch.&lt;/strong> The &lt;code>faMesh&lt;/code> face values are
assigned directly to the patch, so the &lt;code>faMesh&lt;/code> must be built on that patch
only, with the same face count and ordering. A &lt;code>faMesh&lt;/code> on a different or
additional patch causes a size mismatch.&lt;/li>
&lt;li>&lt;strong>&lt;code>curvatureNew&lt;/code> is unsigned.&lt;/strong> Its &amp;ldquo;normal&amp;rdquo; is derived from the edge sum
itself rather than from the surface normal, so it carries no sign. It is not
the signed normal force density that its comments suggest.&lt;/li>
&lt;li>&lt;strong>Mean of face values.&lt;/strong> The printed average is an unweighted face average,
not an area-weighted one.&lt;/li>
&lt;li>&lt;strong>Libraries for the &lt;code>dynamicMeshDict&lt;/code>.&lt;/strong> The application links only
&lt;code>finiteVolume&lt;/code>, &lt;code>finiteArea&lt;/code>, &lt;code>dynamicFvMesh&lt;/code>, &lt;code>dynamicMesh&lt;/code> and
&lt;code>meshTools&lt;/code>. A &lt;code>dynamicMeshDict&lt;/code> that selects a mesh type or motion solver
from another library (e.g. &lt;code>interfaceTrackingFvMesh&lt;/code>, or a motion solver
from &lt;code>fvMotionSolvers&lt;/code>) needs that library loaded through the dictionary&amp;rsquo;s
library entries. Otherwise the selection fails.&lt;/li>
&lt;li>&lt;strong>No parallel-specific handling.&lt;/strong> Min/max/average are evaluated per
processor without reduction.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dDuineveldRisingBubble/baseMeshes/meshA&lt;/code>&lt;/td>
&lt;td>Base bubble mesh generation (&lt;code>blockMesh&lt;/code>, &lt;code>makeFaMesh&lt;/code> on patch &lt;code>interface&lt;/code>). The &lt;code>calcCurvature&lt;/code> call is present but &lt;strong>commented out&lt;/strong> in &lt;code>Allrun&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dDuineveldRisingBubble/hexBaseMeshes/meshA&lt;/code>&lt;/td>
&lt;td>Same for the hex base mesh; the call is likewise commented out.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>Docs: capillaryInterface</title><link>https://multiphysicsfoam.com/docs/user-guide/interface-physics/capillaryinterface/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/interface-physics/capillaryinterface/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>capillaryInterface&lt;/code> couples two incompressible fluid regions that share a
sharp, deforming interface, e.g. a gas bubble (one region) in a liquid (the
other region). It uses ALE interface tracking: each phase is its own mesh, and
the mesh boundary follows the interface. The interface type holds the interface
physics: a finite-area mesh (&lt;code>faMesh&lt;/code>) on side A, a constant surface tension
$\sigma$, the surface velocity $\mathbf{u}_s$ and the curvature $\kappa$ taken
from the &lt;code>faMesh&lt;/code>. The jump conditions are applied by four dedicated partitioned
p-U boundary conditions, which abort if they are not used together with a
&lt;code>capillaryInterface&lt;/code>. Coupling runs through the special DNA field &lt;code>pUPimple&lt;/code>.
No monolithic variant exists.&lt;/p>
&lt;h2 id="interface-conditions">Interface Conditions&lt;/h2>
&lt;p>Region $A$ is the first entry of &lt;code>coupledPatchPair&lt;/code> and carries the &lt;code>faMesh&lt;/code>.
Region $B$ is the second entry. $\mathbf{n}$ is the unit normal of the side-A
patch (outward from $A$), and $\mathbf{n}_B = -\mathbf{n}$. $\mathbf{u}_s$ is
the surface velocity on the &lt;code>faMesh&lt;/code> (see &lt;a href="https://multiphysicsfoam.com/docs/user-guide/interface-physics/capillaryinterface/#implementation">Implementation&lt;/a>).
The conditions below are written the way the BCs evaluate them, after
interpolating the neighbour side onto the local patch.&lt;/p>
&lt;h3 id="jump-conditions-dirichlet-sides">Jump conditions (Dirichlet sides)&lt;/h3>
&lt;p>&lt;strong>Velocity, set on side B&lt;/strong> (&lt;code>regionCoupledVelocityValue&lt;/code>):&lt;/p>
$$
\mathbf{U}_B = \mathbf{U}_A - \mathbf{n}_B\,(\mathbf{n}_B\cdot\mathbf{u}_s) + \mathbf{n}_B\,\frac{\phi_{\text{mesh},B}}{|\mathbf{S}_f|}
\quad \text{on } \Gamma
$$
&lt;p>The tangential velocity is continuous. The normal component of the side-A
velocity is replaced by the side-B mesh normal velocity, corrected by the
normal part of $\mathbf{u}_s$ (which is the side-A mesh normal velocity, see
&lt;code>updateUs()&lt;/code>).&lt;/p>
&lt;p>&lt;strong>Pressure, set on side A&lt;/strong> (&lt;code>regionCoupledPressureValue&lt;/code>, field &lt;code>p&lt;/code>):&lt;/p>
$$
p_A = p_B + 2(\mu_B - \mu_A)\,\nabla_s\cdot\mathbf{u}_s - \sigma\kappa + (\rho_B - \rho_A)\,(\mathbf{x}_f - \mathbf{x}_\text{ref})\cdot\mathbf{g}
\quad \text{on } \Gamma
$$
&lt;p>The viscous term is the normal-stress jump, using
$\partial u_n/\partial n = -\nabla_s\cdot\mathbf{u}_s$. The gravity term
implies that &lt;code>p&lt;/code> is the pressure without the hydrostatic part
$\rho\,\mathbf{g}\cdot(\mathbf{x}-\mathbf{x}_\text{ref})$ (inferred from the
formula). $\mathbf{x}_\text{ref}$ is &lt;code>PISO.pRefPoint&lt;/code> of region A.
If the field is named &lt;code>pKin&lt;/code>, the same jump is applied in kinematic form:
$p_{\text{kin},A} = \big(\rho_B\,p_{\text{kin},B} + \text{jump terms}\big)/\rho_A$.&lt;/p>
&lt;h3 id="flux-conditions-neumann-sides">Flux conditions (Neumann sides)&lt;/h3>
&lt;p>&lt;strong>Velocity, set on side A&lt;/strong> (&lt;code>regionCoupledVelocityFlux&lt;/code>, diffusivity $\mu_A$):&lt;/p>
$$
\mu_A \frac{\partial \mathbf{U}_A}{\partial n} =
-(\mathbf{I} - \mathbf{n}\mathbf{n})\cdot\big(\mu_B \partial_{n_B}\mathbf{U}_B\big) + \mathbf{f}_{\sigma,t} - \mu_A\,\mathbf{n}\,(\nabla_s\cdot\mathbf{u}_s) + (\mu_B - \mu_A)\,(\nabla_s\mathbf{u}_s)\cdot\mathbf{n}
$$
&lt;p>with the tangential surface-tension force&lt;/p>
$$
\mathbf{f}_{\sigma,t} = \sigma\,\frac{1}{S_f}\sum_{e} \mathbf{L}_e\,c_e \;-\; \sigma\kappa\,\mathbf{n}
$$
&lt;p>($\mathbf{L}_e$: edge length vectors, $c_e$: &lt;code>edgeLengthCorrection&lt;/code>). With a
constant $\sigma$ this is only the discretisation difference between the
edge-integrated force and $\sigma\kappa\mathbf{n}$. The tangential shear stress
is continuous. The normal component comes from continuity, not from side B.&lt;/p>
&lt;p>&lt;strong>Pressure, set on side B&lt;/strong> (&lt;code>regionCoupledPressureFlux&lt;/code>):&lt;/p>
$$
k_B\,\frac{\partial p_B}{\partial n_B} = -\,\mathbf{n}_B\cdot\frac{\partial \mathbf{U}_B}{\partial t}
$$
&lt;p>The neighbour flux is added in &lt;code>fluxJump()&lt;/code> and subtracted again in the generic
flux BC, so it cancels. The pressure gradient on side B depends only on the
local normal acceleration. $k_B$ is the BC&amp;rsquo;s diffusivity (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/interface-physics/capillaryinterface/#known-limitations">Known Limitations&lt;/a>: with &lt;code>diffusivity &amp;quot;v&amp;quot;&lt;/code> it actually
evaluates to $\rho_B$, not $1/\rho_B$; it is $1$ for &lt;code>pKin&lt;/code>).&lt;/p>
&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>$\mathbf{U}$&lt;/td>
&lt;td>Velocity&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$p$&lt;/td>
&lt;td>Pressure (static, without hydrostatic part)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{u}_s$&lt;/td>
&lt;td>Surface velocity on the &lt;code>faMesh&lt;/code> (&lt;code>&amp;lt;patchA&amp;gt;Us&lt;/code>)&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\sigma$&lt;/td>
&lt;td>Surface tension (&lt;code>sigma&lt;/code>, constant)&lt;/td>
&lt;td>N/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa$&lt;/td>
&lt;td>Face curvature, &lt;code>faMesh::faceCurvatures()&lt;/code>&lt;/td>
&lt;td>1/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mu_A,\mu_B$&lt;/td>
&lt;td>Dynamic viscosities from each region&amp;rsquo;s &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>Pa·s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\rho_A,\rho_B$&lt;/td>
&lt;td>Densities from each region&amp;rsquo;s &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{g}$&lt;/td>
&lt;td>Gravity (&lt;code>constant/&amp;lt;regionA&amp;gt;/g&lt;/code>)&lt;/td>
&lt;td>m/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi_\text{mesh}$&lt;/td>
&lt;td>Mesh flux &lt;code>fvc::meshPhi&lt;/code> on the patch&lt;/td>
&lt;td>m³/s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Construction&lt;/strong>: reads &lt;code>capillaryInterfaceCoeffs/sigma&lt;/code> (required) and
creates the area field &lt;code>sigma&amp;lt;regionA&amp;gt;&amp;lt;patchA&amp;gt;&lt;/code> (uniform $\sigma$,
&lt;code>zeroGradient&lt;/code>, not written). The &lt;code>faMesh&lt;/code> of region A is looked up by the
name &lt;code>&amp;lt;patchA&amp;gt;FaMesh&lt;/code>. If none is registered, a new &lt;code>faMesh(meshA)&lt;/code> is built
from region A&amp;rsquo;s finite-area definition and given that name. The
&lt;code>interfaceTrackingFvMesh&lt;/code> motion solver gives its own &lt;code>faMesh&lt;/code> the same name
so it can be shared (whether the lookup finds it in the current OpenFOAM
versions has not been verified).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>update()&lt;/code>&lt;/strong>: called by &lt;strong>every&lt;/strong> partitioned p-U BC in &lt;code>updateCoeffs()&lt;/code>.
This is the base-class &lt;code>regionInterfaceType::update()&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>after a topology change (not pure motion), clear &lt;code>Us&lt;/code>/&lt;code>Phis&lt;/code>, re-fetch
the &lt;code>faMesh&lt;/code> and rebuild the global patches;&lt;/li>
&lt;li>&lt;code>updateK()&lt;/code>: on the edges of the &lt;code>curvatureCorrectedSurfacePatches&lt;/code>,
replace $\kappa$ by an average of neighbouring faces (wedge axis/fixed
contact lines);&lt;/li>
&lt;li>&lt;code>correct()&lt;/code>: &lt;code>updateUs()&lt;/code> sets
$\mathbf{u}_s = \mathbf{U}_A - (\mathbf{U}_A\cdot\mathbf{n})\mathbf{n} + w_A\,\mathbf{n}$
with $w_A = \phi_{\text{mesh},A}/|\mathbf{S}_f|$, then fixes the &lt;code>Us&lt;/code>
boundary values. &lt;code>updatePhis()&lt;/code> sets the edge flux
$\phi_s = (\mathbf{u}_s)_e\cdot\mathbf{L}_e$. $\sigma$ is not updated
(&lt;code>TODO&lt;/code> for a surfactant equation of state).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>DNA loop for &lt;code>pUPimple&lt;/code>&lt;/strong> (&lt;code>multiRegionSystem::solve()&lt;/code>): every coupling
iteration runs &lt;code>solvePIMPLE()&lt;/code> on all regions (the BCs above are evaluated
inside it), then &lt;code>meshMotionCorrector()&lt;/code> (interface-tracking mesh motion),
then &lt;code>interfaces_-&amp;gt;update()&lt;/code>. After the loop, &lt;code>postSolvePIMPLE()&lt;/code> runs. The
standalone &lt;code>solvePIMPLE()&lt;/code> call is skipped when &lt;code>pUPimple&lt;/code> is coupled.
Convergence is checked from the jump/flux residuals of the fields listed
under &lt;code>residualControl&lt;/code> (&lt;code>U&lt;/code>, &lt;code>p&lt;/code>), which must exist in both regions.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>interfaces_-&amp;gt;update()&lt;/code>&lt;/strong> (&lt;code>regionInterfaceTypeList&lt;/code>; once in &lt;code>preSolve()&lt;/code>
and after every DNA iteration): rebuilds the interpolator if the mesh
changes (subject to &lt;code>interpolatorUpdateFrequency&lt;/code>), then calls &lt;code>info()&lt;/code>.
&lt;code>info()&lt;/code> logs min/max/average curvature, the maximum capillary Courant
number, the total surface-tension force and the total viscous + pressure
force on side A.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>getMinDeltaT()&lt;/code>&lt;/strong>: capillary time-step limit (Brackbill-type), applied
only if region A has a registered &lt;code>volScalarField rho&lt;/code>:&lt;/p>
$$
\Delta t_\sigma = \texttt{maxCapillaryCo}\,\sqrt{\frac{\rho_{A,\min}\,\Delta x_{\min}^3}{2\pi\,\sigma}}
$$
&lt;p>where $\Delta x_{\min}$ is the minimum &lt;code>faMesh&lt;/code> &lt;code>lPN&lt;/code> (distance between
neighbouring face centres) and &lt;code>maxCapillaryCo&lt;/code> is read from
&lt;code>system/controlDict&lt;/code> (default &lt;code>1.0&lt;/code>). The solver uses it only with
&lt;code>adjustTimeStep yes&lt;/code> (&lt;code>setDeltaT.H&lt;/code>). Only $\rho_A$ enters, not
$\rho_A + \rho_B$.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="coefficients-and-dictionary-keywords">Coefficients and dictionary keywords&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Location&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>sigma&lt;/code>&lt;/td>
&lt;td>&lt;code>capillaryInterfaceCoeffs&lt;/code>&lt;/td>
&lt;td>&lt;strong>required&lt;/strong>&lt;/td>
&lt;td>Surface tension, &lt;code>dimensionedScalar&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>coupled&lt;/code>&lt;/td>
&lt;td>interface entry&lt;/td>
&lt;td>&lt;code>true&lt;/code>&lt;/td>
&lt;td>Switch coupling on/off&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingStartTime&lt;/code>&lt;/td>
&lt;td>interface entry&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>Enable coupling after this time&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>curvatureCorrectedSurfacePatches&lt;/code>&lt;/td>
&lt;td>top level of &lt;code>regionInterfaceProperties&lt;/code>&lt;/td>
&lt;td>&lt;strong>required&lt;/strong>&lt;/td>
&lt;td>&lt;code>faPatch&lt;/code> names for curvature correction (may be &lt;code>0()&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interpolatorUpdateFrequency&lt;/code>&lt;/td>
&lt;td>top level&lt;/td>
&lt;td>&lt;code>1&lt;/code>&lt;/td>
&lt;td>Interpolator rebuild interval in time steps (&lt;code>0&lt;/code> = never rebuild)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interfaceTransferMethod&lt;/code>&lt;/td>
&lt;td>top level&lt;/td>
&lt;td>&lt;code>AMI&lt;/code>&lt;/td>
&lt;td>&lt;code>AMI&lt;/code> or &lt;code>directMap&lt;/code>; requires a &lt;code>&amp;lt;method&amp;gt;Coeffs&lt;/code> sub-dict&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>maxCapillaryCo&lt;/code>&lt;/td>
&lt;td>&lt;code>system/controlDict&lt;/code>&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;td>Capillary Courant limit for &lt;code>getMinDeltaT()&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>There is no keyword to pick a curvature method: $\kappa$ is always
&lt;code>faMesh::faceCurvatures()&lt;/code>. The standalone utility &lt;code>calcCurvature&lt;/code> writes the
same curvature (&lt;code>curvature&lt;/code>) plus the normal component of the edge-integrated
force (&lt;code>curvatureNew&lt;/code>) as volume fields for post-processing. It looks for a
patch named &lt;code>freeSurface&lt;/code> or &lt;code>interface&lt;/code>.&lt;/p>
&lt;h2 id="coupled-fields">Coupled Fields&lt;/h2>
&lt;p>&lt;code>coupledFields (pUPimple);&lt;/code> couples &lt;code>U&lt;/code> and &lt;code>p&lt;/code> together:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Required boundary conditions (side A / side B)&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>U&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledVelocityFlux&lt;/code> / &lt;code>regionCoupledVelocityValue&lt;/code>&lt;/td>
&lt;td>Velocity: shear-stress balance on A, continuity on B&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>p&lt;/code> (or &lt;code>pKin&lt;/code>)&lt;/td>
&lt;td>&lt;code>regionCoupledPressureValue&lt;/code> / &lt;code>regionCoupledPressureFlux&lt;/code>&lt;/td>
&lt;td>Pressure: normal-stress (Laplace) jump on A, acceleration-based gradient on B&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The side assignment is fixed by the code: the BCs on side A read $\mathbf{u}_s$,
$\kappa$ and the &lt;code>faMesh&lt;/code> normals directly, and &lt;code>regionCoupledVelocityValue&lt;/code>
interpolates $\mathbf{u}_s$ from its neighbour. The &lt;code>faMesh&lt;/code> side must therefore
carry &lt;code>U&lt;/code> flux / &lt;code>p&lt;/code> value. All four BCs need &lt;code>interfaceType (capillaryInterface);&lt;/code>.&lt;/p>
&lt;p>Fields and objects required:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Object&lt;/th>
&lt;th>Region&lt;/th>
&lt;th>Used by&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>U&lt;/code>, &lt;code>p&lt;/code>, &lt;code>phi&lt;/code>&lt;/td>
&lt;td>A and B&lt;/td>
&lt;td>BCs, &lt;code>updateUs()&lt;/code>, &lt;code>info()&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>transportProperties&lt;/code> with &lt;code>rho&lt;/code>, &lt;code>mu&lt;/code>&lt;/td>
&lt;td>A and B&lt;/td>
&lt;td>BCs, &lt;code>info()&lt;/code>; also &lt;code>nu&lt;/code> if a region solves &lt;code>pKin&lt;/code> (checked: $\mu = \rho\nu$)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>g&lt;/code> (&lt;code>uniformDimensionedVectorField&lt;/code>)&lt;/td>
&lt;td>A&lt;/td>
&lt;td>&lt;code>regionCoupledPressureValue&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>PISO { pRefPoint ...; }&lt;/code> in &lt;code>system/&amp;lt;regionA&amp;gt;/fvSolution&lt;/code>&lt;/td>
&lt;td>A&lt;/td>
&lt;td>&lt;code>regionCoupledPressureValue&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>volScalarField rho&lt;/code>&lt;/td>
&lt;td>A (optional)&lt;/td>
&lt;td>enables &lt;code>getMinDeltaT()&lt;/code>; also used for &lt;code>meshPhi&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>finite-area mesh on the interface patch&lt;/td>
&lt;td>A&lt;/td>
&lt;td>everything&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Created at run time (not written): &lt;code>sigma&amp;lt;regionA&amp;gt;&amp;lt;patchA&amp;gt;&lt;/code> (&lt;code>areaScalarField&lt;/code>),
&lt;code>&amp;lt;patchA&amp;gt;Us&lt;/code> (&lt;code>areaVectorField&lt;/code>), &lt;code>&amp;lt;patchA&amp;gt;Phis&lt;/code> (&lt;code>edgeScalarField&lt;/code>).&lt;/p>
&lt;h2 id="compatible-region-types">Compatible Region Types&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Region type (side A)&lt;/th>
&lt;th>Region type (side B)&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>interTrackFluid&lt;/code>&lt;/td>
&lt;td>&lt;code>interTrackFluid&lt;/code>&lt;/td>
&lt;td>Used by all tutorials, but &lt;strong>disabled&lt;/strong> in &lt;code>src/multiRegionSystem/Make/files&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>icoFluid&lt;/code>&lt;/td>
&lt;td>&lt;code>icoFluid&lt;/code>&lt;/td>
&lt;td>Follows the same conventions (&lt;code>p&lt;/code> in Pa, &lt;code>rho&lt;/code> field, &lt;code>PISO.pRefPoint&lt;/code>, &lt;code>closedVolume&lt;/code>, &lt;code>interfaceShadow&lt;/code>, &lt;code>space&lt;/code>). Inferred, untested. No &lt;code>g&lt;/code> is created.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pimpleFluid&lt;/code>&lt;/td>
&lt;td>&lt;code>pimpleFluid&lt;/code>&lt;/td>
&lt;td>BCs contain a &lt;code>pKin&lt;/code> branch. &lt;code>regionCoupledPressureValue&lt;/code> still needs a &lt;code>PISO { pRefPoint; }&lt;/code> entry, which &lt;code>pimpleFluid&lt;/code> itself does not read. Untested.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The region needs a moving mesh whose interface patch follows the interface
(&lt;code>interfaceTrackingFvMesh&lt;/code> from &lt;code>libinterfaceTrackingFvMesh&lt;/code>, see
&lt;code>src/dynamicFvMesh&lt;/code>). Otherwise the interface stays fixed. See
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/icofluid/">icoFluid&lt;/a> and &lt;a href="https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/pimplefluid/">pimpleFluid&lt;/a>.&lt;/p>
&lt;h2 id="case-setup">Case Setup&lt;/h2>
&lt;h3 id="regioninterfaceproperties-entry">&lt;code>regionInterfaceProperties&lt;/code> entry&lt;/h3>
&lt;p>From &lt;code>tutorials/multiphaseFlow/2dRisingBubble/constant/regionInterfaceProperties&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">partitionedCoupledPatches
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> fluidAfluidB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> coupledPatchPair
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (fluidA interface)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (fluidB interfaceShadow)
&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"> coupledFields
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pUPimple
&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"> capillaryInterfaceCoeffs
&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 sigma [ 1 0 -2 0 0 0 0 ] 0.07232;
&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">);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">monolithicCoupledPatches
&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">curvatureCorrectedSurfacePatches 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">interpolatorUpdateFrequency 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">interfaceTransferMethod directMap;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">directMapCoeffs
&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="multiregionproperties-dna-entry">&lt;code>multiRegionProperties&lt;/code> DNA 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">DNA
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pUPimple
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxCoupleIter 10;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> residualControl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxJumpRes 1e-5;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputJumpResField yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxFluxRes 1e-4;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputFluxResField yes;
&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"> p
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxJumpRes 1e-5;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputJumpResField yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxFluxRes 1e-5;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputFluxResField yes;
&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"> }
&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="boundary-conditions">Boundary conditions&lt;/h3>
&lt;p>Side A (&lt;code>0/fluidA/orig/partitioned/U&lt;/code> and &lt;code>p&lt;/code>, patch &lt;code>interface&lt;/code>, carries the &lt;code>faMesh&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">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledVelocityFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;mu&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 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">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledPressureValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;v&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Side B (&lt;code>0/fluidB/orig/partitioned/U&lt;/code> and &lt;code>p&lt;/code>, patch &lt;code>interfaceShadow&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">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledVelocityValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;mu&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 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">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledPressureFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;v&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 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="other-required-files-from-2drisingbubble">Other required files (from &lt;code>2dRisingBubble&lt;/code>)&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">fluidA&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">faMesh&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">faMeshDefinition&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">faMesh&lt;/span> &lt;span class="n">on&lt;/span> &lt;span class="n">patch&lt;/span> &lt;span class="s2">&amp;#34;interface&amp;#34;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Allrun&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">makeFaMesh&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">region&lt;/span> &lt;span class="n">fluidA&lt;/span>&lt;span class="p">)&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">fluid&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="n">A&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">B&lt;/span>&lt;span class="p">}&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">rho&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mu&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">fluidA&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">gravity&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">fluidA&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">dynamicMeshDict&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">dynamicFvMesh&lt;/span> &lt;span class="n">interfaceTrackingFvMesh&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">movingSurfacePatches&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">interface&lt;/span> &lt;span class="o">...&lt;/span>&lt;span class="p">)&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">fluidA&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">PISO&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">pRefPoint&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">pRefValue&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="n">hasSpacePatch&lt;/span> &lt;span class="n">yes&lt;/span>&lt;span class="p">;&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">fluidB&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">closedVolume&lt;/span> &lt;span class="n">yes&lt;/span>&lt;span class="p">;&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">faSchemes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">system&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">fluidA&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">faSchemes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">faSolution&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">controlDict&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">libs&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;libinterfaceTrackingFvMesh.so&amp;#34;&lt;/span> &lt;span class="o">...&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>No runnable tutorial&lt;/strong>: all three tutorials select &lt;code>interTrackFluid&lt;/code>,
which is commented out in &lt;code>src/multiRegionSystem/Make/files&lt;/code> (together with
&lt;code>pUCoupledIcoFluid&lt;/code>). They would fail when the region type is selected at run time (inferred).&lt;/li>
&lt;li>&lt;strong>Constant surface tension&lt;/strong>: &lt;code>sigma_&lt;/code> is created once from &lt;code>sigma&lt;/code> and never
updated (&lt;code>correct()&lt;/code> has only a &lt;code>TODO&lt;/code> for an equation of state). There is no
Marangoni effect or surfactant transport.&lt;/li>
&lt;li>&lt;strong>No curvature model choice&lt;/strong>: $\kappa$ = &lt;code>faMesh::faceCurvatures()&lt;/code>. The only
correction is the averaging on &lt;code>curvatureCorrectedSurfacePatches&lt;/code>, and that
keyword is mandatory even when it is empty.&lt;/li>
&lt;li>&lt;strong>&lt;code>diffusivity &amp;quot;v&amp;quot;&lt;/code> gives $\rho$, not $1/\rho$&lt;/strong> (code bug in
&lt;code>diffCoeff()&lt;/code> of both &lt;code>genericRegionCoupledJump&lt;/code> and &lt;code>genericRegionCoupledFlux&lt;/code>):
&lt;code>&amp;quot;v&amp;quot;&lt;/code> is renamed to &lt;code>&amp;quot;rho&amp;quot;&lt;/code> before the &lt;code>== &amp;quot;v&amp;quot;&lt;/code> test, so the reciprocal is
never taken. For &lt;code>regionCoupledPressureFlux&lt;/code> this makes
$\partial p_B/\partial n = -\mathbf{n}_B\cdot\partial_t\mathbf{U}_B/\rho_B$
instead of $-\rho_B\,\mathbf{n}_B\cdot\partial_t\mathbf{U}_B$. The effect on
the tutorials was inferred, not tested.&lt;/li>
&lt;li>&lt;strong>Pressure flux ignores the neighbour&lt;/strong>: the neighbour flux cancels in
&lt;code>regionCoupledPressureFlux&lt;/code>, so side B gets a purely local Neumann condition
(convective and viscous normal terms are commented out).&lt;/li>
&lt;li>&lt;strong>Fixed side roles&lt;/strong>: the &lt;code>faMesh&lt;/code> must be on the first patch of
&lt;code>coupledPatchPair&lt;/code>, and that side must carry the &lt;code>U&lt;/code> flux / &lt;code>p&lt;/code> value BCs (see
above). The hard-coded field names are &lt;code>U&lt;/code>, &lt;code>p&lt;/code>, &lt;code>phi&lt;/code>, &lt;code>rho&lt;/code>, &lt;code>g&lt;/code>,
&lt;code>transportProperties&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>update()&lt;/code> runs once per BC evaluation&lt;/strong>: every coupled BC calls
&lt;code>rgInterface().update()&lt;/code>, so $\mathbf{u}_s$ and the curvature correction are
recomputed up to four times per corrector (cost only).&lt;/li>
&lt;li>&lt;strong>Capillary time step&lt;/strong>: uses only $\rho_A$ and $\min(\Delta x)$ of the
&lt;code>faMesh&lt;/code>. It is skipped when region A has no &lt;code>rho&lt;/code> volume field. The
&lt;code>info()&lt;/code> capillary Courant number uses the &lt;code>transportProperties&lt;/code> value instead.&lt;/li>
&lt;li>&lt;strong>&lt;code>correctUsBoundaryConditions()&lt;/code>&lt;/strong>: for &lt;code>faPatch&lt;/code>es next to a &lt;code>slip&lt;/code> or
&lt;code>symmetry&lt;/code> &lt;code>U&lt;/code> patch it assigns the full internal &lt;code>Us&lt;/code> field to the patch
value (and computes an unused normal &lt;code>N&lt;/code>). This looks like a bug, but none of
the tutorials reach it, so it is untested.&lt;/li>
&lt;li>&lt;strong>&lt;code>Phis&lt;/code> and &lt;code>normal/tangentialSurfaceTensionForce()&lt;/code>&lt;/strong> are computed or
available but not used by any BC (&lt;code>regionCoupledVelocityFlux&lt;/code> recomputes
the forces itself).&lt;/li>
&lt;li>&lt;strong>Serial only (inferred)&lt;/strong>: &lt;code>2dRisingBubble/Allrun -P&lt;/code> prints &amp;ldquo;Running this
case in parallel is currently not supported&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>No monolithic coupling&lt;/strong>: &lt;code>monolithicCoupledPatches&lt;/code> must stay empty for
this interface.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;p>No runnable tutorial exists: all of the cases below use &lt;code>interTrackFluid&lt;/code> in
both regions, and that region type is disabled. They remain the reference
setups (&lt;code>./Allrun -p -S&lt;/code>).&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/2dRisingBubble&lt;/code>&lt;/td>
&lt;td>2D gas bubble rising in liquid, $\sigma = 0.07232$ N/m, &lt;code>directMap&lt;/code> transfer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dOscillatingBubble&lt;/code>&lt;/td>
&lt;td>3D oscillating bubble, $\sigma = 0.0727$ N/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dDuineveldRisingBubble&lt;/code>&lt;/td>
&lt;td>3D rising bubble (Duineveld experiment), $\sigma = 0.0727$ N/m&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;/ul></description></item><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><item><title>Docs: massTransferInterface</title><link>https://multiphysicsfoam.com/docs/user-guide/interface-physics/masstransferinterface/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/interface-physics/masstransferinterface/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>massTransferInterface&lt;/code> models phase change (evaporation/condensation) at a
sharp interface between two fluid regions, e.g. a liquid and its vapour. It is
&lt;strong>not&lt;/strong> a species/concentration interface: there is no Henry or partition
coefficient and no species field. The interface is assumed to sit at a fixed
saturation temperature $T_{sat}$. The interfacial mass flux $\dot m$ follows
from the energy balance: the net conductive heat that reaches the interface
from both sides at $T = T_{sat}$, divided by the latent heat $h_{lv}$.&lt;/p>
&lt;p>The interface type itself only computes $\dot m$ and the matching heat-flux
jump. These quantities enter the solution through dedicated partitioned
boundary conditions (&lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code> for &lt;code>T&lt;/code>,
&lt;code>regionCoupledMassTransfer*&lt;/code> for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>). The &lt;code>U&lt;/code>/&lt;code>p&lt;/code> conditions also need
a &lt;code>capillaryInterface&lt;/code> on the same patch pair (surface tension, curvature,
interface velocity). The two interface types are therefore used together.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Status:&lt;/strong> No tutorial uses this interface type, and the interface-tracking
fluid region it was written for (&lt;code>interTrackFluid&lt;/code>) is disabled in
&lt;code>src/multiRegionSystem/Make/files&lt;/code>.
Treat this page as a description of the code, not of a validated feature.&lt;/p>
&lt;/blockquote>
&lt;h2 id="interface-conditions">Interface Conditions&lt;/h2>
&lt;p>Below, $A$ and $B$ are the two regions of the &lt;code>coupledPatchPair&lt;/code> and
$\mathbf{n}_A$, $\mathbf{n}_B$ the outward patch normals. In the BC formulas
&amp;ldquo;own&amp;rdquo; is the side the BC sits on and &amp;ldquo;nbr&amp;rdquo; is the other side. $\mathbf{n}_\varepsilon$
is the interface normal $\mathbf{n}$ on the &lt;code>meshA&lt;/code> side of the
&lt;code>capillaryInterface&lt;/code> and $-\mathbf{n}$ on the other side.&lt;/p>
&lt;h3 id="mass-flux-from-the-energy-balance-masstransferinterfacesaturatedflux">Mass flux from the energy balance (&lt;code>massTransferInterface::saturatedFlux&lt;/code>)&lt;/h3>
&lt;p>Both temperature fields are copied, the interface patch values are set to
$T_{sat}$ (&lt;code>fixedValue&lt;/code>), and the normal gradients are evaluated:&lt;/p>
$$
q_{sat} = k_A \left.\frac{\partial T_A}{\partial n_A}\right|_{T_\Gamma = T_{sat}} + k_B \left.\frac{\partial T_B}{\partial n_B}\right|_{T_\Gamma = T_{sat}}
$$
$$
\dot m = -\frac{q_{sat}}{h_{lv}} \quad \text{(set to } 0 \text{ at time index 1)}
$$
&lt;p>$-q_{sat}$ is the net heat conducted into the interface from both sides. It is
consumed as latent heat, so $\dot m > 0$ when the interface gains heat
(evaporation).&lt;/p>
&lt;h3 id="temperature-flux-condition-regioncoupledphasechangeheatflux">Temperature flux condition (&lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code>)&lt;/h3>
$$
k_{own} \frac{\partial T_{own}}{\partial n_{own}}
= -\,k_{nbr} \frac{\partial T_{nbr}}{\partial n_{nbr}} + q_{sat}
$$
&lt;p>The other side of &lt;code>T&lt;/code> must carry a jump-type BC. That BC provides the value
continuity $T_{own} = T_{nbr}$; this interface type adds no temperature jump.&lt;/p>
&lt;h3 id="velocity-jump-regioncoupledmasstransfervelocityvalue">Velocity jump (&lt;code>regionCoupledMassTransferVelocityValue&lt;/code>)&lt;/h3>
$$
\mathbf{u}_{own} = \mathbf{u}_{nbr} + \left(\frac{1}{\rho_{own}} - \frac{1}{\rho_{nbr}}\right)\dot m\, \mathbf{n}_\varepsilon
$$
&lt;h3 id="pressure-jump-regioncoupledmasstransferpressurevalue">Pressure jump (&lt;code>regionCoupledMassTransferPressureValue&lt;/code>)&lt;/h3>
$$
p_{own} = p_{nbr} + 2\,(\mu_{nbr} - \mu_{own})\,\nabla_s\!\cdot\mathbf{u}_s - \sigma \kappa + (\rho_{nbr} - \rho_{own})\,\mathbf{g}\cdot(\mathbf{x}_f - \mathbf{x}_{ref}) - \left(\frac{1}{\rho_{own}} - \frac{1}{\rho_{nbr}}\right)\dot m^2
$$
&lt;p>If the pressure field is called &lt;code>pKin&lt;/code> (kinematic pressure), the same jump is
built from $\rho_{nbr}\,p_{kin,nbr}$ and the result is divided by
$\rho_{own}$.&lt;/p>
&lt;h3 id="momentum-flux-jump-regioncoupledmasstransfervelocityflux">Momentum flux jump (&lt;code>regionCoupledMassTransferVelocityFlux&lt;/code>)&lt;/h3>
&lt;p>The diffusive flux $\mu_{own}\,\partial\mathbf{u}_{own}/\partial n$ is set to the
negated normal component of the neighbour flux plus&lt;/p>
$$
\mathbf{f}_{\sigma,t} - \mu_{own}\,\mathbf{n}\,\nabla_s\!\cdot\mathbf{u}_s + (\mu_{nbr} - \mu_{own})\,(\nabla_s \mathbf{u}_s)\cdot\mathbf{n} + \dot m \left[\left(\frac{\dot m}{\rho_{own}}\mathbf{n}_\varepsilon - \mathbf{u}_{own}\right) - \left(\frac{\dot m}{\rho_{nbr}}\mathbf{n}_\varepsilon - \mathbf{u}_{nbr}\right)\right]
$$
&lt;p>where $\mathbf{f}_{\sigma,t}$ is the tangential part of the surface-tension
force from the &lt;code>capillaryInterface&lt;/code> finite-area mesh.&lt;/p>
&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>$T$&lt;/td>
&lt;td>Temperature (field &lt;code>T&lt;/code> in both regions)&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$T_{sat}$&lt;/td>
&lt;td>Saturation temperature (&lt;code>TSat&lt;/code>)&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$h_{lv}$&lt;/td>
&lt;td>Latent heat of vaporisation (&lt;code>hlv&lt;/code>)&lt;/td>
&lt;td>J/kg&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$k_A$, $k_B$&lt;/td>
&lt;td>Thermal conductivity, entry &lt;code>k&lt;/code> in each region&amp;rsquo;s &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>W/(m K)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$q_{sat}$&lt;/td>
&lt;td>Heat-flux imbalance at saturation (&lt;code>&amp;lt;patchA&amp;gt;fluxMTJump&lt;/code>)&lt;/td>
&lt;td>W/m²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\dot m$&lt;/td>
&lt;td>Interfacial mass flux (&lt;code>&amp;lt;patchA&amp;gt;mDotS&lt;/code>)&lt;/td>
&lt;td>kg/(m² s)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\rho$, $\mu$&lt;/td>
&lt;td>Density and dynamic viscosity from &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>kg/m³, Pa s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\sigma$, $\kappa$, $\mathbf{u}_s$&lt;/td>
&lt;td>Surface tension, curvature, interface velocity from &lt;code>capillaryInterface&lt;/code>&lt;/td>
&lt;td>N/m, 1/m, m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{g}$, $\mathbf{x}_{ref}$&lt;/td>
&lt;td>Gravity (&lt;code>g&lt;/code>) and &lt;code>PISO.pRefPoint&lt;/code>&lt;/td>
&lt;td>m/s², m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Construction.&lt;/strong> Reads &lt;code>massTransferInterfaceCoeffs&lt;/code> from the interface
entry. Creates on the interface finite-area mesh (&lt;code>aMesh()&lt;/code>, built from
region A if no &lt;code>&amp;lt;patchA&amp;gt;FaMesh&lt;/code> is registered) the area fields
&lt;code>hlvInterface&lt;/code> (uniform $h_{lv}$) and &lt;code>mDotInterface&lt;/code> (zero), both
&lt;code>NO_WRITE&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>correct()&lt;/code>&lt;/strong> calls &lt;code>updateMDotS()&lt;/code>:
&lt;ul>
&lt;li>&lt;code>saturatedFlux()&lt;/code> looks up &lt;code>T&lt;/code> in both regions and the scalar &lt;code>k&lt;/code> from
each region&amp;rsquo;s &lt;code>transportProperties&lt;/code> dictionary. It then computes
$q_{sat}$ as above on copies of &lt;code>T&lt;/code> (the solved fields are not changed).&lt;/li>
&lt;li>The result is stored in the area field &lt;code>&amp;lt;patchA&amp;gt;fluxMTJump&lt;/code>. The area
field &lt;code>&amp;lt;patchA&amp;gt;mDotS&lt;/code> is set to $-q_{sat}/h_{lv}$, or to zero when
&lt;code>timeIndex() == 1&lt;/code>. Both fields are created on demand and are
&lt;code>NO_WRITE&lt;/code>.&lt;/li>
&lt;li>&lt;code>mDotInterface&lt;/code> is set to &lt;code>mDotS&lt;/code>. A diagnostic line (time, integrated
$\dot m$, region volumes) is printed to the log.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Boundary conditions&lt;/strong> read the results: &lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code>
uses &lt;code>fluxMTJump()&lt;/code> as the flux jump of &lt;code>T&lt;/code>. The
&lt;code>regionCoupledMassTransfer*&lt;/code> conditions interpolate &lt;code>mDotS()&lt;/code> to their
patch.&lt;/li>
&lt;li>&lt;strong>&lt;code>getMinDeltaT()&lt;/code>&lt;/strong> returns &lt;code>GREAT&lt;/code> (no time-step restriction).
&lt;strong>&lt;code>info()&lt;/code>&lt;/strong> is empty.&lt;/li>
&lt;/ol>
&lt;h2 id="coupled-fields">Coupled Fields&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Required boundary conditions (side A / side B)&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>T&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code> with &lt;code>interfaceType (massTransferInterface ...)&lt;/code> on one side / a &lt;code>genericRegionCoupledJump&lt;/code>-derived BC on the other (&lt;em>inferred&lt;/em>: &lt;code>regionCoupledScalarJump&lt;/code>; &lt;code>regionCoupledTemperatureJump&lt;/code> needs a &lt;code>heatTransferInterface&lt;/code> listed first)&lt;/td>
&lt;td>Temperature, flux jump $q_{sat}$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>U&lt;/code> (via &lt;code>pUPimple&lt;/code>)&lt;/td>
&lt;td>&lt;code>regionCoupledMassTransferVelocityValue&lt;/code> / &lt;code>regionCoupledMassTransferVelocityFlux&lt;/code>&lt;/td>
&lt;td>Velocity with mass-flux jump, &lt;code>interfaceType (capillaryInterface massTransferInterface)&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>p&lt;/code> (via &lt;code>pUPimple&lt;/code>)&lt;/td>
&lt;td>&lt;code>regionCoupledMassTransferPressureValue&lt;/code> / &lt;code>regionCoupledPressureFlux&lt;/code> (&lt;em>inferred&lt;/em>: there is no mass-transfer pressure-flux BC)&lt;/td>
&lt;td>Pressure with recoil term $\dot m^2$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The BC&amp;rsquo;s &lt;code>interfaceType&lt;/code> list order matters. The first entry is the default
interface of the BC. &lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code> aborts unless its
first entry is &lt;code>massTransferInterface&lt;/code>. &lt;code>regionCoupledMassTransferPressureValue&lt;/code>
and &lt;code>regionCoupledMassTransferVelocityFlux&lt;/code> abort unless their first entry is
&lt;code>capillaryInterface&lt;/code>. Each BC finds the second interface type by name on the
same patch.&lt;/p>
&lt;p>Fields and dictionaries needed in &lt;strong>both&lt;/strong> regions:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Name&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Used by&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>T&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>&lt;code>saturatedFlux()&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>registered &lt;code>IOdictionary&lt;/code> with &lt;code>k&lt;/code> (and &lt;code>rho&lt;/code>, &lt;code>mu&lt;/code> for the &lt;code>U&lt;/code>/&lt;code>p&lt;/code> BCs, &lt;code>nu&lt;/code> if &lt;code>pKin&lt;/code> is used)&lt;/td>
&lt;td>interface, BCs&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>U&lt;/code>, &lt;code>p&lt;/code> (or &lt;code>pKin&lt;/code>), &lt;code>phi&lt;/code>&lt;/td>
&lt;td>vol/surface fields&lt;/td>
&lt;td>&lt;code>regionCoupledMassTransfer*&lt;/code> BCs&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>g&lt;/code>&lt;/td>
&lt;td>&lt;code>uniformDimensionedVectorField&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledMassTransferPressureValue&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>PISO.pRefPoint&lt;/code>&lt;/td>
&lt;td>entry in &lt;code>fvSolution&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledMassTransferPressureValue&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="compatible-region-types">Compatible Region Types&lt;/h2>
&lt;p>No compiled region type combination has been shown to work. The table lists
what the code requires (&lt;em>inferred, untested&lt;/em>).&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Region type (side A)&lt;/th>
&lt;th>Region type (side B)&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>interTrackFluid&lt;/code>&lt;/td>
&lt;td>&lt;code>interTrackFluid&lt;/code>&lt;/td>
&lt;td>Intended pairing (moving-mesh interface tracking, as in the &lt;code>capillaryInterface&lt;/code> tutorials). &lt;strong>Disabled&lt;/strong> in &lt;code>src/multiRegionSystem/Make/files&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>icoFluid&lt;/code> + &lt;code>transportTemperature&lt;/code>&lt;/td>
&lt;td>&lt;code>icoFluid&lt;/code> + &lt;code>transportTemperature&lt;/code>&lt;/td>
&lt;td>&lt;code>icoFluid&lt;/code> provides &lt;code>U&lt;/code>, &lt;code>p&lt;/code>, &lt;code>phi&lt;/code>, &lt;code>transportProperties&lt;/code> (&lt;code>rho&lt;/code>, &lt;code>mu&lt;/code>) and documents these BCs (see &lt;code>icoFluid&lt;/code>). &lt;code>transportTemperature&lt;/code> provides &lt;code>T&lt;/code>. Both read &lt;code>kappa&lt;/code>, so &lt;code>k&lt;/code> must be added to &lt;code>transportProperties&lt;/code> as well. &lt;code>g&lt;/code> must be provided separately.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>any + &lt;code>conductTemperature&lt;/code>&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Only the &lt;code>T&lt;/code> part can work (no &lt;code>U&lt;/code>/&lt;code>p&lt;/code>); &lt;code>k&lt;/code> must be added next to &lt;code>kappa&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The interface needs &lt;code>k&lt;/code> as a single uniform &lt;code>dimensionedScalar&lt;/code> per region. A
non-uniform &lt;code>kappa&lt;/code> field (see &lt;code>transportTemperature&lt;/code>, &lt;code>conductTemperature&lt;/code>) is
not used.&lt;/p>
&lt;h2 id="case-setup">Case Setup&lt;/h2>
&lt;p>No tutorial exists. The snippets below are assembled from the keywords the
code reads and from the structure of
&lt;code>tutorials/multiphaseFlow/2dRisingBubble&lt;/code> (which uses &lt;code>capillaryInterface&lt;/code>
only). They have not been run.&lt;/p>
&lt;h3 id="regioninterfaceproperties-entry">&lt;code>regionInterfaceProperties&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">partitionedCoupledPatches
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> fluidAfluidB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> coupledPatchPair
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (fluidA interface)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (fluidB interfaceShadow)
&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"> coupledFields
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pUPimple
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> T
&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"> capillaryInterfaceCoeffs
&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 sigma [ 1 0 -2 0 0 0 0 ] 0.07232;
&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"> massTransferInterfaceCoeffs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> hlv hlv [ 0 2 -2 0 0 0 0 ] 2.257e6; // required, J/kg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> TSat TSat [ 0 0 0 1 0 0 0 ] 373.15; // required, K
&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">);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">monolithicCoupledPatches
&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">curvatureCorrectedSurfacePatches 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">interpolatorUpdateFrequency 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">interfaceTransferMethod directMap;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">directMapCoeffs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Where&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>hlv&lt;/code>&lt;/td>
&lt;td>&lt;code>massTransferInterfaceCoeffs&lt;/code>&lt;/td>
&lt;td>— (required)&lt;/td>
&lt;td>Latent heat $h_{lv}$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>TSat&lt;/code>&lt;/td>
&lt;td>&lt;code>massTransferInterfaceCoeffs&lt;/code>&lt;/td>
&lt;td>— (required)&lt;/td>
&lt;td>Saturation temperature $T_{sat}$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>coupled&lt;/code>&lt;/td>
&lt;td>interface entry&lt;/td>
&lt;td>&lt;code>true&lt;/code>&lt;/td>
&lt;td>Base class switch&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingStartTime&lt;/code>&lt;/td>
&lt;td>interface entry&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>Base class&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interfaceTransferMethod&lt;/code>&lt;/td>
&lt;td>top level&lt;/td>
&lt;td>&lt;code>AMI&lt;/code>&lt;/td>
&lt;td>Patch-to-patch mapping used by the BCs. See also the conformity note in Known Limitations.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>curvatureCorrectedSurfacePatches&lt;/code>&lt;/td>
&lt;td>top level&lt;/td>
&lt;td>— (required)&lt;/td>
&lt;td>Base class, needed by every interface type&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>All interface types listed in &lt;code>interfaceType&lt;/code> receive the same entry, so they
share &lt;code>coupledPatchPair&lt;/code> and &lt;code>coupledFields&lt;/code>.&lt;/p>
&lt;h3 id="multiregionproperties-dna-entry">&lt;code>multiRegionProperties&lt;/code> DNA 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">DNA
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pUPimple
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxCoupleIter 10;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> residualControl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> U { maxJumpRes 1e-5; maxFluxRes 1e-4; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> p { maxJumpRes 1e-5; maxFluxRes 1e-5; }
&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">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxCoupleIter 10;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> residualControl { maxJumpRes 1e-5; maxFluxRes 1e-5; }
&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;/code>&lt;/pre>&lt;/div>&lt;h3 id="boundary-conditions">Boundary conditions&lt;/h3>
&lt;p>Based on the &lt;code>capillaryInterface&lt;/code> BCs in
&lt;code>tutorials/multiphaseFlow/2dRisingBubble/0/fluidA/orig/partitioned/U&lt;/code> and
&lt;code>.../fluidB/orig/partitioned/p&lt;/code>, with the mass-transfer variants substituted:&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">// 0/fluidA/U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledMassTransferVelocityFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;mu&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 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">// 0/fluidB/U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledMassTransferVelocityValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;mu&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 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">// 0/fluidA/p
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledMassTransferPressureValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;v&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 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">// 0/fluidB/T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledPhaseChangeHeatFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 373.15;
&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>regionCoupledPhaseChangeHeatFlux&lt;/code> fixes its diffusivity name to &lt;code>k&lt;/code>. It uses a
&lt;code>volScalarField k&lt;/code> if the region has one, otherwise &lt;code>k&lt;/code> from
&lt;code>transportProperties&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;code>correct()&lt;/code> runs on every coupled BC update.&lt;/strong> &lt;code>regionInterfaceTypeList::update()&lt;/code>
does not call &lt;code>correct()&lt;/code>, but every &lt;code>genericRegionCoupledJump&lt;/code>/&lt;code>Flux&lt;/code>-derived
BC calls &lt;code>rgInterface().update()&lt;/code> in its &lt;code>updateCoeffs()&lt;/code>, which calls
&lt;code>correct()&lt;/code>. &lt;code>rgInterface()&lt;/code> resolves only the &lt;strong>first&lt;/strong> entry of the BC&amp;rsquo;s
&lt;code>interfaceType&lt;/code> list, so $\dot m$ is updated only by BCs that list
&lt;code>massTransferInterface&lt;/code> first (e.g. &lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code> on
&lt;code>T&lt;/code>). The U/p mass-transfer BCs list &lt;code>capillaryInterface&lt;/code> first and never
trigger it. When it does run, it runs once per such BC evaluation, i.e.
several times per coupling iteration.&lt;/li>
&lt;li>&lt;strong>No runnable tutorial.&lt;/strong> No tutorial uses &lt;code>massTransferInterface&lt;/code>. The
&lt;code>interTrackFluid&lt;/code> region type it was written for is commented out in
&lt;code>src/multiRegionSystem/Make/files&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Constant properties.&lt;/strong> $h_{lv}$, $T_{sat}$ and &lt;code>k&lt;/code> are single uniform
scalars. $T_{sat}$ does not depend on pressure.&lt;/li>
&lt;li>&lt;strong>Conformal interface assumed.&lt;/strong> &lt;code>saturatedFlux()&lt;/code> adds patch-A and
patch-B face values index by index without mapping. Results are written into
an area field on the finite-area mesh of region A. This only makes sense if
both patches and the &lt;code>aMesh&lt;/code> have the same faces in the same order
(&lt;em>inferred&lt;/em>). The BCs on side A also call &lt;code>interpolateFromNbrField&lt;/code> on
&lt;code>mDotS&lt;/code>, which is already defined on A (&lt;em>inferred to be harmless only for
identical conformal patches&lt;/em>).&lt;/li>
&lt;li>&lt;strong>First time step forced to $\dot m = 0$.&lt;/strong> The check is
&lt;code>timeIndex() == 1&lt;/code>, so the first step after a restart is presumably not
affected, because the time index continues from &lt;code>uniform/time&lt;/code> (&lt;em>inferred&lt;/em>).&lt;/li>
&lt;li>&lt;strong>&lt;code>regionCoupledMassTransferVelocityValue::updatePhi()&lt;/code> is never called.&lt;/strong>
The mass-flux correction of the boundary &lt;code>phi&lt;/code> it implements is dead code.&lt;/li>
&lt;li>&lt;strong>No temperature constraint at the interface.&lt;/strong> $T_{sat}$ is used only to
compute $q_{sat}$. &lt;code>T&lt;/code> on the patches is not fixed to $T_{sat}$, and the
saturation check (&lt;code>checkSaturation&lt;/code>) is computed and then discarded.&lt;/li>
&lt;li>&lt;strong>Name clash risk with &lt;code>k&lt;/code>&lt;/strong> (&lt;em>inferred&lt;/em>). The heat-flux BC prefers a
&lt;code>volScalarField k&lt;/code>. In a turbulent region that is the turbulent kinetic
energy, not the conductivity.&lt;/li>
&lt;li>&lt;strong>Diagnostics are always on.&lt;/strong> &lt;code>updateMDotS()&lt;/code> and the velocity BC write an
&lt;code>Info&lt;/code> line on every call. The output fields are &lt;code>NO_WRITE&lt;/code>, so $\dot m$ is
not written to disk.&lt;/li>
&lt;li>&lt;strong>Partitioned only.&lt;/strong> Monolithic coupling is not available.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>—&lt;/td>
&lt;td>No tutorial uses &lt;code>massTransferInterface&lt;/code>. &lt;code>tutorials/multiphaseFlow/2dRisingBubble&lt;/code> shows the companion &lt;code>capillaryInterface&lt;/code> setup (also on the disabled &lt;code>interTrackFluid&lt;/code>).&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;/ul></description></item><item><title>Docs: regionCoupledMassTransferPressureValue</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledmasstransferpressurevalue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledmasstransferpressurevalue/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledMassTransferPressureValue&lt;/code> is the Dirichlet (jump) half of the
partitioned pressure coupling across a sharp liquid-vapour interface with
phase change. It acts on a &lt;code>volScalarField&lt;/code> (&lt;code>p&lt;/code> or &lt;code>pKin&lt;/code>) and derives from
&lt;code>genericRegionCoupledJump&amp;lt;scalar&amp;gt;&lt;/code>, i.e. from &lt;code>fixedValue&lt;/code>. It applies the
same normal-stress jump as &lt;code>regionCoupledPressureValue&lt;/code> and adds the recoil
pressure $-(1/\rho_\text{own}-1/\rho_\text{nbr})\,\dot m^2$. There is no
mass-transfer pressure-flux BC; the partner is presumably
&lt;code>regionCoupledPressureFlux&lt;/code> (&lt;em>inferred&lt;/em>). The BC needs a &lt;code>capillaryInterface&lt;/code>
as the &lt;strong>first&lt;/strong> &lt;code>interfaceType&lt;/code> entry and a &lt;code>massTransferInterface&lt;/code> on the
same patch pair.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>The BC sits on side A (&amp;ldquo;own&amp;rdquo;), which carries the &lt;code>faMesh&lt;/code> of the
&lt;code>capillaryInterface&lt;/code>; &amp;ldquo;nbr&amp;rdquo; is side B.
$\tilde{\dot m} = \mathcal{I}_{\text{nbr}\to\text{own}}(\dot m)$.&lt;/p>
&lt;p>For a field named &lt;code>p&lt;/code>:&lt;/p>
$$
p_\text{own}^{*} = \mathcal{I}(p_\text{nbr}) + 2(\mu_\text{nbr}-\mu_\text{own})\,\nabla_s\cdot\mathbf{u}_s - \sigma\kappa + (\rho_\text{nbr}-\rho_\text{own})\,(\mathbf{x}_f-\mathbf{x}_\text{ref})\cdot\mathbf{g} - \left(\frac{1}{\rho_\text{own}}-\frac{1}{\rho_\text{nbr}}\right)\tilde{\dot m}^2
\quad \text{on } \Gamma
$$
&lt;p>For a field named &lt;code>pKin&lt;/code>:&lt;/p>
$$
p_{\text{kin,own}}^{*} = \frac{1}{\rho_\text{own}}\Big[\rho_\text{nbr}\,\mathcal{I}(p_\text{kin,nbr}) + 2(\mu_\text{nbr}-\mu_\text{own})\,\nabla_s\cdot\mathbf{u}_s - \sigma\kappa + (\rho_\text{nbr}-\rho_\text{own})\,(\mathbf{x}_f-\mathbf{x}_\text{ref})\cdot\mathbf{g} - \left(\frac{1}{\rho_\text{own}}-\frac{1}{\rho_\text{nbr}}\right)\tilde{\dot m}^2\Big]
$$
&lt;p>followed by relaxation, $p^{k} = p^{k-1} + \omega\,(p^{*} - p^{k-1})$.&lt;/p>
&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>$p$, $p_\text{kin}$&lt;/td>
&lt;td>Pressure / kinematic pressure&lt;/td>
&lt;td>Pa / m²/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\dot m$&lt;/td>
&lt;td>Interfacial mass flux, &lt;code>mDotS()&lt;/code> of the &lt;code>massTransferInterface&lt;/code>&lt;/td>
&lt;td>kg/(m² s)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{u}_s$&lt;/td>
&lt;td>Surface velocity on the &lt;code>faMesh&lt;/code> (&lt;code>Us()&lt;/code>)&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\sigma$, $\kappa$&lt;/td>
&lt;td>Surface tension and face curvature from the &lt;code>capillaryInterface&lt;/code>&lt;/td>
&lt;td>N/m, 1/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mu$, $\rho$&lt;/td>
&lt;td>&lt;code>mu&lt;/code>, &lt;code>rho&lt;/code> from each region&amp;rsquo;s &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>Pa·s, kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{g}$&lt;/td>
&lt;td>&lt;code>uniformDimensionedVectorField g&lt;/code> of the local region&lt;/td>
&lt;td>m/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{x}_\text{ref}$&lt;/td>
&lt;td>&lt;code>PISO.pRefPoint&lt;/code> from the local &lt;code>fvSolution&lt;/code>&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;code>updateCoeffs()&lt;/code> is the generic one of &lt;code>genericRegionCoupledJump&lt;/code>: return if
updated or &lt;code>coupled no&lt;/code>; call &lt;code>update()&lt;/code> on the first &lt;code>interfaceType&lt;/code> (the
&lt;code>capillaryInterface&lt;/code>); interpolate the neighbour field (looked up by the
local field name); add &lt;code>valueJump()&lt;/code>; relax; call
&lt;code>fixedValue::updateCoeffs()&lt;/code>.&lt;/p>
&lt;p>&lt;code>valueJump()&lt;/code> is that of &lt;code>regionCoupledPressureValue&lt;/code> with the extra recoil
term. It aborts unless the first &lt;code>interfaceType&lt;/code> is &lt;code>capillaryInterface&lt;/code>,
finds the &lt;code>massTransferInterface&lt;/code> by type name and interpolates &lt;code>mDotS()&lt;/code>
from the neighbour side. &lt;code>PISO.pRefPoint&lt;/code>, &lt;code>g&lt;/code>, and &lt;code>mu&lt;/code>/&lt;code>rho&lt;/code> of both
regions are required. The mesh flux and patch normals are computed but not
used.&lt;/p>
&lt;p>Since only the first interface is &lt;code>update()&lt;/code>d, $\dot m$ is not recomputed by
this BC. It changes only when a BC that lists &lt;code>massTransferInterface&lt;/code> first
(e.g. &lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code> on &lt;code>T&lt;/code>) is updated. Until then the
recoil term is zero and the BC behaves like &lt;code>regionCoupledPressureValue&lt;/code>.&lt;/p>
&lt;p>The &lt;code>p&lt;/code> jump residual of the &lt;code>pUPimple&lt;/code> DNA loop is taken from this BC
(side A is checked first). &lt;code>flux()&lt;/code> uses the hardcoded diffusivity &lt;code>v&lt;/code>, for
which &lt;code>diffCoeff()&lt;/code> returns $\rho$ instead of $1/\rho$ (1 for &lt;code>pKin&lt;/code>); the
partner &lt;code>regionCoupledPressureFlux&lt;/code> cancels this flux.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledMassTransferPressureValue&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interfaceType&lt;/code>&lt;/td>
&lt;td>List of interface type names. First entry must be &lt;code>capillaryInterface&lt;/code>; &lt;code>massTransferInterface&lt;/code> must also be listed&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Initial patch value. Read if present. If missing, the patch values are not initialised&lt;/td>
&lt;td>in practice yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Read, but ignored: the BC always uses &lt;code>v&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read by the coupling manager, not used by this BC&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>jumpCoefficient&lt;/code>&lt;/td>
&lt;td>Read by the base class, not used, not written back&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>Acceleration model: &lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code>, &lt;code>IQNILS&lt;/code>. A warning is printed if missing&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>(Initial) relaxation factor&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingReuse&lt;/code>&lt;/td>
&lt;td>&lt;code>IQNILS&lt;/code> only&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction in &lt;code>snGrad()&lt;/code> / matrix coefficients&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order face-normal gradient&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Entries read from other files: &lt;code>PISO { pRefPoint (...); }&lt;/code> in the local
&lt;code>fvSolution&lt;/code>, &lt;code>g&lt;/code> in the local &lt;code>constant/&lt;/code>, and &lt;code>mu&lt;/code>, &lt;code>rho&lt;/code> in
&lt;code>transportProperties&lt;/code> of both regions.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>No tutorial uses this BC. Untested entry on side A, following
&lt;code>massTransferInterface&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">// 0/fluidA/p
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledMassTransferPressureValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Partner on side B (&lt;em>inferred&lt;/em>):&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">// 0/fluidB/p
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledPressureFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>regionInterfaceProperties&lt;/code> entry is shown on the
&lt;code>regionCoupledMassTransferVelocityValue&lt;/code> page and in &lt;code>massTransferInterface&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Untested, no tutorial&lt;/strong>; the intended region type &lt;code>interTrackFluid&lt;/code> is
disabled.&lt;/li>
&lt;li>&lt;strong>$\dot m$ is only updated through another BC.&lt;/strong> See
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledmasstransferpressurevalue/#implementation">Implementation&lt;/a>.&lt;/li>
&lt;li>&lt;strong>&lt;code>mDotS()&lt;/code> is interpolated from the neighbour although it is defined on
side A&lt;/strong> (&lt;em>inferred&lt;/em>), where this BC sits. Harmless only for identical
conformal patches.&lt;/li>
&lt;li>&lt;strong>Must sit on side A&lt;/strong> (&lt;em>inferred&lt;/em>): $\sigma$, $\kappa$ and
$\nabla_s\cdot\mathbf{u}_s$ are used without interpolation.&lt;/li>
&lt;li>&lt;strong>No dedicated flux partner.&lt;/strong> &lt;code>regionCoupledPressureFlux&lt;/code> does not
account for phase change.&lt;/li>
&lt;li>&lt;strong>Constant properties&lt;/strong>, &lt;code>PISO.pRefPoint&lt;/code> required, &lt;code>diffusivity&lt;/code> and
&lt;code>neighbourFieldName&lt;/code> ignored (as for &lt;code>regionCoupledPressureValue&lt;/code>).&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>—&lt;/td>
&lt;td>No tutorial uses &lt;code>regionCoupledMassTransferPressureValue&lt;/code>.&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;/ul></description></item><item><title>Docs: regionCoupledMassTransferVelocityFlux</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledmasstransfervelocityflux/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledmasstransfervelocityflux/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledMassTransferVelocityFlux&lt;/code> is the Neumann (flux) half of the
partitioned velocity coupling across a sharp liquid-vapour interface with
phase change. It acts on a &lt;code>volVectorField&lt;/code> (&lt;code>U&lt;/code>) and derives from
&lt;code>genericRegionCoupledFlux&amp;lt;vector&amp;gt;&lt;/code>, i.e. from &lt;code>fixedGradient&lt;/code>. It uses the
same stress balance as &lt;code>regionCoupledVelocityFlux&lt;/code> and adds the momentum
flux $\dot m\,[\![\mathbf{u}_\text{rel}]\!]$ that the mass flux carries
across the interface. The partner condition on the other side is
&lt;code>regionCoupledMassTransferVelocityValue&lt;/code>. The BC needs a &lt;code>capillaryInterface&lt;/code>
as the &lt;strong>first&lt;/strong> &lt;code>interfaceType&lt;/code> entry and a &lt;code>massTransferInterface&lt;/code> on the
same patch pair.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>&amp;ldquo;own&amp;rdquo; is the side the BC sits on (side A, which carries the &lt;code>faMesh&lt;/code>) and
&amp;ldquo;nbr&amp;rdquo; the other side. $\mathbf{n}$ is the &lt;code>faMesh&lt;/code> face normal,
$\mathbf{n}_\varepsilon = \mathbf{n}$ if the local region is &lt;code>meshA&lt;/code> of the
&lt;code>capillaryInterface&lt;/code> (otherwise $-\mathbf{n}$). $\tilde{\mathbf{F}}$ is the
interpolated diffusive flux of the partner BC ($\mu_\text{nbr}$ times the
tangential face-normal gradient) and
$\tilde{\dot m} = \mathcal{I}_{\text{nbr}\to\text{own}}(\dot m)$.&lt;/p>
$$
\mu_\text{own}\frac{\partial \mathbf{U}_\text{own}}{\partial n} =
-(\mathbf{I}-\mathbf{n}\mathbf{n})\cdot\tilde{\mathbf{F}} + \mathbf{f}_{\sigma,t} - \mu_\text{own}\,\mathbf{n}\,(\nabla_s\cdot\mathbf{u}_s) + (\mu_\text{nbr}-\mu_\text{own})\,(\nabla_s\mathbf{u}_s)\cdot\mathbf{n} + \tilde{\dot m}\left[\left(\frac{\tilde{\dot m}}{\rho_\text{own}}\mathbf{n}_\varepsilon - \mathbf{U}_\text{own}\right) - \left(\frac{\tilde{\dot m}}{\rho_\text{nbr}}\mathbf{n}_\varepsilon - \mathbf{U}_\text{nbr}\right)\right]
$$
&lt;p>with the tangential surface-tension force&lt;/p>
$$
\mathbf{f}_{\sigma,t} = \sigma\,\frac{1}{S_f}\sum_{e} \mathbf{L}_e\,c_e \;-\; \sigma\kappa\,\mathbf{n}
$$
&lt;p>$\mathbf{U}_\text{own}$ are the current patch values (previous iteration) and
$\mathbf{U}_\text{nbr}$ the neighbour patch values &lt;strong>without interpolation&lt;/strong>
(see &lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledmasstransfervelocityflux/#known-limitations">Known Limitations&lt;/a>). The gradient is relaxed,
$g^{k} = g^{k-1} + \omega\,(g^{*} - g^{k-1})$, and the patch value is
reconstructed from it in &lt;code>evaluate()&lt;/code> as described for
&lt;code>regionCoupledVelocityFlux&lt;/code>.&lt;/p>
&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>$\mathbf{U}$&lt;/td>
&lt;td>Velocity&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\dot m$&lt;/td>
&lt;td>Interfacial mass flux, &lt;code>mDotS()&lt;/code> of the &lt;code>massTransferInterface&lt;/code>&lt;/td>
&lt;td>kg/(m² s)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{u}_s$&lt;/td>
&lt;td>Surface velocity on the &lt;code>faMesh&lt;/code> (&lt;code>Us()&lt;/code>)&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\sigma$, $\kappa$&lt;/td>
&lt;td>Surface tension and face curvature from the &lt;code>capillaryInterface&lt;/code>&lt;/td>
&lt;td>N/m, 1/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{L}_e$, $c_e$&lt;/td>
&lt;td>&lt;code>faMesh&lt;/code> edge length vectors and &lt;code>edgeLengthCorrection()&lt;/code>&lt;/td>
&lt;td>m, –&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mu$, $\rho$&lt;/td>
&lt;td>&lt;code>mu&lt;/code>, &lt;code>rho&lt;/code> from each region&amp;rsquo;s &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>Pa·s, kg/m³&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;code>updateCoeffs()&lt;/code> is the generic one of &lt;code>genericRegionCoupledFlux&lt;/code>: return if
updated or &lt;code>coupled no&lt;/code>; call &lt;code>update()&lt;/code> on the first &lt;code>interfaceType&lt;/code> (the
&lt;code>capillaryInterface&lt;/code>); interpolate and negate the neighbour &lt;code>flux()&lt;/code> (the
neighbour patch field is &lt;code>refCast&lt;/code> to &lt;code>genericRegionCoupledJump&amp;lt;vector&amp;gt;&lt;/code>);
add &lt;code>fluxJump()&lt;/code>; divide by &lt;code>diffCoeff()&lt;/code> (hardcoded name &lt;code>mu&lt;/code>: registered
&lt;code>volScalarField mu&lt;/code>, else &lt;code>transportProperties&lt;/code>); relax; call
&lt;code>fixedGradient::updateCoeffs()&lt;/code>.&lt;/p>
&lt;p>&lt;code>fluxJump()&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>aborts unless the first &lt;code>interfaceType&lt;/code> is &lt;code>capillaryInterface&lt;/code>; finds the
&lt;code>massTransferInterface&lt;/code> by type name;&lt;/li>
&lt;li>computes $\nabla_s\cdot\mathbf{u}_s$, $\nabla_s\mathbf{u}_s$ and the
edge-integrated surface-tension force on the &lt;code>faMesh&lt;/code>;&lt;/li>
&lt;li>reads &lt;code>mu&lt;/code> and &lt;code>rho&lt;/code> of both regions from &lt;code>transportProperties&lt;/code>; if a
region has a &lt;code>pKin&lt;/code> field, its &lt;code>mu&lt;/code> must equal &lt;code>rho*nu&lt;/code> exactly, otherwise
the run stops;&lt;/li>
&lt;li>interpolates &lt;code>mDotS()&lt;/code> from the neighbour side.&lt;/li>
&lt;/ul>
&lt;p>Because only the first interface is &lt;code>update()&lt;/code>d, $\dot m$ is not recomputed by
this BC. It changes only when a BC that lists &lt;code>massTransferInterface&lt;/code> first
(e.g. &lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code> on &lt;code>T&lt;/code>) is updated.&lt;/p>
&lt;p>The &lt;code>U&lt;/code> flux residual of the &lt;code>pUPimple&lt;/code> DNA loop is taken from this BC if it
sits on side A:
$\lVert\mu_\text{own}\partial_n\mathbf{U}_\text{own} + \tilde{\mathbf{F}} - \text{fluxJump}\rVert_2$,
normalised as in &lt;code>genericRegionCoupledFlux&lt;/code>.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledMassTransferVelocityFlux&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interfaceType&lt;/code>&lt;/td>
&lt;td>List of interface type names. First entry must be &lt;code>capillaryInterface&lt;/code>; &lt;code>massTransferInterface&lt;/code> must also be listed&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradient&lt;/code>&lt;/td>
&lt;td>Initial patch-normal gradient. Read if present; otherwise zero gradient and the patch value is set from the internal field&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Not read (&lt;code>fixedGradient&lt;/code> ignores it). Written by &lt;code>write()&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Read, but ignored: the BC always uses &lt;code>mu&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read by the coupling manager, not used by this BC&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>Acceleration model for the gradient: &lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code>, &lt;code>IQNILS&lt;/code>. A warning is printed if missing&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>(Initial) relaxation factor&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingReuse&lt;/code>&lt;/td>
&lt;td>&lt;code>IQNILS&lt;/code> only&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction in &lt;code>evaluate()&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order reconstruction of the patch value&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>write()&lt;/code> does not write &lt;code>gradient&lt;/code>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>No tutorial uses this BC. Untested entry on side A, following
&lt;code>massTransferInterface&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">// 0/fluidA/U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledMassTransferVelocityFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Partner on side B:&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">// 0/fluidB/U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledMassTransferVelocityValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>regionInterfaceProperties&lt;/code> entry is shown on the
&lt;code>regionCoupledMassTransferVelocityValue&lt;/code> page and in &lt;code>massTransferInterface&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Neighbour velocity is not interpolated (bug).&lt;/strong> $\mathbf{U}_\text{nbr}$
in the mass-flux term is the raw neighbour patch field, combined index by
index with local fields. This is only correct for conformal patches with
identical face order; otherwise the sizes may not even match.&lt;/li>
&lt;li>&lt;strong>&lt;code>mDotS()&lt;/code> is interpolated from the neighbour although it is defined on
side A&lt;/strong> (&lt;em>inferred&lt;/em>), where this BC sits. Harmless only for identical
conformal patches.&lt;/li>
&lt;li>&lt;strong>Must sit on side A&lt;/strong> (&lt;em>inferred&lt;/em>): &lt;code>faMesh&lt;/code> normals, $\mathbf{u}_s$,
$\sigma$, $\kappa$ are used without interpolation.&lt;/li>
&lt;li>&lt;strong>$\dot m$ is only updated through another BC.&lt;/strong> See
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledmasstransfervelocityflux/#implementation">Implementation&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Exact &lt;code>mu == rho*nu&lt;/code> check&lt;/strong> for regions with &lt;code>pKin&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Relaxation history starts from the patch value&lt;/strong> (&lt;em>inferred&lt;/em>). The base
class initialises the acceleration model with the patch values but relaxes
the gradient; harmless with &lt;code>relax 1&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Untested, no tutorial&lt;/strong>; &lt;code>interTrackFluid&lt;/code> is disabled.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>—&lt;/td>
&lt;td>No tutorial uses &lt;code>regionCoupledMassTransferVelocityFlux&lt;/code>.&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;/ul></description></item><item><title>Docs: regionCoupledMassTransferVelocityValue</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledmasstransfervelocityvalue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledmasstransfervelocityvalue/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledMassTransferVelocityValue&lt;/code> is the Dirichlet (jump) half of the
partitioned velocity coupling across a sharp liquid-vapour interface with
phase change. It acts on a &lt;code>volVectorField&lt;/code> (&lt;code>U&lt;/code>) and derives from
&lt;code>genericRegionCoupledJump&amp;lt;vector&amp;gt;&lt;/code>, i.e. from &lt;code>fixedValue&lt;/code>. The patch value is
the interpolated neighbour velocity plus the jump in normal velocity that a
mass flux $\dot m$ produces between two phases of different density. The
partner condition on the other side is
&lt;code>regionCoupledMassTransferVelocityFlux&lt;/code>. The BC needs both a
&lt;code>capillaryInterface&lt;/code> and a &lt;code>massTransferInterface&lt;/code> on the same patch pair,
and the pressure is coupled by &lt;code>regionCoupledMassTransferPressureValue&lt;/code> and
(&lt;em>inferred&lt;/em>) &lt;code>regionCoupledPressureFlux&lt;/code>. It is the phase-change counterpart
of &lt;code>regionCoupledVelocityValue&lt;/code>.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>&amp;ldquo;own&amp;rdquo; is the side the BC sits on and &amp;ldquo;nbr&amp;rdquo; the other side.
$\mathcal{I}_{\text{nbr}\to\text{own}}$ is the patch-to-patch interpolation.
$\mathbf{n}_\varepsilon$ is the local patch normal if the local region is
&lt;code>meshA&lt;/code> of the &lt;code>capillaryInterface&lt;/code>, and its negative otherwise. In both
cases it points out of region A.&lt;/p>
$$
\mathbf{U}_\text{own}^{*} = \mathcal{I}_{\text{nbr}\to\text{own}}(\mathbf{U}_\text{nbr}) + \left(\frac{1}{\rho_\text{own}} - \frac{1}{\rho_\text{nbr}}\right)\tilde{\dot m}\,\mathbf{n}_\varepsilon,
\qquad
\tilde{\dot m} = \mathcal{I}_{\text{nbr}\to\text{own}}(\dot m)
\quad \text{on } \Gamma
$$
&lt;p>followed by relaxation,
$\mathbf{U}^{k} = \mathbf{U}^{k-1} + \omega\,(\mathbf{U}^{*} - \mathbf{U}^{k-1})$.&lt;/p>
&lt;p>Unlike &lt;code>regionCoupledVelocityValue&lt;/code>, no surface-velocity or mesh-velocity
correction of the normal component is applied. That version is still in the
source but commented out.&lt;/p>
&lt;p>The diffusive momentum flux handed to &lt;code>regionCoupledMassTransferVelocityFlux&lt;/code>
is the same as for &lt;code>regionCoupledVelocityValue&lt;/code>: $\mu_\text{own}$ times the
tangential part of the face-normal gradient (normal component removed in the
vector &lt;code>snGrad()&lt;/code> of &lt;code>genericRegionCoupledJump&lt;/code>).&lt;/p>
&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>$\mathbf{U}$&lt;/td>
&lt;td>Velocity&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\dot m$&lt;/td>
&lt;td>Interfacial mass flux, &lt;code>mDotS()&lt;/code> of the &lt;code>massTransferInterface&lt;/code> (area field on the side-A &lt;code>faMesh&lt;/code>)&lt;/td>
&lt;td>kg/(m² s)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\rho_\text{own}$, $\rho_\text{nbr}$&lt;/td>
&lt;td>&lt;code>rho&lt;/code> from each region&amp;rsquo;s &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}_\varepsilon$&lt;/td>
&lt;td>Interface normal pointing out of region A&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mu_\text{own}$&lt;/td>
&lt;td>Diffusivity &lt;code>mu&lt;/code> (field or &lt;code>transportProperties&lt;/code>)&lt;/td>
&lt;td>Pa·s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;code>updateCoeffs()&lt;/code> is the generic one of &lt;code>genericRegionCoupledJump&lt;/code>: return if
updated or &lt;code>coupled no&lt;/code>; call &lt;code>update()&lt;/code> on the &lt;strong>first&lt;/strong> &lt;code>interfaceType&lt;/code>;
interpolate the neighbour &lt;code>U&lt;/code> (looked up by the local field name); add
&lt;code>valueJump()&lt;/code>; relax; call &lt;code>fixedValue::updateCoeffs()&lt;/code>.&lt;/p>
&lt;p>&lt;code>valueJump()&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>finds the &lt;code>capillaryInterface&lt;/code> and the &lt;code>massTransferInterface&lt;/code> by type name
on this patch (&lt;code>rgInterface(&amp;lt;type&amp;gt;)&lt;/code>), independent of their order in
&lt;code>interfaceType&lt;/code>;&lt;/li>
&lt;li>interpolates &lt;code>mDotS()&lt;/code> from the neighbour side;&lt;/li>
&lt;li>reads &lt;code>rho&lt;/code> of both regions from &lt;code>transportProperties&lt;/code>;&lt;/li>
&lt;li>&lt;code>refCast&lt;/code>s the neighbour &lt;code>U&lt;/code> patch field to &lt;code>genericRegionCoupledFlux&amp;lt;vector&amp;gt;&lt;/code>
and uses its values only for a diagnostic line;&lt;/li>
&lt;li>prints &lt;code>U Dirichlet boundary contributions: ...&lt;/code> (integrated volume fluxes
of the neighbour velocity, of the jump term and of mesh motion plus
$\dot m/\rho$) on every call.&lt;/li>
&lt;/ul>
&lt;p>Only the interface listed first in &lt;code>interfaceType&lt;/code> is &lt;code>update()&lt;/code>d by this
BC. With &lt;code>(capillaryInterface massTransferInterface)&lt;/code> the
&lt;code>massTransferInterface&lt;/code> is not corrected here. $\dot m$ is only recomputed
when a BC that lists &lt;code>massTransferInterface&lt;/code> first (e.g.
&lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code> on &lt;code>T&lt;/code>) is updated. Otherwise it stays at
its initial value of zero.&lt;/p>
&lt;p>The class has two more functions that are not used in the solution:&lt;/p>
&lt;ul>
&lt;li>&lt;code>updatePhi()&lt;/code> would set the boundary &lt;code>phi&lt;/code> to the negated interpolated
neighbour flux plus $\pm(1/\rho_\text{own}-1/\rho_\text{nbr})\dot m\,|\mathbf{S}_f|$.
The call in the base class is commented out.&lt;/li>
&lt;li>The member &lt;code>correctClosedVolumePhi(phi, U, p, rAU)&lt;/code> would correct the
interface flux to the net volume flux $-\dot m/\rho\,|\mathbf{S}_f|$. It is
never called. The global &lt;code>correctClosedVolumePhi()&lt;/code> used by &lt;code>icoFluid&lt;/code> and
&lt;code>interTrackFluid&lt;/code> (&lt;code>closedVolume&lt;/code> on) recognises this BC, but forces the net
volume flux through the patch to &lt;strong>zero&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>The &lt;code>U&lt;/code> jump residual is evaluated on this BC if the side-A &lt;code>U&lt;/code> patch is not
jump-derived (as in the intended setup):
$\lVert\mathbf{U}_\text{own} - \mathcal{I}(\mathbf{U}_\text{nbr}) - \text{valueJump}\rVert_2$,
normalised as in &lt;code>genericRegionCoupledJump&lt;/code>.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledMassTransferVelocityValue&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interfaceType&lt;/code>&lt;/td>
&lt;td>List of interface type names. Must contain &lt;code>capillaryInterface&lt;/code> and &lt;code>massTransferInterface&lt;/code>; the first entry is the one this BC &lt;code>update()&lt;/code>s&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Initial patch value. Read if present. If missing, the patch values are not initialised&lt;/td>
&lt;td>in practice yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Read, but ignored: the BC always uses &lt;code>mu&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read by the coupling manager, not used by this BC&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>jumpCoefficient&lt;/code>&lt;/td>
&lt;td>Read by the base class, not used, not written back&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>Acceleration model: &lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code>, &lt;code>IQNILS&lt;/code>. A warning is printed if missing&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>(Initial) relaxation factor&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingReuse&lt;/code>&lt;/td>
&lt;td>&lt;code>IQNILS&lt;/code> only&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction in &lt;code>snGrad()&lt;/code> / matrix coefficients&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order face-normal gradient&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>rho&lt;/code> (and &lt;code>mu&lt;/code>) must be present in &lt;code>transportProperties&lt;/code> of both regions.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>No tutorial uses this BC. The entry below follows &lt;code>massTransferInterface&lt;/code>
and has not been run. Side B (second in &lt;code>coupledPatchPair&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">// 0/fluidB/U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledMassTransferVelocityValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Partner on side A:&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">// 0/fluidA/U
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledMassTransferVelocityFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&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>regionInterfaceProperties&lt;/code> (excerpt):&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">fluidAfluidB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> coupledPatchPair
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (fluidA interface)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (fluidB interfaceShadow)
&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"> coupledFields
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pUPimple
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> T
&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"> capillaryInterfaceCoeffs { sigma sigma [1 0 -2 0 0 0 0] 0.07232; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> massTransferInterfaceCoeffs { hlv hlv [0 2 -2 0 0 0 0] 2.257e6; TSat TSat [0 0 0 1 0 0 0] 373.15; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The full case setup, including the &lt;code>T&lt;/code> coupling that drives $\dot m$, is in
&lt;code>massTransferInterface&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Untested, no tutorial.&lt;/strong> The interface-tracking region type it was
written for (&lt;code>interTrackFluid&lt;/code>) is disabled in
&lt;code>src/multiRegionSystem/Make/files&lt;/code>.&lt;/li>
&lt;li>&lt;strong>$\dot m$ is only updated through another BC.&lt;/strong> See
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledmasstransfervelocityvalue/#implementation">Implementation&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Must sit on side B&lt;/strong> (&lt;em>inferred&lt;/em>). &lt;code>mDotS()&lt;/code> lives on the side-A &lt;code>faMesh&lt;/code>
and is interpolated &amp;ldquo;from the neighbour&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>Neighbour must be flux-derived.&lt;/strong> The neighbour &lt;code>U&lt;/code> patch field is
&lt;code>refCast&lt;/code> to &lt;code>genericRegionCoupledFlux&amp;lt;vector&amp;gt;&lt;/code> (for a log line only); any
other type aborts.&lt;/li>
&lt;li>&lt;strong>Closed-volume correction ignores phase change.&lt;/strong> With &lt;code>closedVolume&lt;/code> on,
the global &lt;code>correctClosedVolumePhi()&lt;/code> forces zero net volume flux through
this patch, which contradicts a non-zero $\dot m$ (&lt;em>inferred&lt;/em>).&lt;/li>
&lt;li>&lt;strong>No normal mesh-velocity term.&lt;/strong> The normal velocity is not tied to the
mesh motion as in &lt;code>regionCoupledVelocityValue&lt;/code> (&lt;em>inferred from the
commented-out code; intent unclear&lt;/em>).&lt;/li>
&lt;li>&lt;strong>Log output on every call&lt;/strong>; &lt;code>diffusivity&lt;/code> and &lt;code>neighbourFieldName&lt;/code> are
ignored.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>—&lt;/td>
&lt;td>No tutorial uses &lt;code>regionCoupledMassTransferVelocityValue&lt;/code>.&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;/ul></description></item><item><title>Docs: regionCoupledPressureFlux</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledpressureflux/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledpressureflux/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledPressureFlux&lt;/code> is the Neumann (flux) half of the partitioned
pressure coupling across a sharp, mesh-tracked fluid-fluid interface. It acts
on a &lt;code>volScalarField&lt;/code> (&lt;code>p&lt;/code> or &lt;code>pKin&lt;/code>) and derives from
&lt;code>genericRegionCoupledFlux&amp;lt;scalar&amp;gt;&lt;/code>, i.e. from &lt;code>fixedGradient&lt;/code>. Although it is
built on the generic flux-matching scheme, its &lt;code>fluxJump()&lt;/code> cancels the
neighbour flux. The normal pressure gradient therefore depends only on the
local normal acceleration $\mathbf{n}\cdot\partial\mathbf{U}/\partial t$. The
partner condition on the other side is &lt;code>regionCoupledPressureValue&lt;/code> (or
&lt;code>regionCoupledMassTransferPressureValue&lt;/code>, &lt;em>inferred&lt;/em>: there is no mass-transfer
pressure-flux BC). It is used with &lt;code>capillaryInterface&lt;/code>.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>The BC sits on side $B$ in all tutorials. $\mathbf{n}_B$ is the outward patch
normal and $\tilde F = \mathcal{I}_{A\to B}(F_A)$ the interpolated neighbour
flux &lt;code>snGrad(p_A)*k_A&lt;/code>. The generic flux BC sets
$k_B\,\partial p_B/\partial n = -\tilde F + \text{fluxJump}$ with&lt;/p>
$$
\text{fluxJump} = \tilde F - \mathbf{n}_B\cdot\left(\frac{\partial\mathbf{U}_B}{\partial t}\right)_b
$$
&lt;p>so that&lt;/p>
$$
k_B\,\frac{\partial p_B}{\partial n} = -\,\mathbf{n}_B\cdot\left(\frac{\partial\mathbf{U}_B}{\partial t}\right)_b
\quad \text{on } \Gamma_B
$$
&lt;p>This is the normal momentum balance at the interface without the convective
and viscous terms (the code that included them is commented out). The
gradient is relaxed by the acceleration model,
$g^{k} = g^{k-1} + \omega\,(g^{*} - g^{k-1})$, and the patch value is
reconstructed as $p_B = p_P + \mathbf{k}\cdot\nabla p_P + g/\Delta_f$
(first order) or $p_P + \mathbf{k}\cdot\nabla p_P + (g + \mathbf{n}\cdot\nabla p_P)/(2\Delta_f)$
(&lt;code>secondOrder yes&lt;/code>); the $\mathbf{k}$ term only with &lt;code>nonOrthCorr yes&lt;/code>.&lt;/p>
&lt;p>The diffusivity $k_B$ comes from &lt;code>diffCoeff()&lt;/code> with the hardcoded name &lt;code>v&lt;/code>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field name&lt;/th>
&lt;th>Intended $k_B$&lt;/th>
&lt;th>Actual $k_B$&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>pKin&lt;/code>&lt;/td>
&lt;td>$1$&lt;/td>
&lt;td>$1$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>any other (e.g. &lt;code>p&lt;/code>)&lt;/td>
&lt;td>$1/\rho_B$&lt;/td>
&lt;td>$\rho_B$ (registered &lt;code>volScalarField rho&lt;/code>, else &lt;code>rho&lt;/code> from &lt;code>transportProperties&lt;/code>)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For &lt;code>p&lt;/code> the imposed gradient is therefore
$-\mathbf{n}_B\cdot\partial_t\mathbf{U}_B/\rho_B$ instead of
$-\rho_B\,\mathbf{n}_B\cdot\partial_t\mathbf{U}_B$ (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledpressureflux/#known-limitations">Known Limitations&lt;/a>).&lt;/p>
&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>$p$&lt;/td>
&lt;td>Pressure (&lt;code>p&lt;/code>) or kinematic pressure (&lt;code>pKin&lt;/code>)&lt;/td>
&lt;td>Pa or m²/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$(\partial\mathbf{U}/\partial t)_b$&lt;/td>
&lt;td>Patch value of &lt;code>fvc::ddt(U)&lt;/code> in the local region&lt;/td>
&lt;td>m/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$k_B$&lt;/td>
&lt;td>Diffusivity from &lt;code>diffCoeff()&lt;/code>&lt;/td>
&lt;td>see table&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\Delta_f$&lt;/td>
&lt;td>Patch &lt;code>deltaCoeffs&lt;/code>&lt;/td>
&lt;td>1/m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;code>updateCoeffs()&lt;/code> is the generic one of &lt;code>genericRegionCoupledFlux&lt;/code>:&lt;/p>
&lt;ol>
&lt;li>Return if updated or &lt;code>coupled no&lt;/code> (gradient frozen).&lt;/li>
&lt;li>Call &lt;code>update()&lt;/code> on the first &lt;code>interfaceType&lt;/code>.&lt;/li>
&lt;li>Look up the neighbour field by the local field name and &lt;code>refCast&lt;/code> its
patch field to &lt;code>genericRegionCoupledJump&amp;lt;scalar&amp;gt;&lt;/code>; interpolate its
&lt;code>flux()&lt;/code> and negate it.&lt;/li>
&lt;li>Add &lt;code>fluxJump()&lt;/code>, divide by &lt;code>diffCoeff()&lt;/code>, relax, call
&lt;code>fixedGradient::updateCoeffs()&lt;/code>.&lt;/li>
&lt;/ol>
&lt;p>&lt;code>fluxJump()&lt;/code> repeats step 3 to get $\tilde F$ and returns
$\tilde F - \mathbf{n}_B\cdot(\partial_t\mathbf{U})_b$. It also reads &lt;code>rho&lt;/code> and
&lt;code>mu&lt;/code> from the local &lt;code>transportProperties&lt;/code> (required to exist), but does not
use them. Unlike the other capillary BCs it never calls &lt;code>capInterface()&lt;/code>, so
it does not check the interface type.&lt;/p>
&lt;p>The &lt;code>p&lt;/code> flux residual of the &lt;code>pUPimple&lt;/code> DNA loop comes from this BC, because
the side-A pressure patch carries a jump BC. The neighbour flux cancels in it
as well:&lt;/p>
$$
r_\text{raw} = \left| k_B\,\partial_n p_B + \mathbf{n}_B\cdot(\partial_t\mathbf{U}_B)_b \right|
$$
&lt;p>normalised as described in &lt;code>genericRegionCoupledFlux&lt;/code>.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledPressureFlux&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interfaceType&lt;/code>&lt;/td>
&lt;td>List of interface type names; the first entry is updated by this BC. Tutorials use &lt;code>(capillaryInterface)&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradient&lt;/code>&lt;/td>
&lt;td>Initial patch-normal gradient. Read if present; otherwise zero gradient and the patch value is set from the internal field&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Not read (&lt;code>fixedGradient&lt;/code> ignores it). Written by &lt;code>write()&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Read, but ignored: the BC always uses &lt;code>v&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read by the coupling manager, not used by this BC&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>Acceleration model for the gradient: &lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code>, &lt;code>IQNILS&lt;/code>. A warning is printed if missing&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>(Initial) relaxation factor&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingReuse&lt;/code>&lt;/td>
&lt;td>&lt;code>IQNILS&lt;/code> only&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction in &lt;code>evaluate()&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order reconstruction of the patch value&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>write()&lt;/code> does not write &lt;code>gradient&lt;/code>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>&lt;code>tutorials/multiphaseFlow/2dRisingBubble/0/fluidB/orig/partitioned/p&lt;/code>
(side B):&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">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledPressureFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;v&amp;#34;; // ignored, always v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 0; // not read
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Partner on side A, &lt;code>0/fluidA/orig/partitioned/p&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">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledPressureValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The interface and DNA entries are shown on the &lt;code>regionCoupledVelocityValue&lt;/code>
page and in &lt;code>capillaryInterface&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Wrong diffusivity for &lt;code>p&lt;/code> (bug).&lt;/strong> &lt;code>diffCoeff()&lt;/code> renames &lt;code>v&lt;/code> to &lt;code>rho&lt;/code>
before it checks for &lt;code>v&lt;/code>, so the reciprocal is never taken and
$k_B = \rho_B$. For a field named &lt;code>p&lt;/code> the imposed gradient is off by a
factor $\rho_B^2$ and has the wrong units. &lt;code>pKin&lt;/code> is not affected. The
tutorials use &lt;code>p&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Simplified normal momentum balance.&lt;/strong> Convective and viscous
contributions to the normal pressure gradient are not included.&lt;/li>
&lt;li>&lt;strong>Neighbour flux has no effect.&lt;/strong> The interpolated neighbour flux cancels.
It is still computed, and the neighbour patch field must derive from
&lt;code>genericRegionCoupledJump&amp;lt;scalar&amp;gt;&lt;/code>, otherwise the &lt;code>refCast&lt;/code> aborts.&lt;/li>
&lt;li>&lt;strong>No interface-type check.&lt;/strong> Any interface type listed first is accepted;
it is only &lt;code>update()&lt;/code>d.&lt;/li>
&lt;li>&lt;strong>&lt;code>diffusivity&lt;/code> and &lt;code>neighbourFieldName&lt;/code> are ignored&lt;/strong>; &lt;code>gradient&lt;/code> is not
written to the time directories.&lt;/li>
&lt;li>&lt;strong>No runnable tutorial.&lt;/strong> The tutorials use the disabled &lt;code>interTrackFluid&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/2dRisingBubble&lt;/code>&lt;/td>
&lt;td>2D rising gas bubble, &lt;code>interTrackFluid&lt;/code> + &lt;code>interTrackFluid&lt;/code> (region type currently disabled)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dDuineveldRisingBubble&lt;/code>&lt;/td>
&lt;td>3D rising bubble (Duineveld), same setup&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dOscillatingBubble&lt;/code>&lt;/td>
&lt;td>3D oscillating bubble, same setup&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The BC is set in the &lt;code>0/fluidB/orig/partitioned/p&lt;/code> variant of each tutorial.&lt;/p>
&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;/ul></description></item><item><title>Docs: regionCoupledPressureValue</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledpressurevalue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledpressurevalue/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledPressureValue&lt;/code> is the Dirichlet (jump) half of the partitioned
pressure coupling across a sharp, mesh-tracked fluid-fluid interface. It acts
on a &lt;code>volScalarField&lt;/code> (&lt;code>p&lt;/code>, or the kinematic pressure &lt;code>pKin&lt;/code>) and derives from
&lt;code>genericRegionCoupledJump&amp;lt;scalar&amp;gt;&lt;/code>, i.e. from &lt;code>fixedValue&lt;/code>. The patch value is
the interpolated neighbour pressure plus the normal-stress jump: capillary
pressure $\sigma\kappa$, the viscous normal-stress jump and a hydrostatic
correction. The partner condition on the other side is
&lt;code>regionCoupledPressureFlux&lt;/code>. Both belong to &lt;code>capillaryInterface&lt;/code>, and this BC
aborts if the first entry of its &lt;code>interfaceType&lt;/code> list is not
&lt;code>capillaryInterface&lt;/code>. The variant with phase change is
&lt;code>regionCoupledMassTransferPressureValue&lt;/code>.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>Region $A$ is the first entry of &lt;code>coupledPatchPair&lt;/code> and carries the &lt;code>faMesh&lt;/code>
of the &lt;code>capillaryInterface&lt;/code>. This BC sits on side $A$ (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledpressurevalue/#known-limitations">Known Limitations&lt;/a>). $\mathcal{I}_{B\to A}$ is the
patch-to-patch interpolation.&lt;/p>
&lt;p>For a field named &lt;code>p&lt;/code>:&lt;/p>
$$
p_A^{*} = \mathcal{I}_{B\to A}(p_B) + 2(\mu_B - \mu_A)\,\nabla_s\cdot\mathbf{u}_s - \sigma\kappa + (\rho_B - \rho_A)\,(\mathbf{x}_f - \mathbf{x}_\text{ref})\cdot\mathbf{g}
\quad \text{on } \Gamma_A
$$
&lt;p>For a field named &lt;code>pKin&lt;/code> the same jump is applied in kinematic form:&lt;/p>
$$
p_{\text{kin},A}^{*} = \frac{1}{\rho_A}\Big[\rho_B\,\mathcal{I}_{B\to A}(p_{\text{kin},B}) + 2(\mu_B - \mu_A)\,\nabla_s\cdot\mathbf{u}_s - \sigma\kappa + (\rho_B - \rho_A)\,(\mathbf{x}_f - \mathbf{x}_\text{ref})\cdot\mathbf{g}\Big]
$$
&lt;p>The viscous term is the jump of $2\mu\,\partial u_n/\partial n$ with
$\partial u_n/\partial n = -\nabla_s\cdot\mathbf{u}_s$. The gravity term implies
that &lt;code>p&lt;/code> excludes the hydrostatic part
$\rho\,\mathbf{g}\cdot(\mathbf{x}-\mathbf{x}_\text{ref})$ (&lt;em>inferred from the
formula&lt;/em>). The value is then relaxed:
$p_A^{k} = p_A^{k-1} + \omega\,(p_A^{*} - p_A^{k-1})$.&lt;/p>
&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>$p$, $p_\text{kin}$&lt;/td>
&lt;td>Pressure / kinematic pressure&lt;/td>
&lt;td>Pa / m²/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{u}_s$&lt;/td>
&lt;td>Surface velocity on the &lt;code>faMesh&lt;/code> (&lt;code>Us()&lt;/code>)&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\sigma$&lt;/td>
&lt;td>Surface tension (&lt;code>sigma()&lt;/code> of the &lt;code>capillaryInterface&lt;/code>)&lt;/td>
&lt;td>N/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa$&lt;/td>
&lt;td>Face curvature, &lt;code>faMesh::faceCurvatures()&lt;/code>&lt;/td>
&lt;td>1/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mu_A$, $\mu_B$&lt;/td>
&lt;td>&lt;code>mu&lt;/code> from each region&amp;rsquo;s &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>Pa·s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\rho_A$, $\rho_B$&lt;/td>
&lt;td>&lt;code>rho&lt;/code> from each region&amp;rsquo;s &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{g}$&lt;/td>
&lt;td>&lt;code>uniformDimensionedVectorField g&lt;/code> of region A&lt;/td>
&lt;td>m/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{x}_f$&lt;/td>
&lt;td>Patch face centres&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{x}_\text{ref}$&lt;/td>
&lt;td>&lt;code>PISO.pRefPoint&lt;/code> from region A&amp;rsquo;s &lt;code>fvSolution&lt;/code>&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;code>updateCoeffs()&lt;/code> is the generic one of &lt;code>genericRegionCoupledJump&lt;/code>: return if
updated or &lt;code>coupled no&lt;/code>; call &lt;code>update()&lt;/code> on the first &lt;code>interfaceType&lt;/code>
(curvature and $\mathbf{u}_s$); interpolate the neighbour field (looked up by
the local field name) onto this patch; add &lt;code>valueJump()&lt;/code>; relax; call
&lt;code>fixedValue::updateCoeffs()&lt;/code>.&lt;/p>
&lt;p>&lt;code>valueJump()&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>takes $\sigma$, $\kappa$ and $\mathbf{u}_s$ from the &lt;code>capillaryInterface&lt;/code>
and computes $\nabla_s\cdot\mathbf{u}_s$ with &lt;code>fac::div&lt;/code>;&lt;/li>
&lt;li>reads &lt;code>pRefPoint&lt;/code> from the &lt;code>PISO&lt;/code> sub-dictionary of region A&amp;rsquo;s
&lt;code>fvSolution&lt;/code> and looks up &lt;code>g&lt;/code> in region A (both required);&lt;/li>
&lt;li>reads &lt;code>mu&lt;/code> and &lt;code>rho&lt;/code> of both regions from their registered
&lt;code>transportProperties&lt;/code> dictionaries;&lt;/li>
&lt;li>for &lt;code>pKin&lt;/code> returns the bracket above divided by $\rho_A$, minus the
interpolated neighbour value, so that the base class sum gives the
kinematic formula.&lt;/li>
&lt;/ul>
&lt;p>It also computes the mesh flux and the patch normals, but does not use them.&lt;/p>
&lt;p>The jump residual for &lt;code>p&lt;/code> in the &lt;code>pUPimple&lt;/code> DNA loop is taken from this BC,
because side A is checked first:
$\lVert p_A - \mathcal{I}_{B\to A}(p_B) - \text{valueJump}\rVert_2$, normalised as
described in &lt;code>genericRegionCoupledJump&lt;/code>.&lt;/p>
&lt;p>&lt;code>flux()&lt;/code> (inherited) returns &lt;code>snGrad()*k&lt;/code> with $k$ from &lt;code>diffCoeff()&lt;/code> and the
hardcoded diffusivity name &lt;code>v&lt;/code>. &lt;code>diffCoeff()&lt;/code> maps &lt;code>v&lt;/code> to &lt;code>rho&lt;/code>, but the step
that should take the reciprocal is never reached, so $k = \rho_A$ instead of
$1/\rho_A$ ($k = 1$ for &lt;code>pKin&lt;/code>). The partner &lt;code>regionCoupledPressureFlux&lt;/code>
cancels this flux, so the error does not reach the solution.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledPressureValue&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interfaceType&lt;/code>&lt;/td>
&lt;td>List of interface type names. The first entry must be &lt;code>capillaryInterface&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Initial patch value. Read if present. If missing, the patch values are not initialised&lt;/td>
&lt;td>in practice yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Read, but ignored: the BC always uses &lt;code>v&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read by the coupling manager, not used by this BC&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>jumpCoefficient&lt;/code>&lt;/td>
&lt;td>Read by the base class, not used, not written back&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>Acceleration model: &lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code>, &lt;code>IQNILS&lt;/code>. A warning is printed if missing&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>(Initial) relaxation factor&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingReuse&lt;/code>&lt;/td>
&lt;td>&lt;code>IQNILS&lt;/code> only&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction in &lt;code>snGrad()&lt;/code> / matrix coefficients&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order face-normal gradient&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Entries read from other files:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Entry&lt;/th>
&lt;th>File&lt;/th>
&lt;th>Required&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>PISO { pRefPoint (x y z); }&lt;/code>&lt;/td>
&lt;td>&lt;code>system/&amp;lt;regionA&amp;gt;/fvSolution&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>g&lt;/code>&lt;/td>
&lt;td>&lt;code>constant/&amp;lt;regionA&amp;gt;/g&lt;/code> (registered &lt;code>uniformDimensionedVectorField&lt;/code>)&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mu&lt;/code>, &lt;code>rho&lt;/code>&lt;/td>
&lt;td>&lt;code>constant/&amp;lt;region&amp;gt;/transportProperties&lt;/code>, both regions&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>&lt;code>tutorials/multiphaseFlow/2dRisingBubble/0/fluidA/orig/partitioned/p&lt;/code>
(side A):&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">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledPressureValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;v&amp;#34;; // ignored, always v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Partner on side B, &lt;code>0/fluidB/orig/partitioned/p&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">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledPressureFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;v&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 0;
&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>system/fluidA/fvSolution&lt;/code> must contain &lt;code>PISO { ... pRefPoint (0 0 0); }&lt;/code>.
The interface and DNA entries are shown on the &lt;code>regionCoupledVelocityValue&lt;/code>
page and in &lt;code>capillaryInterface&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;code>capillaryInterface&lt;/code> only.&lt;/strong> &lt;code>capInterface()&lt;/code> aborts unless the first
&lt;code>interfaceType&lt;/code> entry is &lt;code>capillaryInterface&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Must sit on side A&lt;/strong> (&lt;em>inferred&lt;/em>). $\sigma$, $\kappa$ and
$\nabla_s\cdot\mathbf{u}_s$ are taken from the side-A &lt;code>faMesh&lt;/code> index by
index, without interpolation.&lt;/li>
&lt;li>&lt;strong>Constant properties.&lt;/strong> $\mu$ and $\rho$ are single scalars from
&lt;code>transportProperties&lt;/code>; registered &lt;code>mu&lt;/code> or &lt;code>rho&lt;/code> fields are not used.&lt;/li>
&lt;li>&lt;strong>&lt;code>PISO.pRefPoint&lt;/code> is required&lt;/strong>, even if the region solver uses a
&lt;code>PIMPLE&lt;/code> dictionary.&lt;/li>
&lt;li>&lt;strong>&lt;code>diffCoeff()&lt;/code> returns $\rho$ instead of $1/\rho$&lt;/strong> for the diffusivity
&lt;code>v&lt;/code>. Without consequence for this BC (see &lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledpressurevalue/#implementation">Implementation&lt;/a>).&lt;/li>
&lt;li>&lt;strong>&lt;code>diffusivity&lt;/code> and &lt;code>neighbourFieldName&lt;/code> are ignored.&lt;/strong>&lt;/li>
&lt;li>&lt;strong>The header example omits &lt;code>interfaceType&lt;/code>&lt;/strong>, which is required.&lt;/li>
&lt;li>&lt;strong>No runnable tutorial.&lt;/strong> The tutorials use the disabled &lt;code>interTrackFluid&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/2dRisingBubble&lt;/code>&lt;/td>
&lt;td>2D rising gas bubble, &lt;code>interTrackFluid&lt;/code> + &lt;code>interTrackFluid&lt;/code> (region type currently disabled)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dDuineveldRisingBubble&lt;/code>&lt;/td>
&lt;td>3D rising bubble (Duineveld), same setup&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dOscillatingBubble&lt;/code>&lt;/td>
&lt;td>3D oscillating bubble, same setup&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The BC is set in the &lt;code>0/fluidA/orig/partitioned/p&lt;/code> variant of each tutorial.&lt;/p>
&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;/ul></description></item><item><title>Docs: regionCoupledVelocityFlux</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledvelocityflux/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledvelocityflux/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledVelocityFlux&lt;/code> is the Neumann (flux) half of the partitioned
velocity coupling across a sharp, mesh-tracked fluid-fluid interface. It acts
on a &lt;code>volVectorField&lt;/code> (the velocity &lt;code>U&lt;/code>) and derives from
&lt;code>genericRegionCoupledFlux&amp;lt;vector&amp;gt;&lt;/code>, i.e. from &lt;code>fixedGradient&lt;/code>. It sets the
normal velocity gradient so that the tangential viscous stress balances the
neighbour stress plus the tangential surface-tension force. The normal
component of the gradient follows from surface continuity. The partner
condition on the other side is &lt;code>regionCoupledVelocityValue&lt;/code>. Both belong to
&lt;code>capillaryInterface&lt;/code>, and this BC aborts if the first entry of its
&lt;code>interfaceType&lt;/code> list is not &lt;code>capillaryInterface&lt;/code>.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>Region $A$ is the first entry of &lt;code>coupledPatchPair&lt;/code> and carries the
finite-area mesh (&lt;code>faMesh&lt;/code>) of the &lt;code>capillaryInterface&lt;/code>. This BC sits on side
$A$ (see &lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledvelocityflux/#known-limitations">Known Limitations&lt;/a>). $\mathbf{n}$ is the
&lt;code>faMesh&lt;/code> face normal (&lt;code>faceAreaNormals()&lt;/code>), $\mathcal{I}_{B\to A}$ the
patch-to-patch interpolation, and $\mathbf{F}_B$ the flux computed by
&lt;code>regionCoupledVelocityValue&lt;/code> on side B
($\mu_B$ times the tangential part of $\partial\mathbf{U}_B/\partial n_B$).
With $\tilde{\mathbf{F}} = \mathcal{I}_{B\to A}(\mathbf{F}_B)$, the gradient is&lt;/p>
$$
\mu_A \frac{\partial \mathbf{U}_A}{\partial n} =
-\tilde{\mathbf{F}} + \mathbf{n}(\mathbf{n}\cdot\tilde{\mathbf{F}}) + \mathbf{f}_{\sigma,t} - \mu_A\,\mathbf{n}\,(\nabla_s\cdot\mathbf{u}_s) + (\mu_B - \mu_A)\,(\nabla_s\mathbf{u}_s)\cdot\mathbf{n}
\quad \text{on } \Gamma_A
$$
&lt;p>The first two terms are $-(\mathbf{I}-\mathbf{n}\mathbf{n})\cdot\tilde{\mathbf{F}}$.
The tangential surface-tension force is&lt;/p>
$$
\mathbf{f}_{\sigma,t} = \sigma\,\frac{1}{S_f}\sum_{e} \mathbf{L}_e\,c_e \;-\; \sigma\kappa\,\mathbf{n}
$$
&lt;p>The normal term $-\mu_A\mathbf{n}\,\nabla_s\cdot\mathbf{u}_s$ uses
$\partial u_n/\partial n = -\nabla_s\cdot\mathbf{u}_s$ (incompressibility at
the surface). The gradient is relaxed by the acceleration model:
$g^{k} = g^{k-1} + \omega\,(g^{*} - g^{k-1})$.&lt;/p>
&lt;p>The patch value is reconstructed from the gradient in &lt;code>evaluate()&lt;/code>:&lt;/p>
$$
\mathbf{U}_A = \mathbf{U}_P + \mathbf{k}\cdot\nabla\mathbf{U}_P + \frac{1}{\Delta_f}\,\frac{\partial \mathbf{U}_A}{\partial n}
\qquad\text{or}\qquad
\mathbf{U}_A = \mathbf{U}_P + \mathbf{k}\cdot\nabla\mathbf{U}_P + \frac{1}{2\Delta_f}\left(\frac{\partial \mathbf{U}_A}{\partial n} + \mathbf{n}\cdot\nabla\mathbf{U}_P\right)
$$
&lt;p>(first order / &lt;code>secondOrder yes&lt;/code>; the $\mathbf{k}$ term only with &lt;code>nonOrthCorr yes&lt;/code>).&lt;/p>
&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>$\mathbf{U}$&lt;/td>
&lt;td>Velocity&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{u}_s$&lt;/td>
&lt;td>Surface velocity on the &lt;code>faMesh&lt;/code> (&lt;code>Us()&lt;/code>)&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\sigma$&lt;/td>
&lt;td>Surface tension (&lt;code>sigma()&lt;/code> of the &lt;code>capillaryInterface&lt;/code>)&lt;/td>
&lt;td>N/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa$&lt;/td>
&lt;td>Face curvature, &lt;code>faMesh::faceCurvatures()&lt;/code>&lt;/td>
&lt;td>1/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{L}_e$, $c_e$&lt;/td>
&lt;td>Edge length vectors and &lt;code>edgeLengthCorrection()&lt;/code> of the &lt;code>faMesh&lt;/code>&lt;/td>
&lt;td>m, –&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mu_A$, $\mu_B$&lt;/td>
&lt;td>&lt;code>mu&lt;/code> from each region&amp;rsquo;s &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>Pa·s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\Delta_f$&lt;/td>
&lt;td>Patch &lt;code>deltaCoeffs&lt;/code>&lt;/td>
&lt;td>1/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{k}$&lt;/td>
&lt;td>Non-orthogonal part of the face-to-cell vector&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;code>updateCoeffs()&lt;/code> is the generic one of &lt;code>genericRegionCoupledFlux&lt;/code>:&lt;/p>
&lt;ol>
&lt;li>Return if already updated or if the interface has &lt;code>coupled no&lt;/code> (the
gradient is then frozen).&lt;/li>
&lt;li>Call &lt;code>update()&lt;/code> on the first &lt;code>interfaceType&lt;/code> (refreshes curvature and
$\mathbf{u}_s$ of the &lt;code>capillaryInterface&lt;/code>).&lt;/li>
&lt;li>Look up the neighbour &lt;code>U&lt;/code> by the local field name and &lt;code>refCast&lt;/code> its patch
field to &lt;code>genericRegionCoupledJump&amp;lt;vector&amp;gt;&lt;/code>. Its &lt;code>flux()&lt;/code> is interpolated
onto this patch and negated.&lt;/li>
&lt;li>Add &lt;code>fluxJump()&lt;/code> and divide by &lt;code>k = diffCoeff()&lt;/code>. &lt;code>diffCoeff()&lt;/code> uses the
hardcoded name &lt;code>mu&lt;/code>: the patch values of a registered &lt;code>volScalarField mu&lt;/code>,
otherwise the scalar &lt;code>mu&lt;/code> from &lt;code>transportProperties&lt;/code>.&lt;/li>
&lt;li>Relax the gradient with the acceleration model and call
&lt;code>fixedGradient::updateCoeffs()&lt;/code>.&lt;/li>
&lt;/ol>
&lt;p>&lt;code>fluxJump()&lt;/code> computes $\nabla_s\cdot\mathbf{u}_s$ (&lt;code>fac::div&lt;/code>),
$\nabla_s\mathbf{u}_s$ (&lt;code>fac::grad&lt;/code>) and the edge-integrated surface-tension
force on the &lt;code>faMesh&lt;/code>. $\mu_A$ and $\mu_B$ are always read from the
&lt;code>transportProperties&lt;/code> dictionaries, not from fields. If a region has a
&lt;code>pKin&lt;/code> field, its &lt;code>mu&lt;/code> must equal &lt;code>rho*nu&lt;/code> from the same dictionary
(exact floating-point comparison), otherwise the run stops with a fatal
error. Each call prints &lt;code>Us &amp;lt;value&amp;gt;&lt;/code> (the volume swept by $\mathbf{u}_s$ in
one time step) to the log.&lt;/p>
&lt;p>&lt;code>evaluate()&lt;/code> uses the registered &lt;code>grad(U)&lt;/code> if it exists, otherwise
&lt;code>fvc::grad(U)&lt;/code>.&lt;/p>
&lt;p>The &lt;code>U&lt;/code> flux residual of the &lt;code>pUPimple&lt;/code> DNA loop is taken from this BC
(side A is checked first):&lt;/p>
$$
r = \frac{\lVert \mu_A\,\partial_n\mathbf{U}_A + \tilde{\mathbf{F}} - \text{fluxJump}\rVert_2}
{\max\left(\min\left(\lVert\mu_A\,\partial_n\mathbf{U}_A\rVert_2,\ \lVert -\tilde{\mathbf{F}}+\text{fluxJump}\rVert_2\right),\ \text{SMALL}\right)}
$$
&lt;p>with $\partial_n\mathbf{U}_A$ from &lt;code>snGrad()&lt;/code> of the patch.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledVelocityFlux&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interfaceType&lt;/code>&lt;/td>
&lt;td>List of interface type names. The first entry must be &lt;code>capillaryInterface&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradient&lt;/code>&lt;/td>
&lt;td>Initial patch-normal gradient. Read if present; otherwise zero gradient and the patch value is set from the internal field&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Not read (&lt;code>fixedGradient&lt;/code> ignores it). Written by &lt;code>write()&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Read, but ignored: the BC always uses &lt;code>mu&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read by the coupling manager, not used by this BC&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>Acceleration model for the gradient: &lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code>, &lt;code>IQNILS&lt;/code>. A warning is printed if missing&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>(Initial) relaxation factor&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingReuse&lt;/code>&lt;/td>
&lt;td>&lt;code>IQNILS&lt;/code> only&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction in &lt;code>evaluate()&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order reconstruction of the patch value&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>write()&lt;/code> does not write &lt;code>gradient&lt;/code>. After a restart or &lt;code>decomposePar&lt;/code> the
gradient therefore starts from zero.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>&lt;code>tutorials/multiphaseFlow/2dRisingBubble/0/fluidA/orig/partitioned/U&lt;/code>
(side A):&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">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledVelocityFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;mu&amp;#34;; // ignored, always mu
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0); // not read
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Partner on side B, &lt;code>0/fluidB/orig/partitioned/U&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">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledVelocityValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>regionInterfaceProperties&lt;/code> and &lt;code>multiRegionProperties&lt;/code> entries are shown
on the &lt;code>regionCoupledVelocityValue&lt;/code> page and in &lt;code>capillaryInterface&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;code>capillaryInterface&lt;/code> only.&lt;/strong> &lt;code>capInterface()&lt;/code> aborts unless the first
&lt;code>interfaceType&lt;/code> entry is &lt;code>capillaryInterface&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Must sit on side A&lt;/strong> (&lt;em>inferred&lt;/em>). The &lt;code>faMesh&lt;/code> normals,
$\mathbf{u}_s$, $\sigma$ and $\kappa$ are used index by index on the patch
without interpolation, which is only valid on the side that owns the
&lt;code>faMesh&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Partner must be jump-derived.&lt;/strong> The neighbour &lt;code>U&lt;/code> patch field is
&lt;code>refCast&lt;/code> to &lt;code>genericRegionCoupledJump&amp;lt;vector&amp;gt;&lt;/code>; any other type aborts.&lt;/li>
&lt;li>&lt;strong>Exact &lt;code>mu == rho*nu&lt;/code> check&lt;/strong> for regions with &lt;code>pKin&lt;/code>. Rounding in the
input values can trigger the fatal error.&lt;/li>
&lt;li>&lt;strong>&lt;code>diffusivity&lt;/code> and &lt;code>neighbourFieldName&lt;/code> are ignored.&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Relaxation history starts from the patch value&lt;/strong> (&lt;em>inferred&lt;/em>). The base
class initialises the acceleration model with the patch values but relaxes
the gradient. With &lt;code>relax 1&lt;/code> (the default, used in all tutorials) this has
no effect.&lt;/li>
&lt;li>&lt;strong>&lt;code>gradient&lt;/code> is not written&lt;/strong> to the time directories.&lt;/li>
&lt;li>&lt;strong>No runnable tutorial.&lt;/strong> The tutorials use the disabled &lt;code>interTrackFluid&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/2dRisingBubble&lt;/code>&lt;/td>
&lt;td>2D rising gas bubble, &lt;code>interTrackFluid&lt;/code> + &lt;code>interTrackFluid&lt;/code> (region type currently disabled)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dDuineveldRisingBubble&lt;/code>&lt;/td>
&lt;td>3D rising bubble (Duineveld), same setup&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dOscillatingBubble&lt;/code>&lt;/td>
&lt;td>3D oscillating bubble, same setup&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The BC is set in the &lt;code>0/fluidA/orig/partitioned/U&lt;/code> variant of each tutorial.&lt;/p>
&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;/ul></description></item><item><title>Docs: regionCoupledVelocityValue</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledvelocityvalue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledvelocityvalue/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledVelocityValue&lt;/code> is the Dirichlet (jump) half of the partitioned
velocity coupling across a sharp, mesh-tracked fluid-fluid interface. It acts
on a &lt;code>volVectorField&lt;/code> (the velocity &lt;code>U&lt;/code>) and derives from
&lt;code>genericRegionCoupledJump&amp;lt;vector&amp;gt;&lt;/code>, i.e. from &lt;code>fixedValue&lt;/code>. The patch value is
the neighbour velocity, interpolated onto this patch, with its normal
component replaced by the normal velocity of the local mesh. The tangential
velocity is therefore continuous. The partner condition on the other side is
&lt;code>regionCoupledVelocityFlux&lt;/code>. Both belong to &lt;code>capillaryInterface&lt;/code>, and this BC
aborts if the first entry of its &lt;code>interfaceType&lt;/code> list is not
&lt;code>capillaryInterface&lt;/code>. The pressure is coupled by &lt;code>regionCoupledPressureValue&lt;/code>
and &lt;code>regionCoupledPressureFlux&lt;/code> in the same &lt;code>pUPimple&lt;/code> DNA loop.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>Region $A$ is the first entry of &lt;code>coupledPatchPair&lt;/code> and carries the
finite-area mesh of the &lt;code>capillaryInterface&lt;/code>. This BC sits on side $B$ (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledvelocityvalue/#known-limitations">Known Limitations&lt;/a>). $\mathcal{I}_{A\to B}$ is the
patch-to-patch interpolation (&lt;code>interfaceTransferMethod&lt;/code>), $\mathbf{n}_B$ the
outward unit normal of the local patch.&lt;/p>
$$
\mathbf{U}_B^{*} = \mathcal{I}_{A\to B}(\mathbf{U}_A) - \mathbf{n}_B\left(\mathbf{n}_B\cdot\mathcal{I}_{A\to B}(\mathbf{u}_s)\right) + \mathbf{n}_B\,\frac{\phi_{\text{mesh},B}}{|\mathbf{S}_f|}
\quad \text{on } \Gamma_B
$$
&lt;p>$\mathbf{U}_B^{*}$ is then passed through the acceleration model:&lt;/p>
$$
\mathbf{U}_B^{k} = \mathbf{U}_B^{k-1} + \omega\left(\mathbf{U}_B^{*} - \mathbf{U}_B^{k-1}\right)
$$
&lt;p>with $\omega$ = &lt;code>relax&lt;/code> (&lt;code>fixed&lt;/code>), the Aitken factor (&lt;code>aitken&lt;/code>), or an IQN-ILS
update (&lt;code>IQNILS&lt;/code>).&lt;/p>
&lt;p>The surface velocity $\mathbf{u}_s$ of the &lt;code>capillaryInterface&lt;/code> is
$\mathbf{U}_A - (\mathbf{U}_A\cdot\mathbf{n}_A)\mathbf{n}_A + w_A\mathbf{n}_A$,
where $w_A$ is the side-A mesh normal velocity. The term
$-\mathbf{n}_B(\mathbf{n}_B\cdot\mathbf{u}_s)$ therefore removes the normal part
of $\mathbf{U}_A$ up to the side-A mesh motion. The last term imposes the side-B
mesh normal velocity.&lt;/p>
&lt;p>The diffusive momentum flux handed to &lt;code>regionCoupledVelocityFlux&lt;/code> is&lt;/p>
$$
\mathbf{F}_B = \mu_B\,(\mathbf{I}-\mathbf{n}_B\mathbf{n}_B)\cdot\frac{\partial\mathbf{U}_B}{\partial n},
\qquad
\frac{\partial\mathbf{U}_B}{\partial n} = \Delta_f\left(\mathbf{U}_B - \mathbf{U}_P - \mathbf{k}\cdot\nabla\mathbf{U}_P\right)
$$
&lt;p>The non-orthogonal term $\mathbf{k}\cdot\nabla\mathbf{U}_P$ is only present with
&lt;code>nonOrthCorr yes&lt;/code>. With &lt;code>secondOrder yes&lt;/code> the gradient is
$2\Delta_f(\mathbf{U}_B - \mathbf{U}_P - \mathbf{k}\cdot\nabla\mathbf{U}_P) - \mathbf{n}_B\cdot\nabla\mathbf{U}_P$.
In both cases the normal component is removed.&lt;/p>
&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>$\mathbf{U}$&lt;/td>
&lt;td>Velocity&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{u}_s$&lt;/td>
&lt;td>Surface velocity of the &lt;code>capillaryInterface&lt;/code> (&lt;code>Us()&lt;/code>, on side A)&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi_{\text{mesh},B}$&lt;/td>
&lt;td>Boundary value of &lt;code>fvc::meshPhi(rho, U)&lt;/code> if a &lt;code>volScalarField rho&lt;/code> is registered in region B, otherwise &lt;code>fvc::meshPhi(U)&lt;/code>&lt;/td>
&lt;td>m³/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{S}_f$&lt;/td>
&lt;td>Face area vector of the local patch&lt;/td>
&lt;td>m²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mu_B$&lt;/td>
&lt;td>Diffusivity &lt;code>mu&lt;/code> of region B (field or &lt;code>transportProperties&lt;/code>)&lt;/td>
&lt;td>Pa·s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\Delta_f$&lt;/td>
&lt;td>Patch &lt;code>deltaCoeffs&lt;/code>&lt;/td>
&lt;td>1/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{k}$&lt;/td>
&lt;td>Non-orthogonal part of the face-to-cell vector, $\mathbf{d}-\mathbf{n}(\mathbf{n}\cdot\mathbf{d})$&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\omega$&lt;/td>
&lt;td>Relaxation factor from the acceleration model&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;code>updateCoeffs()&lt;/code> is the generic one of &lt;code>genericRegionCoupledJump&lt;/code>. Each call:&lt;/p>
&lt;ol>
&lt;li>Returns immediately if the patch is already updated or the interface has
&lt;code>coupled no&lt;/code>. In that case the patch keeps its last value.&lt;/li>
&lt;li>Calls &lt;code>update()&lt;/code> on the interface named first in &lt;code>interfaceType&lt;/code>. For
&lt;code>capillaryInterface&lt;/code> this refreshes the curvature and the surface velocity
$\mathbf{u}_s$ (&lt;code>correct()&lt;/code>).&lt;/li>
&lt;li>Looks up the neighbour field with the &lt;strong>local&lt;/strong> field name (&lt;code>U&lt;/code>),
interpolates its patch values onto this patch and adds &lt;code>valueJump()&lt;/code>.
&lt;code>valueJump()&lt;/code> returns
$-\mathbf{n}_B(\mathbf{n}_B\cdot\mathcal{I}_{A\to B}(\mathbf{u}_s)) + \mathbf{n}_B\,\phi_{\text{mesh},B}/|\mathbf{S}_f|$.&lt;/li>
&lt;li>Assigns the result, relaxes it with the acceleration model and calls
&lt;code>fixedValue::updateCoeffs()&lt;/code>.&lt;/li>
&lt;/ol>
&lt;p>The matrix coefficients come from the vector specialisations in
&lt;code>genericRegionCoupledJump&lt;/code>. &lt;code>gradientInternalCoeffs()&lt;/code> is the &lt;code>fixedValue&lt;/code> one
($-\Delta_f$). &lt;code>gradientBoundaryCoeffs()&lt;/code> subtracts the normal part of the
current face gradient explicitly, using the current cell values. At
convergence only the tangential gradient enters the viscous term of the
momentum equation. &lt;code>snGrad()&lt;/code> drops the normal part in the same way. If a
&lt;code>volTensorField&lt;/code> named &lt;code>grad(U)&lt;/code> is registered, it is used for the
non-orthogonal and second-order terms; otherwise &lt;code>fvc::grad(U)&lt;/code> is computed on
every call.&lt;/p>
&lt;p>&lt;code>flux()&lt;/code> returns &lt;code>snGrad()*k&lt;/code>. &lt;code>k&lt;/code> comes from &lt;code>diffCoeff()&lt;/code> with the hardcoded
diffusivity name &lt;code>mu&lt;/code>: the patch values of a registered &lt;code>volScalarField mu&lt;/code>,
otherwise the scalar &lt;code>mu&lt;/code> from the region&amp;rsquo;s registered &lt;code>transportProperties&lt;/code>
dictionary.&lt;/p>
&lt;p>The DNA loop for &lt;code>pUPimple&lt;/code> (&lt;code>multiRegionSystem::solve()&lt;/code>) runs
&lt;code>solvePIMPLE()&lt;/code> on all regions, in which this BC is evaluated, then
&lt;code>meshMotionCorrector()&lt;/code> and &lt;code>interfaces_-&amp;gt;update()&lt;/code>. The jump residual for &lt;code>U&lt;/code>
is taken from this BC, because the side-A &lt;code>U&lt;/code> patch carries a flux BC:&lt;/p>
$$
r = \frac{\lVert \mathbf{U}_B - \mathcal{I}_{A\to B}(\mathbf{U}_A) - \text{valueJump}\rVert_2}
{\max\left(\min\left(\lVert\mathbf{U}_B\rVert_2,\ \lVert\mathcal{I}_{A\to B}(\mathbf{U}_A)+\text{valueJump}\rVert_2\right),\ \text{SMALL}\right)}
$$
&lt;p>The class also defines &lt;code>updatePhi()&lt;/code>, which would overwrite the boundary
&lt;code>phi&lt;/code> with the negated interpolated neighbour flux. The call in the base class
is commented out, so it is never executed.&lt;/p>
&lt;p>&lt;code>correctClosedVolumePhi()&lt;/code> (used by &lt;code>icoFluid&lt;/code> and &lt;code>interTrackFluid&lt;/code> when
&lt;code>closedVolume&lt;/code> is on in &lt;code>fvSolution&lt;/code>) looks for the patch carrying this BC (or
&lt;code>regionCoupledMassTransferVelocityValue&lt;/code>). It sets &lt;code>phi = U·Sf&lt;/code> there and
removes the net flux, weighted by $|\phi|$, so the net volume flux through the
interface is zero.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledVelocityValue&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interfaceType&lt;/code>&lt;/td>
&lt;td>List of interface type names. The first entry is the interface this BC belongs to and must be &lt;code>capillaryInterface&lt;/code>. The neighbour region and patch are taken from the matching interface entry in &lt;code>regionInterfaceProperties&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Initial patch value. Read if present. If missing, the patch values are not initialised&lt;/td>
&lt;td>in practice yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Read, but ignored: the BC always uses &lt;code>mu&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read by the coupling manager. Not used by this BC, which looks up the neighbour field by the local name&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>jumpCoefficient&lt;/code>&lt;/td>
&lt;td>Read by the base class, not used, not written back&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>Acceleration model: &lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code> or &lt;code>IQNILS&lt;/code>. A warning is printed if missing&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>(Initial) relaxation factor&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingReuse&lt;/code>&lt;/td>
&lt;td>&lt;code>IQNILS&lt;/code> only: number of previous time steps whose coupling data are reused&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction in &lt;code>snGrad()&lt;/code> / matrix coefficients&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order face-normal gradient&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>write()&lt;/code> writes &lt;code>interfaceType&lt;/code>, the resolved &lt;code>neighbourFieldName&lt;/code>,
&lt;code>diffusivity mu&lt;/code>, &lt;code>accType&lt;/code>, &lt;code>relax&lt;/code> (and &lt;code>couplingReuse&lt;/code> for &lt;code>IQNILS&lt;/code>),
&lt;code>nonOrthCorr&lt;/code>, &lt;code>secondOrder&lt;/code> and &lt;code>value&lt;/code>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>&lt;code>tutorials/multiphaseFlow/2dRisingBubble/0/fluidB/orig/partitioned/U&lt;/code>
(side B):&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">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledVelocityValue;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;mu&amp;#34;; // ignored, always mu
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Partner on side A, &lt;code>0/fluidA/orig/partitioned/U&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">interface
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledVelocityFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;mu&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&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>constant/regionInterfaceProperties&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">partitionedCoupledPatches
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> fluidAfluidB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (capillaryInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> coupledPatchPair
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (fluidA interface) // side A: faMesh, VelocityFlux, PressureValue
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (fluidB interfaceShadow) // side B: VelocityValue, PressureFlux
&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"> coupledFields
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pUPimple
&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"> capillaryInterfaceCoeffs
&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 sigma [ 1 0 -2 0 0 0 0 ] 0.07232;
&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">);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>constant/multiRegionProperties&lt;/code> (&lt;code>U&lt;/code> and &lt;code>p&lt;/code> must exist in both regions):&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">DNA
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pUPimple
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxCoupleIter 10;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> residualControl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> U { maxJumpRes 1e-5; maxFluxRes 1e-4; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> p { maxJumpRes 1e-5; maxFluxRes 1e-5; }
&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">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;code>capillaryInterface&lt;/code> only.&lt;/strong> &lt;code>capInterface()&lt;/code> aborts if the first
&lt;code>interfaceType&lt;/code> entry is not &lt;code>capillaryInterface&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Must sit on side B&lt;/strong> (&lt;em>inferred&lt;/em>). $\mathbf{u}_s$ lives on the side-A
finite-area mesh and is interpolated &amp;ldquo;from the neighbour&amp;rdquo;. On side A, the
side-A field would be mapped as if it belonged to side B.&lt;/li>
&lt;li>&lt;strong>&lt;code>diffusivity&lt;/code> is ignored.&lt;/strong> &lt;code>diffusivityName()&lt;/code> is hardcoded to &lt;code>mu&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>neighbourFieldName&lt;/code> has no effect.&lt;/strong> The neighbour velocity is looked up
by the local field name.&lt;/li>
&lt;li>&lt;strong>&lt;code>value&lt;/code> should be given.&lt;/strong> The base class reads it only if present and
does not initialise the patch otherwise.&lt;/li>
&lt;li>&lt;strong>&lt;code>updatePhi()&lt;/code> is dead code&lt;/strong>, so the boundary &lt;code>phi&lt;/code> is not set from the
neighbour by this BC.&lt;/li>
&lt;li>&lt;strong>The header example omits &lt;code>interfaceType&lt;/code>&lt;/strong>, which is required.&lt;/li>
&lt;li>&lt;strong>No runnable tutorial.&lt;/strong> All tutorials that use this BC run on
&lt;code>interTrackFluid&lt;/code>, which is commented out in
&lt;code>src/multiRegionSystem/Make/files&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Partitioned only.&lt;/strong> There is no monolithic variant.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/2dRisingBubble&lt;/code>&lt;/td>
&lt;td>2D rising gas bubble, &lt;code>interTrackFluid&lt;/code> + &lt;code>interTrackFluid&lt;/code> (region type currently disabled)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dDuineveldRisingBubble&lt;/code>&lt;/td>
&lt;td>3D rising bubble (Duineveld), same setup&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/multiphaseFlow/3dOscillatingBubble&lt;/code>&lt;/td>
&lt;td>3D oscillating bubble, same setup&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The BC is set in the &lt;code>0/fluidB/orig/partitioned/U&lt;/code> variant of each tutorial.&lt;/p>
&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;/ul></description></item></channel></rss>