From 885456f9a408417fa72a9289c709da090c700fdd Mon Sep 17 00:00:00 2001
From: Kutalmis Bercin <kutalmis.bercin@esi-group.com>
Date: Tue, 6 Dec 2022 11:43:56 +0000
Subject: [PATCH] ENH: dynamicContactAngleForce: new finite-area contact-angle
 force model

DEFEATURE: merge fa-perturbedTemperatureDependent into dynamicContactAngle
---
 src/regionFaModels/Make/files                 |  2 +-
 .../dynamicContactAngleForce.C}               | 93 ++++++++++++-------
 .../dynamicContactAngleForce.H}               | 88 ++++++++++++------
 .../pimpleFoam/laminar/filmPanel0/0.orig/U    |  6 +-
 .../pimpleFoam/laminar/inclinedPlaneFilm/0/U  |  6 +-
 .../splashPanelFilm/0.orig/U                  |  6 +-
 6 files changed, 131 insertions(+), 70 deletions(-)
 rename src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/{perturbedTemperatureDependent/perturbedTemperatureDependentContactAngleForce.C => dynamicContactAngleForce/dynamicContactAngleForce.C} (61%)
 rename src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/{perturbedTemperatureDependent/perturbedTemperatureDependentContactAngleForce.H => dynamicContactAngleForce/dynamicContactAngleForce.H} (57%)

diff --git a/src/regionFaModels/Make/files b/src/regionFaModels/Make/files
index 4e761c227dd..cd0717dbd83 100644
--- a/src/regionFaModels/Make/files
+++ b/src/regionFaModels/Make/files
@@ -30,7 +30,7 @@ liquidFilm/subModels/kinematic/force/forceList/forceList.C
 liquidFilm/subModels/kinematic/force/force/force.C
 liquidFilm/subModels/kinematic/force/force/forceNew.C
 liquidFilm/subModels/kinematic/force/contactAngleForces/contactAngleForce/contactAngleForce.C
-liquidFilm/subModels/kinematic/force/contactAngleForces/perturbedTemperatureDependent/perturbedTemperatureDependentContactAngleForce.C
+liquidFilm/subModels/kinematic/force/contactAngleForces/dynamicContactAngleForce/dynamicContactAngleForce.C
 
 liquidFilm/subModels/filmSubModelBase.C
 
diff --git a/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/perturbedTemperatureDependent/perturbedTemperatureDependentContactAngleForce.C b/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/dynamicContactAngleForce/dynamicContactAngleForce.C
similarity index 61%
rename from src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/perturbedTemperatureDependent/perturbedTemperatureDependentContactAngleForce.C
rename to src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/dynamicContactAngleForce/dynamicContactAngleForce.C
index 85cf19f2c5d..4119e50a984 100644
--- a/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/perturbedTemperatureDependent/perturbedTemperatureDependentContactAngleForce.C
+++ b/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/dynamicContactAngleForce/dynamicContactAngleForce.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2020 OpenCFD Ltd.
+    Copyright (C) 2020-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -25,7 +25,7 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "perturbedTemperatureDependentContactAngleForce.H"
+#include "dynamicContactAngleForce.H"
 #include "addToRunTimeSelectionTable.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -39,26 +39,44 @@ namespace areaSurfaceFilmModels
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
-defineTypeNameAndDebug(perturbedTemperatureDependentContactAngleForce, 0);
+defineTypeNameAndDebug(dynamicContactAngleForce, 0);
 addToRunTimeSelectionTable
 (
     force,
-    perturbedTemperatureDependentContactAngleForce,
+    dynamicContactAngleForce,
     dictionary
 );
 
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-perturbedTemperatureDependentContactAngleForce::
-perturbedTemperatureDependentContactAngleForce
+dynamicContactAngleForce::dynamicContactAngleForce
 (
     liquidFilmBase& film,
     const dictionary& dict
 )
 :
     contactAngleForce(typeName, film, dict),
-    thetaPtr_(Function1<scalar>::New("theta", coeffDict_, &film.primaryMesh())),
+    U_vs_thetaPtr_
+    (
+        Function1<scalar>::NewIfPresent
+        (
+            "Utheta",
+            coeffDict_,
+            word::null,
+            &film.primaryMesh()
+        )
+    ),
+    T_vs_thetaPtr_
+    (
+        Function1<scalar>::NewIfPresent
+        (
+            "Ttheta",
+            coeffDict_,
+            word::null,
+            &film.primaryMesh()
+        )
+    ),
     rndGen_(label(0)),
     distribution_
     (
@@ -68,43 +86,53 @@ perturbedTemperatureDependentContactAngleForce
             rndGen_
         )
     )
-{}
-
-
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-perturbedTemperatureDependentContactAngleForce::
-~perturbedTemperatureDependentContactAngleForce()
-{}
+{
+    if (U_vs_thetaPtr_ && T_vs_thetaPtr_)
+    {
+        FatalIOErrorInFunction(dict)
+            << "Entries Utheta and Ttheta could not be used together"
+            << abort(FatalIOError);
+    }
+}
 
 
 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
 
