ENH: adding hook adjustTimeStep to function objects. The hook is called in

Time::adjustDeltaT(). It allows function objects to manipulate the time step to
    dump at adjustable times. The following options are available for output in
    function objects: timeStep, outputTime, adjustableTime, runTime, clockTime
    and cpuTime.
This commit is contained in:
Sergio Ferraris
2013-09-09 14:13:21 +01:00
parent 470553c61a
commit 2d773bc089
14 changed files with 264 additions and 27 deletions

View File

@ -40,6 +40,7 @@ void Foam::OutputFilterFunctionObject<OutputFilter>::readDict()
dict_.readIfPresent("storeFilter", storeFilter_);
dict_.readIfPresent("timeStart", timeStart_);
dict_.readIfPresent("timeEnd", timeEnd_);
dict_.readIfPresent("nStepsToStartTimeChange", nStepsToStartTimeChange_);
}
@ -214,6 +215,52 @@ bool Foam::OutputFilterFunctionObject<OutputFilter>::timeSet()
}
template<class OutputFilter>
bool Foam::OutputFilterFunctionObject<OutputFilter>::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&>(time_).setDeltaT(deltaT, false);
}
}
}
return true;
}
template<class OutputFilter>
bool Foam::OutputFilterFunctionObject<OutputFilter>::read
(

View File

@ -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&);

View File

@ -126,6 +126,12 @@ bool Foam::functionObject::timeSet()
}
bool Foam::functionObject::adjustTimeStep()
{
return false;
}
Foam::autoPtr<Foam::functionObject> Foam::functionObject::iNew::operator()
(
const word& name,

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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<outputFilterOutputControl::outputControls, 2>::
const char* NamedEnum<outputFilterOutputControl::outputControls, 6>::
names[] =
{
"timeStep",
"outputTime"
"outputTime",
"adjustableTime",
"runTime",
"clockTime",
"cpuTime"
};
}
const Foam::NamedEnum<Foam::outputFilterOutputControl::outputControls, 2>
const Foam::NamedEnum<Foam::outputFilterOutputControl::outputControls, 6>
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<double>())
/ writeInterval_
);
if (outputIndex > outputTimeLastDump_)
{
outputTimeLastDump_ = outputIndex;
return true;
}
break;
}
case ocClockTime:
{
label outputIndex = label
(
returnReduce(label(time_.elapsedClockTime()), maxOp<label>())
/ writeInterval_
);
if (outputIndex > outputTimeLastDump_)
{
outputTimeLastDump_ = outputIndex;
return true;
}
break;
}
default:
{
// this error should not actually be possible

View File

@ -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-2013 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -56,8 +56,12 @@ public:
//- The output control options
enum outputControls
{
ocTimeStep, /*!< execution is coupled to the time-step */
ocOutputTime /*!< execution is coupled to the output-time */
ocTimeStep, /*!< execution is coupled to the time-step */
ocOutputTime, /*!< execution is coupled to the output-time */
ocAdjustableTime, /*!< Adjust time step for dumping */
ocRunTime, /*!< run time for dumping */
ocClockTime, /*!< clock time for dumping */
ocCpuTime /*!< cpu time for dumping */
};
@ -69,7 +73,7 @@ private:
const Time& time_;
//- String representation of outputControls enums
static const NamedEnum<outputControls, 2> outputControlNames_;
static const NamedEnum<outputControls, 6> outputControlNames_;
//- Type of output
outputControls outputControl_;
@ -81,6 +85,9 @@ private:
//- Dumping counter for ocOutputTime
label outputTimeLastDump_;
//- Dump each deltaT (adjust Ttime)
scalar writeInterval_;
// Private Member Functions
@ -114,6 +121,24 @@ public:
//- Flag to indicate whether to output
bool output();
//- Return outputControl
outputControls outputControl()
{
return outputControl_;
}
//- Return writeInterval
scalar writeInterval()
{
return writeInterval_;
}
//- Return outputTimeLastDump
label outputTimeLastDump()
{
return outputTimeLastDump_;
}
};