This article was last updated on <span id="expire-date"></span> days ago, the information described in the article may be outdated.
数据的准备
如果要使用 WRF 的模拟结果驱动 PALM,需要将 WRF 的结果处理成 PALM 可以读取的 dynamic driver,而要生成 dynamic driver 的话,还需要使用静态地理数据先生成 static driver 才可以。
static driver 的生成
static driver 的生成需要使用 PALM 仓库内附带的工具 palm_csd (PALM 团队还有一个新的工具 palmgem 也可使用)。其中的手册写的不是特别完善,总结下来就是需要以下几类数据:
- 地形高度
- 建筑物高度 (以及用于区分不同建筑物的建筑物 id)
- 道路分布和类型
- 地表分布和类型
- 植被分布和类型
- 水体分布和类型
但这些数据不是必须要有的,不提供的话 PALM 会使用内部设定好的默认值。大陆想要拿到比较高精度的数据很难,可以使用 OpenStreetMap 提供的数据,但是需要自己做转换,生成 Shape 文件 (所有的几何分布都要放到一个 Shape 文件中,并且以额外的数据标记出类型) 或 TIFF 文件。并且某些数据类型还需要自己做一下映射,因为 PALM 内部支持的类型没有 OpenStreetMap 支持的那么丰富。
palm_csd 的运行需要提供一个 YAML 配置文件,具体的 key 以及其含义可以看 palm_csd 的文档,下面是我用于生成 static driver 的配置:
1 | input_root: |
需要注意的地方有:
- TIFF 文件和 Shape 文件的投影系与 settings 中设置的
epsg必须一致。 origin_x和origin_y是模拟区域的起点 (左下角) 在相应投影系中的坐标 (当然你也可以设置origin_lon和origin_lat)- 水平分辨率由
pixel_size决定,单位是米
此外,还应该详细的检查输出的 static driver:
vegetation_type,pavement_type以及water_type中的无效值应被替换为int8类型的整型值,并且在属性_FillValue中记录该填充值vegetation_type或pavement_type不为无效值的格点必须具有有效的soil_type。- 在
vegetation_type,pavement_type或water_type有值的格点上,surface_fraction的总和必须为1。
dynamic driver 的生成
有了 static driver 后,就可以进一步生成 dynamic driver 了。需要使用的工具是 palm-meteo。
目前 palm-meteo 不支持单个包含多个时间的 wrfout 数据,需要手动切分文件,或者在 WRF 的 namelist 中设置 frames_per_outfile = 1 让 WRF 每个输出时刻单独一个文件。
palm-meteo 的运行也需要 YAML 配置文件,下面是我用于生成 dynamic driver 的配置:
1 | case: nju #case name (required) |
有个需要注意的地方是,一定要将 proj_palm 设置成生成 static driver 时使用的数据的投影系,否则 palm-meteo 会报错无法执行。
运行
PALM 的手册目前写的还不是很完整,有一些地方是我摸索出来的,所以做法不一定是完全准确的。
想要:
- 让 PALM 使用 dynamic driver 中的初始场数据
- 让 PALM 使用 dynamic driver 中的边界条件
以下是一些必须要设置的参数
initializing_actions:设置为read_from_file,以从文件中读取初始场psolver:设置为multigridnx和ny:模拟区域网格的格子数。这两个参数和npex、npey配合,psolver设置为multigrid要求nx+1和ny+1能分别被npex和npey整除。npex和npey:沿 x 和 y 方向分配给网格的 CPU 节点数。二者的乘积等于分配给 PALM 模式的总节点数。nesting_offl_parameters:想要 PALM 使用 dynamic driver 中的边界条件,namelist 文件中必须存在该配置块,即使块内是空的。
需要注意的是,在 namelist 中设置 initializing_actions = 'read_from_file',要同时关闭所有关于边界条件的手动设置的参数,例如 ug_surface,pt_surface 之类的。
还有一个需要注意的地方是,PALM 的 namelist 中,urban_surface_parameters 的 switch_off_module 默认值是 .false.,但是如果 namelist 中不存在 urban_surface_parameters配置块,PALM 会认为找不到 urban_surface_parameters 的设置,然后不启用启用 urban surface model。所以必须要在 namelist 中添加 urban_surface_parameters 的设置 (即使是空的) 来启用 urban surface model。
下面是完整的 namelist 设置
1 | &initialization_parameters |
还有一个需要注意的地方是,PALM 的 namelist 中,urban_surface_parameters 的 switch_off_module 默认值是 .false.,但是如果不在 namelist 中设置这个参数,PALM 会认为找不到 urban_surface_parameters 的设置,然后报错。所以必须要在 namelist 中添加 urban_surface_parameters 的设置 (即使是空的) 来启用 urban surface model。
注意事项
除了上面提到过的注意事项外,我摸索过程中踩过的坑还有:
- 建筑物数据中,非建筑物区域一定要设置为无效值 (例如-9999),0也会识别为是建筑物,导致异常的下垫面高度。
psolver我使用了multigrid,这个方法要求水平格点数 (nx+1和ny+1) 能够被 2 整除,并且如果使用的核数大于1的话,水平格点数还能被相应方向上分配的核数整除。fft_method我使用了fftw,这个设置要求设置编译宏-D__fftw,并且水平格点数 (nx+1和ny+1) 最好满足:
也就是说,水平格点数最好是这些素数的一个公倍数。
Author: Syize
Permalink: https://blog.syize.cn/2026/01/29/note-run-palm-with-wrf/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Syizeのblog!
Comments