ENH: Added calcFrequency for steady cloud calcs

This commit is contained in:
andy
2010-11-01 12:00:26 +00:00
parent 12ad0174f6
commit 100eaa84dd
9 changed files with 123 additions and 22 deletions

View File

@ -47,6 +47,7 @@ void Foam::KinematicCloud<ParcelType>::cloudSolution::read()
if (steadyState()) if (steadyState())
{ {
dict_.lookup("calcFrequency") >> calcFrequency_;
dict_.lookup("maxTrackTime") >> maxTrackTime_; dict_.lookup("maxTrackTime") >> maxTrackTime_;
dict_.subDict("sourceTerms").lookup("resetOnStartup") dict_.subDict("sourceTerms").lookup("resetOnStartup")
>> resetSourcesOnStartup_; >> resetSourcesOnStartup_;
@ -65,6 +66,9 @@ Foam::KinematicCloud<ParcelType>::cloudSolution::cloudSolution
dict_(dict), dict_(dict),
active_(dict.lookup("active")), active_(dict.lookup("active")),
transient_(false), transient_(false),
calcFrequency_(1),
iter_(1),
deltaT_(0.0),
coupled_(false), coupled_(false),
cellValueSourceCorrection_(false), cellValueSourceCorrection_(false),
maxTrackTime_(0.0), maxTrackTime_(0.0),
@ -87,6 +91,9 @@ Foam::KinematicCloud<ParcelType>::cloudSolution::cloudSolution
dict_(cs.dict_), dict_(cs.dict_),
active_(cs.active_), active_(cs.active_),
transient_(cs.transient_), transient_(cs.transient_),
calcFrequency_(cs.calcFrequency_),
iter_(cs.iter_),
deltaT_(cs.deltaT_),
coupled_(cs.coupled_), coupled_(cs.coupled_),
cellValueSourceCorrection_(cs.cellValueSourceCorrection_), cellValueSourceCorrection_(cs.cellValueSourceCorrection_),
maxTrackTime_(cs.maxTrackTime_), maxTrackTime_(cs.maxTrackTime_),
@ -104,6 +111,9 @@ Foam::KinematicCloud<ParcelType>::cloudSolution::cloudSolution
dict_(dictionary::null), dict_(dictionary::null),
active_(false), active_(false),
transient_(false), transient_(false),
calcFrequency_(0),
iter_(0),
deltaT_(0.0),
coupled_(false), coupled_(false),
cellValueSourceCorrection_(false), cellValueSourceCorrection_(false),
maxTrackTime_(0.0), maxTrackTime_(0.0),
@ -137,14 +147,36 @@ bool Foam::KinematicCloud<ParcelType>::cloudSolution::semiImplicit
template<class ParcelType> template<class ParcelType>
bool Foam::KinematicCloud<ParcelType>::cloudSolution::sourceActive() const bool Foam::KinematicCloud<ParcelType>::cloudSolution::solveThisStep() const
{ {
return coupled_ && (active_ || steadyState()); return
active_
&& (
mesh_.time().outputTime()
|| (mesh_.time().timeIndex() % calcFrequency_ == 0)
);
} }
template<class ParcelType> template<class ParcelType>
bool Foam::KinematicCloud<ParcelType>::cloudSolution::writeThisStep() const bool Foam::KinematicCloud<ParcelType>::cloudSolution::canEvolve()
{
// Set the calculation time step
if (transient_)
{
deltaT_ = mesh_.time().deltaTValue();
}
else
{
deltaT_ = maxTrackTime_;
}
return solveThisStep();
}
template<class ParcelType>
bool Foam::KinematicCloud<ParcelType>::cloudSolution::output() const
{ {
return active_ && mesh_.time().outputTime(); return active_ && mesh_.time().outputTime();
} }
@ -278,10 +310,10 @@ void Foam::KinematicCloud<ParcelType>::evolveCloud
{ {
// this->surfaceFilm().injectStreadyState(td); // this->surfaceFilm().injectStreadyState(td);
this->injection().injectSteadyState(td, solution_.maxTrackTime()); this->injection().injectSteadyState(td, solution_.deltaT());
td.part() = ParcelType::trackData::tpLinearTrack; td.part() = ParcelType::trackData::tpLinearTrack;
Cloud<ParcelType>::move(td, solution_.maxTrackTime()); Cloud<ParcelType>::move(td, solution_.deltaT());
} }
} }
@ -331,10 +363,10 @@ void Foam::KinematicCloud<ParcelType>::moveCollide
) )
{ {
td.part() = ParcelType::trackData::tpVelocityHalfStep; td.part() = ParcelType::trackData::tpVelocityHalfStep;
Cloud<ParcelType>::move(td, this->db().time().deltaTValue()); Cloud<ParcelType>::move(td, solution_.deltaT());
td.part() = ParcelType::trackData::tpLinearTrack; td.part() = ParcelType::trackData::tpLinearTrack;
Cloud<ParcelType>::move(td, this->db().time().deltaTValue()); Cloud<ParcelType>::move(td, solution_.deltaT());
// td.part() = ParcelType::trackData::tpRotationalTrack; // td.part() = ParcelType::trackData::tpRotationalTrack;
// Cloud<ParcelType>::move(td); // Cloud<ParcelType>::move(td);
@ -344,7 +376,7 @@ void Foam::KinematicCloud<ParcelType>::moveCollide
this->collision().collide(); this->collision().collide();
td.part() = ParcelType::trackData::tpVelocityHalfStep; td.part() = ParcelType::trackData::tpVelocityHalfStep;
Cloud<ParcelType>::move(td, this->db().time().deltaTValue()); Cloud<ParcelType>::move(td, solution_.deltaT());
} }
@ -362,6 +394,8 @@ void Foam::KinematicCloud<ParcelType>::postEvolve()
forces_.cacheFields(false, solution_.interpolationSchemes()); forces_.cacheFields(false, solution_.interpolationSchemes());
this->postProcessing().post(); this->postProcessing().post();
solution_.nextIter();
} }
@ -732,7 +766,7 @@ void Foam::KinematicCloud<ParcelType>::relaxSources
template<class ParcelType> template<class ParcelType>
void Foam::KinematicCloud<ParcelType>::evolve() void Foam::KinematicCloud<ParcelType>::evolve()
{ {
if (solution_.active()) if (solution_.canEvolve())
{ {
typename ParcelType::trackData td(*this); typename ParcelType::trackData td(*this);

View File

@ -132,6 +132,16 @@ public:
//- Transient flag //- Transient flag
Switch transient_; 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 // Run-time options
@ -205,6 +215,18 @@ public:
//- Return const access to the steady flag //- Return const access to the steady flag
inline const Switch steadyState() const; 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 //- Return const access to the coupled flag
inline const Switch coupled() const; inline const Switch coupled() const;
@ -229,11 +251,15 @@ public:
// Helper functions // Helper functions
//- Returns true if sources are active (at this time) //- Returns true if performing a cloud iteration this calc step
bool sourceActive() const; bool solveThisStep() const;
//- Returns true if possible to evolve the cloud and sets timestep
// parameters
bool canEvolve();
//- Returns true if writing this step //- Returns true if writing this step
bool writeThisStep() const; bool output() const;
}; };
@ -439,6 +465,9 @@ public:
//- Return const access to the solution properties //- Return const access to the solution properties
inline const cloudSolution& solution() const; inline const cloudSolution& solution() const;
//- Return access to the solution properties
inline cloudSolution& solution();
//- Return the constant properties //- Return the constant properties
inline const typename ParcelType::constantProperties& inline const typename ParcelType::constantProperties&
constProps() const; constProps() const;

View File

@ -91,6 +91,36 @@ Foam::KinematicCloud<ParcelType>::cloudSolution::steadyState() const
} }
template<class ParcelType>
inline Foam::label
Foam::KinematicCloud<ParcelType>::cloudSolution::calcFrequency() const
{
return calcFrequency_;
}
template<class ParcelType>
inline Foam::label Foam::KinematicCloud<ParcelType>::cloudSolution::iter() const
{
return iter_;
}
template<class ParcelType>
inline Foam::label Foam::KinematicCloud<ParcelType>::cloudSolution::nextIter()
{
return ++iter_;
}
template<class ParcelType>
inline Foam::scalar
Foam::KinematicCloud<ParcelType>::cloudSolution::deltaT() const
{
return deltaT_;
}
template<class ParcelType> template<class ParcelType>
inline const Foam::Switch inline const Foam::Switch
Foam::KinematicCloud<ParcelType>::cloudSolution::coupled() const Foam::KinematicCloud<ParcelType>::cloudSolution::coupled() const
@ -164,6 +194,14 @@ Foam::KinematicCloud<ParcelType>::solution() const
} }
template<class ParcelType>
inline typename Foam::KinematicCloud<ParcelType>::cloudSolution&
Foam::KinematicCloud<ParcelType>::solution()
{
return solution_;
}
template<class ParcelType> template<class ParcelType>
inline const typename ParcelType::constantProperties& inline const typename ParcelType::constantProperties&
Foam::KinematicCloud<ParcelType>::constProps() const Foam::KinematicCloud<ParcelType>::constProps() const
@ -445,7 +483,7 @@ Foam::KinematicCloud<ParcelType>::SU(volVectorField& U) const
<< max(UCoeff()).value() << endl; << max(UCoeff()).value() << endl;
} }
if (solution_.sourceActive()) if (solution_.coupled())
{ {
if (solution_.semiImplicit("U")) if (solution_.semiImplicit("U"))
{ {

View File

@ -297,7 +297,7 @@ void Foam::ReactingCloud<ParcelType>::relaxSources
template<class ParcelType> template<class ParcelType>
void Foam::ReactingCloud<ParcelType>::evolve() void Foam::ReactingCloud<ParcelType>::evolve()
{ {
if (this->solution().active()) if (this->solution().canEvolve())
{ {
typename ParcelType::trackData td(*this); typename ParcelType::trackData td(*this);

View File

@ -90,7 +90,7 @@ Foam::ReactingCloud<ParcelType>::SYi
volScalarField& Yi volScalarField& Yi
) const ) const
{ {
if (this->solution().sourceActive()) if (this->solution().coupled())
{ {
if (this->solution().semiImplicit("Yi")) if (this->solution().semiImplicit("Yi"))
{ {
@ -165,7 +165,7 @@ Foam::ReactingCloud<ParcelType>::Srho(const label i) const
) )
); );
if (this->solution().sourceActive()) if (this->solution().coupled())
{ {
scalarField& rhoi = tRhoi(); scalarField& rhoi = tRhoi();
rhoi = rhoTrans_[i]/(this->db().time().deltaT()*this->mesh().V()); rhoi = rhoTrans_[i]/(this->db().time().deltaT()*this->mesh().V());
@ -202,7 +202,7 @@ Foam::ReactingCloud<ParcelType>::Srho() const
) )
); );
if (this->solution().sourceActive()) if (this->solution().coupled())
{ {
scalarField& sourceField = trhoTrans(); scalarField& sourceField = trhoTrans();
forAll(rhoTrans_, i) forAll(rhoTrans_, i)
@ -221,7 +221,7 @@ template<class ParcelType>
inline Foam::tmp<Foam::fvScalarMatrix> inline Foam::tmp<Foam::fvScalarMatrix>
Foam::ReactingCloud<ParcelType>::Srho(volScalarField& rho) const Foam::ReactingCloud<ParcelType>::Srho(volScalarField& rho) const
{ {
if (this->solution().sourceActive()) if (this->solution().coupled())
{ {
tmp<volScalarField> trhoTrans tmp<volScalarField> trhoTrans
( (

View File

@ -220,7 +220,7 @@ void Foam::ReactingMultiphaseCloud<ParcelType>::resetSourceTerms()
template<class ParcelType> template<class ParcelType>
void Foam::ReactingMultiphaseCloud<ParcelType>::evolve() void Foam::ReactingMultiphaseCloud<ParcelType>::evolve()
{ {
if (this->solution().active()) if (this->solution().canEvolve())
{ {
typename ParcelType::trackData td(*this); typename ParcelType::trackData td(*this);

View File

@ -286,7 +286,7 @@ void Foam::ThermoCloud<ParcelType>::relaxSources
template<class ParcelType> template<class ParcelType>
void Foam::ThermoCloud<ParcelType>::evolve() void Foam::ThermoCloud<ParcelType>::evolve()
{ {
if (this->solution().active()) if (this->solution().canEvolve())
{ {
typename ParcelType::trackData td(*this); typename ParcelType::trackData td(*this);

View File

@ -133,7 +133,7 @@ Foam::ThermoCloud<ParcelType>::Sh(volScalarField& hs) const
<< max(hsCoeff()).value() << endl; << max(hsCoeff()).value() << endl;
} }
if (this->solution().sourceActive()) if (this->solution().coupled())
{ {
if (this->solution().semiImplicit("hs")) if (this->solution().semiImplicit("hs"))
{ {

View File

@ -105,7 +105,7 @@ void Foam::ParticleTracks<CloudType>::postFace(const parcelType& p)
{ {
if if
( (
this->owner().solution().writeThisStep() this->owner().solution().output()
|| this->owner().solution().transient() || this->owner().solution().transient()
) )
{ {