diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C index eb623df2f2..aa0c8cedfe 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C @@ -293,7 +293,11 @@ Foam::KinematicCloud::KinematicCloud ( particleProperties_.lookup("cellValueSourceCorrection") ), - rndGen_(label(0)), + rndGen_ + ( + label(0), + readLabel(particleProperties_.lookup("randomSampleSize")) + ), cellOccupancyPtr_(), rho_(rho), U_(U), diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H index f2b489a8c7..4e95184bec 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H @@ -49,7 +49,7 @@ SourceFiles #include "kinematicCloud.H" #include "IOdictionary.H" #include "autoPtr.H" -#include "Random.H" +#include "cachedRandom.H" #include "fvMesh.H" #include "volFields.H" #include "fvMatrices.H" @@ -206,7 +206,7 @@ protected: const Switch cellValueSourceCorrection_; //- Random number generator - used by some injection routines - Random rndGen_; + cachedRandom rndGen_; //- Cell occupancy information for each parcel, (demand driven) autoPtr > > cellOccupancyPtr_; @@ -358,7 +358,7 @@ public: // Cloud data //- Return refernce to the random object - inline Random& rndGen(); + inline cachedRandom& rndGen(); //- Return the cell occupancy information for each // parcel, non-const access, the caller is diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H index d3078fbb1b..96cd40ef7e 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H @@ -334,7 +334,7 @@ rotationalKineticEnergyOfSystem() const template -inline Foam::Random& Foam::KinematicCloud::rndGen() +inline Foam::cachedRandom& Foam::KinematicCloud::rndGen() { return rndGen_; } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.C index 5f22f04750..27eee149b8 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.C @@ -30,9 +30,7 @@ License template Foam::CollisionModel::CollisionModel(CloudType& owner) : - dict_(dictionary::null), - owner_(owner), - coeffDict_(dictionary::null) + SubModelBase(owner) {} @@ -44,9 +42,14 @@ Foam::CollisionModel::CollisionModel const word& type ) : - dict_(dict), - owner_(owner), - coeffDict_(dict.subDict(type + "Coeffs")) + SubModelBase(owner, dict, type) +{} + + +template +Foam::CollisionModel::CollisionModel(CollisionModel& cm) +: + SubModelBase(cm) {} @@ -57,6 +60,36 @@ Foam::CollisionModel::~CollisionModel() {} +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template +Foam::label Foam::CollisionModel::nSubCycles() const +{ + notImplemented + ( + "Foam::label Foam::CollisionModel::nSubCycles() const" + ); + return 0; +} + + +template +bool Foam::CollisionModel::controlsWallInteraction() const +{ + notImplemented + ( + "bool Foam::CollisionModel::controlsWallInteraction()" + ); + return false; +} + +template +void Foam::CollisionModel::collide() +{ + notImplemented("void Foam::CollisionModel::collide()"); +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #include "CollisionModelNew.C" diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H index 4ff1cc0000..baef80996f 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H @@ -51,21 +51,9 @@ namespace Foam template class CollisionModel +: + public SubModelBase { - // Private data - - //- The cloud dictionary - const dictionary& dict_; - - //- Reference to the owner cloud class - CloudType& owner_; - - //- The coefficients dictionary - const dictionary coeffDict_; - - -protected: - // Protected data //- Convenience typedef for parcel type @@ -96,7 +84,7 @@ public: //- Construct null from owner CollisionModel(CloudType& owner); - //- Construct from dictionary + //- Construct from components CollisionModel ( const dictionary& dict, @@ -104,6 +92,18 @@ public: const word& type ); + //- Construct copy + CollisionModel(CollisionModel& cm); + + //- Construct and return a clone + virtual autoPtr > clone() + { + return autoPtr > + ( + new CollisionModel(*this) + ); + } + //- Destructor virtual ~CollisionModel(); @@ -117,36 +117,18 @@ public: ); - // Access - - //- Return the owner cloud dictionary - inline const dictionary& dict() const; - - //- Return const access the owner cloud object - inline const CloudType& owner() const; - - //- Return non-const access the owner cloud object for manipulation - inline CloudType& owner(); - - //- Return the coefficients dictionary - inline const dictionary& coeffDict() const; - - // Member Functions //- Return the number of times to subcycle the current // timestep to meet the criteria of the collision model - virtual label nSubCycles() const = 0; - - //- Flag to indicate whether model activates injection model - virtual bool active() const = 0; + virtual label nSubCycles() const; //- Indicates whether model determines wall collisions or not, // used to determine what value to use for wallImpactDistance - virtual bool controlsWallInteraction() const = 0; + virtual bool controlsWallInteraction() const; // Collision function - virtual void collide() = 0; + virtual void collide(); }; @@ -172,10 +154,6 @@ public: add##SS##CloudType##ParcelType##ConstructorToTable_; -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -#include "CollisionModelI.H" - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #ifdef NoRepository diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelI.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelI.H deleted file mode 100644 index 009d1e20c8..0000000000 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelI.H +++ /dev/null @@ -1,56 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd. - \\/ 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 "CollisionModel.H" - -template -const Foam::dictionary& Foam::CollisionModel::dict() const -{ - return dict_; -} - - -template -const CloudType& Foam::CollisionModel::owner() const -{ - return owner_; -} - - -template -CloudType& Foam::CollisionModel::owner() -{ - return owner_; -} - - -template -const Foam::dictionary& Foam::CollisionModel::coeffDict() const -{ - return coeffDict_; -} - - -// ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelNew.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelNew.C index 3f06cfbe4e..78f07c0108 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelNew.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelNew.C @@ -35,12 +35,12 @@ Foam::CollisionModel::New CloudType& owner ) { - word CollisionModelType(dict.lookup("CollisionModel")); + word modelType(dict.lookup("CollisionModel")); - Info<< "Selecting CollisionModel " << CollisionModelType << endl; + Info<< "Selecting CollisionModel " << modelType << endl; typename dictionaryConstructorTable::iterator cstrIter = - dictionaryConstructorTablePtr_->find(CollisionModelType); + dictionaryConstructorTablePtr_->find(modelType); if (cstrIter == dictionaryConstructorTablePtr_->end()) { @@ -51,8 +51,7 @@ Foam::CollisionModel::New "const dictionary&, " "CloudType&" ")" - ) << "Unknown CollisionModelType type " - << CollisionModelType + ) << "Unknown CollisionModelType type " << modelType << ", constructor not in hash table" << nl << nl << " Valid CollisionModel types are:" << nl << dictionaryConstructorTablePtr_->sortedToc() << exit(FatalError); diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C index 993fe53b70..4078423c5b 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C @@ -38,6 +38,16 @@ Foam::NoCollision::NoCollision {} +template +Foam::NoCollision::NoCollision +( + NoCollision& cm +) +: + CollisionModel(cm) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H index e0c0ffbc6b..4cd294cf9e 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H @@ -60,12 +60,20 @@ public: // Constructors - //- Construct from dictionary - NoCollision - ( - const dictionary& dict, - CloudType& owner - ); + //- Construct from components + NoCollision(const dictionary& dict, CloudType& owner); + + //- Construct copy + NoCollision(NoCollision& cm); + + //- Construct and return a clone + virtual autoPtr > clone() + { + return autoPtr > + ( + new NoCollision(*this) + ); + } //- Destructor diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C index 0657ea96a9..fc78488bf8 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C @@ -564,6 +564,24 @@ Foam::PairCollision::PairCollision {} +template +Foam::PairCollision::PairCollision(PairCollision& cm) +: + CollisionModel(cm), + pairModel_(NULL), + wallModel_(NULL), + il_(cm.owner().mesh()) +{ + notImplemented + ( + "Foam::PairCollision::PairCollision" + "(" + "PairCollision& cm" + ")" + ); +} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -602,13 +620,6 @@ Foam::label Foam::PairCollision::nSubCycles() const } -template -bool Foam::PairCollision::active() const -{ - return true; -} - - template bool Foam::PairCollision::controlsWallInteraction() const { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H index 6ad4130e1c..4c1e660c77 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H @@ -147,12 +147,20 @@ public: // Constructors - //- Construct from dictionary - PairCollision - ( - const dictionary& dict, - CloudType& owner - ); + //- Construct from components + PairCollision(const dictionary& dict, CloudType& owner); + + //- Construct copy + PairCollision(PairCollision& cm); + + //- Construct and return a clone + virtual autoPtr > clone() + { + return autoPtr > + ( + new PairCollision(*this) + ); + } //- Destructor @@ -165,9 +173,6 @@ public: // timestep to meet the criteria of the collision model. virtual label nSubCycles() const; - //- Flag to indicate whether model activates injection model - virtual bool active() const; - //- Indicates whether model determines wall collisions or not, // used to determine what value to use for wallImpactDistance virtual bool controlsWallInteraction() const; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.C index 650fd4881b..d2d49d7c1c 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.C @@ -30,8 +30,7 @@ License template Foam::DispersionModel::DispersionModel(CloudType& owner) : - dict_(dictionary::null), - owner_(owner) + SubModelBase(owner) {} @@ -39,11 +38,21 @@ template Foam::DispersionModel::DispersionModel ( const dictionary& dict, - CloudType& owner + CloudType& owner, + const word& type ) : - dict_(dict), - owner_(owner) + SubModelBase(dict, owner, type) +{} + + +template +Foam::DispersionModel::DispersionModel +( + DispersionModel& dm +) +: + SubModelBase(dm) {} @@ -57,23 +66,30 @@ Foam::DispersionModel::~DispersionModel() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template -const CloudType& Foam::DispersionModel::owner() const +Foam::vector Foam::DispersionModel::update +( + const scalar, + const label, + const vector&, + const vector& Uc, + vector&, + scalar& +) { - return owner_; -} + notImplemented + ( + "Foam::vector Foam::DispersionModel::update" + "(" + "const scalar, " + "const label, " + "const vector&, " + "const vector&, " + "vector&, " + "scalar&" + ")" + ); - -template -CloudType& Foam::DispersionModel::owner() -{ - return owner_; -} - - -template -const Foam::dictionary& Foam::DispersionModel::dict() const -{ - return dict_; + return Uc; } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H index afb063d0f5..90c64f3042 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H @@ -34,6 +34,7 @@ Description #include "IOdictionary.H" #include "autoPtr.H" #include "runTimeSelectionTables.H" +#include "SubModelBase.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -46,17 +47,9 @@ namespace Foam template class DispersionModel +: + public SubModelBase { - - // Private data - - //- Cloud dictionary - const dictionary& dict_; - - //- Reference to the owner cloud class - CloudType& owner_; - - public: //- Runtime type information @@ -90,6 +83,26 @@ public: CloudType& owner ); + //- Construct from components + DispersionModel + ( + const dictionary& dict, + CloudType& owner, + const word& type + ); + + //- Construct copy + DispersionModel(DispersionModel& dm); + + //- Construct and return a clone + virtual autoPtr > clone() + { + return autoPtr > + ( + new DispersionModel(*this) + ); + } + //- Destructor virtual ~DispersionModel(); @@ -103,26 +116,8 @@ public: ); - // Access - - //- Return the owner cloud object - const CloudType& owner() const; - - //- Return the owner cloud object - CloudType& owner(); - - //- Return the dictionary - const dictionary& dict() const; - - // Member Functions - //- Flag to indicate whether model activates injection model - virtual bool active() const = 0; - - //- Cache carrier fields - virtual void cacheFields(const bool store) = 0; - //- Update (disperse particles) virtual vector update ( @@ -132,7 +127,7 @@ public: const vector& Uc, vector& UTurb, scalar& tTurb - ) = 0; + ); }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C index 6cc31f406e..250074a975 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C @@ -24,17 +24,18 @@ License \*---------------------------------------------------------------------------*/ #include "DispersionRASModel.H" +#include "demandDrivenData.H" // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template Foam::DispersionRASModel::DispersionRASModel ( - const dictionary& dict, + const dictionary&, CloudType& owner ) : - DispersionModel(dict, owner), + DispersionModel(owner), turbulence_ ( owner.mesh().objectRegistry::lookupObject @@ -49,6 +50,24 @@ Foam::DispersionRASModel::DispersionRASModel {} +template +Foam::DispersionRASModel::DispersionRASModel +( + DispersionRASModel& dm +) +: + DispersionModel(dm), + turbulence_(dm.turbulence_), + kPtr_(dm.kPtr_), + ownK_(dm.ownK_), + epsilonPtr_(dm.epsilonPtr_), + ownEpsilon_(dm.ownEpsilon_) +{ + dm.ownK_ = false; + dm.ownEpsilon_ = false; +} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -93,18 +112,27 @@ void Foam::DispersionRASModel::cacheFields(const bool store) { if (ownK_ && kPtr_) { - delete kPtr_; - kPtr_ = NULL; + deleteDemandDrivenData(kPtr_); ownK_ = false; } if (ownEpsilon_ && epsilonPtr_) { - delete epsilonPtr_; - epsilonPtr_ = NULL; + deleteDemandDrivenData(epsilonPtr_); ownEpsilon_ = false; } } } +template +void Foam::DispersionRASModel::write(Ostream& os) const +{ + DispersionModel::write(os); + + os.writeKeyword("ownK") << ownK_ << token::END_STATEMENT << endl; + os.writeKeyword("ownEpsilon") << ownEpsilon_ << token::END_STATEMENT + << endl; +} + + // ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H index ebeacc186e..4a284ef1dc 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H @@ -80,11 +80,19 @@ public: // Constructors //- Construct from components - DispersionRASModel - ( - const dictionary& dict, - CloudType& owner - ); + DispersionRASModel(const dictionary& dict, CloudType& owner); + + //- Construct copy + DispersionRASModel(DispersionRASModel& dm); + + //- Construct and return a clone + virtual autoPtr > clone() + { + return autoPtr > + ( + new DispersionRASModel(*this) + ); + } //- Destructor @@ -101,6 +109,12 @@ public: { return turbulence_; } + + + // I-O + + //- Write + virtual void write(Ostream& os) const; }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C index 05617f25da..da6719a391 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C @@ -24,6 +24,7 @@ License \*---------------------------------------------------------------------------*/ #include "GradientDispersionRAS.H" +#include "demandDrivenData.H" // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // @@ -35,10 +36,25 @@ Foam::GradientDispersionRAS::GradientDispersionRAS ) : DispersionRASModel(dict, owner), - gradkPtr_(NULL) + gradkPtr_(NULL), + ownGradK_(false) {} +template +Foam::GradientDispersionRAS::GradientDispersionRAS +( + GradientDispersionRAS& dm +) +: + DispersionRASModel(dm), + gradkPtr_(dm.gradkPtr_), + ownGradK_(dm.ownGradK_) +{ + dm.ownGradK_ = false; +} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -50,13 +66,6 @@ Foam::GradientDispersionRAS::~GradientDispersionRAS() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -template -bool Foam::GradientDispersionRAS::active() const -{ - return true; -} - - template void Foam::GradientDispersionRAS::cacheFields(const bool store) { @@ -65,13 +74,15 @@ void Foam::GradientDispersionRAS::cacheFields(const bool store) if (store) { gradkPtr_ = fvc::grad(*this->kPtr_).ptr(); + ownGradK_ = true; } else { - if (gradkPtr_) + if (ownGradK_) { - delete gradkPtr_; + deleteDemandDrivenData(gradkPtr_); gradkPtr_ = NULL; + ownGradK_ = false; } } } @@ -88,6 +99,8 @@ Foam::vector Foam::GradientDispersionRAS::update scalar& tTurb ) { + cachedRandom& rnd = this->owner().rndGen(); + const scalar cps = 0.16432; const volScalarField& k = *this->kPtr_; @@ -120,8 +133,8 @@ Foam::vector Foam::GradientDispersionRAS::update scalar rsq = 10.0; while ((rsq > 1.0) || (rsq == 0.0)) { - x1 = 2.0*this->owner().rndGen().scalar01() - 1.0; - x2 = 2.0*this->owner().rndGen().scalar01() - 1.0; + x1 = 2.0*rnd.sample01() - 1.0; + x2 = 2.0*rnd.sample01() - 1.0; rsq = x1*x1 + x2*x2; } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H index af74d2578b..910dd1d06e 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H @@ -54,8 +54,13 @@ protected: // Locally cached turbulence fields - //- Gradient of k - const volVectorField* gradkPtr_; + // Locally cached turbulence fields + + //- Gradient of k + const volVectorField* gradkPtr_; + + //- Take ownership of the grad(k) + bool ownGradK_; public: @@ -67,11 +72,19 @@ public: // Constructors //- Construct from components - GradientDispersionRAS - ( - const dictionary& dict, - CloudType& owner - ); + GradientDispersionRAS(const dictionary& dict, CloudType& owner); + + //- Construct copy + GradientDispersionRAS(GradientDispersionRAS& dm); + + //- Construct and return a clone + virtual autoPtr > clone() + { + return autoPtr > + ( + new GradientDispersionRAS(*this) + ); + } //- Destructor @@ -80,9 +93,6 @@ public: // Member Functions - //- Flag to indicate whether model activates injection model - bool active() const; - //- Cache carrier fields virtual void cacheFields(const bool store); diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C index f44c197bb9..6f660b1fe1 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C @@ -28,16 +28,19 @@ License // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template -Foam::NoDispersion::NoDispersion -( - const dictionary&, - CloudType& owner -) +Foam::NoDispersion::NoDispersion(const dictionary&, CloudType& owner) : DispersionModel(owner) {} +template +Foam::NoDispersion::NoDispersion(NoDispersion& dm) +: + DispersionModel(dm.owner_) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -54,13 +57,6 @@ bool Foam::NoDispersion::active() const } -template -void Foam::NoDispersion::cacheFields(const bool) -{ -// do nothing -} - - template Foam::vector Foam::NoDispersion::update ( diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.H index e63abbda21..be1f6d05a1 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.H @@ -57,11 +57,19 @@ public: // Constructors //- Construct from components - NoDispersion - ( - const dictionary& dict, - CloudType& owner - ); + NoDispersion(const dictionary& dict, CloudType& owner); + + //- Construct copy + NoDispersion(NoDispersion& dm); + + //- Construct and return a clone + virtual autoPtr > clone() + { + return autoPtr > + ( + new NoDispersion(*this) + ); + } //- Destructor @@ -73,9 +81,6 @@ public: //- Flag to indicate whether model activates injection model virtual bool active() const; - //- Cache carrier fields - virtual void cacheFields(const bool store); - //- Update (disperse particles) virtual vector update ( diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C index a43b00c10f..e5cb1624f1 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C @@ -38,6 +38,16 @@ Foam::StochasticDispersionRAS::StochasticDispersionRAS {} +template +Foam::StochasticDispersionRAS::StochasticDispersionRAS +( + StochasticDispersionRAS& dm +) +: + DispersionRASModel(dm) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -47,13 +57,6 @@ Foam::StochasticDispersionRAS::~StochasticDispersionRAS() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -template -bool Foam::StochasticDispersionRAS::active() const -{ - return true; -} - - template Foam::vector Foam::StochasticDispersionRAS::update ( @@ -65,6 +68,8 @@ Foam::vector Foam::StochasticDispersionRAS::update scalar& tTurb ) { + cachedRandom& rnd = this->owner().rndGen(); + const scalar cps = 0.16432; const volScalarField& k = *this->kPtr_; @@ -88,7 +93,7 @@ Foam::vector Foam::StochasticDispersionRAS::update tTurb = 0.0; scalar sigma = sqrt(2.0*k[cellI]/3.0); - vector dir = 2.0*this->owner().rndGen().vector01() - vector::one; + vector dir = 2.0*rnd.sample01() - vector::one; dir /= mag(dir) + SMALL; // Numerical Recipes... Ch. 7. Random Numbers... @@ -97,8 +102,8 @@ Foam::vector Foam::StochasticDispersionRAS::update scalar rsq = 10.0; while ((rsq > 1.0) || (rsq == 0.0)) { - x1 = 2.0*this->owner().rndGen().scalar01() - 1.0; - x2 = 2.0*this->owner().rndGen().scalar01() - 1.0; + x1 = 2.0*rnd.sample01() - 1.0; + x2 = 2.0*rnd.sample01() - 1.0; rsq = x1*x1 + x2*x2; } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H index dae1658c91..7754716b53 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H @@ -59,11 +59,19 @@ public: // Constructors //- Construct from components - StochasticDispersionRAS - ( - const dictionary& dict, - CloudType& owner - ); + StochasticDispersionRAS(const dictionary& dict, CloudType& owner); + + //- Construct copy + StochasticDispersionRAS(StochasticDispersionRAS& dm); + + //- Construct and return a clone + virtual autoPtr > clone() + { + return autoPtr > + ( + new StochasticDispersionRAS(*this) + ); + } //- Destructor @@ -72,9 +80,6 @@ public: // Member Functions - //- Flag to indicate whether model activates injection model - virtual bool active() const; - //- Update (disperse particles) virtual vector update ( diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C index 7bfc75ea28..b27f06bbeb 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C @@ -30,9 +30,7 @@ License template Foam::DragModel::DragModel(CloudType& owner) : - dict_(dictionary::null), - coeffDict_(dictionary::null), - owner_(owner) + SubModelBase(owner) {} @@ -44,9 +42,14 @@ Foam::DragModel::DragModel const word& type ) : - dict_(dict), - coeffDict_(dict.subDict(type + "Coeffs")), - owner_(owner) + SubModelBase(owner, dict, type) +{} + + +template +Foam::DragModel::DragModel(const DragModel& dm) +: + SubModelBase(dm) {} @@ -60,23 +63,13 @@ Foam::DragModel::~DragModel() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template -const CloudType& Foam::DragModel::owner() const +Foam::scalar Foam::DragModel::Cd(const scalar) const { - return owner_; -} - - -template -const Foam::dictionary& Foam::DragModel::dict() const -{ - return dict_; -} - - -template -const Foam::dictionary& Foam::DragModel::coeffDict() const -{ - return coeffDict_; + notImplemented + ( + "Foam::scalar Foam::DragModel::Cd(const scalar) const" + ); + return 0.0; } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H index e4fa349f8d..bdb5c5e506 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H @@ -51,19 +51,9 @@ namespace Foam template class DragModel +: + public SubModelBase { - // Private data - - //- The cloud dictionary - const dictionary& dict_; - - //- The model coefficients dictionary - const dictionary& coeffDict_; - - //- Reference to the owner cloud class - CloudType& owner_; - - public: //- Runtime type information @@ -96,6 +86,18 @@ public: const word& type ); + //- Construct copy + DragModel(const DragModel& dm); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new DragModel(*this) + ); + } + //- Destructor virtual ~DragModel(); @@ -109,25 +111,10 @@ public: ); - // Access - - //- Return the owner cloud object - const CloudType& owner() const; - - //- Return the dictionary - const dictionary& dict() const; - - //- Return the coefficients dictionary - const dictionary& coeffDict() const; - - // Member Functions - //- Flag to indicate whether model activates drag model - virtual bool active() const = 0; - //- Return drag coefficient - virtual scalar Cd(const scalar Re) const = 0; + virtual scalar Cd(const scalar Re) const; //- Return momentum transfer coefficient // Drag force per unit particle surface area = utc(U - Up) diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.C b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.C index 584abfbac2..cccb062b7f 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.C @@ -34,6 +34,13 @@ Foam::NoDrag::NoDrag(const dictionary& dict, CloudType& owner) {} +template +Foam::NoDrag::NoDrag(const NoDrag& dm) +: + DragModel(dm.owner_) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.H b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.H index 6e354c236e..ef03f59905 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.H @@ -56,11 +56,19 @@ public: // Constructors //- Construct from dictionary - NoDrag - ( - const dictionary&, - CloudType& - ); + NoDrag(const dictionary&, CloudType&); + + //- Construct copy + NoDrag(const NoDrag& dm); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new NoDrag(*this) + ); + } //- Destructor diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.C b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.C index a106e307a3..72d2c9a220 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.C @@ -58,6 +58,21 @@ Foam::NonSphereDrag::NonSphereDrag } +template +Foam::NonSphereDrag::NonSphereDrag +( + const NonSphereDrag& dm +) +: + DragModel(dm), + phi_(dm.phi_), + a_(dm.a_), + b_(dm.b_), + c_(dm.c_), + d_(dm.d_) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -67,13 +82,6 @@ Foam::NonSphereDrag::~NonSphereDrag() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -template -bool Foam::NonSphereDrag::active() const -{ - return true; -} - - template Foam::scalar Foam::NonSphereDrag::Cd(const scalar Re) const { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.H b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.H index 095805d5e5..041bded98a 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.H @@ -110,6 +110,18 @@ public: //- Construct from dictionary NonSphereDrag(const dictionary& dict, CloudType& owner); + //- Construct copy + NonSphereDrag(const NonSphereDrag& dm); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new NonSphereDrag(*this) + ); + } + //- Destructor virtual ~NonSphereDrag(); @@ -117,9 +129,6 @@ public: // Member Functions - //- Flag to indicate whether model activates drag model - bool active() const; - //- Return drag coefficient scalar Cd(const scalar Re) const; }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.C b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.C index ba4253bfc9..e71312a30f 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.C @@ -38,6 +38,13 @@ Foam::SphereDrag::SphereDrag {} +template +Foam::SphereDrag::SphereDrag(const SphereDrag& dm) +: + DragModel(dm) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -47,13 +54,6 @@ Foam::SphereDrag::~SphereDrag() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -template -bool Foam::SphereDrag::active() const -{ - return true; -} - - template Foam::scalar Foam::SphereDrag::Cd(const scalar Re) const { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.H b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.H index ca56f3782e..5840ea2cb4 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.H @@ -56,11 +56,19 @@ public: // Constructors //- Construct from dictionary - SphereDrag - ( - const dictionary& dict, - CloudType& owner - ); + SphereDrag(const dictionary& dict, CloudType& owner); + + //- Construct copy + SphereDrag(const SphereDrag& dm); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new SphereDrag(*this) + ); + } //- Destructor @@ -69,9 +77,6 @@ public: // Member Functions - //- Flag to indicate whether model activates drag model - bool active() const; - //- Return drag coefficient scalar Cd(const scalar Re) const; }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C index 438b32b225..f460ba1bcc 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C @@ -89,43 +89,14 @@ Foam::ConeInjection::ConeInjection ), flowRateProfile_ ( - DataEntry::New - ( - "flowRateProfile", - this->coeffDict() - ) - ), - Umag_ - ( - DataEntry::New - ( - "Umag", - this->coeffDict() - ) - ), - thetaInner_ - ( - DataEntry::New - ( - "thetaInner", - this->coeffDict() - ) - ), - thetaOuter_ - ( - DataEntry::New - ( - "thetaOuter", - this->coeffDict() - ) + DataEntry::New("flowRateProfile", this->coeffDict()) ), + Umag_(DataEntry::New("Umag", this->coeffDict())), + thetaInner_(DataEntry::New("thetaInner", this->coeffDict())), + thetaOuter_(DataEntry::New("thetaOuter", this->coeffDict())), parcelPDF_ ( - pdfs::pdf::New - ( - this->coeffDict().subDict("parcelPDF"), - owner.rndGen() - ) + pdfs::pdf::New(this->coeffDict().subDict("parcelPDF"), owner.rndGen()) ), tanVec1_(vector::zero), tanVec2_(vector::zero) @@ -137,9 +108,10 @@ Foam::ConeInjection::ConeInjection vector tangent = vector::zero; scalar magTangent = 0.0; + cachedRandom& rnd = this->owner().rndGen(); while (magTangent < SMALL) { - vector v = this->owner().rndGen().vector01(); + vector v = rnd.sample01(); tangent = v - (v & direction_)*direction_; magTangent = mag(tangent); @@ -162,6 +134,30 @@ Foam::ConeInjection::ConeInjection } +template +Foam::ConeInjection::ConeInjection +( + const ConeInjection& im +) +: + InjectionModel(im), + duration_(im.duration_), + position_(im.position_), + injectorCell_(im.injectorCell_), + injectorTetFace_(im.injectorTetFace_), + injectorTetPt_(im.injectorTetPt_), + direction_(im.direction_), + parcelsPerSecond_(im.parcelsPerSecond_), + flowRateProfile_(im.flowRateProfile_().clone().ptr()), + Umag_(im.Umag_().clone().ptr()), + thetaInner_(im.thetaInner_().clone().ptr()), + thetaOuter_(im.thetaOuter_().clone().ptr()), + parcelPDF_(im.parcelPDF_().clone().ptr()), + tanVec1_(im.tanVec1_), + tanVec2_(im.tanVec2_) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -171,13 +167,6 @@ Foam::ConeInjection::~ConeInjection() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -template -bool Foam::ConeInjection::active() const -{ - return true; -} - - template Foam::scalar Foam::ConeInjection::timeEnd() const { @@ -207,24 +196,26 @@ void Foam::ConeInjection::setPositionAndCell template void Foam::ConeInjection::setProperties ( - const label parcelI, + const label, const label, const scalar time, typename CloudType::parcelType& parcel ) { + cachedRandom& rnd = this->owner().rndGen(); + // set particle velocity const scalar deg2Rad = pi/180.0; scalar t = time - this->SOI_; scalar ti = thetaInner_().value(t); scalar to = thetaOuter_().value(t); - scalar coneAngle = this->owner().rndGen().scalar01()*(to - ti) + ti; + scalar coneAngle = deg2Rad*rnd.position(ti, to); coneAngle *= deg2Rad; scalar alpha = sin(coneAngle); scalar dcorr = cos(coneAngle); - scalar beta = twoPi*this->owner().rndGen().scalar01(); + scalar beta = twoPi*rnd.sample01(); vector normal = alpha*(tanVec1_*cos(beta) + tanVec2_*sin(beta)); vector dirVec = dcorr*direction_; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H index a9c289d6d4..19d2731bd9 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H @@ -119,18 +119,10 @@ protected: // Protected Member Functions //- Number of parcels to introduce over the time step relative to SOI - label parcelsToInject - ( - const scalar time0, - const scalar time1 - ); + virtual label parcelsToInject(const scalar time0, const scalar time1); //- Number of parcels to introduce over the time step relative to SOI - scalar volumeToInject - ( - const scalar time0, - const scalar time1 - ); + virtual scalar volumeToInject(const scalar time0, const scalar time1); public: @@ -142,11 +134,19 @@ public: // Constructors //- Construct from dictionary - ConeInjection - ( - const dictionary& dict, - CloudType& owner - ); + ConeInjection(const dictionary& dict, CloudType& owner); + + //- Construct copy + ConeInjection(const ConeInjection& im); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new ConeInjection(*this) + ); + } //- Destructor @@ -155,9 +155,6 @@ public: // Member Functions - //- Flag to indicate whether model activates injection model - bool active() const; - //- Return the end-of-injection time scalar timeEnd() const; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C index 6639c43587..fef5926908 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C @@ -120,43 +120,14 @@ Foam::ConeInjectionMP::ConeInjectionMP ), flowRateProfile_ ( - DataEntry::New - ( - "flowRateProfile", - this->coeffDict() - ) - ), - Umag_ - ( - DataEntry::New - ( - "Umag", - this->coeffDict() - ) - ), - thetaInner_ - ( - DataEntry::New - ( - "thetaInner", - this->coeffDict() - ) - ), - thetaOuter_ - ( - DataEntry::New - ( - "thetaOuter", - this->coeffDict() - ) + DataEntry::New("flowRateProfile", this->coeffDict()) ), + Umag_(DataEntry::New("Umag", this->coeffDict())), + thetaInner_(DataEntry::New("thetaInner", this->coeffDict())), + thetaOuter_(DataEntry::New("thetaOuter", this->coeffDict())), parcelPDF_ ( - pdfs::pdf::New - ( - this->coeffDict().subDict("parcelPDF"), - owner.rndGen() - ) + pdfs::pdf::New(this->coeffDict().subDict("parcelPDF"), owner.rndGen()) ), nInjected_(this->parcelsAddedTotal()), tanVec1_(positions_.size()), @@ -171,9 +142,10 @@ Foam::ConeInjectionMP::ConeInjectionMP vector tangent = vector::zero; scalar magTangent = 0.0; + cachedRandom& rnd = this->owner().rndGen(); while (magTangent < SMALL) { - vector v = this->owner().rndGen().vector01(); + vector v = rnd.sample01(); tangent = v - (v & axes_[i])*axes_[i]; magTangent = mag(tangent); @@ -200,6 +172,33 @@ Foam::ConeInjectionMP::ConeInjectionMP } +template +Foam::ConeInjectionMP::ConeInjectionMP +( + const ConeInjectionMP& im +) +: + InjectionModel(im), + positionsFile_(im.positionsFile_), + positions_(im.positions_), + injectorCells_(im.injectorCells_), + injectorTetFaces_(im.injectorTetFaces_), + injectorTetPts_(im.injectorTetPts_), + axesFile_(im.axesFile_), + axes_(im.axes_), + duration_(im.duration_), + parcelsPerInjector_(im.parcelsPerInjector_), + flowRateProfile_(im.flowRateProfile_().clone().ptr()), + Umag_(im.Umag_().clone().ptr()), + thetaInner_(im.thetaInner_().clone().ptr()), + thetaOuter_(im.thetaOuter_().clone().ptr()), + parcelPDF_(im.parcelPDF_().clone().ptr()), + nInjected_(im.nInjected_), + tanVec1_(im.tanVec1_), + tanVec2_(im.tanVec2_) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -209,13 +208,6 @@ Foam::ConeInjectionMP::~ConeInjectionMP() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -template -bool Foam::ConeInjectionMP::active() const -{ - return true; -} - - template Foam::scalar Foam::ConeInjectionMP::timeEnd() const { @@ -253,6 +245,8 @@ void Foam::ConeInjectionMP::setProperties typename CloudType::parcelType& parcel ) { + cachedRandom& rnd = this->owner().rndGen(); + // set particle velocity const label i = parcelI%positions_.size(); @@ -261,17 +255,16 @@ void Foam::ConeInjectionMP::setProperties scalar t = time - this->SOI_; scalar ti = thetaInner_().value(t); scalar to = thetaOuter_().value(t); - scalar coneAngle = this->owner().rndGen().scalar01()*(to - ti) + ti; + scalar coneAngle = deg2Rad*rnd.position(ti, to); coneAngle *= deg2Rad; scalar alpha = sin(coneAngle); scalar dcorr = cos(coneAngle); - scalar beta = twoPi*this->owner().rndGen().scalar01(); + scalar beta = twoPi*rnd.sample01(); vector normal = alpha*(tanVec1_[i]*cos(beta) + tanVec2_[i]*sin(beta)); vector dirVec = dcorr*axes_[i]; dirVec += normal; - dirVec /= mag(dirVec); parcel.U() = Umag_().value(t)*dirVec; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H index 2b0d4e8c31..bfbbd70152 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H @@ -129,18 +129,10 @@ protected: // Protected Member Functions //- Number of parcels to introduce over the time step - label parcelsToInject - ( - const scalar time0, - const scalar time1 - ); + virtual label parcelsToInject(const scalar time0, const scalar time1); //- Number of parcels to introduce over the time step - scalar volumeToInject - ( - const scalar time0, - const scalar time1 - ); + virtual scalar volumeToInject(const scalar time0, const scalar time1); public: @@ -152,11 +144,19 @@ public: // Constructors //- Construct from dictionary - ConeInjectionMP - ( - const dictionary& dict, - CloudType& owner - ); + ConeInjectionMP(const dictionary& dict, CloudType& owner); + + //- Construct copy + ConeInjectionMP(const ConeInjectionMP& im); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new ConeInjectionMP(*this) + ); + } //- Destructor @@ -165,9 +165,6 @@ public: // Member Functions - //- Flag to indicate whether model activates injection model - bool active() const; - //- Return the end-of-injection time scalar timeEnd() const; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C index 44cebec903..40f7b61be5 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C @@ -147,6 +147,29 @@ Foam::FieldActivatedInjection::FieldActivatedInjection } +template +Foam::FieldActivatedInjection::FieldActivatedInjection +( + const FieldActivatedInjection& im +) +: + InjectionModel(im), + factor_(im.factor_), + referenceField_(im.referenceField_), + thresholdField_(im.thresholdField_), + positionsFile_(im.positionsFile_), + positions_(im.positions_), + injectorCells_(im.injectorCells_), + injectorTetFaces_(im.injectorTetFaces_), + injectorTetPts_(im.injectorTetPts_), + nParcelsPerInjector_(im.nParcelsPerInjector_), + nParcelsInjected_(im.nParcelsInjected_), + U0_(im.U0_), + diameters_(im.diameters_), + parcelPDF_(im.parcelPDF_().clone().ptr()) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H index 9acf379154..b7d76873e0 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H @@ -119,18 +119,10 @@ protected: // Protected Member Functions //- Number of parcels to introduce over the time step relative to SOI - label parcelsToInject - ( - const scalar time0, - const scalar time1 - ); + virtual label parcelsToInject(const scalar time0, const scalar time1); //- Volume of parcels to introduce over the time step relative to SOI - scalar volumeToInject - ( - const scalar time0, - const scalar time1 - ); + virtual scalar volumeToInject(const scalar time0, const scalar time1); public: @@ -142,11 +134,19 @@ public: // Constructors //- Construct from dictionary - FieldActivatedInjection - ( - const dictionary& dict, - CloudType& owner - ); + FieldActivatedInjection(const dictionary& dict, CloudType& owner); + + //- Construct copy + FieldActivatedInjection(const FieldActivatedInjection& im); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new FieldActivatedInjection(*this) + ); + } //- Destructor diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C index c46d5efc77..3cf8114164 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C @@ -71,7 +71,7 @@ Foam::label Foam::InflationInjection::parcelsToInject newParticles_.clear(); - Random& rnd = this->owner().rndGen(); + cachedRandom& rnd = this->owner().rndGen(); // Diameter factor, when splitting particles into 4, this is the // factor that modifies the diameter. @@ -118,7 +118,7 @@ Foam::label Foam::InflationInjection::parcelsToInject } label cI = - generationCells_[rnd.integer(0, generationCells_.size() - 1)]; + generationCells_[rnd.position(0, generationCells_.size() - 1)]; // Pick a particle at random from the cell - if there are // none, insert one at the cell centre. Otherwise, split an @@ -146,7 +146,7 @@ Foam::label Foam::InflationInjection::parcelsToInject } else { - label cPI = rnd.integer(0, cellOccupancy[cI].size() - 1); + label cPI = rnd.position(0, cellOccupancy[cI].size() - 1); // This has to be a reference to the pointer so that it // can be set to NULL when the particle is deleted. @@ -157,7 +157,7 @@ Foam::label Foam::InflationInjection::parcelsToInject scalar pD = pPtr->d(); // Select bigger particles by preference - if ((pD/pPtr->dTarget()) < rnd.scalar01()) + if ((pD/pPtr->dTarget()) < rnd.sample01()) { continue; } @@ -390,6 +390,29 @@ Foam::InflationInjection::InflationInjection } +template +Foam::InflationInjection::InflationInjection +( + const Foam::InflationInjection& im +) +: + InjectionModel(im), + generationSetName_(im.generationSetName_), + inflationSetName_(im.inflationSetName_), + generationCells_(im.generationCells_), + inflationCells_(im.inflationCells_), + duration_(im.duration_), + flowRateProfile_(im.flowRateProfile_().clone().ptr()), + growthRate_(im.growthRate_().clone().ptr()), + newParticles_(im.newParticles_), + volumeAccumulator_(im.volumeAccumulator_), + fraction_(im.fraction_), + selfSeed_(im.selfSeed_), + dSeed_(im.dSeed_), + parcelPDF_(im.parcelPDF_().clone().ptr()) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -399,13 +422,6 @@ Foam::InflationInjection::~InflationInjection() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -template -bool Foam::InflationInjection::active() const -{ - return true; -} - - template Foam::scalar Foam::InflationInjection::timeEnd() const { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H index 45a54774d3..b10c8e17d9 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H @@ -116,18 +116,10 @@ protected: // Protected Member Functions //- Number of parcels to introduce over the time step relative to SOI - label parcelsToInject - ( - const scalar time0, - const scalar time1 - ); + virtual label parcelsToInject(const scalar time0, const scalar time1); //- Volume of parcels to introduce over the time step relative to SOI - scalar volumeToInject - ( - const scalar time0, - const scalar time1 - ); + virtual scalar volumeToInject(const scalar time0, const scalar time1); public: @@ -139,11 +131,19 @@ public: // Constructors //- Construct from dictionary - InflationInjection - ( - const dictionary& dict, - CloudType& owner - ); + InflationInjection(const dictionary& dict, CloudType& owner); + + //- Construct copy + InflationInjection(const InflationInjection& im); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new InflationInjection(*this) + ); + } //- Destructor @@ -152,9 +152,6 @@ public: // Member Functions - //- Flag to indicate whether model activates injection model - bool active() const; - //- Return the end-of-injection time scalar timeEnd() const; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C index 5a386e4397..72b891079a 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C @@ -37,9 +37,9 @@ void Foam::InjectionModel::readProps() IOobject propsDictHeader ( "injectionProperties", - owner_.db().time().timeName(), - "uniform"/cloud::prefix/owner_.name(), - owner_.db(), + this->owner().db().time().timeName(), + "uniform"/cloud::prefix/this->owner().name(), + this->owner().db(), IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE, false @@ -60,16 +60,16 @@ void Foam::InjectionModel::readProps() template void Foam::InjectionModel::writeProps() { - if (owner_.db().time().outputTime()) + if (this->owner().db().time().outputTime()) { IOdictionary propsDict ( IOobject ( "injectionProperties", - owner_.db().time().timeName(), - "uniform"/cloud::prefix/owner_.name(), - owner_.db(), + this->owner().db().time().timeName(), + "uniform"/cloud::prefix/this->owner().name(), + this->owner().db(), IOobject::NO_READ, IOobject::NO_WRITE, false @@ -86,6 +86,58 @@ void Foam::InjectionModel::writeProps() } +template +Foam::label Foam::InjectionModel::parcelsToInject +( + const scalar time0, + const scalar time1 +) const +{ + notImplemented + ( + "Foam::label Foam::InjectionModel::parcelsToInject" + "(" + "const scalar, " + "const scalar" + ") const" + ); + + return 0; +} + + +template +Foam::scalar Foam::InjectionModel::volumeToInject +( + const scalar time0, + const scalar time1 +) const +{ + notImplemented + ( + "Foam::scalar Foam::InjectionModel::volumeToInject" + "(" + "const scalar, " + "const scalar" + ") const" + ); + + return 0.0; +} + + +template +bool Foam::InjectionModel::validInjection(const label parcelI) +{ + notImplemented + ( + "bool Foam::InjectionModel::validInjection(const label)" + ); + + return false; +} + + template void Foam::InjectionModel::prepareForNextTimeStep ( @@ -138,11 +190,11 @@ bool Foam::InjectionModel::findCellAtPosition bool errorOnNotFound ) { - const volVectorField& cellCentres = owner_.mesh().C(); + const volVectorField& cellCentres = this->owner().mesh().C(); const vector p0 = position; - owner_.findCellFacePt + this->owner().findCellFacePt ( position, cellI, @@ -172,13 +224,13 @@ bool Foam::InjectionModel::findCellAtPosition // probably on an edge if (procI == -1) { - cellI = owner_.mesh().findNearestCell(position); + cellI = this->owner().mesh().findNearestCell(position); if (cellI >= 0) { position += SMALL*(cellCentres[cellI] - position); - if (owner_.mesh().pointInCell(position, cellI)) + if (this->owner().mesh().pointInCell(position, cellI)) { procI = Pstream::myProcNo(); } @@ -283,7 +335,7 @@ void Foam::InjectionModel::postInjectCheck if (allParcelsAdded > 0) { Info<< nl - << "--> Cloud: " << owner_.name() << nl + << "--> Cloud: " << this->owner().name() << nl << " Added " << allParcelsAdded << " new parcels" << nl << endl; } @@ -294,7 +346,7 @@ void Foam::InjectionModel::postInjectCheck massInjected_ += returnReduce(massAdded, sumOp()); // Update time for start of next injection - time0_ = owner_.db().time().value(); + time0_ = this->owner().db().time().value(); // Increment number of injections nInjections_++; @@ -309,9 +361,7 @@ void Foam::InjectionModel::postInjectCheck template Foam::InjectionModel::InjectionModel(CloudType& owner) : - dict_(dictionary::null), - owner_(owner), - coeffDict_(dictionary::null), + SubModelBase(owner), SOI_(0.0), volumeTotal_(0.0), massTotal_(0.0), @@ -335,12 +385,10 @@ Foam::InjectionModel::InjectionModel const word& type ) : - dict_(dict), - owner_(owner), - coeffDict_(dict.subDict(type + "Coeffs")), - SOI_(readScalar(coeffDict_.lookup("SOI"))), + SubModelBase(owner, dict, type), + SOI_(readScalar(this->coeffDict().lookup("SOI"))), volumeTotal_(0.0), - massTotal_(dimensionedScalar(coeffDict_.lookup("massTotal")).value()), + massTotal_(readScalar(this->coeffDict().lookup("massTotal"))), massInjected_(0.0), nInjections_(0), parcelsAddedTotal_(0), @@ -355,7 +403,7 @@ Foam::InjectionModel::InjectionModel Info<< " Constructing " << owner.mesh().nGeometricD() << "-D injection" << endl; - const word parcelBasisType = coeffDict_.lookup("parcelBasisType"); + const word parcelBasisType = this->coeffDict().lookup("parcelBasisType"); if (parcelBasisType == "mass") { @@ -373,7 +421,7 @@ Foam::InjectionModel::InjectionModel << "variable now does not determine anything." << endl; - nParticleFixed_ = readScalar(coeffDict_.lookup("nParticle")); + nParticleFixed_ = readScalar(this->coeffDict().lookup("nParticle")); } else { @@ -393,6 +441,26 @@ Foam::InjectionModel::InjectionModel } +template +Foam::InjectionModel::InjectionModel +( + const InjectionModel& im +) +: + SubModelBase(im), + SOI_(im.SOI_), + volumeTotal_(im.volumeTotal_), + massTotal_(im.massTotal_), + massInjected_(im.massInjected_), + nInjections_(im.nInjections_), + parcelsAddedTotal_(im.parcelsAddedTotal_), + parcelBasis_(im.parcelBasis_), + nParticleFixed_(im.nParticleFixed_), + time0_(im.time0_), + timeStep0_(im.timeStep0_) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -402,18 +470,30 @@ Foam::InjectionModel::~InjectionModel() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +template +Foam::scalar Foam::InjectionModel::timeEnd() const +{ + notImplemented + ( + "Foam::scalar Foam::InjectionModel::timeEnd() const" + ); + + return 0.0; +} + + template template void Foam::InjectionModel::inject(TrackData& td) { - if (!active()) + if (this->active()) { return; } - const scalar time = owner_.db().time().value(); - const scalar carrierDt = owner_.db().time().deltaTValue(); - const polyMesh& mesh = owner_.mesh(); + const scalar time = this->owner().db().time().value(); + const scalar carrierDt = this->owner().db().time().deltaTValue(); + const polyMesh& mesh = this->owner().mesh(); // Prepare for next time step label parcelsAdded = 0; @@ -512,6 +592,68 @@ void Foam::InjectionModel::inject(TrackData& td) } +template +void Foam::InjectionModel::setPositionAndCell +( + const label parcelI, + const label nParcels, + const scalar time, + vector& position, + label& cellOwner, + label& tetFaceI, + label& tetPtI +) +{ + notImplemented + ( + "void Foam::InjectionModel::setPositionAndCell" + "(" + "const label, " + "const label, " + "const scalar, " + "vector&, " + "label&, " + "label&, " + "label&" + ")" + ); +} + + +template +void Foam::InjectionModel::setProperties +( + const label parcelI, + const label nParcels, + const scalar time, + typename CloudType::parcelType& parcel +) +{ + notImplemented + ( + "void Foam::InjectionModel::setProperties" + "(" + "const label, " + "const label, " + "const scalar, " + "typename CloudType::parcelType&" + ")" + ); +} + + +template +bool Foam::InjectionModel::fullyDescribed() const +{ + notImplemented + ( + "bool Foam::InjectionModel::fullyDescribed() const" + ); + + return false; +} + + template void Foam::InjectionModel::info(Ostream& os) const { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H index 5b225c0781..86fffe68de 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H @@ -51,6 +51,7 @@ SourceFiles #include "IOdictionary.H" #include "autoPtr.H" #include "runTimeSelectionTables.H" +#include "SubModelBase.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -63,6 +64,8 @@ namespace Foam template class InjectionModel +: + public SubModelBase { public: @@ -80,18 +83,6 @@ public: private: - // Private data - - //- The cloud dictionary - const dictionary& dict_; - - //- Reference to the owner cloud class - CloudType& owner_; - - //- The coefficients dictionary - const dictionary coeffDict_; - - // Private Member Functions //- Read injector properties from previous run (if applicable) @@ -156,18 +147,18 @@ protected: ( const scalar time0, const scalar time1 - ) = 0; + ) const; //- Volume of parcels to introduce over the time step relative to SOI virtual scalar volumeToInject ( const scalar time0, const scalar time1 - ) = 0; + ) const; //- Additional flag to identify whether or not injection of parcelI is // permitted - virtual bool validInjection(const label parcelI) = 0; + virtual bool validInjection(const label parcelI); //- Determine properties for next time step/injection interval virtual void prepareForNextTimeStep @@ -238,6 +229,18 @@ public: const word& type ); + //- Construct copy + InjectionModel(const InjectionModel& im); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new InjectionModel(*this) + ); + } + //- Destructor virtual ~InjectionModel(); @@ -251,27 +254,8 @@ public: ); - // Access - - //- Return the owner cloud dictionary - inline const dictionary& dict() const; - - //- Return const access the owner cloud object - inline const CloudType& owner() const; - - //- Return non-const access the owner cloud object for manipulation - inline CloudType& owner(); - - //- Return the coefficients dictionary - inline const dictionary& coeffDict() const; - - // Member Functions - //- Flag to indicate whether model activates injection model - virtual bool active() const = 0; - - // Global information //- Return the start-of-injection time @@ -287,7 +271,7 @@ public: inline scalar massInjected() const; //- Return the end-of-injection time - virtual scalar timeEnd() const = 0; + virtual scalar timeEnd() const; // Counters @@ -317,7 +301,7 @@ public: label& cellOwner, label& tetFaceI, label& tetPtI - ) = 0; + ); //- Set the parcel properties virtual void setProperties @@ -326,15 +310,15 @@ public: const label nParcels, const scalar time, typename CloudType::parcelType& parcel - ) = 0; + ); //- Flag to identify whether model fully describes the parcel - virtual bool fullyDescribed() const = 0; + virtual bool fullyDescribed() const; // I-O - //- Write surface film info to stream + //- Write injection info to stream virtual void info(Ostream& os) const; }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H index 65f9b3cac0..fb432c0be6 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H @@ -25,33 +25,7 @@ License #include "InjectionModel.H" -template -const Foam::dictionary& Foam::InjectionModel::dict() const -{ - return dict_; -} - - -template -const CloudType& Foam::InjectionModel::owner() const -{ - return owner_; -} - - -template -CloudType& Foam::InjectionModel::owner() -{ - return owner_; -} - - -template -const Foam::dictionary& Foam::InjectionModel::coeffDict() const -{ - return coeffDict_; -} - +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // template Foam::scalar Foam::InjectionModel::timeStart() const diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C index b87449f225..7808407cab 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C @@ -123,6 +123,23 @@ Foam::KinematicLookupTableInjection::KinematicLookupTableInjection } +template +Foam::KinematicLookupTableInjection::KinematicLookupTableInjection +( + const KinematicLookupTableInjection& im +) +: + InjectionModel(im), + inputFileName_(im.inputFileName_), + duration_(im.duration_), + nParcelsPerSecond_(im.nParcelsPerSecond_), + injectors_(im.injectors_), + injectorCells_(im.injectorCells_), + injectorTetFaces_(im.injectorTetFaces_), + injectorTetPts_(im.injectorTetPts_) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -132,13 +149,6 @@ Foam::KinematicLookupTableInjection::~KinematicLookupTableInjection() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -template -bool Foam::KinematicLookupTableInjection::active() const -{ - return true; -} - - template Foam::scalar Foam::KinematicLookupTableInjection::timeEnd() const { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H index ff840187f2..0c84e17ffb 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H @@ -96,18 +96,10 @@ protected: // Protected Member Functions //- Number of parcels to introduce over the time step relative to SOI - label parcelsToInject - ( - const scalar time0, - const scalar time1 - ); + virtual label parcelsToInject(const scalar time0, const scalar time1); //- Volume of parcels to introduce over the time step relative to SOI - scalar volumeToInject - ( - const scalar time0, - const scalar time1 - ); + virtual scalar volumeToInject(const scalar time0, const scalar time1); public: @@ -119,12 +111,23 @@ public: // Constructors //- Construct from dictionary + KinematicLookupTableInjection(const dictionary& dict, CloudType& owner); + + //- Construct copy KinematicLookupTableInjection ( - const dictionary& dict, - CloudType& owner + const KinematicLookupTableInjection& im ); + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new KinematicLookupTableInjection(*this) + ); + } + //- Destructor virtual ~KinematicLookupTableInjection(); @@ -132,9 +135,6 @@ public: // Member Functions - //- Flag to indicate whether model activates injection model - bool active() const; - //- Return the end-of-injection time scalar timeEnd() const; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C index 48b156d1e2..88d5c83444 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C @@ -157,6 +157,24 @@ Foam::ManualInjection::ManualInjection } +template +Foam::ManualInjection::ManualInjection +( + const ManualInjection& im +) +: + InjectionModel(im), + positionsFile_(im.positionsFile_), + positions_(im.positions_), + diameters_(im.diameters_), + injectorCells_(im.injectorCells_), + injectorTetFaces_(im.injectorTetFaces_), + injectorTetPts_(im.injectorTetPts_), + U0_(im.U0_), + parcelPDF_(im.parcelPDF_().clone().ptr()) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template @@ -166,13 +184,6 @@ Foam::ManualInjection::~ManualInjection() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -template -bool Foam::ManualInjection::active() const -{ - return true; -} - - template Foam::scalar Foam::ManualInjection::timeEnd() const { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H index b4feea9744..4825418786 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H @@ -79,7 +79,7 @@ class ManualInjection //- List of tetPt labels corresponding to injector positions labelList injectorTetPts_; - //- Initial parcel velocity + //- Initial parcel velocity const vector U0_; //- Parcel size PDF model @@ -91,18 +91,10 @@ protected: // Protected Member Functions //- Number of parcels to introduce over the time step relative to SOI - label parcelsToInject - ( - const scalar time0, - const scalar time1 - ); + virtual label parcelsToInject(const scalar time0, const scalar time1); //- Volume of parcels to introduce over the time step relative to SOI - scalar volumeToInject - ( - const scalar time0, - const scalar time1 - ); + virtual scalar volumeToInject(const scalar time0, const scalar time1); public: @@ -114,11 +106,19 @@ public: // Constructors //- Construct from dictionary - ManualInjection - ( - const dictionary& dict, - CloudType& owner - ); + ManualInjection(const dictionary& dict, CloudType& owner); + + //- Construct copy + ManualInjection(const ManualInjection& im); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new ManualInjection(*this) + ); + } //- Destructor @@ -127,9 +127,6 @@ public: // Member Functions - //- Flag to indicate whether model activates injection model - bool active() const; - //- Return the end-of-injection time scalar timeEnd() const; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C index 8391c3654b..ffc26963dd 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C @@ -63,6 +63,13 @@ Foam::NoInjection::NoInjection {} +template +Foam::NoInjection::NoInjection(const NoInjection& im) +: + InjectionModel(im.owner_) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H index c16a936778..4a33d23054 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H @@ -56,18 +56,10 @@ protected: // Protected Member Functions //- Number of parcels to introduce over the time step relative to SOI - label parcelsToInject - ( - const scalar, - const scalar - ); + virtual label parcelsToInject(const scalar, const scalar); //- Volume of parcels to introduce over the time step relative to SOI - scalar volumeToInject - ( - const scalar, - const scalar - ); + virtual scalar volumeToInject(const scalar, const scalar); public: @@ -79,11 +71,19 @@ public: // Constructors //- Construct from components - NoInjection - ( - const dictionary&, - CloudType& - ); + NoInjection(const dictionary&, CloudType&); + + //- Construct copy + NoInjection(const NoInjection& im); + + //- Construct and return a clone + virtual autoPtr > clone() const + { + return autoPtr > + ( + new NoInjection(*this) + ); + } //- Destructor diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C index 0885469307..73de293b43 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C @@ -76,6 +76,7 @@ Foam::PatchInjection::PatchInjection : InjectionModel(dict, owner, typeName), patchName_(this->coeffDict().lookup("patchName")), + patchId_(owner.mesh().boundaryMesh().findPatchID(patchName_)), duration_(readScalar(this->coeffDict().lookup("duration"))), parcelsPerSecond_ ( @@ -84,26 +85,16 @@ Foam::PatchInjection::PatchInjection U0_(this->coeffDict().lookup("U0")), flowRateProfile_ ( - DataEntry::New - ( - "flowRateProfile", - this->coeffDict() - ) + DataEntry::New("flowRateProfile", this->coeffDict()) ), parcelPDF_ ( - pdfs::pdf::New - ( - this->coeffDict().subDict("parcelPDF"), - owner.rndGen() - ) + pdfs::pdf::New(this->coeffDict().subDict("parcelPDF"), owner.rndGen()) ), - injectorCells_(), + cellOwners_(), fraction_(1.0) { - const label patchId = owner.mesh().boundaryMesh().findPatchID(patchName_); - - if (patchId < 0) + if (patchId_ < 0) { FatalErrorIn ( @@ -117,11 +108,11 @@ Foam::PatchInjection::PatchInjection << nl << exit(FatalError); } - const polyPatch& patch = owner.mesh().boundaryMesh()[patchId]; + const polyPatch& patch = owner.mesh().boundaryMesh()[patchId_]; - injectorCells_ = patch.faceCells(); + cellOwners_ = patch.faceCells(); - label patchSize = injectorCells_.size(); + label patchSize = cellOwners_.size(); label totalPatchSize = patchSize; reduce(totalPatchSize, sumOp