CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

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

    OpenFOAM
    3
    3
    773
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • win
      win 最后由 李东岳 编辑

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

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

      1 条回复 最后回复 回复 引用
      • 李东岳
        李东岳 管理员 最后由 编辑

        很多次好多人都问我一个具体函数是干什么用的,这种很难回答,因为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;
            }
        }
        

        CFD高性能服务器 http://dyfluid.com/servers.html
        2023年,线下CFD课,预热一下 http://dyfluid.com/class.html

        1 条回复 最后回复 回复 引用
        • 大
          大喵 最后由 编辑

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

          1 条回复 最后回复 回复 引用
          • First post
            Last post