WRF学习——使用CMIP6数据驱动WRF/基于ncl与vdo的CMIP6数据处理

动力降尺度

国际耦合模式比较计划(CMIP)为研究不同情景下的气候变化提供了大量的模拟数据,而在实际研究中,全球气候模式输出的数据空间分辨率往往较低(>100Km,缺乏区域气候特征,为了更好地研究不同情景下,某一区域的气候变化特征,我们往往需要更高分辨率的模拟数据。此时便需要对全球模式输出的数据进行降尺度研究,将大尺度信息变量与小尺度信息变量建立联系,获得更多的小尺度的变量。通常,降尺度可分为(1)动力降尺度 (2)统计降尺度 (3)二者结合降尺度

动力降尺度通常是将全球模式输出的数据作为驱动场,输入至区域气候模式中,从而获取描述区域气候特征的更高分辨率数据。WRF作为最常用的中尺度天气预测模式,将其与最新的CMIP6全球模式数据结合,是动力降尺度最常用的方法。

下面以CMIP6数据中的MPI-ESM2-HR数据为例,展示使用CMIP6数据驱动WRF的基本步骤。

对于CMIP6驱动WRF,已有老师在github上上传了基于python的工具包,习惯在LINUX下使用python的用户可以尝试:cmip6-to-wrfnterm

基本思路都是类似的,只不过本文主要是基于服务器现有的NCL、CDO与shell脚本实现。

CMIP6数据准备

本次使用的模式为MPI-ESM2-HR数据,空间分辨率为100km,选择原因:数据全面、分辨率好、应用较多,可自己根据需求去官网下载数据。

本次所需下载并驱动的变量有:

``

v_namewrf_nameunitsdimdescnotes
psPSFCPa2dsurface pressure
pslPMSLPa2dMean sea-level pressure
zgGHTm3dgeopotential height
taTTK3dair temperature
tasTTK2d2-m temerature
uaUUm s-13du-component wind;
uasUUm s-12d`10-m u-component wind
vaVVm s-13dv-component wind
vasVVm s-12d10-m v-component wind
husSPECHUMDkg kg-13dspecific humidity
hussSPECHUMDkg kg-12d10-m specific humidity
tsSKINTEMPK2dSkin temperature
tslST000010K2d0-10cm soil temperature
tosSSTK2dSea temperatureoptional
mrsosSM000010m3 m-32d0-10cm soil moisture
snwSNOWkg m-22dsnow massoptional
sicSEAICE12dseaiceoptional

下载数据命名一般为以下格式:
在这里插入图片描述
变量名称_时间分辨率_层级_模式名称_情景名称_年份时间,在MPI-ECSM-HR变量的对应需要去自行查询变量表格、

预处理

首先由于下载的数据通常是10年一个,致使在实际使用时,我们首先要将需要对应时段的变量提取出来,同样的,为了后续使用shell脚本更好地进行批量处理,这些变量应当以一种特定的格式命名。
使用cdo 的selvar seldate功能,并结合shell脚本,便能很好的完成:

#!/bin/bash

#suffix="_6hrPlevPt_MPI-ESM1-2-HR_ssp126_r1i1p1f1_gn_201501010600-202001010000.nc"
startdate=$1
enddate=$2
#date1=$1
hlist=("00" "06" "12" "18")
varlist=("ta" "ua" "va" "zg" "tas" "uas" "vas" "ts" "tsl" "snw" "hus" "huss" "psl")
var2d=("tas" "uas" "vas" "ts" "tsl" "snw" "huss" "psl")
var3d=("ta" "ua" "va" "zg" "hus")

#echo ${date1}

do
date1=`date -d "${startdate}" +%Y-%m-%d`
echo ${date1}
  for var in ${var2d[@]}
  do
  echo ${var}
   for hour in ${hlist[@]}
   do
   echo ${hour}
   out_filename=${var}_${date1}_${hour}.nc
   #input_filename=${var}${suffix}
   input_filename=`ls ${var}_*ssp*`
   echo ${out_filename}
   echo ${input_filename}
   cdo -seldate,${date1} -selhour,${hour} -selname,${var}  ${input_filename} ${out_filename}
   echo "cdo done"
   done
 done
startdate=`date -d "+1 day ${startdate}" +%Y%m%d`
done

在运行时,输入bash run.sh startdate enddate便可将相应时间段提取并输出为变量_时间的形式,如:
在这里插入图片描述
注意:下载的CMIP6数据变量存在2D与3D区别,在处理3D变量,如ua va时,cdo还应当加上sellevel-提取对应的层数,这是由于该数据中ua va的垂直层仅有7层,而ta hus zg则有28层,在后续运行WRF时,3D数据的层次应当保持一致!!!

处理好后的数据,为了方便,根据2d与3d的不同将其合并:

#!/bin/bash

var3d=("ta" "ua" "va" "zg" "hus")
var2d=("tas" "uas" "vas" "ts" "tsl" "snw" "huss" "psl")

#date1=$1
startdate=$1
enddate=$2
hlist=("00" "06" "12" "18")
while [[ ${startdate} -lt ${enddate} ]]
do
for hour in ${hlist[@]}
do
date1=`date -d "${startdate}" +%Y-%m-%d`

echo ${date1}
echo ${hour}
suffix=${date1}_${hour}.nc
echo ${suffix}
outputfile=MPI_HR_${date1}_${hour}_00:00.nc
echo ${outputfile}
cdo merge ta_${suffix} ua_${suffix} va_${suffix} zg_${suffix} hus_${suffix} 3D_${outputfile}
#cdo merge tas_${suffix} uas_${suffix} vas_${suffix} ts_${suffix} huss_${suffix} tsl_${suffix} psl_${suffix} snw_${suffix} 2D_${outputfile}
done
startdate=`date -d "+1 day ${startdate}" +%Y%m%d`
echo ${startdate}
done

运行后可得到2d_MPI_HR和3dMPI_HR文件。

插值

我们应当注意的是,CMIP6的经纬度很多时候并不是等经纬度间距的,比如我下载的数据就是100km,在海洋上分辨率有时达到50km。这就使得我们在运行之前,首先要将其插值到均一的lat/lon坐标下,否则WRF将很难处理。

值得注意的是,CMIP6数据可分为大气与海洋两部分,而大气的经纬度与海洋的经纬度则存在差异,比如,大气的经纬度数据为一维数据,海洋则以二维数据给出,因此插值时需要分开处理。请在插值前弄清楚变量的经纬度网格。

在这里插入图片描述
tas经纬度,以一维表征

在这里插入图片描述
tos经纬度网格为曲线网格,经纬度为二维形式
对于两种在ncl中使用不同的插值函数即可,对一维使用rectilinear_to_SCRIP将经纬度转为映射文件,在使用ESMF_regrid_with_weights插值,对二维曲线网格,使用curvilinear_to_SCRIP函数,再使用ESMF_regrid_with_weights插值。
以下为插值的代码示例:

undef ("regrid_MPI")
function regrid_MPI(fname:string,inputv:numeric)
local regrid_var,MPI_var,lat,lon,inputf
begin
inputf=addfile(fname,"r")
lat=inputf->latitude
lon=inputf->longitude

Opt                = True
Opt@SrcRegional    = True
Opt@ForceOverwrite = True
Opt@PrintTimings   = True
Opt@Title          = "MPI-ESM1"
Opt@CopyVarAtts    = True
;Opt@GridMask       = where(.not.ismissing(zg),1,0)
Opt@CopyVarCoords  = False
srcGridName    = "SCRIP_MPI-ESM1_grid"+".nc"
curvilinear_to_SCRIP(srcGridName, lat,lon, Opt)
delete(Opt)
;----------------------------------------------------------------------
; Convert destination grid to a SCRIP convention file.
;----------------------------------------------------------------------
dstGridName = "dst_SCRIP.nc"
Opt                = True
Opt@LLCorner       = (/ -90.d,   0.d/)
Opt@URCorner       = (/  90.d,360.d/)
Opt@ForceOverwrite = True
Opt@PrintTimings   = True

latlon_to_SCRIP(dstGridName,"1x1",Opt)
;---Clean up
delete(Opt)
;----------------------------------------------------------------------
; Generate the weights that take you from the NCEP grid to a
; 1x1 degree grid.
;----------------------------------------------------------------------

 wgtFileName = "MPI_2_Rect.nc"
 Opt                      = True
 Opt@InterpMethod         = "bilinear"     ; default
 Opt@ForceOverwrite       = True
 Opt@PrintTimings         = True
 ESMF_regrid_gen_weights(srcGridName,dstGridName,wgtFileName,Opt)
 delete(Opt)

;---------------------------------
;----------------------------------------------------------------------
; Apply the weights to a given variable
;----------------------------------------------------------------------
  Opt                = True
  Opt@PrintTimings   = True

;---In V6.1.0, coordinates and attributes are copied automatically
regrid_var = ESMF_regrid_with_weights(inputv,wgtFileName,Opt)
;printVarSummary(regrid_var)
return(regrid_var)
end


在这里定义了一个regird_mpi函数,在使用是输入文件名以及要插值的变量即可,根据经纬度网格点不同,可将该函数中的curvilinear_to_SCRIPrectilinear_to_SCRIP相互替换。

WRF中间文件撰写

最后,要将插值后的变量数据,转写为WPS的中间文件,该中间文件可直接被metgrid.exe读取,并生成met_em文件。
ncl中就有现成的函数,需要注意的是,撰写时变量的FIELD应当包括在METGRID.TBL中相同,否则metgrid无法识别。
如果数据是2d,则直接撰写,如果数据为3d,则根据层数,循环一层层写:

; for 2d variable

 FIELD_ICE          = "SEAICE"
 UNITS_ICE          = "1"
 DESC_ICE           = "ocean seaice"

FIELD_ST          = "SST"
UNITS_ST          = "K"
DESC_ST           = "sea surface temperature"


re_sic=regrid_MPI(data_filename,sic)
; re_tos=regrid_MPI(data_filename,tos)


opt                   = True
opt@projection        = 0                 ; "Equidistant_Lat_Lon"
opt@date              = DATE1
opt@map_source        = "1×1"
opt@startloc          = "SWCORNER"          ; 8 chars exact
opt@startlon          = 0
opt@startlat          = -90
opt@deltalon          = 1
opt@deltalat          = 1
;opt@is_wind_earth_rel = False
opt@is_wind_earth_relative = False
opt@level             = 200100

wrf_wps_write_int(WPS_IM_root_name,FIELD_ICE,UNITS_ICE,\
                      DESC_ICE,re_sic,opt)
                      
pnew2=(/925,850,700,600,500,250,50/)*100
; For 3D variables
do jlev=0,NLEV2-1
  opt@level = pnew2(jlev)
  wrf_wps_write_int(WPS_IM_root_name,FIELD_U,UNITS_U,\
                     DESC_U,UonP(jlev,:,:),opt)
  wrf_wps_write_int(WPS_IM_root_name,FIELD_V,UNITS_V,\
                      DESC_V,VonP(jlev,:,:),opt)
end do


最后使用WPS文件夹下的util/./rd_intermediate.exe 确认是否读取成功,关于这一部分,可参考我以前的博客:撰写WPS intermediate file添加海冰场

初始化

将输出的中间文件链接至WPS文件夹,修改namelist.wps文件夹&metgrid部分的fg_name,使其读取我们撰写的中间文件。
在这里插入图片描述之后的步骤就和普通运行WRF一样了,请注意由于数据本身的性质,土壤层数与垂直层数量较少,在设置namelist时记得修改与其保持一致。

要点(坑)

主要的坑在于数据本身。

  1. 3D数据垂直层不一致,ua与va数据仅有7层,而ta hus zg等数据却又有8层,因此在撰写文件时必须注意对应层数保持一致。
  2. 经纬度格点不一致,注意经纬度各点的类别,在插值时注意区分。
  3. CMIP6数据本身并不是再分析资料,而是预测气候变化的模型输出,常常会出现数据量与WRF所需不对应的问题,请注意各个变量描述。
  4. 除了2D与2D以外,也可以使用CMIP6的2D静态数据,如LANDSEA,步骤类似,主要是通过namelist.wps中的constant_name来设置读取。

相关代码与数据已经发布在Github上,请查询:Write_CMIP_to_wps_int

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/771712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8s 集群(kubeadm) CA 证书过期解决方案

Author:Arsen Date:2024/07/04 目录 一、现象描述二、解决方案三、集群验证 一、现象描述 之前有篇文章《K8s Token 过期解决方案(Kubeadm)》提到了默认生成的 Token 有效期只有 24 小时,过期后 Token 将不可用&#…

C# 类型转换之显式和隐式

文章目录 1、显式类型转换2. 隐式类型转换3. 示例4. 类型转换的注意事项5. 类型转换的应用示例总结 在C#编程中,类型转换是一个核心概念,它允许我们在程序中处理不同类型的数据。类型转换可以分为两大类:显式类型转换(Explicit Ca…

18. JAVA 多线程锁介绍

1. 前言 本节内容主要是对 Java 多线程锁进行介绍,是对锁的一个全方位的概述,为我们对后续深入学习不同的锁的使用方法奠定一个良好的基础。本节内容的知识点如下: 乐观锁与悲观锁的概念,以及两种锁之间的区别,这是并…

文华财经T9多空波段趋势量化交易策略模型源码

// 定义变量 Vars Numeric STEP1,MVALUE1,SARVAL,C; Numeric SARLINE,COND,ZBMA1,ZBMA2; Begin CCLOSE; STEP13/11; MVALUE120/22; SARVALSAR(4, STEP1, MVALUE1); PlotLine("",IIF(SARVAL>0,SARVAL,InvalidNumeric),RED,Circledot); PlotLine("&q…

今晚19点,《语音和心理健康》开讲!

《2024GAS声学大讲堂—音频产业创新技术公益讲座》面向医疗健康的声音与音乐技术系列专题讲座 第五讲 将于 今晚 19点 开讲,本次邀请了 湖南大学 教授 张子兴 演讲,讲座主题:《语音和心理健康》。此次直播方式为腾讯会议、小鹅通和中国电子音…

初出茅庐的小李博客之C语言文件操作

C语言文件操作 在C语言中,文件操作主要是通过标准库函数来实现的。 今天有时间就来学习下一些常用的文件操作函数: C 语言提供了一个 FILE 数据结构,记录了操作一个文件所需要的信息。该结构定义在头文件stdio.h,所有文件操作函…

如何通过IP地址查询地理位置及运营商信息

在数字时代,IP地址(Internet Protocol Address,互联网协议地址)已经成为我们日常网络活动的重要组成部分。每台连接到互联网的设备都被分配了一个唯一的IP地址,它不仅可以识别设备,还可以揭示设备的地理位置…

python数据分析入门学习笔记

目录 一、 数据分析有关的python库简介 (一)numpy (二)pandas (三)matplotlib (四)scipy (五)statsmodels (六)scikit-learn 二、 数据的导入和导出 三、 数据筛选 四、 数据描述 五、 数据处理 六、 统计分析 七、 可视化 八、 其它![](https://…

【C语言】—— 文件操作(下)

【C语言】—— 文件操作(下) 前言:五、文件的顺序读写5.1、 顺序读写函数介绍5.2、 f p u t c fputc fputc 函数5.3、 f g e t c fgetc fgetc 函数5.4、 f p u t s fputs fputs 函数5.5、 f g e t s fgets fgets 函数5.6、 f p r i n t f…

html+css+js淘宝商品界面

点击商品&#xff0c;alert弹出商品ID 图片使用了占位符图片&#xff0c;加载可能会慢一点 你可以把它换成自己的图片&#x1f603;源代码在图片后面 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"…

Word “当前页“ 与 “前一页“ (含部分内容)间有大半页空白,删除空白方法

鼠标光标选中需要向上移的句子&#xff0c;右键点击“段落”&#xff0c;然后在跳出的窗口中按照“换行和分页”中的红色方框内取消勾选后&#xff0c;点击确定即可。

金斗云 HKMP智慧商业软件 任意用户创建漏洞复现

0x01 产品简介 金斗云智慧商业软件是一款功能强大、易于使用的智慧管理系统,通过智能化的管理工具,帮助企业实现高效经营、优化流程、降低成本,并提升客户体验。无论是珠宝门店、4S店还是其他零售、服务行业,金斗云都能提供量身定制的解决方案,助力企业实现数字化转型和智…

Proteus-51单片机-DS18B20多点测温

DS18B20多点测温 一、Proteus仿真演示 每个DS18B20都有一个唯一的64位序列号,这使得在同一总线上可以挂载多个传感器,无需额外的地址分配。主机(通常为单片机)通过特定的时序控制,可以依次读取各个DS18B20的温度数据,实现分布式测温。 二、代码特点 三、开发环境介绍 本…

【unity实战】使用unity的新输入系统InputSystem+有限状态机设计一个玩家状态机控制——实现玩家的待机 移动 闪避 连击 受击 死亡状态切换

最终效果 文章目录 最终效果前言人物素材新输入系统InputSystem的配置动画配置代码文件路径状态机脚本创建玩家不同的状态脚本玩家控制源码完结 前言 前面我们已经写过了使用有限状态机制作一个敌人AI&#xff1a;【unity实战】在Unity中使用有限状态机制作一个敌人AI 那么玩…

收银系统源码分享-PHP可二开

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 私有化独立…

面向对象-封装

一.包 1.简介 当我们把所有的java类都写src下的第一层级&#xff0c;如果是项目中&#xff0c;也许会有几百个java文件。 src下的文件会很多&#xff0c;开发的时候不方便查找&#xff0c;也不方便维护如果较多的文件中有同名的&#xff0c;十分麻烦 模块1中有一个叫test.ja…

Nuxtjs3教程

起步 官方文档 官方目录结构 安装 npx nuxi@latest init <project-name>后面跟着提示走就行 最后yarn run dev 启动项目访问localhost:3000即可 路由组件 app.vue为项目根组件 <nuxt-page />为路由显示入口 将app.vue更改内容如下 <template><d…

WPS中制作甘特图的详细教程

网上没几个详细说怎么在WPS中制作甘特图的&#xff0c;我自己整理了一下详细教程&#xff0c;最终效果如下图所示&#xff1a; 1.写好需要展示的项目相关信息&#xff0c;如下图所示&#xff1a; #####这个进度的百分比渐变效果这样设置就行了 2.现在我们需要计算已用时间和剩…

lodash中flush的使用(debounce、throttle)

在项目的配置中&#xff0c;看到了一个请求&#xff0c;类似是这样的 import { throttle } from lodash-es// 请求函数 async function someFetch(){const {data} await xxx.post()return data }// 节流函数 async function throttleFn(someFetch,1000)// 执行拿到数据函数 a…

Zabbix 配置MySQL数据库监控

Zabbix MySQL数据库监控简介 通过 Zabbix 监控 MySQL 数据库&#xff0c;可以获取有关数据库性能、运行状况和资源使用情况的详细信息&#xff0c;帮助及时发现和解决问题。 Zabbix官方提供了一个名为MySQL by Zabbix agent的监控模板&#xff0c;该模板专为 Zabbix 通过 Zabb…