diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C index ce7d78fe27..67c83864ba 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C @@ -47,6 +47,7 @@ void Foam::KinematicCloud::cloudSolution::read() if (steadyState()) { + dict_.lookup("calcFrequency") >> calcFrequency_; dict_.lookup("maxTrackTime") >> maxTrackTime_; dict_.subDict("sourceTerms").lookup("resetOnStartup") >> resetSourcesOnStartup_; @@ -65,6 +66,9 @@ Foam::KinematicCloud::cloudSolution::cloudSolution dict_(dict), active_(dict.lookup("active")), transient_(false), + calcFrequency_(1), + iter_(1), + deltaT_(0.0), coupled_(false), cellValueSourceCorrection_(false), maxTrackTime_(0.0), @@ -87,6 +91,9 @@ Foam::KinematicCloud::cloudSolution::cloudSolution dict_(cs.dict_), active_(cs.active_), transient_(cs.transient_), + calcFrequency_(cs.calcFrequency_), + iter_(cs.iter_), + deltaT_(cs.deltaT_), coupled_(cs.coupled_), cellValueSourceCorrection_(cs.cellValueSourceCorrection_), maxTrackTime_(cs.maxTrackTime_), @@ -104,6 +111,9 @@ Foam::KinematicCloud::cloudSolution::cloudSolution dict_(dictionary::null), active_(false), transient_(false), + calcFrequency_(0), + iter_(0), + deltaT_(0.0), coupled_(false), cellValueSourceCorrection_(false), maxTrackTime_(0.0), @@ -137,14 +147,36 @@ bool Foam::KinematicCloud::cloudSolution::semiImplicit template -bool Foam::KinematicCloud::cloudSolution::sourceActive() const +bool Foam::KinematicCloud::cloudSolution::solveThisStep() const { - return coupled_ && (active_ || steadyState()); + return + active_ + && ( + mesh_.time().outputTime() + || (mesh_.time().timeIndex() % calcFrequency_ == 0) + ); } template -bool Foam::KinematicCloud::cloudSolution::writeThisStep() const +bool Foam::KinematicCloud::cloudSolution::canEvolve() +{ + // Set the calculation time step + if (transient_) + { + deltaT_ = mesh_.time().deltaTValue(); + } + else + { + deltaT_ = maxTrackTime_; + } + + return solveThisStep(); +} + + +template +bool Foam::KinematicCloud::cloudSolution::output() const { return active_ && mesh_.time().outputTime(); } @@ -278,10 +310,10 @@ void Foam::KinematicCloud::evolveCloud { // this->surfaceFilm().injectStreadyState(td); - this->injection().injectSteadyState(td, solution_.maxTrackTime()); + this->injection().injectSteadyState(td, solution_.deltaT()); td.part() = ParcelType::trackData::tpLinearTrack; - Cloud::move(td, solution_.maxTrackTime()); + Cloud::move(td, solution_.deltaT()); } } @@ -331,10 +363,10 @@ void Foam::KinematicCloud::moveCollide ) { td.part() = ParcelType::trackData::tpVelocityHalfStep; - Cloud::move(td, this->db().time().deltaTValue()); + Cloud::move(td, solution_.deltaT()); td.part() = ParcelType::trackData::tpLinearTrack; - Cloud::move(td, this->db().time().deltaTValue()); + Cloud::move(td, solution_.deltaT()); // td.part() = ParcelType::trackData::tpRotationalTrack; // Cloud::move(td); @@ -344,7 +376,7 @@ void Foam::KinematicCloud::moveCollide this->collision().collide(); td.part() = ParcelType::trackData::tpVelocityHalfStep; - Cloud::move(td, this->db().time().deltaTValue()); + Cloud::move(td, solution_.deltaT()); } @@ -362,6 +394,8 @@ void Foam::KinematicCloud::postEvolve() forces_.cacheFields(false, solution_.interpolationSchemes()); this->postProcessing().post(); + + solution_.nextIter(); } @@ -732,7 +766,7 @@ void Foam::KinematicCloud::relaxSources template void Foam::KinematicCloud::evolve() { - if (solution_.active()) + if (solution_.canEvolve()) { typename ParcelType::trackData td(*this); diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H index 74c2c03909..a4acfed045 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H @@ -132,6 +132,16 @@ public: //- Transient flag Switch transient_; + //- Calculation frequency - carrier steps per cloud step + // NOTE: Steady operation only + label calcFrequency_; + + //- Current cloud iteration + label iter_; + + //- Cloud solution time step + scalar deltaT_; + // Run-time options @@ -205,6 +215,18 @@ public: //- Return const access to the steady flag inline const Switch steadyState() const; + //- Return const access to the calculation frequency + inline label calcFrequency() const; + + //- Return const access to the current cloud iteration + inline label iter() const; + + //- Increment and return iter counter + inline label nextIter(); + + //- Return the time step + inline scalar deltaT() const; + //- Return const access to the coupled flag inline const Switch coupled() const; @@ -229,11 +251,15 @@ public: // Helper functions - //- Returns true if sources are active (at this time) - bool sourceActive() const; + //- Returns true if performing a cloud iteration this calc step + bool solveThisStep() const; + + //- Returns true if possible to evolve the cloud and sets timestep + // parameters + bool canEvolve(); //- Returns true if writing this step - bool writeThisStep() const; + bool output() const; }; @@ -439,6 +465,9 @@ public: //- Return const access to the solution properties inline const cloudSolution& solution() const; + //- Return access to the solution properties + inline cloudSolution& solution(); + //- Return the constant properties inline const typename ParcelType::constantProperties& constProps() const; diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H index 69c8e0999d..9bd314af61 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H @@ -91,6 +91,36 @@ Foam::KinematicCloud::cloudSolution::steadyState() const } +template +inline Foam::label +Foam::KinematicCloud::cloudSolution::calcFrequency() const +{ + return calcFrequency_; +} + + +template +inline Foam::label Foam::KinematicCloud::cloudSolution::iter() const +{ + return iter_; +} + + +template +inline Foam::label Foam::KinematicCloud::cloudSolution::nextIter() +{ + return ++iter_; +} + + +template +inline Foam::scalar +Foam::KinematicCloud::cloudSolution::deltaT() const +{ + return deltaT_; +} + + template inline const Foam::Switch Foam::KinematicCloud::cloudSolution::coupled() const @@ -164,6 +194,14 @@ Foam::KinematicCloud::solution() const } +template +inline typename Foam::KinematicCloud::cloudSolution& +Foam::KinematicCloud::solution() +{ + return solution_; +} + + template inline const typename ParcelType::constantProperties& Foam::KinematicCloud::constProps() const @@ -445,7 +483,7 @@ Foam::KinematicCloud::SU(volVectorField& U) const << max(UCoeff()).value() << endl; } - if (solution_.sourceActive()) + if (solution_.coupled()) { if (solution_.semiImplicit("U")) { diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C index 744b15b493..7615cc3024 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C @@ -297,7 +297,7 @@ void Foam::ReactingCloud::relaxSources template void Foam::ReactingCloud::evolve() { - if (this->solution().active()) + if (this->solution().canEvolve()) { typename ParcelType::trackData td(*this); diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H index 97c32f5338..be69361f09 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H @@ -90,7 +90,7 @@ Foam::ReactingCloud::SYi volScalarField& Yi ) const { - if (this->solution().sourceActive()) + if (this->solution().coupled()) { if (this->solution().semiImplicit("Yi")) { @@ -165,7 +165,7 @@ Foam::ReactingCloud::Srho(const label i) const ) ); - if (this->solution().sourceActive()) + if (this->solution().coupled()) { scalarField& rhoi = tRhoi(); rhoi = rhoTrans_[i]/(this->db().time().deltaT()*this->mesh().V()); @@ -202,7 +202,7 @@ Foam::ReactingCloud::Srho() const ) ); - if (this->solution().sourceActive()) + if (this->solution().coupled()) { scalarField& sourceField = trhoTrans(); forAll(rhoTrans_, i) @@ -221,7 +221,7 @@ template inline Foam::tmp Foam::ReactingCloud::Srho(volScalarField& rho) const { - if (this->solution().sourceActive()) + if (this->solution().coupled()) { tmp trhoTrans ( diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C index 2a3dbecb40..fc33d58434 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C @@ -220,7 +220,7 @@ void Foam::ReactingMultiphaseCloud::resetSourceTerms() template void Foam::ReactingMultiphaseCloud::evolve() { - if (this->solution().active()) + if (this->solution().canEvolve()) { typename ParcelType::trackData td(*this); diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C index 8f0a366884..c20bb483cf 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C @@ -286,7 +286,7 @@ void Foam::ThermoCloud::relaxSources template void Foam::ThermoCloud::evolve() { - if (this->solution().active()) + if (this->solution().canEvolve()) { typename ParcelType::trackData td(*this); diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H index 0cd8db5ce1..dabbdc1211 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H @@ -133,7 +133,7 @@ Foam::ThermoCloud::Sh(volScalarField& hs) const << max(hsCoeff()).value() << endl; } - if (this->solution().sourceActive()) + if (this->solution().coupled()) { if (this->solution().semiImplicit("hs")) { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.C b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.C index 06fb520004..799afdfa4c 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.C @@ -105,7 +105,7 @@ void Foam::ParticleTracks::postFace(const parcelType& p) { if ( - this->owner().solution().writeThisStep() + this->owner().solution().output() || this->owner().solution().transient() ) {