-tmp<areaScalarField> perturbedTemperatureDependentContactAngleForce::
-theta() const
+tmp<areaScalarField> dynamicContactAngleForce::theta() const
 {
-    tmp<areaScalarField> ttheta
+    auto ttheta = tmp<areaScalarField>::New
     (
-        new areaScalarField
+        IOobject
         (
-            IOobject
-            (
-                typeName + ":theta",
-                film().primaryMesh().time().timeName(),
-                film().primaryMesh()
-            ),
-            film().regionMesh(),
-            dimensionedScalar(dimless, Zero)
-        )
+            IOobject::scopedName(typeName, "theta"),
+            film().primaryMesh().time().timeName(),
+            film().primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE,
+            IOobject::NO_REGISTER
+        ),
+        film().regionMesh(),
+        dimensionedScalar(dimless, Zero)
     );
-
     areaScalarField& theta = ttheta.ref();
     scalarField& thetai = theta.ref();
 
-    const areaScalarField& T = film().Tf();
 
-    // Initialize with the function of temperature
-    thetai = thetaPtr_->value(T());
+    if (U_vs_thetaPtr_)
+    {
+        // Initialize with the function of film speed
+        const areaVectorField& U = film().Uf();
+
+        thetai = U_vs_thetaPtr_->value(mag(U()));
+    }
+
+    if (T_vs_thetaPtr_)
+    {
+        // Initialize with the function of film temperature
+        const areaScalarField& T = film().Tf();
+
+        thetai = T_vs_thetaPtr_->value(T());
+    }
 
     // Add the stochastic perturbation
     forAll(thetai, facei)
@@ -115,6 +143,7 @@ theta() const
     return ttheta;
 }
 
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace surfaceFilmModels
diff --git a/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/perturbedTemperatureDependent/perturbedTemperatureDependentContactAngleForce.H b/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/dynamicContactAngleForce/dynamicContactAngleForce.H
similarity index 57%
rename from src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/perturbedTemperatureDependent/perturbedTemperatureDependentContactAngleForce.H
rename to src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/dynamicContactAngleForce/dynamicContactAngleForce.H
index ae165b90292..8f2ec84b881 100644
--- a/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/perturbedTemperatureDependent/perturbedTemperatureDependentContactAngleForce.H
+++ b/src/regionFaModels/liquidFilm/subModels/kinematic/force/contactAngleForces/dynamicContactAngleForce/dynamicContactAngleForce.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2020 OpenCFD Ltd.
+    Copyright (C) 2020-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -24,31 +24,66 @@ License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 
 Class
-    Foam::regionModels::areaSurfaceFilmModels::
-        perturbedTemperatureDependentContactAngleForce
+    Foam::regionModels::areaSurfaceFilmModels::dynamicContactAngleForce
 
 Description
-    Temperature dependent contact angle force with a stochastic perturbation.
+    Film-speed or film-temperature dependent
+    contact-angle force with a stochastic perturbation.
 
     The contact angle in degrees is specified as a \c Foam::Function1 type,
     to enable the use of, e.g. \c constant, \c polynomial, \c table values
     and the stochastic perturbation obtained from a
     \c Foam::distributionModels::distributionModel.
 
-See also
-  - Foam::regionModels::areaSurfaceFilmModels::contactAngleForce
-  - areaSurfaceFilmModels::temperatureDependentContactAngleForce
-  - Foam::regionModels::areaSurfaceFilmModels::distributionContactAngleForce
-  - Foam::Function1Types
-  - Foam::distributionModel
+Usage
+    Minimal example:
+    \verbatim
+    forces
+    (
+        dynamicContactAngle
+    );
+
+    dynamicContactAngleForceCoeffs
+    {
+        // Mandatory entries
+        distribution    <subDict>;
+
+        // Conditional entries
+
+            // Option-1
+            Utheta           <Function1<scalar>>;
+
+            // Option-2
+            Ttheta           <Function1<scalar>>;
+
+        // Inherited entries
+        ...
+    }
+    \endverbatim
+
+    where the entries mean:
+    \table
+      Property              | Description              | Type  | Reqd | Deflt
+      dynamicContactAngle   | Type name                | word  | yes  | -
+      Utheta      | Contact angle as a function of film speed <!--
+            -->                        | \<Function1\<scalar\> | choice | -
+      Ttheta      | Contact angle as a function of film temperature <!--
+            -->                        | \<Function1\<scalar\> | choice | -
+      distribution  | Probability distribution model  | subDict | yes | -
+    \endtable
+
+    The inherited entries are elaborated in:
+      - \link contactAngleForce.H \endlink
+      - \link Function1.H \endlink
+      - \link distributionModel.H \endlink
 
 SourceFiles
-    perturbedTemperatureDependentContactAngleForce.C
+    dynamicContactAngleForce.C
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef perturbedTemperatureDependentContactAngleForce_H
-#define perturbedTemperatureDependentContactAngleForce_H
+#ifndef areaSurfaceFilmModels_dynamicContactAngleForce_H
+#define areaSurfaceFilmModels_dynamicContactAngleForce_H
 
 #include "contactAngleForce.H"
 #include "Function1.H"
