<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>multiPhysicsFoam – Uncoupled</title><link>https://multiphysicsfoam.com/tags/uncoupled/</link><description>Recent content in Uncoupled on multiPhysicsFoam</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://multiphysicsfoam.com/tags/uncoupled/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: fixedGradientCorrected</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedgradientcorrected/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedgradientcorrected/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>fixedGradientCorrected&lt;/code> is a Neumann condition for fields of any type
(scalar, vector, sphericalTensor, symmTensor, tensor). It prescribes the
patch-normal gradient. Its patch value and value coefficients include a
non-orthogonal correction $\mathbf{c}\cdot\nabla\phi_P$, evaluated on a small
sub-mesh around the patch. Unlike &lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/">fixedValueCorrected&lt;/a>,
the correction enters the matrix directly, through &lt;code>valueBoundaryCoeffs&lt;/code>. It
comes from the foam-extend interface-tracking solver (&lt;code>interTrackFoam&lt;/code>,
Tuković). The BC is compiled into &lt;code>libinterfaceTrackingFvMesh&lt;/code>. It derives
from the common base &lt;code>correctedFvPatchField&lt;/code> (type &lt;code>corrected&lt;/code>). The base
class, the sub-mesh machinery, the &lt;code>corrected&lt;/code> type and the porting status
(&lt;code>interTrackFluid&lt;/code> disabled, &lt;code>patchCorrected&lt;/code> snGrad not ported) are
described on the &lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/">fixedValueCorrected&lt;/a> page.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
$$
\left.\frac{\partial\phi}{\partial n}\right|_b = g \quad \text{on } \partial\Omega,
\qquad
\phi_b = \phi_P + \phi_c + \delta\, g
$$
&lt;p>with the correction from the base class&lt;/p>
$$
\mathbf{c} = \boldsymbol{\Delta} - \mathbf{n}\,(\mathbf{n}\cdot\boldsymbol{\Delta}),
\qquad
\phi_c = \mathbf{c}\cdot(\nabla\phi)_P
$$
&lt;p>Matrix coefficients:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Coefficient&lt;/th>
&lt;th>Value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>valueInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$1$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>valueBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$\phi_c + \delta\,g$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$0$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$g$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>snGrad()&lt;/code>&lt;/td>
&lt;td>$g$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$\phi$&lt;/td>
&lt;td>Patch field&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$g$&lt;/td>
&lt;td>Prescribed normal gradient (&lt;code>gradient&lt;/code>)&lt;/td>
&lt;td>field unit/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}$&lt;/td>
&lt;td>Patch unit normal&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>$\mathbf{c}$&lt;/td>
&lt;td>Correction vector&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi_c$&lt;/td>
&lt;td>Stored correction (&lt;code>corrVecGrad&lt;/code>), updated in &lt;code>updateCoeffs()&lt;/code>&lt;/td>
&lt;td>field unit&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;/tbody>
&lt;/table>
&lt;p>&lt;strong>Note on OpenFOAM.com.&lt;/strong> &lt;code>fvPatch::delta()&lt;/code> is patch-normal for every
non-coupled patch in OpenFOAM.com, so $\mathbf{c} \equiv \mathbf{0}$ and
$\phi_c \equiv 0$. The coefficients reduce to those of stock &lt;code>fixedGradient&lt;/code>.&lt;/p>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Construction:&lt;/strong> the base class reads &lt;code>volFieldName&lt;/code> (required) and the
optional &lt;code>corrVecGrad&lt;/code>. This class then reads &lt;code>gradient&lt;/code> (required). If
&lt;code>value&lt;/code> is given, it is used as the initial patch value. Otherwise
$\phi_P + \delta g + \phi_c$ is used, with $\phi_c = 0$ at that point unless
&lt;code>corrVecGrad&lt;/code> was given. &lt;code>nGradInternal&lt;/code> is set to $g$.&lt;/li>
&lt;li>&lt;strong>&lt;code>updateCoeffs()&lt;/code>&lt;/strong> (base class): recomputes $\mathbf{c}$ if the mesh moves,
rebuilds $\phi_c$ on the patch sub-mesh (gradient scheme
&lt;code>snGradCorr(&amp;lt;volFieldName&amp;gt;)&lt;/code>). It is called whenever an &lt;code>fvMatrix&lt;/code> for the
field is constructed, so &lt;code>valueBoundaryCoeffs&lt;/code> always uses the current
$\phi_c$.&lt;/li>
&lt;li>&lt;strong>&lt;code>evaluate()&lt;/code>:&lt;/strong> the class declares &lt;code>evaluate()&lt;/code> &lt;strong>without&lt;/strong> the
&lt;code>Pstream::commsTypes&lt;/code> argument. It therefore does not override
&lt;code>fvPatchField::evaluate(const Pstream::commsTypes)&lt;/code>, which
&lt;code>correctBoundaryConditions()&lt;/code> calls. In practice the base &lt;code>evaluate&lt;/code> runs,
and that only resets the &lt;code>updated&lt;/code> flag. &lt;strong>The patch value is not
recomputed&lt;/strong> from $\phi_P + \phi_c + \delta g$ after a solve. It keeps its
initial value unless code assigns it explicitly. Only the matrix
coefficients follow the formula above.&lt;/li>
&lt;li>&lt;strong>Mapping:&lt;/strong> &lt;code>autoMap&lt;/code>/&lt;code>rmap&lt;/code> map the value and &lt;code>gradient&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Sub-mesh motion:&lt;/strong> &lt;code>interfaceTrackingFvMesh::update()&lt;/code> moves the
sub-mesh only for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>write()&lt;/code>:&lt;/strong> &lt;code>type&lt;/code>, &lt;code>volFieldName&lt;/code>, &lt;code>corrVecGrad&lt;/code>, &lt;code>gradient&lt;/code>, &lt;code>value&lt;/code>.&lt;/li>
&lt;/ul>
&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>fixedGradientCorrected&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>volFieldName&lt;/code>&lt;/td>
&lt;td>Name of the volume field this patch field belongs to&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>– (no default)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradient&lt;/code>&lt;/td>
&lt;td>Prescribed normal gradient $g$&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&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>$\phi_P + \delta g + \phi_c$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>corrVecGrad&lt;/code>&lt;/td>
&lt;td>Initial stored correction $\phi_c$&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The library must be loaded with
&lt;code>libs (&amp;quot;libinterfaceTrackingFvMesh.so&amp;quot;);&lt;/code> in &lt;code>system/controlDict&lt;/code>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&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">outlet
&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 fixedGradientCorrected;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> volFieldName p;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> gradient uniform 0;
&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;/code>&lt;/pre>&lt;/div>&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Patch value not updated by &lt;code>correctBoundaryConditions()&lt;/code>&lt;/strong> because the
&lt;code>evaluate()&lt;/code> signature does not match (see Implementation). Explicit
operators that use patch values (&lt;code>fvc::grad&lt;/code>, &lt;code>fvc::interpolate&lt;/code>, face
fluxes) see a stale value.&lt;/li>
&lt;li>&lt;strong>No correction in OpenFOAM.com&lt;/strong> (patch-normal &lt;code>delta()&lt;/code>). The cost of the
sub-mesh gradient remains on every &lt;code>updateCoeffs()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Interface-tracking context not available:&lt;/strong> &lt;code>interTrackFluid&lt;/code> is disabled
and &lt;code>patchCorrected&lt;/code> is not ported (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/#known-limitations">fixedValueCorrected&lt;/a>).&lt;/li>
&lt;li>&lt;strong>&lt;code>volFieldName&lt;/code> has no default&lt;/strong> and must match the field name.&lt;/li>
&lt;li>&lt;strong>Sub-mesh motion only for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>In practice, use the stock &lt;code>fixedGradient&lt;/code> instead.&lt;/p>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;p>No tutorial uses &lt;code>fixedGradientCorrected&lt;/code>.&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Tuković, Ž., Jasak, H., &lt;em>A moving mesh finite volume interface tracking method for surface tension dominated interfacial fluid flow&lt;/em>, Computers &amp;amp; Fluids 55, 2012. DOI: &lt;a href="https://doi.org/10.1016/j.compfluid.2011.11.003">10.1016/j.compfluid.2011.11.003&lt;/a>&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: fixedValueCorrected</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>fixedValueCorrected&lt;/code> is a Dirichlet condition for fields of any type
(scalar, vector, sphericalTensor, symmTensor, tensor). On top of the fixed
value it stores a non-orthogonal correction $\mathbf{c}\cdot\nabla\phi_P$ of the
near-wall value. The correction is evaluated on a small sub-mesh around the
patch. It comes from the foam-extend interface-tracking solver
(&lt;code>interTrackFoam&lt;/code>, Tuković), where it is used on patches whose near-wall
cells become skewed as the mesh follows a moving interface. The fixed-value
matrix coefficients themselves are not corrected. The correction only reaches
the discretisation through &lt;code>snGradCorrection()&lt;/code>, which is called by the
&lt;code>patchCorrected&lt;/code> snGrad scheme. That scheme is &lt;strong>not ported&lt;/strong> (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/#known-limitations">Known Limitations&lt;/a>).&lt;/p>
&lt;p>The BC is compiled into &lt;code>libinterfaceTrackingFvMesh&lt;/code>, not
&lt;code>libmultiRegionSystem&lt;/code>, so this library must be loaded. It is one of three
types derived from the common base &lt;code>correctedFvPatchField&lt;/code>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Page&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>fixedValueCorrected&lt;/code>&lt;/td>
&lt;td>this page&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>fixedGradientCorrected&lt;/code>&lt;/td>
&lt;td>&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedgradientcorrected/">fixedGradientCorrected&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>zeroGradientCorrected&lt;/code>&lt;/td>
&lt;td>&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/zerogradientcorrected/">zeroGradientCorrected&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>corrected&lt;/code>&lt;/td>
&lt;td>the base class itself, registered as a type but not usable on its own (see below)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
$$
\phi_b = \phi_\text{fixed} \quad \text{on } \partial\Omega
$$
&lt;p>With $\mathbf{n}$ the patch unit normal, $\boldsymbol{\Delta}$ the patch delta
vector and $\delta = 1/\texttt{deltaCoeffs}$, the base class defines the
correction vector and the stored correction&lt;/p>
$$
\mathbf{c} = \boldsymbol{\Delta} - \mathbf{n}\,(\mathbf{n}\cdot\boldsymbol{\Delta}),
\qquad
\phi_c = \mathbf{c}\cdot(\nabla\phi)_P
$$
&lt;p>and the corrected normal gradient&lt;/p>
$$
\left.\frac{\partial\phi}{\partial n}\right|_b
= \frac{\phi_b - \phi_P}{\delta} - \frac{\phi_c}{\delta}
= \frac{\phi_b - (\phi_P + \phi_c)}{\delta}
$$
&lt;p>The matrix coefficients are those of plain &lt;code>fixedValue&lt;/code>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Coefficient&lt;/th>
&lt;th>Value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>valueInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$0$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>valueBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$\phi_b$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$-1/\delta$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$\phi_b/\delta$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>snGradCorrection()&lt;/code>&lt;/td>
&lt;td>$-\phi_c/\delta$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$\phi$&lt;/td>
&lt;td>Patch field&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}$&lt;/td>
&lt;td>Patch unit normal&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>$\mathbf{c}$&lt;/td>
&lt;td>Correction vector (&lt;code>correctionVectors()&lt;/code>)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$(\nabla\phi)_P$&lt;/td>
&lt;td>Cell gradient next to the patch, computed on the patch sub-mesh&lt;/td>
&lt;td>field unit/m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi_c$&lt;/td>
&lt;td>Stored correction (&lt;code>corrVecGrad&lt;/code>)&lt;/td>
&lt;td>field unit&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;/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 for every non-coupled patch.
So $\mathbf{c} \equiv \mathbf{0}$ and $\phi_c \equiv 0$ identically. The BC then
behaves exactly like stock &lt;code>fixedValue&lt;/code>, but still does the sub-mesh work
described below on every update. The correction is only non-zero in
foam-extend, where &lt;code>delta()&lt;/code> is the full $\mathbf{C}_f - \mathbf{C}_P$.&lt;/p>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;strong>Base class &lt;code>correctedFvPatchField&lt;/code> (type &lt;code>corrected&lt;/code>).&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;em>Construction:&lt;/em> reads &lt;code>volFieldName&lt;/code> (required) and, if present,
&lt;code>corrVecGrad&lt;/code>. It computes the correction vectors $\mathbf{c}$. It does
&lt;strong>not&lt;/strong> read &lt;code>value&lt;/code> or &lt;code>patchType&lt;/code>.&lt;/li>
&lt;li>&lt;em>&lt;code>updateCoeffs()&lt;/code>:&lt;/em> if the mesh is moving, recomputes $\mathbf{c}$. Then it
always calls &lt;code>updateCorrVecGrad()&lt;/code>:
&lt;ol>
&lt;li>On first use, builds a patch sub-mesh (&lt;code>fvMeshSubset&lt;/code>) from the
patch face cells plus all their neighbouring cells. The sub-mesh takes
its &lt;code>fvSchemes&lt;/code>/&lt;code>fvSolution&lt;/code> from the region mesh.&lt;/li>
&lt;li>Interpolates the volume field named &lt;code>volFieldName&lt;/code> onto the sub-mesh.&lt;/li>
&lt;li>For each component, computes &lt;code>fvc::grad&lt;/code> with the gradient scheme
named &lt;code>snGradCorr(&amp;lt;volFieldName&amp;gt;)&lt;/code> (normally covered by
&lt;code>gradSchemes { default ...; }&lt;/code>).&lt;/li>
&lt;li>Stores $\phi_c = \mathbf{c}\cdot(\nabla\phi)_P$ and
$\mathbf{n}\cdot(\nabla\phi)_P$ (&lt;code>nGradInternal&lt;/code>, not used by any active
code path).&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;em>&lt;code>movePatchSubMesh()&lt;/code>:&lt;/em> moves the sub-mesh points to the current mesh
points. &lt;code>interfaceTrackingFvMesh::update()&lt;/code> calls it after each mesh motion
for every &lt;code>fixedValueCorrected&lt;/code>, &lt;code>fixedGradientCorrected&lt;/code> or
&lt;code>zeroGradientCorrected&lt;/code> patch of the fields &lt;strong>&lt;code>U&lt;/code>&lt;/strong> and &lt;strong>&lt;code>p&lt;/code>&lt;/strong> only. The
sub-meshes of other fields are not moved.&lt;/li>
&lt;li>&lt;em>&lt;code>write()&lt;/code>:&lt;/em> writes &lt;code>type&lt;/code>, &lt;code>volFieldName&lt;/code> and &lt;code>corrVecGrad&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>&lt;code>fixedValueCorrected&lt;/code>.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;em>Construction:&lt;/em> reads &lt;code>value&lt;/code> (required) in addition to the base keywords.&lt;/li>
&lt;li>&lt;code>fixesValue()&lt;/code> returns &lt;code>true&lt;/code>, so no pressure reference is needed if the BC
is used on &lt;code>p&lt;/code>.&lt;/li>
&lt;li>All assignment operators (&lt;code>=&lt;/code>, &lt;code>+=&lt;/code>, &lt;code>-=&lt;/code>, &lt;code>*=&lt;/code>, &lt;code>/=&lt;/code> with fields, patch
fields or constants) are no-ops, as in stock &lt;code>fixedValue&lt;/code>. The value can
only be changed with &lt;code>==&lt;/code>.&lt;/li>
&lt;li>&lt;code>evaluate()&lt;/code> is not overridden, so the value stays fixed.&lt;/li>
&lt;li>&lt;em>&lt;code>write()&lt;/code>:&lt;/em> base entries plus &lt;code>value&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>&lt;code>patchCorrectedSnGrad&lt;/code> (not compiled).&lt;/strong> The source is in
&lt;code>src/dynamicFvMesh/interfaceTrackingFvMesh/patchCorrectedSnGrad&lt;/code>. It is a
central snGrad scheme with explicit non-orthogonal correction, using the
gradient scheme &lt;code>snGradCorr(&amp;lt;field&amp;gt;)&lt;/code>. On patches of type
&lt;code>fixedValueCorrected&lt;/code> it replaces the boundary correction by
&lt;code>snGradCorrection()&lt;/code>. This is the only code path through which the stored
correction would enter a discretised equation. The entry in
&lt;code>src/dynamicFvMesh/Make/files&lt;/code> is commented out (&amp;ldquo;NEEDS TO BE PORTED STILL&amp;rdquo;),
so the scheme cannot be selected.&lt;/p>
&lt;h3 id="the-corrected-type">The &lt;code>corrected&lt;/code> type&lt;/h3>
&lt;p>&lt;code>makePatchFields(corrected)&lt;/code> registers the base class as type &lt;code>corrected&lt;/code> for
scalar, vector, sphericalTensor, symmTensor and tensor fields. The base class
does not implement any matrix coefficients (&lt;code>valueInternalCoeffs&lt;/code> etc. fall
back to &lt;code>fvPatchField&lt;/code>, which raises &lt;code>NotImplemented&lt;/code>). It does not read or
write &lt;code>value&lt;/code>, so its patch values are uninitialised. It also does not
override &lt;code>evaluate()&lt;/code>. &lt;code>type corrected;&lt;/code> is therefore not a usable boundary
condition. Use one of the three derived types.&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>fixedValueCorrected&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>volFieldName&lt;/code>&lt;/td>
&lt;td>Name of the volume field this patch field belongs to (e.g. &lt;code>U&lt;/code>, &lt;code>p&lt;/code>). Used to look up the field for the sub-mesh gradient.&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>– (no default)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Fixed patch value&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>corrVecGrad&lt;/code>&lt;/td>
&lt;td>Initial stored correction $\phi_c$ (written on output; overwritten at the first update)&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Library loading (&lt;code>system/controlDict&lt;/code> of the case):&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">libs
&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;libinterfaceTrackingFvMesh.so&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="usage">Usage&lt;/h2>
&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">movingWall
&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 fixedValueCorrected;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> volFieldName U;
&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>The field must be the one named in &lt;code>volFieldName&lt;/code>. The sub-mesh is only kept
in step with mesh motion if the field is &lt;code>U&lt;/code> or &lt;code>p&lt;/code> and the region mesh is an
&lt;code>interfaceTrackingFvMesh&lt;/code>.&lt;/p>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>No effect in OpenFOAM.com.&lt;/strong> The patch delta is patch-normal, so the
correction vectors and $\phi_c$ are identically zero. The BC is equivalent
to &lt;code>fixedValue&lt;/code>, at the cost of a sub-mesh construction and a gradient
evaluation per component on every &lt;code>updateCoeffs()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>patchCorrected&lt;/code> snGrad scheme not ported.&lt;/strong> Even with a non-zero
correction, nothing in the compiled code would use &lt;code>snGradCorrection()&lt;/code>.
The matrix coefficients are those of plain &lt;code>fixedValue&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Interface-tracking region type disabled.&lt;/strong> The BCs were meant for
&lt;code>interTrackFluid&lt;/code>, which is commented out in
&lt;code>src/multiRegionSystem/Make/files&lt;/code>. The &lt;code>multiphaseFlow&lt;/code> tutorials that need
it (&lt;code>2dRisingBubble&lt;/code>, &lt;code>3dDuineveldRisingBubble&lt;/code>, &lt;code>3dOscillatingBubble&lt;/code>)
cannot currently be run. Only &lt;code>3dDuineveldRisingBubble&lt;/code> mentions
&lt;code>patchCorrected&lt;/code>, and only in comments in its base-mesh &lt;code>fvSchemes&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>volFieldName&lt;/code> has no default&lt;/strong> and must match the field name. Otherwise
the field lookup in &lt;code>updateCoeffs()&lt;/code> fails.&lt;/li>
&lt;li>&lt;strong>Sub-mesh motion only for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>.&lt;/strong> For any other field, the sub-mesh
keeps its initial geometry while the mesh moves.&lt;/li>
&lt;li>&lt;strong>&lt;code>corrected&lt;/code> is not a standalone BC&lt;/strong> (see above).&lt;/li>
&lt;/ul>
&lt;p>In practice, use the stock &lt;code>fixedValue&lt;/code> instead.&lt;/p>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;p>No tutorial uses &lt;code>fixedValueCorrected&lt;/code> (or any &lt;code>*Corrected&lt;/code> type). The FSI
tutorials &lt;code>beamInCrossFlow&lt;/code>, &lt;code>heatedBeamInCrossFlow&lt;/code> and &lt;code>HronTurekFsi3&lt;/code> load
&lt;code>libinterfaceTrackingFvMesh.so&lt;/code> for their &lt;code>interfaceTrackingFvMesh&lt;/code> fluid mesh,
but their fields use stock and &lt;code>regionCoupled*&lt;/code> boundary conditions.&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Tuković, Ž., Jasak, H., &lt;em>A moving mesh finite volume interface tracking method for surface tension dominated interfacial fluid flow&lt;/em>, Computers &amp;amp; Fluids 55, 2012. DOI: &lt;a href="https://doi.org/10.1016/j.compfluid.2011.11.003">10.1016/j.compfluid.2011.11.003&lt;/a>&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: paraboloidInletVelocity</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/paraboloidinletvelocity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/paraboloidinletvelocity/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>paraboloidInletVelocity&lt;/code> is a &lt;code>fixedValue&lt;/code> condition for a velocity field. It
prescribes a velocity in the $+x$ direction whose magnitude is parabolic in
both $y$ and $z$, as found in the developed laminar inflow of a rectangular
channel. The peak velocity can be ramped up smoothly from zero with a
half-cosine. The BC is based on the &lt;code>setInletVelocity&lt;/code> function object of
Ž. Tuković and was taken over from the foam-extend solid-mechanics toolbox. It
is used for the 3-D FSI benchmark &amp;ldquo;beam in cross-flow&amp;rdquo;. The profile is written
in global coordinates: the inlet must be normal to $x$, and the channel must be
placed as described below.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
$$
\mathbf{U}_b = U(t)\;
\frac{y\,(2y_m - y)\,\left(z_m^2 - z^2\right)}{y_m^2\, z_m^2}\;
\mathbf{e}_x
$$
&lt;p>$(y, z)$ are the global coordinates of each face centre. The profile reaches
$U(t)$ at $y = y_m$, $z = 0$. It is zero at $y = 0$, $y = 2y_m$ and
$z = \pm z_m$. The time function is&lt;/p>
$$
U(t) =
\begin{cases}
\dfrac{U_\text{max}}{2}\left[1 - \cos\left(\dfrac{\pi\, t}{t_\text{max}}\right)\right] &amp; t &lt; t_\text{end} \\[2ex]
U_\text{max} &amp; t \ge t_\text{end}
\end{cases}
$$
&lt;p>With $t_\text{end} = t_\text{max}$ (as in the tutorials), this is a smooth ramp
from $0$ to $U_\text{max}$, after which the velocity is constant. With
$t_\text{end} > t_\text{max}$, the velocity follows the cosine further (it
oscillates between $0$ and $U_\text{max}$) until $t_\text{end}$, and then jumps
to $U_\text{max}$. With $t_\text{end} &lt; t_\text{max}$, the ramp is cut off and
the velocity jumps to $U_\text{max}$ at $t_\text{end}$. With
$t_\text{end} \le 0$, $U(t) = U_\text{max}$ from the start.&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{U}_b$&lt;/td>
&lt;td>Patch velocity&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$U_\text{max}$&lt;/td>
&lt;td>&lt;code>maxVelocity&lt;/code>, peak velocity at full load&lt;/td>
&lt;td>m/s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$y_m$&lt;/td>
&lt;td>&lt;code>yWidth&lt;/code>: $y$ position of the peak, i.e. half the channel height for a channel $0 \le y \le 2y_m$&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$z_m$&lt;/td>
&lt;td>&lt;code>zWidth&lt;/code>: half-width in $z$ for a channel $-z_m \le z \le z_m$ (or the full width with a symmetry plane at $z=0$)&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$t_\text{end}$&lt;/td>
&lt;td>&lt;code>timeVaryingEndTime&lt;/code>&lt;/td>
&lt;td>s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$t_\text{max}$&lt;/td>
&lt;td>&lt;code>timeAtMaxVelocity&lt;/code>&lt;/td>
&lt;td>s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$t$&lt;/td>
&lt;td>&lt;code>time().value()&lt;/code>&lt;/td>
&lt;td>s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;p>&lt;strong>&lt;code>updateCoeffs()&lt;/code>&lt;/strong> computes $U(t)$ from the current time value and
evaluates the formula for every face centre. It assigns the result with
&lt;code>operator==&lt;/code> and calls &lt;code>fixedValue::updateCoeffs()&lt;/code>. The profile does not
depend on the patch normal or the internal field.&lt;/p>
&lt;p>&lt;strong>&lt;code>snGrad()&lt;/code>&lt;/strong> returns $(\mathbf{U}_b - \mathbf{U}_P^{*})\,/\,\delta$, where
$\mathbf{U}_P^{*} = \mathbf{U}_P + \mathbf{k}\cdot(\nabla\mathbf{U})_P$ and
$\mathbf{k} = (\mathbf{I}-\mathbf{n}\mathbf{n})\cdot\boldsymbol{\Delta}$. The
correction is only applied if a &lt;code>volTensorField&lt;/code> named &lt;code>grad(&amp;lt;U&amp;gt;)&lt;/code> is
registered. Otherwise the plain $(\mathbf{U}_b-\mathbf{U}_P)/\delta$ is used.&lt;/p>
&lt;p>&lt;strong>&lt;code>gradientBoundaryCoeffs()&lt;/code>&lt;/strong> returns
$(\mathbf{U}_b - \mathbf{k}\cdot(\nabla\mathbf{U})_P)/\delta$. If no
&lt;code>grad(&amp;lt;U&amp;gt;)&lt;/code> field is registered, it computes &lt;code>fvc::grad(U)&lt;/code> on the fly for
this. &lt;code>gradientInternalCoeffs()&lt;/code> and the value coefficients are inherited
from &lt;code>fixedValue&lt;/code>.&lt;/p>
&lt;p>A second-order variant exists in both functions, but it is hard-coded off
(&lt;code>secondOrder_ = false&lt;/code>) and cannot be selected from the dictionary.&lt;/p>
&lt;p>&lt;strong>Note on OpenFOAM.com.&lt;/strong> &lt;code>fvPatch::delta()&lt;/code> is patch-normal for non-coupled
patches, so $\mathbf{k} \equiv \mathbf{0}$. The non-orthogonal correction does
nothing, and the gradient coefficients are those of a plain &lt;code>fixedValue&lt;/code>
condition. The on-the-fly &lt;code>fvc::grad(U)&lt;/code> in &lt;code>gradientBoundaryCoeffs()&lt;/code> still
costs time on every matrix assembly.&lt;/p>
&lt;p>&lt;strong>&lt;code>write()&lt;/code>&lt;/strong> writes &lt;code>maxVelocity&lt;/code>, &lt;code>yWidth&lt;/code>, &lt;code>zWidth&lt;/code>, &lt;code>timeVaryingEndTime&lt;/code>,
&lt;code>timeAtMaxVelocity&lt;/code>, then &lt;code>type&lt;/code> and &lt;code>value&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>paraboloidInletVelocity&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>maxVelocity&lt;/code>&lt;/td>
&lt;td>Peak velocity $U_\text{max}$&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>yWidth&lt;/code>&lt;/td>
&lt;td>$y_m$, $y$ coordinate of the peak (half channel height)&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>zWidth&lt;/code>&lt;/td>
&lt;td>$z_m$, $z$ half-width of the profile&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>timeVaryingEndTime&lt;/code>&lt;/td>
&lt;td>$t_\text{end}$. &lt;code>0&lt;/code> gives a constant velocity from the start.&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>timeAtMaxVelocity&lt;/code>&lt;/td>
&lt;td>$t_\text{max}$, end of the cosine ramp&lt;/td>
&lt;td>yes if &lt;code>timeVaryingEndTime &amp;gt; 0&lt;/code>&lt;/td>
&lt;td>&lt;code>0&lt;/code> (not read otherwise)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>value&lt;/code>&lt;/td>
&lt;td>Initial patch value (required by &lt;code>fixedValue&lt;/code>, overwritten at the first update)&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>From &lt;code>tutorials/fluidStructureInteraction/beamInCrossFlow/0/fluid/orig/partitioned/U&lt;/code>.
The fluid domain is $0 \le y \le 0.4$, $-0.4 \le z \le 0$ with a symmetry
plane at $z = 0$, so &lt;code>yWidth 0.2&lt;/code> puts the peak at mid-height and &lt;code>zWidth 0.4&lt;/code>
puts it on the symmetry plane:&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">inlet
&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 paraboloidInletVelocity;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> maxVelocity 0.3;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> yWidth 0.2;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> zWidth 0.4;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> timeVaryingEndTime 1.0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> timeAtMaxVelocity 1.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;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>x-direction and global coordinates only.&lt;/strong> The velocity always points
along $+\mathbf{e}_x$. $y$ and $z$ are absolute coordinates, so the channel
must start at $y = 0$ and be centred on $z = 0$. The profile cannot be
translated or rotated.&lt;/li>
&lt;li>&lt;strong>No clipping.&lt;/strong> Faces outside $0 \le y \le 2y_m$, $|z| \le z_m$ get a
negative (reversed) velocity.&lt;/li>
&lt;li>&lt;strong>&lt;code>timeAtMaxVelocity&lt;/code> must be positive&lt;/strong> when &lt;code>timeVaryingEndTime &amp;gt; 0&lt;/code>.
Otherwise $U(t)$ divides by zero.&lt;/li>
&lt;li>&lt;strong>Uses &lt;code>time().value()&lt;/code>&lt;/strong>, not the user time (&lt;code>timeOutputValue()&lt;/code>), unlike
&lt;code>solidTraction&lt;/code>&amp;rsquo;s series.&lt;/li>
&lt;li>&lt;strong>Second-order correction not selectable&lt;/strong> (hard-coded off).&lt;/li>
&lt;li>&lt;strong>Non-orthogonal correction has no effect in OpenFOAM.com&lt;/strong>, but
&lt;code>gradientBoundaryCoeffs()&lt;/code> still computes &lt;code>fvc::grad(U)&lt;/code> on each call unless
&lt;code>grad(U)&lt;/code> is registered (see the note above).&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>Inlet of the &lt;code>pimpleFluid&lt;/code> region, ramped to 0.3 m/s over 1 s.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tutorials/fluidStructureInteraction/heatedBeamInCrossFlow&lt;/code>&lt;/td>
&lt;td>Same inlet in the thermo-FSI variant (&lt;code>pimpleFluid transportTemperature&lt;/code>).&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&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: 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><item><title>Docs: zeroGradientCorrected</title><link>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/zerogradientcorrected/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/zerogradientcorrected/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;code>zeroGradientCorrected&lt;/code> is a zero-gradient condition for fields of any type
(scalar, vector, sphericalTensor, symmTensor, tensor). Instead of copying the
near-wall cell value, it sets the patch value to the cell value plus a
non-orthogonal correction $\mathbf{c}\cdot\nabla\phi_P$, evaluated on a small
sub-mesh around the patch. The same correction enters the matrix through
&lt;code>valueBoundaryCoeffs&lt;/code>. It comes from the foam-extend interface-tracking
solver (&lt;code>interTrackFoam&lt;/code>, Tuković). The BC is compiled into
&lt;code>libinterfaceTrackingFvMesh&lt;/code>. It derives from the common base
&lt;code>correctedFvPatchField&lt;/code> (type &lt;code>corrected&lt;/code>). The base class, the sub-mesh
machinery, the &lt;code>corrected&lt;/code> type and the porting status (&lt;code>interTrackFluid&lt;/code>
disabled, &lt;code>patchCorrected&lt;/code> snGrad not ported) are described on the
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/">fixedValueCorrected&lt;/a> page.&lt;/p>
&lt;h2 id="mathematical-formulation">Mathematical Formulation&lt;/h2>
$$
\left.\frac{\partial\phi}{\partial n}\right|_b = 0 \quad \text{on } \partial\Omega,
\qquad
\phi_b = \phi_P + \phi_c,
\qquad
\phi_c = \mathbf{c}\cdot(\nabla\phi)_P,
\quad
\mathbf{c} = \boldsymbol{\Delta} - \mathbf{n}\,(\mathbf{n}\cdot\boldsymbol{\Delta})
$$
&lt;p>Matrix coefficients:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Coefficient&lt;/th>
&lt;th>Value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>valueInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$1$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>valueBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$\phi_c$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientInternalCoeffs&lt;/code>&lt;/td>
&lt;td>$0$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gradientBoundaryCoeffs&lt;/code>&lt;/td>
&lt;td>$0$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>snGrad()&lt;/code>&lt;/td>
&lt;td>$0$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$\phi$&lt;/td>
&lt;td>Patch field&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\mathbf{n}$&lt;/td>
&lt;td>Patch unit normal&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>$\mathbf{c}$&lt;/td>
&lt;td>Correction vector&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$\phi_c$&lt;/td>
&lt;td>Stored correction (&lt;code>corrVecGrad&lt;/code>), updated in &lt;code>updateCoeffs()&lt;/code>&lt;/td>
&lt;td>field unit&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Note on OpenFOAM.com.&lt;/strong> &lt;code>fvPatch::delta()&lt;/code> is patch-normal for every
non-coupled patch in OpenFOAM.com, so $\mathbf{c} \equiv \mathbf{0}$ and
$\phi_c \equiv 0$. The coefficients reduce to those of stock &lt;code>zeroGradient&lt;/code>.&lt;/p>
&lt;h2 id="implementation">Implementation&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Construction:&lt;/strong> the base class reads &lt;code>volFieldName&lt;/code> (required) and the
optional &lt;code>corrVecGrad&lt;/code>. The patch value is set to $\phi_P + \phi_c$. &lt;code>value&lt;/code>
is not read.&lt;/li>
&lt;li>&lt;strong>&lt;code>updateCoeffs()&lt;/code>&lt;/strong> (base class): recomputes $\mathbf{c}$ if the mesh moves,
rebuilds $\phi_c$ on the patch sub-mesh (gradient scheme
&lt;code>snGradCorr(&amp;lt;volFieldName&amp;gt;)&lt;/code>). It is called whenever an &lt;code>fvMatrix&lt;/code> for the
field is constructed, so &lt;code>valueBoundaryCoeffs&lt;/code> uses the current $\phi_c$.&lt;/li>
&lt;li>&lt;strong>&lt;code>evaluate()&lt;/code>:&lt;/strong> declared &lt;strong>without&lt;/strong> the &lt;code>Pstream::commsTypes&lt;/code> argument. It
does not override &lt;code>fvPatchField::evaluate(const Pstream::commsTypes)&lt;/code>, which
&lt;code>correctBoundaryConditions()&lt;/code> calls. The base version runs, and it only
resets the &lt;code>updated&lt;/code> flag. &lt;strong>The patch value is not recomputed&lt;/strong> after a
solve. It stays at the construction value $\phi_P + \phi_c$ of the initial
field, so it does not behave like a zero-gradient value at all.&lt;/li>
&lt;li>&lt;strong>Mapping:&lt;/strong> &lt;code>autoMap&lt;/code>/&lt;code>rmap&lt;/code> map the value only.&lt;/li>
&lt;li>&lt;strong>Sub-mesh motion:&lt;/strong> &lt;code>interfaceTrackingFvMesh::update()&lt;/code> moves the
sub-mesh only for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>write()&lt;/code>:&lt;/strong> &lt;code>type&lt;/code>, &lt;code>volFieldName&lt;/code>, &lt;code>corrVecGrad&lt;/code>. No &lt;code>value&lt;/code> is written.&lt;/li>
&lt;/ul>
&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>zeroGradientCorrected&lt;/code>&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>–&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>volFieldName&lt;/code>&lt;/td>
&lt;td>Name of the volume field this patch field belongs to&lt;/td>
&lt;td>yes&lt;/td>
&lt;td>– (no default)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>corrVecGrad&lt;/code>&lt;/td>
&lt;td>Initial stored correction $\phi_c$&lt;/td>
&lt;td>no&lt;/td>
&lt;td>zero&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The library must be loaded with
&lt;code>libs (&amp;quot;libinterfaceTrackingFvMesh.so&amp;quot;);&lt;/code> in &lt;code>system/controlDict&lt;/code>.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&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">outlet
&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 zeroGradientCorrected;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> volFieldName U;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Patch value frozen at its initial value&lt;/strong>, because the &lt;code>evaluate()&lt;/code>
signature does not match (see Implementation). Explicit operators that use
patch values (&lt;code>fvc::grad&lt;/code>, &lt;code>fvc::interpolate&lt;/code>, face fluxes) see the initial
value.&lt;/li>
&lt;li>&lt;strong>No correction in OpenFOAM.com&lt;/strong> (patch-normal &lt;code>delta()&lt;/code>). The cost of the
sub-mesh gradient remains on every &lt;code>updateCoeffs()&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Interface-tracking context not available:&lt;/strong> &lt;code>interTrackFluid&lt;/code> is disabled
and &lt;code>patchCorrected&lt;/code> is not ported (see
&lt;a href="https://multiphysicsfoam.com/docs/user-guide/boundary-conditions/uncoupled-boundary-conditions/fixedvaluecorrected/#known-limitations">fixedValueCorrected&lt;/a>).&lt;/li>
&lt;li>&lt;strong>&lt;code>volFieldName&lt;/code> has no default&lt;/strong> and must match the field name.&lt;/li>
&lt;li>&lt;strong>Sub-mesh motion only for &lt;code>U&lt;/code> and &lt;code>p&lt;/code>.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>In practice, use the stock &lt;code>zeroGradient&lt;/code> instead.&lt;/p>
&lt;h2 id="tutorials">Tutorials&lt;/h2>
&lt;p>No tutorial uses &lt;code>zeroGradientCorrected&lt;/code>.&lt;/p>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Tuković, Ž., Jasak, H., &lt;em>A moving mesh finite volume interface tracking method for surface tension dominated interfacial fluid flow&lt;/em>, Computers &amp;amp; Fluids 55, 2012. DOI: &lt;a href="https://doi.org/10.1016/j.compfluid.2011.11.003">10.1016/j.compfluid.2011.11.003&lt;/a>&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>