FVM — CAE术语解说
FVM(有限体积法 / Finite Volume Method)
老师,在CFD教科书中FVM经常出现,它和FEM有什么不同呢?
FVM的理论基础
FVM的基本概念
FVM(有限体积法)和FEM(有限元法)根本上有什么不同?两种方法都使用网格,看起来很相似。
根本区别在于支配方程的处理方式。FVM考虑小的"控制体积"这样一个箱子,对该箱子应用物理量的保守律(质量、动量、能量的流入流出)的积分形式。例如,连续方程为
"保守性严格"具体有什么优势呢?是说数值误差不容易产生吗?
正是这样。特别是,在激波、剪切层、包含化学反应等有急剧变化的流动中,局部保守性的破坏会对整个解产生很大的误差。FVM通过计算控制体积界面处流动的通量(流量)平衡,所以即使在粗网格下,整个计算域的质量和动量总量也会在数值误差范围内保持保守。这就是为什么ANSYS Fluent、OpenFOAM等众多CFD求解器都采用FVM的主要原因。
在控制体积的"界面"处计算通量,那变量是定义在哪里呢?单元中心吗?
典型方法有"Collocated配置"和"Staggered配置"两种。Collocated配置中,压力、温度等标量量定义在控制体积的中心(单元中心)。而Staggered配置中,速度向量的每个分量定义在垂直于该方向的单元面位置。这样可以防止压力-速度耦合计算中出现的非物理振荡(棋盘式压力)。许多实用代码如Fluent的默认配置是Collocated,但采用了考虑Staggered思想的改进方法(Rhie-Chow插值)。
FVM的数值计算方法
离散化与求解器
FVM离散化时,"发散项"和"梯度项"具体怎么计算?教科书中提到"中心差分"和"迎风差分"。
通过相邻单元中心值对界面处的通量进行插值。例如,在单元i和j的界面处求标量φ,中心差分就是简单的平均
离散化后会产生大型线性方程组。怎么求解呢?直接法吗?
在非压缩流Navier-Stokes方程中,压力和速度的耦合是个问题。这里采用"SIMPLE算法"和"PISO算法"等迭代法。SIMPLE大概是说,从假定的速度场求出压力修正方程,然后反复修正速度和压力。而PISO是进行两次预测-修正,目的是更快收敛。定常计算用SIMPLE,非定常计算用PISO比较合适。这些算法名直接反映在OpenFOAM的`simpleFoam`和`pisoFoam`求解器的名称中。
压力修正方程本身是用什么求解器求解的?也是迭代法吗?
是的。压力修正方程离散化后是系数矩阵为对角优位的(有时非对称)大规模线性方程组。求解时多用迭代法如"共轭梯度法(CG)"或"几何多重网格法(GMG)"。特别是多重网格法,通过在不同粗细的网格上反复计算,可以高效减少低频误差,大幅加速收敛。ANSYS Fluent通常选择压力求解器为"Multigrid (FMG)",循环类型设为"V-Cycle"。
FVM的实务应用
网格与设置要点
FVM分析时网格质量需要注意什么?和FEM一样需要关注纵横比和扭曲角吗?
虽然有些方面与FEM相同,但FVM中"单元面正交性"非常重要。先前讨论的界面通量计算中,在求梯度时,如果单元中心和界面连线与面法线不平行,就需要非正交修正,会降低精度甚至导致不稳定。另外,在预期有急剧变化的区域,如翼尾缘或壁面附近,不仅要细化网格,还要"网格膨胀比"控制在1.2以下才能捕捉梯度。ANSYS Meshing中,目标是"Skewness"小于0.9,"Orthogonal Quality"大于0.1。
壁面处理中听说有"壁函数"和"低雷诺数模型",网格作法要怎么改变?
这是实务中最重要的判断之一。使用壁函数时,把第一个网格点放在无量纲壁距
计算前的初始条件和残差设置有什么窍门吗?
开始定常计算时,所有物理量应从一致的"平缓"值开始。比如内部流分析不要一开始就设入口速度10m/s,而是先从1m/s这样较小的值开始,计算几步让流场形成后,再逐步提高到目标值的"斜坡设置"很有效。残差收敛判定要比默认的1e-3更严格,以1e-4~1e-5为目标。另外不仅要看残差监视,还要确认出口质量流量、代表点的压力、速度值是否收敛到定常值。养成在Fluent的"Report Definitions"中设定监视点的习惯。
FVM软件比较
主要求解器的特性
FVM的代表性商用软件有ANSYS Fluent和STAR-CCM+,核心解法有区别吗?
两者都以FVM为核心,但在单元形状处理和压力-速度耦合解法上各有特点。Fluent主要采用"单元中心"求解器,对多面体或polyhedron网格很擅长,以SIMPLE系列算法为中心。而STAR-CCM+也可选"顶点基础"求解器,特别是对复杂形状的网格适应性据说更高。另外STAR-CCM+以"Segregated Flow"求解器为默认,融合了SIMPLE和PISO,非定常计算也相对稳定。在用户界面方面,STAR-CCM+宣传在单一环境中进行全部前处理、求解、后处理的"一体化环境"。
开源的OpenFOAM怎样?听说相比商用软件有更多解法选择。
这是对的,OpenFOAM的最大优势是解法和离散格式选项的丰富,以及源代码能直接查看。光从压力-速度耦合来看,就有`simpleFoam`、`pisoFoam`、`pimpleFoam`(SIMPLE和PISO的混合)等,可根据问题选择。离散格式从`Gauss linear`(中心差分)到`Gauss upwind`、`Gauss limitedLinear 1.0`(TVD格式)都能细致设定。但缺点是GUI弱,需要直接编辑配置文件(`fvSchemes`、`fvSolution`),学习难度较高。产业界在研发和自定义物理模型实现中广泛使用,学界在教育和基础研究中也很常用。
Autodesk CFD和Siemens Simcenter FLOEFD这样紧密结合CAD的软件也是FVM吗?
是的,两者都以FVM为基础。特别是Simcenter FLOEFD(原Flomerics)以"直角笛卡尔网格"为主,有"自适应网格"可自动与CAD形状吻合的特点。这样从复杂CAD数据生成网格非常快,适合设计初期的参数研究。Autodesk CFD也采用类似方法。但这些求解器在边界层、复杂分离流等高级乱流现象的精度方面,据说不如Fluent或STAR-CCM+这样的专业CFD求解器。要根据用途来区别使用。
FVM故障排查
常见错误与对策
计算中出现"残差发散"错误。首先应该怀疑什么原因?有什么对策?
首先怀疑"网格质量"和"初始、边界条件"。具体来说,(1)网格扭曲是否过大(Skewness > 0.95),(2)网格是否极端细长(Aspect Ratio > 100),(3)壁面第一层网格高度是否合适(y+值)。其次检查边界条件,特别是压力出口条件是否恰当。内部流中全是"压力出口"的话容易破坏质量守恒。对策是临时将所有离散格式降为一阶迎风差分,缓和系数调小(比如0.2)重新计算,等流场形成后再恢复高阶精度的"欠松弛"。
出现"浮点异常"或"NaN (Not a Number)"错误怎么办?
这是零除法、负平方根,或变量变成异常值(如密度、温度为负)时发生的。原因通常是(1)极端差的网格(单元体积为零或负),(2)不合理的物性值(如理想气体中出现负绝对温度),(3)过大的时间步(库朗数 > 数百)。这在OpenFOAM中比较常见。对策是先用`checkMesh`彻底检查网格,用`potentialFoam`生成平缓的初始场。还是不行的话,极端减小时间步,或在`fvSolution`的`solvers`部分放宽求解器的容差。
计算好像收敛了,但结果物理上明显有问题(比如流向反了)。原因是什么?
很可能陷入了"虚假收敛"或"局部解"。一个原因是边界条件设置错误。比如入口和出口是否搞反了,壁面条件是否变成了"滑移"。另一个原因是离散格式和网格不匹配。比如对强流向用中心差分会产生数值振荡,导致非物理结果。对策是先用一阶迎风差分计算得到正确的大致流场,然后以该结果为初值用高阶精度格式重新计算。或者把残差收敛标准设得更严格,如1e-6重新计算。
非定常计算时,时间步太小计算根本进不了。怎样确定合适的时间步?
非定常计算的时间步按"库朗数"或"傅里叶数"来确定。特别是流动为主的情况下,库朗数
相关主题
更详细
错误