From e32c866605c75c43f8a53f8bf6c11fd956c498d3 Mon Sep 17 00:00:00 2001
From: andy <andy>
Date: Tue, 10 Dec 2013 16:32:19 +0000
Subject: [PATCH] ENH: film sub-models - enabled smooth restart for models
 which accumulate data

---
 .../curvatureSeparation/curvatureSeparation.C |  4 +++
 .../drippingInjection/drippingInjection.C     |  4 +++
 .../injectionModel/injectionModel.C           | 35 +++++++++++++++++--
 .../injectionModel/injectionModel.H           | 20 +++++++++++
 .../injectionModelList/injectionModelList.C   | 19 +++++-----
 .../injectionModelList/injectionModelList.H   |  3 --
 .../removeInjection/removeInjection.C         |  4 +++
 .../phaseChangeModel/phaseChangeModel.C       | 14 ++++++--
 8 files changed, 87 insertions(+), 16 deletions(-)

diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/curvatureSeparation/curvatureSeparation.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/curvatureSeparation/curvatureSeparation.C
index 8dcc59d9850..47f84119005 100644
--- a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/curvatureSeparation/curvatureSeparation.C
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/curvatureSeparation/curvatureSeparation.C
@@ -339,6 +339,8 @@ void curvatureSeparation::correct
     diameterToInject = separated*delta;
     availableMass -= separated*availableMass;
 
+    addToInjectedMass(sum(separated*availableMass));
+
     if (debug && mesh.time().outputTime())
     {
         volScalarField volFnet
@@ -358,6 +360,8 @@ void curvatureSeparation::correct
         volFnet.correctBoundaryConditions();
         volFnet.write();
     }
+
+    injectionModel::correct();
 }
 
 
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C
index d970b1a3474..905477378ca 100644
--- a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C
@@ -137,6 +137,8 @@ void drippingInjection::correct
 
                 // Retrieve new particle diameter sample
                 diam = parcelDistribution_->sample();
+
+                addToInjectedMass(massDrip[cellI]);
             }
             else
             {
@@ -151,6 +153,8 @@ void drippingInjection::correct
             diameterToInject[cellI] = 0.0;
         }
     }
+
+    injectionModel::correct();
 }
 
 
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.C
index 54fe38147e7..ceac59285e0 100644
--- a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.C
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.C
@@ -39,11 +39,20 @@ namespace surfaceFilmModels
 defineTypeNameAndDebug(injectionModel, 0);
 defineRunTimeSelectionTable(injectionModel, dictionary);
 
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+void injectionModel::addToInjectedMass(const scalar dMass)
+{
+    injectedMass_ += dMass;
+}
+
+
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 injectionModel::injectionModel(surfaceFilmModel& owner)
 :
-    filmSubModelBase(owner)
+    filmSubModelBase(owner),
+    injectedMass_(0.0)
 {}
 
 
@@ -54,7 +63,8 @@ injectionModel::injectionModel
     const dictionary& dict
 )
 :
-    filmSubModelBase(owner, dict, typeName, modelType)
+    filmSubModelBase(owner, dict, typeName, modelType),
+    injectedMass_(0.0)
 {}
 
 
@@ -64,6 +74,27 @@ injectionModel::~injectionModel()
 {}
 
 
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void injectionModel::correct()
+{
+    if (outputTime())
+    {
+        scalar injectedMass0 = getModelProperty<scalar>("injectedMass");
+        injectedMass0 += returnReduce(injectedMass_, sumOp<scalar>());
+        setModelProperty<scalar>("injectedMass", injectedMass0);
+        injectedMass_ = 0.0;
+    }
+}
+
+
+scalar injectionModel::injectedMassTotal() const
+{
+    scalar injectedMass0 = getModelProperty<scalar>("injectedMass");
+    return injectedMass0 + returnReduce(injectedMass_, sumOp<scalar>());
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace surfaceFilmModels
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.H
index ea47866b0bc..bd7850894d5 100644
--- a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.H
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.H
@@ -59,6 +59,12 @@ class injectionModel
 {
 private:
 
+    // Private data
+
+        //- Injected mass
+        scalar injectedMass_;
+
+
     // Private Member Functions
 
         //- Disallow default bitwise copy construct
@@ -68,6 +74,17 @@ private:
         void operator=(const injectionModel&);
 
 
+protected:
+
+    // Protected Member Functions
+
+        //- Add to injected mass
+        void addToInjectedMass(const scalar dMass);
+
+        //- Correct
+        void correct();
+
+
 public:
 
     //- Runtime type information
@@ -128,6 +145,9 @@ public:
                 scalarField& massToInject,
                 scalarField& diameterToInject
             ) = 0;
+
+            //- Return the total mass injected
+            scalar injectedMassTotal() const;
 };
 
 
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModelList/injectionModelList.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModelList/injectionModelList.C
index cd72677ae6b..667fe2d8100 100644
--- a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModelList/injectionModelList.C
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModelList/injectionModelList.C
@@ -40,8 +40,7 @@ injectionModelList::injectionModelList(surfaceFilmModel& owner)
 :
     PtrList<injectionModel>(),
     owner_(owner),
