在PALM中运行前置和正式理想模拟试验

notes

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 试验来在无建筑物的网格中提前模拟一段时间。

整体流程

整个模拟的流程大概如下。

  1. 首先是要跑一个 precursor 试验,这一步是为了得到稳态的大气场数据,也是为了得到用于在正式试验中提供侧边界强迫的数据。这一步应该至少得到两个数据文件:
    1. 包含稳态大气场数据的 restart 文件 xxxx.d3d.yyy,其中 xxx 是模拟的 Identifier,yyy 是一串数字用来标识这个 restart 文件是第几次产生的,一般 precursor 只运行一次,所以通常是 000。但是如果你在第一次 precursor 试验的基础上又 restart 延长了一下 precursor 的时间,则后面的数字会增加1。再次 restart 的话同理,会再增加1。
    2. 某个剖面的数据。我的正式试验是西侧边界来流,所以要取得的剖面是 Y-Z 平面的数据,命名类似于 xxxx_yz.yyy.nc。
  2. 剖面数据要进一步转换成 PALM 能够使用的 dynamic driver,这一步是比较难处理的,因为 PALM 没有提供方便的脚本进行转换,需要自己对照 PALM 对 dynamic driver 的要求对数据进行转换。
  3. 使用得到的 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
&initialization_parameters
nx = 479
ny = 287
nz = 250
dx = 5.0
dy = 5.0
dz = 4.8
bc_lr = 'cyclic'
bc_ns = 'cyclic'
topography = 'flat'
momentum_advec = 'ws-scheme'
timestep_scheme = 'runge-kutta-3'
turbulence_closure = '1.5-order'
call_psolver_at_all_substeps = .true.
initializing_actions = 'set_constant_profiles'
ug_surface = 10.0
vg_surface = 0.0
latitude = 32.0
omega = 0.0
dp_external = .true.
conserve_volume_flow = .false.
dp_level_b = 0.0
dpdxy = -1.6e-4, 0.0
roughness_length = 0.1
constant_flux_layer = .true.
bc_uv_b = 'dirichlet'
pt_surface = 300.0
pt_vertical_gradient = 8.0, 0.3
pt_vertical_gradient_level = 400.0, 650.0
surface_heatflux = 0.0
bc_pt_b = 'neumann'
bc_pt_t = 'initial_gradient'
neutral = .false.
cfl_factor = 0.9
/

Runtime parameters

这一部分主要涉及试验的运行时间和输出的设置。precursor 试验应当尽量久的运行,以给大气调整到稳态的时间。经验上来讲,中性大气一般需要 2 天的调整时间,但是在我的测试下,PALM 似乎运行一天后就能接近稳态,具体是否达到稳态,要计算看看摩擦速度 u* 的水平平均时序,看看是否其是否只在某一水平范围内波动。

image-20261011204333445

最后6小时模拟30分钟平均的风速、总TKE、雷诺应力和总动量通量随高度的差异

正常应该计算一下 u* 来看一下是否还有改变的,但是我忘了在 PALM 中输出这个变量了。有时风速、总TKE、雷诺应力和总动量通量的变化已经在0左右波动了,但是 u* 还有明显的变化趋势。。在 precursor 的试验中,应该至少将以下变量添加到 PALM 的输出中:

  • u_yz
  • v_yz
  • w_yz
  • e_yz
  • theta_yz
  • us*_xy

剖面的位置最好在 precursor 试验模拟域的中间,然后 dt_do2d_yz 设置的比较细,这样才能输出时间精度足够高的数据,用来在正式试验中提供动态的侧边界强迫。end_time 最好大于等于 最短precursor模拟时间+正式试验模拟时间+5s最短 precursor 模拟时间 + 正式试验模拟时间 + 5s,最后的 5s 是为了预留出允许误差的时间,因为 PALM 的数据不是精确的整时输出,会比设定的目标时间略小。如果完全卡着时间来,最后正式试验会发现 PALM 报错说 dynamic driver 能够提供强迫的最大时间小于正式试验设定的结束时间,这就是因为 precursor 试验输出的最后一个结果略早于设定的结束时间导致的。

举个具体的例子,如果我想至少运行 24 小时来模拟稳态大气,正式试验运行6个小时,那么 precursor 的 end_time 应该至少设置为 108005 秒

24∗60∗60+6∗60∗60+5=108005 s24*60*60+6*60*60+5 = 108005\ s

最后我的 runtime parameters 配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&runtime_parameters
end_time = 108005.0
dt_max = 1.0
create_disturbances = .true.
section_yz_m = 1200.0
dt_do2d_yz = 1
skip_time_do2d_yz = 86400.0
sectoin_xy = -1
dt_do2d_xy = 60
skip_time_do2d_xz = 86400.0
npex = 20
npey = 18
data_output_pr = '#u', 'u*2', 'wu', 'w*u*', 'w"u"', '#v', 'v*2', 'wv',
'w*v*', 'w"v"', 'w', 'w*2', 'e', 'e*', '#km', '#l'
dt_dopr = 300.0
skip_time_dopr = 86400.0
averaging_interval = 300.0
dt_data_output_av = 300.0
skip_time_data_output_av = 86400.0
data_output = 'u_av', 'v_av', 'w_av', 'u_yz', 'v_yz', 'w_yz', 'e_yz',
'theta_yz', 'us*_xy'
dt_data_output = 99999.0
/

运行方面,要将 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. 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