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[@]}doecho ${var}for hour in ${hlist[@]}doecho ${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"donedone
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/bashvar3d=("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->longitudeOpt                = 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   = Truelatlon_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                      = TrueOpt@InterpMethod         = "bilinear"     ; defaultOpt@ForceOverwrite       = TrueOpt@PrintTimings         = TrueESMF_regrid_gen_weights(srcGridName,dstGridName,wgtFileName,Opt)delete(Opt);---------------------------------
;----------------------------------------------------------------------
; Apply the weights to a given variable
;----------------------------------------------------------------------Opt                = TrueOpt@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 variableFIELD_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             = 200100wrf_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-1opt@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.mzph.cn/diannao/40892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有哪些在本地运行大模型的方法

前言 在本文中,我们将看到在本地运行任何 LLM 的不同方法 1/ LMStudio LM Studio 是一款桌面应用程序,用于在计算机上运行本地 LLM。链接:https://lmstudio.ai/ 2/ Ollama Ollama 是一款工具,可让您在机器上本地运行开源大型语…

vue项目静态图片下载

正常情况下只需要传入图片路径就可以进行下载 methods: {downs(path, name) {//必须同源才能下载var alink document.createElement("a");alink.href path;alink.download name; //图片名alink.click();},}, 但是当我们downs方法中直接传入"/assets/load/xx…

二、分布式软总线是如何高效的传输数据和任务的

分布式软总线在HarmonyOS中高效传输数据和任务主要依靠以下几个关键技术点和设计原则: 设备快速发现与连接: 利用多种通信技术(如Wi-Fi、蓝牙、有线连接等),结合广播、多播及服务发现协议,实现设备间的快速发现与稳定连接。这包括设备的唯一标识管理、网络条件自适应选择…

【pytorch14】感知机

单层感知机模型 对于单层的感知机,它的激活函数是一个sigmoid 对于符号的定义做一个规范化,输入层每一层进行一个编号 输入是第0层,上标0表示属于输入层,下标0到n表示一共有n个节点(这里严格来说应该是0~n-1,为了书写…

一站式广告监测新体验,Xinstall助你广告投放更精准

在这个移动互联网飞速发展的时代,App推广与运营成为了每个开发者与广告主关注的焦点。然而,面对琳琅满目的广告平台和复杂的投放环境,如何精准评估广告效果、优化投放策略,成为了摆在面前的一道难题。今天,我们就来聊聊…

Jemeter--关联接口压测

Jemeter–独立不变参接口压测 Jemeter–独立变参接口压测 Jemeter–关联接口压测 案例分析 比如:有个波次复核接口很慢,优化后需要压测。但是波次复核接口数据是由另外两个接口(配单详情、内盒信息)的数据组合而来,而…

排序题目:三个数的最大乘积

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:三个数的最大乘积 出处:628. 三个数的最大乘积 难度 3 级 题目描述 要求 给定一个整数数组 nums …

fastadmin最新版导出数据时 表格中会有 html标签的解决办法

fastadmin 自带的导出方法, 是一个纯前端的导出, 没有请求后台的接口 当我们使用导出功能时, 有些数据, 我们在设计的时候,配置的是 枚举类型的 但是当我们导出数据的时候, 居然导出的数据中带有 html 的…

使用el-col和el-row布局,有版心,一页有两栏布局 三栏布局 四栏布局 使用vue动态渲染元素

使用Vue结合Element UI的el-row和el-col组件来实现版心布局,并动态渲染不同栏数的布局,可以通过以下步骤实现: 定义版心容器:使用el-container来定义整个页面的容器,其中el-header、el-main、el-footer分别定义头部、主…

k8s-第十节-Ingress

Ingress 介绍 Ingress 为外部访问集群提供了一个 统一 入口,避免了对外暴露集群端口;功能类似 Nginx,可以根据域名、路径把请求转发到不同的 Service。可以配置 https 跟 LoadBalancer 有什么区别? LoadBalancer 需要对外暴露…

Promise解决异步编程问题

一个典型的异步编程问题:即您尝试在循环中发起多个异步请求,并希望在所有请求都完成后执行某些操作。然而,由于JavaScript的异步性质,num和total的比较在循环结束时立即执行,而不是在所有请求都完成后执行。这可能导致…

【12321骚扰电话举报受理中心-短信验证安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

开发常识:命令行终端、库源码、开发环境阶段

目录 命令行终端 集成开发环境(IDE ):有插件校验等限制,成功率低于操作系统 库源码 github上搜 官网 UNPKG托管开源的包 专业名词 环境 开发:本地机 开发和调试 生产:最终部署 测试:…

交流负载箱的主要功能有哪些?

交流负载箱可以模拟各种实际用电设备的功率、电流、电压等参数,使得电源系统在运行过程中能够承受实际负载的考验,确保电源系统的稳定运行。通过交流负载箱对电源设备进行测试,可以检测出电源设备在过载、短路等异常情况下的保护功能是否正常…

Linux和mysql中的基础知识

cpu读取的指令大部分在内存中(不考虑缓存) 任何程序在运行之前都的加入到内存。 eip->pc指针,指明当前指令在什么位置。 代码大概率是从上往下执行的,基于这样的基本理论。既可以将一部分指令加载到CPU对应的缓存中&#xf…

解决zip文件中文乱码问题

后台微服务运行在linux环境里,前端Vue。在一个项目中,把后台的文件打包成zip,下载到前台。结果发现zip文件名本身乱码,zip文件内压缩的文件也是乱码。所谓乱码,程序员都见过,就是中文变成了乱七八糟的字符。…

【CSAPP】-datalab实验

实验原理与内容 本实验每位学生拿到一个datalab-handout.tar文件。学生可以通过U盘、网盘、虚拟机共享文件等方式将其导入到Unbuntu实验环境中,选择合适位置存放。然后在Ubuntu环境下解压。解压后,根据文件中的叙述和要求更改bits.c文件。本次实验的主要…

【全网最全】2024年APMCM第十四届亚太地区大学生数学建模竞赛(中文赛项)完整思路解析+代码+论文

我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

云计算【第一阶段(26)】Linux网络设置

一、查看网络配置 1.查看网络接口信息ifconfig 查看所有活动的网络接口信息 2.ifconfig命令 查看指定网络接口信息 ifconfig 网络接口 (1)第一行:以太网卡的名字 ens33其中en代表以太网卡, centos6的是eth0, e…

本地maven仓库向远程仓库部署jar包

使用mvn命令即可,如下 mvn deploy:deploy-file \ -DgroupIdtop.rdfa.auth \ -DartifactIdrdfa-auth-spring-mvc-starter \ -Dversion3.0.0-20230718-RELEASE \ -Dpackagingjar \ -Dfile/Users/panmeng/Documents/repository/top/rdfa/auth/rdf…