<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>multiPhysicsFoam – Heat-Transfer</title><link>https://multiphysicsfoam.com/tags/heat-transfer/</link><description>Recent content in Heat-Transfer on multiPhysicsFoam</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://multiphysicsfoam.com/tags/heat-transfer/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: conductTemperature</title><link>https://multiphysicsfoam.com/docs/user-guide/region-physics/heat-transfer-models/conducttemperature/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/region-physics/heat-transfer-models/conducttemperature/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>conductTemperature&lt;/code> models transient heat conduction in a solid. It solves a
single energy equation for the temperature &lt;code>T&lt;/code>, using density &lt;code>rho&lt;/code>, specific
heat &lt;code>cv&lt;/code> and thermal conductivity &lt;code>kappa&lt;/code>. There is no velocity field, no
advection and no pressure-velocity coupling. It is meant to be the solid side
of a conjugate heat transfer problem, coupled to a fluid region (usually
&lt;code>pimpleFluid transportTemperature&lt;/code>) through a &lt;code>heatTransferInterface&lt;/code>. It can
also be stacked with a solid mechanics region type (e.g. &lt;code>solidStVK&lt;/code>) for
thermo-FSI.&lt;/p>
&lt;h2 id="governing-equations">Governing Equations&lt;/h2>
&lt;h3 id="energy-heat-conduction">Energy (heat conduction)&lt;/h3>
$$
\frac{\partial \left( \rho \, c_v \, T \right)}{\partial t}
= \nabla \cdot \left( \kappa \, \nabla T \right)
$$
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$T$&lt;/td>
&lt;td>Temperature&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\rho$&lt;/td>
&lt;td>Density&lt;/td>
&lt;td>kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$c_v$&lt;/td>
&lt;td>Specific heat capacity&lt;/td>
&lt;td>J/(kg K) = m²/(s² K)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa$&lt;/td>
&lt;td>Thermal conductivity&lt;/td>
&lt;td>W/(m K) = kg m/(s³ K)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The equation is assembled as&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="n">fvm&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">ddt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rho_&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">cv_&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">fvm&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">laplacian&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">kappa_&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="s">&amp;#34;laplacian(kappa,T)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>so &lt;code>fvSchemes&lt;/code> must provide a &lt;code>laplacian(kappa,T)&lt;/code> entry (or a &lt;code>default&lt;/code>
laplacian scheme). The equation has no source term.&lt;/p>
&lt;h2 id="numerical-algorithm">Numerical Algorithm&lt;/h2>
&lt;p>&lt;code>conductTemperature&lt;/code> does not run its own solve loop. &lt;code>usesPIMPLE()&lt;/code> returns
&lt;code>false&lt;/code>. &lt;code>solveRegion()&lt;/code>, &lt;code>prePredictor()&lt;/code>, &lt;code>momentumPredictor()&lt;/code>,
&lt;code>pressureCorrector()&lt;/code>, &lt;code>meshMotionCorrector()&lt;/code> and &lt;code>postSolve()&lt;/code> are all
no-ops. The temperature is solved only when &lt;code>multiRegionSystem&lt;/code> asks for it:&lt;/p>
&lt;ol>
&lt;li>The region does &lt;strong>not&lt;/strong> override &lt;code>selfCoupledFieldNames()&lt;/code>, so the base
default (an empty list) applies. &lt;code>T&lt;/code> is therefore solved &lt;strong>only&lt;/strong> when it
appears as a partitioned-coupled field, i.e. when the case has a
&lt;code>DNA { T { ... } }&lt;/code> entry in &lt;code>multiRegionProperties&lt;/code> and &lt;code>T&lt;/code> is listed in
&lt;code>coupledFields&lt;/code> of an interface in &lt;code>regionInterfaceProperties&lt;/code>.&lt;/li>
&lt;li>Inside each DNA coupling iteration,
&lt;code>multiRegionSystem::assembleAndSolveEqns&amp;lt;fvMatrix, scalar&amp;gt;(&amp;quot;T&amp;quot;)&lt;/code> calls
&lt;code>setCoupledEqns(&amp;quot;T&amp;quot;)&lt;/code>. This assembles the equation above and stores it
under the key &lt;code>T&amp;lt;regionName&amp;gt;MeshconductTemperatureTypeEqn&lt;/code>. The equation is
then relaxed (&lt;code>relaxationFactors&lt;/code> in &lt;code>fvSolution&lt;/code>) and solved. The region
Picard corrector (&lt;code>maxCorr&lt;/code> / &lt;code>relTol&lt;/code> / &lt;code>tolerance&lt;/code> per field in
&lt;code>fvSolution&lt;/code>) can re-assemble and re-solve it within one DNA iteration.
&lt;code>setCoupledEqns&lt;/code> ignores its &lt;code>fieldName&lt;/code> argument and always assembles the
&lt;code>T&lt;/code> equation.&lt;/li>
&lt;li>&lt;code>correct()&lt;/code> only calls &lt;code>kappa.correctBoundaryConditions()&lt;/code>.&lt;/li>
&lt;li>&lt;code>getMinDeltaT()&lt;/code> returns &lt;code>GREAT&lt;/code>, so this region never limits the global
time step.&lt;/li>
&lt;/ol>
&lt;h2 id="sub-models">Sub-Models&lt;/h2>
&lt;p>None. The region does not read &lt;code>fvOptions&lt;/code>, a thermophysical model or
turbulence. All material properties come from &lt;code>transportProperties&lt;/code> or from
optional field files.&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>Read mode&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>T&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>&lt;code>MUST_READ&lt;/code>, &lt;code>AUTO_WRITE&lt;/code>&lt;/td>
&lt;td>Temperature&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>kappa&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>&lt;code>READ_IF_PRESENT&lt;/code>, &lt;code>AUTO_WRITE&lt;/code>&lt;/td>
&lt;td>Thermal conductivity. If there is no file, a uniform field is created from &lt;code>transportProperties&lt;/code> with &lt;code>calculated&lt;/code> patches.&lt;/td>
&lt;td>W/(m K)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>rho&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>&lt;code>READ_IF_PRESENT&lt;/code>, &lt;code>NO_WRITE&lt;/code>&lt;/td>
&lt;td>Density. If there is no file, it is uniform from &lt;code>transportProperties&lt;/code>.&lt;/td>
&lt;td>kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>cv&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>&lt;code>READ_IF_PRESENT&lt;/code>, &lt;code>NO_WRITE&lt;/code>&lt;/td>
&lt;td>Specific heat. If there is no file, it is uniform from &lt;code>transportProperties&lt;/code>.&lt;/td>
&lt;td>m²/(s² K)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>T&lt;/code> and &lt;code>kappa&lt;/code> are created through &lt;code>lookupOrRead&lt;/code>. If a sibling region type
on the same mesh has already registered a field with that name, that field is
reused. &lt;code>rho&lt;/code> and &lt;code>cv&lt;/code> are always constructed by this region.&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">/&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">cv&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">kappa&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">all&lt;/span> &lt;span class="n">required&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dimensioned&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">T&lt;/span> &lt;span class="n">solver&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">ddt&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">laplacian&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">kappa&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">schemes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mi">0&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">T&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">temperature&lt;/span> &lt;span class="n">with&lt;/span> &lt;span class="n">coupled&lt;/span> &lt;span class="n">BC&lt;/span> &lt;span class="n">on&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">interface&lt;/span> &lt;span class="n">patch&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 (pimpleFluid transportTemperature) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ( solid (conductTemperature) )
&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">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"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxCoupleIter 20;
&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"> maxJumpRes 1e-07;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputJumpResField no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxFluxRes 1e-07;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputFluxResField no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&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="transportproperties">&lt;code>transportProperties&lt;/code>&lt;/h3>
&lt;p>All three entries are looked up as &lt;code>dimensionedScalar&lt;/code> and are required, even
when a field file overrides them:&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 rho [1 -3 0 0 0 0 0] 1.0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cv cv [0 2 -2 -1 0 0 0] 100.0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kappa kappa [1 1 -3 -1 0 0 0] 100.0;
&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"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> solver PCG;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> preconditioner DIC;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tolerance 1e-15;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relTol 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> minIter 2;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxIter 250;
&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">relaxationFactors
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> T 1.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="interface-boundary-condition-on-t">Interface boundary condition on &lt;code>T&lt;/code>&lt;/h3>
&lt;p>On the solid side of a partitioned &lt;code>heatTransferInterface&lt;/code> (flux side; the
fluid side then uses &lt;code>regionCoupledTemperatureJump&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">top
&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 regionCoupledHeatFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (heatTransferInterface);
&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 $internalField;
&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 coupled patch fields look up the diffusivity field &lt;code>kappa&lt;/code> by default (set
the patch keyword &lt;code>diffusivity&lt;/code> to use another name). This matches the field
that &lt;code>conductTemperature&lt;/code> registers.&lt;/p>
&lt;h2 id="coupling">Coupling&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Interface type&lt;/th>
&lt;th>Exchanged fields&lt;/th>
&lt;th>Coupling mode&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>heatTransferInterface&lt;/code>&lt;/td>
&lt;td>&lt;code>T&lt;/code> (temperature jump / heat flux via &lt;code>regionCoupledTemperatureJump&lt;/code> / &lt;code>regionCoupledHeatFlux&lt;/code>, using &lt;code>kappa&lt;/code>)&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>heatTransferInterface&lt;/code> only provides the &lt;code>jumpCoefficient&lt;/code> (from
&lt;code>heatTransferInterfaceCoeffs&lt;/code>). The patch fields do the actual transfer.
Monolithic coupling is commented out in &lt;code>multiRegionSystem::solve()&lt;/code>, so
only partitioned coupling is available at the moment.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Coupled use only.&lt;/strong> &lt;code>selfCoupledFieldNames()&lt;/code> is not overridden, so &lt;code>T&lt;/code>
is never solved unless it is DNA-coupled. A standalone (single-region)
&lt;code>conductTemperature&lt;/code> case does not advance &lt;code>T&lt;/code>. Use &lt;code>laplacianFluid&lt;/code> for
standalone conduction.&lt;/li>
&lt;li>&lt;strong>No source terms.&lt;/strong> &lt;code>fvOptions&lt;/code> are not read or applied.&lt;/li>
&lt;li>&lt;strong>Static mesh only.&lt;/strong> &lt;code>meshMotionCorrector()&lt;/code> is a no-op and the equation
contains no mesh-flux terms.&lt;/li>
&lt;li>&lt;strong>No time-step control.&lt;/strong> &lt;code>getMinDeltaT()&lt;/code> returns &lt;code>GREAT&lt;/code>; &lt;code>deltaT&lt;/code> must be
chosen by the user or limited by other regions.&lt;/li>
&lt;li>&lt;strong>Constant &lt;code>rho&lt;/code> and &lt;code>cv&lt;/code> in time.&lt;/strong> They are read once and never updated
(&lt;code>NO_WRITE&lt;/code>). Only &lt;code>kappa&lt;/code> gets a boundary refresh in &lt;code>correct()&lt;/code>, and its
values are never recomputed (for example as a function of &lt;code>T&lt;/code>).&lt;/li>
&lt;li>&lt;strong>No non-orthogonal corrector loop.&lt;/strong> The coupled solve path has no
&lt;code>correctNonOrthogonal()&lt;/code> loop, so &lt;code>nNonOrthogonalCorrectors&lt;/code> in
&lt;code>fvSolution&lt;/code> is not used by this region.&lt;/li>
&lt;li>&lt;strong>No output/post-processing.&lt;/strong> &lt;code>postSolve()&lt;/code> is a no-op. No derived fields
(e.g. heat flux) are written.&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/conjugateHeatTransfer/flowOverHeatedPlate&lt;/code>&lt;/td>
&lt;td>Flow over a heated plate (&lt;code>pimpleFluid transportTemperature&lt;/code> + &lt;code>conductTemperature&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/conjugateHeatTransfer/ShellAndTubeHeatExchanger&lt;/code>&lt;/td>
&lt;td>Shell-and-tube heat exchanger, two fluid regions + &lt;code>conductTemperature&lt;/code> solid&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Heated beam in cross-flow, thermo-FSI (&lt;code>solidStVK conductTemperature&lt;/code> solid)&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: heatTransferInterface</title><link>https://multiphysicsfoam.com/docs/user-guide/interface-physics/heattransferinterface/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/interface-physics/heattransferinterface/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>heatTransferInterface&lt;/code> couples the temperature field &lt;code>T&lt;/code> of two regions that
share an interface, usually a fluid (&lt;code>pimpleFluid transportTemperature&lt;/code>) and a
solid (&lt;code>conductTemperature&lt;/code>). It is used for conjugate heat transfer (CHT)
and, stacked with &lt;code>fsiInterface&lt;/code> on the same patch pair, for thermo-FSI. The
interface class itself holds only one parameter, the constant
&lt;code>jumpCoefficient&lt;/code>. All transfer work happens in the two partitioned boundary
conditions &lt;code>regionCoupledTemperatureJump&lt;/code> and &lt;code>regionCoupledHeatFlux&lt;/code>, which
are solved inside the DNA coupling loop of &lt;code>multiRegionSystem&lt;/code>.&lt;/p>
&lt;h2 id="interface-conditions">Interface Conditions&lt;/h2>
&lt;p>Let side $A$ carry the &lt;code>regionCoupledTemperatureJump&lt;/code> BC (Dirichlet side) and
side $B$ carry the &lt;code>regionCoupledHeatFlux&lt;/code> BC (Neumann side). These sides are
set by the BC types in &lt;code>0/&amp;lt;region&amp;gt;/T&lt;/code>. They do not depend on the order in
&lt;code>coupledPatchPair&lt;/code>.&lt;/p>
&lt;h3 id="jump-condition">Jump condition&lt;/h3>
$$
T_A = c \, T_B \quad \text{on } \Gamma
$$
&lt;p>In the code, the jump BC sets its value to
$T_B + \texttt{valueJump}$ with $\texttt{valueJump} = T_B\,(c - 1)$, where
$T_B$ is the neighbour patch value interpolated onto side $A$. With the
default tutorial value $c = 1$ this is plain temperature continuity.&lt;/p>
&lt;h3 id="flux-condition">Flux condition&lt;/h3>
$$
\kappa_A \nabla T_A \cdot \mathbf{n}_A + \kappa_B \nabla T_B \cdot \mathbf{n}_B = 0 \quad \text{on } \Gamma
$$
&lt;p>The flux BC sets its gradient to&lt;/p>
$$
\left.\frac{\partial T}{\partial n}\right|_B = -\frac{\left(\kappa_A \, \partial_n T_A\right)_{A \to B}}{\kappa_B}
$$
&lt;p>where $\left(\kappa_A \, \partial_n T_A\right)_{A \to B}$ is the flux of the jump side
(&lt;code>flux()&lt;/code> = &lt;code>snGrad() * kappa&lt;/code>), interpolated onto side $B$. The flux
jump of &lt;code>regionCoupledHeatFlux&lt;/code> is always zero (&lt;code>fluxJump()&lt;/code> returns &lt;code>*this * 0&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>$T$&lt;/td>
&lt;td>Temperature (coupled field)&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$c$&lt;/td>
&lt;td>&lt;code>jumpCoefficient&lt;/code> (dimensionless, uniform, constant)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa$&lt;/td>
&lt;td>Diffusivity looked up by the BC (default field name &lt;code>kappa&lt;/code>)&lt;/td>
&lt;td>W/(m K) (see note below)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}_A, \mathbf{n}_B$&lt;/td>
&lt;td>Outward patch normals of side $A$ / $B$&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\Gamma$&lt;/td>
&lt;td>Interface (coupled patch pair)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The flux balance only means energy conservation when $\kappa$ has the same
units on both sides. The code does not check this; see Known Limitations.&lt;/p>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;code>heatTransferInterface&lt;/code> derives from &lt;code>regionInterfaceType&lt;/code> and is registered in
its &lt;code>IOdictionary&lt;/code> run-time selection table. At run time:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Construction&lt;/strong> (&lt;code>regionInterfaceType&lt;/code> base): the object is named
&lt;code>&amp;lt;regionA&amp;gt;&amp;lt;PatchA&amp;gt;&amp;lt;RegionB&amp;gt;&amp;lt;PatchB&amp;gt;HeatTransferInterface&lt;/code>, for example
&lt;code>fluidInterfaceSolidTopHeatTransferInterface&lt;/code>. The base class builds global
patches for both sides and creates the interface-to-interface mapping
immediately (&lt;code>interfaceTransferMethod&lt;/code>, default &lt;code>AMI&lt;/code>; see Case Setup).
&lt;code>heatTransferInterface&lt;/code> then reads
&lt;code>heatTransferInterfaceCoeffs/jumpCoefficient&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>correct()&lt;/code>&lt;/strong>: no-op. It is called from &lt;code>regionInterfaceType::update()&lt;/code>,
which each coupled BC calls in &lt;code>updateCoeffs()&lt;/code>. Because
&lt;code>heatTransferInterface&lt;/code> creates no &lt;code>faMesh&lt;/code>, &lt;code>update()&lt;/code> does no curvature work.&lt;/li>
&lt;li>&lt;strong>&lt;code>getMinDeltaT()&lt;/code>&lt;/strong>: returns &lt;code>GREAT&lt;/code>. The interface never limits the time
step.&lt;/li>
&lt;li>&lt;strong>&lt;code>info()&lt;/code>&lt;/strong>: empty.&lt;/li>
&lt;li>&lt;strong>Mapping update&lt;/strong>: when the interface reports &lt;code>changing()&lt;/code>,
&lt;code>regionInterfaceTypeList::update()&lt;/code> calls
&lt;code>updateInterpolatorAndGlobalPatches()&lt;/code>. The mapping and global patches are
rebuilt every &lt;code>interpolatorUpdateFrequency&lt;/code> time steps (&lt;code>0&lt;/code> disables this).&lt;/li>
&lt;li>&lt;strong>Boundary conditions&lt;/strong> (in each DNA iteration, when &lt;code>T&lt;/code> is assembled and
solved by &lt;code>multiRegionSystem&lt;/code>):
&lt;ul>
&lt;li>&lt;code>regionCoupledTemperatureJump::updateCoeffs()&lt;/code> looks up the neighbour &lt;code>T&lt;/code>,
interpolates its patch values, adds &lt;code>valueJump()&lt;/code>, applies the
acceleration model (&lt;code>accType&lt;/code>, &lt;code>relax&lt;/code>) and fixes the value.&lt;/li>
&lt;li>&lt;code>regionCoupledHeatFlux::updateCoeffs()&lt;/code> asks the neighbour
jump BC for &lt;code>flux()&lt;/code>, interpolates it, negates it, divides it by the local
&lt;code>kappa&lt;/code>, applies the acceleration model and fixes the gradient.&lt;/li>
&lt;li>&lt;code>regionCoupledTemperatureJump&lt;/code> looks up the interface found through its
own &lt;code>interfaceType&lt;/code> entry as a &lt;code>heatTransferInterface&lt;/code> (to read
&lt;code>jumpCoefficient&lt;/code>) and stops with a &lt;code>FatalError&lt;/code> if it is another type.
&lt;code>regionCoupledHeatFlux&lt;/code> defines the same check but never calls it.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Residuals&lt;/strong>: the DNA loop evaluates the jump residual
$|T_A - T_B - \texttt{valueJump}|$ and the flux residual
$|q_B + q_{A\to B} - 0|$ through the generic jump/flux BCs. These are checked
against &lt;code>maxJumpRes&lt;/code> / &lt;code>maxFluxRes&lt;/code>.&lt;/li>
&lt;/ol>
&lt;h3 id="diffusivity-lookup">Diffusivity lookup&lt;/h3>
&lt;p>&lt;code>regionCoupledTemperatureJump&lt;/code> and &lt;code>regionCoupledHeatFlux&lt;/code> override
&lt;code>diffusivityName()&lt;/code>. It returns the patch keyword &lt;code>diffusivity&lt;/code> if that is
set, otherwise &lt;code>kappa&lt;/code>. &lt;code>diffCoeff()&lt;/code> then:&lt;/p>
&lt;ol>
&lt;li>uses the patch values of the &lt;code>volScalarField&lt;/code> with that name, if one is
registered on the region mesh;&lt;/li>
&lt;li>otherwise reads a uniform &lt;code>dimensionedScalar&lt;/code> with that name from the
region&amp;rsquo;s &lt;code>transportProperties&lt;/code> (the dictionary must be registered on the mesh).&lt;/li>
&lt;/ol>
&lt;h2 id="coupled-fields">Coupled Fields&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Required boundary conditions (side A / side B)&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>T&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledTemperatureJump&lt;/code> / &lt;code>regionCoupledHeatFlux&lt;/code>&lt;/td>
&lt;td>Temperature. Value continuity (×&lt;code>jumpCoefficient&lt;/code>) on the jump side, heat-flux continuity on the flux side.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Fields needed but not created by the interface:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Where it must exist&lt;/th>
&lt;th>Source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>T&lt;/code>&lt;/td>
&lt;td>both regions, same name&lt;/td>
&lt;td>region type (e.g. &lt;code>transportTemperature&lt;/code>, &lt;code>conductTemperature&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>kappa&lt;/code> (or the name given by &lt;code>diffusivity&lt;/code>)&lt;/td>
&lt;td>both regions, as &lt;code>volScalarField&lt;/code> or as a &lt;code>transportProperties&lt;/code> entry&lt;/td>
&lt;td>region type or &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The interface creates no fields. The BC keyword &lt;code>neighbourFieldName&lt;/code> is read
and written by &lt;code>interfaceToInterfaceCoupleManager&lt;/code>, but the jump/flux BCs always
look up the neighbour field by the local field name.&lt;/p>
&lt;h2 id="compatible-region-types">Compatible Region Types&lt;/h2>
&lt;p>The region types below assemble a &lt;code>T&lt;/code> equation in &lt;code>setCoupledEqns&lt;/code> and/or
register a diffusivity the BCs can find. Rows marked &lt;em>tutorial&lt;/em> are run in
the shipped tutorials. The other rows follow from the code and are untested.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Region type (side A)&lt;/th>
&lt;th>Region type (side B)&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>pimpleFluid transportTemperature&lt;/code>&lt;/td>
&lt;td>&lt;code>conductTemperature&lt;/code>&lt;/td>
&lt;td>&lt;em>Tutorial&lt;/em> (&lt;code>flowOverHeatedPlate&lt;/code>, &lt;code>ShellAndTubeHeatExchanger&lt;/code>). Both register &lt;code>kappa&lt;/code> (W/(m K)). Fluid takes the jump BC, solid the flux BC.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pimpleFluid transportTemperature&lt;/code>&lt;/td>
&lt;td>&lt;code>solidStVK conductTemperature&lt;/code>&lt;/td>
&lt;td>&lt;em>Tutorial&lt;/em> (&lt;code>heatedBeamInCrossFlow&lt;/code>), with &lt;code>fsiInterface&lt;/code> on the same patch pair. &lt;code>T&lt;/code>/&lt;code>kappa&lt;/code> come from &lt;code>conductTemperature&lt;/code>, not &lt;code>solidStVK&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>rhoPimpleFluid&lt;/code>&lt;/td>
&lt;td>&lt;code>conductTemperature&lt;/code>&lt;/td>
&lt;td>Untested. &lt;code>rhoPimpleFluid&lt;/code> registers &lt;code>kappa&lt;/code> from &lt;code>turbulence-&amp;gt;kappaEff()&lt;/code> and assembles a &lt;code>T&lt;/code> equation in &lt;code>setCoupledEqns&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>laplacianFluid&lt;/code>&lt;/td>
&lt;td>any of the above&lt;/td>
&lt;td>Untested. &lt;code>laplacianFluid&lt;/code> registers &lt;code>DT&lt;/code> (m²/s), not &lt;code>kappa&lt;/code>. Set &lt;code>diffusivity DT;&lt;/code> on its patch, or provide &lt;code>kappa&lt;/code> in its &lt;code>transportProperties&lt;/code>. Mixing &lt;code>DT&lt;/code> with a &lt;code>kappa&lt;/code> in W/(m K) breaks flux consistency.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>conductPotentialTemperature&lt;/code>&lt;/td>
&lt;td>any of the above&lt;/td>
&lt;td>Untested. The conductivity is a &lt;code>dimensionedScalar&lt;/code> &lt;code>k&lt;/code> in &lt;code>transportProperties&lt;/code> (not a field). Set &lt;code>diffusivity k;&lt;/code> so the fallback lookup finds it.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>See &lt;code>docs/regions/conductTemperature.md&lt;/code>, &lt;code>docs/regions/transportTemperature.md&lt;/code>,
&lt;code>docs/regions/pimpleFluid.md&lt;/code>, &lt;code>docs/regions/rhoPimpleFluid.md&lt;/code>,
&lt;code>docs/regions/solidStVK.md&lt;/code>, &lt;code>docs/regions/laplacianFluid.md&lt;/code> and
&lt;code>docs/regions/conductPotentialTemperature.md&lt;/code>.&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/conjugateHeatTransfer/flowOverHeatedPlate/constant/regionInterfacePropertiesPartitioned&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"> fluidsolid
&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 (heatTransferInterface);
&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"> (fluid interface)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (solid top)
&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"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> );
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> heatTransferInterfaceCoeffs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Jump coefficient
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> jumpCoefficient jumpCoefficient [ 0 0 0 0 0 0 0 ] 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">);
&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">
&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 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">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;p>Thermo-FSI stacks both interface types on one patch pair
(&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow/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">fluidsolid
&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 (fsiInterface heatTransferInterface);
&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"> (fluid interfaceShadow)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (solid 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"> 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"> D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> );
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> coupled yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> fsiInterfaceCoeffs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> heatTransferInterfaceCoeffs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Jump coefficient
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> jumpCoefficient jumpCoefficient [ 0 0 0 0 0 0 0 ] 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;/code>&lt;/pre>&lt;/div>&lt;h4 id="keywords">Keywords&lt;/h4>
&lt;p>Per-interface entry (inside &lt;code>partitionedCoupledPatches&lt;/code>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Read by&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>interfaceType&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;td>&lt;code>regionInterfaceTypeList&lt;/code>&lt;/td>
&lt;td>List of interface types; one object is created per entry.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>coupledPatchPair&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;td>&lt;code>regionInterfaceTypeList&lt;/code>&lt;/td>
&lt;td>&lt;code>((regionA patchA) (regionB patchB))&lt;/code>; must have exactly two entries.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>coupledFields&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;td>&lt;code>regionInterfaceTypeList&lt;/code>&lt;/td>
&lt;td>Fields coupled across this interface (&lt;code>T&lt;/code>).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>heatTransferInterfaceCoeffs&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;td>&lt;code>heatTransferInterface&lt;/code>&lt;/td>
&lt;td>Sub-dictionary; &lt;code>subDict&lt;/code> fails if it is missing.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>heatTransferInterfaceCoeffs/jumpCoefficient&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>– (no default in code)&lt;/td>
&lt;td>&lt;code>heatTransferInterface&lt;/code>&lt;/td>
&lt;td>Dimensionless &lt;code>dimensionedScalar&lt;/code> $c$, with $T_A = c\,T_B$.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>coupled&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>true&lt;/code>&lt;/td>
&lt;td>&lt;code>regionInterfaceType&lt;/code>&lt;/td>
&lt;td>Turns the coupling on/off. When off, the coupled BCs skip &lt;code>updateCoeffs()&lt;/code> and the residuals are zero.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingStartTime&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;td>&lt;code>regionInterfaceType&lt;/code>&lt;/td>
&lt;td>If &lt;code>&amp;gt; 0&lt;/code> and &lt;code>coupled&lt;/code> is off, coupling is turned on once &lt;code>time &amp;gt;= couplingStartTime&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Top-level entries (shared by all interfaces in the file):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>interfaceTransferMethod&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>AMI&lt;/code>&lt;/td>
&lt;td>Patch-to-patch mapping: &lt;code>AMI&lt;/code> or &lt;code>directMap&lt;/code> (&lt;code>RBF&lt;/code> is not compiled; it needs Eigen).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>&amp;lt;interfaceTransferMethod&amp;gt;Coeffs&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;td>Must exist (&lt;code>subDict&lt;/code>), even when empty. Neither &lt;code>AMI&lt;/code> nor &lt;code>directMap&lt;/code> reads any entries from it.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interpolatorUpdateFrequency&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>1&lt;/code>&lt;/td>
&lt;td>Rebuild period (in time steps) of the mapping for changing interfaces; &lt;code>0&lt;/code> = never.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>curvatureCorrectedSurfacePatches&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;td>Read by the base class for every interface type; use &lt;code>0()&lt;/code> for heat transfer.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="multiregionproperties-dna-entry">&lt;code>multiRegionProperties&lt;/code> DNA entry&lt;/h3>
&lt;p>From &lt;code>tutorials/conjugateHeatTransfer/flowOverHeatedPlate/constant/multiRegionProperties&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">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 (pimpleFluid transportTemperature) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (solid (conductTemperature) )
&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">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"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxCoupleIter 20;
&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"> maxJumpRes 1e-07;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputJumpResField no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxFluxRes 1e-07;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputFluxResField no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&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>Jump side, fluid
(&lt;code>tutorials/conjugateHeatTransfer/flowOverHeatedPlate/0/fluid/orig/partitioned/T&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 regionCoupledTemperatureJump;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (heatTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> accType aitken;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relax 0.75;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&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 $internalField;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Flux side, solid
(&lt;code>tutorials/conjugateHeatTransfer/flowOverHeatedPlate/0/solid/orig/partitioned/T&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">top
&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 regionCoupledHeatFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (heatTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&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 $internalField;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Patch keywords common to both BCs:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>interfaceType&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;td>Interface type list. Only the &lt;strong>first&lt;/strong> entry is used to find the interface (matched by type plus local region/patch), so &lt;code>heatTransferInterface&lt;/code> must come first.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>kappa&lt;/code>&lt;/td>
&lt;td>Name of the diffusivity field / &lt;code>transportProperties&lt;/code> entry.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code> (with a warning)&lt;/td>
&lt;td>Acceleration model: &lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code>, &lt;code>IQNILS&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;td>Initial relaxation factor of the acceleration model.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction of the coupled &lt;code>snGrad&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;td>Second-order correction of the coupled &lt;code>snGrad&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name&lt;/td>
&lt;td>Read and written, but not used by these two BCs (see above).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>–&lt;/td>
&lt;td>–&lt;/td>
&lt;td>Initial patch value.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The tutorials put the jump BC on the fluid side and the flux BC on the solid
side. The opposite assignment is not forbidden by the code, but the flux BC
&lt;code>refCast&lt;/code>s the neighbour patch field to &lt;code>genericRegionCoupledJumpFvPatchField&lt;/code>,
so the two sides must use one jump BC and one flux BC.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Partitioned only.&lt;/strong> The monolithic solve in &lt;code>multiRegionSystem::solve()&lt;/code>
is commented out (&amp;ldquo;need to be ported&amp;rdquo;). The &lt;code>*Monolithic&lt;/code> variants of
&lt;code>flowOverHeatedPlate&lt;/code> and &lt;code>ShellAndTubeHeatExchanger&lt;/code> (BCs
&lt;code>monolithicTemperature&lt;/code>, &lt;code>monolithicThermalDiffusivitySlave&lt;/code>) are compiled
but do not drive a monolithic solve at present.&lt;/li>
&lt;li>&lt;strong>Constant, uniform jump coefficient.&lt;/strong> &lt;code>jumpCoefficient&lt;/code> is a single
&lt;code>dimensionedScalar&lt;/code>, read once. It cannot vary in space or time. The
generic jump BC&amp;rsquo;s &lt;code>jumpCoefficient&lt;/code> patch keyword (field lookup) is not used
by &lt;code>regionCoupledTemperatureJump&lt;/code>, which overrides &lt;code>valueJump()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>No interface physics.&lt;/strong> &lt;code>correct()&lt;/code> and &lt;code>info()&lt;/code> are empty, and
&lt;code>getMinDeltaT()&lt;/code> returns &lt;code>GREAT&lt;/code>. There is no contact resistance, no
radiation and no interfacial heat source (&lt;code>fluxJump()&lt;/code> is always zero).&lt;/li>
&lt;li>&lt;strong>No unit/consistency check on the diffusivity.&lt;/strong> The flux balance uses
whatever field the &lt;code>diffusivity&lt;/code> name resolves to on each side. For
example, &lt;code>laplacianFluid&lt;/code> provides &lt;code>DT&lt;/code> in m²/s, while &lt;code>conductTemperature&lt;/code>
provides &lt;code>kappa&lt;/code> in W/(m K). Mixing them silently gives a non-conservative
coupling (inferred from the code).&lt;/li>
&lt;li>&lt;strong>Missing diffusivity is a fatal error.&lt;/strong> If neither a &lt;code>kappa&lt;/code> field nor a
&lt;code>kappa&lt;/code> entry in the region&amp;rsquo;s &lt;code>transportProperties&lt;/code> exists, the lookup in
&lt;code>diffCoeff()&lt;/code> stops the run.&lt;/li>
&lt;li>&lt;strong>Same patch names on both sides (inferred, untested).&lt;/strong>
&lt;code>interfaceToInterfaceCoupleManager::nbrMesh()/nbrPatch()&lt;/code> and
&lt;code>interpolateFromNbrField()&lt;/code> decide the side by comparing &lt;strong>patch names only&lt;/strong>
with &lt;code>patchA&lt;/code>. If both coupled patches have the same name in their regions
(e.g. &lt;code>interface&lt;/code>/&lt;code>interface&lt;/code>), side B would resolve itself as its own
neighbour. All shipped tutorials use different names.&lt;/li>
&lt;li>&lt;strong>&lt;code>interfaceTransferMethod&lt;/code> is global.&lt;/strong> It and its &lt;code>Coeffs&lt;/code> sub-dictionary
are read from the top level of &lt;code>regionInterfaceProperties&lt;/code>, so all
interfaces in a case share one mapping method.&lt;/li>
&lt;li>&lt;strong>&lt;code>neighbourFieldName&lt;/code> has no effect&lt;/strong> on &lt;code>regionCoupledTemperatureJump&lt;/code> /
&lt;code>regionCoupledHeatFlux&lt;/code>. The neighbour field is always looked up by the
local field name.&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/conjugateHeatTransfer/flowOverHeatedPlate&lt;/code>&lt;/td>
&lt;td>Laminar flow over a heated plate: &lt;code>fluid (pimpleFluid transportTemperature)&lt;/code> / &lt;code>solid (conductTemperature)&lt;/code>, &lt;code>directMap&lt;/code> transfer. Partitioned (&lt;code>-p&lt;/code>) and monolithic (&lt;code>-m&lt;/code>) dictionaries are provided.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/conjugateHeatTransfer/ShellAndTubeHeatExchanger&lt;/code>&lt;/td>
&lt;td>Two fluid regions (&lt;code>inner&lt;/code>, &lt;code>outer&lt;/code>) coupled to one &lt;code>solid&lt;/code> through two &lt;code>heatTransferInterface&lt;/code>s, &lt;code>AMI&lt;/code> transfer, &lt;code>nonOrthCorr true&lt;/code>. Partitioned and monolithic dictionaries are provided.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Thermo-FSI: &lt;code>heatTransferInterface&lt;/code> stacked with &lt;code>fsiInterface&lt;/code> on one patch pair (&lt;code>solidStVK conductTemperature&lt;/code> solid), &lt;code>directMap&lt;/code> transfer.&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: laplacianFluid</title><link>https://multiphysicsfoam.com/docs/user-guide/region-physics/heat-transfer-models/laplacianfluid/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/region-physics/heat-transfer-models/laplacianfluid/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>laplacianFluid&lt;/code> solves the transient diffusion equation for a scalar field
&lt;code>T&lt;/code> on a &lt;strong>static&lt;/strong> mesh. It is a direct port of the stock OpenFOAM
&lt;code>laplacianFoam&lt;/code> solver into the &lt;code>regionType&lt;/code> framework: no velocity field, no
pressure-velocity coupling, and no mesh motion are involved — only a single
diffusion equation with a constant or field diffusivity &lt;code>DT&lt;/code>. Despite the
name &lt;code>T&lt;/code>, the field is a generic passive scalar and can represent temperature
or any other diffusing quantity. It is suitable as a lightweight standalone
conduction region, or as one side of a multi-region coupling where only
diffusive transport of a scalar is required.&lt;/p>
&lt;h2 id="governing-equations">Governing Equations&lt;/h2>
&lt;h3 id="diffusion">Diffusion&lt;/h3>
$$
\frac{\partial T}{\partial t} - \nabla \cdot \left( D_T \, \nabla T \right) = S_T
$$
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$T$&lt;/td>
&lt;td>Transported scalar (e.g. temperature)&lt;/td>
&lt;td>K (or scalar-dependent)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$D_T$&lt;/td>
&lt;td>Diffusivity&lt;/td>
&lt;td>m²/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$S_T$&lt;/td>
&lt;td>Source term (from &lt;code>fvOptions&lt;/code>)&lt;/td>
&lt;td>[T]/s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>There is no continuity or momentum equation — &lt;code>laplacianFluid&lt;/code> has no velocity
field and does not support advection.&lt;/p>
&lt;h2 id="numerical-algorithm">Numerical Algorithm&lt;/h2>
&lt;p>&lt;code>laplacianFluid&lt;/code> does not run its own outer solve loop. &lt;code>usesPIMPLE()&lt;/code> returns
&lt;code>false&lt;/code>, and &lt;code>solveRegion()&lt;/code>, &lt;code>prePredictor()&lt;/code>, &lt;code>momentumPredictor()&lt;/code>,
&lt;code>pressureCorrector()&lt;/code>, and &lt;code>meshMotionCorrector()&lt;/code> are all no-ops. Instead:&lt;/p>
&lt;ol>
&lt;li>&lt;code>setCoupledEqns(&amp;quot;T&amp;quot;)&lt;/code> assembles the diffusion equation as an
&lt;code>fvScalarMatrix&lt;/code> and registers it with &lt;code>multiRegionSystem&lt;/code>.&lt;/li>
&lt;li>The equation is solved through the standard coupled-matrix path
(&lt;code>multiRegionSystem::assembleAndSolveEqns&amp;lt;scalar&amp;gt;(&amp;quot;T&amp;quot;)&lt;/code>), the same
mechanism used for DNA-coupled partitioned fields.&lt;/li>
&lt;li>&lt;code>getMinDeltaT()&lt;/code> returns &lt;code>GREAT&lt;/code>, i.e. this region never constrains the
global time step — &lt;code>deltaT&lt;/code> must be set explicitly (no diffusion-number
based adjustable time-stepping is implemented).&lt;/li>
&lt;li>On write steps only, &lt;code>postSolve()&lt;/code> recomputes the derived output fields
&lt;code>gradTx&lt;/code>, &lt;code>gradTy&lt;/code>, &lt;code>gradTz&lt;/code>, and &lt;code>DTgradT = DT * grad(T)&lt;/code> if
&lt;code>writeGradT&lt;/code> is enabled (mirrors &lt;code>laplacianFoam&lt;/code>&amp;rsquo;s &lt;code>write.H&lt;/code>).&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Non-orthogonal correction caveat:&lt;/strong> stock &lt;code>laplacianFoam&lt;/code> wraps its solve in
a &lt;code>while (simple.correctNonOrthogonal())&lt;/code> loop. The coupled-matrix solve path
used here has no equivalent non-orthogonal corrector loop, so results will
differ from &lt;code>laplacianFoam&lt;/code> on non-orthogonal meshes. The closest substitute
is the region&amp;rsquo;s Picard corrector (&lt;code>maxCorr&lt;/code> / &lt;code>convergenceTolerance&lt;/code> in
&lt;code>fvSolution&lt;/code>), which re-invokes &lt;code>setCoupledEqns()&lt;/code> per iteration.&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>&lt;code>fvOptions&lt;/code>&lt;/td>
&lt;td>&lt;code>system/fvOptions&lt;/code>&lt;/td>
&lt;td>Explicit/implicit source terms for &lt;code>T&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>No turbulence, transport-model, or MRF sub-models are used.&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>T&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Transported scalar&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DT&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Diffusivity — read if present, otherwise created uniform from &lt;code>transportProperties&lt;/code>&lt;/td>
&lt;td>m²/s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Additionally created at runtime if &lt;code>writeGradT&lt;/code> is enabled (default &lt;code>true&lt;/code>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>gradTx&lt;/code>, &lt;code>gradTy&lt;/code>, &lt;code>gradTz&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Components of $\nabla T$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DTgradT&lt;/code>&lt;/td>
&lt;td>&lt;code>volVectorField&lt;/code>&lt;/td>
&lt;td>Diffusive flux $D_T \nabla T$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="case-setup">Case Setup&lt;/h2>
&lt;h3 id="required-dictionaries">Required dictionaries&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="n">constant&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">transportProperties&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">diffusivity&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">DT&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">no&lt;/span> &lt;span class="n">DT&lt;/span> &lt;span class="n">field&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="n">supplied&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">T&lt;/span> &lt;span class="n">solver&lt;/span> &lt;span class="n">settings&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SIMPLE&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">writeGradT&lt;/span> &lt;span class="n">flag&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;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"> ( scalarRegion (laplacianFluid) )
&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 laplacianFluid;
&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"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> solver PCG;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> preconditioner 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;
&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">SIMPLE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> writeGradT true; // write grad(T) components and DT*grad(T) at write time
&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="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">DT 4e-05; // uniform diffusivity, used if no DT field is present
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="coupling">Coupling&lt;/h2>
&lt;p>&lt;code>laplacianFluid&lt;/code> exposes &lt;code>T&lt;/code> via &lt;code>selfCoupledFieldNames()&lt;/code>, so it is solved
standalone and can also participate as a pure-diffusion side in multi-region
interfaces (unlike &lt;code>conductTemperature&lt;/code>, whose &lt;code>T&lt;/code> is only solved through
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;code>heatTransferInterface&lt;/code>&lt;/td>
&lt;td>&lt;code>T&lt;/code>, heat flux &lt;code>q&lt;/code>&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>defaultInterface&lt;/code>&lt;/td>
&lt;td>&lt;code>T&lt;/code>&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Static mesh only&lt;/strong> — &lt;code>meshMotionCorrector()&lt;/code> is a no-op; moving/deforming
meshes are not supported.&lt;/li>
&lt;li>&lt;strong>No non-orthogonal corrector loop&lt;/strong> — unlike &lt;code>laplacianFoam&lt;/code>, the coupled
solve path used here does not iterate over non-orthogonal correctors within
a single time step; see the numerical algorithm note above for the
workaround.&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/laplacianFluid/flange&lt;/code>&lt;/td>
&lt;td>Classic OpenFOAM &amp;ldquo;flange&amp;rdquo; thermal conduction case (single-region, fixed time step)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Alkfri, A., Habes, C., Marschall, H., &lt;em>multiRegionFoam: A Unified Multiphysics Framework for Multi-Region Coupled Continuum-Physical Problems&lt;/em>, Engineering with Computers, 2023.
DOI: &lt;a href="https://doi.org/10.1007/s00366-024-01974-4">10.1007/s00366-024-01974-4&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Docs: regionCoupledHeatFlux</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledheatflux/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledheatflux/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledHeatFlux&lt;/code> is the flux side (Neumann side) of the temperature
coupling used with &lt;code>heatTransferInterface&lt;/code> for conjugate heat transfer and
thermo-FSI. It derives from &lt;code>genericRegionCoupledFlux&amp;lt;scalar&amp;gt;&lt;/code> (and so from
&lt;code>fixedGradient&lt;/code>). It fixes the normal temperature gradient so that the local
conductive heat flux is equal and opposite to the heat flux of the
value-side partner on the neighbour region, without an interfacial source.
The partner must be a &lt;code>genericRegionCoupledJump&amp;lt;scalar&amp;gt;&lt;/code>-derived BC, in
practice &lt;code>regionCoupledTemperatureJump&lt;/code>. Unlike its partner, this BC does
&lt;strong>not&lt;/strong> check the interface type (see Implementation).&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>Let $B$ be this patch and $A$ the neighbour (jump-side) patch:&lt;/p>
$$
\kappa_A \frac{\partial T_A}{\partial n_A} + \kappa_B \frac{\partial T_B}{\partial n_B} = 0
\quad \text{on } \Gamma
$$
&lt;p>imposed as the gradient&lt;/p>
$$
\left.\frac{\partial T_B}{\partial n}\right|_b
= -\frac{\mathcal{I}_{A\to B}\!\left(\kappa_A\, \partial_n T_A\right)}{\kappa_B}
$$
&lt;p>followed by relaxation with the acceleration model. &lt;code>fluxJump()&lt;/code> returns zero.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$T$&lt;/td>
&lt;td>Temperature (field &lt;code>T&lt;/code> in both regions)&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa_B$&lt;/td>
&lt;td>Diffusivity named by &lt;code>diffusivity&lt;/code>, default &lt;code>kappa&lt;/code>&lt;/td>
&lt;td>W/(m K)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa_A\,\partial_n T_A$&lt;/td>
&lt;td>&lt;code>flux()&lt;/code> of the jump-side partner&lt;/td>
&lt;td>W/m²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathcal{I}_{A\to B}$&lt;/td>
&lt;td>Interface-to-interface interpolation&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>Run-time work is inherited from &lt;code>genericRegionCoupledFlux&amp;lt;scalar&amp;gt;&lt;/code> (see
there). The class adds:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>fluxJump()&lt;/code>&lt;/strong>: returns a zero field.&lt;/li>
&lt;li>&lt;strong>&lt;code>diffusivityName()&lt;/code>&lt;/strong>: the &lt;code>diffusivity&lt;/code> keyword if set, otherwise
&lt;code>kappa&lt;/code>. &lt;code>diffCoeff()&lt;/code> uses a &lt;code>volScalarField&lt;/code> with that name on the local
region if one is registered, otherwise a uniform &lt;code>dimensionedScalar&lt;/code> from
the region&amp;rsquo;s &lt;code>transportProperties&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>heatTransInterface()&lt;/code>&lt;/strong>: a type check plus cast to
&lt;code>heatTransferInterface&lt;/code>, as in &lt;code>regionCoupledTemperatureJump&lt;/code>. It is
declared and defined but &lt;strong>never called&lt;/strong>, so the BC accepts any interface
type listed first in &lt;code>interfaceType&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>Per DNA iteration of &lt;code>T&lt;/code>, &lt;code>updateCoeffs()&lt;/code> updates the interface,
&lt;code>refCast&lt;/code>s the neighbour &lt;code>T&lt;/code> patch field to
&lt;code>genericRegionCoupledJumpFvPatchField&amp;lt;scalar&amp;gt;&lt;/code>, interpolates and negates its
&lt;code>flux()&lt;/code>, divides by the local $\kappa$, relaxes the gradient and fixes it.
&lt;code>evaluate()&lt;/code> sets the patch temperature from the gradient (with the optional
non-orthogonal and second-order corrections). The flux residual
$|\kappa_B g_B + \mathcal{I}(q_A)|$ is checked against &lt;code>maxFluxRes&lt;/code>.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledHeatFlux&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>Interface type list; the first entry selects the interface (normally &lt;code>heatTransferInterface&lt;/code>; not checked)&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Name of the thermal conductivity field / &lt;code>transportProperties&lt;/code> entry&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>kappa&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read and written, not used&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name (&lt;code>T&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code> or &lt;code>IQNILS&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code> (with warning)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>Initial / fixed 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: reused time steps&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction in &lt;code>evaluate()&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order value evaluation&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradient&lt;/code>&lt;/td>
&lt;td>Initial gradient; if given, the initial patch value is evaluated from it&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Not read (only written)&lt;/td>
&lt;td>no&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>From &lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow/0/solid/orig/partitioned/T&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 regionCoupledHeatFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (heatTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;kappa&amp;#34;;
&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 $internalField;
&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 in &lt;code>0/fluid/orig/partitioned/T&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 regionCoupledTemperatureJump;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (heatTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;kappa&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> accType aitken;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relax 0.75;
&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 $internalField;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Interface in &lt;code>constant/regionInterfaceProperties&lt;/code> (heat transfer stacked on
FSI):&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">fluidsolid
&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 (fsiInterface heatTransferInterface);
&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"> (fluid interfaceShadow)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (solid 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"> 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"> D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> );
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> coupled yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> fsiInterfaceCoeffs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> heatTransferInterfaceCoeffs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> jumpCoefficient jumpCoefficient [ 0 0 0 0 0 0 0 ] 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;/code>&lt;/pre>&lt;/div>&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>No interface-type check.&lt;/strong> &lt;code>heatTransInterface()&lt;/code> is never called, so a
wrong first &lt;code>interfaceType&lt;/code> entry is not caught here. It is usually caught
by the partner &lt;code>regionCoupledTemperatureJump&lt;/code>, which does check.&lt;/li>
&lt;li>&lt;strong>Partner must be a jump BC&lt;/strong> of &lt;code>T&lt;/code> (bad-cast error otherwise).&lt;/li>
&lt;li>&lt;strong>No interfacial heat source or contact resistance&lt;/strong>: &lt;code>fluxJump()&lt;/code> is zero.
For phase change use &lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code>.&lt;/li>
&lt;li>&lt;strong>No unit check on &lt;code>kappa&lt;/code>&lt;/strong> across the two regions.&lt;/li>
&lt;li>&lt;strong>&lt;code>value&lt;/code> is ignored on input&lt;/strong> and &lt;strong>&lt;code>gradient&lt;/code> is not written&lt;/strong> (restart
starts from a zero gradient).&lt;/li>
&lt;li>&lt;strong>First relaxation uses the patch values as reference&lt;/strong> (inherited; the
tutorials use the default &lt;code>fixed&lt;/code>/&lt;code>relax 1&lt;/code> on this side, where it has no
effect).&lt;/li>
&lt;li>Inherited from &lt;code>genericRegionCoupledFlux&lt;/code>: &lt;code>neighbourFieldName&lt;/code> unused,
corrections only in the evaluated value, &lt;code>IQNILS&lt;/code> not parallel-consistent,
partitioned only.&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/conjugateHeatTransfer/flowOverHeatedPlate&lt;/code>&lt;/td>
&lt;td>Solid side (&lt;code>conductTemperature&lt;/code>, patch &lt;code>top&lt;/code>), default &lt;code>kappa&lt;/code>, no relaxation.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/conjugateHeatTransfer/ShellAndTubeHeatExchanger&lt;/code>&lt;/td>
&lt;td>Solid side towards both fluids (&lt;code>solid_to_inner&lt;/code>, &lt;code>solid_to_outer&lt;/code>), &lt;code>nonOrthCorr true&lt;/code>, &lt;code>AMI&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Solid side (&lt;code>solidStVK conductTemperature&lt;/code>) of the thermo-FSI interface.&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: regionCoupledPhaseChangeHeatFlux</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledphasechangeheatflux/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledphasechangeheatflux/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code> is the flux side (Neumann side) of the
temperature coupling of &lt;code>massTransferInterface&lt;/code> (evaporation/condensation
between two fluid regions). It derives from
&lt;code>genericRegionCoupledFlux&amp;lt;scalar&amp;gt;&lt;/code> (and so from &lt;code>fixedGradient&lt;/code>). It fixes the
normal temperature gradient so that the conductive heat fluxes of both sides
add up to the interfacial heat-flux jump $q_{sat}$, which
&lt;code>massTransferInterface&lt;/code> computes and consumes as latent heat. The interface
found through the first &lt;code>interfaceType&lt;/code> entry must be a
&lt;code>massTransferInterface&lt;/code>. The partner on the neighbour region must be a
&lt;code>genericRegionCoupledJump&amp;lt;scalar&amp;gt;&lt;/code>-derived BC. The class does not prescribe
which one: &lt;code>regionCoupledScalarJump&lt;/code> with &lt;code>interfaceType (massTransferInterface)&lt;/code> and &lt;code>diffusivity k&lt;/code> fits (&lt;em>inferred&lt;/em>).
&lt;code>regionCoupledTemperatureJump&lt;/code> only works if a &lt;code>heatTransferInterface&lt;/code> on the
same patch pair is listed first in its own &lt;code>interfaceType&lt;/code>.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>Let $B$ be this patch and $A$ the neighbour (jump-side) patch:&lt;/p>
$$
k_B \frac{\partial T_B}{\partial n_B} + k_A \frac{\partial T_A}{\partial n_A} = q_{sat}
\quad \text{on } \Gamma
$$
&lt;p>imposed as the gradient&lt;/p>
$$
\left.\frac{\partial T_B}{\partial n}\right|_b
= \frac{-\,\mathcal{I}_{A\to B}\!\left(k_A\, \partial_n T_A\right) + q_{sat}}{k_B}
$$
&lt;p>followed by relaxation with the acceleration model. The flux jump is the
heat-flux imbalance at saturation computed by &lt;code>massTransferInterface&lt;/code>:&lt;/p>
$$
q_{sat} = k_A \left.\frac{\partial T_A}{\partial n_A}\right|_{T_\Gamma = T_{sat}} + k_B \left.\frac{\partial T_B}{\partial n_B}\right|_{T_\Gamma = T_{sat}},
\qquad
\dot m = -\frac{q_{sat}}{h_{lv}}
$$
&lt;p>The value continuity $T_A = T_B$ comes from the jump-side partner. This BC
does not fix $T_\Gamma$ to $T_{sat}$.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$T$&lt;/td>
&lt;td>Temperature (field &lt;code>T&lt;/code> in both regions)&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$k_B$&lt;/td>
&lt;td>Thermal conductivity, diffusivity name fixed to &lt;code>k&lt;/code>&lt;/td>
&lt;td>W/(m K)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$k_A\,\partial_n T_A$&lt;/td>
&lt;td>&lt;code>flux()&lt;/code> of the jump-side partner (its own &lt;code>diffusivity&lt;/code>)&lt;/td>
&lt;td>W/m²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$q_{sat}$&lt;/td>
&lt;td>&lt;code>massTransferInterface::fluxMTJump()&lt;/code> (area field &lt;code>&amp;lt;patchA&amp;gt;fluxMTJump&lt;/code>)&lt;/td>
&lt;td>W/m²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$T_{sat}$, $h_{lv}$&lt;/td>
&lt;td>Saturation temperature and latent heat of the interface&lt;/td>
&lt;td>K, J/kg&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\dot m$&lt;/td>
&lt;td>Interfacial mass flux of the interface&lt;/td>
&lt;td>kg/(m² s)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>Run-time work is inherited from &lt;code>genericRegionCoupledFlux&amp;lt;scalar&amp;gt;&lt;/code> (see
there). The class adds:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>fluxJump()&lt;/code>&lt;/strong>: returns the internal field of
&lt;code>massTransInterface().fluxMTJump()&lt;/code>, an &lt;code>areaScalarField&lt;/code> on the
interface&amp;rsquo;s finite-area mesh. It is used &lt;strong>as is&lt;/strong>, without interpolation
between the two sides.&lt;/li>
&lt;li>&lt;strong>&lt;code>massTransInterface()&lt;/code>&lt;/strong>: checks that the interface matched through the
first &lt;code>interfaceType&lt;/code> entry is a &lt;code>massTransferInterface&lt;/code>, otherwise
&lt;code>FatalError&lt;/code>. Called from &lt;code>fluxJump()&lt;/code>, i.e. in every &lt;code>updateCoeffs()&lt;/code> and
every residual evaluation.&lt;/li>
&lt;li>&lt;strong>&lt;code>diffusivityName()&lt;/code>&lt;/strong>: hard-coded to &lt;code>k&lt;/code>. The &lt;code>diffusivity&lt;/code> keyword is
read by the base class but ignored. &lt;code>diffCoeff()&lt;/code> takes a &lt;code>volScalarField k&lt;/code>
of the local region if one is registered, otherwise the uniform &lt;code>k&lt;/code> from
the region&amp;rsquo;s &lt;code>transportProperties&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>Per DNA iteration of &lt;code>T&lt;/code>, &lt;code>updateCoeffs()&lt;/code> first calls the interface&amp;rsquo;s
&lt;code>update()&lt;/code>. This runs &lt;code>massTransferInterface::correct()&lt;/code> → &lt;code>updateMDotS()&lt;/code>,
which recomputes $q_{sat}$ from copies of both &lt;code>T&lt;/code> fields with the interface
patches set to $T_{sat}$ (and sets $\dot m$ to zero at time index 1). The
jump-side partner triggers the same update. The BC then &lt;code>refCast&lt;/code>s the
neighbour &lt;code>T&lt;/code> patch field to &lt;code>genericRegionCoupledJumpFvPatchField&amp;lt;scalar&amp;gt;&lt;/code>,
interpolates and negates its &lt;code>flux()&lt;/code>, adds $q_{sat}$, divides by $k_B$,
relaxes and fixes the gradient. The flux residual
$|k_B g_B + \mathcal{I}(q_A) - q_{sat}|$ is checked against &lt;code>maxFluxRes&lt;/code>.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledPhaseChangeHeatFlux&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>Interface type list. The &lt;strong>first&lt;/strong> entry must be &lt;code>massTransferInterface&lt;/code>.&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Read by the base class but &lt;strong>ignored&lt;/strong> (&lt;code>k&lt;/code> is always used)&lt;/td>
&lt;td>no&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read and written, not used&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name (&lt;code>T&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code> or &lt;code>IQNILS&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code> (with warning)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>Initial / fixed 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: reused time steps&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction in &lt;code>evaluate()&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order value evaluation&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradient&lt;/code>&lt;/td>
&lt;td>Initial gradient; if given, the initial patch value is evaluated from it&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Not read (only written)&lt;/td>
&lt;td>no&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The interface parameters ($T_{sat}$, $h_{lv}$) are read from
&lt;code>massTransferInterfaceCoeffs&lt;/code> in &lt;code>constant/regionInterfaceProperties&lt;/code>; see
&lt;code>docs/interfaces/massTransferInterface.md&lt;/code>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>There is no tutorial. Entry pattern (from
&lt;code>docs/interfaces/massTransferInterface.md&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">// 0/fluidB/T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> type regionCoupledPhaseChangeHeatFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 373.15;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Partner on the other region (&lt;em>inferred&lt;/em>: the class only requires a
&lt;code>genericRegionCoupledJump&amp;lt;scalar&amp;gt;&lt;/code>-derived BC):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">// 0/fluidA/T
&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 regionCoupledScalarJump;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (massTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diffusivity &amp;#34;k&amp;#34;;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> accType aitken;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relax 0.75;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 373.15;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Both regions need a uniform &lt;code>k&lt;/code> in their &lt;code>transportProperties&lt;/code> (read by the
interface and by this BC). The patch pair is declared in
&lt;code>partitionedCoupledPatches&lt;/code> with &lt;code>interfaceType (... massTransferInterface)&lt;/code>,
&lt;code>coupledFields (T ...)&lt;/code> and a &lt;code>massTransferInterfaceCoeffs&lt;/code> sub-dictionary.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>No tutorial; untested.&lt;/strong> No case uses this BC or &lt;code>massTransferInterface&lt;/code>.
The &lt;code>interTrackFluid&lt;/code> region type it was written for is commented out in
&lt;code>src/multiRegionSystem/Make/files&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Needs &lt;code>massTransferInterface&lt;/code> first&lt;/strong> in &lt;code>interfaceType&lt;/code>; any other type
aborts in &lt;code>fluxJump()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Conformal patches assumed.&lt;/strong> $q_{sat}$ lives on the finite-area mesh of
the interface (built on side A) and is returned without mapping. If this BC
is on side B, the result is only correct when both patches have the same
faces in the same order (&lt;em>inferred&lt;/em>). Otherwise the field sizes do not
match.&lt;/li>
&lt;li>&lt;strong>Diffusivity name fixed to &lt;code>k&lt;/code>.&lt;/strong> The &lt;code>diffusivity&lt;/code> keyword is ignored,
yet &lt;code>write()&lt;/code> writes &lt;code>diffusivity k;&lt;/code>. A registered &lt;code>volScalarField k&lt;/code> takes
precedence over the &lt;code>transportProperties&lt;/code> entry. In a turbulent region that
field is the turbulent kinetic energy, not the conductivity (&lt;em>inferred&lt;/em>).&lt;/li>
&lt;li>&lt;strong>Interface update on every call.&lt;/strong> The interface&amp;rsquo;s &lt;code>correct()&lt;/code>
(recomputing $q_{sat}$ and $\dot m$, with an &lt;code>Info&lt;/code> line) runs in every
&lt;code>updateCoeffs()&lt;/code> of every BC coupled through this interface.&lt;/li>
&lt;li>&lt;strong>$T_{sat}$ is not imposed&lt;/strong> on the interface temperature; it only enters
$q_{sat}$.&lt;/li>
&lt;li>Inherited from &lt;code>genericRegionCoupledFlux&lt;/code>: partner must be a jump BC,
&lt;code>value&lt;/code> ignored on input, &lt;code>gradient&lt;/code> not written, first relaxation uses
the patch values as reference, &lt;code>neighbourFieldName&lt;/code> unused, &lt;code>IQNILS&lt;/code> not
parallel-consistent, partitioned only.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>—&lt;/td>
&lt;td>No tutorial uses &lt;code>regionCoupledPhaseChangeHeatFlux&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Alkfri, A., Habes, C., Marschall, H., &lt;em>multiRegionFoam: A Unified Multiphysics Framework for Multi-Region Coupled Continuum-Physical Problems&lt;/em>, Engineering with Computers, 2023.
DOI: &lt;a href="https://doi.org/10.1007/s00366-024-01974-4">10.1007/s00366-024-01974-4&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Docs: regionCoupledTemperatureJump</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledtemperaturejump/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledtemperaturejump/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledTemperatureJump&lt;/code> is the value side (Dirichlet side) of the
temperature coupling of &lt;code>heatTransferInterface&lt;/code>, used for conjugate heat
transfer and thermo-FSI. It derives from &lt;code>genericRegionCoupledJump&amp;lt;scalar&amp;gt;&lt;/code>
(and so from &lt;code>fixedValue&lt;/code>). It fixes the patch temperature to the neighbour
temperature, interpolated onto this patch and scaled by the interface&amp;rsquo;s
&lt;code>jumpCoefficient&lt;/code> $c$ ($c = 1$: temperature continuity). It also supplies its
heat flux $\kappa\,\partial T/\partial n$ to the partner
&lt;code>regionCoupledHeatFlux&lt;/code> on the neighbour region. The interface found through
the first &lt;code>interfaceType&lt;/code> entry must be a &lt;code>heatTransferInterface&lt;/code>.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>Let $A$ be this patch and $B$ the neighbour (flux-side) patch:&lt;/p>
$$
T_A = c\;\mathcal{I}_{B\to A}(T_B) \quad \text{on } \Gamma
$$
&lt;p>implemented as $T_A = \mathcal{I}_{B\to A}(T_B) + j$ with&lt;/p>
$$
j = \mathcal{I}_{B\to A}(T_B)\,(c - 1),
$$
&lt;p>followed by relaxation with the acceleration model. The heat flux handed to
&lt;code>regionCoupledHeatFlux&lt;/code> is&lt;/p>
$$
q_A = \kappa_A \left.\frac{\partial T_A}{\partial n}\right|_b
$$
&lt;p>with the coupled &lt;code>snGrad&lt;/code> of &lt;code>genericRegionCoupledJump&lt;/code> (optional
non-orthogonal and second-order corrections).&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$T$&lt;/td>
&lt;td>Temperature (field &lt;code>T&lt;/code> in both regions)&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$c$&lt;/td>
&lt;td>&lt;code>heatTransferInterfaceCoeffs/jumpCoefficient&lt;/code> (uniform, constant)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa_A$&lt;/td>
&lt;td>Diffusivity named by &lt;code>diffusivity&lt;/code>, default &lt;code>kappa&lt;/code>&lt;/td>
&lt;td>W/(m K)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathcal{I}_{B\to A}$&lt;/td>
&lt;td>Interface-to-interface interpolation&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>Run-time work is inherited from &lt;code>genericRegionCoupledJump&amp;lt;scalar&amp;gt;&lt;/code> (see
there). The class adds:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>valueJump()&lt;/code>&lt;/strong>: looks up the neighbour &lt;code>T&lt;/code> under the local field name,
interpolates its neighbour patch values, and returns
$\mathcal{I}(T_B)\,(c - 1)$. Here $c$ is
&lt;code>heatTransInterface().jumpCoefficient().value()&lt;/code>, a single scalar.&lt;/li>
&lt;li>&lt;strong>&lt;code>heatTransInterface()&lt;/code>&lt;/strong>: checks that the interface matched through the
first &lt;code>interfaceType&lt;/code> entry has type &lt;code>heatTransferInterface&lt;/code>, otherwise
&lt;code>FatalError&lt;/code> (&amp;ldquo;BC can only be used in combination with a
heatTransferInterface&amp;rdquo;). It is called from &lt;code>valueJump()&lt;/code>, so the check
runs on the first &lt;code>updateCoeffs()&lt;/code> and on every residual evaluation.&lt;/li>
&lt;li>&lt;strong>&lt;code>diffusivityName()&lt;/code>&lt;/strong>: returns the &lt;code>diffusivity&lt;/code> keyword if set,
otherwise &lt;code>kappa&lt;/code>. &lt;code>diffCoeff()&lt;/code> uses the &lt;code>volScalarField&lt;/code> with this name
on the local region if one is registered, else a uniform
&lt;code>dimensionedScalar&lt;/code> of that name from the region&amp;rsquo;s &lt;code>transportProperties&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>Per DNA iteration of &lt;code>T&lt;/code>: the interface is updated (its &lt;code>correct()&lt;/code> is a
no-op), the value $\mathcal{I}(T_B) + j$ is set, relaxed (&lt;code>accType&lt;/code>, &lt;code>relax&lt;/code>)
and fixed. The jump residual $|T_A - \mathcal{I}(T_B) - j|$ is checked against
&lt;code>maxJumpRes&lt;/code>.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>regionCoupledTemperatureJump&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>Interface type list. The &lt;strong>first&lt;/strong> entry must be &lt;code>heatTransferInterface&lt;/code>.&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Name of the thermal conductivity field / &lt;code>transportProperties&lt;/code> entry&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>kappa&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read and written, not used&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name (&lt;code>T&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>jumpCoefficient&lt;/code>&lt;/td>
&lt;td>Read by the base class but &lt;strong>ignored&lt;/strong> (the coefficient comes from the interface)&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>word::null&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code> or &lt;code>IQNILS&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code> (with warning)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>Initial / fixed 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: reused time steps&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 of &lt;code>snGrad&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order &lt;code>snGrad&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Initial patch value (read if present, otherwise uninitialised)&lt;/td>
&lt;td>effectively yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>From &lt;code>tutorials/conjugateHeatTransfer/flowOverHeatedPlate/0/fluid/orig/partitioned/T&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 regionCoupledTemperatureJump;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (heatTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> accType aitken;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relax 0.75;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&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 $internalField;
&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 in &lt;code>0/solid/orig/partitioned/T&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">top
&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 regionCoupledHeatFlux;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (heatTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&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 $internalField;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Interface in &lt;code>constant/regionInterfacePropertiesPartitioned&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"> fluidsolid
&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 (heatTransferInterface);
&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"> (fluid interface)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (solid top)
&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"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> );
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> heatTransferInterfaceCoeffs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> jumpCoefficient jumpCoefficient [ 0 0 0 0 0 0 0 ] 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">);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>and the &lt;code>T&lt;/code> entry in the &lt;code>DNA&lt;/code> block of &lt;code>constant/multiRegionProperties&lt;/code>
(&lt;code>maxCoupleIter&lt;/code>, &lt;code>maxJumpRes&lt;/code>, &lt;code>maxFluxRes&lt;/code>). For thermo-FSI the interface
entry lists &lt;code>interfaceType (fsiInterface heatTransferInterface);&lt;/code>, while the
&lt;code>T&lt;/code> patches keep &lt;code>interfaceType (heatTransferInterface);&lt;/code>
(&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>).&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Needs &lt;code>heatTransferInterface&lt;/code> first&lt;/strong> in the BC&amp;rsquo;s &lt;code>interfaceType&lt;/code> list;
any other type aborts in &lt;code>valueJump()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Constant, uniform jump coefficient.&lt;/strong> $c$ is a single
&lt;code>dimensionedScalar&lt;/code> read once by the interface. The &lt;code>jumpCoefficient&lt;/code> patch
keyword (field lookup) of &lt;code>regionCoupledScalarJump&lt;/code> is not used here.&lt;/li>
&lt;li>&lt;strong>No unit check on &lt;code>kappa&lt;/code>.&lt;/strong> The flux balance with the partner only
conserves energy if both sides name conductivities in the same units
(e.g. not &lt;code>DT&lt;/code> in m²/s on one side).&lt;/li>
&lt;li>&lt;strong>Missing diffusivity is fatal&lt;/strong> when the partner first asks for &lt;code>flux()&lt;/code>
(no &lt;code>kappa&lt;/code> field and no &lt;code>kappa&lt;/code> in &lt;code>transportProperties&lt;/code>).&lt;/li>
&lt;li>Inherited from &lt;code>genericRegionCoupledJump&lt;/code>: &lt;code>neighbourFieldName&lt;/code> unused,
side detection by patch name only, acceleration state carried over time
steps, &lt;code>IQNILS&lt;/code> not parallel-consistent, partitioned only (the
&lt;code>*Monolithic&lt;/code> tutorial variants use other BCs).&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/conjugateHeatTransfer/flowOverHeatedPlate&lt;/code>&lt;/td>
&lt;td>Fluid side of &lt;code>fluid (pimpleFluid transportTemperature)&lt;/code> / &lt;code>solid (conductTemperature)&lt;/code>, Aitken 0.75, &lt;code>directMap&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/conjugateHeatTransfer/ShellAndTubeHeatExchanger&lt;/code>&lt;/td>
&lt;td>Fluid side on &lt;code>inner_to_solid&lt;/code> and &lt;code>outer_to_solid&lt;/code>, &lt;code>nonOrthCorr true&lt;/code>, default &lt;code>fixed&lt;/code> relaxation, &lt;code>AMI&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Fluid side of the thermo-FSI interface (&lt;code>diffusivity &amp;quot;kappa&amp;quot;&lt;/code>, Aitken 0.75), stacked with &lt;code>fsiInterface&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Alkfri, A., Habes, C., Marschall, H., &lt;em>multiRegionFoam: A Unified Multiphysics Framework for Multi-Region Coupled Continuum-Physical Problems&lt;/em>, Engineering with Computers, 2023.
DOI: &lt;a href="https://doi.org/10.1007/s00366-024-01974-4">10.1007/s00366-024-01974-4&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Docs: rhoPimpleFluid</title><link>https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/rhopimplefluid/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/rhopimplefluid/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>rhoPimpleFluid&lt;/code> solves the transient, compressible Navier-Stokes equations for
a Newtonian single-phase fluid with the &lt;strong>PIMPLE&lt;/strong> (merged PISO–SIMPLE)
pressure-velocity coupling algorithm. It is a port of OpenFOAM&amp;rsquo;s
&lt;code>rhoPimpleFoam&lt;/code>: density follows from a run-time selectable thermophysical
model (&lt;code>fluidThermo&lt;/code>), and an energy equation for sensible enthalpy or internal
energy is solved alongside momentum. It supports compressible turbulence
modelling (laminar, RANS, LES), a transonic pressure formulation, local time
stepping (LTS), moving meshes, MRF and &lt;code>fvOptions&lt;/code>. It is suitable for
subsonic to supersonic gas flows, standalone or as the fluid side of a
multi-region problem.&lt;/p>
&lt;h2 id="governing-equations">Governing Equations&lt;/h2>
&lt;h3 id="continuity">Continuity&lt;/h3>
$$
\frac{\partial \rho}{\partial t} + \nabla \cdot \left(\rho\mathbf{U}\right) = S_\rho
$$
&lt;h3 id="momentum">Momentum&lt;/h3>
$$
\frac{\partial \left(\rho\mathbf{U}\right)}{\partial t} + \nabla \cdot \left(\rho\mathbf{U}\mathbf{U}\right) - \nabla \cdot \mathbf{R}
= -\nabla p + \mathbf{S}_U
$$
&lt;p>The effective stress divergence is provided by the turbulence model via
&lt;code>compressible::turbulenceModel::divDevRhoReff(U)&lt;/code>.&lt;/p>
&lt;h3 id="energy">Energy&lt;/h3>
&lt;p>The energy variable $e$ is either sensible enthalpy $h$ or sensible internal
energy $e$, selected by the &lt;code>energy&lt;/code> keyword in &lt;code>thermophysicalProperties&lt;/code>.
With $K = \tfrac{1}{2}|\mathbf{U}|^2$:&lt;/p>
$$
\frac{\partial \left(\rho h\right)}{\partial t} + \nabla \cdot \left(\rho\mathbf{U}h\right) + \frac{\partial \left(\rho K\right)}{\partial t} + \nabla \cdot \left(\rho\mathbf{U}K\right) - \frac{\partial p}{\partial t} - \nabla \cdot \left(\alpha_\text{eff}\nabla h\right)
= S_h
$$
&lt;p>For internal energy the pressure-work term $-\partial p/\partial t$ is
replaced by $\nabla \cdot \left(p\,\mathbf{U}\right)$ (&lt;code>div(phiv,p)&lt;/code>). The
$\partial p/\partial t$ term is only included if &lt;code>dpdt&lt;/code> is enabled in the
thermophysical model (default &lt;code>yes&lt;/code>). With active MRF zones the term
$\nabla \cdot (\phi_\text{MRF}\,p)$ is added.&lt;/p>
&lt;h3 id="equation-of-state">Equation of state&lt;/h3>
&lt;p>Density is closed by the thermophysical model, $\rho = \rho(p, T)$, with
compressibility $\psi = \partial\rho/\partial p$ used in the pressure
equation.&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>$\rho$&lt;/td>
&lt;td>Density&lt;/td>
&lt;td>kg/m³&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>$p$&lt;/td>
&lt;td>(Static) pressure&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$T$&lt;/td>
&lt;td>Temperature&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$h$, $e$&lt;/td>
&lt;td>Sensible enthalpy / internal energy&lt;/td>
&lt;td>J/kg&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$K$&lt;/td>
&lt;td>Specific kinetic energy&lt;/td>
&lt;td>m²/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\psi$&lt;/td>
&lt;td>Compressibility&lt;/td>
&lt;td>s²/m²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{R}$&lt;/td>
&lt;td>Effective stress tensor (viscous + turbulent)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\alpha_\text{eff}$&lt;/td>
&lt;td>Effective thermal diffusivity (laminar + turbulent)&lt;/td>
&lt;td>kg/(m·s)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$S_\rho$, $\mathbf{S}_U$, $S_h$&lt;/td>
&lt;td>Sources (from &lt;code>fvOptions&lt;/code>)&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="stress-tensor-for-fsi-coupling">Stress tensor (for FSI coupling)&lt;/h3>
&lt;p>After each pressure-correction stage the Cauchy stress tensor is updated:&lt;/p>
$$
\boldsymbol{\sigma} = -p\,\mathbf{I} - \mathbf{R}^\text{dev}
$$
&lt;p>where $\mathbf{R}^\text{dev}$ is &lt;code>turbulence::devRhoReff()&lt;/code>. Since $p$ is the
static pressure in Pa, no density scaling is applied (unlike &lt;code>pimpleFluid&lt;/code>).&lt;/p>
&lt;h2 id="numerical-algorithm">Numerical Algorithm&lt;/h2>
&lt;p>The region implements the &lt;code>regionType&lt;/code> PIMPLE interface
(&lt;code>usesPIMPLE() = true&lt;/code>), so the outer PIMPLE loop is driven by
&lt;code>multiRegionSystem&lt;/code>. Per time step:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>&lt;code>correct()&lt;/code>&lt;/strong> — reset the outer-iteration counter; if &lt;code>correctPhi&lt;/code> is
active, snapshot $\nabla\cdot(\rho\mathbf{U})$ for flux correction; if LTS is
active, recompute the local time-step field &lt;code>rDeltaT&lt;/code> (see below).&lt;/li>
&lt;li>&lt;strong>Pre-predictor&lt;/strong> — on the first outer iteration of the step (or every
iteration with &lt;code>moveMeshOuterCorrectors yes&lt;/code>): &lt;code>mesh.controlledUpdate()&lt;/code>;
if the mesh changed, update MRF, rebuild the flux from &lt;code>rhoUf&lt;/code>, apply
&lt;code>CorrectPhi&lt;/code>, make the flux relative and correct &lt;code>rhoUf&lt;/code>; optionally print
the mesh Courant number.&lt;/li>
&lt;li>&lt;strong>Momentum predictor&lt;/strong> —
&lt;ul>
&lt;li>on the first outer iteration and unless &lt;code>SIMPLErho&lt;/code> is set, solve the
density transport equation;&lt;/li>
&lt;li>assemble the momentum matrix (cached for the pressure corrector), relax,
and solve it with $-\nabla p$ if &lt;code>momentumPredictor yes&lt;/code>; update $K$;&lt;/li>
&lt;li>assemble and solve the energy equation, then &lt;code>thermo.correct()&lt;/code>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Pressure corrector (PISO loop, &lt;code>nCorrectors&lt;/code>)&lt;/strong> — for each corrector:
update $\rho$ from thermo (unless &lt;code>SIMPLErho&lt;/code>), build
$\mathbf{H}/A$ and $\phi_{HbyA}$ (with &lt;code>ddtCorr&lt;/code>, MRF and mesh-motion
corrections, optional &lt;code>consistent&lt;/code> SIMPLEC treatment), constrain pressure
BCs, and solve the compressible pressure equation inside the
non-orthogonal loop:&lt;/li>
&lt;/ol>
$$
\frac{\partial \rho}{\partial t} + \psi\,\frac{\partial p'}{\partial t} + \nabla\cdot\phi_{HbyA} - \nabla\cdot\left(\rho\, r_{AU}\,\nabla p\right) = S_p
$$
&lt;p>With &lt;code>transonic yes&lt;/code> the flux is split into a convective part
$\phi_d = (\psi_f/\rho_f)\,\phi_{HbyA}$ treated implicitly
($\nabla\cdot(\phi_d\,p)$) and the pressure equation is relaxed for
diagonal dominance. Afterwards: explicit pressure relaxation, velocity
correction $\mathbf{U} = \mathbf{H}/A - r_{AU}\nabla p$, pressure limiting
(&lt;code>pressureControl&lt;/code>), &lt;code>thermo.correctRho&lt;/code> with &lt;code>rhoMin&lt;/code>/&lt;code>rhoMax&lt;/code>, a second
density solve, continuity-error report, $\rho$ reset to thermo, &lt;code>rhoUf&lt;/code>
correction and $\partial p/\partial t$ update.
5. &lt;strong>Turbulence correction&lt;/strong> — &lt;code>turbulence-&amp;gt;correct()&lt;/code> if &lt;code>pimple.turbCorr()&lt;/code>
(see &lt;code>turbOnFinalIterOnly&lt;/code>), then update of &lt;code>sigma&lt;/code>.&lt;/p>
&lt;p>Steps 2–5 are repeated for &lt;code>nOuterCorrectors&lt;/code> outer iterations; step 4 for
&lt;code>nCorrectors&lt;/code> inner iterations.&lt;/p>
&lt;p>&lt;strong>Mesh motion corrector&lt;/strong> (&lt;code>meshMotionCorrector()&lt;/code>, called by
&lt;code>multiRegionSystem::preSolve&lt;/code> and in the FSI coupling loop) performs
&lt;code>controlledUpdate&lt;/code>, MRF update, flux reconstruction from &lt;code>rhoUf&lt;/code> +
&lt;code>CorrectPhi&lt;/code>, and &lt;code>rhoUf&lt;/code> correction.&lt;/p>
&lt;h3 id="time-step-control">Time-step control&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Global time stepping&lt;/strong> — &lt;code>getMinDeltaT()&lt;/code> returns
$\Delta t_\text{max} = \text{maxCo}/\text{Co}\;\Delta t$, where the Courant
number is evaluated from the mass flux, $\text{Co} = \tfrac{1}{2}\max\left(\sum_f|\phi|/(\rho V)\right)\Delta t$.
&lt;code>maxCo&lt;/code> is read from &lt;code>controlDict&lt;/code> (default &lt;code>1.0&lt;/code>).&lt;/li>
&lt;li>&lt;strong>Local time stepping (LTS)&lt;/strong> — enabled automatically when &lt;code>fvSchemes&lt;/code>
selects &lt;code>ddtSchemes { default localEuler; }&lt;/code>. &lt;code>getMinDeltaT()&lt;/code> then returns
&lt;code>GREAT&lt;/code> (the global step is left untouched) and &lt;code>rDeltaT&lt;/code> is computed per
cell from the Courant number (plus an acoustic estimate with &lt;code>transonic&lt;/code>),
then smoothed and damped, as in stock &lt;code>rhoPimpleFoam&lt;/code>.&lt;/li>
&lt;/ul>
&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>Thermophysical model&lt;/td>
&lt;td>&lt;code>constant/thermophysicalProperties&lt;/code>&lt;/td>
&lt;td>&lt;code>fluidThermo::New&lt;/code>; &lt;code>hePsiThermo&lt;/code> or &lt;code>heRhoThermo&lt;/code>; energy must be &lt;code>h&lt;/code> or &lt;code>e&lt;/code> variant&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Turbulence (laminar / RANS / LES)&lt;/td>
&lt;td>&lt;code>constant/turbulenceProperties&lt;/code>&lt;/td>
&lt;td>&lt;code>compressible::turbulenceModel&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Moving Reference Frame (MRF)&lt;/td>
&lt;td>&lt;code>constant/MRFProperties&lt;/code>&lt;/td>
&lt;td>&lt;code>IOMRFZoneList&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>fvOptions&lt;/code>&lt;/td>
&lt;td>&lt;code>system/fvOptions&lt;/code> (or &lt;code>constant/fvOptions&lt;/code>)&lt;/td>
&lt;td>Sources/constraints on $\rho$, $\mathbf{U}$, $h$/$e$, $p$ (e.g. &lt;code>limitTemperature&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Dynamic mesh&lt;/td>
&lt;td>&lt;code>constant/dynamicMeshDict&lt;/code>&lt;/td>
&lt;td>Any &lt;code>dynamicFvMesh&lt;/code>; enables &lt;code>rhoUf&lt;/code> and &lt;code>correctPhi&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="required-fields">Required Fields&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Pressure (read by thermo)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>T&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Temperature (read by thermo)&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>U&lt;/code>&lt;/td>
&lt;td>&lt;code>volVectorField&lt;/code>&lt;/td>
&lt;td>Velocity&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Turbulence fields&lt;/td>
&lt;td>—&lt;/td>
&lt;td>As required by selected model (e.g. &lt;code>k&lt;/code>, &lt;code>omega&lt;/code>, &lt;code>nut&lt;/code>, &lt;code>alphat&lt;/code>)&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Additionally created at runtime:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Condition&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>rho&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Density (read if present, else from thermo)&lt;/td>
&lt;td>always&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>Mass flux $\rho\mathbf{U}\cdot\mathbf{S}_f$ (read if present)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>K&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Kinetic energy $\tfrac12&lt;/td>
&lt;td>\mathbf{U}&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>dpdt&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>$\partial p/\partial t$&lt;/td>
&lt;td>always (zero if &lt;code>dpdt no&lt;/code>; written only on dynamic meshes)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>kappa&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Effective thermal conductivity &lt;code>kappaEff&lt;/code>&lt;/td>
&lt;td>always (heat-transfer coupling)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>sigma&lt;/code>&lt;/td>
&lt;td>&lt;code>volSymmTensorField&lt;/code>&lt;/td>
&lt;td>Cauchy stress tensor&lt;/td>
&lt;td>always (FSI)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>rhoUf&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceVectorField&lt;/code>&lt;/td>
&lt;td>Face momentum&lt;/td>
&lt;td>dynamic mesh only&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>rDeltaT&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Reciprocal local time step&lt;/td>
&lt;td>LTS only&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>uniform/cumulativeContErr&lt;/code>&lt;/td>
&lt;td>&lt;code>uniformDimensionedScalarField&lt;/code>&lt;/td>
&lt;td>Cumulative continuity error&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="case-setup">Case Setup&lt;/h2>
&lt;h3 id="required-dictionaries">Required dictionaries&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="n">constant&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">thermophysicalProperties&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">thermo&lt;/span> &lt;span class="n">type&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mixture&lt;/span> &lt;span class="n">properties&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">constant&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">turbulenceProperties&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">turbulence&lt;/span> &lt;span class="n">model&lt;/span> &lt;span class="n">selection&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">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">PIMPLE&lt;/span> &lt;span class="n">sub&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">dict&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">linear&lt;/span> &lt;span class="n">solver&lt;/span> &lt;span class="n">settings&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 class="p">(&lt;/span>&lt;span class="n">localEuler&lt;/span> &lt;span class="err">→&lt;/span> &lt;span class="n">LTS&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"> ( gas (rhoPimpleFluid) )
&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">application multiPhysicsFoam;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">singleRegionMode yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">regionType rhoPimpleFluid;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="thermophysicalproperties-from-aerofoilnaca0012">&lt;code>thermophysicalProperties&lt;/code> (from &lt;code>aerofoilNACA0012&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">thermoType&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">type&lt;/span> &lt;span class="n">hePsiThermo&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mixture&lt;/span> &lt;span class="n">pureMixture&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transport&lt;/span> &lt;span class="k">const&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">thermo&lt;/span> &lt;span class="n">hConst&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">equationOfState&lt;/span> &lt;span class="n">perfectGas&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">specie&lt;/span> &lt;span class="n">specie&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">energy&lt;/span> &lt;span class="n">sensibleInternalEnergy&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="n">sensibleEnthalpy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&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 class="n">mixture&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">specie&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">molWeight&lt;/span> &lt;span class="mf">28.9&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">thermodynamics&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Cp&lt;/span> &lt;span class="mi">1005&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">Hf&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">transport&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">mu&lt;/span> &lt;span class="mf">1.82e-05&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">Pr&lt;/span> &lt;span class="mf">0.71&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&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">PIMPLE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> momentumPredictor yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nOuterCorrectors 1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nCorrectors 2;
&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"> transonic no; // implicit convective pressure term
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> consistent no; // SIMPLEC-like correction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> SIMPLErho no; // skip rho transport, take rho from thermo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> turbOnFinalIterOnly 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"> // Pressure limits (pressureControl): pMin/pMax or pMinFactor/pMaxFactor
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pMinFactor 0.1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pMaxFactor 2;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Density bounds for thermo.correctRho
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rhoMin 0; // default 0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rhoMax 1e5; // default GREAT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Moving mesh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> correctPhi yes; // defaults to yes if mesh is dynamic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> checkMeshCourantNo no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> moveMeshOuterCorrectors no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // LTS only (ddtSchemes default localEuler)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxCo 0.5; // default 0.8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rDeltaTSmoothingCoeff 0.1; // default 0.02
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rDeltaTDampingCoeff 0.9; // default 1.0 (no damping)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxDeltaT 1; // default GREAT
&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;
&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-4;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="coupling">Coupling&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Interface type&lt;/th>
&lt;th>Exchanged fields&lt;/th>
&lt;th>Coupling modes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>heatTransferInterface&lt;/code>&lt;/td>
&lt;td>Temperature &lt;code>T&lt;/code>, heat flux via &lt;code>kappa&lt;/code>&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>fsiInterface&lt;/code>&lt;/td>
&lt;td>Displacement &lt;code>D&lt;/code>, traction from &lt;code>sigma&lt;/code>&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>defaultInterface&lt;/code>&lt;/td>
&lt;td>Any scalar (generic &lt;code>regionCoupledScalarJump&lt;/code>/&lt;code>Flux&lt;/code> BCs)&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For partitioned heat transfer, &lt;code>setCoupledEqns&lt;/code> assembles a separate
temperature equation (independent of the &lt;code>fieldName&lt;/code> argument):&lt;/p>
$$
\frac{\partial \left(\rho c_{pv} T\right)}{\partial t} + \nabla\cdot\left(c_{pv,f}\,\phi\,T\right)
= \nabla\cdot\left(\kappa_\text{eff}\nabla T\right)
$$
&lt;p>with $c_{pv} = $ &lt;code>thermo.Cpv()&lt;/code> and &lt;code>kappa&lt;/code> refreshed from
&lt;code>turbulence-&amp;gt;kappaEff()&lt;/code> on each call. The matrix is registered as
&lt;code>T&amp;lt;region&amp;gt;MeshrhoPimpleFluidTypeEqn&lt;/code>. The &lt;code>regionCoupledTemperatureJump&lt;/code> /
&lt;code>regionCoupledHeatFlux&lt;/code> BCs read the diffusivity field &lt;code>kappa&lt;/code> by default.
&lt;code>selfCoupledFieldNames()&lt;/code> is not overridden (empty list).&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Coupled temperature equation is decoupled from the energy equation&lt;/strong> —
the DNA &lt;code>T&lt;/code> equation in &lt;code>setCoupledEqns&lt;/code> contains no pressure-work,
kinetic-energy, MRF or &lt;code>fvOptions&lt;/code> terms, and &lt;code>postSolve()&lt;/code> is a no-op, so
&lt;code>thermo.correct()&lt;/code> is not called after the coupled &lt;code>T&lt;/code> solve and &lt;code>he&lt;/code> is
not updated from the new &lt;code>T&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Heat-transfer and FSI coupling are untested&lt;/strong> — no multi-region
tutorial uses &lt;code>rhoPimpleFluid&lt;/code>; only single-region cases exist.&lt;/li>
&lt;li>&lt;strong>Monolithic coupling not implemented&lt;/strong> — &lt;code>setCoupledEqns&lt;/code> only provides
the partitioned &lt;code>T&lt;/code> matrix; monolithic coupling is disabled in
&lt;code>multiRegionSystem&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>solveRegion()&lt;/code> and &lt;code>postSolve()&lt;/code> are no-ops&lt;/strong> — all work happens inside
the PIMPLE hooks.&lt;/li>
&lt;li>&lt;strong>&lt;code>maxDeltaT&lt;/code> not applied in &lt;code>getMinDeltaT()&lt;/code>&lt;/strong> — &lt;code>maxDeltaT&lt;/code> from
&lt;code>controlDict&lt;/code> is read but the returned value is only Courant-based.&lt;/li>
&lt;li>&lt;strong>Mesh motion corrector does not make the flux relative&lt;/strong> — unlike
&lt;code>prePredictor&lt;/code>, &lt;code>meshMotionCorrector()&lt;/code> does not call
&lt;code>fvc::makeRelative&lt;/code> after &lt;code>CorrectPhi&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Single phase, single species&lt;/strong> — reacting or multi-species mixtures and
buoyancy (gravity, &lt;code>p_rgh&lt;/code>) are not handled; use &lt;code>buoyantPimpleFluid&lt;/code> for
buoyancy-driven flows.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tutorial path&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>tutorials/singleRegion/rhoPimpleFluid/aerofoilNACA0012&lt;/code>&lt;/td>
&lt;td>Compressible RANS (kOmegaSST) flow around a NACA0012 aerofoil, internal energy, &lt;code>limitTemperature&lt;/code> fvOption&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/singleRegion/rhoPimpleFluid/obliqueShock&lt;/code>&lt;/td>
&lt;td>Laminar supersonic oblique shock with &lt;code>transonic&lt;/code> formulation and LTS (&lt;code>localEuler&lt;/code>)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Alkfri, A., Habes, C., Marschall, H., &lt;em>multiRegionFoam: A Unified Multiphysics Framework for Multi-Region Coupled Continuum-Physical Problems&lt;/em>, Engineering with Computers, 2023.
DOI: &lt;a href="https://doi.org/10.1007/s00366-024-01974-4">10.1007/s00366-024-01974-4&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Docs: transportTemperature</title><link>https://multiphysicsfoam.com/docs/user-guide/region-physics/heat-transfer-models/transporttemperature/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/region-physics/heat-transfer-models/transporttemperature/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>transportTemperature&lt;/code> adds a temperature equation to a fluid region. It does
not solve for the flow itself: it is stacked on top of a flow region type in
the same region, e.g. &lt;code>(fluid (pimpleFluid transportTemperature))&lt;/code>, and
advects &lt;code>T&lt;/code> with the velocity &lt;code>U&lt;/code> and face flux &lt;code>phi&lt;/code> that the companion
region type owns. Material properties (&lt;code>rho&lt;/code>, &lt;code>cp&lt;/code>, &lt;code>kappa&lt;/code>) are constant
(&lt;code>kappa&lt;/code> may be a non-uniform field). There is no turbulent heat flux; the
turbulent variant &lt;code>turbulentTransportTemperature&lt;/code> exists in the source tree
but is not compiled (see Known Limitations). The typical use is the fluid side
of conjugate heat transfer, coupled to &lt;code>conductTemperature&lt;/code> through
&lt;code>heatTransferInterface&lt;/code>.&lt;/p>
&lt;h2 id="governing-equations">Governing Equations&lt;/h2>
&lt;h3 id="energy-temperature">Energy (temperature)&lt;/h3>
$$
\rho\, c_p \left( \frac{\partial T}{\partial t} + \nabla \cdot \left( \phi\, T \right) \right)
= \nabla \cdot \left( \kappa\, \nabla T \right)
$$
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$T$&lt;/td>
&lt;td>Temperature&lt;/td>
&lt;td>K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi$&lt;/td>
&lt;td>Volumetric face flux (&lt;code>phi&lt;/code>) from the companion fluid region type&lt;/td>
&lt;td>m³/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\rho$&lt;/td>
&lt;td>Density (constant)&lt;/td>
&lt;td>kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$c_p$&lt;/td>
&lt;td>Specific heat capacity (constant)&lt;/td>
&lt;td>J/(kg K)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa$&lt;/td>
&lt;td>Thermal conductivity (uniform or field)&lt;/td>
&lt;td>W/(m K)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The convective term is written in conservative form $\nabla \cdot (\phi T)$
without a $-T\,\nabla\cdot\phi$ correction, so it assumes a divergence-free
(incompressible, volumetric) flux. There is no source term and no viscous
heating.&lt;/p>
&lt;h2 id="numerical-algorithm">Numerical Algorithm&lt;/h2>
&lt;p>&lt;code>transportTemperature&lt;/code> has no solution loop of its own. &lt;code>usesPIMPLE()&lt;/code> returns
&lt;code>false&lt;/code>, and &lt;code>solveRegion()&lt;/code>, &lt;code>prePredictor()&lt;/code>, &lt;code>momentumPredictor()&lt;/code>,
&lt;code>pressureCorrector()&lt;/code>, &lt;code>meshMotionCorrector()&lt;/code> and &lt;code>postSolve()&lt;/code> are all
no-ops. Per time step:&lt;/p>
&lt;ol>
&lt;li>&lt;code>preSolve()&lt;/code>: &lt;code>correct()&lt;/code> calls &lt;code>kappa.correctBoundaryConditions()&lt;/code>.&lt;/li>
&lt;li>The companion fluid region type solves its flow (e.g. the PIMPLE loop of
&lt;code>pimpleFluid&lt;/code>), which updates the shared &lt;code>U&lt;/code> and &lt;code>phi&lt;/code>.&lt;/li>
&lt;li>Inside the DNA loop for &lt;code>T&lt;/code>, &lt;code>multiRegionSystem&lt;/code> calls
&lt;code>setCoupledEqns()&lt;/code>, which assembles the equation above as an
&lt;code>fvScalarMatrix&lt;/code> and registers it under
&lt;code>T&amp;lt;region&amp;gt;MeshtransportTemperatureTypeEqn&lt;/code>. The matrix is then relaxed
(&lt;code>relaxationFactors&lt;/code>) and solved, with optional Picard re-assembly
controlled by the region&amp;rsquo;s &lt;code>PICARD&lt;/code> dictionary in &lt;code>fvSolution&lt;/code>.&lt;/li>
&lt;li>&lt;code>getMinDeltaT()&lt;/code> returns &lt;code>GREAT&lt;/code>, so this region never limits the time
step. Time-step control comes from the companion fluid type (Courant
number) or a fixed &lt;code>deltaT&lt;/code>.&lt;/li>
&lt;/ol>
&lt;p>The temperature is therefore advanced once per time step, after the flow,
using the flux from the end of the flow solve (one-way, segregated coupling
from flow to temperature; &lt;code>T&lt;/code> does not feed back into the flow).&lt;/p>
&lt;p>&lt;code>setCoupledEqns()&lt;/code> ignores its &lt;code>fieldName&lt;/code> argument and always assembles the
&lt;code>T&lt;/code> equation. &lt;code>selfCoupledFieldNames()&lt;/code> is not overridden (returns an empty
list), so &lt;code>T&lt;/code> is &lt;strong>only solved if it is listed as a partitioned-coupled field&lt;/strong>
(a &lt;code>DNA { T {...} }&lt;/code> entry in &lt;code>multiRegionProperties&lt;/code> and &lt;code>T&lt;/code> in an interface&amp;rsquo;s
&lt;code>coupledFields&lt;/code>).&lt;/p>
&lt;h2 id="sub-models">Sub-Models&lt;/h2>
&lt;p>None. &lt;code>transportTemperature&lt;/code> does not construct &lt;code>fvOptions&lt;/code>, a turbulence
model, or a thermophysical model.&lt;/p>
&lt;h2 id="required-fields">Required Fields&lt;/h2>
&lt;p>How each field is obtained:&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>Unit&lt;/th>
&lt;th>Source&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&lt;/td>
&lt;td>m/s&lt;/td>
&lt;td>Looked up from the mesh registry (provided by the companion fluid type); read from &lt;code>0/&amp;lt;region&amp;gt;/U&lt;/code> (&lt;code>MUST_READ&lt;/code>) if not registered yet&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 face flux&lt;/td>
&lt;td>m³/s&lt;/td>
&lt;td>Looked up from the registry; otherwise read if a &lt;code>phi&lt;/code> file exists, else created as &lt;code>interpolate(U) &amp;amp; Sf&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>T&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Temperature&lt;/td>
&lt;td>K&lt;/td>
&lt;td>Looked up from the registry, otherwise read from &lt;code>0/&amp;lt;region&amp;gt;/T&lt;/code> (&lt;code>MUST_READ&lt;/code>, written)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>kappa&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Thermal conductivity&lt;/td>
&lt;td>W/(m K)&lt;/td>
&lt;td>Looked up from the registry, otherwise read from &lt;code>0/&amp;lt;region&amp;gt;/kappa&lt;/code> if present, else created uniform from &lt;code>transportProperties&lt;/code> (written)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Because fields are looked up from the mesh registry first, the companion
region type must be listed &lt;strong>before&lt;/strong> &lt;code>transportTemperature&lt;/code> so that it
creates &lt;code>U&lt;/code> and &lt;code>phi&lt;/code>; every tutorial does this.&lt;/p>
&lt;p>The coupling boundary conditions &lt;code>regionCoupledTemperatureJump&lt;/code> and
&lt;code>regionCoupledHeatFlux&lt;/code> look up the diffusivity field &lt;code>kappa&lt;/code> by default (or
the name given by their &lt;code>diffusivity&lt;/code> keyword), which matches the field this
region type registers.&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">/&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">cp&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">kappa&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">all&lt;/span> &lt;span class="n">required&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">T&lt;/span> &lt;span class="n">solver&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">relaxation&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">T&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">ddt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">div&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">phi&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">laplacian&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">kappa&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">T&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 (pimpleFluid transportTemperature) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (solid (conductTemperature) )
&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">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"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxCoupleIter 20;
&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"> maxJumpRes 1e-07;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputJumpResField no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxFluxRes 1e-07;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputFluxResField no;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&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="transportproperties">&lt;code>transportProperties&lt;/code>&lt;/h3>
&lt;p>All three entries are read with &lt;code>dimensionedScalar(name, dict)&lt;/code> and have no
defaults. They can share the dictionary with the companion fluid type&amp;rsquo;s
entries (&lt;code>transportModel&lt;/code>, &lt;code>nu&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">rho rho [1 -3 0 0 0 0 0] 1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp cp [0 2 -2 -1 0 0 0] 500.0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kappa kappa [1 1 -3 -1 0 0 0] 5.0;
&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"> T
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> solver GAMG;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tolerance 1e-7;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relTol 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> smoother GaussSeidel;
&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">relaxationFactors
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> T 1.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="coupled-t-boundary-condition-fluid-side-partitioned">Coupled &lt;code>T&lt;/code> boundary condition (fluid side, partitioned)&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">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 regionCoupledTemperatureJump;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (heatTransferInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> accType aitken;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relax 0.75;
&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 $internalField;
&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 solid side uses &lt;code>regionCoupledHeatFlux&lt;/code> on its interface patch.&lt;/p>
&lt;h2 id="coupling">Coupling&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Interface type&lt;/th>
&lt;th>Exchanged fields&lt;/th>
&lt;th>Coupling mode&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>heatTransferInterface&lt;/code>&lt;/td>
&lt;td>&lt;code>T&lt;/code> (jump on fluid side), heat flux $\kappa \nabla T \cdot \mathbf{n}$ (solid side)&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>No interface type accesses &lt;code>transportTemperature&lt;/code> directly. Coupling happens
through the &lt;code>T&lt;/code> boundary conditions above, which read &lt;code>kappa&lt;/code> from the region
registry. The partner region is &lt;code>conductTemperature&lt;/code> in all tutorials,
possibly stacked with &lt;code>solidStVK&lt;/code> for thermo-FSI.&lt;/p>
&lt;p>Companion flow region types: all tutorials use &lt;code>pimpleFluid&lt;/code>. Any flow type
that registers a volumetric &lt;code>U&lt;/code> and &lt;code>phi&lt;/code> on the same mesh should work in
principle (e.g. &lt;code>icoFluid&lt;/code>), but this is untested. &lt;code>rhoPimpleFluid&lt;/code>
registers a mass flux &lt;code>phi&lt;/code> (&lt;code>rho*U &amp;amp; Sf&lt;/code>), so it is dimensionally
inconsistent with the equation above.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Only solved as a DNA-coupled field&lt;/strong> — &lt;code>selfCoupledFieldNames()&lt;/code> is not
overridden, so without a &lt;code>DNA { T ... }&lt;/code> entry the temperature is never
solved (in particular not in single-region mode). There is no
&lt;code>tutorials/singleRegion/transportTemperature&lt;/code> case.&lt;/li>
&lt;li>&lt;strong>Monolithic coupling not available&lt;/strong> — monolithic coupling in
&lt;code>multiRegionSystem::solve()&lt;/code> is currently commented out.&lt;/li>
&lt;li>&lt;strong>Laminar heat conduction only&lt;/strong> — no turbulent diffusivity
($\kappa_t$ / &lt;code>Prt&lt;/code>). &lt;code>turbulentTransportTemperature&lt;/code>
(&lt;code>src/regions/turbulentTransportTemperature&lt;/code>) adds this but is commented out
in &lt;code>src/multiRegionSystem/Make/files&lt;/code> and therefore not built.&lt;/li>
&lt;li>&lt;strong>Constant properties&lt;/strong> — &lt;code>rho&lt;/code> and &lt;code>cp&lt;/code> are uniform constants; &lt;code>kappa&lt;/code> is
read once and only its boundary values are refreshed in &lt;code>correct()&lt;/code>.
No temperature-dependent properties.&lt;/li>
&lt;li>&lt;strong>One-way coupling&lt;/strong> — &lt;code>T&lt;/code> has no effect on the flow (no buoyancy). Use
&lt;code>buoyantPimpleFluid&lt;/code> for natural convection.&lt;/li>
&lt;li>&lt;strong>Incompressible flux assumed&lt;/strong> — the convection term has no
$\nabla\cdot\phi$ correction and expects a volumetric flux.&lt;/li>
&lt;li>&lt;strong>No &lt;code>fvOptions&lt;/code>&lt;/strong> — heat sources cannot be added.&lt;/li>
&lt;li>&lt;strong>No time-step constraint&lt;/strong> — &lt;code>getMinDeltaT()&lt;/code> returns &lt;code>GREAT&lt;/code>; no
diffusion-number based time-step limit.&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/conjugateHeatTransfer/flowOverHeatedPlate&lt;/code>&lt;/td>
&lt;td>Flow over a heated plate (pimpleFluid + transportTemperature / conductTemperature)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/conjugateHeatTransfer/ShellAndTubeHeatExchanger&lt;/code>&lt;/td>
&lt;td>Shell-and-tube heat exchanger with two fluid regions (inner, outer) and a solid wall&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Thermo-FSI: heated beam in cross flow (fluid: pimpleFluid + transportTemperature; solid: solidStVK + conductTemperature; DNA on &lt;code>D&lt;/code> and &lt;code>T&lt;/code>)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Alkfri, A., Habes, C., Marschall, H., &lt;em>multiRegionFoam: A Unified Multiphysics Framework for Multi-Region Coupled Continuum-Physical Problems&lt;/em>, Engineering with Computers, 2023.
DOI: &lt;a href="https://doi.org/10.1007/s00366-024-01974-4">10.1007/s00366-024-01974-4&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>