工业仿真中,计算结果与物理试验之间的偏差通常由三部分构成:几何离散误差、数值求解误差和模型假设误差。网格与求解器直接决定了前两类误差的大小。单纯的网格加密并不能自动消除误差,如果网格单元扭曲严重或者求解器采用低阶格式,加密后数值扩散和迭代不收敛可能让结果更加不稳定。本文围绕网格划分与求解器参数协同优化展开,介绍从离散误差控制到收敛判据调整的完整流程。

网格质量是影响精度的第一道关口,而求解器离散格式决定了误差在迭代过程中的传递方式。
一、网格质量与离散误差的控制
有限体积法和有限元法都将连续域离散为有限个单元,离散误差与单元尺寸的幂次相关。对于二阶精度的空间离散,误差大致正比于单元尺寸的平方。也就是说,把全局网格尺寸减半,理论上截断误差会降到原来的四分之一。但这一规律只在网格质量满足基本要求时成立。长宽比过大、扭曲度过高或正交性差的单元,会使梯度计算出现较大偏差,甚至导致迭代发散。
工业模型中常见的四面体网格容易产生扭曲单元,而六面体网格虽然生成成本高,但在边界层和流动方向上的正交性更好。对于流体仿真,近壁区域的网格至关重要。第一层网格高度需要根据目标y+值计算,例如高雷诺数壁面函数通常要求y+在30到300之间,而低雷诺数模型需要y+接近1。第一层高度估算可依据壁面剪切应力反复修正,但更可靠的做法是先粗算再根据结果调整。下面的脚本可用来检查四面体单元的长宽比和扭曲度。
import numpy as np
def cell_quality(nodes):
# nodes: 4x3 array for tetra cell
edges = []
for i in range(1, 4):
edges.append(nodes[i] - nodes[0])
lengths = [np.linalg.norm(e) for e in edges]
aspect = max(lengths) / min(lengths)
vol = abs(np.dot(edges[0], np.cross(edges[1], edges[2]))) / 6.0
ideal_vol = (max(lengths) ** 3) / (6 * np.sqrt(2))
skew = 1.0 - vol / ideal_vol
return aspect, skew
# 示例:读取网格节点并批量检查
# quality_report = [cell_quality(cell_nodes) for cell_nodes in mesh.cells]
即使网格整体加密,如果边界层第一层高度没有相应调整,近壁面温度梯度和速度梯度的精度也不会明显改善。对于旋转机械或带细小间隙的模型,局部加密和网格自适应比全局加密更高效。网格自适应会根据初步解的误差估计自动细化高梯度区域,减少无效单元数量。
二、求解器离散格式与迭代精度
网格划分完成后,求解器采用的离散格式对精度影响同样显著。稳态对流问题中,一阶迎风格式无条件稳定,但会引入明显的数值扩散,使温度锋面和浓度锋面被抹平。二阶迎风格式能降低数值扩散,但解可能在间断附近出现非物理震荡。中心差分格式适合扩散占主导的流动,在纯对流或高雷诺数下容易发散。工程上常用混合格式或带限制器的高阶格式,例如linearUpwind与梯度限制器的组合。
瞬态问题的时间离散也不可忽视。隐式欧拉法一阶精度,时间步长过大时虽然稳定,但会把瞬态过程平滑化。Crank-Nicolson格式二阶精度,但大时间步长下可能产生振荡。对于工业传热和结构振动仿真,推荐先使用小时间步长获得稳定的初始场,再逐步增大步长并监控关键点的响应。下面是一个典型的OpenFOAM离散格式配置,其中对流项使用二阶迎风与梯度限制。
ddtSchemes
{
default backward;
}
gradSchemes
{
default Gauss linear;
}
divSchemes
{
default none;
div(phi,U) Gauss linearUpwind grad(U);
div(phi,k) Gauss upwind;
div(phi,omega) Gauss upwind;
div((nuEff*dev2(T(grad(U))))) Gauss linear;
}
laplacianSchemes
{
default Gauss linear corrected;
}
求解器迭代参数的调整同样影响精度。残差收敛标准设置过松,结果可能停留在远离真实解的伪稳态;设置过紧则需要大量迭代,产生舍入误差累积。稳态计算通常将速度、压力、湍流量的残差降到10的负4次方以下,而温度或组分方程建议降到10的负6次方以下。松弛因子过低会降低收敛速度,但过高可能引起震荡。一般先用较保守的松弛因子,再根据残差曲线逐渐增大。
三、误差评估与网格-求解器协同调优
判断仿真精度是否达标,不能只看残差曲线。残差下降只代表代数方程求解收敛,并不说明离散误差已经消除。需要做网格无关性验证:使用三套不同密度的网格,保持求解器设置不变,比较关键物理量。当细网格与中等网格之间的偏差小于中等网格与粗网格之间的偏差,且继续加密变化很小,就可以认为计算结果接近网格无关解。Richardson外推法可以估计离散误差和收敛阶数。
下面给出网格收敛指数GCI的计算脚本,它基于三套网格的结果评估误差带。f1、f2、f3分别代表细、中、粗网格上的目标变量,r为网格细化比,p为观测到的收敛阶数。
def gci(f1, f2, f3, r21, r32, p):
e21 = abs((f1 - f2) / f1)
e32 = abs((f2 - f3) / f2)
gci21 = 1.25 * e21 / (r21**p - 1)
gci32 = 1.25 * e32 / (r32**p - 1)
return gci21, gci32
# 示例:三套网格的出口温度,细化比为1.5
# temp_fine = 352.3; temp_medium = 351.1; temp_coarse = 348.7
# gci_fine, gci_medium = gci(temp_fine, temp_medium, temp_coarse, 1.5, 1.5, 2)
协同调优的核心思路是:先控制网格质量,再选择与网格分辨率匹配的离散格式,最后根据物理量收敛情况调整迭代参数。很多工程师先盲目加密网格,导致时间步长被迫减小,计算成本成倍上升。实际上,对于低速不可压缩流动,将全局网格加密20%同时把一阶迎风改为二阶迎风,往往比单独加密一倍网格更有效。对于应力集中问题,通过局部网格细化并保持高阶单元,可以同时兼顾精度和效率。
四、工程案例:换热器出口温度精度提升
在一个管壳式换热器的仿真中,初始模型使用四面体网格,平均y+约为80,湍流模型采用标准k-epsilon配合壁面函数,对流项使用一阶迎风。计算得到的壳程出口温度为361 K,而试验值为348 K,误差约3.7%。检查网格发现近壁第一层高度约为2 mm,导致壁面热通量被严重低估。
优化方案没有大幅加密全局网格,而是重新划分边界层网格,将第一层高度降至0.15 mm,使y+降到5左右,并改用增强壁面处理。同时把动量方程对流项切换为二阶迎风,能量方程残差判据收紧到10的负6次方。计算耗时仅增加约20%,但出口温度变为350.6 K,误差缩小到0.75%。继续做网格无关性验证,进一步加密边界层后出口温度变化小于0.2%,说明结果已经稳定。
该案例说明,工业仿真精度提升的瓶颈往往不是网格总数,而是网格分布与求解器格式的匹配。通过边界层网格修正和二阶格式配合,可以在较少计算资源下获得工程可接受的精度。建议在每次仿真前完成网格质量检查、y+估算和离散格式选择,并将这三项内容纳入仿真流程的标准步骤。