<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>multiPhysicsFoam – Solid-Mechanics</title><link>https://multiphysicsfoam.com/tags/solid-mechanics/</link><description>Recent content in Solid-Mechanics on multiPhysicsFoam</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://multiphysicsfoam.com/tags/solid-mechanics/index.xml" rel="self" type="application/rss+xml"/><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><item><title>Docs: solidSymmetry</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/solidsymmetry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/solidsymmetry/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>solidSymmetry&lt;/code> is a symmetry-plane condition ported from the foam-extend
solid-mechanics toolbox (Cardiff, Tuković), where it is also known as
&lt;code>symmetryDisplacement&lt;/code>. It exists for two field types, both registered under
the same type name:&lt;/p>
&lt;ul>
&lt;li>&lt;code>solidSymmetryFvPatchVectorField&lt;/code>, intended for the total displacement &lt;code>D&lt;/code>
of a solid region (&lt;code>solidStVK&lt;/code>). It mirrors the near-wall displacement across
the plane, so the normal displacement on the patch is zero and the
tangential displacement is free. An optional second-order correction is
available.&lt;/li>
&lt;li>&lt;code>solidSymmetryFvPatchScalarField&lt;/code>, the scalar counterpart. It sets the patch
value to the corrected near-wall value (zero normal gradient).&lt;/li>
&lt;/ul>
&lt;p>Both classes derive from the stock &lt;code>symmetry&lt;/code> constraint
(&lt;code>symmetryFvPatchField&lt;/code>). They only replace &lt;code>snGrad()&lt;/code> and &lt;code>evaluate()&lt;/code>, so the
patch must be of mesh type &lt;code>symmetry&lt;/code>. The class keeps the matrix
coefficients (implicit part) of the stock condition.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>Let $\mathbf{n}$ be the patch unit normal, $\boldsymbol{\Delta}$ the patch delta
vector (face centre minus cell centre), $\delta = 1/\texttt{deltaCoeffs}$ the
cell-to-face distance, and $\mathbf{R} = \mathbf{I} - 2\,\mathbf{n}\mathbf{n}$
the reflection tensor. The non-orthogonal correction vector and the corrected
near-wall value are&lt;/p>
$$
\mathbf{k} = (\mathbf{I} - \mathbf{n}\mathbf{n}) \cdot \boldsymbol{\Delta},
\qquad
\mathbf{D}_P^{*} = \mathbf{D}_P + \mathbf{k} \cdot (\nabla \mathbf{D})_P
$$
&lt;h3 id="vector-field-first-order-default">Vector field, first order (default)&lt;/h3>
$$
\mathbf{D}_b = \tfrac{1}{2}\left(\mathbf{D}_P^{*} + \mathbf{R}\,\mathbf{D}_P^{*}\right)
= (\mathbf{I} - \mathbf{n}\mathbf{n})\,\mathbf{D}_P^{*},
\qquad
\left.\frac{\partial \mathbf{D}}{\partial n}\right|_b
= \frac{\mathbf{R}\,\mathbf{D}_P^{*} - \mathbf{D}_P^{*}}{2\,\delta}
= -\frac{(\mathbf{n}\cdot\mathbf{D}_P^{*})\,\mathbf{n}}{\delta}
$$
&lt;h3 id="vector-field-second-order-secondorder-yes">Vector field, second order (&lt;code>secondOrder yes&lt;/code>)&lt;/h3>
$$
\mathbf{D}_b = (\mathbf{I} - \mathbf{n}\mathbf{n}) \cdot
\left( \mathbf{D}_P^{*} + \tfrac{\delta}{2}\, \mathbf{n}\cdot(\nabla\mathbf{D})_P \right)
$$
$$
\left.\frac{\partial \mathbf{D}}{\partial n}\right|_b
= -\frac{2\,(\mathbf{n}\cdot\mathbf{D}_P^{*})\,\mathbf{n}}{\delta} - \mathbf{n}\left(\mathbf{n} \cdot \left[\mathbf{n}\cdot(\nabla\mathbf{D})_P\right]\right)
$$
&lt;p>The tangential part of the value is extrapolated over half a cell with the
mean of the zero face gradient and the cell gradient. The normal part of the
gradient is the one-sided second-order estimate
$2(\mathbf{D}_b - \mathbf{D}_P)\cdot\mathbf{n}/\delta - (\partial_n D_n)_P$.&lt;/p>
&lt;h3 id="scalar-field">Scalar field&lt;/h3>
&lt;p>A scalar is invariant under reflection, so $\mathbf{R}\,T = T$ and the
formulas above reduce to&lt;/p>
$$
T_b = T_P + \mathbf{k}\cdot(\nabla T)_P,
\qquad
\left.\frac{\partial T}{\partial n}\right|_b = 0
$$
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$\mathbf{D}$, $T$&lt;/td>
&lt;td>Patch field (vector / scalar)&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}$&lt;/td>
&lt;td>Patch unit normal (&lt;code>patch().nf()&lt;/code>)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\Delta}$&lt;/td>
&lt;td>Patch delta vector (&lt;code>patch().delta()&lt;/code>)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\delta$&lt;/td>
&lt;td>$1/$&lt;code>patch().deltaCoeffs()&lt;/code>&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{k}$&lt;/td>
&lt;td>Non-orthogonal correction vector&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$(\nabla\mathbf{D})_P$&lt;/td>
&lt;td>Cell-centre gradient from the registered field &lt;code>gradD&lt;/code>&lt;/td>
&lt;td>field unit/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$(\nabla T)_P$&lt;/td>
&lt;td>Cell-centre gradient from the registered field &lt;code>grad(&amp;lt;field&amp;gt;)&lt;/code>&lt;/td>
&lt;td>field unit/m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Note on OpenFOAM.com.&lt;/strong> In OpenFOAM.com (v2512 and v2606),
&lt;code>fvPatch::delta()&lt;/code> returns the patch-normal delta
$\mathbf{n}(\mathbf{n}\cdot(\mathbf{C}_f-\mathbf{C}_P))$ for all non-coupled
patches. Then $\mathbf{k} \equiv \mathbf{0}$, $\mathbf{D}_P^{*} = \mathbf{D}_P$,
and the non-orthogonal correction does nothing. It was written for
foam-extend, where &lt;code>delta()&lt;/code> is the full $\mathbf{C}_f - \mathbf{C}_P$. With
the default first-order setting, the vector condition therefore gives exactly
the values and normal gradient of the stock &lt;code>symmetry&lt;/code> condition. The scalar
condition is equivalent to stock &lt;code>symmetry&lt;/code> / &lt;code>zeroGradient&lt;/code> for scalars.&lt;/p>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;strong>Construction.&lt;/strong> The dictionary constructor calls the stock &lt;code>symmetry&lt;/code>
constructor. That constructor ignores &lt;code>value&lt;/code> and evaluates the field once
with the stock symmetry formula. The constructor then checks that the patch
is exactly a &lt;code>symmetryFvPatch&lt;/code> (&lt;code>isType&lt;/code>). Any other patch type, including
&lt;code>symmetryPlane&lt;/code>, stops the run with a &lt;code>FatalIOError&lt;/code>. The vector version
reads the optional &lt;code>secondOrder&lt;/code> switch and prints it. Both versions print
&amp;ldquo;Symmetry boundary condition with non-orthogonal correction&amp;rdquo;.&lt;/p>
&lt;p>&lt;strong>&lt;code>evaluate()&lt;/code>&lt;/strong> (called from &lt;code>correctBoundaryConditions()&lt;/code>):&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Calls &lt;code>updateCoeffs()&lt;/code> if needed. This is the base no-op.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Looks up the cell gradient on the patch.&lt;/p>
&lt;ul>
&lt;li>Vector: the &lt;code>volTensorField&lt;/code> named &lt;strong>&lt;code>gradD&lt;/code>&lt;/strong>, whatever the name of the
field the BC is attached to.&lt;/li>
&lt;li>Scalar: the &lt;code>volVectorField&lt;/code> named &lt;strong>&lt;code>grad(&amp;lt;fieldName&amp;gt;)&lt;/code>&lt;/strong>, e.g.
&lt;code>grad(T)&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>The lookup is mandatory. If the field is not registered on the mesh, the
run stops with a fatal error.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Builds $\mathbf{D}_P^{*}$ and assigns the patch value with the formula
above.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Vector only: calls the base &lt;code>evaluate()&lt;/code>, which resets the &lt;code>updated&lt;/code> flag.
The scalar version does not call it.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>&lt;code>snGrad()&lt;/code>&lt;/strong> returns the normal gradient above. It is used wherever the
patch gradient is requested explicitly. The matrix coefficients are inherited
from the stock &lt;code>transform&lt;/code>/&lt;code>basicSymmetry&lt;/code> implementation: for vectors the
implicit diagonal is $|n_i|$ per component. Because
&lt;code>gradientBoundaryCoeffs()&lt;/code> is &lt;code>snGrad() - gradientInternalCoeffs()·D_P&lt;/code>, the
overridden &lt;code>snGrad()&lt;/code> (including the second-order term) enters
&lt;code>fvm::laplacian&lt;/code> as an explicit source. For scalars, the inherited
coefficients are those of a zero-gradient condition.&lt;/p>
&lt;p>&lt;strong>In &lt;code>solidStVK&lt;/code>.&lt;/strong> The momentum equation uses
&lt;code>fvm::laplacian(impKf, D, &amp;quot;laplacian(DD,D)&amp;quot;)&lt;/code>, which picks up the coefficients
above. &lt;code>gradD = fvc::grad(D)&lt;/code> is recomputed in &lt;code>postSolve()&lt;/code> from the patch
values set in &lt;code>evaluate()&lt;/code>. &lt;code>solidStVK&lt;/code> registers &lt;code>gradD&lt;/code>, so the vector BC
works on its &lt;code>D&lt;/code> field. It also works on any other vector field of that
region, but it always uses &lt;code>gradD&lt;/code>.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;p>Vector version:&lt;/p>
&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>solidSymmetry&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>secondOrder&lt;/code>&lt;/td>
&lt;td>Second-order correction of value and normal gradient (&lt;code>Switch&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>patchType&lt;/code>&lt;/td>
&lt;td>Generic &lt;code>fvPatchField&lt;/code> keyword, read by the stock base class&lt;/td>
&lt;td>no&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Not read. The initial value comes from the stock symmetry evaluation. Written on output.&lt;/td>
&lt;td>no&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Scalar version:&lt;/p>
&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>solidSymmetry&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>patchType&lt;/code>&lt;/td>
&lt;td>Generic &lt;code>fvPatchField&lt;/code> keyword&lt;/td>
&lt;td>no&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Not read (see above). Written on output.&lt;/td>
&lt;td>no&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The scalar version does not read &lt;code>secondOrder&lt;/code>.&lt;/p>
&lt;p>Required registered fields:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Needed by&lt;/th>
&lt;th>Provided by&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>gradD&lt;/code>&lt;/td>
&lt;td>&lt;code>volTensorField&lt;/code>&lt;/td>
&lt;td>vector version&lt;/td>
&lt;td>&lt;code>solidStVK&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>grad(&amp;lt;fieldName&amp;gt;)&lt;/code>&lt;/td>
&lt;td>&lt;code>volVectorField&lt;/code>&lt;/td>
&lt;td>scalar version&lt;/td>
&lt;td>no shipped region type&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>The mesh patch must be of type &lt;code>symmetry&lt;/code> (e.g. &lt;code>symmetry symmetry (...)&lt;/code> in
&lt;code>blockMeshDict&lt;/code>). From
&lt;code>tutorials/fluidStructureInteraction/beamInCrossFlow/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">symmetry
&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 solidSymmetry;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> patchType symmetry;
&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>With the second-order correction:&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">symmetry
&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 solidSymmetry;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> secondOrder yes;
&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>For other fields of the solid region on the same patch, the tutorials use the
stock condition (e.g. &lt;code>T&lt;/code> in &lt;code>heatedBeamInCrossFlow&lt;/code>: &lt;code>type symmetry;&lt;/code>).&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Non-orthogonal correction has no effect in OpenFOAM.com.&lt;/strong> The patch delta
is patch-normal, so $\mathbf{k} = \mathbf{0}$ (see the note above). With
&lt;code>secondOrder no&lt;/code>, the vector BC is numerically identical to stock &lt;code>symmetry&lt;/code>.
It still needs &lt;code>gradD&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Hard-coded gradient name (vector).&lt;/strong> The vector version always reads
&lt;code>gradD&lt;/code>. It is only usable in a region that registers a &lt;code>volTensorField&lt;/code>
named &lt;code>gradD&lt;/code>, i.e. &lt;code>solidStVK&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Scalar version needs &lt;code>grad(&amp;lt;field&amp;gt;)&lt;/code>.&lt;/strong> No compiled region type registers
a &lt;code>volVectorField&lt;/code> with that name. Unless something else in the case
provides it, the scalar BC fails on its first evaluation. Because it is
equivalent to the stock condition in OpenFOAM.com, use &lt;code>symmetry&lt;/code> for
scalar fields instead.&lt;/li>
&lt;li>&lt;strong>Patch type &lt;code>symmetry&lt;/code> only.&lt;/strong> &lt;code>symmetryPlane&lt;/code> and other patch types are
rejected.&lt;/li>
&lt;li>&lt;strong>&lt;code>value&lt;/code> is ignored on read.&lt;/strong> The initial patch value is always the stock
symmetry evaluation of the internal field.&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/beamInCrossFlow&lt;/code>&lt;/td>
&lt;td>&lt;code>D&lt;/code> of the &lt;code>solidStVK&lt;/code> solid on the &lt;code>symmetry&lt;/code> patch (first order).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Same &lt;code>D&lt;/code> setup in a thermo-FSI case. &lt;code>T&lt;/code> on the same patch uses stock &lt;code>symmetry&lt;/code>.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>No tutorial uses the scalar version or &lt;code>secondOrder yes&lt;/code>.&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Cardiff, P., Karač, A., De Jaeger, P., Jasak, H., Nagy, J., Ivanković, A., Tuković, Ž., &lt;em>An open-source finite volume toolbox for solid mechanics and fluid-solid interaction simulations&lt;/em>, arXiv:1808.10736, 2018.&lt;/li>
&lt;li>Alkfri, A., Habes, C., Marschall, H., &lt;em>multiRegionFoam: A Unified Multiphysics Framework for Multi-Region Coupled Continuum-Physical Problems&lt;/em>, Engineering with Computers, 2023.
DOI: &lt;a href="https://doi.org/10.1007/s00366-024-01974-4">10.1007/s00366-024-01974-4&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Docs: solidTraction</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/solidtraction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/solidtraction/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>solidTraction&lt;/code> imposes a known surface traction $\mathbf{t}$ and/or normal
pressure $p$ on the displacement field &lt;code>D&lt;/code> of a solid region. It is the
uncoupled counterpart of the FSI traction BC: use it for loaded or
traction-free solid surfaces that are not coupled to another region. The class
derives from &lt;code>fixedGradient&lt;/code> (vector only). In each update it recomputes the
displacement normal gradient so that the stress on the patch matches the
prescribed load. The traction and the pressure can each be given as a
constant field, as a time series, or as a separate volume field. It was
ported from the foam-extend solid-mechanics toolbox (Cardiff, Tuković). It
reads the fields of &lt;code>solidStVK&lt;/code> (&lt;code>impK&lt;/code>, &lt;code>rImpK&lt;/code>, &lt;code>gradD&lt;/code>, &lt;code>sigma&lt;/code>, &lt;code>Finv&lt;/code>).&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
&lt;p>The target condition is a traction balance in the current (deformed)
configuration:&lt;/p>
$$
\mathbf{n}_c \cdot \boldsymbol{\sigma} = \mathbf{t} - p\,\mathbf{n}_c
\quad \text{on } \partial\Omega_t,
\qquad
\mathbf{n}_c = \frac{\mathbf{F}^{-T}\cdot\mathbf{n}_0}{\lvert \mathbf{F}^{-T}\cdot\mathbf{n}_0 \rvert}
$$
&lt;p>It is imposed through the normal gradient of &lt;code>D&lt;/code>, in the segregated
&amp;ldquo;implicit stiffness&amp;rdquo; form used by &lt;code>solidStVK&lt;/code>:&lt;/p>
$$
\mathbf{g}^{\,new} = \frac{1}{K}\left[ \left(\mathbf{t} - p\,\mathbf{n}_c\right) - \mathbf{n}_c\cdot\boldsymbol{\sigma} + K\, \mathbf{n}_0\cdot\nabla\mathbf{D} \right],
\qquad
\mathbf{g} \leftarrow \omega\,\mathbf{g}^{\,new} + (1-\omega)\,\mathbf{g}^{\,old}
$$
&lt;p>$\boldsymbol{\sigma}$ and $\nabla\mathbf{D}$ are the current patch values.
When the iteration has converged, $\mathbf{g} = \mathbf{n}_0\cdot\nabla\mathbf{D}$,
so the bracket requires $\mathbf{n}_c\cdot\boldsymbol{\sigma} = \mathbf{t} - p\,\mathbf{n}_c$.
The $K\,\mathbf{n}_0\cdot\nabla\mathbf{D}$ term mirrors the implicit/explicit
Laplacian pair in the &lt;code>solidStVK&lt;/code> momentum equation.&lt;/p>
&lt;p>The patch value is then reconstructed from the gradient:&lt;/p>
$$
\mathbf{D}_b =
\begin{cases}
\mathbf{D}_P + \mathbf{k}\cdot(\nabla\mathbf{D})_P + \delta\,\mathbf{g} &amp; \text{first order} \\[1ex]
\mathbf{D}_P + \mathbf{k}\cdot(\nabla\mathbf{D})_P + \tfrac{\delta}{2}\left(\mathbf{g} + \mathbf{n}_0\cdot(\nabla\mathbf{D})_P\right) &amp; \texttt{secondOrder yes}
\end{cases}
$$
&lt;p>with $\mathbf{k} = (\mathbf{I}-\mathbf{n}_0\mathbf{n}_0)\cdot\boldsymbol{\Delta}$.&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>Total displacement (patch field)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{t}$&lt;/td>
&lt;td>Prescribed traction (&lt;code>traction&lt;/code>, &lt;code>tractionSeries&lt;/code> or &lt;code>tractionField&lt;/code>)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$p$&lt;/td>
&lt;td>Prescribed pressure, positive = compressive (&lt;code>pressure&lt;/code>, &lt;code>pressureSeries&lt;/code> or &lt;code>pressureField&lt;/code>)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}_0$&lt;/td>
&lt;td>Patch unit normal of the undeformed mesh&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}_c$&lt;/td>
&lt;td>Deformed unit normal from &lt;code>Finv&lt;/code>&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\sigma}$&lt;/td>
&lt;td>Cauchy stress, patch values of &lt;code>sigma&lt;/code>&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{F}^{-1}$&lt;/td>
&lt;td>Inverse deformation gradient, patch values of &lt;code>Finv&lt;/code>&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$K$&lt;/td>
&lt;td>Implicit stiffness, patch values of &lt;code>impK&lt;/code> ($1/K$ from &lt;code>rImpK&lt;/code>)&lt;/td>
&lt;td>Pa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{g}$&lt;/td>
&lt;td>Patch normal gradient (&lt;code>gradient&lt;/code>)&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\omega$&lt;/td>
&lt;td>&lt;code>relaxationFactor&lt;/code>&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\delta$&lt;/td>
&lt;td>$1/$&lt;code>patch().deltaCoeffs()&lt;/code>&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\boldsymbol{\Delta}$, $\mathbf{k}$&lt;/td>
&lt;td>Patch delta vector and non-orthogonal correction vector&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Note on OpenFOAM.com.&lt;/strong> In OpenFOAM.com, &lt;code>fvPatch::delta()&lt;/code> is
patch-normal for non-coupled patches, so $\mathbf{k} \equiv \mathbf{0}$ and the
non-orthogonal term in $\mathbf{D}_b$ has no effect.&lt;/p>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;strong>Construction.&lt;/strong> The dictionary constructor reads &lt;code>secondOrder&lt;/code>,
&lt;code>setEffectiveTraction&lt;/code> and &lt;code>relaxationFactor&lt;/code>. It reads &lt;code>gradient&lt;/code> and &lt;code>value&lt;/code>
if present, otherwise it starts from zero gradient and the patch-internal
value. It then sets up the traction and the pressure. For each, exactly one
of three forms is allowed. Giving two forms of the same quantity stops the
run (&lt;code>FatalError&lt;/code>):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Traction&lt;/th>
&lt;th>Pressure&lt;/th>
&lt;th>Behaviour&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>traction&lt;/code>&lt;/td>
&lt;td>&lt;code>pressure&lt;/code>&lt;/td>
&lt;td>Patch field (&lt;code>uniform&lt;/code> or &lt;code>nonuniform&lt;/code>), constant in time&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tractionSeries {...}&lt;/code>&lt;/td>
&lt;td>&lt;code>pressureSeries {...}&lt;/code>&lt;/td>
&lt;td>&lt;code>interpolationTable&lt;/code> sub-dictionary, interpolated at &lt;code>time().timeOutputValue()&lt;/code>. The value is uniform over the patch.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tractionField &amp;lt;name&amp;gt;&lt;/code>&lt;/td>
&lt;td>&lt;code>pressureField &amp;lt;name&amp;gt;&lt;/code>&lt;/td>
&lt;td>A &lt;code>volVectorField&lt;/code> / &lt;code>volScalarField&lt;/code> with that name is constructed by the BC (&lt;code>MUST_READ&lt;/code> from the time directory, &lt;code>AUTO_WRITE&lt;/code>), and its boundary values on this patch are used&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>If neither a series nor a field is given, &lt;code>traction&lt;/code> and &lt;code>pressure&lt;/code> are read
as plain patch fields, so both are required.&lt;/p>
&lt;p>&lt;strong>&lt;code>updateCoeffs()&lt;/code>&lt;/strong> (skipped if already updated in this evaluation):&lt;/p>
&lt;ol>
&lt;li>Once per time step (tracked through &lt;code>curTimeIndex_&lt;/code>), calls
&lt;code>correctBoundaryConditions()&lt;/code> on the &lt;code>tractionField&lt;/code> / &lt;code>pressureField&lt;/code>, if
one is used.&lt;/li>
&lt;li>Updates $\mathbf{t}$ and $p$ from the field or the series.&lt;/li>
&lt;li>If &lt;code>setEffectiveTraction&lt;/code> is on, subtracts the patch values of a
&lt;code>volScalarField&lt;/code> named &lt;code>p&lt;/code> from the pressure. This applies the effective
rather than the total traction, which is meant for poro-elastic solids.&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 patch. All are
mandatory.&lt;/li>
&lt;li>Computes $\mathbf{n}_c$ and the relaxed gradient $\mathbf{g}$ above, then
calls &lt;code>fixedGradient::updateCoeffs()&lt;/code>.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>&lt;code>evaluate()&lt;/code>&lt;/strong> calls &lt;code>updateCoeffs()&lt;/code> if needed. It looks up the cell
gradient field named &lt;code>grad&amp;lt;fieldName&amp;gt;&lt;/code> (i.e. &lt;code>gradD&lt;/code> for &lt;code>D&lt;/code>), sets
$\mathbf{D}_b$ by the formula above and resets the &lt;code>updated&lt;/code> flag. The matrix
coefficients are those of the stock &lt;code>fixedGradient&lt;/code> condition: the gradient
$\mathbf{g}$ enters the Laplacian as an explicit flux.&lt;/p>
&lt;p>&lt;strong>Interaction with &lt;code>solidStVK&lt;/code>.&lt;/strong> &lt;code>D&lt;/code> boundary conditions are updated when the
momentum equation for &lt;code>D&lt;/code> is assembled. &lt;code>sigma&lt;/code>, &lt;code>gradD&lt;/code> and &lt;code>Finv&lt;/code> come from
the previous Picard / DNA iteration (updated in &lt;code>solidStVK::postSolve()&lt;/code>), so
the traction is enforced iteratively. It converges together with the &lt;code>PICARD&lt;/code>
loop on &lt;code>D&lt;/code>. The &lt;code>relaxationFactor&lt;/code> gives extra under-relaxation of the
gradient if this loop oscillates.&lt;/p>
&lt;p>&lt;strong>&lt;code>write()&lt;/code>&lt;/strong> writes the form actually used for traction and pressure
(&lt;code>tractionField&lt;/code>/&lt;code>tractionSeries&lt;/code>/&lt;code>traction&lt;/code>, and likewise for pressure), then
&lt;code>secondOrder&lt;/code>, &lt;code>setEffectiveTraction&lt;/code>, &lt;code>relaxationFactor&lt;/code>, &lt;code>value&lt;/code> and
&lt;code>gradient&lt;/code>.&lt;/p>
&lt;h2 id="dictionary-entries">Dictionary Entries&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Keyword&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Default&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>type&lt;/code>&lt;/td>
&lt;td>&lt;code>solidTraction&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>traction&lt;/code>&lt;/td>
&lt;td>Traction patch field (vector)&lt;/td>
&lt;td>yes, unless &lt;code>tractionSeries&lt;/code> or &lt;code>tractionField&lt;/code> is given&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tractionSeries&lt;/code>&lt;/td>
&lt;td>&lt;code>interpolationTable&amp;lt;vector&amp;gt;&lt;/code> sub-dictionary (&lt;code>file&lt;/code>, optional &lt;code>outOfBounds&lt;/code>, &lt;code>readerType&lt;/code>)&lt;/td>
&lt;td>alternative to &lt;code>traction&lt;/code>&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tractionField&lt;/code>&lt;/td>
&lt;td>Name of a &lt;code>volVectorField&lt;/code> to read from the time directory&lt;/td>
&lt;td>alternative to &lt;code>traction&lt;/code>&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pressure&lt;/code>&lt;/td>
&lt;td>Pressure patch field (scalar, positive = compressive)&lt;/td>
&lt;td>yes, unless &lt;code>pressureSeries&lt;/code> or &lt;code>pressureField&lt;/code> is given&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pressureSeries&lt;/code>&lt;/td>
&lt;td>&lt;code>interpolationTable&amp;lt;scalar&amp;gt;&lt;/code> sub-dictionary&lt;/td>
&lt;td>alternative to &lt;code>pressure&lt;/code>&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>pressureField&lt;/code>&lt;/td>
&lt;td>Name of a &lt;code>volScalarField&lt;/code> to read from the time directory&lt;/td>
&lt;td>alternative to &lt;code>pressure&lt;/code>&lt;/td>
&lt;td>–&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;tr>
&lt;td>&lt;code>setEffectiveTraction&lt;/code>&lt;/td>
&lt;td>Subtract the region&amp;rsquo;s &lt;code>p&lt;/code> field from the pressure&lt;/td>
&lt;td>no&lt;/td>
&lt;td>&lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>relaxationFactor&lt;/code>&lt;/td>
&lt;td>Under-relaxation $\omega$ of the gradient&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>gradient&lt;/code>&lt;/td>
&lt;td>Initial normal gradient&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>Initial patch value&lt;/td>
&lt;td>no&lt;/td>
&lt;td>patch-internal value&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>In the series sub-dictionary, &lt;code>outOfBounds&lt;/code> defaults to &lt;code>warn&lt;/code> and
&lt;code>readerType&lt;/code> to &lt;code>openFoam&lt;/code>. Both are standard OpenFOAM &lt;code>interpolationTable&lt;/code>
keywords.&lt;/p>
&lt;p>Required registered fields on the solid mesh:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Field&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Provided by&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>impK&lt;/code>, &lt;code>rImpK&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>&lt;code>solidStVK&lt;/code>&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>&lt;code>solidStVK&lt;/code>&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>&lt;code>solidStVK&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>&lt;code>solidStVK&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>grad&amp;lt;fieldName&amp;gt;&lt;/code>&lt;/td>
&lt;td>&lt;code>volTensorField&lt;/code>&lt;/td>
&lt;td>&lt;code>solidStVK&lt;/code> (&lt;code>gradD&lt;/code>, when the BC is on &lt;code>D&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;td>&lt;code>volScalarField&lt;/code>&lt;/td>
&lt;td>only with &lt;code>setEffectiveTraction yes&lt;/code>; no shipped solid region type provides it&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>Traction-free surface (&lt;code>0/&amp;lt;solid&amp;gt;/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">freeSurface
&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 solidTraction;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> traction uniform (0 0 0);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pressure uniform 0;
&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>Uniform pressure ramped in time from a table file:&lt;/p>
&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">loadedSurface&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">type&lt;/span> &lt;span class="n">solidTraction&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">traction&lt;/span> &lt;span class="n">uniform&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pressureSeries&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">file&lt;/span> &lt;span class="s2">&amp;#34;$FOAM_CASE/constant/solid/pressureSeries&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">outOfBounds&lt;/span> &lt;span class="nb">clamp&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relaxationFactor&lt;/span> &lt;span class="mf">0.8&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">value&lt;/span> &lt;span class="n">uniform&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>with &lt;code>constant/solid/pressureSeries&lt;/code> in the &lt;code>openFoam&lt;/code> table format, e.g.
&lt;code>( (0 0) (1 1e4) )&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Only for &lt;code>solidStVK&lt;/code>.&lt;/strong> The 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 looked up unconditionally. No other compiled region type
provides all of them.&lt;/li>
&lt;li>&lt;strong>Field and series data are uniform or per face only.&lt;/strong> &lt;code>tractionSeries&lt;/code> /
&lt;code>pressureSeries&lt;/code> give a value that is uniform over the patch.
&lt;code>traction&lt;/code> / &lt;code>pressure&lt;/code> are constant in time. For space- and time-varying
loads, use &lt;code>tractionField&lt;/code> / &lt;code>pressureField&lt;/code> and drive that field&amp;rsquo;s own
boundary conditions (they are corrected once per time step).&lt;/li>
&lt;li>&lt;strong>&lt;code>setEffectiveTraction&lt;/code> needs a &lt;code>p&lt;/code> field&lt;/strong> on the solid mesh. No shipped
solid region type registers one.&lt;/li>
&lt;li>&lt;strong>Non-orthogonal correction has no effect in OpenFOAM.com&lt;/strong> (patch-normal
&lt;code>delta()&lt;/code>; see the note above).&lt;/li>
&lt;li>&lt;strong>Copies lose the field link.&lt;/strong> The mapping and copy constructors do not
copy &lt;code>tractionFieldPtr_&lt;/code> / &lt;code>pressureFieldPtr_&lt;/code>. A cloned patch field (e.g. a
stored old-time or previous-iteration copy) keeps the last
traction/pressure values and stops following the field. The original
boundary condition of &lt;code>D&lt;/code> is not affected.&lt;/li>
&lt;li>&lt;strong>Inconsistent gradient names.&lt;/strong> &lt;code>updateCoeffs()&lt;/code> always reads &lt;code>gradD&lt;/code>,
while &lt;code>evaluate()&lt;/code> reads &lt;code>grad&amp;lt;fieldName&amp;gt;&lt;/code>. On a field other than &lt;code>D&lt;/code> the two
differ.&lt;/li>
&lt;/ul>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;p>No tutorial uses &lt;code>solidTraction&lt;/code>. The FSI tutorials use
&lt;code>regionCoupledTraction&lt;/code> on the coupled solid surface and &lt;code>fixedValue&lt;/code> /
&lt;code>solidSymmetry&lt;/code> elsewhere.&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Cardiff, P., Karač, A., De Jaeger, P., Jasak, H., Nagy, J., Ivanković, A., Tuković, Ž., &lt;em>An open-source finite volume toolbox for solid mechanics and fluid-solid interaction simulations&lt;/em>, arXiv:1808.10736, 2018.&lt;/li>
&lt;li>Alkfri, A., Habes, C., Marschall, H., &lt;em>multiRegionFoam: A Unified Multiphysics Framework for Multi-Region Coupled Continuum-Physical Problems&lt;/em>, Engineering with Computers, 2023.
DOI: &lt;a href="https://doi.org/10.1007/s00366-024-01974-4">10.1007/s00366-024-01974-4&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>