mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
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:
@ -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
|
||||
(
|
||||
|
||||
@ -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&);
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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_;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user