在流体的江湖里有这样一个传说:做仿真的除了自己信,谁都不信。很多粉丝朋友也很苦恼,吭哧吭哧仿真了半天,结果摸着自己的头,却陷入了茫然,这结果准吗?于是怀着忐忑的心情去与实验结果进行对比,结果自然是几家欢喜几家愁,相信很多粉丝是愁云满面的。那么我们今天就来扒一扒仿真误差到底有哪些来源,以及如何制定最小化误差的策略。
CFD计算结果的精度受不同误差类型的影响。通过了解每种错误类型的原因,可以开发最佳实践来最小化误差。网格在最小化误差方面起着重要的作用.在上一篇“怎样才算是好网格”中已经做了详细介绍,可参看上篇文作系统了解。
主要内容
•五种不同类型误差
•最小化误差的策略
另外:在进行CFD模型时,应考虑工作的目的:
•结果将用于什么?
•需要多高的精确度?
五种误差类型
有几个不同的因素共同影响整体仿真的精度。
按数量级从高到低如下:
• Round-off errors(舍入误差)– 与计算机运算精度相关的舍入误差
• Iteration errors(迭代误差)– 迭代“n”次的解与最终收敛解之间的误差
• Discretization Error errors(离散误差)–当前使用网格的收敛解与模型方程精确解的误差
–l‘Exact’ solution:精确解 à无限密网格的解
• Model errors(模型误差)– 模型方程的“精确”解(‘Exact’ solution)与真实解的误差(实验数据或解析解)
• Systematic Errors(系统误差)- 即使模型误差和数值误差都降低到一定水平,系统误差也会导致解的精度降低。
由机器舍入而引起的解的不准确性
引起误差的原因包括:
•高纵横比
•长度尺度上存在较大差异
•变量值存在较大变化范围
如何确定舍入错误是一个问题:
•如果 case 遇到上述三点原因(标准),以 double precision 进行计算
•将计算结果与单精度计算结果进行比较
•如果重要变量(目标变量)单/双精度模拟结果不同,则后续计算应使用双精度
•要检查迭代误差,首先要定义您的目标变量(targetvariables)
例如:
–Head rise(扬程)
–Efficiency(效率)
–Mass flow rate(质量流率)
•选择残差的收敛标准
•求解迭代时监测并绘制目标变量的变化曲线
•选择另一个更严格的残差收敛标准并继续迭代
•不断重复,直到目标变量曲线显示其不再变化为止
–这样我们就可以知道残差设定为多少,才能确保不会遇到迭代误差
•这样操作时,残差最好是单调递减的,虽然不可能始终如此(因此残差不是判断收敛的唯一标准)
•最后,在每个收敛水平上,都务必检查质量和能量平衡的通量报告
最佳实践:Iteration Error Example: 2D 压缩机叶栅
无论下列哪种离散方法都不可避免存在一定误差
•Finitevolume methods(有限体积法)
•Finiteelement methods(有限元法)
•Finitedifference methods(有限差分法)
给定网格上的解与无限精细网格上的“精确”解之间的差异称为“离散误差”
无限网格不可实现 à离散误差估计(网格无关性检查的必要性,高阶精度的选择等)
离散误差估计
由此最佳实践可以得出在网格无限密不可实现的前提下,避免离散误差的方法主要为细化网格(做网格无关性研究),以及采用更高阶的离散格式。
(经验)数学模型的不足:
•基本方程(Euler vs. RANS, steady-state vs. unsteady-state, …)
•Turbulencemodels(湍流模型)
•Combustionmodels(燃烧模型)
•Multiphaseflow models(多相流模型)
我们计算所用的模型无论是理论模型,还是半理论半经验模型,都是做了一定假设或者基于经验的,本身就存在一定的误差。
由于模型误差,即使在所有数值误差都变得无关紧要之后,实验数据和计算之间仍然可能存在差异!
因此合适的物理模型选择非常重要
模型误差:冲击射流
即使模型误差和数值误差都降低到一定水平,系统误差也会导致解的精度降低。系统误差仍然可能导致结果差异。
系统误差的可能原因:
(1)系统误差可能由几何模型的近似值所导致,就像我们在下图中看到的那样,其中几何表面的一些细节被网格忽略掉了,
(2)也可能是由于只对某个组件进行建模,而没有对更大范围的组件(系统)进行建模所导致,
(3)也可能是由于边界条件或流体及材料属性的不确定性所导致的。
注:最大限度减少系统误差的最有效方法是真正了解应用和物理性质。
看右边的图片,我们可能会认为网格肯定有问题,因为部分细节丢失了,但这取决于应用,这可能对结果有一些影响。如果了解了工程应用及物理性质,那我们就会知道需要什么程度的几何细节。
就系统误差而言,最好是记录和证明所做出的任何假设,如果有不确定的内容,则需要执行不确定性分析,才能判断假设的正确与否。
减少仿真误差
误差虽然无法完全消除,但可以尽可能减少。实际工作中,提升仿真的精度不可能一蹴而就,需要一定时间的经验积累。
如果从零开始做仿真,提高仿真精度会经历以下阶段:
(1)能够得到结果,速度、压力、温度等物理量大趋势正确
(2)根据实验数据和相关科学理论总结出较合适的仿真方法,并固化成标准化文档
(3)考虑更多影响因素,减少简化假设,进一步提升仿真精度
我推荐你用一些简单方法估计误差范围,在仿真的过程中“顺手”找误差范围。你没有必要为了找误差范围,专门算很多仿真算例,你只需要做个有心人,把你的仿真过程认真看一看。
很多算例会有零点,理论上应该是0,但是仿真会算出个小小的数值,这个数值就体现了你的仿真误差大小。
例如:一个水平的流动,理论上垂直方向的作用力应该是0,但是你的计算结果,在垂直方向有1牛顿的作用力,1牛顿是力的基本误差。代表着这个仿真的误差很难小于1牛顿。这个软件和这套算法和这套网格的最小误差大约是1牛顿的量级。
知道基本误差,你就知道了这套仿真的局限性。如果你用这套仿真做优化设计,减小了1牛顿的力,这个优化结果很可能只是个误差,不值一提。
算例中除了零点还有标准点,标准点上的值与理论值的偏差,就是仿真的系统误差。
例如:物体正对来流的点,这个点的压力的理论值,就是来流的滞止压力。你把这个点的压力写出来,发现比滞止压力小了5%。可以猜出来这套仿真的受力偏小5%。
例如:物体做自由落体运动的时刻,加速度应该是重力加速度。你把计算结果写出来,发现加速度比重力加速度大了10%。可以猜测其他时刻的加速度也偏大10%。
这种差别往往不是随机变化,总是偏小或者偏大,代表了这套仿真的系统误差的范围。
记住这个误差的范围,你就知道了你的仿真结果大概率地是偏小或者偏大了多少。
仿真有个漫长的计算过程,在这个过程中,数据如同股市的曲线,混乱地上上下下波动。看到这些波动范围越来越小,我们说,仿真收敛了,这个时候的波动范围就是仿真的波动误差。
例如:仿真收敛前100步,速度在99~101的范围波动,速度的波动误差范围就是2%。
记住这个波动误差范围,你写报告的时候,可以明确地说,由于时间有限,仿真的计算收敛不够充分,可能带来的误差不超过2%。
常用的方法是对比不同模型的计算结果,相差多少就是误差范围。
这个方法不靠谱,即使你保持网格不变、边界不变,只换个模型,带来的变化也不一定是模型误差。也许模型的差异被网格磨灭了,或者模型放大了边界的影响而产生差异。这个方法看起来很合理,往往获得很不合理的误差范围。
有一个简单办法,查找文献。你不可能从文献中找到一个准确的模型,但是你可以对比这些“不太准确”的模型。
这些“不太准确”之间的差异,就是模型误差的范围。
没有必要把网格加密后看结果有没有变化,这种网格无关性分析方法很可能没有抓住网格的相关性。
你在做仿真过程中会做不同形式的网格,即使网格总数没有变化,网格形式变化带来的误差更真实。
例如:一百万的非结构网格对比一百万的结构化网格,一百万头部密集网格对比一百万尾部密集网格,它们之间的差异就是网格误差范围。
以上这些方法可能只发现了比较小的误差范围,万一出现特别大的误差怎么办?如何快速找到最大误差范围?
用有、无之间的差异找到最大误差:
湍流模型的最大误差 < 湍流与层流之间的差异
壁面网格的最大误差 < 壁面无粘与有粘之间的差异
边界的最大误差 < 无穷远与附近边界之间的差异
知道最大的误差能大到什么程度,你就可以对仿真结果放心了。
其实,估计误差范围很简单。同一个仿真,你在调试计算过程中,改来改去,发现某些数总在一个范围变化,这个变化范围差不多就是误差范围。
但是,很多初入行的人在这个过程中被吓死了。在调试仿真的过程中发现,改一个设置、改一点网格,结果数据就会成倍地增加、成倍地减小。仿真结果和试验不一致,和别人的仿真也不一致,误差大得不可思议。
出现这种情况和基本误差、系统误差、波动误差、模型误差、网格误差,和所有的误差都没有关系,就是出错了,而且是出了很低级的错误。
只有当你的计算结果比较固定,而且与试验、与别人的结果大致一样,你才有资格讨论误差,否则你只能讨论错误。
误差:当你消除了低级错误,与各种来源的数据都接近,这点似是而非的差异,就是误差范围。
防止出现低级错误,就可以保证你的仿真结果基本可用。
没有必要专门分析仿真误差,留意仿真过程中随机产生的各种差异,就是真实的误差范围。
误差不会破坏你的设计,错误才会。
来源:LEVEL电池热管理技术