稳态求解器simpleFoam的迭代问题



  • 如果deltaT为1的话,不同于瞬态求解器,simpleFoam里的endTime是最大迭代次数,这样理解正确吗?
    下面的是我在模拟结束后从simpleFoam.log里提取的一段,如果Time=200是第200次迭代,那这里的No Iterations是指什么?
    顺便问一下ExecutionTimeClockTime的区别是什么?
    不好意思,刚接触CFD,问得都是小白问题。

    Time = 200
    
    smoothSolver:  Solving for Ux, Initial residual = 0.0006172735, Final residual = 3.130585e-05, No Iterations 3
    smoothSolver:  Solving for Uy, Initial residual = 0.0006120918, Final residual = 3.047995e-05, No Iterations 3
    smoothSolver:  Solving for Uz, Initial residual = 0.00992249, Final residual = 0.0005011013, No Iterations 3
    GAMG:  Solving for p, Initial residual = 0.0138261, Final residual = 0.0006013534, No Iterations 2
    GAMG:  Solving for p, Initial residual = 0.001282478, Final residual = 0.0001129397, No Iterations 2
    GAMG:  Solving for p, Initial residual = 0.0002430735, Final residual = 1.691212e-05, No Iterations 3
    time step continuity errors : sum local = 8.135033e-09, global = 8.232192e-10, cumulative = -4.119173e-06
    smoothSolver:  Solving for epsilon, Initial residual = 0.0003394608, Final residual = 2.162896e-05, No Iterations 3
    smoothSolver:  Solving for k, Initial residual = 0.004169046, Final residual = 0.0002986839, No Iterations 3
    ExecutionTime = 2357.53 s  ClockTime = 2430 s
    

  • 版主

    endTime 是对模拟时间的控制,如果时间步长是1的话,意味着要从0到200秒以时间间隔为1秒推进。

    No Iterations是在每一个时间步长里的内循环。意思是用SIMPLE的算法,对速度或者压力场进行迭代运算,如果某次迭代的残差小于你预设的残差,那么程序就认为在当前时间步长的某个物理量满足计算要求。

    至于ExecutionTimeClockTime,前者是CPU实际运算的时间,后者是现实中的时间。通常来讲前者非常逼近后者,但是如果有比较大的差距,可能是文件的读写占据了很多时间,或者共享的内存上同时运行别的程序。



  • 多谢多谢!我大概明白什么意思了。
    譬如在fvSolution中的速度场里,设定reTol为0.1,则当Final residualInitial residual的比小于等于0.1时,这个物理量在内循环中停止迭代。
    如果残差小于tolerance,则这个物理量无论是在内循化还是外循化都不再进行迭代计算。
    如果所有物理量的残差都满足residualControl中设定的值,则求解器停止计算,或者是超过endTime时求解器也停止计算。
    以上理解正确吗?

    再问一下,为什么会出现这个error: "time step continuity errors : sum local = 8.135033e-09, global = 8.232192e-10, cumulative = -4.119173e-06"
    对计算结果影响大吗?

        U
        {
    
            relTol		0.1;
    
            tolerance		1e-8;
    
            nSweeps		1;
    
            smoother		GaussSeidel;
    
            solver		smoothSolver;
    
        }
    
    SIMPLE
    {
    
        nNonOrthogonalCorrectors		2;
    
        residualControl
        {
    
            k		0.0001;
    
            U		0.0001;
    
            epsilon		0.0001;
    
            p		0.0001;
    
        }
    
    }
    

  • 版主

    先不考虑 endTime,这个是“宏观”上的控制。

    在每一个时间步长内,求解器都要进行迭代运算。进入一个新的时间点(timestep),就会有一个初始的残差,当在这个时间点运算结束之后,会产生一个新的残差(矩阵是通过迭代,比如 Gauss-Seidel 方法,而非消元,比如高斯消元或者Cramer’s rule 求解)。

    这个迭代运算何时终止,只要满足一下三个条件的任何一条:

    1. 低于预设残差 (the residual falls below the solver tolerance, tolerance;)
    2. 当前迭代所得残差与初始残差的比例小于预设相对残差 (the ratio of current to initial residuals falls below the solver relative tolerance, relTol;)
    3. 或者迭代次数超过预设 (the number of iterations exceeds a maximum number of iterations, maxIter;)

    一旦跳出迭代运算,程序就默认在当前时间点上计算收敛,然后继续在时间上推进。直到算到 endTime 为止。

    continuity error 和 div(phi)的计算有关。理想状态下,面通量(face flux)的散度应该是零,某种意义上的continuity概念。



  • 多谢大神的解释!
    关于time step continuity errors没太懂,等我补点基础知识再来讨教。

    不过不好意思,还有问题。瞬态求解和稳态求解的迭代运算有什么不同。
    之前看过一篇文章强调说"瞬态计算要求在每个时间步内达到收敛。若不能达到收敛,则迭代次数达到所设定的内迭代次数后进入下一个时间步,重新开启迭代计算。" 所以瞬态计算的残差监视图是锯齿状的。而稳态的曲线一般相对"平滑"。
    在苏伟军博客里看的有关simpleFoam的文章,他说"这里的endTime不再是求解结束时间,而是最大迭代次数有关的量(迭代次数=(endTime-startTime)/deltaT)。如果在设定的最大迭代次数内方程收敛,程序也会自动退出计算。"
    这些听起来好像稳态求解的内迭代没什么大关系。这让我有些困惑,稳态也要求在每个时间步内达到迭代吧,有什么不同呢?


  • 版主

    大神不敢当,我也是和你一样刚接触CFD的小白。

    不好意思对于 continuity error 的问题没能讲得很明白,这是因为我对这个问题没有理解到“代码”级别,不过很多时候,这个问题没有给我带来太多麻烦,所以就停留在这个地方。如果有熟悉这方面的朋友,还希望分享一下更好的见解。

    对于一个物理用瞬态求解还是稳态求解,也是一个很大的问题。可以说,我至今也没完全搞明白。不过最基本的区分,或许能帮助到你:

    1. 瞬态: 关注的对象是非常依赖时间的。pisoFoam 和 pimpleFoam 在此类。最好把时间上的离散用二阶以上精度。

    2. 稳态问题: 关注的物理量和时间无关。

    我在用大涡模拟的时候就用的是pisoFoam求解器。因为旋涡脱落过程中,有一个参量叫Strouhal数是我重点考察的一个对象之一。

    对于稳态计算,通常可以选择RNAS的湍流模型。一般来讲,时间步长要高于顺态求解,所以计算速度更快,计算消耗资源更小。

    个人理解,对于真实的物理世界,或多或少都和时间有关系。只是我们在研究问题的时候,关注点不一样,用不同的方法,高效地处理不同的问题。

    至于算法级别,归结到代码上的问题,实在无能为力。我也还在学习中。
    :sad:



  • @random_ran 能花时间写这么多已经很感谢了!
    我刚接触的CFD,其实本来不太纠结瞬态稳态问题,目前稳态求解对我要研究的东西够用的。只是这两天发现simpleFoam的每个时间步长里的所有物理量都有个No Iteration,突然困惑了,难道稳态也要每步都收敛?之前看过一些文章,一直理解为时间步长内收敛是瞬态特有的,现在又蒙了…


  • 版主

    @aufalpen No Iteration 是指稀疏矩阵求解的迭代次数,与稳态或非稳态无关。

    对于大型稀疏矩阵而言,直接求解成本太高,一般都是采用较快的迭代算法求解。

    可参考 Computational Methods for Fluid Dynamics - Joel H. Ferziger 第五章。



  • @wwzhao 那就是都一样的。如果用pimpleFoam是不是差别只在于deltaT需要计算,给一个合理的值,其他求解过程都一样?



  • @aufalpen稳态求解器simpleFoam的迭代问题 中说:

    如果用pimpleFoam是不是差别只在于deltaT需要计算,

    和谁的差别?delta t最好自行给定,在controlDict里面。

    关于你说的收敛,收敛非常多的定义,

    迭代也分为各种迭代。内迭代,外迭代,矩阵迭代,时间推进,迭代内的迭代,矩阵求解器的内迭代,非常多的迭代、各种迭代。CFD整个就是个迭代。因为直接求解很浪费资源。看得越深,迭代越多。对于simpleFoam,最基本的迭代,就是那个时间布推进,也就是SIMPLE算法的迭代。理解到这,初级阶段应该没问题。



  • @李东岳 CFD就是一部大片呗,迭中迭。simpleFoam就是第一部。
    我还是得多补点基础。多谢东岳指教!
    另外很感激你们翻译的openFoam用户手册。我只有一些高数和线性代数的基础,CFD从零开始直接看英文的手册,实在是很难懂在说什么。看了你们翻译过的,加上东岳流体的一些文章,才逐渐隐约看到了CFD的轮廓。
    路漫漫,不过有你们在,希望能坚持下去。



  • @aufalpen
    感谢支持,希望母语的资料能加快大家学习的进程。不提CFD应用,CFD理论对数学要求很高。在学习的过程中可以从一维单扩散问题开始。比较简单。

    加上对流之后,就涉及到一些格式带来的稳定性问题了。到后来速度压力耦合就涉及到SIMPLE之类。非常复杂。压力速度算法在上世纪八九十年代非常活跃。在21世纪处,转向了各种稳定性问题。基于SIMPLE算法下各种学科内部的稳定性至今依然是计算物理领域内比较热门的话题。

    可看看Journal of Computational Physics关注一下前沿,不需要细看。



  • @aufalpen 这个用户手册在哪可以下载?谢谢



  • @李东岳 十分感谢方向指引!我会继续努力!:sunglasses:



  • @yp http://dyfluid.com ,这里的内容很丰富。还有他们的公众号"CFD界",也值得关注。



  • @aufalpen 谢谢,公众号我早已经关注过了😄我去看看那个网页,多理解理解理论,还请多指教


登录后回复
 

与 CFD中文网 的连接断开,我们正在尝试重连,请耐心等待