WRF学习笔记之三:使用ERA5数据驱动并运行WRFV4.4(一层嵌套)/WRF运行实录/WRF报错(踩坑)记录

本文详细介绍了如何使用ERA5再分析数据驱动WRF模型进行气候模拟,包括数据下载、WPS前处理、WRF配置及运行过程中的错误处理。在数据准备阶段,通过Python脚本批量下载ERA5的3D和2D数据;运行WPS的geogrid、ungrib和metgrid步骤时,针对可能出现的错误进行了说明和解决。在WRF运行阶段,重点讨论了namelist.input的配置以及遇到的垂直层设置、边界层方案等问题。最终成功运行并生成wrfout_d01文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写过的WRF入门超算入门:大型机运行WRF这两篇博文里,我都简单的介绍了WRF的安装与运行,不过,用示例数据来运行只能初步了解WRF的运行流程,想要更进一步熟练地掌握WRF的运行与设置,还需要自己亲自下数据驱动】、设置才行,这篇博文将介绍使用ERA5数据驱动WRF运行,并简单说一下自己犯过的错误,以帮助后学者。
注:本次WRF是在组里的小型服务器上的一个结点运行的,所以不涉及作业调度内容。
周日晚才拿到的账号,这几天光记着转模式去了,花了一天安装编译,又花了两天才跑通,坑太多了,记录一下。

数据准备

本次使用2018年ERA5数据驱动WRF,下载的是ERA5的single pressure数据和pressure数据,使用python脚本+IDM批量下载,关于ERA5的下载请参见博文:批量下载ERA5数据(Python+IDM)
使用ERA5驱动数据时有些数据是必须的,因此下载数据这一步骤需要注意不要漏掉变量,
下面是我下载数据的一些代码与信息:
下载气压层(3D数据)

mport cdsapi
import calendar
from subprocess import call


def idmDownloader(task_url, folder_path, file_name):
    """
    IDM下载器
    :param task_url: 下载任务地址
    :param folder_path: 存放文件夹
    :param file_name: 文件名
    :return:
    """
    # IDM安装目录
    idm_engine = "C:\\Program Files (x86)\\Internet Download Manager\\IDMan.exe"
    # 将任务添加至队列
    call([idm_engine, '/d', task_url, '/p', folder_path, '/f', file_name, '/a'])
    # 开始任务队列
    call([idm_engine, '/s'])


if __name__ == '__main__':
    c = cdsapi.Client()  # 创建用户

    # 数据信息字典
    dic = {
        'product_type': 'reanalysis',  # 产品类型
        'format': 'grib',  # 数据格式
        'variable':  [
            'geopotential','relative_humidity','specific_humidity',
            'temperature','u_component_of_wind','v_component_of_wind'
        ],
        'pressure_level': [
            '1','2','3',
           '5','7','10',
           '20','30','50', 
           '70', '100','125', 
           '150', '175',
           '200', '225', '250',
           '300', '350', '400',
           '450', '500', '550',
           '600', '650', '700',
           '750', '775', '800',
           '825', '850', '875',
           '900', '925', '950',
           '975', '1000',
       ],
        'year': '2018',  # 年,设为空
        'month': '05',  # 月,设为空
        'day': [  '01', '02','03','04','05','06','07',],  # 日,设为空
        'time': [  # 小时
             '00:00', '06:00', '12:00',
            '18:00'
        ],
        'area': [90, -180, 45, 180],
    }


    # 通过循环批量下载1979年到2020年所有月份数据
    '''
    for y in range(1979, 2021):  # 遍历年
        for m in range(1, 13):  # 遍历月
            day_num = calendar.monthrange(y, m)[1]  # 根据年月,获取当月日数
            # 将年、月、日更新至字典中
            dic['year'] = str(y)
            dic['month'] = str(m).zfill(2)
            dic['day'] = [str(d).zfill(2) for d in range(1, day_num + 1)]
'''
r = c.retrieve('reanalysis-era5-pressure-levels', dic, )  # 文件
url = r.location  # 获取文件下载地址
path = 'E:\\ERA5\\'  # 存放文件夹
filename = 'pressure'+str(2018) + str(5).zfill(2) + '.grib'  # 文件名
idmDownloader(url, path, filename)  # 添加进IDM中下载


