diff --git a/src/OpenFOAM/db/Time/Time.C b/src/OpenFOAM/db/Time/Time.C index 5c589c8f28..1eb31e15fc 100644 --- a/src/OpenFOAM/db/Time/Time.C +++ b/src/OpenFOAM/db/Time/Time.C @@ -129,6 +129,8 @@ void Foam::Time::adjustDeltaT() } } } + + functionObjects_.adjustTimeStep(); } @@ -941,17 +943,25 @@ void Foam::Time::setEndTime(const scalar endTime) } -void Foam::Time::setDeltaT(const dimensionedScalar& deltaT) +void Foam::Time::setDeltaT +( + const dimensionedScalar& deltaT, + const bool bAdjustDeltaT +) { - setDeltaT(deltaT.value()); + setDeltaT(deltaT.value(), bAdjustDeltaT); } -void Foam::Time::setDeltaT(const scalar deltaT) +void Foam::Time::setDeltaT(const scalar deltaT, const bool bAdjustDeltaT) { deltaT_ = deltaT; deltaTchanged_ = true; - adjustDeltaT(); + + if (bAdjustDeltaT) + { + adjustDeltaT(); + } } diff --git a/src/OpenFOAM/db/Time/Time.H b/src/OpenFOAM/db/Time/Time.H index 695f666c2e..0d7c83818f 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-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -527,10 +527,18 @@ public: virtual void setEndTime(const scalar); //- Reset time step - virtual void setDeltaT(const dimensionedScalar&); + virtual void setDeltaT + ( + const dimensionedScalar&, + const bool adjustDeltaT = true + ); //- Reset time step - virtual void setDeltaT(const scalar); + virtual void setDeltaT + ( + const scalar, + const bool adjustDeltaT = true + ); //- Set time to sub-cycle for the given number of steps virtual TimeState subCycle(const label nSubCycles); diff --git a/src/OpenFOAM/db/functionObjects/OutputFilterFunctionObject/OutputFilterFunctionObject.C b/src/OpenFOAM/db/functionObjects/OutputFilterFunctionObject/OutputFilterFunctionObject.C index 7c6b95ec98..019a4f54aa 100644 --- a/src/OpenFOAM/db/functionObjects/OutputFilterFunctionObject/OutputFilterFunctionObject.C +++ b/src/OpenFOAM/db/functionObjects/OutputFilterFunctionObject/OutputFilterFunctionObject.C @@ -40,6 +40,7 @@ void Foam::OutputFilterFunctionObject::readDict() dict_.readIfPresent("storeFilter", storeFilter_); dict_.readIfPresent("timeStart", timeStart_); dict_.readIfPresent("timeEnd", timeEnd_); + dict_.readIfPresent("nStepsToStartTimeChange", nStepsToStartTimeChange_); } @@ -214,6 +215,52 @@ bool Foam::OutputFilterFunctionObject::timeSet() } +template +bool Foam::OutputFilterFunctionObject::adjustTimeStep() +{ + if + ( + active() + && outputControl_.outputControl() + == outputFilterOutputControl::ocAdjustableTime + ) + { + const label outputTimeIndex = outputControl_.outputTimeLastDump(); + const scalar writeInterval = outputControl_.writeInterval(); + + scalar timeToNextWrite = max + ( + 0.0, + (outputTimeIndex + 1)*writeInterval + - (time_.value() - time_.startTime().value()) + ); + + scalar deltaT = time_.deltaTValue(); + + scalar nSteps = timeToNextWrite/deltaT - SMALL; + + // function objects modify deltaT inside nStepsToStartTimeChange range + // NOTE: Potential problem if two function objects dump inside the same + //interval + if (nSteps < nStepsToStartTimeChange_) + { + label nStepsToNextWrite = label(nSteps) + 1; + + scalar newDeltaT = timeToNextWrite/nStepsToNextWrite; + + //Adjust time step + if (newDeltaT < deltaT) + { + deltaT = max(newDeltaT, 0.2*deltaT); + const_cast(time_).setDeltaT(deltaT, false); + } + } + } + + return true; +} + + template bool Foam::OutputFilterFunctionObject::read ( diff --git a/src/OpenFOAM/db/functionObjects/OutputFilterFunctionObject/OutputFilterFunctionObject.H b/src/OpenFOAM/db/functionObjects/OutputFilterFunctionObject/OutputFilterFunctionObject.H index 78d1c47be7..c9cc34c8ce 100644 --- a/src/OpenFOAM/db/functionObjects/OutputFilterFunctionObject/OutputFilterFunctionObject.H +++ b/src/OpenFOAM/db/functionObjects/OutputFilterFunctionObject/OutputFilterFunctionObject.H @@ -90,6 +90,10 @@ class OutputFilterFunctionObject //- De-activation time - defaults to VGREAT scalar timeEnd_; + //- Number of steps before the dumping time in which the deltaT + // will start to change (valid for ocAdjustableTime) + label nStepsToStartTimeChange_; + //- Output controls outputFilterOutputControl outputControl_; @@ -204,6 +208,9 @@ public: //- Called when time was set at the end of the Time::operator++ virtual bool timeSet(); + //- Called at the end of Time::adjustDeltaT() if adjustTime is true + virtual bool adjustTimeStep(); + //- Read and set the function object if its data have changed virtual bool read(const dictionary&); diff --git a/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C b/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C index 31e1d92062..2cb5bd0cd1 100644 --- a/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C +++ b/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C @@ -126,6 +126,12 @@ bool Foam::functionObject::timeSet() } +bool Foam::functionObject::adjustTimeStep() +{ + return false; +} + + Foam::autoPtr Foam::functionObject::iNew::operator() ( const word& name, diff --git a/src/OpenFOAM/db/functionObjects/functionObject/functionObject.H b/src/OpenFOAM/db/functionObjects/functionObject/functionObject.H index 47438c3215..ef4e6591fb 100644 --- a/src/OpenFOAM/db/functionObjects/functionObject/functionObject.H +++ b/src/OpenFOAM/db/functionObjects/functionObject/functionObject.H @@ -160,6 +160,9 @@ public: //- Called when time was set at the end of the Time::operator++ virtual bool timeSet(); + //- Called at the end of Time::adjustDeltaT() if adjustTime is true + virtual bool adjustTimeStep(); + //- Read and set the function object if its data have changed virtual bool read(const dictionary&) = 0; diff --git a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C index 1e7553a760..0c44dbbfbd 100644 --- a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C +++ b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C @@ -211,6 +211,27 @@ bool Foam::functionObjectList::timeSet() } +bool Foam::functionObjectList::adjustTimeStep() +{ + bool ok = true; + + if (execution_) + { + if (!updated_) + { + read(); + } + + forAll(*this, objectI) + { + ok = operator[](objectI).adjustTimeStep() && ok; + } + } + + return ok; +} + + bool Foam::functionObjectList::read() { bool ok = true; diff --git a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H index 4df2c4d263..126a1f18bb 100644 --- a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H +++ b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H @@ -166,6 +166,9 @@ public: //- Called when time was set at the end of the Time::operator++ virtual bool timeSet(); + //- Called at the end of Time::adjustDeltaT() if adjustTime is true + virtual bool adjustTimeStep(); + //- Read and set the function objects if their data have changed virtual bool read(); diff --git a/src/OpenFOAM/db/functionObjects/outputFilterOutputControl/outputFilterOutputControl.C b/src/OpenFOAM/db/functionObjects/outputFilterOutputControl/outputFilterOutputControl.C index e282ff8c21..6865b31fb9 100644 --- a/src/OpenFOAM/db/functionObjects/outputFilterOutputControl/outputFilterOutputControl.C +++ b/src/OpenFOAM/db/functionObjects/outputFilterOutputControl/outputFilterOutputControl.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -24,21 +24,26 @@ License \*---------------------------------------------------------------------------*/ #include "outputFilterOutputControl.H" +#include "PstreamReduceOps.H" // * * * * * * * * * * * * * Static Member Data * * * * * * * * * * * * * * // namespace Foam { template<> - const char* NamedEnum:: + const char* NamedEnum:: names[] = { "timeStep", - "outputTime" + "outputTime", + "adjustableTime", + "runTime", + "clockTime", + "cpuTime" }; } -const Foam::NamedEnum +const Foam::NamedEnum Foam::outputFilterOutputControl::outputControlNames_; @@ -53,7 +58,8 @@ Foam::outputFilterOutputControl::outputFilterOutputControl time_(t), outputControl_(ocTimeStep), outputInterval_(0), - outputTimeLastDump_(0) + outputTimeLastDump_(0), + writeInterval_(-1) { read(dict); } @@ -92,6 +98,15 @@ void Foam::outputFilterOutputControl::read(const dictionary& dict) break; } + case ocClockTime: + case ocRunTime: + case ocCpuTime: + case ocAdjustableTime: + { + writeInterval_ = readScalar(dict.lookup("writeInterval")); + break; + } + default: { // do nothing @@ -125,6 +140,56 @@ bool Foam::outputFilterOutputControl::output() break; } + case ocRunTime: + case ocAdjustableTime: + { + label outputIndex = label + ( + ( + (time_.value() - time_.startTime().value()) + + 0.5*time_.deltaTValue() + ) + / writeInterval_ + ); + + if (outputIndex > outputTimeLastDump_) + { + outputTimeLastDump_ = outputIndex; + return true; + } + break; + } + + case ocCpuTime: + { + label outputIndex = label + ( + returnReduce(time_.elapsedCpuTime(), maxOp()) + / writeInterval_ + ); + if (outputIndex > outputTimeLastDump_) + { + outputTimeLastDump_ = outputIndex; + return true; + } + break; + } + + case ocClockTime: + { + label outputIndex = label + ( + returnReduce(label(time_.elapsedClockTime()), maxOp