<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>multiPhysicsFoam – Laminar</title><link>https://multiphysicsfoam.com/tags/laminar/</link><description>Recent content in Laminar on multiPhysicsFoam</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://multiphysicsfoam.com/tags/laminar/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: icoFluid</title><link>https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/icofluid/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/icofluid/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>icoFluid&lt;/code> solves the transient, incompressible Navier-Stokes equations for a
&lt;strong>laminar Newtonian&lt;/strong> fluid. Unlike &lt;code>pimpleFluid&lt;/code>, it works with the dynamic
viscosity $\mu$ and the density $\rho$ directly: the momentum equation is
density-weighted and the pressure &lt;code>p&lt;/code> is the static pressure in Pa, not the
kinematic pressure. It runs a PISO pressure-corrector loop inside the global
PIMPLE outer loop of &lt;code>multiRegionSystem&lt;/code>. It supports moving meshes (ALE) and
translational moving reference frames from the &lt;code>movingReferenceFrame&lt;/code> library.
Several of its options (the &lt;code>closedVolume&lt;/code> flux correction, the &lt;code>space&lt;/code> patch
and the &lt;code>PISO&lt;/code> pressure reference) match the conventions of the partitioned
two-phase (interface-tracking) coupling BCs. It does not provide turbulence
modelling or &lt;code>fvOptions&lt;/code>.&lt;/p>
&lt;h2 id="governing-equations">Governing Equations&lt;/h2>
&lt;h3 id="continuity">Continuity&lt;/h3>
$$
\nabla \cdot \mathbf{U} = 0
$$
&lt;h3 id="momentum">Momentum&lt;/h3>
$$
\frac{\partial (\rho \mathbf{U})}{\partial t} + \nabla \cdot \left( \rho_f \, \phi \, \mathbf{U} \right) - \nabla \cdot \left( \mu \nabla \mathbf{U} \right) - \nabla \cdot \left( \mu \, \text{dev}\!\left[ (\nabla \mathbf{U})^T \right] \right) + \mathbf{F}_\text{MRF}
= -\nabla 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>(Static) pressure&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\rho$&lt;/td>
&lt;td>Density, $\rho_f$ its face interpolate&lt;/td>
&lt;td>kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mu$&lt;/td>
&lt;td>Dynamic viscosity&lt;/td>
&lt;td>Pa·s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi$&lt;/td>
&lt;td>Volumetric face flux&lt;/td>
&lt;td>m³/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{F}_\text{MRF}$&lt;/td>
&lt;td>Frame-acceleration term added by translational MRF zones (&lt;code>addFrameAcceleration&lt;/code>)&lt;/td>
&lt;td>N/m³&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The convection term uses the scheme name &lt;code>div(phi,U)&lt;/code> explicitly, even though
the actual flux is $\rho_f\phi$.&lt;/p>
&lt;h3 id="stress-tensor-for-fsi-coupling">Stress tensor (for FSI coupling)&lt;/h3>
&lt;p>After each PISO corrector the Cauchy stress is updated:&lt;/p>
$$
\boldsymbol{\sigma} = -p\,\mathbf{I} + \mu \left( \nabla \mathbf{U} + (\nabla \mathbf{U})^T \right)
$$
&lt;p>Because $p$ is already in Pa and $\mu$ is dynamic, no extra $\rho$ scaling is
applied (unlike &lt;code>pimpleFluid&lt;/code>, which builds $\boldsymbol\sigma$ from $p_\text{kin}$ and
the turbulence model&amp;rsquo;s $\mathbf{R}^\text{dev}$).&lt;/p>
&lt;h2 id="numerical-algorithm">Numerical Algorithm&lt;/h2>
&lt;p>&lt;code>usesPIMPLE()&lt;/code> returns &lt;code>true&lt;/code>. &lt;code>solveRegion()&lt;/code> and &lt;code>setCoupledEqns()&lt;/code> are
no-ops, so all work happens in the PIMPLE hooks called by
&lt;code>regionTypeList::solvePIMPLE()&lt;/code>. That function runs &lt;code>nOuterCorrectors&lt;/code> outer
iterations, read from the &lt;strong>top-level&lt;/strong> &lt;code>system/fvSolution&lt;/code> &lt;code>PIMPLE&lt;/code> dictionary.
Each iteration calls the following hooks on every region:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>&lt;code>prePredictor()&lt;/code>&lt;/strong>
&lt;ul>
&lt;li>Once per time step (guarded by &lt;code>myTimeIndex_&lt;/code>): compute the Courant
number from &lt;code>phi&lt;/code> (&lt;code>CourantNo.H&lt;/code>, plus the stock &lt;code>meshCourantNo.H&lt;/code> when
the mesh is moving). If &lt;code>adjustTimeStep&lt;/code> is on, change &lt;code>deltaT&lt;/code> directly
(&lt;code>setDeltaT.H&lt;/code>):
$\Delta t_\text{new} = \max\big(\min(f\,\Delta t,\ \texttt{maxDeltaT}),\ \texttt{minDeltaT}\big)$
with $f = \min\big(\min(\texttt{maxCo}/Co,\ 1 + 0.1\,\texttt{maxCo}/Co),\ 1.2\big)$.&lt;/li>
&lt;li>If the mesh is changing, run the flux correction &lt;code>correctPhi.H&lt;/code>. It
re-evaluates fixed-value &lt;code>U&lt;/code> patches, then solves a &lt;code>pcorr&lt;/code> Poisson
equation with $(1/A)_f = \Delta t$ inside a non-orthogonal corrector loop,
and subtracts its flux from &lt;code>phi&lt;/code>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>&lt;code>momentumPredictor()&lt;/code>&lt;/strong>
&lt;ul>
&lt;li>If the mesh is changing, make &lt;code>phi&lt;/code> relative: &lt;code>phi == phi - fvc::meshPhi(rho, U)&lt;/code>.&lt;/li>
&lt;li>Assemble &lt;code>UEqn = ddt(rho,U) [+ MRF frame acceleration] + HUEqn&lt;/code> and
under-relax it with the factor &lt;code>relaxationFactors/&amp;lt;velocityName&amp;gt;&lt;/code>.&lt;/li>
&lt;li>If &lt;code>momentumPredictor&lt;/code> is on, solve &lt;code>UEqn == -grad(p)&lt;/code>.&lt;/li>
&lt;li>Reset the cached &lt;code>UEqn&lt;/code> to its unrelaxed form (original source and
boundary coefficients) so that the relaxation does not affect time
consistency in the pressure corrector.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>&lt;code>pressureCorrector()&lt;/code>&lt;/strong>: PISO loop (&lt;code>while (pimple_.correct())&lt;/code>, i.e.
&lt;code>nCorrectors&lt;/code> from the region &lt;code>PIMPLE&lt;/code> dict):
&lt;ul>
&lt;li>$r_{AU} = 1/A_U$, $\mathbf{U} = \mathbf{H}\,r_{AU}$,
$\phi = \big(\mathbf{H}_f\,(r_{AU})_f\big) \cdot \mathbf{S}_f$ (&lt;code>H&lt;/code> and
&lt;code>rAU&lt;/code> are interpolated separately).&lt;/li>
&lt;li>Boundary flux fix-up (&lt;code>correctPatchPhi.H&lt;/code>):
&lt;ul>
&lt;li>&lt;code>closedVolume&lt;/code> on: set &lt;code>phi = U·Sf&lt;/code> on all non-coupled patches except
the patch named &lt;code>interfaceShadow&lt;/code>.&lt;/li>
&lt;li>Otherwise: set it on all non-coupled patches where &lt;code>p&lt;/code> is not fixed.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>closedVolume&lt;/code> on: &lt;code>correctClosedVolumePhi&lt;/code> rescales the flux on the
&lt;code>regionCoupledVelocityValue&lt;/code> / &lt;code>regionCoupledMassTransferVelocityValue&lt;/code>
patch so that the net flux is zero.&lt;/li>
&lt;li>&lt;code>hasSpacePatch&lt;/code> on (and &lt;code>closedVolume&lt;/code> off): &lt;code>correctSpaceVolumePhi&lt;/code>
scales the outflow on the patch named &lt;code>space&lt;/code> to balance the inflow.&lt;/li>
&lt;li>Non-orthogonal loop: solve
$\nabla\cdot\big((r_{AU})_f\nabla p\big) = \nabla\cdot\phi$. The pressure
reference is set only when &lt;code>closedVolume&lt;/code> is on. On the final
non-orthogonal iteration, apply &lt;code>phi -= pEqn.flux()&lt;/code>.&lt;/li>
&lt;li>Relax &lt;code>p&lt;/code> except on the final iteration, then apply
$\mathbf{U} \mathrel{-}= r_{AU}\nabla p$, correct the boundary
conditions and update &lt;code>sigma&lt;/code>.&lt;/li>
&lt;li>Print min/max/mean of &lt;code>p&lt;/code> and &lt;code>U&lt;/code> and the region volume.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;code>meshMotionCorrector()&lt;/code> is called by &lt;code>multiRegionSystem::preSolve()&lt;/code> every time
step, and inside the DNA loop for &lt;code>pUPimple&lt;/code>/&lt;code>D&lt;/code> coupling. It calls
&lt;code>mesh().controlledUpdate()&lt;/code> and rebuilds &lt;code>Uf&lt;/code> from &lt;code>U&lt;/code> and &lt;code>phi&lt;/code> if no &lt;code>Uf&lt;/code>
file was read. If a patch named &lt;code>interface&lt;/code> exists and the mesh is changing,
it also prints flux and continuity diagnostics for that patch.&lt;/p>
&lt;p>&lt;code>correct()&lt;/code> (called from &lt;code>preSolve()&lt;/code>) runs &lt;code>correctPhi.H&lt;/code> when the mesh is
changing. &lt;code>postSolve()&lt;/code> updates the translational MRF zones once per time step
(&lt;code>correctMRF()&lt;/code>, &lt;code>correctBoundaryVelocity(U, phi)&lt;/code>).&lt;/p>
&lt;p>&lt;code>getMinDeltaT()&lt;/code> returns &lt;code>GREAT&lt;/code>: the region never limits the global time step
through &lt;code>multiRegionSystem&lt;/code>. Courant-based time-step control happens only
inside &lt;code>prePredictor()&lt;/code> (see above).&lt;/p>
&lt;h3 id="differences-from-pimplefluid">Differences from &lt;code>pimpleFluid&lt;/code>&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Aspect&lt;/th>
&lt;th>&lt;code>icoFluid&lt;/code>&lt;/th>
&lt;th>&lt;code>pimpleFluid&lt;/code>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Pressure field&lt;/td>
&lt;td>&lt;code>p&lt;/code> [Pa], density-weighted momentum&lt;/td>
&lt;td>&lt;code>pKin&lt;/code> [m²/s²], &lt;code>p&lt;/code> derived&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Viscosity&lt;/td>
&lt;td>dynamic &lt;code>mu&lt;/code>, laminar only&lt;/td>
&lt;td>&lt;code>nu&lt;/code> via &lt;code>singlePhaseTransportModel&lt;/code> + turbulence model&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>MRF&lt;/td>
&lt;td>translational &lt;code>MovingReferenceFrameZones&lt;/code>&lt;/td>
&lt;td>&lt;code>IOMRFZoneList&lt;/code> (&lt;code>MRFProperties&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>fvOptions&lt;/code>&lt;/td>
&lt;td>not supported&lt;/td>
&lt;td>supported&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Pressure reference&lt;/td>
&lt;td>&lt;code>PISO { pRefPoint; pRefValue; }&lt;/code>, applied only if &lt;code>closedVolume&lt;/code>&lt;/td>
&lt;td>&lt;code>PIMPLE { pKinRefCell; pKinRefValue; }&lt;/code> via &lt;code>setRefCell&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Time-step control&lt;/td>
&lt;td>inside &lt;code>prePredictor&lt;/code>, &lt;code>getMinDeltaT()&lt;/code> = &lt;code>GREAT&lt;/code>&lt;/td>
&lt;td>&lt;code>getMinDeltaT()&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>HbyA&lt;/code> treatment&lt;/td>
&lt;td>no &lt;code>constrainHbyA&lt;/code>/&lt;code>constrainPressure&lt;/code>/&lt;code>ddtCorr&lt;/code>/consistent&lt;/td>
&lt;td>full stock &lt;code>pimpleFoam&lt;/code> treatment&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="sub-models">Sub-Models&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Sub-model&lt;/th>
&lt;th>Selection mechanism&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Transport properties&lt;/td>
&lt;td>&lt;code>constant/&amp;lt;region&amp;gt;/transportProperties&lt;/code>&lt;/td>
&lt;td>Uniform &lt;code>rho&lt;/code>, &lt;code>mu&lt;/code> (used if no &lt;code>rho&lt;/code>/&lt;code>mu&lt;/code> field files exist)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Translational MRF&lt;/td>
&lt;td>&lt;code>constant/&amp;lt;region&amp;gt;/translationalMRFZones&lt;/code> (read if present)&lt;/td>
&lt;td>PID-controlled frame velocity (&lt;code>KP&lt;/code>, &lt;code>KI&lt;/code>, &lt;code>KD&lt;/code>, &lt;code>centreFromMesh&lt;/code>, &amp;hellip;)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mesh motion&lt;/td>
&lt;td>&lt;code>constant/&amp;lt;region&amp;gt;/dynamicMeshDict&lt;/code>&lt;/td>
&lt;td>Through &lt;code>mesh().controlledUpdate()&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>No turbulence model and no &lt;code>fvOptions&lt;/code>.&lt;/p>
&lt;h2 id="required-fields">Required Fields&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>U&lt;/code>&lt;/td>
&lt;td>&lt;code>volVectorField&lt;/code>&lt;/td>
&lt;td>Velocity (name configurable through &lt;code>velocityName&lt;/code>)&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Pressure&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Optional / created at runtime:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Written&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>rho&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Read if present, otherwise uniform from &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mu&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Read if present, otherwise uniform from &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>phi&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceScalarField&lt;/code>&lt;/td>
&lt;td>Volumetric flux, initialised as $\mathbf{U}_f\cdot\mathbf{S}_f$&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>phiHbyA&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceScalarField&lt;/code>&lt;/td>
&lt;td>Initialised from &lt;code>phi&lt;/code> (not used by the algorithm)&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pcorr&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Mesh-motion flux correction; &lt;code>fixedValue&lt;/code> where &lt;code>p&lt;/code> fixes value, else &lt;code>zeroGradient&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Uf&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceVectorField&lt;/code>&lt;/td>
&lt;td>Face velocity (read if present)&lt;/td>
&lt;td>yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>sigma&lt;/code>&lt;/td>
&lt;td>&lt;code>volSymmTensorField&lt;/code>&lt;/td>
&lt;td>Cauchy stress&lt;/td>
&lt;td>no&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="case-setup">Case Setup&lt;/h2>
&lt;h3 id="required-dictionaries">Required dictionaries&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="n">constant&lt;/span>&lt;span class="o">/&amp;lt;&lt;/span>&lt;span class="n">region&lt;/span>&lt;span class="o">&amp;gt;/&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">mu&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">dimensioned&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">MUST_READ&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">/&amp;lt;&lt;/span>&lt;span class="n">region&lt;/span>&lt;span class="o">&amp;gt;/&lt;/span>&lt;span class="n">fvSolution&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">solvers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">PIMPLE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">PISO&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">relaxationFactors&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">/&amp;lt;&lt;/span>&lt;span class="n">region&lt;/span>&lt;span class="o">&amp;gt;/&lt;/span>&lt;span class="n">fvSchemes&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">schemes&lt;/span> &lt;span class="n">incl&lt;/span>&lt;span class="o">.&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="n">fluxRequired&lt;/span> &lt;span class="n">sub&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">dict&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">system&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">fvSolution&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">top&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">level&lt;/span> &lt;span class="n">PIMPLE&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">nOuterCorrectors&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="multiregionproperties-entry">&lt;code>multiRegionProperties&lt;/code> entry&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">regions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ( fluid (icoFluid) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="controldict-singleregionmode">&lt;code>controlDict&lt;/code> (singleRegionMode)&lt;/h3>
&lt;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">singleRegionMode yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">regionType icoFluid;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="transportproperties">&lt;code>transportProperties&lt;/code>&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">rho rho [1 -3 0 0 0 0 0] 1.173;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mu mu [1 -1 -1 0 0 0 0] 1.856e-5;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="key-region-fvsolution-settings">Key region &lt;code>fvSolution&lt;/code> settings&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">solvers
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> p { solver PCG; preconditioner DIC; tolerance 1e-06; relTol 0; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pcorr { solver PCG; preconditioner DIC; tolerance 1e-06; relTol 0; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> U { solver BiCGStab; preconditioner DILU; tolerance 1e-05; relTol 0; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PIMPLE // read by pimpleControl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> momentumPredictor yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nCorrectors 2; // PISO correctors
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nNonOrthogonalCorrectors 1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PISO
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pRefValue 0; // always required
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pRefPoint (0 0 0); // required if p needs a reference
&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">relaxationFactors // sub-dict must exist (may be empty)
&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 0.7; // momentum relaxation, key = velocityName, default 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">closedVolume no; // default no; top level of fvSolution
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hasSpacePatch no; // default no; requires a patch named &amp;#34;space&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">// velocityName U; // default U
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="key-fvschemes-entries">Key &lt;code>fvSchemes&lt;/code> entries&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">divSchemes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> div(phi,U) Gauss linear; // name used explicitly by the convection term
&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">fluxRequired // sub-dict must exist; each non-default entry is registered
&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"> pcorr;
&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="adjustable-time-stepping-controldict">Adjustable time stepping (&lt;code>controlDict&lt;/code>)&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">adjustTimeStep yes; // default no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">maxCo 0.5; // default 1.0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">maxDeltaT 1e-3; // default GREAT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">minDeltaT 1e-8; // required when adjustTimeStep is on
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="coupling">Coupling&lt;/h2>
&lt;p>No interface type refers to &lt;code>icoFluid&lt;/code> by name. The partitioned p-U BCs in
&lt;code>src/fvPatchFields/coupledFvPatchFields/partitionedCoupledFvPatchFields&lt;/code>
follow the same conventions as &lt;code>icoFluid&lt;/code>: a &lt;code>p&lt;/code> field in Pa, a registered
&lt;code>rho&lt;/code> field, &lt;code>rho&lt;/code>/&lt;code>mu&lt;/code> in &lt;code>transportProperties&lt;/code>, a &lt;code>PISO.pRefPoint&lt;/code>, an
&lt;code>interfaceShadow&lt;/code> patch and &lt;code>closedVolume&lt;/code>. &lt;code>icoFluid&lt;/code> also provides the
fields those BCs and the interfaces look up.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Interface type&lt;/th>
&lt;th>Fields used from the &lt;code>icoFluid&lt;/code> region&lt;/th>
&lt;th>Coupling mode&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>capillaryInterface&lt;/code>&lt;/td>
&lt;td>&lt;code>U&lt;/code>, &lt;code>p&lt;/code>, &lt;code>rho&lt;/code> (field), &lt;code>transportProperties&lt;/code> (&lt;code>rho&lt;/code>, &lt;code>mu&lt;/code>) via &lt;code>pUPimple&lt;/code>&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>massTransferInterface&lt;/code>&lt;/td>
&lt;td>&lt;code>U&lt;/code>, &lt;code>p&lt;/code>, &lt;code>phi&lt;/code>, &lt;code>transportProperties&lt;/code> via the &lt;code>regionCoupledMassTransfer*&lt;/code> BCs&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>fsiInterface&lt;/code>&lt;/td>
&lt;td>&lt;code>sigma&lt;/code> (read by &lt;code>regionCoupledTraction&lt;/code> on the solid side)&lt;/td>
&lt;td>partitioned (DNA, field &lt;code>D&lt;/code>)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>regionCoupledPressureValue&lt;/code> / &lt;code>regionCoupledMassTransferPressureValue&lt;/code> also
need a &lt;code>g&lt;/code> (&lt;code>uniformDimensionedVectorField&lt;/code>) in the fluid region, which
&lt;code>icoFluid&lt;/code> does not create.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Laminar, Newtonian, incompressible only&lt;/strong>: no turbulence model,
constant (or user-supplied, not updated) &lt;code>rho&lt;/code> and &lt;code>mu&lt;/code>.&lt;/li>
&lt;li>&lt;strong>No &lt;code>fvOptions&lt;/code>&lt;/strong>: no source terms or constraints.&lt;/li>
&lt;li>&lt;strong>No monolithic p-U coupling&lt;/strong>: &lt;code>setCoupledEqns&lt;/code> is a no-op. The monolithic
variant &lt;code>pUCoupledIcoFluid&lt;/code> is currently disabled (commented out in
&lt;code>src/multiRegionSystem/Make/files&lt;/code>).&lt;/li>
&lt;li>&lt;strong>Time-step control bypasses &lt;code>getMinDeltaT()&lt;/code>&lt;/strong>: &lt;code>deltaT&lt;/code> is changed inside
&lt;code>prePredictor()&lt;/code>, after the solver has already picked the time step.
&lt;code>myTimeIndex_&lt;/code> is only advanced in &lt;code>postSolve()&lt;/code>, and that only runs for
&lt;code>pUPimple&lt;/code>/&lt;code>D&lt;/code> DNA coupling (&lt;code>postSolvePIMPLE&lt;/code>). Without that coupling,
Courant evaluation and &lt;code>setDeltaT&lt;/code> run in every outer corrector and the
translational-MRF update in &lt;code>postSolve()&lt;/code> never runs.&lt;/li>
&lt;li>&lt;strong>Hard-coded patch names&lt;/strong>: &lt;code>interfaceShadow&lt;/code> (excluded from the
&lt;code>closedVolume&lt;/code> boundary-flux fix-up), &lt;code>space&lt;/code> (&lt;code>hasSpacePatch&lt;/code>), and
&lt;code>interface&lt;/code> (diagnostics in &lt;code>meshMotionCorrector&lt;/code>).&lt;/li>
&lt;li>&lt;strong>&lt;code>closedVolume&lt;/code> needs a coupled velocity patch&lt;/strong>: &lt;code>correctClosedVolumePhi&lt;/code>
looks for a &lt;code>regionCoupledVelocityValue&lt;/code> or
&lt;code>regionCoupledMassTransferVelocityValue&lt;/code> patch on &lt;code>U&lt;/code>. With none present it
indexes patch &lt;code>-1&lt;/code>. The same applies to &lt;code>hasSpacePatch&lt;/code> without a &lt;code>space&lt;/code>
patch.&lt;/li>
&lt;li>&lt;strong>Pressure reference only with &lt;code>closedVolume&lt;/code>&lt;/strong>: the &lt;code>p&lt;/code> equation is
referenced only when &lt;code>closedVolume&lt;/code> is on, while &lt;code>PISO.pRefValue&lt;/code> is always
required. In &lt;code>setRefCell.H&lt;/code> the &lt;code>break&lt;/code> sits inside the &lt;code>forAll&lt;/code> over
processors. If the reference point is found on more than one processor and
not on processor 0, no processor is selected (&lt;code>procWithRef = -1&lt;/code>).&lt;/li>
&lt;li>&lt;strong>Simplified &lt;code>HbyA&lt;/code>&lt;/strong>: no &lt;code>constrainHbyA&lt;/code>, &lt;code>constrainPressure&lt;/code>, &lt;code>ddtCorr&lt;/code> or
&lt;code>adjustPhi&lt;/code>, so open-domain pressure BCs and flux consistency follow the
&lt;code>correctPatchPhi.H&lt;/code> logic only.&lt;/li>
&lt;li>&lt;strong>Cosmetic&lt;/strong>: the logged velocity &amp;ldquo;min&amp;rdquo; actually prints &lt;code>gMax(U)&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;p>No tutorial currently uses &lt;code>icoFluid&lt;/code>. The multiphase tutorials under
&lt;code>tutorials/multiphaseFlow/&lt;/code> (e.g. &lt;code>2dRisingBubble&lt;/code>) use the same dictionary
conventions (&lt;code>PISO&lt;/code>, &lt;code>closedVolume&lt;/code>, &lt;code>transportProperties&lt;/code> with &lt;code>rho&lt;/code>/&lt;code>mu&lt;/code>)
but select &lt;code>interTrackFluid&lt;/code>, which is also disabled in
&lt;code>src/multiRegionSystem/Make/files&lt;/code>.&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>