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