下载单层(2D数据):

import cdsapi
import calendar
from subprocess import call


def idmDownloader(task_url, folder_path, file_name):
    """
    IDM下载器
    :param task_url: 下载任务地址
    :param folder_path: 存放文件夹
    :param file_name: 文件名
    :return:
    """
    # IDM安装目录
    idm_engine = "C:\\Program Files (x86)\\Internet Download Manager\\IDMan.exe"
    # 将任务添加至队列
    call([idm_engine, '/d', task_url, '/p', folder_path, '/f', file_name, '/a'])
    # 开始任务队列
    call([idm_engine, '/s'])


if __name__ == '__main__':
    c = cdsapi.Client()  # 创建用户

    # 数据信息字典
    dic = {
        'product_type': 'reanalysis',  # 产品类型
        'format': 'grib',  # 数据格式
        'variable':  [
            '10m_u_component_of_wind', '10m_v_component_of_wind', '2m_temperature',
            'mean_sea_level_pressure', 'sea_surface_temperature', 'skin_temperature',
            'snow_albedo', 'snow_depth', 'snowfall',
            'soil_temperature_level_1', 'soil_type', 'surface_pressure',
            'total_precipitation','soil_temperature_level_2',
            'soil_temperature_level_3','soil_temperature_level_4',
           'volumetric_soil_water_layer_1','volumetric_soil_water_layer_2',
           'volumetric_soil_water_layer_3', 'volumetric_soil_water_layer_4',
        ],
        'year': '2018',  # 年,设为空
        'month': '05',  # 月,设为空
        'day': [  '01', '02','03','04','05','06','07',],  # 日,设为空
        'time': [  # 小时
             '00:00', '06:00', '12:00',
            '18:00'
        ],
        'area': [90, -180, 45, 180],
    }


    # 通过循环批量下载1979年到2020年所有月份数据
    '''
    for y in range(1979, 2021):  # 遍历年
        for m in range(1, 13):  # 遍历月
            day_num = calendar.monthrange(y, m)[1]  # 根据年月,获取当月日数
            # 将年、月、日更新至字典中
            dic['year'] = str(y)
            dic['month'] = str(m).zfill(2)
            dic['day'] = [str(d).zfill(2) for d in range(1, day_num + 1)]
'''
r = c.retrieve('reanalysis-era5-single-levels', dic, )  # 文件
url = r.location  # 获取文件下载地址
path = 'E:\\ERA5\\'  # 存放文件夹
filename = 'single'+str(2018) + str(5).zfill(2) + '.grib'  # 文件名
idmDownloader(url, path, filename)  # 添加进IDM中下载

下载后,会出现:
在这里插入图片描述前往相应的路径查找即可。
下好的数据通过FTTP直接传输至服务器,如果需要中转,使用scp命令上传即可。

运行WPS前处理

修改namelist.wps

根据需要修改即可,具体如何修改可参考我的博文:WRF入门,这里贴上我的设置。

&share
 wrf_core = 'ARW',
 max_dom =1,
 start_date = '2018-05-01_12:00:00','2019-09-04_12:00:00',
 end_date   = '2018-05-07_00:00:00','2019-09-04_12:00:00',
 interval_seconds = 21600
/

&geogrid
 parent_id         =   1,
 parent_grid_ratio =   1,
 i_parent_start    =   1,
 j_parent_start    =   1,
 e_we              =  150,
 e_sn              =  150,
 geog_data_res = '10m',
 dx = 45000,
 dy = 45000,
 map_proj = 'polar',
 ref_lat   =  90.00,
 ref_lon   =  0.0,
 truelat1  =  60.0,
 truelat2  =  60.0,
 stand_lon =  0.0,
 geog_data_path = '/public/home/zhangzl/Build_WRF//WPS_GEOG/'