-    dict_(dictionary::null),
-    injectedMassTotal_(0.0)
+    dict_(dictionary::null)
 {}
 
 
@@ -53,8 +52,7 @@ injectionModelList::injectionModelList
 :
     PtrList<injectionModel>(),
     owner_(owner),
-    dict_(dict),
-    injectedMassTotal_(0.0)
+    dict_(dict)
 {
     const wordList activeModels(dict.lookup("injectionModels"));
 
@@ -109,9 +107,6 @@ void injectionModelList::correct
         im.correct(availableMass, massToInject, diameterToInject);
     }
 
-    injectedMassTotal_ += sum(massToInject.internalField());
-
-
     // Push values to boundaries ready for transfer to the primary region
     massToInject.correctBoundaryConditions();
     diameterToInject.correctBoundaryConditions();
@@ -120,8 +115,14 @@ void injectionModelList::correct
 
 void injectionModelList::info(Ostream& os) const
 {
-    os  << indent << "injected mass      = "
-        << returnReduce<scalar>(injectedMassTotal_, sumOp<scalar>()) << nl;
+    scalar injectedMass = 0.0;
+    forAll(*this, i)
+    {
+        const injectionModel& im = operator[](i);
+        injectedMass += im.injectedMassTotal();
+    }
+
+    os  << indent << "injected mass      = " << injectedMass << nl;
 }
 
 
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModelList/injectionModelList.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModelList/injectionModelList.H
index be62ba45b8b..c58f85a6532 100644
--- a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModelList/injectionModelList.H
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModelList/injectionModelList.H
@@ -65,9 +65,6 @@ private:
         //- Dictionary
         dictionary dict_;
 
-        //- Cumulative mass injected total
-        scalar injectedMassTotal_;
-
 
     // Private Member Functions
 
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/removeInjection/removeInjection.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/removeInjection/removeInjection.C
index 500962636aa..fe6b5730b34 100644
--- a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/removeInjection/removeInjection.C
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/removeInjection/removeInjection.C
@@ -103,8 +103,12 @@ void removeInjection::correct
             scalar dMass = ddelta*rho[cellI]*magSf[cellI];
             massToInject[cellI] += dMass;
             availableMass[cellI] -= dMass;
+
+            addToInjectedMass(dMass);
         }
     }
+
+    injectionModel::correct();
 }
 
 
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModel.C b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModel.C
index da6c0236345..ffc66761be3 100644
--- a/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModel.C
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModel.C
@@ -94,6 +94,14 @@ void phaseChangeModel::correct
 
     availableMass -= dMass;
     dMass.correctBoundaryConditions();
+
+    if (outputTime())
+    {
+        scalar phaseChangeMass = getModelProperty<scalar>("phaseChangeMass");
+        phaseChangeMass += returnReduce(totalMassPC_, sumOp<scalar>());
+        setModelProperty<scalar>("phaseChangeMass", phaseChangeMass);
+        totalMassPC_ = 0.0;
+    }
 }
 
 
@@ -103,8 +111,10 @@ void phaseChangeModel::info(Ostream& os) const
         returnReduce(latestMassPC_, sumOp<scalar>())
        /owner_.time().deltaTValue();
 
-    os  << indent << "mass phase change  = "
-        << returnReduce(totalMassPC_, sumOp<scalar>()) << nl
+    scalar phaseChangeMass = getModelProperty<scalar>("phaseChangeMass");
+    phaseChangeMass += returnReduce(totalMassPC_, sumOp<scalar>());
+
+    os  << indent << "mass phase change  = " << phaseChangeMass << nl
         << indent << "vapourisation rate = " << massPCRate << nl;
 }
 
-- 
GitLab