Newer
Older
void Foam::Time::setTime(const Time& t)
{
value() = t.value();
dimensionedScalar::name() = t.dimensionedScalar::name();
timeIndex_ = t.timeIndex_;
fileHandler().setTime(*this);
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
}
void Foam::Time::setTime(const instant& inst, const label newIndex)
{
value() = inst.value();
dimensionedScalar::name() = inst.name();
timeIndex_ = newIndex;
IOdictionary timeDict
(
IOobject
(
"time",
timeName(),
"uniform",
*this,
IOobject::READ_IF_PRESENT,
IOobject::NO_WRITE,
false
)
);
timeDict.readIfPresent("deltaT", deltaT_);
timeDict.readIfPresent("deltaT0", deltaT0_);
timeDict.readIfPresent("index", timeIndex_);
fileHandler().setTime(*this);
}
void Foam::Time::setTime(const dimensionedScalar& newTime, const label newIndex)
{
setTime(newTime.value(), newIndex);
}
void Foam::Time::setTime(const scalar newTime, const label newIndex)
{
value() = newTime;
dimensionedScalar::name() = timeName(timeToUserTime(newTime));
timeIndex_ = newIndex;
fileHandler().setTime(*this);
}
void Foam::Time::setEndTime(const dimensionedScalar& endTime)
{
setEndTime(endTime.value());
}
void Foam::Time::setEndTime(const scalar endTime)
{
endTime_ = endTime;
}
Sergio Ferraris
committed
void Foam::Time::setDeltaT
(
const dimensionedScalar& deltaT,
Sergio Ferraris
committed
)
setDeltaT(deltaT.value(), adjust);
void Foam::Time::setDeltaT(const scalar deltaT, const bool adjust)
{
deltaT_ = deltaT;
deltaTchanged_ = true;
Sergio Ferraris
committed
Sergio Ferraris
committed
{
adjustDeltaT();
}
}
Foam::TimeState Foam::Time::subCycle(const label nSubCycles)
{
#ifdef FULLDEBUG
if (prevTimeState_)
{
FatalErrorInFunction
<< "previous time state already set" << nl
<< exit(FatalError);
}
#endif
prevTimeState_.reset(new TimeState(*this));
setTime(*this - deltaT(), (timeIndex() - 1)*nSubCycles);
deltaT_ /= nSubCycles;
deltaT0_ /= nSubCycles;
deltaTSave_ = deltaT0_;
return prevTimeState();
void Foam::Time::subCycleIndex(const label index)
{
// Only permit adjustment if sub-cycling was already active
// and if the index is valid (positive, non-zero).
// This avoids potential mixups for deleting.
if (subCycling_ && index > 0)
{
subCycling_ = index;
}
}
void Foam::Time::endSubCycle()
if (subCycling_)
{
TimeState::operator=(prevTimeState());
prevTimeState_.reset(nullptr);
}
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
Foam::Time& Foam::Time::operator+=(const dimensionedScalar& deltaT)
{
return operator+=(deltaT.value());
}
Foam::Time& Foam::Time::operator+=(const scalar deltaT)
{
setDeltaT(deltaT);
return operator++();
}
Foam::Time& Foam::Time::operator++()
{
deltaT0_ = deltaTSave_;
deltaTSave_ = deltaT_;
// Save old time value and name
const scalar oldTimeValue = timeToUserTime(value());
const word oldTimeName = dimensionedScalar::name();
// Increment time
setTime(value() + deltaT_, timeIndex_ + 1);
// If the time is very close to zero reset to zero
if (mag(value()) < 10*SMALL*deltaT_)
{
setTime(0.0, timeIndex_);
}
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
if (sigStopAtWriteNow_.active() || sigWriteNow_.active())
{
// A signal might have been sent on one processor only
// Reduce so all decide the same.
label flag = 0;
if (sigStopAtWriteNow_.active() && stopAt_ == saWriteNow)
{
flag += 1;
}
if (sigWriteNow_.active() && writeOnce_)
{
flag += 2;
}
reduce(flag, maxOp<label>());
if (flag & 1)
{
stopAt_ = saWriteNow;
}
if (flag & 2)
{
writeOnce_ = true;
}
}
Henry Weller
committed
writeTime_ = false;
case wcNone:
case wcUnknown:
break;
Henry Weller
committed
writeTime_ = !(timeIndex_ % label(writeInterval_));
case wcRunTime:
case wcAdjustableRunTime:
(
((value() - startTime_) + 0.5*deltaT_)
/ writeInterval_
);
Henry Weller
committed
if (writeIndex > writeTimeIndex_)
Henry Weller
committed
writeTime_ = true;
writeTimeIndex_ = writeIndex;
(
returnReduce(elapsedCpuTime(), maxOp<double>())
/ writeInterval_
);
Henry Weller
committed
if (writeIndex > writeTimeIndex_)
Henry Weller
committed
writeTime_ = true;
writeTimeIndex_ = writeIndex;
break;
case wcClockTime:
returnReduce(elapsedClockTime(), maxOp<double>())
/ writeInterval_
);
Henry Weller
committed
if (writeIndex > writeTimeIndex_)
Henry Weller
committed
writeTime_ = true;
writeTimeIndex_ = writeIndex;
// Check if endTime needs adjustment to stop at the next run()/end()
if (stopAt_ == saNoWriteNow)
{
endTime_ = value();
}
else if (stopAt_ == saWriteNow)
Henry Weller
committed
writeTime_ = true;
Henry Weller
committed
else if (stopAt_ == saNextWrite && writeTime_ == true)
Henry Weller
committed
// Override writeTime if one-shot writing
Henry Weller
committed
writeTime_ = true;
writeOnce_ = false;
}
// Adjust the precision of the time directory name if necessary
Henry Weller
committed
if (writeTime_)
{
// Tolerance used when testing time equivalence
max(min(pow(10.0, -precision_), 0.1*deltaT_), SMALL);
// User-time equivalent of deltaT
const scalar userDeltaT = timeToUserTime(deltaT_);
// Time value obtained by reading timeName
scalar timeNameValue = -VGREAT;
// Check that new time representation differs from old one
// reinterpretation of the word
if
(
readScalar(dimensionedScalar::name(), timeNameValue)
&& (mag(timeNameValue - oldTimeValue - userDeltaT) > timeTol)
)
{
int oldPrecision = precision_;
while
(
precision_ < maxPrecision_
&& readScalar(dimensionedScalar::name(), timeNameValue)
&& (mag(timeNameValue - oldTimeValue - userDeltaT) > timeTol)
)
{
precision_++;
setTime(value(), timeIndex());
}
if (precision_ != oldPrecision)
{
WarningInFunction
<< "Increased the timePrecision from " << oldPrecision
<< " to " << precision_
<< " to distinguish between timeNames at time "
<< dimensionedScalar::name()
<< endl;
if (precision_ == maxPrecision_)
{
// Reached maxPrecision limit
WarningInFunction
<< "Current time name " << dimensionedScalar::name()
<< nl
<< " The maximum time precision has been reached"
" which might result in overwriting previous"
" results."
<< endl;
}
// Check if round-off error caused time-reversal
scalar oldTimeNameValue = -VGREAT;
if
(
readScalar(oldTimeName, oldTimeNameValue)
&& (
sign(timeNameValue - oldTimeNameValue)
!= sign(deltaT_)
)
)
{
WarningInFunction
<< "Current time name " << dimensionedScalar::name()
<< " is set to an instance prior to the "
"previous one "
<< oldTimeName << nl
<< " This might result in temporal "
"discontinuities."
<< endl;
}
}
}
}