diff --git a/applications/solvers/modules/isothermalFilm/Make/files b/applications/solvers/modules/isothermalFilm/Make/files
index a0ae4a33dd..1e08d75d2f 100644
--- a/applications/solvers/modules/isothermalFilm/Make/files
+++ b/applications/solvers/modules/isothermalFilm/Make/files
@@ -19,6 +19,7 @@ patches/mappedFilmSurface/mappedFilmSurfaceFvPatch/mappedFilmSurfaceFvPatch.C
derivedFvPatchFields/alphaOne/alphaOneFvPatchScalarField.C
derivedFvPatchFields/filmContactAngle/filmContactAngleFvPatchScalarField.C
derivedFvPatchFields/mappedFilmPressure/mappedFilmPressureFvPatchScalarField.C
+derivedFvPatchFields/filmSurfaceVelocity/filmSurfaceVelocityFvPatchVectorField.C
filmGaussGrad/filmGaussGrads.C
diff --git a/applications/solvers/modules/isothermalFilm/derivedFvPatchFields/filmSurfaceVelocity/filmSurfaceVelocityFvPatchVectorField.C b/applications/solvers/modules/isothermalFilm/derivedFvPatchFields/filmSurfaceVelocity/filmSurfaceVelocityFvPatchVectorField.C
new file mode 100644
index 0000000000..20512e2dd2
--- /dev/null
+++ b/applications/solvers/modules/isothermalFilm/derivedFvPatchFields/filmSurfaceVelocity/filmSurfaceVelocityFvPatchVectorField.C
@@ -0,0 +1,182 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2023 OpenFOAM Foundation
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenFOAM. If not, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "filmSurfaceVelocityFvPatchVectorField.H"
+#include "momentumTransportModel.H"
+#include "mappedPatchBase.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::filmSurfaceVelocityFvPatchVectorField::
+filmSurfaceVelocityFvPatchVectorField
+(
+ const fvPatch& p,
+ const DimensionedField& iF
+)
+:
+ mixedFvPatchField(p, iF),
+ Cs_(0)
+{
+ refValue() = Zero;
+ refGrad() = Zero;
+ valueFraction() = 0;
+}
+
+
+Foam::filmSurfaceVelocityFvPatchVectorField::
+filmSurfaceVelocityFvPatchVectorField
+(
+ const fvPatch& p,
+ const DimensionedField& iF,
+ const dictionary& dict
+)
+:
+ mixedFvPatchField(p, iF, dict, false),
+ Cs_(dict.lookup("Cs"))
+{
+ refValue() = Zero;
+ refGrad() = Zero;
+ valueFraction() = 0;
+
+ if (dict.found("value"))
+ {
+ fvPatchVectorField::operator=
+ (
+ vectorField("value", dict, p.size())
+ );
+ }
+ else
+ {
+ // If the value entry is not present initialise to zero-gradient
+ fvPatchVectorField::operator=(patchInternalField());
+ }
+}
+
+
+Foam::filmSurfaceVelocityFvPatchVectorField::
+filmSurfaceVelocityFvPatchVectorField
+(
+ const filmSurfaceVelocityFvPatchVectorField& ptf,
+ const fvPatch& p,
+ const DimensionedField& iF,
+ const fvPatchFieldMapper& mapper
+)
+:
+ mixedFvPatchField(ptf, p, iF, mapper),
+ Cs_(ptf.Cs_)
+{}
+
+
+Foam::filmSurfaceVelocityFvPatchVectorField::
+filmSurfaceVelocityFvPatchVectorField
+(
+ const filmSurfaceVelocityFvPatchVectorField& ptf,
+ const DimensionedField& iF
+)
+:
+ mixedFvPatchField(ptf, iF),
+ Cs_(ptf.Cs_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+void Foam::filmSurfaceVelocityFvPatchVectorField::updateCoeffs()
+{
+ if (updated())
+ {
+ return;
+ }
+
+ // Since we're inside initEvaluate/evaluate there might be processor
+ // comms underway. Change the tag we use.
+ const int oldTag = UPstream::msgType();
+ UPstream::msgType() = oldTag + 1;
+
+ // Get the coupling information from the mappedPatchBase
+ const mappedPatchBase& mpp = mappedPatchBase::getMap(patch().patch());
+ const label patchiNbr = mpp.nbrPolyPatch().index();
+ const fvPatch& patchNbr =
+ refCast(mpp.nbrMesh()).boundary()[patchiNbr];
+
+ const vectorField UpNbr =
+ patchNbr.lookupPatchField("U")
+ .patchInternalField();
+
+ // Set the reference value to the neighbouring fluid internal velocity
+ refValue() = mpp.distribute(UpNbr);
+
+ // Remove the normal component of the surface vel
+ const vectorField n(patch().nf());
+ refValue() -= n*(n & refValue());
+
+ // Lookup the momentum transport model
+ const momentumTransportModel& transportModel =
+ db().lookupType();
+
+ // Get the patch laminar viscosity
+ const tmp nuEff(transportModel.nuEff(patch().index()));
+
+ // Calculate the drag coefficient from the drag constant
+ // and the magnitude of the velocity difference
+ const scalarField Ds(Cs_*mag(refValue() - *this));
+
+ // Calculate the value-fraction from the balance between the
+ // external fluid drag and internal film stress
+ valueFraction() = Ds/(Ds + patch().deltaCoeffs()*nuEff);
+
+ mixedFvPatchField::updateCoeffs();
+
+ // Restore tag
+ UPstream::msgType() = oldTag;
+}
+
+
+void Foam::filmSurfaceVelocityFvPatchVectorField::write
+(
+ Ostream& os
+) const
+{
+ fvPatchField::write(os);
+
+ writeEntry(os, "Cs", Cs_);
+ writeEntry(os, "value", *this);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ makePatchTypeField
+ (
+ fvPatchVectorField,
+ filmSurfaceVelocityFvPatchVectorField
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/isothermalFilm/derivedFvPatchFields/filmSurfaceVelocity/filmSurfaceVelocityFvPatchVectorField.H b/applications/solvers/modules/isothermalFilm/derivedFvPatchFields/filmSurfaceVelocity/filmSurfaceVelocityFvPatchVectorField.H
new file mode 100644
index 0000000000..1f4e93a6be
--- /dev/null
+++ b/applications/solvers/modules/isothermalFilm/derivedFvPatchFields/filmSurfaceVelocity/filmSurfaceVelocityFvPatchVectorField.H
@@ -0,0 +1,165 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2023 OpenFOAM Foundation
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenFOAM. If not, see .
+
+Class
+ Foam::filmSurfaceVelocityFvPatchVectorField
+
+Description
+ Film surface velocity boundary condition
+
+ Evaluates the surface velocity from the shear imposed by the neighbouring
+ fluid velocity using a simple drag model based on the difference between the
+ fluid and film velocities multiplied by the coefficient \c Cs. This simple
+ model is used in preference to the standard viscous shear stress model in
+ order to provide some means to include the drag enhancing effect
+ of surface ripples, rivulets etc. in the film surface.
+
+Usage
+ \table
+ Property | Description | Required | Default value
+ Cs | Fluid-film drag coefficient | yes |
+ \endtable
+
+ Example of the boundary condition specification:
+ \verbatim
+
+ {
+ type filmSurfaceVelocity;
+ Cs 0.005;
+ }
+ \endverbatim
+
+See also
+ Foam::mixedFvPatchField
+
+SourceFiles
+ filmSurfaceVelocityFvPatchVectorField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef filmSurfaceVelocityFvPatchVectorField_H
+#define filmSurfaceVelocityFvPatchVectorField_H
+
+#include "mixedFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+/*---------------------------------------------------------------------------*\
+ Class filmSurfaceVelocityFvPatchVectorField Declaration
+\*---------------------------------------------------------------------------*/
+
+class filmSurfaceVelocityFvPatchVectorField
+:
+ public mixedFvPatchVectorField
+{
+ // Private Data
+
+ //- Fluid-film drag-coefficient
+ scalar Cs_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("filmSurfaceVelocity");
+
+
+ // Constructors
+
+ //- Construct from patch and internal field
+ filmSurfaceVelocityFvPatchVectorField
+ (
+ const fvPatch&,
+ const DimensionedField&
+ );
+
+ //- Construct from patch, internal field and dictionary
+ filmSurfaceVelocityFvPatchVectorField
+ (
+ const fvPatch&,
+ const DimensionedField&,
+ const dictionary&
+ );
+
+ //- Construct by mapping given
+ // filmSurfaceVelocityFvPatchVectorField
+ // onto a new patch
+ filmSurfaceVelocityFvPatchVectorField
+ (
+ const filmSurfaceVelocityFvPatchVectorField&,
+ const fvPatch&,
+ const DimensionedField&,
+ const fvPatchFieldMapper&
+ );
+
+ //- Disallow copy without setting internal field reference
+ filmSurfaceVelocityFvPatchVectorField
+ (
+ const filmSurfaceVelocityFvPatchVectorField&
+ ) = delete;
+
+ //- Copy constructor setting internal field reference
+ filmSurfaceVelocityFvPatchVectorField
+ (
+ const filmSurfaceVelocityFvPatchVectorField&,
+ const DimensionedField&
+ );
+
+ //- Construct and return a clone setting internal field reference
+ virtual tmp clone
+ (
+ const DimensionedField& iF
+ ) const
+ {
+ return tmp
+ (
+ new filmSurfaceVelocityFvPatchVectorField
+ (
+ *this,
+ iF
+ )
+ );
+ }
+
+
+ // Member Functions
+
+ //- Update the coefficients associated with the patch field
+ virtual void updateCoeffs();
+
+ //- Write
+ virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/MomentumTransportModels/momentumTransportModels/derivedFvPatchFields/fixedShearStress/fixedShearStressFvPatchVectorField.C b/src/MomentumTransportModels/momentumTransportModels/derivedFvPatchFields/fixedShearStress/fixedShearStressFvPatchVectorField.C
index 6c526be65e..c4a02db0d2 100644
--- a/src/MomentumTransportModels/momentumTransportModels/derivedFvPatchFields/fixedShearStress/fixedShearStressFvPatchVectorField.C
+++ b/src/MomentumTransportModels/momentumTransportModels/derivedFvPatchFields/fixedShearStress/fixedShearStressFvPatchVectorField.C
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
- \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
+ \\ / A nd | Copyright (C) 2011-2023 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@@ -93,7 +93,7 @@ void Foam::fixedShearStressFvPatchVectorField::updateCoeffs()
const momentumTransportModel& turbModel =
db().lookupType(internalField().group());
- scalarField nuEff(turbModel.nuEff(patch().index()));
+ const scalarField nuEff(turbModel.nuEff(patch().index()));
const vectorField Uc(patchInternalField());