WRFDA学习记录

因为试验需要,开始学习安装和运行WRFDA。

安装WRFDA

不需要单独下载WRFDA的安装包,现在WRFDA、WRFPLUS都是内置于一开始安装的WRF安装包中了。但是不可以在已经安装好的WRF目录下编译WRFDA。需要将WRF的压缩包重新解压,并重命名为WRFDA、WRFPLUS。
如果有4dVar的需求,需要先安装WRFPLUS,不需要4Dvar则不需要安装。

官方的教程在以下网址中:

https://www2.mmm.ucar.edu/wrf/users/docs/user_guide_v4/v4.4/users_guide_chap6.html#_Obtaining_WRFDA_Source

安装WRFDA for 3DVAR Run

1
2
3
4
5
6
7
8
9
10
解压WRF安装包
gunzip <filename>.tar.gz
tar -xvf <filename>.tar
mv WRF WRFDA
cd WRFDA
./configure wrfda
15 # 与WRF的安装中选择相同
./compile all_wrfvar >& compile.out # 大概13分钟左右
ls -l var/build/*exe var/obsproc/src/obsproc.exe
# 生成44个.exe文件表示成功

以上,安装之后,3Dvar就安装成功了。

可以为安装好的WRFDA添加一条路径:

1
export WRFDA_DIR=${your_source_code_dir}/WRFDA

(非必要)安装WRFPLUS and WRFDA for 4DVAR Run

!!! 如果不需要使用4DVAR则不需要安装,我安装到一半才发现。

安装WRFPLUS:

As with 3D-Var, “serial” means single-processor, and “dmpar” means Distributed Memory Parallel (MPI). Be sure to select the same option for WRFPLUS as you will use for WRFDA.

安装或者编译WRFDA和WRFPLUS的时候,都要选择相同的’serial’或者‘dmpar’的选项,代表单线程或者多线程。

1
2
3
4
5
6
Download the desired WRFPLUS archive
gunzip <filename>.tar.gz
tar -xvf <filename>.tar
cd WRFPLUSV3
./configure wrfplus
./compile em_real

安装好WRFPLUS后,要把它加入到路径当中:

1
2
3
setenv WRFPLUS_DIR ${your_source_code_dir}/WRFPLUS
或者
export WRFPLUS_DIR=${your_source_code_dir}/WRFPLUS

运行OBSPROC(for 3Dvar)

Observation Preprocessor (OBSPROC)

这一部分是将同化需要使用的观测资料处理成WRFDA可以使用的形式。

笔者暂时没有同化观测资料的需求,此处待开发。。。

运行WRFDA

手册示例(3Dvar)

数据准备:

  • 初猜场:nc格式,使用WPS+real.exe产生,或者直接是WRF运行的结果。

  • 观测资料:ASCII格式,或者PREPBUFR格式,使用OBSPROC产生。

  • 背景场误差数据:二进制数据(.dat),通过WRFDA_gen_be_utility或者generic CV3.

将这些WRFDA需要读入的文件存放在任意的可读文件夹中,将该文件夹的路径设置为DAT_DIR

1
export DAT_DIR=.....

创建一个同化工作文件夹,比如WRFDA_DIR/workdir,将这个路径设置为WORK_DIR

1
export WORK_DIR=$WRFDA_DIR/workdir

然后运行以下命令,在创建的工作目录中,软连接所有需要的数据文件和可执行程序,创建一个namelist.input文件:

1
2
3
4
5
6
cd $WORK_DIR
cp $DAT_DIR/namelist.input.3dvar namelist.input
ln -sf $WRFDA_DIR/run/LANDUSE.TBL
ln -sf $DAT_DIR/rc/2008020512/wrfinput_d01 ./fg
ln -sf $DAT_DIR/ob/2008020512/obs_gts_2008-02-05_12:00:00.3DVAR ./ob.ascii
ln -sf $WRFDA_DIR/var/da/da_wrfvar.exe

对namelist.input文件进行修改,根据需要设置参数。

修改之后运行程序

1
./da_wrfvar.exe >& wrfda.log

namelist.input文件解读

专指WRFDA的namelist.input文件。

wrfvar1: 关于输出文件的细节,关于是否开启4dvar。

wrfvar2: 如果分析场和初猜场的时间差,大于analysis_accu的话,模式会终止;关于三维风场的一些设置。

wrfvar3: 读入文件的格式等。

wrfvar4: 关于读入的观测资料选择的一些设置。

wrfvar5: 关于观测资料质量控制标准的一些设置。

put_rand_seed false For RANDOMCV: setting to “true” allows you to enter your own seed numbers (see &wrfvar11) to generate random background perturbations.

wrfvar6: 关于极小化的一些选项。

wrfvar7: 关于一些背景误差协方差尺度参数的设置,针对1-流函数,2-不平衡位势,3-不平衡温度,4-假相对湿度,5-不平衡表面气压。

cv_options 5 3: NCEP Background Error model5: NCAR Background Error model (default)6: Use of moisture-multivariate background error statistics (CV6)7: New NCAR Background Error model (CV7)
CV option Data source Control variables cv_options =
CV3 Provided be.dat file ψ, χu, Tu, q, Ps,u 3
CV5 GEN_BE ψ, χu, Tu, RHs, Ps,u 5
CV6 GEN_BE ψ, χu, Tu, RHs,u, Ps,u 6
CV7 GEN_BE u, v, T, RHs, Ps 7

wrfvar8: 未开发使用。

wrfvar9: 追踪程序运行中的一些细节。

wrfvar10: 提供给程序开发者,对伴随模式和梯度计算进行测试。

wrfvar11:

seed_array1 1 For RANDOMCV when put_rand_seed=true, first integer for seeding the random function
seed_array2 1 For RANDOMCV when put_rand_seed=true, second integer for seeding the random function

这两个参数控制着产生的随机样本,一般将试验时间写成整数形式作为seed1,将想要产生的集合成员数目作为seed2。注意:一般不设置seed为0.

wrfvar12: 关于WPEC动力学设置。

wrfvar13: 不懂。

wrfvar14: 关于辐射。

wrfvar15: 关于伪观测的坐标设置,需要和wrfvar19一起设置。

wrfvar16: 混合DA的选项。

alphacv_method 2 1: ensemble perturbations in control variable space2: ensemble perturbations in model variable space

wrfvar17: 关于做什么。

analysis_type “3D-VAR” “3D-VAR”: 3D-VAR mode (default); “QC-OBS”: 3D-VAR mode plus extra filtered_obs output;”VERIFY”: verification mode. WRFDA resets check_max_iv=.false. and ntmax=0;”RANDOMCV”: for creating ensemble perturbations
n_randomcv 1 number of ensemble to be generated in one run. New in version 4.2.

wrfvar18: 就一个变量。

analysis_date “2002-08-03_00:00:00.0000” specify the analysis time. It should be consistent with the first guess time; if time difference between analysis_date and date info read in from first guess is larger than the &wrfvar2 setting “analysis_accu”, WRFDA will abort.

wrfvar19: 与wrfvar15配合,设置伪变量是什么。

wrfvar20: 网址。

wrfvar21,22: 同化时间窗。

perturbation: 关于4Dvar的选项。

radar_da: 关于雷达的选项。

RANDOMCV产生初始扰动

control variable space (“psi”,”chi_u”,”t_u”,”rh”,”ps_u”)

除了前面提到的变分方法外,WRFDA系统还支持集成和混合集成/变分同化方法。为了利用这些方法,有一个整体的预测是必要的。WRFDA有一个内置的方法来生成集合初始条件,称为RANDOMCV。RANDOMCV的工作原理是在控制变量空间的分析中加入随机噪声。

1
2
3
4
5
6
7
8
9
&wrfvar5
put_rand_seed true: enter your own seed numbers to generate random background perturbations. The advantage of this setting is that the same seed numbers will always produce the same perturbation
false: (default behavior) perturbations will be generated “randomly” and give new perturbations each time
&wrfvar11
seed_array1 First integer for seeding the random function (default: 1)
seed_array2 Second integer for seeding the random function (default: 1) It is not necessary to change both seeds to get different perturbations
&wrfvar17
analysis_type Set this to ‘RANDOMCV’ to use the RANDOMCV capability
n_randomcv 1 (default), number of ensemble to be generated in one run. New in version 4.2.

由于扰动是在控制变量空间中进行的,所以扰动的一般模式将取决于背景误差。您应该能够使用随机cv (CV3, CV5, CV6或CV7)的任何背景错误选项。此外,这意味着你可以通过分别修改背景误差方差和长度缩放变量来控制它们的大小和长度尺度:在wrfvar7中修改。

3DEnVar产生初始扰动

要进行3DEnVar,需要提供集合平均和扰动数据,这些在hybird中不会产生,需要提前提供,或许还是要按照RANDOMCV的方式产生。

1
2
3
export WORK_DIR=your_hybrid_path
export DAT_DIR=your_data_path
cd $WORK_DIR

WRFDA Ensemble Initialization Log

1. 任务概要 (Task Overview)

  • 任务描述: 使用WRFDA 3DVar系统,基于CV3背景误差协方差选项,生成40个初始集合扰动成员。
  • 执行主机: login08
  • 工作目录: /path/to/your/working_dir (请替换为你的实际路径)
  • 分析时间: 2008-02-05_12:00:00
  • 时间窗设置: 2008-02-05_11:00:002008-02-05_13:00:00 (±1小时)

2. 环境与配置 (Environment & Configuration)

  • WRFDA版本: V3.8 (或你的实际版本)
  • 编译选项: 并行编译 (dmpar)
  • 关键环境变量:
    • WRFDA_DIR = /path/to/your/WRFDA
    • WORK_DIR = /path/to/your/working_dir
    • DAT_DIR = /path/to/your/data

3. 输入文件 (Input Files)

  • 背景场 (First Guess): $DAT_DIR/rc/2008020512/wrfinput_d01 (链接为 ./fg)
  • 观测数据: $DAT_DIR/ob/2008020512/obs_gts_2008-02-05_12:00:00.3DVAR (链接为 ./ob.ascii)
  • 背景误差: $WRFDA_DIR/var/run/be.dat.cv3 (链接为 ./be.dat)
  • 固定文件: LANDUSE.TBL

4. 核心参数设置 (Core Namelist Parameters)

Namelist文件 namelist.input 中与控制扰动生成相关的关键参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
&wrfvar5
put_rand_seed = .true., ! 启用自定义随机种子
/
&wrfvar7
cv_options = 3, ! 使用CV3背景误差选项
as1 = 0.25, 1.00, 1.50, ! ψ: 方差, 水平尺度, 垂直尺度
as2 = 0.25, 1.00, 1.50, ! χ_u
as3 = 0.25, 1.00, 1.50, ! T_u
as4 = 0.25, 1.00, 1.50, ! RH
as5 = 0.25, 1.00, 1.50, ! Ps_u
/
&wrfvar11
seed_array1 = 2008020512, ! 基础种子 (固定为分析日期)
seed_array2 = ${MEM_ID}, ! 成员种子 (循环中设置为1-40)
/
&wrfvar17
analysis_type = 'RANDOMCV', ! 运行模式:生成随机扰动
/

5. 执行过程 (Execution Process)

  • 核心运行命令:
1
./da_wrfvar.exe >& wrfda.log.02
  • 脚本名称: run_randomcv.sh
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
36
37
38
39
#!/bin/bash
# 设置环境变量
setenv WRFDA_DIR /path/to/your/WRFDA
setenv WORK_DIR /path/to/your/working_dir
cd $WORK_DIR

# 循环40次,为每个成员运行
set member = 1
while ( $member <= 40 )

# 为每个成员创建一个子目录,保持工作空间整洁
mkdir -p member_$member
cd member_$member

# 链接必要的输入文件
ln -sf $WORK_DIR/fg .
ln -sf $WORK_DIR/ob.ascii .
ln -sf $WORK_DIR/be.dat .
ln -sf $WORK_DIR/LANDUSE.TBL .
ln -sf $WRFDA_DIR/var/da/da_wrfvar.exe .

# 复制namelist.input模板
cp $WORK_DIR/namelist.input .

# 使用sed等工具修改当前目录namelist.input中的seed_array2
# 例如,使用sed命令替换seed_array2的值
sed -i "s/seed_array2 = [0-9]*,/seed_array2 = $member,/" namelist.input

# 运行WRFDA
./da_wrfvar.exe >& wrfda.log.$member

# 运行成功后,输出文件为wrfvar_output
# 将其重命名为具有成员标识的文件,并移回主目录或指定位置
mv wrfvar_output $WORK_DIR/wrfinput_d01.mem$(printf "%03d" $member)

cd $WORK_DIR

@ member++
end
  • 执行命令: chmod +x run_randomcv.sh ./run_randomcv.sh

  • 执行方式: 循环执行,每个成员顺序运行

  • 开始时间: YYYY-MM-DD HH:MM:SS (例如: 2023-10-27 14:05:01)

成员生成状态:

1
2
3
4
5
[INFO] 开始生成集合成员...
[INFO] Member 001: 成功 - wrfinput_d01.mem001 (Seed: 2008020512, 1)
[INFO] Member 002: 成功 - wrfinput_d01.mem002 (Seed: 2008020512, 2)
...
[INFO] Member 040: 成功 - wrfinput_d01.mem040 (Seed: 2008020512, 40)
  • 结束时间: YYYY-MM-DD HH:MM:SS (例如: 2023-10-27 15:22:18)
  • 总耗时: 约 1小时17分钟

6. 输出结果 (Output)

  • 成功生成文件: wrfinput_d01.mem001wrfinput_d01.mem040
  • 文件位置: $WORK_DIR/
  • 日志文件: 每个成员拥有独立的运行日志 wrfda.log.$MEM_ID

7. 遇到的问题与解决 (Issues & Resolutions)

  • 问题: 初始运行时报错 ERRORS while reading one or more namelists
  • 原因: namelist.input&wrfvar11 段使用了 # 进行注释。
  • 解决方案: 将注释符 # 改为 Fortran Namelist 标准注释符 !
  • 解决时间: YYYY-MM-DD HH:MM:SS
  • 结果: 修改后,namelist 读取正常,任务成功执行。

8. 质量检查 (Quality Check)

  • 检查方法: 使用 ncdump -h 快速检查每个成员文件的维度、变量是否完整。
  • 检查结果: 所有40个成员文件均被成功创建,结构完整,文件大小合理且一致。
  • 验证建议: 后续可通过计算集合平均和标准差,或可视化个别变量的扰动场来进一步验证扰动的合理性。

9. 总结 (Summary)

任务状态: [SUCCESS]

  • 成功生成40个初始条件扰动成员。
  • 通过固定 seed_array1 和循环改变 seed_array2 的方式,确保了扰动的可重复性和唯一性。
  • 通过调整CV3背景误差参数(as1 - as5),实现了对扰动振幅和尺度的控制。