<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>multiPhysicsFoam – Interface-Tracking</title><link>https://multiphysicsfoam.com/tags/interface-tracking/</link><description>Recent content in Interface-Tracking on multiPhysicsFoam</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://multiphysicsfoam.com/tags/interface-tracking/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: fixedGradientCorrected</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedgradientcorrected/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedgradientcorrected/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>fixedGradientCorrected&lt;/code> is a Neumann condition for fields of any type
(scalar, vector, sphericalTensor, symmTensor, tensor). It prescribes the
patch-normal gradient. Its patch value and value coefficients include a
non-orthogonal correction $\mathbf{c}\cdot\nabla\phi_P$, evaluated on a small
sub-mesh around the patch. Unlike &lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/">fixedValueCorrected&lt;/a>,
the correction enters the matrix directly, through &lt;code>valueBoundaryCoeffs&lt;/code>. It
comes from the foam-extend interface-tracking solver (&lt;code>interTrackFoam&lt;/code>,
Tuković). The BC is compiled into &lt;code>libinterfaceTrackingFvMesh&lt;/code>. It derives
from the common base &lt;code>correctedFvPatchField&lt;/code> (type &lt;code>corrected&lt;/code>). The base
class, the sub-mesh machinery, the &lt;code>corrected&lt;/code> type and the porting status
(&lt;code>interTrackFluid&lt;/code> disabled, &lt;code>patchCorrected&lt;/code> snGrad not ported) are
described on the &lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/">fixedValueCorrected&lt;/a> page.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
$$
\left.\frac{\partial\phi}{\partial n}\right|_b = g \quad \text{on } \partial\Omega,
\qquad
\phi_b = \phi_P + \phi_c + \delta\, g
$$
&lt;p>with the correction from the base class&lt;/p>
$$
\mathbf{c} = \boldsymbol{\Delta} - \mathbf{n}\,(\mathbf{n}\cdot\boldsymbol{\Delta}),
\qquad
\phi_c = \mathbf{c}\cdot(\nabla\phi)_P
$$
&lt;p>Matrix coefficients:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Coefficient&lt;/th>
&lt;th>Value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>valueInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$1$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>valueBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$\phi_c + \delta\,g$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$0$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$g$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>snGrad()&lt;/code>&lt;/td>
&lt;td>$g$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&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>$\phi$&lt;/td>
&lt;td>Patch field&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$g$&lt;/td>
&lt;td>Prescribed normal gradient (&lt;code>gradient&lt;/code>)&lt;/td>
&lt;td>field unit/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}$&lt;/td>
&lt;td>Patch unit normal&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\Delta}$&lt;/td>
&lt;td>Patch delta vector (&lt;code>patch().delta()&lt;/code>)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{c}$&lt;/td>
&lt;td>Correction vector&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi_c$&lt;/td>
&lt;td>Stored correction (&lt;code>corrVecGrad&lt;/code>), updated in &lt;code>updateCoeffs()&lt;/code>&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\delta$&lt;/td>
&lt;td>$1/$&lt;code>patch().deltaCoeffs()&lt;/code>&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Note on OpenFOAM.com.&lt;/strong> &lt;code>fvPatch::delta()&lt;/code> is patch-normal for every
non-coupled patch in OpenFOAM.com, so $\mathbf{c} \equiv \mathbf{0}$ and
$\phi_c \equiv 0$. The coefficients reduce to those of stock &lt;code>fixedGradient&lt;/code>.&lt;/p>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Construction:&lt;/strong> the base class reads &lt;code>volFieldName&lt;/code> (required) and the
optional &lt;code>corrVecGrad&lt;/code>. This class then reads &lt;code>gradient&lt;/code> (required). If
&lt;code>value&lt;/code> is given, it is used as the initial patch value. Otherwise
$\phi_P + \delta g + \phi_c$ is used, with $\phi_c = 0$ at that point unless
&lt;code>corrVecGrad&lt;/code> was given. &lt;code>nGradInternal&lt;/code> is set to $g$.&lt;/li>
&lt;li>&lt;strong>&lt;code>updateCoeffs()&lt;/code>&lt;/strong> (base class): recomputes $\mathbf{c}$ if the mesh moves,
rebuilds $\phi_c$ on the patch sub-mesh (gradient scheme
&lt;code>snGradCorr(&amp;lt;volFieldName&amp;gt;)&lt;/code>). It is called whenever an &lt;code>fvMatrix&lt;/code> for the
field is constructed, so &lt;code>valueBoundaryCoeffs&lt;/code> always uses the current
$\phi_c$.&lt;/li>
&lt;li>&lt;strong>&lt;code>evaluate()&lt;/code>:&lt;/strong> the class declares &lt;code>evaluate()&lt;/code> &lt;strong>without&lt;/strong> the
&lt;code>Pstream::commsTypes&lt;/code> argument. It therefore does not override
&lt;code>fvPatchField::evaluate(const Pstream::commsTypes)&lt;/code>, which
&lt;code>correctBoundaryConditions()&lt;/code> calls. In practice the base &lt;code>evaluate&lt;/code> runs,
and that only resets the &lt;code>updated&lt;/code> flag. &lt;strong>The patch value is not
recomputed&lt;/strong> from $\phi_P + \phi_c + \delta g$ after a solve. It keeps its
initial value unless code assigns it explicitly. Only the matrix
coefficients follow the formula above.&lt;/li>
&lt;li>&lt;strong>Mapping:&lt;/strong> &lt;code>autoMap&lt;/code>/&lt;code>rmap&lt;/code> map the value and &lt;code>gradient&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Sub-mesh motion:&lt;/strong> &lt;code>interfaceTrackingFvMesh::update()&lt;/code> moves the
sub-mesh only for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>write()&lt;/code>:&lt;/strong> &lt;code>type&lt;/code>, &lt;code>volFieldName&lt;/code>, &lt;code>corrVecGrad&lt;/code>, &lt;code>gradient&lt;/code>, &lt;code>value&lt;/code>.&lt;/li>
&lt;/ul>
&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>fixedGradientCorrected&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>volFieldName&lt;/code>&lt;/td>
&lt;td>Name of the volume field this patch field belongs to&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>– (no default)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradient&lt;/code>&lt;/td>
&lt;td>Prescribed normal gradient $g$&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&lt;/td>
&lt;td>no&lt;/td>
&lt;td>$\phi_P + \delta g + \phi_c$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>corrVecGrad&lt;/code>&lt;/td>
&lt;td>Initial stored correction $\phi_c$&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The library must be loaded with
&lt;code>libs (&amp;quot;libinterfaceTrackingFvMesh.so&amp;quot;);&lt;/code> in &lt;code>system/controlDict&lt;/code>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&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">outlet
&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 fixedGradientCorrected;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> volFieldName p;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> gradient uniform 0;
&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;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Patch value not updated by &lt;code>correctBoundaryConditions()&lt;/code>&lt;/strong> because the
&lt;code>evaluate()&lt;/code> signature does not match (see Implementation). Explicit
operators that use patch values (&lt;code>fvc::grad&lt;/code>, &lt;code>fvc::interpolate&lt;/code>, face
fluxes) see a stale value.&lt;/li>
&lt;li>&lt;strong>No correction in OpenFOAM.com&lt;/strong> (patch-normal &lt;code>delta()&lt;/code>). The cost of the
sub-mesh gradient remains on every &lt;code>updateCoeffs()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Interface-tracking context not available:&lt;/strong> &lt;code>interTrackFluid&lt;/code> is disabled
and &lt;code>patchCorrected&lt;/code> is not ported (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/#known-limitations">fixedValueCorrected&lt;/a>).&lt;/li>
&lt;li>&lt;strong>&lt;code>volFieldName&lt;/code> has no default&lt;/strong> and must match the field name.&lt;/li>
&lt;li>&lt;strong>Sub-mesh motion only for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>In practice, use the stock &lt;code>fixedGradient&lt;/code> instead.&lt;/p>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;p>No tutorial uses &lt;code>fixedGradientCorrected&lt;/code>.&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Tuković, Ž., Jasak, H., &lt;em>A moving mesh finite volume interface tracking method for surface tension dominated interfacial fluid flow&lt;/em>, Computers &amp;amp; Fluids 55, 2012. DOI: &lt;a href="https://doi.org/10.1016/j.compfluid.2011.11.003">10.1016/j.compfluid.2011.11.003&lt;/a>&lt;/li>
&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: fixedValueCorrected</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>fixedValueCorrected&lt;/code> is a Dirichlet condition for fields of any type
(scalar, vector, sphericalTensor, symmTensor, tensor). On top of the fixed
value it stores a non-orthogonal correction $\mathbf{c}\cdot\nabla\phi_P$ of the
near-wall value. The correction is evaluated on a small sub-mesh around the
patch. It comes from the foam-extend interface-tracking solver
(&lt;code>interTrackFoam&lt;/code>, Tuković), where it is used on patches whose near-wall
cells become skewed as the mesh follows a moving interface. The fixed-value
matrix coefficients themselves are not corrected. The correction only reaches
the discretisation through &lt;code>snGradCorrection()&lt;/code>, which is called by the
&lt;code>patchCorrected&lt;/code> snGrad scheme. That scheme is &lt;strong>not ported&lt;/strong> (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/#known-limitations">Known Limitations&lt;/a>).&lt;/p>
&lt;p>The BC is compiled into &lt;code>libinterfaceTrackingFvMesh&lt;/code>, not
&lt;code>libmultiRegionSystem&lt;/code>, so this library must be loaded. It is one of three
types derived from the common base &lt;code>correctedFvPatchField&lt;/code>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Page&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>fixedValueCorrected&lt;/code>&lt;/td>
&lt;td>this page&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>fixedGradientCorrected&lt;/code>&lt;/td>
&lt;td>&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedgradientcorrected/">fixedGradientCorrected&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>zeroGradientCorrected&lt;/code>&lt;/td>
&lt;td>&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/zerogradientcorrected/">zeroGradientCorrected&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>corrected&lt;/code>&lt;/td>
&lt;td>the base class itself, registered as a type but not usable on its own (see below)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
$$
\phi_b = \phi_\text{fixed} \quad \text{on } \partial\Omega
$$
&lt;p>With $\mathbf{n}$ the patch unit normal, $\boldsymbol{\Delta}$ the patch delta
vector and $\delta = 1/\texttt{deltaCoeffs}$, the base class defines the
correction vector and the stored correction&lt;/p>
$$
\mathbf{c} = \boldsymbol{\Delta} - \mathbf{n}\,(\mathbf{n}\cdot\boldsymbol{\Delta}),
\qquad
\phi_c = \mathbf{c}\cdot(\nabla\phi)_P
$$
&lt;p>and the corrected normal gradient&lt;/p>
$$
\left.\frac{\partial\phi}{\partial n}\right|_b
= \frac{\phi_b - \phi_P}{\delta} - \frac{\phi_c}{\delta}
= \frac{\phi_b - (\phi_P + \phi_c)}{\delta}
$$
&lt;p>The matrix coefficients are those of plain &lt;code>fixedValue&lt;/code>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Coefficient&lt;/th>
&lt;th>Value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>valueInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$0$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>valueBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$\phi_b$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$-1/\delta$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$\phi_b/\delta$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>snGradCorrection()&lt;/code>&lt;/td>
&lt;td>$-\phi_c/\delta$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&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>$\phi$&lt;/td>
&lt;td>Patch field&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}$&lt;/td>
&lt;td>Patch unit normal&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\Delta}$&lt;/td>
&lt;td>Patch delta vector (&lt;code>patch().delta()&lt;/code>)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{c}$&lt;/td>
&lt;td>Correction vector (&lt;code>correctionVectors()&lt;/code>)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$(\nabla\phi)_P$&lt;/td>
&lt;td>Cell gradient next to the patch, computed on the patch sub-mesh&lt;/td>
&lt;td>field unit/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi_c$&lt;/td>
&lt;td>Stored correction (&lt;code>corrVecGrad&lt;/code>)&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\delta$&lt;/td>
&lt;td>$1/$&lt;code>patch().deltaCoeffs()&lt;/code>&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Note on OpenFOAM.com.&lt;/strong> In OpenFOAM.com (v2512 and v2606),
&lt;code>fvPatch::delta()&lt;/code> returns the patch-normal delta for every non-coupled patch.
So $\mathbf{c} \equiv \mathbf{0}$ and $\phi_c \equiv 0$ identically. The BC then
behaves exactly like stock &lt;code>fixedValue&lt;/code>, but still does the sub-mesh work
described below on every update. The correction is only non-zero in
foam-extend, where &lt;code>delta()&lt;/code> is the full $\mathbf{C}_f - \mathbf{C}_P$.&lt;/p>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;strong>Base class &lt;code>correctedFvPatchField&lt;/code> (type &lt;code>corrected&lt;/code>).&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;em>Construction:&lt;/em> reads &lt;code>volFieldName&lt;/code> (required) and, if present,
&lt;code>corrVecGrad&lt;/code>. It computes the correction vectors $\mathbf{c}$. It does
&lt;strong>not&lt;/strong> read &lt;code>value&lt;/code> or &lt;code>patchType&lt;/code>.&lt;/li>
&lt;li>&lt;em>&lt;code>updateCoeffs()&lt;/code>:&lt;/em> if the mesh is moving, recomputes $\mathbf{c}$. Then it
always calls &lt;code>updateCorrVecGrad()&lt;/code>:
&lt;ol>
&lt;li>On first use, builds a patch sub-mesh (&lt;code>fvMeshSubset&lt;/code>) from the
patch face cells plus all their neighbouring cells. The sub-mesh takes
its &lt;code>fvSchemes&lt;/code>/&lt;code>fvSolution&lt;/code> from the region mesh.&lt;/li>
&lt;li>Interpolates the volume field named &lt;code>volFieldName&lt;/code> onto the sub-mesh.&lt;/li>
&lt;li>For each component, computes &lt;code>fvc::grad&lt;/code> with the gradient scheme
named &lt;code>snGradCorr(&amp;lt;volFieldName&amp;gt;)&lt;/code> (normally covered by
&lt;code>gradSchemes { default ...; }&lt;/code>).&lt;/li>
&lt;li>Stores $\phi_c = \mathbf{c}\cdot(\nabla\phi)_P$ and
$\mathbf{n}\cdot(\nabla\phi)_P$ (&lt;code>nGradInternal&lt;/code>, not used by any active
code path).&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;em>&lt;code>movePatchSubMesh()&lt;/code>:&lt;/em> moves the sub-mesh points to the current mesh
points. &lt;code>interfaceTrackingFvMesh::update()&lt;/code> calls it after each mesh motion
for every &lt;code>fixedValueCorrected&lt;/code>, &lt;code>fixedGradientCorrected&lt;/code> or
&lt;code>zeroGradientCorrected&lt;/code> patch of the fields &lt;strong>&lt;code>U&lt;/code>&lt;/strong> and &lt;strong>&lt;code>p&lt;/code>&lt;/strong> only. The
sub-meshes of other fields are not moved.&lt;/li>
&lt;li>&lt;em>&lt;code>write()&lt;/code>:&lt;/em> writes &lt;code>type&lt;/code>, &lt;code>volFieldName&lt;/code> and &lt;code>corrVecGrad&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>&lt;code>fixedValueCorrected&lt;/code>.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;em>Construction:&lt;/em> reads &lt;code>value&lt;/code> (required) in addition to the base keywords.&lt;/li>
&lt;li>&lt;code>fixesValue()&lt;/code> returns &lt;code>true&lt;/code>, so no pressure reference is needed if the BC
is used on &lt;code>p&lt;/code>.&lt;/li>
&lt;li>All assignment operators (&lt;code>=&lt;/code>, &lt;code>+=&lt;/code>, &lt;code>-=&lt;/code>, &lt;code>*=&lt;/code>, &lt;code>/=&lt;/code> with fields, patch
fields or constants) are no-ops, as in stock &lt;code>fixedValue&lt;/code>. The value can
only be changed with &lt;code>==&lt;/code>.&lt;/li>
&lt;li>&lt;code>evaluate()&lt;/code> is not overridden, so the value stays fixed.&lt;/li>
&lt;li>&lt;em>&lt;code>write()&lt;/code>:&lt;/em> base entries plus &lt;code>value&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>&lt;code>patchCorrectedSnGrad&lt;/code> (not compiled).&lt;/strong> The source is in
&lt;code>src/dynamicFvMesh/interfaceTrackingFvMesh/patchCorrectedSnGrad&lt;/code>. It is a
central snGrad scheme with explicit non-orthogonal correction, using the
gradient scheme &lt;code>snGradCorr(&amp;lt;field&amp;gt;)&lt;/code>. On patches of type
&lt;code>fixedValueCorrected&lt;/code> it replaces the boundary correction by
&lt;code>snGradCorrection()&lt;/code>. This is the only code path through which the stored
correction would enter a discretised equation. The entry in
&lt;code>src/dynamicFvMesh/Make/files&lt;/code> is commented out (&amp;ldquo;NEEDS TO BE PORTED STILL&amp;rdquo;),
so the scheme cannot be selected.&lt;/p>
&lt;h3 id="the-corrected-type">The &lt;code>corrected&lt;/code> type&lt;/h3>
&lt;p>&lt;code>makePatchFields(corrected)&lt;/code> registers the base class as type &lt;code>corrected&lt;/code> for
scalar, vector, sphericalTensor, symmTensor and tensor fields. The base class
does not implement any matrix coefficients (&lt;code>valueInternalCoeffs&lt;/code> etc. fall
back to &lt;code>fvPatchField&lt;/code>, which raises &lt;code>NotImplemented&lt;/code>). It does not read or
write &lt;code>value&lt;/code>, so its patch values are uninitialised. It also does not
override &lt;code>evaluate()&lt;/code>. &lt;code>type corrected;&lt;/code> is therefore not a usable boundary
condition. Use one of the three derived types.&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>fixedValueCorrected&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>volFieldName&lt;/code>&lt;/td>
&lt;td>Name of the volume field this patch field belongs to (e.g. &lt;code>U&lt;/code>, &lt;code>p&lt;/code>). Used to look up the field for the sub-mesh gradient.&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>– (no default)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Fixed patch value&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>corrVecGrad&lt;/code>&lt;/td>
&lt;td>Initial stored correction $\phi_c$ (written on output; overwritten at the first update)&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Library loading (&lt;code>system/controlDict&lt;/code> of the case):&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">libs
&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;libinterfaceTrackingFvMesh.so&amp;#34;
&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="usage">Usage&lt;/h2>
&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">movingWall
&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 fixedValueCorrected;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> volFieldName U;
&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 field must be the one named in &lt;code>volFieldName&lt;/code>. The sub-mesh is only kept
in step with mesh motion if the field is &lt;code>U&lt;/code> or &lt;code>p&lt;/code> and the region mesh is an
&lt;code>interfaceTrackingFvMesh&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>No effect in OpenFOAM.com.&lt;/strong> The patch delta is patch-normal, so the
correction vectors and $\phi_c$ are identically zero. The BC is equivalent
to &lt;code>fixedValue&lt;/code>, at the cost of a sub-mesh construction and a gradient
evaluation per component on every &lt;code>updateCoeffs()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>patchCorrected&lt;/code> snGrad scheme not ported.&lt;/strong> Even with a non-zero
correction, nothing in the compiled code would use &lt;code>snGradCorrection()&lt;/code>.
The matrix coefficients are those of plain &lt;code>fixedValue&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Interface-tracking region type disabled.&lt;/strong> The BCs were meant for
&lt;code>interTrackFluid&lt;/code>, which is commented out in
&lt;code>src/multiRegionSystem/Make/files&lt;/code>. The &lt;code>multiphaseFlow&lt;/code> tutorials that need
it (&lt;code>2dRisingBubble&lt;/code>, &lt;code>3dDuineveldRisingBubble&lt;/code>, &lt;code>3dOscillatingBubble&lt;/code>)
cannot currently be run. Only &lt;code>3dDuineveldRisingBubble&lt;/code> mentions
&lt;code>patchCorrected&lt;/code>, and only in comments in its base-mesh &lt;code>fvSchemes&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>volFieldName&lt;/code> has no default&lt;/strong> and must match the field name. Otherwise
the field lookup in &lt;code>updateCoeffs()&lt;/code> fails.&lt;/li>
&lt;li>&lt;strong>Sub-mesh motion only for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>.&lt;/strong> For any other field, the sub-mesh
keeps its initial geometry while the mesh moves.&lt;/li>
&lt;li>&lt;strong>&lt;code>corrected&lt;/code> is not a standalone BC&lt;/strong> (see above).&lt;/li>
&lt;/ul>
&lt;p>In practice, use the stock &lt;code>fixedValue&lt;/code> instead.&lt;/p>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;p>No tutorial uses &lt;code>fixedValueCorrected&lt;/code> (or any &lt;code>*Corrected&lt;/code> type). The FSI
tutorials &lt;code>beamInCrossFlow&lt;/code>, &lt;code>heatedBeamInCrossFlow&lt;/code> and &lt;code>HronTurekFsi3&lt;/code> load
&lt;code>libinterfaceTrackingFvMesh.so&lt;/code> for their &lt;code>interfaceTrackingFvMesh&lt;/code> fluid mesh,
but their fields use stock and &lt;code>regionCoupled*&lt;/code> boundary conditions.&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Tuković, Ž., Jasak, H., &lt;em>A moving mesh finite volume interface tracking method for surface tension dominated interfacial fluid flow&lt;/em>, Computers &amp;amp; Fluids 55, 2012. DOI: &lt;a href="https://doi.org/10.1016/j.compfluid.2011.11.003">10.1016/j.compfluid.2011.11.003&lt;/a>&lt;/li>
&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><item><title>Docs: zeroGradientCorrected</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/zerogradientcorrected/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/zerogradientcorrected/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>zeroGradientCorrected&lt;/code> is a zero-gradient condition for fields of any type
(scalar, vector, sphericalTensor, symmTensor, tensor). Instead of copying the
near-wall cell value, it sets the patch value to the cell value plus a
non-orthogonal correction $\mathbf{c}\cdot\nabla\phi_P$, evaluated on a small
sub-mesh around the patch. The same correction enters the matrix through
&lt;code>valueBoundaryCoeffs&lt;/code>. It comes from the foam-extend interface-tracking
solver (&lt;code>interTrackFoam&lt;/code>, Tuković). The BC is compiled into
&lt;code>libinterfaceTrackingFvMesh&lt;/code>. It derives from the common base
&lt;code>correctedFvPatchField&lt;/code> (type &lt;code>corrected&lt;/code>). The base class, the sub-mesh
machinery, the &lt;code>corrected&lt;/code> type and the porting status (&lt;code>interTrackFluid&lt;/code>
disabled, &lt;code>patchCorrected&lt;/code> snGrad not ported) are described on the
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/">fixedValueCorrected&lt;/a> page.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
$$
\left.\frac{\partial\phi}{\partial n}\right|_b = 0 \quad \text{on } \partial\Omega,
\qquad
\phi_b = \phi_P + \phi_c,
\qquad
\phi_c = \mathbf{c}\cdot(\nabla\phi)_P,
\quad
\mathbf{c} = \boldsymbol{\Delta} - \mathbf{n}\,(\mathbf{n}\cdot\boldsymbol{\Delta})
$$
&lt;p>Matrix coefficients:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Coefficient&lt;/th>
&lt;th>Value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>valueInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$1$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>valueBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$\phi_c$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$0$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$0$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>snGrad()&lt;/code>&lt;/td>
&lt;td>$0$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&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>$\phi$&lt;/td>
&lt;td>Patch field&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}$&lt;/td>
&lt;td>Patch unit normal&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\Delta}$&lt;/td>
&lt;td>Patch delta vector (&lt;code>patch().delta()&lt;/code>)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{c}$&lt;/td>
&lt;td>Correction vector&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi_c$&lt;/td>
&lt;td>Stored correction (&lt;code>corrVecGrad&lt;/code>), updated in &lt;code>updateCoeffs()&lt;/code>&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Note on OpenFOAM.com.&lt;/strong> &lt;code>fvPatch::delta()&lt;/code> is patch-normal for every
non-coupled patch in OpenFOAM.com, so $\mathbf{c} \equiv \mathbf{0}$ and
$\phi_c \equiv 0$. The coefficients reduce to those of stock &lt;code>zeroGradient&lt;/code>.&lt;/p>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Construction:&lt;/strong> the base class reads &lt;code>volFieldName&lt;/code> (required) and the
optional &lt;code>corrVecGrad&lt;/code>. The patch value is set to $\phi_P + \phi_c$. &lt;code>value&lt;/code>
is not read.&lt;/li>
&lt;li>&lt;strong>&lt;code>updateCoeffs()&lt;/code>&lt;/strong> (base class): recomputes $\mathbf{c}$ if the mesh moves,
rebuilds $\phi_c$ on the patch sub-mesh (gradient scheme
&lt;code>snGradCorr(&amp;lt;volFieldName&amp;gt;)&lt;/code>). It is called whenever an &lt;code>fvMatrix&lt;/code> for the
field is constructed, so &lt;code>valueBoundaryCoeffs&lt;/code> uses the current $\phi_c$.&lt;/li>
&lt;li>&lt;strong>&lt;code>evaluate()&lt;/code>:&lt;/strong> declared &lt;strong>without&lt;/strong> the &lt;code>Pstream::commsTypes&lt;/code> argument. It
does not override &lt;code>fvPatchField::evaluate(const Pstream::commsTypes)&lt;/code>, which
&lt;code>correctBoundaryConditions()&lt;/code> calls. The base version runs, and it only
resets the &lt;code>updated&lt;/code> flag. &lt;strong>The patch value is not recomputed&lt;/strong> after a
solve. It stays at the construction value $\phi_P + \phi_c$ of the initial
field, so it does not behave like a zero-gradient value at all.&lt;/li>
&lt;li>&lt;strong>Mapping:&lt;/strong> &lt;code>autoMap&lt;/code>/&lt;code>rmap&lt;/code> map the value only.&lt;/li>
&lt;li>&lt;strong>Sub-mesh motion:&lt;/strong> &lt;code>interfaceTrackingFvMesh::update()&lt;/code> moves the
sub-mesh only for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>write()&lt;/code>:&lt;/strong> &lt;code>type&lt;/code>, &lt;code>volFieldName&lt;/code>, &lt;code>corrVecGrad&lt;/code>. No &lt;code>value&lt;/code> is written.&lt;/li>
&lt;/ul>
&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>zeroGradientCorrected&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>volFieldName&lt;/code>&lt;/td>
&lt;td>Name of the volume field this patch field belongs to&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>– (no default)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>corrVecGrad&lt;/code>&lt;/td>
&lt;td>Initial stored correction $\phi_c$&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The library must be loaded with
&lt;code>libs (&amp;quot;libinterfaceTrackingFvMesh.so&amp;quot;);&lt;/code> in &lt;code>system/controlDict&lt;/code>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&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">outlet
&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 zeroGradientCorrected;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> volFieldName U;
&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>Patch value frozen at its initial value&lt;/strong>, because the &lt;code>evaluate()&lt;/code>
signature does not match (see Implementation). Explicit operators that use
patch values (&lt;code>fvc::grad&lt;/code>, &lt;code>fvc::interpolate&lt;/code>, face fluxes) see the initial
value.&lt;/li>
&lt;li>&lt;strong>No correction in OpenFOAM.com&lt;/strong> (patch-normal &lt;code>delta()&lt;/code>). The cost of the
sub-mesh gradient remains on every &lt;code>updateCoeffs()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Interface-tracking context not available:&lt;/strong> &lt;code>interTrackFluid&lt;/code> is disabled
and &lt;code>patchCorrected&lt;/code> is not ported (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/#known-limitations">fixedValueCorrected&lt;/a>).&lt;/li>
&lt;li>&lt;strong>&lt;code>volFieldName&lt;/code> has no default&lt;/strong> and must match the field name.&lt;/li>
&lt;li>&lt;strong>Sub-mesh motion only for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>In practice, use the stock &lt;code>zeroGradient&lt;/code> instead.&lt;/p>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;p>No tutorial uses &lt;code>zeroGradientCorrected&lt;/code>.&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Tuković, Ž., Jasak, H., &lt;em>A moving mesh finite volume interface tracking method for surface tension dominated interfacial fluid flow&lt;/em>, Computers &amp;amp; Fluids 55, 2012. DOI: &lt;a href="https://doi.org/10.1016/j.compfluid.2011.11.003">10.1016/j.compfluid.2011.11.003&lt;/a>&lt;/li>
&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>