Skip to content
Snippets Groups Projects
Time.C 33 KiB
Newer Older
  • Learn to ignore specific revisions
  • void Foam::Time::setTime(const Time& t)
    {
        value() = t.value();
        dimensionedScalar::name() = t.dimensionedScalar::name();
        timeIndex_ = t.timeIndex_;
    
    }
    
    
    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_);
    
    }
    
    
    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;
    
    }
    
    
    void Foam::Time::setEndTime(const dimensionedScalar& endTime)
    {
        setEndTime(endTime.value());
    }
    
    
    void Foam::Time::setEndTime(const scalar endTime)
    {
        endTime_ = endTime;
    }
    
    
    
    void Foam::Time::setDeltaT
    (
        const dimensionedScalar& deltaT,
    
        setDeltaT(deltaT.value(), adjust);
    
    void Foam::Time::setDeltaT(const scalar deltaT, const bool adjust)
    
    {
        deltaT_ = deltaT;
        deltaTchanged_ = true;
    
    }
    
    
    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_;
    
    
    Mark OLESEN's avatar
    Mark OLESEN committed
        subCycling_ = nSubCycles;
    
    
    Mark OLESEN's avatar
    Mark OLESEN committed
    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;
        }
    }
    
    
    
        if (subCycling_)
        {
            TimeState::operator=(prevTimeState());
    
            prevTimeState_.reset(nullptr);
    
    Mark OLESEN's avatar
    Mark OLESEN committed
    
        subCycling_ = 0;
    
    }
    
    
    // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
    
    Foam::Time& Foam::Time::operator+=(const dimensionedScalar& deltaT)
    {
        return operator+=(deltaT.value());
    }
    
    
    Foam::Time& Foam::Time::operator+=(const scalar deltaT)
    {
        setDeltaT(deltaT);
    
    }
    
    
    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();
    
    
        setTime(value() + deltaT_, timeIndex_ + 1);
    
    
        if (!subCycling_)
    
            // If the time is very close to zero reset to zero
            if (mag(value()) < 10*SMALL*deltaT_)
            {
                setTime(0.0, timeIndex_);
            }
    
            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;
                }
            }
    
    
            switch (writeControl_)
    
                case wcNone:
                case wcUnknown:
                break;
    
    
                case wcTimeStep:
    
                    writeTime_ = !(timeIndex_ % label(writeInterval_));
    
                case wcRunTime:
                case wcAdjustableRunTime:
    
    Mark OLESEN's avatar
    Mark OLESEN committed
                    const label writeIndex = label
    
                    (
                        ((value() - startTime_) + 0.5*deltaT_)
                      / writeInterval_
                    );
    
    
                        writeTime_ = true;
                        writeTimeIndex_ = writeIndex;
    
                case wcCpuTime:
    
    Mark OLESEN's avatar
    Mark OLESEN committed
                    const label writeIndex = label
    
                    (
                        returnReduce(elapsedCpuTime(), maxOp<double>())
                      / writeInterval_
                    );
    
                        writeTime_ = true;
                        writeTimeIndex_ = writeIndex;
    
    Mark OLESEN's avatar
    Mark OLESEN committed
                    const label writeIndex = label
    
                        returnReduce(elapsedClockTime(), maxOp<double>())
    
                        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)
    
                    endTime_ = value();
    
                else if (stopAt_ == saNextWrite && writeTime_ == true)
    
                    endTime_ = value();
    
            // Override writeTime if one-shot writing
    
            // Adjust the precision of the time directory name if necessary
    
            {
                // Tolerance used when testing time equivalence
    
                const scalar timeTol =
    
                    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)
                    {
    
                            << "Increased the timePrecision from " << oldPrecision
                            << " to " << precision_
                            << " to distinguish between timeNames at time "
                            << dimensionedScalar::name()
                            << endl;
    
                        if (precision_ == maxPrecision_)
                        {
                            // Reached maxPrecision limit
    
                                << "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_)
                            )
                        )
                        {
    
                                << "Current time name " << dimensionedScalar::name()
                                << " is set to an instance prior to the "
                                   "previous one "
                                << oldTimeName << nl
                                << "    This might result in temporal "
                                   "discontinuities."
                                << endl;
                        }
                    }
                }
            }
    
        }
    
        return *this;
    }
    
    
    Foam::Time& Foam::Time::operator++(int)
    {
        return operator++();
    }
    
    
    // ************************************************************************* //