在做Fluent仿真时,很多同学会注意到单精度(Single Precision)和双精度(Double Precision)的选项。大部分同学肯定就直接选择双精度了,觉得计算更精确一些。
当然这种说法没问题,但是总是感觉不够清晰,今天我们来详细说一说两者到底有什么区别
先说结论:大部分情况下单精度和双精度的区别很小。但是有一些特殊情况只能使用双精度。
怎么选择呢?直接无脑选择双精度就可以了,不需要想那么多。
1.双精度和单精度的区别
1.1 数学上的区别
在 Fluent 中,单精度和双精度的区别在于 浮点数所占用的位数不同:
单精度
使用 32 位(4 字节)存储一个浮点数。
有效数字大约 6~7 位十进制。
例如:3.14159265358979 在单精度下会被存储为大约 3.141593。
双精度
使用 64 位(8 字节)存储一个浮点数。
有效数字大约 15~16 位十进制。
同样的数 3.14159265358979 在双精度下几乎不会丢失有效位。
1.2 在 Fluent 计算中的表现
单精度可能产生的误差
当几何或物理量的尺度差异很大时,小数部分容易被舍入。
双精度的优势
能处理更小的量级差异和更长的迭代累积计算。
在化学反应、声学模拟、多相流等小量级效应显著的问题中,双精度可避免误差积累导致的数值发散。
同时双精度可以将残差降到很低,比如在单精度下,残差可能卡在 1e-5 附近不下降,因为再往下已经超出了有效数字精度;换成双精度,残差可以继续收敛到 1e-7 甚至更低。
2.单双精度计算的优缺点
单精度和双精度的优缺点可以用下面的表格表述
3.单精度不适用的情况
Fluent帮助文档给了我们一些建议,对于大多数情况,单精度求解器已经能够提供足够的精度
但在某些类型的问题中,使用双精度版本可能更有优势。比如
3.1 几何尺度差异很大
如果模型几何中存在差异极大的特征尺寸(例如一根非常细长的管子),单精度计算可能不足以保证精度。
比如我们要模拟一个微通道换热器:
总长度:L = 1.0 m
通道宽度:W = 50 μm
长宽比:L/W = 20,000:1
对于坐标 x = 0.9999995 m 的点,单精度只能表示为 x ≈ 1.000000 m,5 μm 的差异被舍入误差"吃掉"了
注:即便用单精度版本,几何坐标依然是双精度存储的,所以不用担心几何精度丢失。
3.2 存在多个腔体并通过细管连接
如果几何中包含多个腔体,并通过小直径管道相连(如汽车进气歧管),那么除了一个参考区域外,其他区域的平均压力水平都可能非常大(因为全局只能设置一个参考压力点)。
此时,驱动流动的压力差通常比绝对压力水平小得多,因此可能需要双精度计算来分辨这些微小的压力差。
3.3 高热导率比或高长宽比网格的共轭传热问题
在涉及高热导率比或高长宽比网格的共轭传热问题中,由于边界信息传递效率不高所致,使用单精度可能导致收敛性或计算精度下降。
比如电子芯片散热器共轭传热分析
在一块功率芯片上,芯片材料(如硅,热导率约 150 W/m·K)通过导热硅脂(热导率仅 1~5 W/m·K)与散热器(铝合金,热导率约 200 W/m·K)接触,最终将热量传到冷却空气中。
芯片厚度仅 0.5 mm,而散热器厚度可能有 5 cm,形成 高长宽比网格。同时材料热导率差异巨大。
在界面处,热流密度和温度梯度差异极大。单精度可能会在传递边界温度和热流时丢失小量,导致局部温度场“跳动”或收敛困难。结果表现为:残差震荡、温度分布不平滑,甚至解发散。
3.4 采用群体平衡模型PBM的多相流问题
在多相流模拟中,如果使用群体平衡模型来求解颗粒粒径分布,那么统计矩的数值可能会跨越多个数量级。
在这种情况下,双精度能更好地保证结果精度。
4.在Fluent中的实战对比
以Chpater129为例,完全相同的设置,我们再使用单精度计算一次。
单精度残差
双精度残差
单精度结果
双精度结果
单精度结果
双精度结果
我们会发现两者的残差明显不同,双精度残差可以达到1e-6,而单精度只能达到1e-4
但两者的计算结果几乎没有区别,正如帮助文档所说,大部分情况下两者的区别确实很小。
但是总有一些情况是只适合双精度的。也就是说,双精度肯定可以,单精度大部分情况可以。
5.常规的计算流程建议
前面说了,大部分情况下单精度和双精度的区别很小。但是有一些特殊情况只能使用双精度。那么我们到底选择单精度还是双精度呢?
我觉得大部分情况下,直接无脑选择双精度就可以了,不需要想那么多。
至于什么计算速度或者内存之类的问题,反正是电脑算,又累不着我们。
当然如果想要更精确同时还要快速的计算,也可以考虑:
前期收敛用单精度:快速得到一个接近真实的流场分布。
后期切换为双精度:提高计算精度,消除舍入误差,让结果更可靠。
相当于把单精度的计算结果当成双精度的初始值。这样既能节省时间,又能保证最终结果的准确性。
但是似乎还有一种情况:使用双精度收敛性很差,甚至难以收敛,使用单精度反而收敛性变好了。不知道是什么原因!