自适应网格加密(AMR)
理论:只在需要处加密
概述
我想做液滴落到水面上的CFD,但要细致表示界面,网格就要几千万个。
因为界面只是计算域的一小部分,你却让全域同样细。AMR在计算过程中观察解,只在界面、激波这类数值急剧变化处分割网格,没发生变化的地方保持粗网格。界面移动时加密区域也随之移动。用得好,同样精度下把网格数减少一个数量级以上并不罕见。但要注意决定在哪里加密的“指标”的选择,以及粗细网格交界的处理。
加密指标
$h_i$ 为单元尺寸,二阶导数为解的弯曲程度。线性插值误差约为 $h^2$ 与曲率之积,所以这个值大的单元就分割,足够小的就合并变粗。实际求解器按问题选择指标,如梯度大小、体积分数(界面)、涡量等。
对时间步长的影响
显式格式中时间步长由最小单元决定。AMR每加密一级,单元尺寸减半,时间步长也减半。使用只让细单元以小步长推进的“局部时间步”(子循环),可抑制总计算时间。
始于天体物理与激波
AMR的思想形成于20世纪80年代,Berger和Oliger为双曲型方程(处理激波等波动的方程)提出了叠加细网格块的方法,Berger和Colella又将其扩展到激波计算。它在天体物理计算中尤其有用,如恒星爆炸、星系形成这类广阔空间中只有小区域剧烈变化的问题。如今它已成为商业CFD软件中处理自由表面流、燃烧、射流等的常规功能。
算例:表示陡峭锋面所需单元数
在区间[0, 1]上用单元内线性插值表示陡峭锋面 $u = \tanh((x-0.5)/w)$。比较均匀网格与只把误差大的单元二分的方法(AMR)使最大误差降到阈值以下所需的单元数。
| 锋面宽度 | 允许误差 | 均匀网格 | AMR | 比值 | 最小单元 |
|---|---|---|---|---|---|
| 0.01 | 1% | 317 | 26 | 12 | 0.0020 |
| 0.01 | 0.1% | 992 | 56 | 18 | 0.0010 |
| 0.002 | 1% | 1,545 | 30 | 52 | 0.00049 |
| 0.002 | 0.1% | 5,009 | 70 | 72 | 0.00012 |
锋面越陡,AMR的效果越大。
对。均匀网格必须按锋面宽度把全域都加密,而AMR只需在锋面附近加密。这是一维的情况,二维、三维中均匀网格数按细度的平方、立方增加,而AMR只在锋面(线或面)附近加密,差距更大。但AMR的单元大小不一,每个单元的计算量和数据管理比均匀网格重,单元数之比并不直接等于计算时间之比。
用法与注意事项
设置要点
- 指标要选最能表示所关注现象的量(界面用体积分数,激波用压力梯度,涡用涡量)。
- 确定最大加密级数,确认最小单元能表示现象的最小尺度。
- 确定加密频率;锋面在两次自适应之间移动超过一个单元,就会跑出加密区域。
- 改变阈值,确认结果不变(AMR下的网格无关性)。
注意事项
- 粗细交界:相邻单元尺寸比控制在2倍以内,还需要保证守恒量不泄漏的修正。
- 壁面附近:边界层膨胀层与AMR有时不兼容,壁面附近常用固定网格。
- 并行负载:加密区域集中在部分处理器上会导致负载不均变慢,需要重新分配负载。
“加密区域总是慢半拍”
用AMR追踪高速移动的火焰或激波时,加密区域可能追不上,锋面跑进粗网格中。于是锋面变模糊,指标值也变小,不再加密,形成恶性循环。对策是缩短加密间隔,或在锋面前方留出余量加密(缓冲层)。对静止现象有效的AMR设置,对运动现象未必能直接用,要随时间确认锋面位置和加密区域位置。
常见错误
错误与对策
| 错误 | 后果 | 对策 |
|---|---|---|
| 指标与现象不匹配 | 需要的地方仍然粗 | 选择表示现象的量 |
| 加密间隔过长 | 锋面跑进粗网格 | 缩短间隔、缓冲层 |
| 不看阈值敏感度 | 结果依赖设置 | 改变阈值比较 |
| 按单元数比估算时间 | 低估计算时间 | 考虑小步长和管理开销 |
| 忽略粗细交界守恒 | 质量等泄漏 | 使用守恒修正 |
我想自己试试网格细度的影响。