diff --git a/src/OpenFOAM/db/Time/Time.C b/src/OpenFOAM/db/Time/Time.C index 155c4c2eb48456ef366aa43b7de061321f16dca6..8619e2da91669622d1a06bba18bdc9415368e234 100644 --- a/src/OpenFOAM/db/Time/Time.C +++ b/src/OpenFOAM/db/Time/Time.C @@ -324,6 +324,7 @@ Foam::Time::Time secondaryWriteControl_(wcTimeStep), secondaryWriteInterval_(labelMax/10.0), // bit less to allow calculations purgeWrite_(0), + secondaryPurgeWrite_(0), writeOnce_(false), subCycling_(false), sigWriteNow_(true, *this), @@ -416,6 +417,7 @@ Foam::Time::Time secondaryWriteControl_(wcTimeStep), secondaryWriteInterval_(labelMax/10.0), purgeWrite_(0), + secondaryPurgeWrite_(0), writeOnce_(false), subCycling_(false), sigWriteNow_(true, *this), @@ -511,6 +513,7 @@ Foam::Time::Time secondaryWriteControl_(wcTimeStep), secondaryWriteInterval_(labelMax/10.0), purgeWrite_(0), + secondaryPurgeWrite_(0), writeOnce_(false), subCycling_(false), sigWriteNow_(true, *this), @@ -608,6 +611,7 @@ Foam::Time::Time secondaryWriteControl_(wcTimeStep), secondaryWriteInterval_(labelMax/10.0), purgeWrite_(0), + secondaryPurgeWrite_(0), writeOnce_(false), subCycling_(false), @@ -1070,11 +1074,13 @@ Foam::Time& Foam::Time::operator++() outputTime_ = false; + primaryOutputTime_ = false; + secondaryOutputTime_ = false; switch (writeControl_) { case wcTimeStep: - outputTime_ = !(timeIndex_ % label(writeInterval_)); + primaryOutputTime_ = !(timeIndex_ % label(writeInterval_)); break; case wcRunTime: @@ -1088,7 +1094,7 @@ Foam::Time& Foam::Time::operator++() if (outputIndex > outputTimeIndex_) { - outputTime_ = true; + primaryOutputTime_ = true; outputTimeIndex_ = outputIndex; } } @@ -1103,7 +1109,7 @@ Foam::Time& Foam::Time::operator++() ); if (outputIndex > outputTimeIndex_) { - outputTime_ = true; + primaryOutputTime_ = true; outputTimeIndex_ = outputIndex; } } @@ -1118,7 +1124,7 @@ Foam::Time& Foam::Time::operator++() ); if (outputIndex > outputTimeIndex_) { - outputTime_ = true; + primaryOutputTime_ = true; outputTimeIndex_ = outputIndex; } } @@ -1130,9 +1136,8 @@ Foam::Time& Foam::Time::operator++() switch (secondaryWriteControl_) { case wcTimeStep: - outputTime_ = - outputTime_ - || !(timeIndex_ % label(secondaryWriteInterval_)); + secondaryOutputTime_ = + !(timeIndex_ % label(secondaryWriteInterval_)); break; case wcRunTime: @@ -1146,7 +1151,7 @@ Foam::Time& Foam::Time::operator++() if (outputIndex > secondaryOutputTimeIndex_) { - outputTime_ = true; + secondaryOutputTime_ = true; secondaryOutputTimeIndex_ = outputIndex; } } @@ -1161,7 +1166,7 @@ Foam::Time& Foam::Time::operator++() ); if (outputIndex > secondaryOutputTimeIndex_) { - outputTime_ = true; + secondaryOutputTime_ = true; secondaryOutputTimeIndex_ = outputIndex; } } @@ -1176,7 +1181,7 @@ Foam::Time& Foam::Time::operator++() ); if (outputIndex > secondaryOutputTimeIndex_) { - outputTime_ = true; + secondaryOutputTime_ = true; secondaryOutputTimeIndex_ = outputIndex; } } @@ -1184,6 +1189,9 @@ Foam::Time& Foam::Time::operator++() } + outputTime_ = primaryOutputTime_ || secondaryOutputTime_; + + // see if endTime needs adjustment to stop at the next run()/end() check if (!end()) { @@ -1195,6 +1203,7 @@ Foam::Time& Foam::Time::operator++() { endTime_ = value(); outputTime_ = true; + primaryOutputTime_ = true; } else if (stopAt_ == saNextWrite && outputTime_ == true) { @@ -1205,6 +1214,7 @@ Foam::Time& Foam::Time::operator++() // Override outputTime if one-shot writing if (writeOnce_) { + primaryOutputTime_ = true; outputTime_ = true; writeOnce_ = false; } diff --git a/src/OpenFOAM/db/Time/Time.H b/src/OpenFOAM/db/Time/Time.H index 26e6b21bc7bbeef91186169940c056d17dc68153..1e761cd73eaaff3d81b4a27d15c996d885bbd19c 100644 --- a/src/OpenFOAM/db/Time/Time.H +++ b/src/OpenFOAM/db/Time/Time.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -138,10 +138,15 @@ protected: scalar secondaryWriteInterval_; - label purgeWrite_; mutable FIFOStack<word> previousOutputTimes_; + // Additional purging + + label secondaryPurgeWrite_; + mutable FIFOStack<word> previousSecondaryOutputTimes_; + + // One-shot writing bool writeOnce_; diff --git a/src/OpenFOAM/db/Time/TimeIO.C b/src/OpenFOAM/db/Time/TimeIO.C index 6a80618404ef323e9b9a2d1cfa79fed6fd1e75ae..1637d35bfcfe598fc4effec0f94f9b9798550059 100644 --- a/src/OpenFOAM/db/Time/TimeIO.C +++ b/src/OpenFOAM/db/Time/TimeIO.C @@ -160,6 +160,20 @@ void Foam::Time::readDict() } } + if (controlDict_.readIfPresent("secondaryPurgeWrite", secondaryPurgeWrite_)) + { + if (secondaryPurgeWrite_ < 0) + { + WarningIn("Time::readDict()") + << "invalid value for secondaryPurgeWrite " + << secondaryPurgeWrite_ + << ", should be >= 0, setting to 0" + << endl; + + secondaryPurgeWrite_ = 0; + } + } + if (controlDict_.found("timeFormat")) { const word formatName(controlDict_.lookup("timeFormat")); @@ -347,13 +361,45 @@ bool Foam::Time::writeObject timeDict.regIOobject::writeObject(fmt, ver, cmp); bool writeOK = objectRegistry::writeObject(fmt, ver, cmp); - if (writeOK && purgeWrite_) + if (writeOK) { - previousOutputTimes_.push(tmName); + // Does primary or secondary time trigger purging? + // Note that primary times can only be purged by primary + // purging. Secondary times can be purged by either primary + // or secondary purging. + if (primaryOutputTime_ && purgeWrite_) + { + previousOutputTimes_.push(tmName); - while (previousOutputTimes_.size() > purgeWrite_) + while (previousOutputTimes_.size() > purgeWrite_) + { + rmDir(objectRegistry::path(previousOutputTimes_.pop())); + } + } + if + ( + !primaryOutputTime_ + && secondaryOutputTime_ + && secondaryPurgeWrite_ + ) { - rmDir(objectRegistry::path(previousOutputTimes_.pop())); + // Writing due to secondary + previousSecondaryOutputTimes_.push(tmName); + + while + ( + previousSecondaryOutputTimes_.size() + > secondaryPurgeWrite_ + ) + { + rmDir + ( + objectRegistry::path + ( + previousSecondaryOutputTimes_.pop() + ) + ); + } } } @@ -368,6 +414,7 @@ bool Foam::Time::writeObject bool Foam::Time::writeNow() { + primaryOutputTime_ = true; outputTime_ = true; return write(); } diff --git a/src/OpenFOAM/db/Time/TimeState.C b/src/OpenFOAM/db/Time/TimeState.C index 500ca47d43ffb35c6d761886b1741dfd8dc6bf6e..f3e37401076380ceea06cc3220d24e25115f1a18 100644 --- a/src/OpenFOAM/db/Time/TimeState.C +++ b/src/OpenFOAM/db/Time/TimeState.C @@ -37,7 +37,9 @@ Foam::TimeState::TimeState() deltaT0_(0), deltaTchanged_(false), outputTimeIndex_(0), + primaryOutputTime_(false), secondaryOutputTimeIndex_(0), + secondaryOutputTime_(false), outputTime_(false) {} diff --git a/src/OpenFOAM/db/Time/TimeState.H b/src/OpenFOAM/db/Time/TimeState.H index d721529480ea79ce2de2b9f4cca74875ea11502b..b055d439f0f8389c8f4183d84e7259ef4040f2f1 100644 --- a/src/OpenFOAM/db/Time/TimeState.H +++ b/src/OpenFOAM/db/Time/TimeState.H @@ -61,8 +61,14 @@ protected: bool deltaTchanged_; label outputTimeIndex_; + //- Is outputTime because of primary? + bool primaryOutputTime_; + label secondaryOutputTimeIndex_; - bool outputTime_; + //- Is outputTime because of secondary? + bool secondaryOutputTime_; + + bool outputTime_; public: @@ -112,7 +118,7 @@ public: // Check - //- Return true if this is an output time + //- Return true if this is an output time (primary or secondary) bool outputTime() const; };