@@ -65,17 +100,20 @@ namespace areaSurfaceFilmModels
 {
 
 /*---------------------------------------------------------------------------*\
-       Class perturbedTemperatureDependentContactAngleForce Declaration
+                  Class dynamicContactAngleForce Declaration
 \*---------------------------------------------------------------------------*/
 
-class perturbedTemperatureDependentContactAngleForce
+class dynamicContactAngleForce
 :
     public contactAngleForce
 {
     // Private Data
 
-        //- Contact angle function
-        autoPtr<Function1<scalar>> thetaPtr_;
+        //- Contact angle as a function of film speed
+        autoPtr<Function1<scalar>> U_vs_thetaPtr_;
+
+        //- Contact angle as a function of film temperature
+        autoPtr<Function1<scalar>> T_vs_thetaPtr_;
 
         //- Random number generator
         Random rndGen_;
@@ -87,16 +125,10 @@ class perturbedTemperatureDependentContactAngleForce
     // Private Member Functions
 
         //- No copy construct
-        perturbedTemperatureDependentContactAngleForce
-        (
-            const perturbedTemperatureDependentContactAngleForce&
-        ) = delete;
+        dynamicContactAngleForce(const dynamicContactAngleForce&) = delete;
 
         //- No copy assignment
-        void operator=
-        (
-            const perturbedTemperatureDependentContactAngleForce&
-        ) = delete;
+        void operator=(const dynamicContactAngleForce&) = delete;
 
 
 protected:
@@ -108,13 +140,13 @@ protected:
 public:
 
     //- Runtime type information
-    TypeName("perturbedTemperatureDependentContactAngle");
+    TypeName("dynamicContactAngle");
 
 
     // Constructors
 
         //- Construct from surface film model
-        perturbedTemperatureDependentContactAngleForce
+        dynamicContactAngleForce
         (
             liquidFilmBase& film,
             const dictionary& dict
@@ -122,7 +154,7 @@ public:
 
 
     //- Destructor
-    virtual ~perturbedTemperatureDependentContactAngleForce();
+    virtual ~dynamicContactAngleForce() = default;
 };
 
 
diff --git a/tutorials/incompressible/pimpleFoam/laminar/filmPanel0/0.orig/U b/tutorials/incompressible/pimpleFoam/laminar/filmPanel0/0.orig/U
index 820885bc360..c1d3599d0c1 100644
--- a/tutorials/incompressible/pimpleFoam/laminar/filmPanel0/0.orig/U
+++ b/tutorials/incompressible/pimpleFoam/laminar/filmPanel0/0.orig/U
@@ -68,12 +68,12 @@ boundaryField
 
         injectionModels ();
 
-        forces (perturbedTemperatureDependentContactAngle);
+        forces (dynamicContactAngle);
 
-        perturbedTemperatureDependentContactAngleCoeffs
+        dynamicContactAngleCoeffs
         {
             Ccf     0.4;
-            theta   constant 0;
+            Ttheta  constant 0;
             distribution
             {
                 type            normal;
diff --git a/tutorials/incompressible/pimpleFoam/laminar/inclinedPlaneFilm/0/U b/tutorials/incompressible/pimpleFoam/laminar/inclinedPlaneFilm/0/U
index d93910cbe5d..2c2f5c41226 100644
--- a/tutorials/incompressible/pimpleFoam/laminar/inclinedPlaneFilm/0/U
+++ b/tutorials/incompressible/pimpleFoam/laminar/inclinedPlaneFilm/0/U
@@ -59,12 +59,12 @@ boundaryField
 
         injectionModels ();
 
-        forces (perturbedTemperatureDependentContactAngle);
+        forces (dynamicContactAngle);
 
-        perturbedTemperatureDependentContactAngleCoeffs
+        dynamicContactAngleCoeffs
         {
             Ccf     0.085;
-            theta   constant 45;
+            Ttheta  constant 45;
             distribution
             {
                 type            normal;
diff --git a/tutorials/lagrangian/reactingParcelFoam/splashPanelFilm/0.orig/U b/tutorials/lagrangian/reactingParcelFoam/splashPanelFilm/0.orig/U
index 032780506ce..fbf0aa9b9d6 100644
--- a/tutorials/lagrangian/reactingParcelFoam/splashPanelFilm/0.orig/U
+++ b/tutorials/lagrangian/reactingParcelFoam/splashPanelFilm/0.orig/U
@@ -54,12 +54,12 @@ boundaryField
 
         injectionModels ();
 
-        forces (perturbedTemperatureDependentContactAngle);
+        forces (dynamicContactAngle);
 
-        perturbedTemperatureDependentContactAngleCoeffs
+        dynamicContactAngleCoeffs
         {
             Ccf     0.4;
-            theta   constant 0;
+            Ttheta  constant 0;
             distribution
             {
                 type            normal;
-- 
GitLab