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.pswp.cn/diannao/40892.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40892.shtml
英文地址,請注明出處:http://en.pswp.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…