<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>multiPhysicsFoam – Surface-Tension</title><link>https://multiphysicsfoam.com/tags/surface-tension/</link><description>Recent content in Surface-Tension on multiPhysicsFoam</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://multiphysicsfoam.com/tags/surface-tension/index.xml" rel="self" type="application/rss+xml"/><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: 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></channel></rss>