<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>multiPhysicsFoam – Fsi</title><link>https://multiphysicsfoam.com/tags/fsi/</link><description>Recent content in Fsi on multiPhysicsFoam</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://multiphysicsfoam.com/tags/fsi/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: fsiInterface</title><link>https://multiphysicsfoam.com/docs/user-guide/interface-physics/fsiinterface/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/interface-physics/fsiinterface/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>fsiInterface&lt;/code> couples a fluid region with a deforming solid region
(&lt;code>solidStVK&lt;/code>) along a common surface, using a partitioned Dirichlet-Neumann
scheme. The solid receives the fluid traction as a Neumann condition on its
displacement &lt;code>D&lt;/code>. The fluid interface patch is moved to the deformed solid
surface by the &lt;code>interfaceTrackingFvMesh&lt;/code> dynamic mesh of the fluid region. The
class has very little logic of its own. It builds a patch-to-patch mapping in
the deformed solid configuration, defines a geometric interface residual for
the DNA loop, and logs the total force on the solid. The traction transfer
lives in the &lt;code>regionCoupledTraction&lt;/code> boundary condition. The displacement
transfer lives in &lt;code>movingInterfacePatches&lt;/code> (&lt;code>src/dynamicFvMesh&lt;/code>).&lt;/p>
&lt;h2 id="interface-conditions">Interface Conditions&lt;/h2>
&lt;p>Let $\Gamma$ be the interface between the fluid region $f$ and the solid
region $s$. $\mathbf{x}_0$ is the undeformed position of a solid interface point.&lt;/p>
&lt;h3 id="kinematic-condition">Kinematic condition&lt;/h3>
$$
\mathbf{x}_f = \mathbf{x}_0 + \mathbf{D}_s \quad \text{on } \Gamma
$$
&lt;p>The fluid interface points follow the solid point displacement &lt;code>pointD&lt;/code>.
Velocity continuity is not imposed through &lt;code>fsiInterface&lt;/code>. In all FSI
tutorials the fluid velocity on the interface uses &lt;code>movingWallVelocity&lt;/code>, so the
fluid velocity at the wall equals the velocity of the moving mesh.&lt;/p>
&lt;h3 id="dynamic-condition">Dynamic condition&lt;/h3>
$$
\mathbf{n}_s \cdot \boldsymbol{\sigma}_s = -\,\mathbf{n}_f \cdot \boldsymbol{\sigma}_f \quad \text{on } \Gamma
$$
&lt;p>&lt;code>regionCoupledTraction&lt;/code> implements this as a fixed-gradient condition on &lt;code>D&lt;/code>.
The fluid traction $\mathbf{t}_f = \boldsymbol{\sigma}_f\cdot\mathbf{n}_f$
(fluid patch normals) is mapped to the solid patch and its sign is flipped,
$\mathbf{t} = -\mathbf{t}_f$. The normal gradient is then&lt;/p>
$$
\frac{\partial \mathbf{D}}{\partial n} =
\frac{1}{K}\left[\,\mathbf{t} - \mathbf{n}\cdot\boldsymbol{\sigma}_s + K\,\mathbf{n}_0\cdot\nabla\mathbf{D}\,\right],
\qquad
\mathbf{n} = \frac{\mathbf{F}^{-T}\cdot\mathbf{n}_0}{\lvert\mathbf{F}^{-T}\cdot\mathbf{n}_0\rvert}
$$
&lt;p>At convergence of the solid Picard loop, $\mathbf{n}\cdot\boldsymbol{\sigma}_s = \mathbf{t}$
holds in the deformed configuration.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$\mathbf{D}_s$&lt;/td>
&lt;td>Solid total displacement (&lt;code>D&lt;/code>, point field &lt;code>pointD&lt;/code>)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\sigma}_f$&lt;/td>
&lt;td>Fluid Cauchy stress (&lt;code>sigma&lt;/code> in the fluid region)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\sigma}_s$&lt;/td>
&lt;td>Solid Cauchy stress (&lt;code>sigma&lt;/code> in the solid region)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}_0$&lt;/td>
&lt;td>Undeformed solid patch normal&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}$&lt;/td>
&lt;td>Deformed solid patch normal&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{F}^{-1}$&lt;/td>
&lt;td>Inverse deformation gradient (&lt;code>Finv&lt;/code>)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$K$&lt;/td>
&lt;td>Implicit stiffness $2\mu+\lambda$ (&lt;code>impK&lt;/code>, $1/K$ = &lt;code>rImpK&lt;/code>)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="interface-residual">Interface residual&lt;/h3>
&lt;p>The DNA convergence measure is the mismatch between the deformed solid
interface points and the fluid interface points. The point positions of the
side listed second in &lt;code>coupledPatchPair&lt;/code> (side B) are mapped to side A:&lt;/p>
$$
r_\Gamma =
\frac{\lVert \mathbf{x}_s - \mathbf{x}_f \rVert_2}
{\max\left(\lVert \mathbf{x}_s \rVert_2,\ \lVert \mathbf{x}_f \rVert_2,\ \text{SMALL}\right)},
\qquad \mathbf{x}_s = \mathbf{x}_0 + \mathbf{D}_s
$$
&lt;p>The norms are global sums over all interface points (&lt;code>gSum&lt;/code>). The face-wise
field written with &lt;code>outputIntResField&lt;/code> is $\lvert\mathbf{x}_s-\mathbf{x}_f\rvert$,
interpolated from points to faces on patch A.&lt;/p>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>Which side is the solid is decided at run time. Side A is assumed to be the
solid unless the mesh of side B holds a &lt;code>pointVectorField&lt;/code> named &lt;code>pointD&lt;/code>.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Construction.&lt;/strong> The constructor reads the &lt;code>fsiInterfaceCoeffs&lt;/code> sub-dict,
which must be present but is not used. It then builds the
interface-to-interface mapping (&lt;code>makeInterfaceToInterface()&lt;/code>):
&lt;ol>
&lt;li>The solid mesh is moved temporarily to &lt;code>points + pointD&lt;/code>.&lt;/li>
&lt;li>An &lt;code>interfaceToInterfaceMapping&lt;/code> of type &lt;code>interfaceTransferMethod&lt;/code>
(&lt;code>AMI&lt;/code> or &lt;code>directMap&lt;/code>) is built between the two patches.&lt;/li>
&lt;li>The solid mesh is moved back and its &lt;code>moving&lt;/code> flag is reset. The solid
therefore stays total Lagrangian.&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;strong>Mapping updates.&lt;/strong> &lt;code>interfaces_-&amp;gt;update()&lt;/code> calls
&lt;code>updateInterpolatorAndGlobalPatches()&lt;/code> only if mesh A is &lt;code>changing()&lt;/code>. The
mapping is then rebuilt every &lt;code>interpolatorUpdateFrequency&lt;/code> time steps (0 =
never), or when mesh A changes without moving (topology change). A rebuild
goes through the same deformed-configuration step as in 1.&lt;/li>
&lt;li>&lt;strong>DNA loop for &lt;code>D&lt;/code>&lt;/strong> (&lt;code>multiRegionSystem::solve()&lt;/code>). The stand-alone PIMPLE
call is skipped when &lt;code>D&lt;/code> is DNA-coupled. Each DNA iteration then runs:
&lt;ol>
&lt;li>&lt;code>solvePIMPLE()&lt;/code> on the fluid region(s). This updates the fluid &lt;code>sigma&lt;/code>.&lt;/li>
&lt;li>&lt;code>assembleAndSolveEqns(&amp;quot;D&amp;quot;)&lt;/code>. The solid momentum equation is solved with
&lt;code>regionCoupledTraction&lt;/code> on the interface. The BC also stores the total
force $\sum \mathbf{t}\,\lvert\mathbf{S}_0\rvert$ on the interface via
&lt;code>setTotalForce()&lt;/code>.&lt;/li>
&lt;li>&lt;code>meshMotionCorrector()&lt;/code> on all regions. For the fluid
&lt;code>interfaceTrackingFvMesh&lt;/code> with &lt;code>fsiInterface yes&lt;/code>, the solid
&lt;code>pointD&lt;/code> on the neighbour patch is mapped to the fluid patch. The mapping
is built in the deformed solid configuration as in 1. The mapped
displacement is relaxed by the patch&amp;rsquo;s own acceleration model (&lt;code>accType&lt;/code>,
&lt;code>relax&lt;/code> in &lt;code>dynamicMeshDict&lt;/code>). The increment relative to the previous
iteration is imposed on the fluid patch, and the motion solver moves the
interior points.&lt;/li>
&lt;li>&lt;code>interfaces_-&amp;gt;update()&lt;/code>. This runs step 2 and &lt;code>info()&lt;/code>, which prints
&lt;code>Total force on solid interface: (...)&lt;/code>.&lt;/li>
&lt;li>&lt;code>dnaControl&lt;/code> evaluates &lt;code>normIntRes(&amp;quot;D&amp;quot;)&lt;/code> against &lt;code>maxIntRes&lt;/code>.&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>After the loop, &lt;code>postSolvePIMPLE()&lt;/code> runs on the fluid region(s).&lt;/li>
&lt;/ol>
&lt;p>&lt;code>correct()&lt;/code> is a no-op. &lt;code>getMinDeltaT()&lt;/code> returns &lt;code>GREAT&lt;/code>, so the interface does
not limit the time step.&lt;/p>
&lt;p>If &lt;code>coupled no&lt;/code>, &lt;code>regionCoupledTraction&lt;/code> returns before updating its gradient.
&lt;code>dnaControl&lt;/code> then stops after the first pass, and the interface residual
returns 0 for non-coupled interfaces. &lt;code>couplingStartTime&lt;/code> switches coupling on
once that time is reached.&lt;/p>
&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 (fluid / solid)&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>D&lt;/code>&lt;/td>
&lt;td>none (the fluid has no &lt;code>D&lt;/code>) / &lt;code>regionCoupledTraction&lt;/code>&lt;/td>
&lt;td>Solid displacement, driven by the fluid traction&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Fields looked up, but not coupled through a patch field pair:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Region&lt;/th>
&lt;th>Used by&lt;/th>
&lt;th>Provided by&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>pointD&lt;/code>&lt;/td>
&lt;td>solid&lt;/td>
&lt;td>&lt;code>fsiInterface&lt;/code> (mapping, residual, solid-side detection), &lt;code>movingInterfacePatches&lt;/code>&lt;/td>
&lt;td>&lt;code>solidStVK&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>sigma&lt;/code> (&lt;code>volSymmTensorField&lt;/code>)&lt;/td>
&lt;td>fluid&lt;/td>
&lt;td>&lt;code>regionCoupledTraction&lt;/code> (fluid traction)&lt;/td>
&lt;td>&lt;code>pimpleFluid&lt;/code> (also declared by &lt;code>icoFluid&lt;/code>, &lt;code>rhoPimpleFluid&lt;/code>, &lt;code>overPimpleFluid&lt;/code>, &lt;code>buoyantPimpleFluid&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>sigma&lt;/code>, &lt;code>impK&lt;/code>, &lt;code>rImpK&lt;/code>, &lt;code>gradD&lt;/code>, &lt;code>Finv&lt;/code>&lt;/td>
&lt;td>solid&lt;/td>
&lt;td>&lt;code>regionCoupledTraction&lt;/code>&lt;/td>
&lt;td>&lt;code>solidStVK&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Only &lt;code>maxIntRes&lt;/code> is meaningful for &lt;code>D&lt;/code>. The fluid has no &lt;code>D&lt;/code> field, so jump and
flux residuals are not evaluated for this interface.
&lt;code>regionCoupledTraction&lt;/code> uses a direct flux, so it cannot provide a flux
residual anyway.&lt;/p>
&lt;p>&lt;code>fsiInterface&lt;/code> creates no fields itself. With &lt;code>outputIntResField yes&lt;/code>,
&lt;code>dnaControl&lt;/code> writes &lt;code>DinitialIntRes&lt;/code> and &lt;code>DfinalIntRes&lt;/code> on mesh A.&lt;/p>
&lt;h2 id="compatible-region-types">Compatible Region Types&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Region type (fluid side)&lt;/th>
&lt;th>Region type (solid side)&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>pimpleFluid&lt;/code>&lt;/td>
&lt;td>&lt;code>solidStVK&lt;/code>&lt;/td>
&lt;td>Used in all FSI tutorials. The fluid mesh must be &lt;code>interfaceTrackingFvMesh&lt;/code> with &lt;code>fsiInterface yes&lt;/code> on the interface patch&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>Combined with &lt;code>heatTransferInterface&lt;/code> on the same patch pair (&lt;code>heatedBeamInCrossFlow&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>icoFluid&lt;/code>, &lt;code>rhoPimpleFluid&lt;/code>, &lt;code>overPimpleFluid&lt;/code>, &lt;code>buoyantPimpleFluid&lt;/code>&lt;/td>
&lt;td>&lt;code>solidStVK&lt;/code>&lt;/td>
&lt;td>These provide a &lt;code>sigma&lt;/code> stress field. Untested: no tutorial, and the dynamic-mesh support of each region type has not been checked&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&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/fluidStructureInteraction/HronTurekFsi3&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 (fsiInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> coupledPatchPair
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (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">
&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"> );
&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 no; // default yes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> couplingStartTime 2.0; // default 0; switches coupling on at t &amp;gt;= 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"> fsiInterfaceCoeffs // required, currently no entries read
&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(); // required (no default)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">interpolatorUpdateFrequency 0; // default 1; 0 = build mapping once
&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 AMI; // default AMI; or 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;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AMICoeffs // &amp;lt;interfaceTransferMethod&amp;gt;Coeffs is required
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>interfaceTransferMethod&lt;/code>, &lt;code>&amp;lt;method&amp;gt;Coeffs&lt;/code> and &lt;code>interpolatorUpdateFrequency&lt;/code>
are top-level entries and apply to every interface in the file.
&lt;code>beamInCrossFlow&lt;/code> and &lt;code>heatedBeamInCrossFlow&lt;/code> use &lt;code>directMap&lt;/code> and &lt;code>coupled yes&lt;/code>.&lt;/p>
&lt;p>FSI and conjugate heat transfer on the same patch pair
(&lt;code>heatedBeamInCrossFlow&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">interfaceType (fsiInterface heatTransferInterface);
&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;/code>&lt;/pre>&lt;/div>&lt;h3 id="multiregionproperties-dna-entry">&lt;code>multiRegionProperties&lt;/code> DNA entry&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">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) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ( solid (solidStVK) )
&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"> D
&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 100;
&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"> maxIntRes 1e-7;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputIntResField yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="fluid-dynamic-mesh-constantfluiddynamicmeshdict">Fluid dynamic mesh (&lt;code>constant/fluid/dynamicMeshDict&lt;/code>)&lt;/h3>
&lt;p>From &lt;code>HronTurekFsi3&lt;/code>. The &lt;code>interfaceShadow&lt;/code> entry names the solid patch and region:&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">dynamicFvMesh interfaceTrackingFvMesh;
&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 velocityLaplacian;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">diffusivity quadratic inverseDistance 2(interfaceShadow cylinder);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">twoDMotion yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">motionPlaneNormal (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">interfaceTrackingFvMeshCoeffs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> movingSurfacePatches
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceShadow
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> fsiInterface yes; // default false
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> neighbourPatch interface; // solid patch
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> neighbourMesh solid; // solid region (required with fsiInterface yes)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> accType aitken; // fixed (default) | aitken | IQNILS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relax 0.05; // default 1.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"> normalMotionDir 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"> fixedSurfacePatches 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"> interfaceDeformationLimit interfaceDeformationLimit [ 0 0 0 0 0 0 0 ] 0.0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interpolatorUpdateFrequency 0; // default 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"> pointNormalsCorrectionPatches 0();
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceTransferMethod AMI; // default AMI
&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;span class="line">&lt;span class="cl"> AMICoeffs{}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> smoothing 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"> smoothSurfaceMeshCoeffs{}
&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>This mapping (fluid mesh motion) is separate from the &lt;code>fsiInterface&lt;/code> mapping
(traction and residual). Both are configured independently. The tutorials use
the same method in both places.&lt;/p>
&lt;h3 id="boundary-conditions">Boundary conditions&lt;/h3>
&lt;p>Solid &lt;code>0/solid/D&lt;/code> (&lt;code>HronTurekFsi3/0/solid/orig/partitioned/D&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 regionCoupledTraction;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> neighbourFieldName sigma;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (fsiInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>interfaceType&lt;/code> is required. &lt;code>secondOrder&lt;/code> and &lt;code>nonOrthCorr&lt;/code> default to
&lt;code>false&lt;/code>. &lt;code>accType&lt;/code> and &lt;code>relax&lt;/code> may also be set here to relax the traction
gradient (default &lt;code>fixed&lt;/code>, &lt;code>1.0&lt;/code>). None of the tutorials do this.
&lt;code>neighbourFieldName&lt;/code> is read by the coupling manager, but
&lt;code>regionCoupledTraction&lt;/code> always looks up the fluid field named &lt;code>sigma&lt;/code>.&lt;/p>
&lt;p>Fluid &lt;code>0/fluid/U&lt;/code>, &lt;code>0/fluid/pKin&lt;/code> and &lt;code>0/fluid/pointMotionU&lt;/code>
(&lt;code>HronTurekFsi3/0/fluid/orig/partitioned/&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">// U
&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 movingWallVelocity;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">// pKin
&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 zeroGradient;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">// pointMotionU
&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 fixedValue; // overwritten each motion step by interfaceTrackingFvMesh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>interfaceTrackingFvMesh&lt;/code> requires the &lt;code>pointMotionU&lt;/code> interface patch to be
&lt;code>fixedValue&lt;/code>. It &lt;code>refCast&lt;/code>s it to &lt;code>fixedValuePointPatchVectorField&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Partitioned only.&lt;/strong> There is no monolithic FSI path, because monolithic
coupling is disabled in &lt;code>multiRegionSystem&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Solid must be &lt;code>solidStVK&lt;/code>.&lt;/strong> The solid side is detected by the presence of
&lt;code>pointD&lt;/code>. &lt;code>regionCoupledTraction&lt;/code> needs &lt;code>impK&lt;/code>, &lt;code>rImpK&lt;/code>, &lt;code>gradD&lt;/code>, &lt;code>sigma&lt;/code> and
&lt;code>Finv&lt;/code>, which only &lt;code>solidStVK&lt;/code> provides.&lt;/li>
&lt;li>&lt;strong>The fluid mesh motion is not done by &lt;code>fsiInterface&lt;/code>.&lt;/strong> Without an
&lt;code>interfaceTrackingFvMesh&lt;/code> entry with &lt;code>fsiInterface yes&lt;/code> on the fluid patch,
the fluid mesh does not follow the solid. The interface residual then never
drops.&lt;/li>
&lt;li>&lt;strong>Two independent mappings.&lt;/strong> &lt;code>fsiInterface&lt;/code> (traction, residual) and
&lt;code>movingInterfacePatches&lt;/code> (displacement) each build their own
interface-to-interface mapping from different dictionaries. Inconsistent
settings are not detected.&lt;/li>
&lt;li>&lt;strong>Mapping is built on the configuration at construction time&lt;/strong> when
&lt;code>interpolatorUpdateFrequency 0&lt;/code>, as in all tutorials. With large
deformations, the AMI/directMap weights are not refreshed. This is inferred
from the code and has not been tested for large-deformation cases.&lt;/li>
&lt;li>&lt;strong>Update trigger only checks mesh A.&lt;/strong> &lt;code>changing()&lt;/code> and &lt;code>moving()&lt;/code> look only
at the region listed first in &lt;code>coupledPatchPair&lt;/code>. If the static solid is
listed first, the &lt;code>fsiInterface&lt;/code> mapping is never rebuilt, whatever the
value of &lt;code>interpolatorUpdateFrequency&lt;/code>. The tutorials list the fluid first.
This is inferred from the code and untested.&lt;/li>
&lt;li>&lt;strong>Residual normalisation depends on the coordinate origin.&lt;/strong> $r_\Gamma$ is
normalised by the magnitude of the absolute point positions. Moving the
geometry away from the origin makes the same mismatch look smaller.
Inferred from the code.&lt;/li>
&lt;li>&lt;strong>Total force uses the undeformed area.&lt;/strong> The logged total force sums the
traction times the undeformed face area $\lvert\mathbf{S}_0\rvert$. It is a
diagnostic only.&lt;/li>
&lt;li>&lt;strong>&lt;code>fsiInterfaceCoeffs&lt;/code> is required but unused&lt;/strong>, and &lt;code>correct()&lt;/code> is a no-op.&lt;/li>
&lt;li>&lt;strong>RBF transfer is unavailable&lt;/strong> (it needs Eigen and is disabled), so only
&lt;code>AMI&lt;/code> and &lt;code>directMap&lt;/code> can be used.&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/fluidStructureInteraction/HronTurekFsi3&lt;/code>&lt;/td>
&lt;td>Hron-Turek FSI3 benchmark (pimpleFluid + solidStVK), AMI transfer, coupling starts at t = 2 s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/beamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Elastic beam in cross-flow (pimpleFluid + solidStVK), directMap transfer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Heated elastic beam in cross-flow; &lt;code>fsiInterface&lt;/code> + &lt;code>heatTransferInterface&lt;/code> on one patch pair (pimpleFluid + transportTemperature / solidStVK + conductTemperature)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>All three are run with &lt;code>./Allrun -p&lt;/code> (partitioned).&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Alkfri, A., Habes, C., Marschall, H., &lt;em>multiRegionFoam: A Unified Multiphysics Framework for Multi-Region Coupled Continuum-Physical Problems&lt;/em>, Engineering with Computers, 2023.
DOI: &lt;a href="https://doi.org/10.1007/s00366-024-01974-4">10.1007/s00366-024-01974-4&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Docs: interFluid</title><link>https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/interfluid/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/interfluid/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>interFluid&lt;/code> solves the flow of two incompressible, isothermal, immiscible
fluids (for example water and air) on one mesh. It captures the interface with
the algebraic &lt;strong>Volume-of-Fluid (VOF)&lt;/strong> method: one phase-fraction field
$\alpha_1$ is transported with a MULES-limited, interface-compressed equation,
and a single mixture momentum equation is solved with the &lt;strong>PIMPLE&lt;/strong>
algorithm. The momentum equation is written in terms of the pressure minus its
hydrostatic part, $p_{rgh}$. The region type is a port of OpenFOAM&amp;rsquo;s
&lt;code>interFoam&lt;/code> solver into the &lt;code>regionType&lt;/code> framework, built on the same pattern
as &lt;code>pimpleFluid&lt;/code>. It supports laminar, RANS and LES turbulence modelling,
surface tension (CSF), MRF, &lt;code>fvOptions&lt;/code> and mesh motion through
&lt;code>dynamicFvMesh&lt;/code>. It can run standalone, or as the fluid side of a
&lt;strong>fluid-structure interaction&lt;/strong> (FSI) case. For FSI it provides the Cauchy
stress tensor &lt;code>sigma&lt;/code> to &lt;code>fsiInterface&lt;/code>, it supports mesh motion driven by the
solid&amp;rsquo;s displacement, and it is laminar only. It cannot take part in any other
kind of inter-region coupling yet.&lt;/p>
&lt;h2 id="governing-equations">Governing Equations&lt;/h2>
&lt;h3 id="continuity">Continuity&lt;/h3>
$$
\nabla \cdot \mathbf{U} = 0
$$
&lt;h3 id="phase-fraction-transport">Phase-fraction transport&lt;/h3>
$$
\frac{\partial \alpha_1}{\partial t} + \nabla \cdot \left(\alpha_1 \mathbf{U}\right) + \nabla \cdot \left(\alpha_1 (1 - \alpha_1)\,\mathbf{U}_r\right) = 0,
\qquad \alpha_2 = 1 - \alpha_1
$$
&lt;p>The third term is an artificial &lt;strong>interface-compression&lt;/strong> term. It is non-zero
only inside the transition region ($0 &lt; \alpha_1 &lt; 1$) and works against the
numerical smearing of the interface. The compression velocity is never
assembled as a vector field. The code uses its face flux directly:&lt;/p>
$$
\phi_r = c_\alpha \left| \frac{\phi}{|\mathbf{S}_f|} \right| \hat{\mathbf{n}}_f \cdot \mathbf{S}_f
$$
&lt;p>$\phi_r$ is set to zero on all non-coupled boundary faces, so compression
never moves phase across a domain boundary.&lt;/p>
&lt;h3 id="mixture-properties">Mixture properties&lt;/h3>
$$
\rho = \alpha_1 \rho_1 + \alpha_2 \rho_2,
\qquad
\mu = \alpha_1 \rho_1 \nu_1 + \alpha_2 \rho_2 \nu_2,
\qquad
\nu = \mu / \rho
$$
&lt;h3 id="momentum">Momentum&lt;/h3>
$$
\frac{\partial (\rho \mathbf{U})}{\partial t} + \nabla \cdot \left(\rho \mathbf{U}\mathbf{U}\right) - \nabla \cdot \mathbf{R}
= -\nabla p_{rgh} - (\mathbf{g} \cdot \mathbf{h})\,\nabla \rho + \mathbf{F}_\sigma + \mathbf{S}_U
$$
&lt;p>In the discrete momentum equation the convective term uses the mass flux
&lt;code>rhoPhi&lt;/code>. This flux is rebuilt from the bounded MULES phase flux (see below),
so momentum and phase transport stay consistent.&lt;/p>
&lt;h3 id="surface-tension-csf">Surface tension (CSF)&lt;/h3>
$$
\mathbf{F}_\sigma = \sigma \kappa \nabla \alpha_1,
\qquad
\kappa = -\nabla \cdot \hat{\mathbf{n}},
\qquad
\hat{\mathbf{n}}_f = \frac{(\nabla \alpha_1)_f}{|(\nabla \alpha_1)_f| + \delta_N}
$$
&lt;p>At walls with an &lt;code>alphaContactAngle&lt;/code>-type boundary condition, the interface
normal is rotated so that the interface meets the wall at the prescribed
contact angle.&lt;/p>
&lt;h3 id="gravity-decomposition-and-pressure-recovery">Gravity decomposition and pressure recovery&lt;/h3>
$$
p_{rgh} = p - \rho\, \mathbf{g} \cdot \mathbf{h},
\qquad
gh = \mathbf{g} \cdot \mathbf{x}_C - gh_\text{ref},
\qquad
gh_f = \mathbf{g} \cdot \mathbf{x}_{C_f} - gh_\text{ref}
$$
&lt;p>The solver solves for $p_{rgh}$. The static pressure $p = p_{rgh} + \rho\,gh$
is recovered after each pressure correction.&lt;/p>
&lt;h3 id="stress-tensor-for-fsi-coupling">Stress tensor (for FSI coupling)&lt;/h3>
&lt;p>After each &lt;code>pressureCorrector()&lt;/code> call (once per outer corrector) the Cauchy
stress tensor is updated:&lt;/p>
$$
\boldsymbol{\sigma} = -p\,\mathbf{I} + \mu\left[\nabla\mathbf{U} + (\nabla\mathbf{U})^T - \tfrac{2}{3}(\nabla\cdot\mathbf{U})\,\mathbf{I}\right]
$$
&lt;p>The bracket is OpenFOAM&amp;rsquo;s &lt;code>devTwoSymm(fvc::grad(U))&lt;/code>. Since
$\nabla\cdot\mathbf{U} = 0$, its trace term vanishes up to discretisation
error. The pressure is $p$,
which is already dimensional, so unlike &lt;code>pimpleFluid&lt;/code> no $\rho$ factor is
needed. $\mu$ is the local &lt;strong>mixture&lt;/strong> dynamic viscosity, so the viscous
traction switches between water and air values across the interface. The
field is &lt;code>sigma&lt;/code>, and &lt;code>fsiInterface&lt;/code> uses it to compute the traction on the
solid side (via &lt;code>regionCoupledTraction&lt;/code>).&lt;/p>
&lt;p>This is the stress formula of &lt;code>pimpleFluid&lt;/code> with only the molecular viscosity
kept:
$\rho\left(-p_\text{kin}\mathbf{I} - \mathbf{R}^\text{dev}\right) = -p\,\mathbf{I} + \mu_\text{eff}\,\texttt{devTwoSymm}(\nabla\mathbf{U})$
with $\mu_\text{eff} \to \mu$. The turbulent (Reynolds-stress) part is
&lt;strong>not&lt;/strong> included, because the VOF turbulence wrapper
(&lt;code>incompressibleInterPhaseTransportModel&lt;/code>) has no public &lt;code>devRhoReff()&lt;/code>. The
expression is exact for laminar flow.&lt;/p>
&lt;div class="alert alert-info" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;p>The field &lt;code>sigma&lt;/code> (Cauchy stress, Pa) is not the same thing as the entry
&lt;code>sigma&lt;/code> in &lt;code>transportProperties&lt;/code> (surface tension coefficient, N/m). They
only share a name.&lt;/p>
&lt;/div>
&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>$\alpha_1$, $\alpha_2$&lt;/td>
&lt;td>Phase fraction of phase 1 / phase 2&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{U}$&lt;/td>
&lt;td>Mixture velocity (shared by both phases)&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi$&lt;/td>
&lt;td>Volumetric face flux&lt;/td>
&lt;td>m³/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$p$&lt;/td>
&lt;td>Static pressure&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$p_{rgh}$&lt;/td>
&lt;td>Pressure minus hydrostatic contribution&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\rho_1$, $\rho_2$ / $\rho$&lt;/td>
&lt;td>Phase densities / mixture density&lt;/td>
&lt;td>kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\nu_1$, $\nu_2$ / $\mu$&lt;/td>
&lt;td>Phase kinematic viscosities / mixture dynamic viscosity&lt;/td>
&lt;td>m²/s / Pa·s&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>$\mathbf{U}_r$, $\phi_r$&lt;/td>
&lt;td>Compression velocity / compression flux&lt;/td>
&lt;td>m/s / m³/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$c_\alpha$&lt;/td>
&lt;td>Interface-compression coefficient (&lt;code>cAlpha&lt;/code>)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\sigma$&lt;/td>
&lt;td>Surface tension coefficient&lt;/td>
&lt;td>N/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\kappa$&lt;/td>
&lt;td>Interface curvature&lt;/td>
&lt;td>1/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\hat{\mathbf{n}}$&lt;/td>
&lt;td>Interface unit normal&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{g}$&lt;/td>
&lt;td>Gravitational acceleration&lt;/td>
&lt;td>m/s²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$h_\text{ref}$&lt;/td>
&lt;td>Reference height (&lt;code>constant/hRef&lt;/code>, optional)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{F}_\sigma$&lt;/td>
&lt;td>Surface tension force&lt;/td>
&lt;td>N/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{S}_U$&lt;/td>
&lt;td>Momentum source (from &lt;code>fvOptions&lt;/code>)&lt;/td>
&lt;td>N/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\sigma}$&lt;/td>
&lt;td>Cauchy stress tensor (FSI)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="numerical-algorithm">Numerical Algorithm&lt;/h2>
&lt;p>The framework drives &lt;code>interFluid&lt;/code> through the &lt;code>regionType&lt;/code> PIMPLE phases.
For every outer corrector (&lt;code>nOuterCorrectors&lt;/code>), &lt;code>regionTypeList::solvePIMPLE()&lt;/code>
calls &lt;code>prePredictor()&lt;/code>, then &lt;code>momentumPredictor()&lt;/code>, then
&lt;code>pressureCorrector()&lt;/code>. This is the same order as the loop body of stock
&lt;code>interFoam&lt;/code>.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Mesh motion&lt;/strong> (&lt;code>prePredictor()&lt;/code>, dynamic meshes only). Runs
&lt;code>mesh().controlledUpdate()&lt;/code> once per time step, or on every outer corrector
if &lt;code>moveMeshOuterCorrectors yes&lt;/code>. Then it recomputes &lt;code>gh&lt;/code>/&lt;code>ghf&lt;/code>, updates
MRF and, if &lt;code>correctPhi&lt;/code> is on, restores a divergence-free flux on the moved
mesh. It also corrects &lt;code>Uf&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Phase-fraction transport&lt;/strong> (&lt;code>prePredictor()&lt;/code>). Re-reads the alpha
controls, then solves the $\alpha_1$ equation with MULES. There are two
options:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>explicit MULES&lt;/strong> (&lt;code>MULESCorr no&lt;/code>), which applies a limited flux in one
step, or&lt;/li>
&lt;li>&lt;strong>semi-implicit MULES&lt;/strong> (&lt;code>MULESCorr yes&lt;/code>), which first solves an implicit,
upwind-bounded predictor and then applies &lt;code>nAlphaCorr&lt;/code> limited
high-order correction passes.&lt;/li>
&lt;/ul>
&lt;p>With &lt;code>nAlphaSubCycles &amp;gt; 1&lt;/code> this step is sub-cycled and the mass flux
&lt;code>rhoPhi&lt;/code> is averaged over time across the sub-cycles. Afterwards
$\rho = \alpha_1\rho_1 + \alpha_2\rho_2$ is updated, and
&lt;code>mixture.correct()&lt;/code> recomputes the normals, curvature and surface-tension
force.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Momentum predictor&lt;/strong> (&lt;code>momentumPredictor()&lt;/code>). Builds the momentum matrix
with &lt;code>rho&lt;/code>/&lt;code>rhoPhi&lt;/code> and caches it. If &lt;code>momentumPredictor yes&lt;/code>, it solves the
matrix against the explicit surface-tension, buoyancy and $p_{rgh}$-gradient
forcing, reconstructed from face fluxes.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Pressure correction, PISO loop&lt;/strong> (&lt;code>pressureCorrector()&lt;/code>). Runs
&lt;code>nCorrectors&lt;/code> times. It builds $r_{AU} = 1/A$, $\mathbf{H}/A$ and a
Rhie–Chow-consistent &lt;code>phiHbyA&lt;/code> (including &lt;code>ddtCorr&lt;/code>, which is aware of mesh
motion). It adds the surface-tension and gravity flux:&lt;/p>
&lt;/li>
&lt;/ol>
$$
\phi_g = \left(\mathbf{F}_{\sigma,f} - gh_f\,\nabla^\perp_f \rho\right) r_{AU,f}\,|\mathbf{S}_f|
$$
&lt;p>and solves the pressure equation:&lt;/p>
$$
\nabla \cdot \left( r_{AU,f}\,\nabla p_{rgh} \right) = \nabla \cdot \phi_{HbyA}
$$
&lt;p>The non-orthogonal corrector sub-loop is controlled by
&lt;code>nNonOrthogonalCorrectors&lt;/code>. On the final non-orthogonal iteration the
solver corrects the flux and the velocity:&lt;/p>
$$
\phi = \phi_{HbyA} - \left(r_{AU,f}\nabla p_{rgh}\right)_f,
\qquad
\mathbf{U} = \mathbf{H}/A + r_{AU}\,\mathcal{R}\!\left(\frac{\phi_g - \left(r_{AU,f}\nabla p_{rgh}\right)_f}{r_{AU,f}}\right)
$$
&lt;p>where $\mathcal{R}$ is the face-to-cell reconstruction (&lt;code>fvc::reconstruct&lt;/code>).
It then reports continuity errors, corrects &lt;code>Uf&lt;/code>, makes the flux relative to
the mesh motion and recovers $p = p_{rgh} + \rho\,gh$. For closed domains it
also applies the reference-pressure shift.
5. &lt;strong>Turbulence correction&lt;/strong> (end of &lt;code>pressureCorrector()&lt;/code>). Calls
&lt;code>turbulence-&amp;gt;correct()&lt;/code> when &lt;code>pimple.turbCorr()&lt;/code> is true.
6. &lt;strong>Stress update&lt;/strong> (end of &lt;code>pressureCorrector()&lt;/code>). Recomputes &lt;code>sigma&lt;/code> from
the new $p$ and $\mathbf{U}$ for FSI coupling. This runs on every outer
corrector, including in standalone runs.&lt;/p>
&lt;p>The scheme is fully segregated. $\alpha_1$, $\mathbf{U}$/$p_{rgh}$ and the
turbulence fields are each solved with the other fields frozen, and the outer
correctors provide the non-linear coupling between them.&lt;/p>
&lt;h3 id="time-step-control">Time-step control&lt;/h3>
&lt;p>&lt;code>getMinDeltaT()&lt;/code> computes the flow Courant number over all cells and the
interface Courant number $\mathrm{Co}_\alpha$ over cells with
$0.01 &lt; \alpha_1 &lt; 0.99$. It returns:&lt;/p>
$$
\Delta t_\text{stab} = \Delta t \cdot \min\!\left(
\frac{\mathrm{Co}_\text{max}}{\mathrm{Co} + \epsilon},\;
\frac{\mathrm{Co}_{\alpha,\text{max}}}{\mathrm{Co}_\alpha + \epsilon}
\right)
$$
&lt;p>The solver&amp;rsquo;s &lt;code>setDeltaT.H&lt;/code> then limits how fast the step can grow (at most a
factor of 1.2 per step, damped) and caps it at &lt;code>maxDeltaT&lt;/code>.&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>Two-phase mixture&lt;/td>
&lt;td>&lt;code>constant/transportProperties&lt;/code>&lt;/td>
&lt;td>&lt;code>immiscibleIncompressibleTwoPhaseMixture&lt;/code>; &lt;code>phases (&amp;lt;phase1&amp;gt; &amp;lt;phase2&amp;gt;)&lt;/code> plus a per-phase &lt;code>transportModel&lt;/code>/&lt;code>nu&lt;/code>/&lt;code>rho&lt;/code> sub-dict&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Surface tension&lt;/td>
&lt;td>&lt;code>constant/transportProperties&lt;/code> (&lt;code>sigma&lt;/code>)&lt;/td>
&lt;td>Run-time selectable &lt;code>surfaceTensionModel&lt;/code>; a constant value is enough&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>incompressibleInterPhaseTransportModel&lt;/code>, evaluated on mixture properties&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Gravity / reference height&lt;/td>
&lt;td>&lt;code>constant/g&lt;/code>, &lt;code>constant/hRef&lt;/code> (optional)&lt;/td>
&lt;td>&lt;code>hRef&lt;/code> defaults to 0&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>&lt;/td>
&lt;td>Explicit/implicit momentum sources, porosity&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mesh motion&lt;/td>
&lt;td>&lt;code>constant/dynamicMeshDict&lt;/code>&lt;/td>
&lt;td>Any stock &lt;code>dynamicFvMesh&lt;/code> + &lt;code>motionSolver&lt;/code> (e.g. &lt;code>dynamicMotionSolverFvMesh&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>alpha.&amp;lt;phase1&amp;gt;&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Phase fraction of the first phase listed in &lt;code>phases&lt;/code> (e.g. &lt;code>alpha.water&lt;/code>)&lt;/td>
&lt;td>–&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>&lt;code>p_rgh&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Pressure minus hydrostatic contribution&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Turbulence fields&lt;/td>
&lt;td>–&lt;/td>
&lt;td>As required by the selected model (e.g. &lt;code>k&lt;/code>, &lt;code>epsilon&lt;/code>, &lt;code>omega&lt;/code>, &lt;code>nut&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>phi&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceScalarField&lt;/code>&lt;/td>
&lt;td>Volumetric face flux (written)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Static pressure $p_{rgh} + \rho\,gh$ (written)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>alphaPhi0.&amp;lt;phase1&amp;gt;&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceScalarField&lt;/code>&lt;/td>
&lt;td>MULES phase flux (written; read back on restart)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>rho&lt;/code>, &lt;code>rhoPhi&lt;/code>&lt;/td>
&lt;td>vol / surface scalar&lt;/td>
&lt;td>Mixture density and mass flux (not written)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gh&lt;/code>, &lt;code>ghf&lt;/code>&lt;/td>
&lt;td>vol / surface scalar&lt;/td>
&lt;td>$\mathbf{g}\cdot\mathbf{h}$ at cell and face centres (not written)&lt;/td>
&lt;td>always&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>alphaPhiUn&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceScalarField&lt;/code>&lt;/td>
&lt;td>Unlimited compressed flux, registered for the &lt;code>scalarTransport&lt;/code> function object (not written)&lt;/td>
&lt;td>always&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 $-p\mathbf{I} + \mu\,\texttt{devTwoSymm}(\nabla\mathbf{U})$ (written)&lt;/td>
&lt;td>always (FSI)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Uf&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceVectorField&lt;/code>&lt;/td>
&lt;td>Face velocity&lt;/td>
&lt;td>moving mesh 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">transportProperties&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">phases&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">per&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">phase&lt;/span> &lt;span class="n">nu&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">rho&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sigma&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">constant&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">g&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">gravitational&lt;/span> &lt;span class="n">acceleration&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">alpha&lt;/span> &lt;span class="n">solver&lt;/span> &lt;span class="n">controls&lt;/span>&lt;span class="p">,&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="p">,&lt;/span> &lt;span class="n">linear&lt;/span> &lt;span class="n">solvers&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">system&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">fvSchemes&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">discretisation&lt;/span> &lt;span class="n">schemes&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Optional: &lt;code>constant/hRef&lt;/code>, &lt;code>constant/MRFProperties&lt;/code>, &lt;code>system/fvOptions&lt;/code>,
&lt;code>constant/dynamicMeshDict&lt;/code>.&lt;/p>
&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">phases (water air);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">water
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> transportModel Newtonian;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nu 1e-06;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rho 1000;
&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">air
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> transportModel Newtonian;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nu 1.48e-05;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rho 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">sigma 0.07;
&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 (interFluid) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For FSI, pair it with a solid region:&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 (interFluid) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ( solid (solidStVK) )
&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;p>When running as a standalone single-region case via &lt;code>singleRegionMode&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">application multiPhysicsFoam;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&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 interFluid;
&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;p>The alpha controls are read from the solver entry that matches
&lt;code>alpha.&amp;lt;phase1&amp;gt;&lt;/code> on every time step. &lt;code>nAlphaCorr&lt;/code> and &lt;code>nAlphaSubCycles&lt;/code> are
&lt;strong>mandatory&lt;/strong>.&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">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"> &amp;#34;alpha.water.*&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nAlphaCorr 2; // MULES correction passes (mandatory)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nAlphaSubCycles 1; // alpha sub-cycles per time step (mandatory)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> cAlpha 1; // interface compression (0 = off)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> MULESCorr yes; // semi-implicit MULES predictor-corrector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nLimiterIter 5; // MULES limiter iterations
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> alphaApplyPrevCorr no; // reuse previous correction flux
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> icAlpha 0; // isotropic compression coefficient
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> scAlpha 0; // shear compression coefficient
&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 smoothSolver; // used for the MULESCorr predictor
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> smoother symGaussSeidel;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tolerance 1e-8;
&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"> &amp;#34;pcorr.*&amp;#34; { solver PCG; preconditioner DIC; tolerance 1e-5; relTol 0; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> p_rgh { solver PCG; preconditioner DIC; tolerance 1e-7; relTol 0.05; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> p_rghFinal { $p_rgh; relTol 0; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> U { solver smoothSolver; smoother symGaussSeidel; tolerance 1e-6; relTol 0; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PIMPLE
&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 no;
&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 3;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nNonOrthogonalCorrectors 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"> // 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"> // Pressure reference (closed domains)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> p_rghRefCell 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pRefValue 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="key-fvschemes-entries">Key &lt;code>fvSchemes&lt;/code> entries&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">divSchemes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> div(rhoPhi,U) Gauss linearUpwind grad(U);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> div(phi,alpha) Gauss vanLeer; // bounded TVD scheme for advection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> div(phirb,alpha) Gauss linear; // compression term
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>ddt(alpha)&lt;/code> accepts &lt;code>Euler&lt;/code> or &lt;code>CrankNicolson&lt;/code> (with an off-centering
coefficient). &lt;code>localEuler&lt;/code> (LTS) is not supported.&lt;/p>
&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 1; // maximum flow Courant number
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">maxAlphaCo 1; // maximum interface Courant number
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">maxDeltaT 1; // upper bound on time-step size
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="coupling">Coupling&lt;/h2>
&lt;p>&lt;code>interFluid&lt;/code> participates in the following multi-region interfaces:&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>fsiInterface&lt;/code>&lt;/td>
&lt;td>Displacement &lt;code>D&lt;/code>, traction &lt;code>sigma·n&lt;/code>&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>FSI works the same way as for &lt;code>pimpleFluid&lt;/code>, and nothing FSI-specific is
needed in the fluid&amp;rsquo;s own boundary conditions:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Fluid → solid (traction).&lt;/strong> The solid&amp;rsquo;s &lt;code>regionCoupledTraction&lt;/code> boundary
condition looks up the fluid&amp;rsquo;s registered &lt;code>sigma&lt;/code> field by name on the
neighbour mesh and takes &lt;code>sigma·n&lt;/code> on the interface patch. &lt;code>sigma&lt;/code> only has
to exist under that name, so it does not need to be listed in
&lt;code>coupledFields&lt;/code>. Because $p$ includes the hydrostatic part ($p_{rgh} +
\rho\,gh$) and $\mu$ is the mixture viscosity, the traction is correct
whether the wall is wetted by water or by air.&lt;/li>
&lt;li>&lt;strong>Solid → fluid (displacement).&lt;/strong> The fluid mesh follows the solid through
a &lt;code>dynamicMeshDict&lt;/code> (a &lt;code>dynamicMotionSolverFvMesh&lt;/code> plus a motion solver),
set up as in the &lt;code>pimpleFluid&lt;/code> FSI tutorials (e.g. &lt;code>HronTurekFsi3&lt;/code>). The DNA
loop calls &lt;code>meshMotionCorrector()&lt;/code> for the &lt;code>D&lt;/code> field. The fluid interface patch uses
standard boundary conditions, e.g. &lt;code>movingWallVelocity&lt;/code> for &lt;code>U&lt;/code> and
&lt;code>fixedFluxPressure&lt;/code> for &lt;code>p_rgh&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>&lt;code>setCoupledEqns&lt;/code> is still a no-op, and the region registers no
self-coupled fields of its own. Other interface types
(&lt;code>heatTransferInterface&lt;/code>, &lt;code>capillaryInterface&lt;/code>, &lt;code>massTransferInterface&lt;/code>)
are not supported, since the region has no temperature field and no
interface-coupled boundary conditions.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>FSI is the only coupling.&lt;/strong> Only &lt;code>fsiInterface&lt;/code> (partitioned, DNA) is
supported. There is no monolithic coupling and no thermal or
mass-transfer coupling (see &lt;a href="https://multiphysicsfoam.com/docs/user-guide/region-physics/fluid-models/interfluid/#coupling">Coupling&lt;/a>).&lt;/li>
&lt;li>&lt;strong>Laminar FSI traction.&lt;/strong> &lt;code>sigma&lt;/code> contains only the molecular viscous
stress. With a RAS/LES model the fluid flow itself is turbulent, but the
traction passed to the solid misses the Reynolds-stress part. That part is
usually small compared with the pressure at a wall, but it is not zero.&lt;/li>
&lt;li>&lt;strong>No FSI tutorial yet.&lt;/strong> Coupling with &lt;code>solidStVK&lt;/code> has been shown to run,
but there is no complete, validated VOF-FSI tutorial in the repository yet.&lt;/li>
&lt;li>&lt;strong>Two incompressible phases only.&lt;/strong> Both densities are constant. There is
no compressibility, no more than two phases, and no phase change (the
&lt;code>Su&lt;/code>/&lt;code>Sp&lt;/code> alpha sources are zero). For phase change across a sharp
interface, &lt;code>interTrackFluid&lt;/code> with &lt;code>massTransferInterface&lt;/code> is intended
(currently disabled in &lt;code>src/multiRegionSystem/Make/files&lt;/code>).&lt;/li>
&lt;li>&lt;strong>Isothermal.&lt;/strong> No energy equation is solved.&lt;/li>
&lt;li>&lt;strong>No local time stepping (LTS).&lt;/strong> The &lt;code>localEuler&lt;/code> branch in the alpha
equation is kept for fidelity with the stock code, but it is dead code.&lt;/li>
&lt;li>&lt;strong>Simplified &lt;code>correctPhi&lt;/code> after mesh motion.&lt;/strong> The flux correction uses a
constant &lt;code>rAUf = 1&lt;/code> instead of stock &lt;code>interFoam&lt;/code>&amp;rsquo;s time-persisted
&lt;code>1/UEqn.A()&lt;/code>. The PISO loop still enforces continuity on the new mesh; only
the initial flux guess is affected.&lt;/li>
&lt;li>&lt;strong>Mesh motion not yet validated.&lt;/strong> The code path follows &lt;code>pimpleFluid&lt;/code>, but
no finished tutorial uses a &lt;code>dynamicMeshDict&lt;/code> yet.&lt;/li>
&lt;li>&lt;strong>&lt;code>sigma&lt;/code> is always computed and written.&lt;/strong> This adds a &lt;code>grad(U)&lt;/code>
evaluation per outer corrector and one more field per write time, even in
standalone runs where nothing reads it.&lt;/li>
&lt;li>&lt;strong>No wave generation.&lt;/strong> &lt;code>waveModels&lt;/code> is linked but not used by this region.&lt;/li>
&lt;li>&lt;strong>Diffuse interface.&lt;/strong> As with any algebraic VOF/CSF method, the interface
is smeared over a few cells and parasitic currents can appear near the
interface in surface-tension-dominated 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/interFluid/damBreak&lt;/code>&lt;/td>
&lt;td>2D laminar collapse of a water column over an obstacle, adapted from &lt;code>interFoam/laminar/damBreak&lt;/code> (static mesh, single-region, adjustable 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;li>Rusche, H., &lt;em>Computational Fluid Dynamics of Dispersed Two-Phase Flows at High Phase Fractions&lt;/em>, PhD thesis, Imperial College London, 2002.&lt;/li>
&lt;li>Brackbill, J. U., Kothe, D. B., Zemach, C., &lt;em>A continuum method for modeling surface tension&lt;/em>, Journal of Computational Physics 100(2), 335–354, 1992.
DOI: &lt;a href="https://doi.org/10.1016/0021-9991(92)90240-Y">10.1016/0021-9991(92)90240-Y&lt;/a>&lt;/li>
&lt;li>Deshpande, S. S., Anumolu, L., Trujillo, M. F., &lt;em>Evaluating the performance of the two-phase flow solver interFoam&lt;/em>, Computational Science &amp;amp; Discovery 5, 014016, 2012.
DOI: &lt;a href="https://doi.org/10.1088/1749-4699/5/1/014016">10.1088/1749-4699/5/1/014016&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Docs: regionCoupledTraction</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledtraction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/coupled-boundary-conditions/regioncoupledtraction/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>regionCoupledTraction&lt;/code> applies the fluid load to the solid in a partitioned
fluid-structure interaction. It acts on the solid displacement &lt;code>D&lt;/code>
(&lt;code>volVectorField&lt;/code>) and derives from &lt;code>genericRegionCoupledFlux&amp;lt;vector&amp;gt;&lt;/code>, i.e.
from &lt;code>fixedGradient&lt;/code>. It uses the &amp;ldquo;direct flux&amp;rdquo; path of the base class: the
gradient is computed entirely from the fluid traction and the solid stress
state, with no flux matching against a partner BC. There is no partner
coupled BC on the fluid side, because the fluid has no &lt;code>D&lt;/code> field. The fluid
side follows the solid through the &lt;code>interfaceTrackingFvMesh&lt;/code> mesh motion, and
its velocity usually uses &lt;code>movingWallVelocity&lt;/code>. The BC belongs to
&lt;code>fsiInterface&lt;/code> and aborts if the first entry of its &lt;code>interfaceType&lt;/code> list is
not &lt;code>fsiInterface&lt;/code>. The solid region must be &lt;code>solidStVK&lt;/code>.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>The fluid traction is evaluated on the fluid patch, mapped to the solid patch
and its sign is flipped:&lt;/p>
$$
\mathbf{t} = -\,\mathcal{I}_{f\to s}\!\left(\boldsymbol{\sigma}_f\cdot\mathbf{n}_f\right)
$$
&lt;p>The normal displacement gradient is then&lt;/p>
$$
\frac{\partial \mathbf{D}}{\partial n} =
\frac{1}{K}\left[\,\mathbf{t} - \mathbf{n}\cdot\boldsymbol{\sigma}_s + K\,\mathbf{n}_0\cdot\nabla\mathbf{D}\,\right],
\qquad
\mathbf{n} = \frac{\mathbf{F}^{-T}\cdot\mathbf{n}_0}{\lvert\mathbf{F}^{-T}\cdot\mathbf{n}_0\rvert}
\quad \text{on } \Gamma_s
$$
&lt;p>This is the usual segregated traction condition: the explicit stress
$\mathbf{n}\cdot\boldsymbol{\sigma}_s$ is replaced by the implicit
$K\,\partial\mathbf{D}/\partial n$ part. At convergence of the solid Picard
loop $\mathbf{n}\cdot\boldsymbol{\sigma}_s = \mathbf{t}$ holds in the deformed
configuration. The gradient is relaxed by the acceleration model,
$g^{k} = g^{k-1} + \omega\,(g^{*} - g^{k-1})$, and the patch value is
reconstructed as $\mathbf{D}_b = \mathbf{D}_P + \mathbf{k}\cdot\nabla\mathbf{D}_P + g/\Delta_f$
(first order) or $\mathbf{D}_P + \mathbf{k}\cdot\nabla\mathbf{D}_P + (g + \mathbf{n}_0\cdot\nabla\mathbf{D}_P)/(2\Delta_f)$
(&lt;code>secondOrder yes&lt;/code>); the $\mathbf{k}$ term only with &lt;code>nonOrthCorr yes&lt;/code>.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$\mathbf{D}$&lt;/td>
&lt;td>Solid total displacement&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\sigma}_f$&lt;/td>
&lt;td>Fluid Cauchy stress, &lt;code>volSymmTensorField sigma&lt;/code> of the fluid region&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}_f$&lt;/td>
&lt;td>Outward unit normal of the fluid patch&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\sigma}_s$&lt;/td>
&lt;td>Solid Cauchy stress (&lt;code>sigma&lt;/code> of the solid)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}_0$&lt;/td>
&lt;td>Undeformed solid patch normal&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}$&lt;/td>
&lt;td>Deformed solid patch normal&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{F}^{-1}$&lt;/td>
&lt;td>Inverse deformation gradient (&lt;code>Finv&lt;/code>)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$K$&lt;/td>
&lt;td>Implicit stiffness (&lt;code>impK&lt;/code>); $1/K$ = &lt;code>rImpK&lt;/code>&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\nabla\mathbf{D}$&lt;/td>
&lt;td>Displacement gradient (&lt;code>gradD&lt;/code>)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;code>updateCoeffs()&lt;/code> is the generic one of &lt;code>genericRegionCoupledFlux&lt;/code> with
&lt;code>useDirectFlux()&lt;/code> returning &lt;code>true&lt;/code>:&lt;/p>
&lt;ol>
&lt;li>Return if updated or if the interface has &lt;code>coupled no&lt;/code>. The gradient is
then frozen at its last value. With &lt;code>couplingStartTime&lt;/code>, the coupling is
switched on once that time is reached.&lt;/li>
&lt;li>Call &lt;code>update()&lt;/code> on the first &lt;code>interfaceType&lt;/code>, i.e. the &lt;code>fsiInterface&lt;/code>.&lt;/li>
&lt;li>Set &lt;code>gradient() = flux()&lt;/code>, relax it, call &lt;code>fixedGradient::updateCoeffs()&lt;/code>.&lt;/li>
&lt;/ol>
&lt;p>&lt;code>flux()&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>checks that the first &lt;code>interfaceType&lt;/code> is &lt;code>fsiInterface&lt;/code>;&lt;/li>
&lt;li>looks up the fluid field named &lt;code>sigma&lt;/code> (hardcoded) in the neighbour region,
takes its patch values on the neighbour patch, dots them with the
neighbour patch normals, interpolates the result to the solid patch and
negates it;&lt;/li>
&lt;li>looks up &lt;code>impK&lt;/code>, &lt;code>rImpK&lt;/code>, &lt;code>gradD&lt;/code>, &lt;code>sigma&lt;/code> and &lt;code>Finv&lt;/code> on the solid patch
(all provided by &lt;code>solidStVK&lt;/code>);&lt;/li>
&lt;li>calls &lt;code>fsiInterface::setTotalForce()&lt;/code> with
$\sum \mathbf{t}\,\lvert\mathbf{S}_0\rvert$ (undeformed face areas). The
interface logs this value in &lt;code>info()&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>&lt;code>evaluate()&lt;/code> uses the registered &lt;code>grad(D)&lt;/code> if one exists. &lt;code>solidStVK&lt;/code>
registers its gradient as &lt;code>gradD&lt;/code>, so in practice &lt;code>fvc::grad(D)&lt;/code> is computed
on every evaluation.&lt;/p>
&lt;p>In the DNA loop for &lt;code>D&lt;/code> (&lt;code>multiRegionSystem::solve()&lt;/code>), each iteration runs
&lt;code>solvePIMPLE()&lt;/code> on the fluid (updating the fluid &lt;code>sigma&lt;/code>), then assembles and
solves &lt;code>D&lt;/code> with this BC, then &lt;code>meshMotionCorrector()&lt;/code> and
&lt;code>interfaces_-&amp;gt;update()&lt;/code>. Convergence is judged by the &lt;code>fsiInterface&lt;/code>
interface residual (&lt;code>maxIntRes&lt;/code>). The jump and flux residuals of the generic
base classes cannot be used: &lt;code>rawResidual()&lt;/code>/&lt;code>normResidual()&lt;/code> abort for a
direct-flux BC, and the fluid has no &lt;code>D&lt;/code> field anyway.&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>regionCoupledTraction&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interfaceType&lt;/code>&lt;/td>
&lt;td>List of interface type names. The first entry must be &lt;code>fsiInterface&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>neighbourFieldName&lt;/code>&lt;/td>
&lt;td>Read by the coupling manager, but ignored: the fluid field is always looked up as &lt;code>sigma&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>local field name (&lt;code>D&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradient&lt;/code>&lt;/td>
&lt;td>Initial displacement gradient. Read if present; otherwise zero gradient and the patch value is set from the internal field&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Not read (&lt;code>fixedGradient&lt;/code> ignores it). Written by &lt;code>write()&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>diffusivity&lt;/code>&lt;/td>
&lt;td>Read by the base class, not used (direct flux)&lt;/td>
&lt;td>no&lt;/td>
&lt;td>empty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accType&lt;/code>&lt;/td>
&lt;td>Acceleration model for the gradient: &lt;code>fixed&lt;/code>, &lt;code>aitken&lt;/code>, &lt;code>IQNILS&lt;/code>. A warning is printed if missing&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>fixed&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relax&lt;/code>&lt;/td>
&lt;td>(Initial) relaxation factor&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>1.0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>couplingReuse&lt;/code>&lt;/td>
&lt;td>&lt;code>IQNILS&lt;/code> only&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>nonOrthCorr&lt;/code>&lt;/td>
&lt;td>Non-orthogonal correction in &lt;code>evaluate()&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order reconstruction of the patch value&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>write()&lt;/code> writes &lt;code>diffusivity&lt;/code> only if it was set, and does not write
&lt;code>gradient&lt;/code>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>Solid &lt;code>0/solid/D&lt;/code> from
&lt;code>tutorials/fluidStructureInteraction/HronTurekFsi3/0/solid/orig/partitioned/D&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 regionCoupledTraction;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> neighbourFieldName sigma; // ignored, sigma is hardcoded
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (fsiInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0); // not read
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The matching fluid patch has no coupled BC. In the tutorials it uses
&lt;code>movingWallVelocity&lt;/code> for &lt;code>U&lt;/code>, &lt;code>zeroGradient&lt;/code> for &lt;code>pKin&lt;/code>, and &lt;code>fixedValue&lt;/code> for
&lt;code>pointMotionU&lt;/code> (driven by &lt;code>interfaceTrackingFvMesh&lt;/code> with &lt;code>fsiInterface yes&lt;/code>).&lt;/p>
&lt;p>&lt;code>constant/regionInterfaceProperties&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">partitionedCoupledPatches
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 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);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> coupledPatchPair
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (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">
&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"> );
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&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"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>constant/multiRegionProperties&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">DNA
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> D
&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 100;
&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"> maxIntRes 1e-7;
&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>The full setup (dynamic mesh, transfer method, coupling start time) is
described in &lt;code>fsiInterface&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;code>fsiInterface&lt;/code> and &lt;code>solidStVK&lt;/code> only.&lt;/strong> The interface type is checked;
the solid fields &lt;code>impK&lt;/code>, &lt;code>rImpK&lt;/code>, &lt;code>gradD&lt;/code>, &lt;code>sigma&lt;/code> and &lt;code>Finv&lt;/code> are only
provided by &lt;code>solidStVK&lt;/code>.&lt;/li>
&lt;li>&lt;strong>The fluid stress must be called &lt;code>sigma&lt;/code>.&lt;/strong> &lt;code>neighbourFieldName&lt;/code> is read
but not used.&lt;/li>
&lt;li>&lt;strong>No generic residuals.&lt;/strong> Use the &lt;code>fsiInterface&lt;/code> interface residual
(&lt;code>maxIntRes&lt;/code>); jump/flux residuals abort for this BC.&lt;/li>
&lt;li>&lt;strong>Relaxation history starts from the patch value&lt;/strong> (&lt;em>inferred&lt;/em>). The base
class initialises the acceleration model with the patch values of &lt;code>D&lt;/code> but
relaxes the gradient. With &lt;code>relax 1&lt;/code> (the default, used in all tutorials)
this has no effect.&lt;/li>
&lt;li>&lt;strong>Total force uses the undeformed area&lt;/strong> and is set on every call of
&lt;code>flux()&lt;/code>. It is a diagnostic only.&lt;/li>
&lt;li>&lt;strong>&lt;code>gradient&lt;/code> is not written&lt;/strong> to the time directories, so a restart starts
from zero gradient until the first update.&lt;/li>
&lt;li>&lt;strong>Partitioned only.&lt;/strong> There is no monolithic FSI path.&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/fluidStructureInteraction/HronTurekFsi3&lt;/code>&lt;/td>
&lt;td>Hron-Turek FSI3 benchmark (&lt;code>pimpleFluid&lt;/code> + &lt;code>solidStVK&lt;/code>), AMI transfer, coupling starts at t = 2 s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/beamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Elastic beam in cross-flow (&lt;code>pimpleFluid&lt;/code> + &lt;code>solidStVK&lt;/code>), directMap transfer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Heated elastic beam; &lt;code>fsiInterface&lt;/code> + &lt;code>heatTransferInterface&lt;/code> on one patch pair&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The BC is set in the &lt;code>0/solid/orig/partitioned/D&lt;/code> variant of each tutorial
(&lt;code>./Allrun -p&lt;/code>).&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Alkfri, A., Habes, C., Marschall, H., &lt;em>multiRegionFoam: A Unified Multiphysics Framework for Multi-Region Coupled Continuum-Physical Problems&lt;/em>, Engineering with Computers, 2023.
DOI: &lt;a href="https://doi.org/10.1007/s00366-024-01974-4">10.1007/s00366-024-01974-4&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Docs: solidPointDisplacement</title><link>https://multiphysicsfoam.com/docs/user-guide/utilities/solidpointdisplacement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/utilities/solidpointdisplacement/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>solidPointDisplacement&lt;/code> is a function object (library &lt;code>libmultiRegionFOs&lt;/code>)
that monitors the displacement of one point of a solid region. At start-up it
picks the mesh point closest to a user-given location. At every execution it
writes the time, the three components and the magnitude of the point
displacement field &lt;code>pointD&lt;/code> at that point to a &lt;code>.dat&lt;/code> file. &lt;code>pointD&lt;/code> is
provided by the &lt;code>solidStVK&lt;/code> region type. The typical use is the tip
displacement of an elastic structure in FSI benchmarks such as Hron-Turek FSI3.&lt;/p>
&lt;h2 id="method">Method&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Region.&lt;/strong> The &lt;code>region&lt;/code> keyword names the solid mesh. If it is omitted,
&lt;code>solid&lt;/code> is used when a mesh of that name exists, otherwise &lt;code>region0&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Point selection&lt;/strong> (constructor, once). The vector &lt;code>point&lt;/code> is read.
On each processor the mesh point with the smallest distance
$|\mathbf{x}_i - \mathbf{x}_\text{probe}|$ is found by a brute-force search
over all points of the &lt;strong>reference (undeformed)&lt;/strong> mesh. Only the processor(s)
holding the global minimum distance keep their point. If several
processors tie (e.g. a point on a processor boundary), the one with the
highest processor number is kept. Each processor that keeps a point prints
its distance to the given location. If no processor ends up with a point,
the run aborts.&lt;/p>
&lt;p>Note: this search always uses the mesh &lt;code>solid&lt;/code> if it exists, otherwise
&lt;code>region0&lt;/code>, regardless of the &lt;code>region&lt;/code> keyword (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/utilities/solidpointdisplacement/#known-limitations">Known Limitations&lt;/a>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Sampling&lt;/strong> (&lt;code>execute()&lt;/code>, once per time step by default). In mesh
&lt;code>region&lt;/code>, the &lt;code>pointVectorField&lt;/code> &lt;code>pointD&lt;/code> is looked up. Its value at the
chosen point is taken without interpolation. All other processors
contribute zero, and the values are summed over processors. The master
writes one line&lt;/p>
$$
t \quad D_x \quad D_y \quad D_z \quad |\mathbf{D}|
$$
&lt;p>If &lt;code>pointD&lt;/code> does not exist in that mesh, a message
&lt;code>pointVectorField pointD not found&lt;/code> is printed and nothing is written for
that step.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;code>write()&lt;/code> does nothing and &lt;code>read()&lt;/code> ignores the dictionary, so changes to the
entry during the run (&lt;code>runTimeModifiable&lt;/code>) have no effect.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>&lt;code>system/controlDict&lt;/code> entry (function object):&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">functions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> displacement
&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 solidPointDisplacement;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> libs (multiRegionFOs);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> region solid;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> point (0.6 0.2 0.0075);
&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;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>solidPointDisplacement&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>libs&lt;/code>&lt;/td>
&lt;td>&lt;code>(multiRegionFOs)&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>point&lt;/code>&lt;/td>
&lt;td>Location (m); the closest solid mesh point is monitored&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>region&lt;/code>&lt;/td>
&lt;td>Name of the solid mesh that holds &lt;code>pointD&lt;/code>&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>solid&lt;/code> if that mesh exists, else &lt;code>region0&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The standard function object controls that OpenFOAM handles outside the
object itself (e.g. &lt;code>executeControl&lt;/code>, &lt;code>executeInterval&lt;/code>, &lt;code>timeStart&lt;/code>,
&lt;code>timeEnd&lt;/code>) can be added. The object itself reads no other keywords.&lt;/p>
&lt;h2 id="input--output">Input / Output&lt;/h2>
&lt;p>&lt;strong>Read&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Mesh&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>pointD&lt;/code>&lt;/td>
&lt;td>&lt;code>pointVectorField&lt;/code>&lt;/td>
&lt;td>&lt;code>region&lt;/code>&lt;/td>
&lt;td>Point displacement (m); registered by &lt;code>solidStVK&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Written&lt;/strong> (master processor only):&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">&amp;lt;case&amp;gt;/postProcessing/&amp;lt;startTime&amp;gt;/solidPointDisplacement_&amp;lt;name&amp;gt;.dat
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>&amp;lt;name&amp;gt;&lt;/code> is the function object entry name (e.g. &lt;code>displacement&lt;/code>) and
&lt;code>&amp;lt;startTime&amp;gt;&lt;/code> is the case start time. In parallel runs the file is still
written to the undecomposed case directory (&lt;code>processor*/../postProcessing&lt;/code>).
The file starts with the header &lt;code># Time Dx Dy Dz magD&lt;/code>, followed by one
space-separated line per execution. The file is opened anew at start-up, so a
restart from the same start time overwrites the earlier file.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;code>region&lt;/code> is only partly honoured.&lt;/strong> The closest-point search always uses
mesh &lt;code>solid&lt;/code> (or &lt;code>region0&lt;/code> if there is no &lt;code>solid&lt;/code> mesh). The sampling uses
&lt;code>region&lt;/code>. In practice the solid region must be called &lt;code>solid&lt;/code>. With another
name the search falls back to &lt;code>region0&lt;/code>, which does not exist in a
multi-region case, and the run aborts.&lt;/li>
&lt;li>&lt;strong>Nearest mesh point, no interpolation.&lt;/strong> The monitored location is the
closest existing mesh point, not the exact &lt;code>point&lt;/code>. The distance is printed
at start-up, so check it in the log.&lt;/li>
&lt;li>&lt;strong>Requires &lt;code>pointD&lt;/code>.&lt;/strong> Only region types that register a &lt;code>pointVectorField&lt;/code>
called &lt;code>pointD&lt;/code> (currently &lt;code>solidStVK&lt;/code>) can be monitored. Other fields cannot
be selected.&lt;/li>
&lt;li>&lt;strong>Reference configuration.&lt;/strong> The point is selected on the solid mesh
points at start-up. This is correct for the total-Lagrangian &lt;code>solidStVK&lt;/code>,
whose mesh never moves.&lt;/li>
&lt;li>&lt;strong>Brute-force search.&lt;/strong> The point search is $O(N_\text{points})$ per
processor. This is negligible since it runs only once.&lt;/li>
&lt;li>&lt;strong>Distributed cases.&lt;/strong> With distributed data (no shared case directory),
writing to &lt;code>processor*/../postProcessing&lt;/code> can fail.&lt;/li>
&lt;li>&lt;strong>Header comment.&lt;/strong> The class description in the header refers to
&amp;ldquo;temperature&amp;rdquo; and least-squares vol-to-point interpolation. Both are wrong:
the object reads &lt;code>pointD&lt;/code> directly.&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/fluidStructureInteraction/HronTurekFsi3&lt;/code>&lt;/td>
&lt;td>Beam tip displacement at &lt;code>(0.6 0.2 0.0075)&lt;/code> (entry &lt;code>displacement&lt;/code> in &lt;code>system/functions&lt;/code>, included from &lt;code>controlDict&lt;/code>); plotted by &lt;code>deflection.gnuplot&lt;/code> from &lt;code>postProcessing/0/solidPointDisplacement_displacement.dat&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/beamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Ships a &lt;code>deflection.gnuplot&lt;/code> that reads the same file, but its &lt;code>controlDict&lt;/code> defines &lt;strong>no&lt;/strong> &lt;code>solidPointDisplacement&lt;/code> entry, so the file is not produced&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>Docs: solidStVK</title><link>https://multiphysicsfoam.com/docs/user-guide/region-physics/solid-models/solidstvk/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/region-physics/solid-models/solidstvk/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>solidStVK&lt;/code> solves the transient momentum balance for an elastic solid
undergoing large deformations. It uses the &lt;strong>St. Venant-Kirchhoff&lt;/strong>
hyperelastic law and a &lt;strong>total Lagrangian&lt;/strong> formulation: the unknown is the
total displacement &lt;code>D&lt;/code>, and every equation is assembled on the undeformed
(reference) mesh, which is never moved. The discretisation follows the
segregated finite-volume solid-mechanics approach of foam-extend
(Cardiff et al.). It uses an implicit &amp;ldquo;stiffness&amp;rdquo; Laplacian with explicit
deferred correction, and a Rhie-Chow-type momentum stabilisation. The region
type is built to act as the structural partner of a fluid region, coupled
through &lt;code>fsiInterface&lt;/code>. On its own it does not solve anything (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/region-physics/solid-models/solidstvk/#known-limitations">Known Limitations&lt;/a>).&lt;/p>
&lt;h2 id="governing-equations">Governing Equations&lt;/h2>
&lt;h3 id="momentum-total-lagrangian">Momentum (total Lagrangian)&lt;/h3>
&lt;p>The equation assembled in &lt;code>setCoupledEqns()&lt;/code> is&lt;/p>
$$
\rho \frac{\partial^2 \mathbf{D}}{\partial t^2} =
\underbrace{\nabla \cdot \left( K \nabla \mathbf{D} \right)}_{\text{implicit}} - \underbrace{\nabla \cdot \left( K \nabla \mathbf{D} \right)}_{\text{explicit}} + \nabla \cdot \left( J\, \mathbf{F}^{-1} \cdot \boldsymbol{\sigma} \right) + \mathbf{S}_\text{stab}
$$
&lt;p>with the implicit stiffness $K = 2\mu + \lambda$. The implicit and explicit
Laplacians cancel at convergence, so the converged solution satisfies
$\rho\,\ddot{\mathbf{D}} = \nabla_0 \cdot \mathbf{P}^T$ with the first
Piola-Kirchhoff stress $\mathbf{P} = J \boldsymbol{\sigma} \mathbf{F}^{-T}$.
No body force (gravity) term is included.&lt;/p>
&lt;h3 id="kinematics">Kinematics&lt;/h3>
$$
\mathbf{F} = \mathbf{I} + (\nabla \mathbf{D})^T, \qquad
J = \det \mathbf{F}
$$
&lt;h3 id="st-venant-kirchhoff-constitutive-law">St. Venant-Kirchhoff constitutive law&lt;/h3>
$$
\mathbf{C} = \mathbf{F}^T \mathbf{F}, \qquad
\mathbf{E} = \tfrac{1}{2}\left( \mathbf{C} - \mathbf{I} \right), \qquad
\mathbf{S} = 2\mu\,\mathbf{E} + \lambda\,\mathrm{tr}(\mathbf{E})\,\mathbf{I}
$$
$$
\boldsymbol{\sigma} = \frac{1}{J}\, \mathbf{F}\, \mathbf{S}\, \mathbf{F}^T
$$
&lt;h3 id="lamé-parameters">Lamé parameters&lt;/h3>
$$
\mu = \frac{E}{2(1+\nu)}, \qquad
\lambda =
\begin{cases}
\dfrac{\nu E}{(1+\nu)(1-2\nu)} &amp; \text{plane strain / 3-D} \\[2ex]
\dfrac{\nu E}{(1+\nu)(1-\nu)} &amp; \text{plane stress (\texttt{planeStress yes})}
\end{cases}
$$
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$\mathbf{D}$&lt;/td>
&lt;td>Total displacement&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\rho$&lt;/td>
&lt;td>Solid density&lt;/td>
&lt;td>kg/m³&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$E$&lt;/td>
&lt;td>Young&amp;rsquo;s modulus&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\nu$&lt;/td>
&lt;td>Poisson&amp;rsquo;s ratio&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mu,\ \lambda$&lt;/td>
&lt;td>Lamé parameters&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$K$&lt;/td>
&lt;td>Implicit stiffness $2\mu+\lambda$ (&lt;code>impK&lt;/code>, &lt;code>impKf&lt;/code>)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{F}$&lt;/td>
&lt;td>Deformation gradient&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$J$&lt;/td>
&lt;td>Jacobian $\det\mathbf{F}$&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{E}$&lt;/td>
&lt;td>Green-Lagrange strain&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{S}$&lt;/td>
&lt;td>2nd Piola-Kirchhoff stress&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\sigma}$&lt;/td>
&lt;td>Cauchy stress (&lt;code>sigma&lt;/code>)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{S}_\text{stab}$&lt;/td>
&lt;td>Momentum stabilisation term&lt;/td>
&lt;td>Pa/m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="momentum-stabilisation">Momentum stabilisation&lt;/h3>
&lt;p>$\mathbf{S}_\text{stab}$ is evaluated explicitly on the displacement
&lt;strong>increment&lt;/strong> &lt;code>DD&lt;/code> $= \mathbf{D} - \mathbf{D}^\text{old}$ and its gradient
&lt;code>gradDD&lt;/code>. Its diffusivity is $\gamma = s\,K$, where $s$ is the scale factor,
interpolated to faces as $\gamma_f$:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;code>type&lt;/code>&lt;/th>
&lt;th>Term&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>RhieChow&lt;/code> (default)&lt;/td>
&lt;td>$\nabla\cdot(\gamma_f \nabla \mathbf{DD}) - \nabla\cdot\left(\gamma_f\, \mathbf{S}_f \cdot (\nabla\mathbf{DD})_f\right)$, i.e. compact minus non-compact Laplacian&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>JamesonSchmidtTurkel&lt;/code>&lt;/td>
&lt;td>$-\nabla\cdot\left(\lvert\mathbf{S}_f\rvert\, \nabla \left[\nabla\cdot(\gamma_f \nabla \mathbf{DD})\right]\right)$ (fourth-order damping)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Laplacian&lt;/code>&lt;/td>
&lt;td>$\nabla\cdot(\gamma_f \nabla \mathbf{DD})$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>none&lt;/code>&lt;/td>
&lt;td>$\mathbf{0}$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>On faces where $K$ differs between owner and neighbour (material
interfaces), $\gamma_f$ is replaced by
&lt;code>interfaceScaleFactor&lt;/code>·$\tfrac{1}{2}(K_\text{own}+K_\text{nei})$. On coupled
non-processor patches this replacement is applied to every face.&lt;/p>
&lt;h2 id="numerical-algorithm">Numerical Algorithm&lt;/h2>
&lt;p>&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> and &lt;code>meshMotionCorrector()&lt;/code> are
all no-ops. &lt;code>selfCoupledFieldNames()&lt;/code> is not overridden, so it returns an empty
list. The displacement equation is solved &lt;strong>only&lt;/strong> when &lt;code>D&lt;/code> appears in the
DNA (partitioned) coupled field list. In that case each DNA iteration of
&lt;code>multiRegionSystem::solve()&lt;/code> runs:&lt;/p>
&lt;ol>
&lt;li>&lt;code>solvePIMPLE()&lt;/code> on the fluid region(s). &lt;code>D&lt;/code> is a special FSI field, and
stand-alone PIMPLE is skipped whenever &lt;code>D&lt;/code> is DNA-coupled.&lt;/li>
&lt;li>&lt;code>assembleAndSolveEqns&amp;lt;fvMatrix, vector&amp;gt;(&amp;quot;D&amp;quot;)&lt;/code>. For &lt;code>solidStVK&lt;/code> this is a
Picard loop:
&lt;ol>
&lt;li>&lt;code>setCoupledEqns(&amp;quot;D&amp;quot;)&lt;/code> stores &lt;code>D.prevIter()&lt;/code> and assembles the momentum
equation above. It registers the equation as
&lt;code>D&amp;lt;mesh&amp;gt;MeshsolidStVKTypeEqn&lt;/code>.&lt;/li>
&lt;li>The equation is relaxed (&lt;code>relaxationFactors.equations&lt;/code>) and solved.&lt;/li>
&lt;li>&lt;code>postSolve()&lt;/code> relaxes the field &lt;code>D&lt;/code> (&lt;code>relaxationFactors.fields&lt;/code>). It then
updates &lt;code>DD&lt;/code>, &lt;code>gradD = fvc::grad(D)&lt;/code>, &lt;code>gradDD&lt;/code>, &lt;code>F&lt;/code>, &lt;code>Finv&lt;/code>, &lt;code>J&lt;/code>,
&lt;code>sigma&lt;/code>, interpolates &lt;code>D&lt;/code> to &lt;code>pointD&lt;/code> (&lt;code>volPointInterpolation&lt;/code>), updates
&lt;code>pointDD&lt;/code> and sets the solid velocity &lt;code>U = fvc::ddt(D)&lt;/code>.&lt;/li>
&lt;li>The loop repeats until the region&amp;rsquo;s &lt;code>PICARD.D&lt;/code> criteria are met
(&lt;code>maxCorr&lt;/code>, &lt;code>tolerance&lt;/code>, &lt;code>relTol&lt;/code>). If no &lt;code>PICARD&lt;/code> entry is given, it
runs one pass per DNA iteration.&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;code>meshMotionCorrector()&lt;/code> on all regions. The fluid mesh follows &lt;code>pointD&lt;/code> of
the solid (via &lt;code>interfaceTrackingFvMesh&lt;/code>). Then &lt;code>interfaces_-&amp;gt;update()&lt;/code>.&lt;/li>
&lt;li>DNA convergence is checked with the &lt;code>fsiInterface&lt;/code> residual: the
mismatch between the deformed solid interface points
(&lt;code>points + pointD&lt;/code>) and the fluid interface points.&lt;/li>
&lt;/ol>
&lt;p>&lt;code>correct()&lt;/code>, which runs from &lt;code>regionTypeList::preSolve()&lt;/code> once per time step,
only calls &lt;code>D.correctBoundaryConditions()&lt;/code>.&lt;/p>
&lt;p>&lt;code>getMinDeltaT()&lt;/code> returns &lt;code>GREAT&lt;/code>, so the solid never limits the time step.&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>Momentum stabilisation&lt;/td>
&lt;td>&lt;code>stabilisation&lt;/code> sub-dict in &lt;code>mechanicalProperties&lt;/code>&lt;/td>
&lt;td>&lt;code>none&lt;/code>, &lt;code>RhieChow&lt;/code>, &lt;code>JamesonSchmidtTurkel&lt;/code>, &lt;code>Laplacian&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>No &lt;code>fvOptions&lt;/code>, thermal-stress, plasticity or other constitutive models are
available. The material law is fixed to St. Venant-Kirchhoff.&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>D&lt;/code>&lt;/td>
&lt;td>&lt;code>volVectorField&lt;/code>&lt;/td>
&lt;td>Total displacement (&lt;strong>must be read&lt;/strong>)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Created at runtime. All of these are read if present and auto-written unless
stated otherwise:&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>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>DD&lt;/code>&lt;/td>
&lt;td>&lt;code>volVectorField&lt;/code>&lt;/td>
&lt;td>Displacement increment over the time step&lt;/td>
&lt;td>m&lt;/td>
&lt;td>0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradD&lt;/code>&lt;/td>
&lt;td>&lt;code>volTensorField&lt;/code>&lt;/td>
&lt;td>Displacement gradient&lt;/td>
&lt;td>–&lt;/td>
&lt;td>0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradDD&lt;/code>&lt;/td>
&lt;td>&lt;code>volTensorField&lt;/code>&lt;/td>
&lt;td>Gradient of displacement increment&lt;/td>
&lt;td>–&lt;/td>
&lt;td>0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>F&lt;/code>&lt;/td>
&lt;td>&lt;code>volTensorField&lt;/code>&lt;/td>
&lt;td>Deformation gradient&lt;/td>
&lt;td>–&lt;/td>
&lt;td>&lt;code>I&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Finv&lt;/code>&lt;/td>
&lt;td>&lt;code>volTensorField&lt;/code>&lt;/td>
&lt;td>Inverse deformation gradient&lt;/td>
&lt;td>–&lt;/td>
&lt;td>&lt;code>I&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>J&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Jacobian&lt;/td>
&lt;td>–&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>sigma&lt;/code>&lt;/td>
&lt;td>&lt;code>volSymmTensorField&lt;/code>&lt;/td>
&lt;td>Cauchy stress&lt;/td>
&lt;td>Pa&lt;/td>
&lt;td>0&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>Solid velocity $\partial\mathbf{D}/\partial t$&lt;/td>
&lt;td>m/s&lt;/td>
&lt;td>0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>impK&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>Implicit stiffness $2\mu+\lambda$&lt;/td>
&lt;td>Pa&lt;/td>
&lt;td>uniform&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>impKf&lt;/code>&lt;/td>
&lt;td>&lt;code>surfaceScalarField&lt;/code>&lt;/td>
&lt;td>Face implicit stiffness&lt;/td>
&lt;td>Pa&lt;/td>
&lt;td>uniform&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>rImpK&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>$1/K$ (read if present, &lt;strong>not written&lt;/strong>)&lt;/td>
&lt;td>1/Pa&lt;/td>
&lt;td>$1/K$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pointD&lt;/code>&lt;/td>
&lt;td>&lt;code>pointVectorField&lt;/code>&lt;/td>
&lt;td>Displacement interpolated to points&lt;/td>
&lt;td>m&lt;/td>
&lt;td>from &lt;code>D&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pointDD&lt;/code>&lt;/td>
&lt;td>&lt;code>pointVectorField&lt;/code>&lt;/td>
&lt;td>Point displacement increment&lt;/td>
&lt;td>m&lt;/td>
&lt;td>from &lt;code>DD&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;code>pointD&lt;/code> is the field that &lt;code>fsiInterface&lt;/code>, &lt;code>interfaceTrackingFvMesh&lt;/code> and the
&lt;code>solidPointDisplacement&lt;/code> function object look up. Its presence is also how
&lt;code>fsiInterface&lt;/code> tells which side of the interface is the solid.&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">solid&lt;/span>&lt;span class="o">&amp;gt;/&lt;/span>&lt;span class="n">mechanicalProperties&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">E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">nu&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">planeStress&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">optional&lt;/span> &lt;span class="n">stabilisation&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">/&amp;lt;&lt;/span>&lt;span class="n">solid&lt;/span>&lt;span class="o">&amp;gt;/&lt;/span>&lt;span class="n">dynamicMeshDict&lt;/span> &lt;span class="err">–&lt;/span> &lt;span class="n">staticFvMesh&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">the&lt;/span> &lt;span class="n">solid&lt;/span> &lt;span class="n">mesh&lt;/span> &lt;span class="n">is&lt;/span> &lt;span class="n">never&lt;/span> &lt;span class="n">moved&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">solid&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">D&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="p">,&lt;/span> &lt;span class="n">PICARD&lt;/span> &lt;span class="n">loop&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">D&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">solid&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">d2dt2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ddt&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">grad&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">the&lt;/span> &lt;span class="n">named&lt;/span> &lt;span class="n">laplacian&lt;/span> &lt;span class="n">schemes&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="mechanicalproperties">&lt;code>mechanicalProperties&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">planeStress no; // required; yes =&amp;gt; plane-stress lambda
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rho rho [1 -3 0 0 0 0 0] 1000; // required
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nu nu [0 0 0 0 0 0 0] 0.4; // required
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">E E [1 -1 -2 0 0 0 0] 5.6e6; // required
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">// Optional. If absent: { type RhieChow; scaleFactor 0.1; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stabilisation
&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 RhieChow; // none | RhieChow | JamesonSchmidtTurkel | Laplacian
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> scaleFactor 0.1; // required unless type none or useCellZones yes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> useCellZones false; // default false; then &amp;lt;cellZoneName&amp;gt;ScaleFactor per zone
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceScaleFactor 0.01; // default 0.01; used on material-interface faces
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="multiregionproperties-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) )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ( solid (solidStVK) )
&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"> D
&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 100;
&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"> maxIntRes 1e-7;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> outputIntResField yes;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>solidStVK&lt;/code> can be stacked with other region types on the same mesh, e.g.
&lt;code>( solid (solidStVK conductTemperature) )&lt;/code> in &lt;code>heatedBeamInCrossFlow&lt;/code>.&lt;/p>
&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"> &amp;#34;D|DD&amp;#34;
&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 FDIC;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tolerance 1e-09;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relTol 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">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"> fields
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;DD|D&amp;#34; 0.9; // applied to D in postSolve()
&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">PICARD
&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"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxCorr 1000; // Picard (outer) corrections per DNA iteration
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tolerance 1e-09;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> relTol 1e-09;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> infoFrequency 100;
&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="key-fvschemes-settings">Key &lt;code>fvSchemes&lt;/code> settings&lt;/h3>
&lt;p>The momentum equation and the &lt;code>RhieChow&lt;/code> stabilisation use the named
Laplacian scheme &lt;code>laplacian(DD,D)&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">d2dt2Schemes { default backward; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ddtSchemes { default backward; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gradSchemes { default leastSquares; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">divSchemes { default Gauss linear; }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">laplacianSchemes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> default none;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> laplacian(DD,D) Gauss linear corrected;
&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">interpolationSchemes { default linear; } // also used for interpolate(impK)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>With &lt;code>default none&lt;/code>, the &lt;code>JamesonSchmidtTurkel&lt;/code> stabilisation also needs
&lt;code>JSTinner&lt;/code> and &lt;code>JSTouter&lt;/code> Laplacian entries. The &lt;code>Laplacian&lt;/code> stabilisation
needs an entry for its default scheme name.&lt;/p>
&lt;h3 id="boundary-conditions-for-d">Boundary conditions for &lt;code>D&lt;/code>&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Patch role&lt;/th>
&lt;th>BC type&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>FSI interface (solid side)&lt;/td>
&lt;td>&lt;code>regionCoupledTraction&lt;/code> (with &lt;code>interfaceType (fsiInterface)&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Clamped&lt;/td>
&lt;td>&lt;code>fixedValue&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Symmetry plane&lt;/td>
&lt;td>&lt;code>solidSymmetry&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prescribed traction / pressure (uncoupled)&lt;/td>
&lt;td>&lt;code>solidTraction&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&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 regionCoupledTraction;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> neighbourFieldName sigma;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> interfaceType (fsiInterface);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> nonOrthCorr false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> value uniform (0 0 0);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>regionCoupledTraction&lt;/code> and &lt;code>solidTraction&lt;/code> look up &lt;code>impK&lt;/code>, &lt;code>rImpK&lt;/code>, &lt;code>gradD&lt;/code>,
&lt;code>sigma&lt;/code> and &lt;code>Finv&lt;/code> from the solid region. All of these are provided by
&lt;code>solidStVK&lt;/code>.&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 modes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>fsiInterface&lt;/code>&lt;/td>
&lt;td>Fluid traction &lt;code>sigma·n&lt;/code> → solid (&lt;code>regionCoupledTraction&lt;/code> on &lt;code>D&lt;/code>); solid &lt;code>pointD&lt;/code> → fluid mesh motion (&lt;code>interfaceTrackingFvMesh&lt;/code>)&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>heatTransferInterface&lt;/code>&lt;/td>
&lt;td>&lt;code>T&lt;/code>, heat flux (through a stacked &lt;code>conductTemperature&lt;/code>, not &lt;code>solidStVK&lt;/code> itself)&lt;/td>
&lt;td>partitioned (DNA)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Notes on &lt;code>fsiInterface&lt;/code> with this region type:&lt;/p>
&lt;ul>
&lt;li>The interface mapping is built with the solid mesh temporarily moved to its
deformed configuration (&lt;code>points + pointD&lt;/code>). The mesh is then moved back, so
the solid stays total Lagrangian.&lt;/li>
&lt;li>The fluid traction is mapped to the solid patch and its sign is flipped.
The deformed normal is computed as $\mathbf{n} = \mathbf{F}^{-T}\mathbf{n}_0 / |\cdot|$.&lt;/li>
&lt;li>The interface residual for DNA convergence is the point-position mismatch
between the deformed solid patch and the fluid patch.&lt;/li>
&lt;/ul>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Requires DNA coupling of &lt;code>D&lt;/code>&lt;/strong> — &lt;code>solveRegion()&lt;/code> is a no-op and
&lt;code>selfCoupledFieldNames()&lt;/code> returns an empty list. If &lt;code>D&lt;/code> is not listed in a
&lt;code>partitionedCoupledPatches&lt;/code> &lt;code>coupledFields&lt;/code> entry (and in the &lt;code>DNA&lt;/code> dict),
the displacement equation is never solved. Single-region (stand-alone
solid) runs are therefore not supported.&lt;/li>
&lt;li>&lt;strong>Partitioned only&lt;/strong> — there is no monolithic FSI path (monolithic
coupling is disabled in &lt;code>multiRegionSystem&lt;/code>).&lt;/li>
&lt;li>&lt;strong>St. Venant-Kirchhoff only&lt;/strong> — linear elastic in Green strain. It is not
suited to large compressive strains. No other material laws, thermal
expansion, or body forces (gravity) are implemented.&lt;/li>
&lt;li>&lt;strong>Constant, uniform material properties&lt;/strong> — &lt;code>rho&lt;/code>, &lt;code>E&lt;/code>, &lt;code>nu&lt;/code> are single
&lt;code>dimensionedScalar&lt;/code>s read from &lt;code>mechanicalProperties&lt;/code>.&lt;/li>
&lt;li>&lt;strong>No time-step control&lt;/strong> — &lt;code>getMinDeltaT()&lt;/code> returns &lt;code>GREAT&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Static solid mesh&lt;/strong> — &lt;code>meshMotionCorrector()&lt;/code> is a no-op. The
&lt;code>staticFvMesh&lt;/code> reference configuration is used throughout, and deformation
is represented only through &lt;code>D&lt;/code>/&lt;code>pointD&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Unused code&lt;/strong> — &lt;code>solidStVKDdtCoeffs.H&lt;/code> (ddt-scheme coefficients) and
the &lt;code>threeK&lt;/code> member are present but not used anywhere.&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/fluidStructureInteraction/HronTurekFsi3&lt;/code>&lt;/td>
&lt;td>Hron-Turek FSI3 benchmark (pimpleFluid + solidStVK)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/beamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Elastic beam in cross-flow (pimpleFluid + solidStVK)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Heated elastic beam in cross-flow; FSI plus conjugate heat transfer (pimpleFluid + transportTemperature / solidStVK + conductTemperature)&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>