diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C index aa0c8cedfe5c8e3e04b0543707940f10a231b474..a7990be458e94b1f816841d1b8bafdd60ea87194 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C @@ -28,10 +28,10 @@ License #include "interpolation.H" #include "subCycleTime.H" +#include "CollisionModel.H" #include "DispersionModel.H" #include "DragModel.H" #include "InjectionModel.H" -#include "CollisionModel.H" #include "PatchInteractionModel.H" #include "PostProcessingModel.H" #include "SurfaceFilmModel.H" @@ -42,6 +42,7 @@ template<class ParcelType> void Foam::KinematicCloud<ParcelType>::cloudSolution::read() { dict_.lookup("coupled") >> coupled_; + dict_.lookup("cellValueSourceCorrection") >> cellValueSourceCorrection_; } @@ -55,7 +56,8 @@ Foam::KinematicCloud<ParcelType>::cloudSolution::cloudSolution mesh_(mesh), dict_(dict), active_(dict.lookup("active")), - coupled_(false) + coupled_(false), + cellValueSourceCorrection_(false) { if (active_) { @@ -73,7 +75,8 @@ Foam::KinematicCloud<ParcelType>::cloudSolution::cloudSolution mesh_(cs.mesh_), dict_(cs.dict_), active_(cs.active_), - coupled_(cs.coupled_) + coupled_(cs.coupled_), + cellValueSourceCorrection_(cs.cellValueSourceCorrection_) {} @@ -86,7 +89,8 @@ Foam::KinematicCloud<ParcelType>::cloudSolution::cloudSolution mesh_(mesh), dict_(dictionary::null), active_(false), - coupled_(false) + coupled_(false), + cellValueSourceCorrection_(false) {} @@ -95,6 +99,29 @@ Foam::KinematicCloud<ParcelType>::cloudSolution::~cloudSolution() {} +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template<class ParcelType> +void Foam::KinematicCloud<ParcelType>::storeState() +{ + cloudCopyPtr_.reset + ( + static_cast<KinematicCloud<ParcelType>*> + ( + clone(this->name() + "Copy").ptr() + ) + ); +} + + +template<class ParcelType> +void Foam::KinematicCloud<ParcelType>::restoreState() +{ + cloudReset(cloudCopyPtr_()); + cloudCopyPtr_.clear(); +} + + // * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * // template<class ParcelType> @@ -259,6 +286,24 @@ void Foam::KinematicCloud<ParcelType>::postEvolve() } +template<class ParcelType> +void Foam::KinematicCloud<ParcelType>::cloudReset(KinematicCloud<ParcelType>& c) +{ + Cloud<ParcelType>::cloudReset(c); + + rndGen_ = c.rndGen_; + + collisionModel_ = c.collisionModel_->clone(); + dispersionModel_= c.dispersionModel_->clone(); + dragModel_ = c.dragModel_->clone(); + injectionModel_ = c.injectionModel_->clone(); + patchInteractionModel_ = c.patchInteractionModel_->clone(); + postProcessingModel_ = c.postProcessingModel_->clone(); + + UIntegrator_ = c.UIntegrator_->clone(); +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template<class ParcelType> @@ -274,6 +319,7 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud : Cloud<ParcelType>(rho.mesh(), cloudName, false), kinematicCloud(), + cloudCopyPtr_(NULL), mesh_(rho.mesh()), particleProperties_ ( @@ -289,10 +335,6 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud solution_(mesh_, particleProperties_.subDict("solution")), constProps_(particleProperties_), subModelProperties_(particleProperties_.subDict("subModels")), - cellValueSourceCorrection_ - ( - particleProperties_.lookup("cellValueSourceCorrection") - ), rndGen_ ( label(0), @@ -304,33 +346,33 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud mu_(mu), g_(g), forces_(mesh_, particleProperties_, g_.value()), - dispersionModel_ + collisionModel_ ( - DispersionModel<KinematicCloud<ParcelType> >::New + CollisionModel<KinematicCloud<ParcelType> >::New ( subModelProperties_, *this ) ), - dragModel_ + dispersionModel_ ( - DragModel<KinematicCloud<ParcelType> >::New + DispersionModel<KinematicCloud<ParcelType> >::New ( subModelProperties_, *this ) ), - injectionModel_ + dragModel_ ( - InjectionModel<KinematicCloud<ParcelType> >::New + DragModel<KinematicCloud<ParcelType> >::New ( subModelProperties_, *this ) ), - collisionModel_ + injectionModel_ ( - CollisionModel<KinematicCloud<ParcelType> >::New + InjectionModel<KinematicCloud<ParcelType> >::New ( subModelProperties_, *this @@ -371,17 +413,20 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud ), UTrans_ ( - IOobject + new DimensionedField<vector, volMesh> ( - this->name() + "UTrans", - this->db().time().timeName(), - this->db(), - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ), - mesh_, - dimensionedVector("zero", dimMass*dimVelocity, vector::zero) + IOobject + ( + this->name() + "UTrans", + this->db().time().timeName(), + this->db(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh_, + dimensionedVector("zero", dimMass*dimVelocity, vector::zero) + ) ) { if (readFields) @@ -391,6 +436,103 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud } +template<class ParcelType> +Foam::KinematicCloud<ParcelType>::KinematicCloud +( + KinematicCloud<ParcelType>& c, + const word& name +) +: + Cloud<ParcelType>(c.mesh(), name, c), + kinematicCloud(), + cloudCopyPtr_(NULL), + mesh_(c.mesh()), + particleProperties_(c.particleProperties_), + solution_(c.solution_), + constProps_(c.constProps_), + subModelProperties_(c.subModelProperties_), + rndGen_(c.rndGen_, true), + cellOccupancyPtr_(c.cellOccupancyPtr_->clone()), + rho_(c.rho_), + U_(c.U_), + mu_(c.mu_), + g_(c.g_), + forces_(c.forces_), + collisionModel_(c.collisionModel_->clone()), + dispersionModel_(c.dispersionModel_->clone()), + dragModel_(c.dragModel_->clone()), + injectionModel_(c.injectionModel_->clone()), + patchInteractionModel_(c.patchInteractionModel_->clone()), + postProcessingModel_(c.postProcessingModel_->clone()), + surfaceFilmModel_(c.surfaceFilmModel_->clone()), + UIntegrator_(c.UIntegrator_->clone()), + UTrans_ + ( + new DimensionedField<vector, volMesh> + ( + IOobject + ( + this->name() + "UTrans", + this->db().time().timeName(), + this->db(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh_, + c.UTrans_().dimensions(), + c.UTrans_().field() + ) + ) +{} + + +template<class ParcelType> +Foam::KinematicCloud<ParcelType>::KinematicCloud +( + const fvMesh& mesh, + const word& name, + const KinematicCloud<ParcelType>& c +) +: + Cloud<ParcelType>(mesh, name, IDLList<ParcelType>()), + kinematicCloud(), + cloudCopyPtr_(NULL), + mesh_(mesh), + particleProperties_ + ( + IOobject + ( + name + "Properties", + mesh.time().constant(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ) + ), + solution_(mesh), + constProps_(dictionary::null), + subModelProperties_(dictionary::null), + rndGen_(0, 0), + cellOccupancyPtr_(NULL), + rho_(c.rho_), + U_(c.U_), + mu_(c.mu_), + g_(c.g_), + forces_(mesh), + collisionModel_(NULL), + dispersionModel_(NULL), + dragModel_(NULL), + injectionModel_(NULL), + patchInteractionModel_(NULL), + postProcessingModel_(NULL), + surfaceFilmModel_(NULL), + UIntegrator_(NULL), + UTrans_(NULL) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template<class ParcelType> @@ -421,7 +563,7 @@ void Foam::KinematicCloud<ParcelType>::checkParcelProperties template<class ParcelType> void Foam::KinematicCloud<ParcelType>::resetSourceTerms() { - UTrans_.field() = vector::zero; + UTrans_->field() = vector::zero; } diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H index 4e95184bece1c8b08576ac00f01a1910badd6f78..b041c4c2dfc453514243ad387260c5d4f835a114 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H @@ -64,6 +64,9 @@ namespace Foam // Forward declaration of classes +template<class CloudType> +class CollisionModel; + template<class CloudType> class DispersionModel; @@ -73,9 +76,6 @@ class DragModel; template<class CloudType> class InjectionModel; -template<class CloudType> -class CollisionModel; - template<class CloudType> class PatchInteractionModel; @@ -96,8 +96,20 @@ class KinematicCloud public Cloud<ParcelType>, public kinematicCloud { + // Private data + + //- Cloud copy pointer + autoPtr<KinematicCloud<ParcelType> > cloudCopyPtr_; + + // Private Member Functions + //- Store the current cloud state + void storeState(); + + //- Reset the current cloud to the previously stored state + void restoreState(); + //- Disallow default bitwise copy construct KinematicCloud(const KinematicCloud&); @@ -201,10 +213,6 @@ protected: //- Sub-models dictionary const dictionary& subModelProperties_; - //- Flag to correct cell values with latest transfer information - // during the lagrangian timestep - const Switch cellValueSourceCorrection_; - //- Random number generator - used by some injection routines cachedRandom rndGen_; @@ -236,6 +244,10 @@ protected: // References to the cloud sub-models + //- Collision model + autoPtr<CollisionModel<KinematicCloud<ParcelType> > > + collisionModel_; + //- Dispersion model autoPtr<DispersionModel<KinematicCloud<ParcelType> > > dispersionModel_; @@ -247,10 +259,6 @@ protected: autoPtr<InjectionModel<KinematicCloud<ParcelType> > > injectionModel_; - //- Collision model - autoPtr<CollisionModel<KinematicCloud<ParcelType> > > - collisionModel_; - //- Patch interaction model autoPtr<PatchInteractionModel<KinematicCloud<ParcelType> > > patchInteractionModel_; @@ -273,7 +281,7 @@ protected: // Sources //- Momentum - DimensionedField<vector, volMesh> UTrans_; + autoPtr<DimensionedField<vector, volMesh> > UTrans_; // Cloud evolution functions @@ -300,6 +308,9 @@ protected: //- Post-evolve void postEvolve(); + //- Reset state of cloud + void cloudReset(KinematicCloud<ParcelType>& c); + public: @@ -316,6 +327,35 @@ public: bool readFields = true ); + //- Copy constructor with new name + KinematicCloud(KinematicCloud<ParcelType>& c, const word& name); + + //- Copy constructor with new name - creates bare cloud + KinematicCloud + ( + const fvMesh& mesh, + const word& name, + const KinematicCloud<ParcelType>& c + ); + + //- Construct and return clone based on (this) with new name + virtual autoPtr<Cloud<ParcelType> > clone(const word& name) + { + return autoPtr<Cloud<ParcelType> > + ( + new KinematicCloud(*this, name) + ); + } + + //- Construct and return bare clone based on (this) with new name + virtual autoPtr<Cloud<ParcelType> > cloneBare(const word& name) const + { + return autoPtr<Cloud<ParcelType> > + ( + new KinematicCloud(this->mesh(), name, *this) + ); + } + //- Destructor virtual ~KinematicCloud(); @@ -391,6 +431,14 @@ public: // Sub-models + //- Return const access to the collision model + inline const CollisionModel<KinematicCloud<ParcelType> >& + collision() const; + + //- Return reference to the collision model + inline CollisionModel<KinematicCloud<ParcelType> >& + collision(); + //- Return const-access to the dispersion model inline const DispersionModel<KinematicCloud<ParcelType> >& dispersion() const; @@ -411,15 +459,6 @@ public: inline InjectionModel<KinematicCloud<ParcelType> >& injection(); - //- Return const access to the collision model - inline - const CollisionModel<KinematicCloud<ParcelType> >& - collision() const; - - //- Return reference to the collision model - inline CollisionModel<KinematicCloud<ParcelType> >& - collision(); - //- Return const-access to the patch interaction model inline const PatchInteractionModel<KinematicCloud<ParcelType> >& patchInteraction() const; @@ -450,6 +489,10 @@ public: //- Return reference to momentum source inline DimensionedField<vector, volMesh>& UTrans(); + //- Return const reference to momentum source + inline const DimensionedField<vector, volMesh>& + UTrans() const; + //- Return tmp momentum source term - fully explicit inline tmp<DimensionedField<vector, volMesh> > SU() const; diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H index 96cd40ef7e0cc1c01e8bb9c73752052a073b42d9..916ad156f156b129c7818bf93ff4b33fd74170df 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H @@ -170,6 +170,22 @@ Foam::KinematicCloud<ParcelType>::forces() const } +template<class ParcelType> +inline const Foam::CollisionModel<Foam::KinematicCloud<ParcelType> >& +Foam::KinematicCloud<ParcelType>::collision() const +{ + return collisionModel_(); +} + + +template<class ParcelType> +inline Foam::CollisionModel<Foam::KinematicCloud<ParcelType> >& +Foam::KinematicCloud<ParcelType>::collision() +{ + return collisionModel_(); +} + + template<class ParcelType> inline const Foam::DispersionModel<Foam::KinematicCloud<ParcelType> >& Foam::KinematicCloud<ParcelType>::dispersion() const @@ -218,22 +234,6 @@ Foam::KinematicCloud<ParcelType>::injection() } -template<class ParcelType> -inline const Foam::CollisionModel<Foam::KinematicCloud<ParcelType> >& -Foam::KinematicCloud<ParcelType>::collision() const -{ - return collisionModel_(); -} - - -template<class ParcelType> -inline Foam::CollisionModel<Foam::KinematicCloud<ParcelType> >& -Foam::KinematicCloud<ParcelType>::collision() -{ - return collisionModel_(); -} - - template<class ParcelType> inline Foam::PostProcessingModel<Foam::KinematicCloud<ParcelType> >& Foam::KinematicCloud<ParcelType>::postProcessing() @@ -357,7 +357,15 @@ template<class ParcelType> inline Foam::DimensionedField<Foam::vector, Foam::volMesh>& Foam::KinematicCloud<ParcelType>::UTrans() { - return UTrans_; + return UTrans_(); +} + + +template<class ParcelType> +inline const Foam::DimensionedField<Foam::vector, Foam::volMesh>& +Foam::KinematicCloud<ParcelType>::UTrans() const +{ + return UTrans_(); } @@ -388,7 +396,7 @@ Foam::KinematicCloud<ParcelType>::SU() const ); vectorField& SU = tSU().field(); - SU = UTrans_/(mesh_.V()*this->db().time().deltaT()); + SU = UTrans()/(mesh_.V()*this->db().time().deltaT()); return tSU; } diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C index dfec32bc4bcb7c8b8378a11a2f5b6a09a912d34f..cf1521e8425331d0ae6485a8532370f3eba187c1 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C @@ -28,6 +28,29 @@ License #include "CompositionModel.H" #include "PhaseChangeModel.H" +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template<class ParcelType> +void Foam::ReactingCloud<ParcelType>::storeState() +{ + cloudCopyPtr_.reset + ( + static_cast<ReactingCloud<ParcelType>*> + ( + clone(this->name() + "Copy").ptr() + ) + ); +} + + +template<class ParcelType> +void Foam::ReactingCloud<ParcelType>::restoreState() +{ + cloudReset(cloudCopyPtr_()); + cloudCopyPtr_.clear(); +} + + // * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * // template<class ParcelType> @@ -112,6 +135,18 @@ void Foam::ReactingCloud<ParcelType>::postEvolve() } +template<class ParcelType> +void Foam::ReactingCloud<ParcelType>::cloudReset(ReactingCloud<ParcelType>& c) +{ + ThermoCloud<ParcelType>::cloudReset(c); + + compositionModel_ = c.compositionModel_->clone(); + phaseChangeModel_ = c.phaseChangeModel_->clone(); + + dMassPhaseChange_ = c.dMassPhaseChange_; +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template<class ParcelType> @@ -127,6 +162,7 @@ Foam::ReactingCloud<ParcelType>::ReactingCloud : ThermoCloud<ParcelType>(cloudName, rho, U, g, thermo, false), reactingCloud(), + cloudCopyPtr_(NULL), constProps_(this->particleProperties()), compositionModel_ ( @@ -178,6 +214,52 @@ Foam::ReactingCloud<ParcelType>::ReactingCloud } +template<class ParcelType> +Foam::ReactingCloud<ParcelType>::ReactingCloud +( + ReactingCloud<ParcelType>& c, + const word& name +) +: + ThermoCloud<ParcelType>(c, name), + reactingCloud(), + cloudCopyPtr_(NULL), + constProps_(c.constProps_), + compositionModel_(c.compositionModel_->clone()), + phaseChangeModel_(c.phaseChangeModel_->clone()), + rhoTrans_(c.rhoTrans_.size()), + dMassPhaseChange_(c.dMassPhaseChange_) +{ + forAll(c.rhoTrans_, i) + { + rhoTrans_.set + ( + i, + new DimensionedField<scalar, volMesh>(c.rhoTrans_[i]) + ); + } +} + + +template<class ParcelType> +Foam::ReactingCloud<ParcelType>::ReactingCloud +( + const fvMesh& mesh, + const word& name, + const ReactingCloud<ParcelType>& c +) +: + ThermoCloud<ParcelType>(mesh, name, c), + reactingCloud(), + cloudCopyPtr_(NULL), + constProps_(c.constProps_), + compositionModel_(NULL), + phaseChangeModel_(NULL), + rhoTrans_(0), + dMassPhaseChange_(0.0) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template<class ParcelType> diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H index def51f895573a74b37d84664cc3a168621917344..4fa3153d6e2de95fc13f4fe7d8aa68c17f87853a 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H @@ -69,7 +69,19 @@ class ReactingCloud private: - // Private Member Functions + // Private data + + //- Cloud copy pointer + autoPtr<ReactingCloud<ParcelType> > cloudCopyPtr_; + + + // Private member functions + + //- Store the current cloud state + void storeState(); + + //- Reset the current cloud to the previously stored state + void restoreState(); //- Disallow default bitwise copy construct ReactingCloud(const ReactingCloud&); @@ -136,6 +148,9 @@ protected: //- Post-evolve void postEvolve(); + //- Reset state of cloud + void cloudReset(ReactingCloud<ParcelType>& c); + public: @@ -152,6 +167,35 @@ public: bool readFields = true ); + //- Copy constructor with new name + ReactingCloud(ReactingCloud<ParcelType>& c, const word& name); + + //- Copy constructor with new name - creates bare cloud + ReactingCloud + ( + const fvMesh& mesh, + const word& name, + const ReactingCloud<ParcelType>& c + ); + + //- Construct and return clone based on (this) with new name + virtual autoPtr<Cloud<ParcelType> > clone(const word& name) + { + return autoPtr<Cloud<ParcelType> > + ( + new ReactingCloud(*this, name) + ); + } + + //- Construct and return bare clone based on (this) with new name + virtual autoPtr<Cloud<ParcelType> > cloneBare(const word& name) const + { + return autoPtr<Cloud<ParcelType> > + ( + new ReactingCloud(this->mesh(), name, *this) + ); + } + //- Destructor virtual ~ReactingCloud(); diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C index b383f38f10aa70bef55a537412c6e927837e31e2..ca41f7457274699e093dcec5357b0813b8d9c424 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C @@ -28,6 +28,29 @@ License #include "DevolatilisationModel.H" #include "SurfaceReactionModel.H" +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template<class ParcelType> +void Foam::ReactingMultiphaseCloud<ParcelType>::storeState() +{ + cloudCopyPtr_.reset + ( + static_cast<ReactingMultiphaseCloud<ParcelType>*> + ( + clone(this->name() + "Copy").ptr() + ) + ); +} + + +template<class ParcelType> +void Foam::ReactingMultiphaseCloud<ParcelType>::restoreState() +{ + cloudReset(cloudCopyPtr_()); + cloudCopyPtr_.clear(); +} + + // * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * // template<class ParcelType> @@ -85,6 +108,22 @@ void Foam::ReactingMultiphaseCloud<ParcelType>::postEvolve() } +template<class ParcelType> +void Foam::ReactingMultiphaseCloud<ParcelType>::cloudReset +( + ReactingMultiphaseCloud<ParcelType>& c +) +{ + ReactingCloud<ParcelType>::cloudReset(c); + + devolatilisationModel_ = c.devolatilisationModel_->clone(); + surfaceReactionModel_ = c.surfaceReactionModel_->clone(); + + dMassDevolatilisation_ = c.dMassDevolatilisation_; + dMassSurfaceReaction_ = c.dMassSurfaceReaction_; +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template<class ParcelType> @@ -100,6 +139,7 @@ Foam::ReactingMultiphaseCloud<ParcelType>::ReactingMultiphaseCloud : ReactingCloud<ParcelType>(cloudName, rho, U, g, thermo, false), reactingMultiphaseCloud(), + cloudCopyPtr_(NULL), constProps_(this->particleProperties()), devolatilisationModel_ ( @@ -117,7 +157,8 @@ Foam::ReactingMultiphaseCloud<ParcelType>::ReactingMultiphaseCloud *this ) ), - dMassDevolatilisation_(0.0) + dMassDevolatilisation_(0.0), + dMassSurfaceReaction_(0.0) { if (readFields) { @@ -126,6 +167,43 @@ Foam::ReactingMultiphaseCloud<ParcelType>::ReactingMultiphaseCloud } +template<class ParcelType> +Foam::ReactingMultiphaseCloud<ParcelType>::ReactingMultiphaseCloud +( + ReactingMultiphaseCloud<ParcelType>& c, + const word& name +) +: + ReactingCloud<ParcelType>(c, name), + reactingMultiphaseCloud(), + cloudCopyPtr_(NULL), + constProps_(c.constProps_), + devolatilisationModel_(c.devolatilisationModel_->clone()), + surfaceReactionModel_(c.surfaceReactionModel_->clone()), + dMassDevolatilisation_(c.dMassDevolatilisation_), + dMassSurfaceReaction_(c.dMassSurfaceReaction_) +{} + + +template<class ParcelType> +Foam::ReactingMultiphaseCloud<ParcelType>::ReactingMultiphaseCloud +( + const fvMesh& mesh, + const word& name, + const ReactingMultiphaseCloud<ParcelType>& c +) +: + ReactingCloud<ParcelType>(mesh, name, c), + reactingMultiphaseCloud(), + cloudCopyPtr_(NULL), + constProps_(c.constProps_), + devolatilisationModel_(NULL), + surfaceReactionModel_(NULL), + dMassDevolatilisation_(0.0), + dMassSurfaceReaction_(0.0) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template<class ParcelType> diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H index af2199261e5021a3d46f82520079c0291dd02c82..86302703d3792272b697f1eeb105f6d773011d86 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H @@ -67,7 +67,19 @@ class ReactingMultiphaseCloud public ReactingCloud<ParcelType>, public reactingMultiphaseCloud { - // Private Member Functions + // Private data + + //- Cloud copy pointer + autoPtr<ReactingMultiphaseCloud<ParcelType> > cloudCopyPtr_; + + + // Private member functions + + //- Store the current cloud state + void storeState(); + + //- Reset the current cloud to the previously stored state + void restoreState(); //- Disallow default bitwise copy construct ReactingMultiphaseCloud(const ReactingMultiphaseCloud&); @@ -127,6 +139,9 @@ protected: //- Post-evolve void postEvolve(); + //- Reset state of cloud + void cloudReset(ReactingMultiphaseCloud<ParcelType>& c); + public: @@ -144,6 +159,40 @@ public: ); + //- Copy constructor with new name + ReactingMultiphaseCloud + ( + ReactingMultiphaseCloud<ParcelType>& c, + const word& name + ); + + //- Copy constructor with new name - creates bare cloud + ReactingMultiphaseCloud + ( + const fvMesh& mesh, + const word& name, + const ReactingMultiphaseCloud<ParcelType>& c + ); + + //- Construct and return clone based on (this) with new name + virtual autoPtr<Cloud<ParcelType> > clone(const word& name) + { + return autoPtr<Cloud<ParcelType> > + ( + new ReactingMultiphaseCloud(*this, name) + ); + } + + //- Construct and return bare clone based on (this) with new name + virtual autoPtr<Cloud<ParcelType> > cloneBare(const word& name) const + { + return autoPtr<Cloud<ParcelType> > + ( + new ReactingMultiphaseCloud(this->mesh(), name, *this) + ); + } + + //- Destructor virtual ~ReactingMultiphaseCloud(); diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C index 17469774af3e3d758161e0f42a5ca82855c0edb0..52190e52c4b9ef03040a9d1e12c455edb401a087 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C @@ -29,6 +29,29 @@ License #include "HeatTransferModel.H" +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template<class ParcelType> +void Foam::ThermoCloud<ParcelType>::storeState() +{ + cloudCopyPtr_.reset + ( + static_cast<ThermoCloud<ParcelType>*> + ( + clone(this->name() + "Copy").ptr() + ) + ); +} + + +template<class ParcelType> +void Foam::ThermoCloud<ParcelType>::restoreState() +{ + cloudReset(cloudCopyPtr_()); + cloudCopyPtr_.clear(); +} + + // * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * // template<class ParcelType> @@ -86,6 +109,18 @@ void Foam::ThermoCloud<ParcelType>::postEvolve() } +template<class ParcelType> +void Foam::ThermoCloud<ParcelType>::cloudReset(ThermoCloud<ParcelType>& c) +{ + KinematicCloud<ParcelType>::cloudReset(c); + + heatTransferModel_ = c.heatTransferModel_->clone(); + TIntegrator_ = c.TIntegrator_->clone(); + + radiation_ = c.radiation_; +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template<class ParcelType> @@ -109,6 +144,7 @@ Foam::ThermoCloud<ParcelType>::ThermoCloud false ), thermoCloud(), + cloudCopyPtr_(NULL), constProps_(this->particleProperties()), thermo_(thermo), T_(thermo.thermo().T()), @@ -132,17 +168,20 @@ Foam::ThermoCloud<ParcelType>::ThermoCloud radiation_(this->subModelProperties().lookup("radiation")), hsTrans_ ( - IOobject + new DimensionedField<scalar, volMesh> ( - this->name() + "hsTrans", - this->db().time().timeName(), - this->db(), - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ), - this->mesh(), - dimensionedScalar("zero", dimEnergy, 0.0) + IOobject + ( + this->name() + "hsTrans", + this->db().time().timeName(), + this->db(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + this->mesh(), + dimensionedScalar("zero", dimEnergy, 0.0) + ) ) { if (readFields) @@ -152,6 +191,64 @@ Foam::ThermoCloud<ParcelType>::ThermoCloud } +template<class ParcelType> +Foam::ThermoCloud<ParcelType>::ThermoCloud +( + ThermoCloud<ParcelType>& c, + const word& name +) +: + KinematicCloud<ParcelType>(c, name), + thermoCloud(), + cloudCopyPtr_(NULL), + constProps_(c.particleProperties_), + thermo_(c.thermo_), + T_(c.T()), + p_(c.p()), + heatTransferModel_(c.heatTransferModel_->clone()), + TIntegrator_(c.TIntegrator_->clone()), + radiation_(c.radiation_), + hsTrans_ + ( + new DimensionedField<scalar, volMesh> + ( + IOobject + ( + this->name() + "hsTrans", + this->db().time().timeName(), + this->db(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + c.hsTrans() + ) + ) +{} + + +template<class ParcelType> +Foam::ThermoCloud<ParcelType>::ThermoCloud +( + const fvMesh& mesh, + const word& name, + const ThermoCloud<ParcelType>& c +) +: + KinematicCloud<ParcelType>(mesh, name, c), + thermoCloud(), + cloudCopyPtr_(NULL), + constProps_(c.particleProperties_), + thermo_(c.thermo()), + T_(c.T()), + p_(c.p()), + heatTransferModel_(NULL), + TIntegrator_(NULL), + radiation_(false), + hsTrans_(NULL) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template<class ParcelType> @@ -188,7 +285,7 @@ template<class ParcelType> void Foam::ThermoCloud<ParcelType>::resetSourceTerms() { KinematicCloud<ParcelType>::resetSourceTerms(); - hsTrans_.field() = 0.0; + hsTrans_->field() = 0.0; } diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H index ec7dc3562768c93dc8194c1dda2a64358d708198..d7b9cc7d8ded13f1c0c6a13393671669f6e311ad 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H @@ -63,7 +63,19 @@ class ThermoCloud public KinematicCloud<ParcelType>, public thermoCloud { - // Private Member Functions + // Private data + + //- Cloud copy pointer + autoPtr<ThermoCloud<ParcelType> > cloudCopyPtr_; + + + // Private member functions + + //- Store the current cloud state + void storeState(); + + //- Reset the current cloud to the previously stored state + void restoreState(); //- Disallow default bitwise copy construct ThermoCloud(const ThermoCloud&); @@ -114,7 +126,7 @@ protected: // Sources //- Sensible enthalpy transfer [J/kg] - DimensionedField<scalar, volMesh> hsTrans_; + autoPtr<DimensionedField<scalar, volMesh> > hsTrans_; // Protected Member Functions @@ -133,6 +145,9 @@ protected: //- Post-evolve void postEvolve(); + //- Reset state of cloud + void cloudReset(ThermoCloud<ParcelType>& c); + public: @@ -149,6 +164,35 @@ public: bool readFields = true ); + //- Copy constructor with new name + ThermoCloud(ThermoCloud<ParcelType>& c, const word& name); + + //- Copy constructor with new name - creates bare cloud + ThermoCloud + ( + const fvMesh& mesh, + const word& name, + const ThermoCloud<ParcelType>& c + ); + + //- Construct and return clone based on (this) with new name + virtual autoPtr<Cloud<ParcelType> > clone(const word& name) + { + return autoPtr<Cloud<ParcelType> > + ( + new ThermoCloud(*this, name) + ); + } + + //- Construct and return bare clone based on (this) with new name + virtual autoPtr<Cloud<ParcelType> > cloneBare(const word& name) const + { + return autoPtr<Cloud<ParcelType> > + ( + new ThermoCloud(this->mesh(), name, *this) + ); + } + //- Destructor virtual ~ThermoCloud(); @@ -202,6 +246,10 @@ public: //- Sensible enthalpy transfer [J/kg] inline DimensionedField<scalar, volMesh>& hsTrans(); + //- Sensible enthalpy transfer [J/kg] + inline const DimensionedField<scalar, volMesh>& + hsTrans() const; + //- Return enthalpy source [J/kg/m3/s] inline tmp<DimensionedField<scalar, volMesh> > Sh() const; diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H index 887fbd30f28057c377187e6a8ff1674b6e951dd2..6af79f2cbc8085054c488d2d04230e59d6e11d35 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H @@ -85,7 +85,15 @@ template<class ParcelType> inline Foam::DimensionedField<Foam::scalar, Foam::volMesh>& Foam::ThermoCloud<ParcelType>::hsTrans() { - return hsTrans_; + return hsTrans_(); +} + + +template<class ParcelType> +inline const Foam::DimensionedField<Foam::scalar, Foam::volMesh>& +Foam::ThermoCloud<ParcelType>::hsTrans() const +{ + return hsTrans_(); } @@ -106,7 +114,7 @@ Foam::ThermoCloud<ParcelType>::Sh() const IOobject::AUTO_WRITE, false ), - hsTrans_/(this->mesh().V()*this->db().time().deltaT()) + hsTrans_()/(this->mesh().V()*this->db().time().deltaT()) ) ); diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H index baef80996f5ed0f99c98a3519a1a34c60ffe755f..e51e14afcf6a3340a5d6a457c12e9c93a5002962 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H @@ -39,6 +39,7 @@ SourceFiles #include "IOdictionary.H" #include "autoPtr.H" #include "runTimeSelectionTables.H" +#include "SubModelBase.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //