关于OpenFOAM里simple.loop()的咨询



  • c6091247-02d9-44bb-be96-ea43d883446e-image.png

    我有ABC三个程序,想写在同一个程序里,分别用simple.loop(),计算完A在计算B,最后计算 C。但是当A计算完收敛时,B,C就没有进行计算,我想请教一下simple.loop()会返回一个什么值,有什么办法可以对B,C也进行计算。



  • 很多次好多人都问我一个具体函数是干什么用的,这种很难回答,因为OpenFOAM这面很多函数都是各种嵌套,要摸到底要翻个底朝天,比如这就是我对你的simple.loop(runTime)摸底找出来的函数,你自己总结下,主要就是收敛了之后,就设定一个截止时间,返回false了。

    另外,你这种,不如自己写一个while循环或者for循环更合适

    simpleControl.C->time.loop();

    bool Foam::simpleControl::loop(Time& time)
    {
        read();
    
        if (!endIfConverged(time))
        {
            storePrevIterFields();
        }
    
        return time.loop();
    }
    

    Time.C->loop();

    bool Foam::Time::loop()
    {
        bool running = run();
    
        if (running)
        {
            operator++();
        }
    
        return running;
    }
    

    Time.C->run();

    bool Foam::Time::run() const
    {
        bool running = this->running();
    
        if (!subCycling_)
        {
            if (!running && timeIndex_ != startTimeIndex_)
            {
                functionObjects_.execute();
                functionObjects_.end();
            }
        }
    
        if (running)
        {
            if (!subCycling_)
            {
                const_cast<Time&>(*this).readModifiedObjects();
    
                if (timeIndex_ == startTimeIndex_)
                {
                    functionObjects_.start();
                }
                else
                {
                    functionObjects_.execute();
                }
            }
    
            // Re-evaluate if running in case a function object has changed things
            running = this->running();
        }
    
        return running;
    }
    

    Time.C->running();

    bool Foam::Time::running() const
    {
        return value() < (endTime_ - 0.5*deltaT_);
    }
    

    Time.C->setTime;

    void Foam::Time::setTime(const Time& t)
    {
        value() = t.value();
    }
    

    convergenceControl.C->endIfConverged;

    bool Foam::convergenceControl::endIfConverged(Time& time)
    {
        if (converged())
        {
            if (time.writeTime())
            {
                time.stopAt(Time::stopAtControl::noWriteNow);
                time.setEndTime(time);
            }
            else
            {
                time.writeAndEnd();
            }
    
            return true;
        }
        else
        {
            return false;
        }
    }
    


  • 你好,请问这个问题你解决了吗?我也遇到类似问题。如果A程序是稳态问题,B程序是瞬态问题。而且AB还要循环多次求解。请问这个问题该如何解决呢?


Log in to reply
 

CFD中文网 2016 - 2020 | 京ICP备15017992号-2