> 文章列表 > WRF后处理:使用ncl脚本批量提取wrfout变量并输出/Shell 入门:Shell进入不同文件夹执行脚本

WRF后处理:使用ncl脚本批量提取wrfout变量并输出/Shell 入门:Shell进入不同文件夹执行脚本

WRF后处理:使用ncl脚本批量提取wrfout变量并输出/Shell 入门:Shell进入不同文件夹执行脚本

目录

    • 背景
    • 思路
    • NCL提取wrfout特定变量
    • Shell批量执行

背景

在之前的博客WRF后处理总结我提到过将NCL与python结合进行后处理的问题,即,使用NCL进行wrfout变量的提取、计算、输出,再用已有python脚本绘图,这样可以极大节省时间。
对于run模式的而言,连续提交好几个作业任务进行敏感性试验是家常便饭,那么,能不能用NCL脚本加上shell同时对几个敏感性试验的结果进行提取并输出呢?这就是我打算实现的事。

思路

思路其实也很简单:敏感性实验的目的无非是比较几个特定变量的差异,我们只需将存于不同文件夹的wrfout所需提取出来,输出再由python绘图即可。
当然,如果服务器上已经装有python可以无需输出,只需直接调用py脚本,但由于服务器自身原因,加之Windows下的可视化绘图更加精致直观,这里我还是选择输出再绘图的模式。

NCL提取wrfout特定变量

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/esmf/ESMF_regridding.ncl"
;get varaiables from wrfout
begin
;DIR1 = getenv(path1)
DIR1 ="/public/home/zhangzilu/Build_WRF/PWRF-4.3/run/out_amsr/"
FILES1 = systemfunc (" ls -1 " + DIR1 + "wrfout* ")
print(FILES1)
a1 = addfiles(FILES1,"r")
vlist=(/"p","slp","z","tk","T2","QVAPOR","rh","U10","V10","ua","va","wa","GLW","LWUPB","SWDOWN","SWUPB","HFX","LH","PBLH"/)
n=toint(dimsizes(vlist))
time = wrf_user_getvar(a1,"times",-1)  ;
print(time)
print(n)
setfileoption("nc", "Format", "NetCDF4Classic")
out1=addfile("wrf_var.nc", "c")
;p = wrf_user_getvar(a1,"p",-1)
;out1->p = p
;out1->times = time
;out2=addfile("wrf_avevar.nc", "c")
m=n-1
do i=0,m
data1=wrf_user_getvar(a1,vlist(i),-1)
printVarSummary(data1)
;data2=dim_avg_n(data1, 0)
out1->$vlist(i)$ = data1
;out2->vlist(i) = data2
delete(data1)
end do
end

写一个循环遍历需要的文件和变量名称提取即可。

Shell批量执行

由于我们的敏感性试验往往放在不同的文件夹中,我们可以写一个bash脚本,一口气将所有的试验变量提取出来。
思路相同,只要链接进入不同的文件夹内执行就好:

#!/bin/bashWRFpath="/public/home/zhangzilu/Build_WRF/PWRF-4.3/run/"
expname=(noseaice/ nosnow/ out_amsr/)
for file in ${expname[*]}
doecho $filepath[${#path[*]}]=${WRFpath}${file}echo $pathsname="get_varwrf.ncl"ln -sf "/public/home/zhangzilu/Build_WRF/PWRF-4.3/run/get_varwrf.ncl" ${path}${sname}cd $pathncl get_varwrf.nclpath=()
done

这里唯一值得一提的是shell中列表和数组的索引与构建问题,在shell中,字符串变量只能作为列表存放,不能与数组弄混。
以上。