<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>multiPhysicsFoam – Initialisation</title><link>https://multiphysicsfoam.com/tags/initialisation/</link><description>Recent content in Initialisation on multiPhysicsFoam</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://multiphysicsfoam.com/tags/initialisation/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: potentialFluid</title><link>https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/potentialfluid/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/potentialfluid/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>potentialFluid&lt;/code> solves for &lt;strong>potential flow&lt;/strong>: an inviscid, irrotational,
incompressible idealisation in which the velocity field is the gradient of a
scalar velocity potential $\Phi$, reducing the flow problem to a single Laplace
equation. It is the multiPhysicsFoam port of OpenFOAM&amp;rsquo;s &lt;code>potentialFoam&lt;/code>.&lt;/p>
&lt;p>Its primary use is &lt;strong>initialisation&lt;/strong>: it produces a smooth, discretely
divergence-free velocity and flux field consistent with the boundary conditions,
from which a full Navier-Stokes region such as &lt;code>pimpleFluid&lt;/code> can start without a
violent initial transient. It is also a cheap mesh-quality diagnostic. Because
the model contains no viscosity, it resolves no boundary layers, separation,
wakes, or drag, and is not intended as a final-answer solver.&lt;/p>
&lt;p>The region re-solves on &lt;strong>every time step&lt;/strong>. For the usual one-shot initialiser
workflow, limit the run to a single step via &lt;code>controlDict&lt;/code> (&lt;code>endTime 1&lt;/code>,
&lt;code>deltaT 1&lt;/code>), as both tutorials do.&lt;/p>
&lt;h2 id="governing-equations">Governing Equations&lt;/h2>
&lt;h3 id="continuity-and-irrotationality">Continuity and irrotationality&lt;/h3>
$$
\nabla \cdot \mathbf{U} = 0
\qquad\qquad
\nabla \times \mathbf{U} = 0
$$
&lt;h3 id="velocity-potential">Velocity potential&lt;/h3>
&lt;p>Irrotationality permits $\mathbf{U} = \nabla \Phi$, which with continuity gives
Laplace&amp;rsquo;s equation:&lt;/p>
$$
\nabla^2 \Phi = 0
$$
&lt;p>Discretely this is solved in projection form. From the flux field $\phi^{*}$
implied by the boundary conditions,&lt;/p>
$$
\nabla^2 \Phi = \nabla \cdot \phi^{*}
\qquad\text{then}\qquad
\phi = \phi^{*} - \nabla \Phi \cdot \mathbf{S}_f
$$
&lt;p>so that $\nabla \cdot \phi = 0$ to solver tolerance on the actual mesh. The cell
velocity is recovered by &lt;code>fvc::reconstruct(phi)&lt;/code>.&lt;/p>
&lt;h3 id="euler-pressure-optional">Euler pressure (optional)&lt;/h3>
&lt;p>Enabled by &lt;code>writep&lt;/code>. Taking the divergence of the steady Euler equation, with
the source filtered along the flow direction by
$\mathbf{F} = \hat{\mathbf{U}} \otimes \hat{\mathbf{U}}$ to suppress spurious
cross-stream pressure variation:&lt;/p>
$$
\nabla^2 p_\text{kin} + \nabla \cdot \left( \mathbf{F} \cdot \nabla \cdot (\mathbf{U}\mathbf{U}) \right) = 0
$$
&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>Velocity potential&lt;/td>
&lt;td>m²/s&lt;/td>
&lt;/tr>
&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>$\phi$&lt;/td>
&lt;td>Volumetric face flux&lt;/td>
&lt;td>m³/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$p_\text{kin} = p/\rho$&lt;/td>
&lt;td>Kinematic pressure&lt;/td>
&lt;td>m²/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{S}_f$&lt;/td>
&lt;td>Face area vector&lt;/td>
&lt;td>m²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{F}$&lt;/td>
&lt;td>Flow-direction filter tensor&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="numerical-algorithm">Numerical Algorithm&lt;/h2>
&lt;p>There is no PIMPLE loop and no time integration: &lt;code>usesPIMPLE()&lt;/code> returns &lt;code>false&lt;/code>
and the whole algorithm runs in &lt;code>solveRegion()&lt;/code>, which the orchestrator calls
before any PIMPLE stage. Per run:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Make the flux relative&lt;/strong> to any MRF zones.&lt;/li>
&lt;li>&lt;strong>Balance the global flux&lt;/strong> (&lt;code>adjustPhi&lt;/code>). Applied only when $p_\text{kin}$
needs a reference, i.e. no fixed-value pressure boundary exists; total inflow
is then forced to equal total outflow.&lt;/li>
&lt;li>&lt;strong>Non-orthogonal corrector loop&lt;/strong> — assemble and solve
$\nabla^2\Phi = \nabla\cdot\phi$ with &lt;code>setReference&lt;/code> applied. On the final
iteration only, correct the flux: &lt;code>phi -= PhiEqn.flux()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Restore the absolute flux.&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Report the continuity error&lt;/strong> $\overline{|\nabla \cdot \phi|}$, volume-weighted.&lt;/li>
&lt;li>&lt;strong>Reconstruct&lt;/strong> &lt;code>U&lt;/code> from &lt;code>phi&lt;/code> and correct its boundary conditions.&lt;/li>
&lt;li>&lt;strong>Report the interpolated velocity error&lt;/strong> — the drift between
&lt;code>fvc::flux(U)&lt;/code> and &lt;code>phi&lt;/code>; a mesh-quality diagnostic.&lt;/li>
&lt;li>&lt;strong>Solve the Euler pressure&lt;/strong> in its own non-orthogonal loop, if &lt;code>writep&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Update&lt;/strong> the dimensional pressure $p = p_\text{kin}\rho$.&lt;/li>
&lt;/ol>
&lt;p>A reference cell is required because an all-Neumann Laplacian is singular
($\Phi$ and $\Phi + C$ are both solutions). &lt;code>setReference&lt;/code> derives its keywords
from the field name, so the case dictionary uses &lt;code>PhiRefCell&lt;/code>/&lt;code>PhiRefValue&lt;/code> and
&lt;code>pKinRefCell&lt;/code>/&lt;code>pKinRefValue&lt;/code>.&lt;/p>
&lt;p>Steps 1–9 execute on every time step; the solve is not latched. Since the
solution is fully determined by the boundary conditions, additional steps
recompute the same answer unless a sibling region has perturbed &lt;code>U&lt;/code> or &lt;code>phi&lt;/code>
in the meantime — so restrict the run to one step unless you want that
re-establishment.&lt;/p>
&lt;h2 id="sub-models">Sub-Models&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Sub-model&lt;/th>
&lt;th>Selection mechanism&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Moving Reference Frame (MRF)&lt;/td>
&lt;td>&lt;code>constant/MRFProperties&lt;/code>&lt;/td>
&lt;td>&lt;code>IOMRFZoneList&lt;/code>; multiple zones supported&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Density&lt;/td>
&lt;td>&lt;code>constant/transportProperties&lt;/code>&lt;/td>
&lt;td>&lt;code>rho&lt;/code>, used only to form the dimensional &lt;code>p&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Turbulence&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Not supported; the model is inviscid&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>fvOptions&lt;/code>&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Not supported&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="required-fields">Required Fields&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>U&lt;/code>&lt;/td>
&lt;td>&lt;code>volVectorField&lt;/code>&lt;/td>
&lt;td>Velocity. Only its boundary conditions are used — the internal field is zeroed at construction.&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pKin&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Kinematic pressure $p/\rho$. Optional; BCs inferred from &lt;code>U&lt;/code> if absent.&lt;/td>
&lt;td>m²/s²&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Additionally created at runtime:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Condition&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>phi&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceScalarField&lt;/code>&lt;/td>
&lt;td>Face-normal flux, from &lt;code>fvc::flux(U)&lt;/code>&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Phi&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Velocity potential; BCs inferred from &lt;code>pKin&lt;/code> if absent&lt;/td>
&lt;td>always (written only if &lt;code>writePhi&lt;/code>)&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>Dimensional pressure $p_\text{kin}\rho$, for sibling regions&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Where &lt;code>pKin&lt;/code> and &lt;code>Phi&lt;/code> are not supplied, their boundary types are inferred by
inverting Dirichlet and Neumann at each step: &lt;code>pKin&lt;/code> is &lt;code>zeroGradient&lt;/code> wherever
&lt;code>U&lt;/code> fixes value and &lt;code>fixedValue&lt;/code> elsewhere; &lt;code>Phi&lt;/code> inverts that again. Supplying
&lt;code>0/U&lt;/code> alone is therefore sufficient.&lt;/p>
&lt;h2 id="case-setup">Case Setup&lt;/h2>
&lt;h3 id="required-dictionaries">Required dictionaries&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="n">constant&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">transportProperties&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">density&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">rho&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="n">required&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">read&lt;/span> &lt;span class="n">MUST_READ&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">Phi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">pKin&lt;/span> &lt;span class="n">linear&lt;/span> &lt;span class="n">solvers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">potentialFlow&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">fvSchemes&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">discretisation&lt;/span> &lt;span class="n">schemes&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Unlike stock &lt;code>potentialFoam&lt;/code>, &lt;code>constant/transportProperties&lt;/code> is mandatory:&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">rho 1000;
&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 (potentialFluid) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To initialise a field that another region then solves, list &lt;code>potentialFluid&lt;/code>
first so that it owns and constructs the shared fields:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">regions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ( fluid (potentialFluid pimpleFluid) )
&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 potentialFluid;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">endTime 1; // one step == one potential flow solve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">deltaT 1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">adjustTimeStep no; // getMinDeltaT() returns GREAT
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="key-fvsolution-settings">Key &lt;code>fvSolution&lt;/code> settings&lt;/h3>
&lt;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"> Phi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> solver GAMG;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> smoother DIC;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tolerance 1e-06;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relTol 0.01;
&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"> pKin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> $Phi;
&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">potentialFlow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nNonOrthogonalCorrectors 3;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> writePhi true;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> writep true;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Reference cells (closed domains)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> PhiRefCell 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> PhiRefValue 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pKinRefCell 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pKinRefValue 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="potentialflow-dictionary-entries">&lt;code>potentialFlow&lt;/code> dictionary entries&lt;/h3>
&lt;p>&lt;code>potentialFoam&lt;/code>&amp;rsquo;s command-line flags become optional dictionary entries, all
read as &lt;code>Foam::Switch&lt;/code> and defaulting to &lt;code>false&lt;/code>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Entry&lt;/th>
&lt;th>Upstream flag&lt;/th>
&lt;th>Effect&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>initialiseUBCs&lt;/code>&lt;/td>
&lt;td>&lt;code>-initialiseUBCs&lt;/code>&lt;/td>
&lt;td>Call &lt;code>U.correctBoundaryConditions()&lt;/code> and rebuild &lt;code>phi&lt;/code> before solving&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>writePhi&lt;/code>&lt;/td>
&lt;td>&lt;code>-writePhi&lt;/code>&lt;/td>
&lt;td>AUTO_WRITE the velocity potential &lt;code>Phi&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>writep&lt;/code>&lt;/td>
&lt;td>&lt;code>-writep&lt;/code>&lt;/td>
&lt;td>&lt;strong>Calculate&lt;/strong> the approximate Euler pressure; gates the calculation only&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Being &lt;code>Switch&lt;/code>-valued, each accepts any of &lt;code>true&lt;/code>/&lt;code>false&lt;/code>, &lt;code>yes&lt;/code>/&lt;code>no&lt;/code>,
&lt;code>on&lt;/code>/&lt;code>off&lt;/code> or &lt;code>none&lt;/code>/&lt;code>any&lt;/code>; the tutorials use &lt;code>true&lt;/code>/&lt;code>false&lt;/code>.&lt;/p>
&lt;p>Dropped: &lt;code>-pName&lt;/code> (the field is always &lt;code>pKin&lt;/code>), &lt;code>-withFunctionObjects&lt;/code>
(function objects run automatically), and &lt;code>-writephi&lt;/code> (&lt;code>phi&lt;/code> is always written).&lt;/p>
&lt;h2 id="coupling">Coupling&lt;/h2>
&lt;p>&lt;code>potentialFluid&lt;/code> implements no interface-specific behaviour: &lt;code>setCoupledEqns()&lt;/code>
is a no-op, it declares no &lt;code>selfCoupledFieldNames()&lt;/code>, and it takes no part in
DNA partitioned coupling.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Interface type&lt;/th>
&lt;th>Exchanged fields&lt;/th>
&lt;th>Coupling modes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;em>(none)&lt;/em>&lt;/td>
&lt;td>–&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Coupling is implicit, through the object registry: the fields it constructs
(&lt;code>U&lt;/code>, &lt;code>phi&lt;/code>, &lt;code>pKin&lt;/code>, &lt;code>p&lt;/code>) are visible by name to sibling regions on the same
mesh, which is what enables the initialiser role.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Re-solves every time step&lt;/strong> — the solve is not latched, but the solution is
fully determined by the boundary conditions, so a long &lt;code>endTime&lt;/code> repeats the
same computation. Limit the run to a single step in &lt;code>controlDict&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>writep false&lt;/code> writes a zero &lt;code>pKin&lt;/code> and &lt;code>p&lt;/code>&lt;/strong> — the Euler pressure is never
calculated, but both fields are AUTO_WRITE regardless.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial path&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>tutorials/singleRegion/potentialFluid/cylinder&lt;/code>&lt;/td>
&lt;td>Flow around a cylinder; includes a &lt;code>coded&lt;/code> function object computing the analytic solution and a relative-error field&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/singleRegion/potentialFluid/pitzDaily&lt;/code>&lt;/td>
&lt;td>Backward-facing step; smoke test, and a demonstration of the model&amp;rsquo;s limits (the real flow separates)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Both reproduce the corresponding &lt;code>$FOAM_TUTORIALS/basic/potentialFoam/&lt;/code> case
field-for-field, with &lt;code>0/p&lt;/code> renamed to &lt;code>0/pKin&lt;/code>, the command-line flags moved
into the &lt;code>potentialFlow&lt;/code> dict, and &lt;code>constant/transportProperties&lt;/code> added.&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;li>Batchelor, G.K., &lt;em>An Introduction to Fluid Dynamics&lt;/em>, CUP, 1967 — Ch. 6, irrotational flow theory.&lt;/li>
&lt;li>Upstream source: &lt;code>$FOAM_APP/solvers/basic/potentialFoam/&lt;/code>&lt;/li>
&lt;/ul></description></item></channel></rss>