This article was last updated on <span id="expire-date"></span> days ago, the information described in the article may be outdated.
记录一下使用PALM跑理想建筑绕流试验的具体流程。
这次试验的目的是想看来流遇到建筑物阻挡时,绕流形成的 horseshoe vortex 和 arch vortex。想要清晰的看到这两个结构,以及扰动向下游传播的情况的话,需要保证开始模拟时模拟模拟的大气就已经接近或达到稳态了,因此需要有一个 precursor 试验来在无建筑物的网格中提前模拟一段时间。
整体流程
整个模拟的流程大概如下。
- 首先是要跑一个 precursor 试验,这一步是为了得到稳态的大气场数据,也是为了得到用于在正式试验中提供侧边界强迫的数据。这一步应该至少得到两个数据文件:
- 包含稳态大气场数据的 restart 文件
xxxx.d3d.yyy,其中xxx是模拟的 Identifier,yyy是一串数字用来标识这个 restart 文件是第几次产生的,一般 precursor 只运行一次,所以通常是000。但是如果你在第一次 precursor 试验的基础上又 restart 延长了一下 precursor 的时间,则后面的数字会增加1。再次 restart 的话同理,会再增加1。 - 某个剖面的数据。我的正式试验是西侧边界来流,所以要取得的剖面是 Y-Z 平面的数据,命名类似于
xxxx_yz.yyy.nc。
- 包含稳态大气场数据的 restart 文件
- 剖面数据要进一步转换成 PALM 能够使用的 dynamic driver,这一步是比较难处理的,因为 PALM 没有提供方便的脚本进行转换,需要自己对照 PALM 对 dynamic driver 的要求对数据进行转换。
- 使用得到的
d3d和 dynamic driver 进行正式的模拟。
下面详细讲一下相关的配置,其中试验的一些参数的设置参考了 Shin et al. (2021, JAS)[1]
precursor 试验
Initialization parameters
根据 AI 的回答,precursor 试验设置的模拟域可以比正式试验的网格小,这样在正式试验时,PALM 会重复使用 precursor 试验的三维大气填充整个模拟域。但是为了让结果受到的影响因素在可控范围内降到最小,我设置的 precursor 试验的模拟域和正式试验时一样大小的。
| nx | dx | ny | dy | nz | dz |
|---|---|---|---|---|---|
| 479 | 5.0 | 287 | 5.0 | 250 | 4.8 |
网格设置和分辨率设置
Shin 等的模拟使用了 FastEddy 垂直方向的拉伸,但是我这里为了方便垂直方向使用了固定的分辨率。precursor 试验四个边界都使用周期性边界条件,地形是 flat,omega 设置为 0 以关闭科氏力,初始场的初始化方式是 set_constant_profiles,设置 dp_external 为 .true 并设置 dpdxy 的值,具体合适的值要做一下测试才能知道。如果不设置这两项的话,没有气压梯度的驱动,风速会逐渐减弱无法达到平衡。这几项应该是必须的设置,其余参数则按照具体的试验要求进行更改即可,这一部分的具体参数如下:
1 | &initialization_parameters |
Runtime parameters
这一部分主要涉及试验的运行时间和输出的设置。precursor 试验应当尽量久的运行,以给大气调整到稳态的时间。经验上来讲,中性大气一般需要 2 天的调整时间,但是在我的测试下,PALM 似乎运行一天后就能接近稳态,具体是否达到稳态,要计算看看摩擦速度 u* 的水平平均时序,看看是否其是否只在某一水平范围内波动。
最后6小时模拟30分钟平均的风速、总TKE、雷诺应力和总动量通量随高度的差异
正常应该计算一下 u* 来看一下是否还有改变的,但是我忘了在 PALM 中输出这个变量了。有时风速、总TKE、雷诺应力和总动量通量的变化已经在0左右波动了,但是 u* 还有明显的变化趋势。。在 precursor 的试验中,应该至少将以下变量添加到 PALM 的输出中:
u_yzv_yzw_yze_yztheta_yzus*_xy
剖面的位置最好在 precursor 试验模拟域的中间,然后 dt_do2d_yz 设置的比较细,这样才能输出时间精度足够高的数据,用来在正式试验中提供动态的侧边界强迫。end_time 最好大于等于 ,最后的 5s 是为了预留出允许误差的时间,因为 PALM 的数据不是精确的整时输出,会比设定的目标时间略小。如果完全卡着时间来,最后正式试验会发现 PALM 报错说 dynamic driver 能够提供强迫的最大时间小于正式试验设定的结束时间,这就是因为 precursor 试验输出的最后一个结果略早于设定的结束时间导致的。
举个具体的例子,如果我想至少运行 24 小时来模拟稳态大气,正式试验运行6个小时,那么 precursor 的 end_time 应该至少设置为 108005 秒
最后我的 runtime parameters 配置如下
1 | &runtime_parameters |
运行方面,要将 namelist 保存为 xxxx_pcr,并且向 palmrun 传递参数 -a 'pcr restart'。有了 restart 参数,PALM 才能生成重启需要的数据文件。
Dynamic driver 的生成
这部分比较麻烦,所以我直接扔给 ChatGPT 让它帮我写了。由于代码量有点大,就不放在博客中展示了。如果你需要这个代码来生成 dynamic driver,可以留言联系我。
正式试验
经过前面两步的准备,现在应该有两个文件:xxxx_d3d.yyy 和 xxxx_dynamic。
正式试验的配置基本沿用 precursor 试验,但是有几个地方需要修改。
Initialization parameters
- 由于我是西侧入流,东侧出流,对应的边界条件配置
bc_lr要改为dirichlet/radiation。 - 因为放入了单个理想建筑,
topography设为single_building,并通过相关的建筑参数设定了建筑物的大小和位置。 initializing_actions要改为cyclic_fill,因为我们要读取 precursor 试验生成的 restart 文件。
Runtime parameters
end_time要在 precursor 的基础上再加上正式试验的模拟时长。- 其他相关的变量输出设置要根据实际需要进行修改。
Turbulent inflow parameters
正式试验要添加这个配置块,并设置 turbulent_inflow_method = 'read_from_file',这样 PALM 就会从 dynamic driver 中读取入流强迫。
将 namelist 文件保存为 xxxx_p3d,并向 palmrun 传递参数 -a 'd3# cyclic',即可开始正式的绕流试验模拟。
续跑 precursor 试验
如果你跑完了 precursor 试验,发现大气还没有达到稳态怎么办?可以通过修改部分设置,在前面 precursor 试验的基础上续跑,因为 precursor 试验生成了用于 restart 的 d3d 数据,完全可以从保存的点继续续跑。
Initialization parameters
只需要将参数 initializing_actions 修改为 'read_restart_data' 即可。
Runtime parameters
将要续跑的时间添加到 end_time,使其值变成从最开始的第一次模拟起计算,到你续跑的试验模拟完所模拟的总模式时间。
将 namelist 文件保存为 xxxx_p3dr,并向 palmrun 传递参数 -a 'd3r restart',即可开始续跑 precursor 试验。
- 1.Shin, H. H., D. Muñoz-Esparza, J. A. Sauer, and M. Steiner, 2021: Large-Eddy Simulations of Stability-Varying Atmospheric Boundary Layer Flow over Isolated Buildings. Journal of the Atmospheric Sciences, 78, 1487–1501, https://doi.org/10.1175/JAS-D-20-0160.1. ↩
Author: Syize
Permalink: https://blog.syize.cn/2026/10/11/note-palm-precursor-and-main-simulation/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Syizeのblog!
Comments