/

&ungrib
 out_format = 'WPS',
 prefix = 'FILE',
/

&metgrid
 fg_name = 'FILE'
/
~

geogrid

执行/geogrid.exe 如果成功,会出现geo_em.d01文件。
这部分几乎都没有问题,唯一曾出现的问题就是你的静态地理数据下载不全,按照提示一个个下全就好,我个人选择的10m地理数据如下:
在这里插入图片描述

其中带有10m和30s的数据一个都不能少。

ungrib

首先创建链接,由于是ERA5数据,Table应为ECMWF:

ln -sf ungrib/Variable_Tables/Vtable.ECMWF  Vtable

创建链接后,WPS目录下会出现Table文件。
随后,链接数据:

./link_grib.csh ../ERA5/*.grib

成功后会出现:
在这里插入图片描述
两个文件。
随后./ungrib.exe
此处曾出现报错:grib not the same type
原因:输入的文件既有grib1又有grib2 格式,WPS无法同时处理。
解决方法:下载文件时,将文件后缀名写成了.grb,重新下载写成 .grib即可。
运行成功后会出现FILE打头的文件:
在这里插入图片描述

metgrid

没有报错,直接运行。/metgrid.exe
在这里插入图片描述
成功出现met_em.d开头文件,由于本次只有一层网格,只有d_01。

查看嵌套区域

使用WPS/util/目录下自带的plotgrids.ncl绘制嵌套网格,由于服务器上ncl版本较高,应使用plotgrids_new.ncl绘制。
此时出现报错:

GKS ERROR NUMBER -208 ISSUED FROM SUBROUTINE GOPWK :
 --X driver error: DISPLAY environment variable not set
 GKS ERROR NUMBER   25 ISSUED FROM SUBROUTINE GESC  :
 --SPECIFIED WORKSTATION IS NOT OPEN
fatal:Workstation with PID#8 is not open
fatal:Unable to open Workstation-Can't Create
fatal:Unable to access object with id:-4
fatal:PID #-4 can't be found in NhlSetValues
fatal:_NhlCreate:Invalid Parent id #-4
fatal:PID #-4 can't be found in NhlSetValues
fatal:Invalid plot ID=-4 passed to NhlGetBB
fatal:NhlGetValues:PID #-4 is invalid
fatal:["Execute.c":8637]:Execute: Error occurred at or near line 1551 in file $NCARG_ROOT/lib/ncarg/nclscripts/cs    m/gsn_code.ncl

fatal:["Execute.c":8637]:Execute: Error occurred at or near line 2704 in file $NCARG_ROOT/lib/ncarg/nclscripts/cs    m/gsn_code.ncl

fatal:["Execute.c":8637]:Execute: Error occurred at or near line 10422 in file $NCARG_ROOT/lib/ncarg/nclscripts/c    sm/gsn_code.ncl

fatal:["Execute.c":8637]:Execute: Error occurred at or near line 4697 in file $NCARG_ROOT/lib/ncarg/nclscripts/wr    f/WRFUserARW.ncl

fatal:["Execute.c":8637]:Execute: Error occurred at or near line 4814 in file $NCARG_ROOT/lib/ncarg/nclscripts/wr    f/WRFUserARW.ncl

fatal:["Execute.c":8637]:Execute: Error occurred at or near line 200 in file util/plotgrids_new.ncl

这是由于超算不支持x11格式造成的,打开plotgrids.ncl文件,将type=x11注释,改为type=pdf,即可。

在这里插入图片描述
此时WPS目录下出现.pdf文件,使用evince命令查看。由于我在服务器上没有开图形界面的权限,我直接用scp命令把它从服务器上传过来,这不影响。
在这里插入图片描述

运行WRF

修改namelist.input

进入WRF/run文件夹,修改namelist.input。
这里报错较多,为了更好的设置相应参数,现在WPS文件夹下:
使用命令:ncdump -h met_em.d01.2018-05-04_12:00:00.nc 查看其中的:

 num_st_layers = 4 ;
  num_sm_layers = 4 ;
 num_metgrid_levels = 38 ;
 // global attributes:
                :TITLE = "OUTPUT FROM METGRID V4.4" ;
                :SIMULATION_START_DATE = "2018-05-04_12:00:00" ;
                :WEST-EAST_GRID_DIMENSION = 150 ;
                :SOUTH-NORTH_GRID_DIMENSION = 150 ;
                :BOTTOM-TOP_GRID_DIMENSION = 38 ;
                :WEST-EAST_PATCH_START_UNSTAG = 1 ;
                :WEST-EAST_PATCH_END_UNSTAG = 149 ;
                :WEST-EAST_PATCH_START_STAG = 1 ;
                :WEST-EAST_PATCH_END_STAG = 150 ;
                :SOUTH-NORTH_PATCH_START_UNSTAG = 1 ;
                :SOUTH-NORTH_PATCH_END_UNSTAG = 149 ;
                :SOUTH-NORTH_PATCH_START_STAG = 1 ;
                :SOUTH-NORTH_PATCH_END_STAG = 150 ;
                :GRIDTYPE = "C" ;
                :DX = 45000.f ;
                :DY = 45000.f ;
                :DYN_OPT = 2 ;
                :CEN_LAT = 89.99999f ;
                :CEN_LON = 180.f ;
                :TRUELAT1 = 60.f ;
                :TRUELAT2 = 60.f ;
                :MOAD_CEN_LAT = 89.99999f ;
                :STAND_LON = 0.f ;
                :POLE_LAT = 90.f ;
                :POLE_LON = 0.f ;
                :corner_lats = 46.77416f, 46.77416f, 46.77416f, 46.77416f, 46.64143f, 46.64143f, 46.64143f, 46.64143f, 46.64143f, 46.64143f, 46.64143f, 46.64143f, 46.50927f, 46.50926f, 46.50926f, 46.50927f ;
                :corner_lons = -45.f, -135.f, 135.f, 45.f, -45.1929f, -134.8071f, 134.8071f, 45.19292f, -44.80708f, -135.1929f, 135.1929f, 44.80709f, -45.f, -135.f, 135.f, 45.f ;
                :MAP_PROJ = 2 ;
                :MMINLU = "MODIFIED_IGBP_MODIS_NOAH" ;
                :NUM_LAND_CAT = 21 ;
                :ISWATER = 17 ;
                :ISLAKE = 21 ;
                :ISICE = 15 ;
                :ISURBAN = 13 ;
                :ISOILWATER = 14 ;
                :grid_id = 1 ;
                :parent_id = 1 ;
                :i_parent_start = 1 ;
                :j_parent_start = 1 ;
                :i_parent_end = 150 ;
                :j_parent_end = 150 ;
                :parent_grid_ratio = 1 ;
                :sr_x = 1 ;
                :sr_y = 1 ;
                :NUM_METGRID_SOIL_LEVELS = 4 ;

这部分参数非常重要,在修改namelist.input时,里面的参数需要与读取的met_em.d01.nc文件一致!

time control部分
这部分主要修改起始时间、结束时间与时间步长,根据WPS里的namelist与metgrid生成的met_em,d文件一致即可。

run_days                            = 5,
 run_hours                           = 0,
 run_minutes                         = 0,
 run_seconds                         = 0,
 start_year                          = 2018,
 start_month                         = 05,
 start_day                           = 01,
 start_hour                          = 12,
 end_year                            = 2018,
 end_month                           = 05,
 end_day                             = 06,
 end_hour                            = 12,
 interval_seconds                    = 21600  %输入文件的间隔时间,单位秒,此处为间隔6小时
 input_from_file                     = .true.,.true., %是否嵌套运行
 history_interval                    = 60,  60,    %输出文件间隔,单位为分,此处为每小时输出一个文件
 frames_per_outfile                  = 1, 1, %输出的out文件个数,如果out太大,可以切割输出
 restart                             = .false., %是否是重新运行
 restart_interval                    = 7200, %重新运行out文件的时间间隔,单位分钟
 % 以下全为输出文件、输入文件格式,全选2,表示格式为nc
 io_form_history                     = 2
 io_form_restart                     = 2
 io_form_input                       = 2
 io_form_boundary                    = 2

&domains部分
这部分与你WPS的namelist有关,与WPS输出的met_dem文件相关,

time_step                           = 90,
 time_step_fract_num                 = 0,
 time_step_fract_den                 = 1,
 max_dom                             = 1,
 e_we                                = 150,
 e_sn                                = 150,
 e_vert                              = 40,
 dzbot                               = 10,
 dzstretch_s                         = 1.3,
 dzstretch_u                         = 1.1,
 p_top_requested                     = 5000,
 num_metgrid_levels                  = 38,
 num_metgrid_soil_levels             = 4,
 dx                                  = 30000,
 dy                                  = 30000,
 grid_id                             = 1,
 parent_id                           = 1,
 i_parent_start                      = 1,
 j_parent_start                      = 1,
 parent_grid_ratio                   = 1,
 parent_time_step_ratio              = 1,
 feedback                            = 1,
 smooth_option                       = 0
 /
%全部与namelist中保持一致!

physics部分
这部分主要是物理参数化方案的选择,注意查看WRF文档里,参数化方案的一些要求,

&physics
 physics_suite                       = 'CONUS'
 mp_physics                          = 2, %微物理方案,此处选择Lin
 cu_physics                          = 1, %积云参数化方案,此处选择Kain-Fritsch (new Eta) 方案
 ra_lw_physics                       = 1  %长波辐射方案,此处选择rrtn
 ra_sw_physics                       = 5, %短波辐射方案,此处选择Goddard
 bl_pbl_physics                      = 1, %边界层方案,此处选择YSU
 sf_sfclay_physics                   = 1, %地面层方案,应与边界层方案对应,此处为MM5
 sf_surface_physics                  = 2, %地面方案,这里选的Noah
 radt                                = 30, %与你的分辨率对应,dx=20km就写30
 bldt                                = 0, %推荐0
 cudt                                = 0, % 推荐0,除了  Kain-Fritsch参数化方案,这里我忘记改了
 icloud                              = 1,% 是否考虑云辐射效应,这里先不管,直接默认
 num_land_cat                        = 21,%与met_em文件对应
 sf_urban_physics                    = 2,%城市冠层方案,注意与边界层方案对应
 fractional_seaice                   = 1, %把海冰当作分数考虑,如果为0,则要么有冰有么没冰
 /

dynamic部分与其他
没什么好讲的……
注意垂直层可能要加个etac上去。

 &dynamics
 hybrid_opt                          = 2,
 etac                                = 0.2,
 w_damping                           = 0,
 diff_opt                            = 1,
 km_opt                              = 4,
 diff_6th_opt                        = 0, ,
 diff_6th_factor                     = 0.12,   0.12,
 base_temp                           = 290.
 damp_opt                            = 3,
 zdamp                               = 5000.,
 dampcoef                            = 0.2,
 khdif                               = 0,
 kvdif                               = 0,
 non_hydrostatic                     = .true., .true.,
 moist_adv_opt                       = 1,      1,
 scalar_adv_opt                      = 1,      1,
 gwd_opt                             = 1,      0,
 /

 &bdy_control
 spec_bdy_width                      = 5,
 specified                           = .true.
 /

 &grib2
 /

 &namelist_quilt
 nio_tasks_per_group = 0,
 nio_groups = 1,

real运行与报错记录

这里报错非常之多,绝大多数都是因为namelist.input设置有误,可以使用:
tail rsl.error.0000 #or tail rsl.out.0000 #or vi rsl.error.0000查看原因并修改。
报错记录一:

 You need one of four things:
d01 2018-05-01_12:00:00 1) More eta levels: e_vert
d01 2018-05-01_12:00:00 2) A lower p_top: p_top_requested
d01 2018-05-01_12:00:00 3) Increase the lowest eta thickness: dzbot
d01 2018-05-01_12:00:00 4) Increase the stretching factor: dzstretch_s or dzstretch_u
d01 2018-05-01_12:00:00 All are namelist options

提示需要修改namelist中的四个选项中的一个。
解决方法:查了一下应该输入的数据层数不对应,垂直层间距超过了默认值1000m,因此需要:1、增加垂直层数e_vert;2、降低模式层顶的高度p_top;3、增加允许的最大eta层厚度max_dz。4、增加dz延展因子。
总之就是垂直分辨率不对,按照提示改就行了。
报错记录二:

d01 2018-05-01_12:00:00  t(i,j,k) was 0 at          145         149          30 , setting Qv to 0
d01 2018-05-01_12:00:00  t(i,j,k) was 0 at          146         149          30 , setting Qv to 0
d01 2018-05-01_12:00:00  t(i,j,k) was 0 at          147         149          30 , setting Qv to 0
d01 2018-05-01_12:00:00  t(i,j,k) was 0 at          148         149          30 , setting Qv to 0
d01 2018-05-01_12:00:00  t(i,j,k) was 0 at          149         149          30 , setting Qv to 0
Using sfcprs  to compute psfc
-------------- FATAL CALLED ---------------
FATAL CALLED FROM FILE:  <stdin>  LINE:    6241
troubles, could not find trapping x locations

解决方法:属于网格设置问题,设置的区域超过了数据范围……
重新设置namelist.wps格点,把dx、dy从45km改成30km。
再重新运行WPS。
报错记录三:

The reference pressure is not monotonically decreasing
             This tends to be caused by very high topography
 (i,j) =           28          11 , topography =    2963.077      m
 k =           10 , reference pressure =    67832.36      Pa
 k =           11 , reference pressure =    67853.36      Pa

垂直层设置会造成极高的对流层顶,解决方法:不断调整垂直层大小和&dynamic中的etac值(耐心)。
报错记录4:

[zhangzl@node4 run]$ tail rsl.out.0000
 column of pressure and value =             NaN   12336.15
 column of pressure and value =             NaN   13345.33
 column of pressure and value =             NaN   14534.03
 column of pressure and value =             NaN   15983.12
 column of pressure and value =             NaN   18277.69
 column of pressure and value =       -Infinity   20446.78
-------------- FATAL CALLED ---------------
FATAL CALLED FROM FILE:  <stdin>  LINE:    6241
troubles, could not find trapping x locations

说是垂直气压层上没有数据,很疑惑,明明下载了50hPa的数据,反复修改 层数、etac等依然重复报错。
于是有两个猜想:
1、下载数据时只下到了50hPa,num_metgrid_levels=30太少不够。
2、ungrib链接时将3D数据(pressure)与2D数据(single)同时链接出现问题。
于是重新去下载数据,这次下到了1hPa,将namelist中的 num_metgrid_levels改成38,重新跑ungrib和metgrib,成功运行real,完成了初始化。
在这里插入图片描述

wrf.exe运行

继续报错……
报错记录一:

```python
 CM_AC_URB3D  0.0000000E+00
 SFVENT_URB3D  0.0000000E+00
 LFVENT_URB3D  0.0000000E+00
 FRC_URB2D  0.0000000E+00
 UTYPE_URB2D           0
 I           1 J         120
 num_urban_hi          15
-------------- FATAL CALLED ---------------
module_physics_init: Use sf_sfclay_physics= 1 or 91 for this pbl option
----------------------------------------

因为我的边界层方案选择YSU,因此 必须sf_sfclay_physics=1。修改继续运行wrf.exe、
在这里插入图片描述
可以用ps-a查看进程,一阵漫长的等待后,得wrfout_d01_YYYY-MM_DD_hh:mm:ss 文件。

在这里插入图片描述

查看输出结果

用ncl看一下输出文件的变量信息:

Number of global attributes:     134
Number of dimensions:    10
Number of variables:     189

189个变量,有点多,就画下海温吧。

 float SST ( Time, south_north, west_east )
         FieldType :    104
         MemoryOrder :  XY
         description :  SEA SURFACE TEMPERATURE
         units :        K
         stagger :
         coordinates :  XLONG XLAT XTIM

使用自带NCL自带的脚本简单画一画:

;Load NCL scripts
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"


begin

 s=addfile("wrfout_d01_2018-05-05_18:00:00","r")
; print(s)
; printVarSummary(s)
 sst=wrf_user_getvar(s,"SST_INPUT",0)                     ;Surface SW downwelling flux
 sst@_FillValue =9999
; printVarSummary(dsw)
 wks = gsn_open_wks("png","sst_input")
; cmap = read_colormap_file("BlAqGrYeOrRe"); choose colormap
 opts = True                                  ; Set some Basic Plot options
  opts@MainTitle = "SEA SURFACE TEMPERATURE INPUT"             ; plot mods desired
  res = opts                                   ; Use basic options for this field
  res@cnFillOn = True                          ; Create a color fill plot
 res@ContourParameters = (/275.,280.,1. /) ; Set the levels

  contour = wrf_contour(s,wks,sst,res)

  pltres = True                                ; Set plot options
  mpres = True                                 ; Set map options
  plot = wrf_map_overlays(s,wks,(/contour/),pltres,mpres) ; Plot the field over a map background
end

出的图:
在这里插入图片描述
几乎没啥变化(这不是当然吗),毕竟是海温变化不会大。
总之跑通了,至于效果好不好,之后再摸索吧。

<think>好的,我现在需要帮助用户解决WRF的real程序运行时出现的报错问题,用户怀疑是否与编译有关。首先,我应该回想一下WRF的编译和real.exe运行过程中常见的错误来源。 首先,用户提到在运行real.exe时总是报错,可能的原因有很多。根据经验,编译问题确实可能导致后续程序运行错误,但还有其他可能性。我需要分步骤分析可能的错误点,帮助用户逐一排查。 第一步,编译问题。WRF的编译需要正确的环境设置,比如编译器(如GCC、Intel)、依赖库(如NetCDF、MPI)的路径是否正确。如果编译时没有报错,可能问题不在编译,但有时候即使编译成功,如果某些库路径不正确,运行时仍会出错。比如,NetCDF库的版本不兼容或者路径设置错误,可能导致real.exe找不到所需的库文件。 第二步,WPS前处理是否正确完成。real.exe需要输入的met_em文件来自WPS的metgrid.exe。如果地理数据文件不正确,或者metgrid没有成功生成数据,real.exe运行时可能会因为输入文件缺失或格式错误而报错。需要确认用户是否成功运行了geogrid.exe和metgrid.exe,且met_em文件存在于正确的目录中。 第三步,namelist.input配置错误。real.exe的配置参数如时间设置、域配置、物理参数化方案等必须与WPS生成的met_em文件一致。特别是时间设置,如果模拟的时间段不在输入数据的时间范围内,或者时间步长设置不合理,会导致错误。此外,域的大小和位置也需要正确,不能超出地理数据的范围。 第四步,输入数据的问题。如果用户使用的气象输入数据(如GFS或ERA5)有缺失或格式不正确,real.exe在处理时可能会报错。需要确认数据下载完整,时间步长匹配,使用正确的Vtable进行数据转换。 第五步,资源不足。例如,内存不足或磁盘空间不够,可能导致real.exe运行失败。尤其是在处理高分辨率或大域时,需要足够的内存和存储空间。 第六步,运行问题。如果用户使用MPI运行real.exe,可能需要检查MPI的配置是否正确,进程数是否合理,是否在所有节点上都能访问必要的文件。 接下来,我需要将这些可能的原因组织成用户容易理解的步骤,建议用户按照顺序检查,提供具体的检查方法,例如查看编译日志、检查环境变量、验证namelist参数等。同时,应该建议用户查看具体的报错信息,因为错误日志通常会给出更直接的线索,比如文件找不到、参数不合法等。 此外,常见的编译错误可能包括NetCDF库路径不正确,此时在编译WRF之前需要设置NETCDF环境变量。如果用户没有正确安装依赖库,或者使用了不兼容的版本,编译后的程序可能在运行时出现问题。例如,使用NetCDF4但没有编译支持HDF5,或者编译器与库文件的版本不匹配。 最后,建议用户提供具体的错误信息,这样可以更精准地定位问题。例如,如果错误信息提到“Could not open met_em files”,那么问题可能出在WPS步骤;如果提到“Segmentation fault”,可能是内存或编译问题。</think>在进行WRF的`real.exe`运行时出现报错,可能与编译、配置或输入数据有关。以下是逐步排查的建议: --- ### **1. 检查编译问题** - **现象**:若编译阶段存在隐患(如依赖库路径错误),即使编译成功,运行时仍可能报错。 - **排查方法**: 1. **查看编译日志**:确认`configure.wrf`中设置的编译器(如GNU/Intel)与依赖库(NetCDF、MPI)一致。 2. **验证环境变量**:确保`NETCDF`路径正确: ```bash echo $NETCDF # 应输出类似/netcdf/path的路径 ``` 3. **测试案例**:尝试运行WRF自带的测试案例(如`em_real`),若成功则编译无误。 --- ### **2. 检查WPS前处理** - **现象**:若`metgrid.exe`未生成`met_em*`文件,`real.exe`会因输入缺失报错。 - **排查方法**: 1. 确认`geogrid.exe`和`metgrid.exe`已成功运行。 2. 检查`wrf/run`目录下是否存在`met_em.d01.*`文件。 3. 确保`namelist.input`中的时间设置与`met_em`文件的时间范围一致。 --- ### **3. 检查namelist.input配置** - **常见错误**:域配置、时间步长、物理参数冲突。 - **关键参数**: ```plaintext &time_control start_year = 2023, # 必须与输入数据时间一致 end_year = 2023, ... &domains dx = 10000, # 网格分辨率需与WPS一致 e_we = 100, # 域范围不可超过地理数据范围 e_sn = 100, ``` - **建议**:使用官方示例的`namelist.input`模板逐步修改。 --- ### **4. 输入数据问题** - **现象**:GFS/ERA5等数据格式错误或时间不连续。 - **排查方法**: 1. 使用`ncdump -h`检查输入数据的时间步长和变量是否完整。 2. 确保通过`ungrib.exe`生成的中间文件(如`FILE:2023-*`)无缺失。 --- ### **5. 资源限制** - **现象**:内存不足或磁盘空间耗尽。 - **解决**: - 监控运行时的内存使用(如`top`命令)。 - 检查磁盘剩余空间(`df -h`)。 --- ### **6. 报错信息分析** - **关键步骤**:记录`real.exe`的完整报错信息,常见错误类型: - **文件缺失**: ```plaintext FATAL: Could not open file "met_em.d01.2023-*" ``` ➜ 检查WPS步骤和文件路径。 - **参数不合法**: ```plaintext FATAL: Error in ext_gr1_* field = PRES ``` ➜ 检查`namelist.input`中的物理方案(如`mp_physics`)是否兼容。 - **段错误(Segmentation Fault)**: ➜ 可能因编译问题或内存溢出,尝试重新编译或减少网格数。 --- ### **建议操作流程** 1. 重新编译WRF(选择`dmpar`或`serial`选项)记录日志。 2. 运行测试案例`em_real`验证环境。 3. 检查`namelist.input`与WPS输出的一致性。 4. 提供具体报错信息以进一步定位问题。 若提供具体错误日志,可更精准诊断原因!
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值