FVM — CAE术语解说

分类:术语集 | 2026-01-15
CAE visualization for fvm - technical simulation diagram

FVM(有限体积法 / Finite Volume Method)

🧑‍🎓

老师,在CFD教科书中FVM经常出现,它和FEM有什么不同呢?

FVM的理论基础

FVM的基本概念

🧑‍🎓

FVM(有限体积法)和FEM(有限元法)根本上有什么不同?两种方法都使用网格,看起来很相似。

🎓

根本区别在于支配方程的处理方式。FVM考虑小的"控制体积"这样一个箱子,对该箱子应用物理量的保守律(质量、动量、能量的流入流出)的积分形式。例如,连续方程为

$$ \frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \vec{v}) = 0 $$
但FVM是对控制体积V进行积分,用发散定理转化为面积分:
$$ \frac{\partial}{\partial t} \int_V \rho dV + \oint_{\partial V} \rho \vec{v} \cdot \vec{n} dA = 0 $$
这样物理保守性在网格层面就能严格保持,这是最大的特点。

🧑‍🎓

"保守性严格"具体有什么优势呢?是说数值误差不容易产生吗?

🎓

正是这样。特别是,在激波、剪切层、包含化学反应等有急剧变化的流动中,局部保守性的破坏会对整个解产生很大的误差。FVM通过计算控制体积界面处流动的通量(流量)平衡,所以即使在粗网格下,整个计算域的质量和动量总量也会在数值误差范围内保持保守。这就是为什么ANSYS Fluent、OpenFOAM等众多CFD求解器都采用FVM的主要原因。

🧑‍🎓

在控制体积的"界面"处计算通量,那变量是定义在哪里呢?单元中心吗?

🎓

典型方法有"Collocated配置"和"Staggered配置"两种。Collocated配置中,压力、温度等标量量定义在控制体积的中心(单元中心)。而Staggered配置中,速度向量的每个分量定义在垂直于该方向的单元面位置。这样可以防止压力-速度耦合计算中出现的非物理振荡(棋盘式压力)。许多实用代码如Fluent的默认配置是Collocated,但采用了考虑Staggered思想的改进方法(Rhie-Chow插值)。

FVM的数值计算方法

离散化与求解器

🧑‍🎓

FVM离散化时,"发散项"和"梯度项"具体怎么计算?教科书中提到"中心差分"和"迎风差分"。

🎓

通过相邻单元中心值对界面处的通量进行插值。例如,在单元i和j的界面处求标量φ,中心差分就是简单的平均

$$ \phi_f = \frac{1}{2} (\phi_i + \phi_j) $$
但如果不考虑流动方向,会出现数值不稳定。所以对流项通常采用迎风差分。一阶迎风是
$$ \phi_f = \begin{cases} \phi_i & (\vec{v} \cdot \vec{n} \ge 0) \\ \phi_j & (\vec{v} \cdot \vec{n} < 0) \end{cases} $$
实务中常用高精度且稳定的"二阶迎风差分"或"QUICK格式"。Fluent推荐默认使用"Second Order Upwind"。

🧑‍🎓

离散化后会产生大型线性方程组。怎么求解呢?直接法吗?

🎓

在非压缩流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。

🧑‍🎓

壁面处理中听说有"壁函数"和"低雷诺数模型",网格作法要怎么改变?

🎓

这是实务中最重要的判断之一。使用壁函数时,把第一个网格点放在无量纲壁距

$$ y^+ $$
为30~300的范围(特别是对数律区域)。比如流速10m/s的空气流,第一个网格高度大约是0.1mm~1mm。而采用低雷诺数模型(直接分辨粘性底层)的话,需要
$$ y^+ \approx 1 $$
,网格高度要0.01mm以下,计算成本急剧增加。要精确捕捉分离和转移的话用后者,但许多工业乱流计算从成本和精度的平衡考虑,用标准壁函数。

🧑‍🎓

计算前的初始条件和残差设置有什么窍门吗?

🎓

开始定常计算时,所有物理量应从一致的"平缓"值开始。比如内部流分析不要一开始就设入口速度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重新计算。

🧑‍🎓

非定常计算时,时间步太小计算根本进不了。怎样确定合适的时间步?

🎓

非定常计算的时间步按"库朗数"或"傅里叶数"来确定。特别是流动为主的情况下,库朗数

$$ C = \frac{u \Delta t}{\Delta x} $$
是个参考。这里u是代表速度,Δx是最小单元尺度。多数情况下选择库朗数不超过1的时间步Δt。比如流速10m/s、最小单元宽0.001m的话,Δt < 0.0001秒是目安。而扩散主导的现象(热传导等)则用傅里叶数作标准。STAR-CCM+等有"自动时间步控制"功能,指定库朗数后自动调整,这样很高效。

本文的评价
感谢您的回答!
有帮助
希望
更详细
报告
错误
有帮助
0
希望更详细
0
报告错误
0
由 NovaSolver Contributors 撰写
匿名工程师 & AI — 网站地图
查看个人资料