爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 860|回复: 1

[作图] 纬圈环流(Walker)结果异常

[复制链接]

新浪微博达人勋

发表于 2023-10-26 09:18:09 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 顺利毕业! 于 2023-10-26 16:08 编辑

更新:
已解决
本质上是理解公式有误,具体可参考一个文献,提到了Hadley和Walker环流的公式,比较详细Variability of the extent of the Hadley circulation in the southern hemisphere: a regional perspective
计算环流前需要先对矢量风即U和V进行处理,主要用到两个函数:uv2dvF_Wrap和dv2uvF_Wrap,具体用法可参考NCL官网
如果变量存在缺测值,则需要先利用NCL的poisson_grid_fill函数把缺测值补上(上述两个函数不允许缺测)
主要注意点就这些,希望能帮到同样没有大气动力学基础的小白,如果有不足之处还请各位前辈指出~
;;;;===================

最近在尝试分析Walker环流,打算用流函数来表示。
看到一个博主分享了两种方案来计算经圈环流(Hadley):一是NCL自带的 zonal_mpsi函数,二是自己做垂直积分计算。这样还可以用于计算纬圈流函数。(博主链接如下:辐散风和旋转风 (renqlsysu.github.io))ps:博主好多可以学习的帖子,赞!!!
于是我就按照方案二去写NCL脚本,但是气候态的Walker环流就和正常情况下(西太上升流,东太下降流)不一致,自查了好久都没发现问题,还请各位前辈帮忙看看代码是哪里出了问题!!!

begin

;;;;矢量风数据读取及处理
f1             = addfile("./***_U_V_chazhi.nc", "r")                          ;气候态数据
f2             = addfile("./***_PS.nc", "r")         
U_ctrl         = f1->U_ctrl_vinth2p(:,:,{100:1000},{-5:5},:)   
Uc_ave         = dim_avg_n_Wrap(U_ctrl,0)
Uc_JJA         = month_to_season(Uc_ave, "JJA")
Uc_JJAave      = dim_avg_n_Wrap(Uc_JJA,0)                   ;JJA平均,(lev_p,lat,lon); lev_p is top-to-bottom (hpa)
Uc_Za          = dim_avg_n_Wrap(Uc_JJAave,1)                ;对lat纬进行平均
Uc_Za          = Uc_Za(lev_p|::-1,lon|:)                            ;lev_p is bottom-to-top (hpa)               

f3             = addfile("./*****_U_V_chazhi.nc", "r")                             ;强迫数据,分析的是JJA1
f4             = addfile("./*****_PS.nc", "r")  

U_foc         = f3->U_forcing_vinth2p(:,12:23,{100:1000},{-5:5},:)        ;取JJA1
Uf_ave         = dim_avg_n_Wrap(U_foc,0)
Uf_JJA         = month_to_season(Uf_ave, "JJA")
Uf_JJAave      = Uf_JJA(0,:,:,:)                                                          ;JJA1 lev_p,lat,lon                              
Uf_Za          = dim_avg_n_Wrap(Uf_JJAave,1)                                   ;对lat纬进行平均
Uf_Za          = Uf_Za(lev_p|::-1,lon|:)

;;;;垂直积分
pi             = atan(1.0)*4                                ;圆周率
a              = 6378388.                                   ;地球半径
g              = 9.80665
lat            = f1->lat({-5:5})
lon            = f1->lon
plev           = (/1000,975,950,925,900,875,850,825,800,775,750,700,650,600,550,500,450 \
,400,350,300,250,225,200,175,150,125,100/)*100             ;单位为Pa
ptop           = min(plev)
ps_ctrl        = f2->PS_ctrl(:,:,{-5:5},:)                             ;单位为Pa
pc_ave         = dim_avg_n_Wrap(ps_ctrl,0)
pc_JJA         = month_to_season(pc_ave, "JJA")
pc             = dim_avg_n_Wrap(pc_JJA,0)
dp_ctrl        = dpres_plevel_Wrap(plev, pc, ptop, 0)
dpc            = dim_avg_n_Wrap(dp_ctrl,1)                  ;对lat纬进行平均

nlev           = dimsizes(plev)
nlon           = 144
msf_c          = new((/nlev,nlon/), float)
do i=0,nlev-1,1
    msf_c(i,:) = dim_sum_n(Uc_Za(i:nlev-1,:)*dpc(i:nlev-1,:),0)   
    msf_c(i,:) = msf_c(i,:)*2*pi*a/g
end do  

Uc             = msf_c /10000000000.                        ; *10的-10次 方便画图
copy_VarCoords(Uc_Za, Uc)

ps_foc         = f4->PS_foc(:,12:23,{-5:5},:)               ;JJA1
pf_ave         = dim_avg_n_Wrap(ps_foc,0)
pf_JJA         = month_to_season(pf_ave, "JJA")
pf               = pf_JJA(0,:,:)
dp_foc         = dpres_plevel_Wrap(plev, pf, ptop, 0)
dpf            = dim_avg_n_Wrap(dp_foc,1)                  ;对lat纬进行平均

msf_f          = new((/nlev,nlon/), float)
do i=0,nlev-1,1
    msf_f(i,:) = dim_sum_n(Uf_Za(i:nlev-1,:)*dpf(i:nlev-1,:),0)
    msf_f(i,:) = msf_f(i,:)*2*pi*a/g
end do

Uf             = msf_f /10000000000.
copy_VarCoords(Uf_Za,Uf)

Ua             = Uf - Uc
copy_VarMeta(Uc, Ua)

olev_p          = Uc_Za&lev_p
olev_p!0        = "lev_p"
olev_p@longname = "lev_p"
olev_p@units    = "hPa"
olev_p&lev_p    = olev_p
Ua!0            = "lev_p"
Ua&lev_p        = olev_p

;;;;draw
wks = gsn_open_wks("eps","./Walker_5S-5N_JJA1")
gsn_define_colormap(wks,"MPL_RdBu")

res                              = True
res@pmTickMarkDisplayMode        = "Always"         ;显示经纬度°
res@trYReverse                   = True
res@gsnDraw                      = False
res@gsnFrame                     = False
res@tmYROn                       = False
res@tmXTOn                       = False
res@trYMinF                      = 100

res@vpHeightF                    = 0.3
res@vpWidthF                     = 0.7

res@tmXBMode                     = "Explicit"
res@tmXBValues                   = (/"60","120","180","240","300"/)
res@tmXBLabels                   = (/"60~S~o~N~ E","120~S~o~N~ E","180~S~o~N","120~S~o~N~ W","60~S~o~N~ W"/)
res@tmXBLabelDeltaF              = -0.5
res@tmYLLabelDeltaF              = -0.4
res@tmYLMode                     = "Explicit"
res@tmYLValues                   = (/"1000","700","500","400","300","200","100"/)
res@tmYLLabels                   = (/"1000","700","500","400","300","200","100"/)

res@tiMainString                 = " "
res@tiYAxisString                = "Level (hPa)"
res@tiYAxisFontHeightF           = 0.022
res@tiYAxisOffsetXF              = 0.01                             ;平行于x轴移动标签
res@gsnLeftString                = "(a) Walker circulation"
res@gsnLeftStringOrthogonalPosF = -0.01       ;调节字体上下位置
res@gsnLeftStringFontHeightF    = 0.02     ;调节字体大小
res@gsnRightString               = "Tam1850_JJA1"
res@gsnRightStringOrthogonalPosF  = -0.005
res@gsnRightStringFontHeightF     = 0.02

res@tmXBMajorLengthF             = 0.008             ;设置主刻度线的长短
res@tmYLMajorLengthF             = 0.008
res@tmXBMajorOutwardLengthF      = 0.008
res@tmYLMajorOutwardLengthF      = 0.008
res@tmYROn                       = False
res@tmXTOn                       = False
res@tmXBLabelFontHeightF         = 0.02
res@tmYLLabelFontHeightF         = 0.02

res1                              = res
res1@cnFillOn                     = True
res1@cnLinesOn                    = False
res1@cnLineLabelsOn               = False
res1@lbLabelBarOn                 = True
res1@cnLevelSelectionMode         = "ManualLevels"
res1@cnMinLevelValF               = -40.                 ; -4~4 0.5 -14~14 1.
res1@cnMaxLevelValF               = 40.
res1@cnLevelSpacingF              = 4
res1@tmYRMode                     = "Automatic"          ; turn off special labels on right axis
;;lb
res1@gsnSpreadColorStart         = 129  ;选取色表颜色
res1@gsnSpreadColorEnd           = 2
res1@pmLabelBarHeightF            = 0.1      ;色标长宽
res1@pmLabelBarWidthF             = 0.85
;res1@lbBoxLinesOn                 = False
res1@lbBoxLineColor               = "black"    ;色标边框颜色
;res1@lbBoxLineThicknessF          = 0.5        ;色标边框粗细
res1@pmLabelBarOrthogonalPosF     = 0.05      ;色标垂直方向的位置
res1@pmLabelBarParallelPosF       = 0.57      ;色标水平方向的位置
res1@lbLabelFontHeightF           = 0.02       ;设置色标数字的字体大小
res1@lbLabelStride                = 2           ;数字间隔
res1@lbTitleOn                    = True
res1@lbTitleString                = "10~S~10~N~ kg/s"
res1@lbTitlePosition              = "Right"
res1@lbTitleDirection             = "Across"
res1@lbTitleJust                  = "CenterLeft"
res1@lbTitleFontHeightF           = 0.02

plot  = gsn_csm_pres_hgt(wks, Ua, res1)   ; plaace holder

res2                              = res
res2@cnFillOn                     = False
res2@cnLinesOn                    = True
res2@cnLineLabelsOn               = False
res2@lbLabelBarOn                 = False
res2@gsnContourNegLineDashPattern = 11
res2@gsnContourPosLineDashPattern = 0
res2@cnInfoLabelOn                = False
res2@tmYLOn                       = False
res2@tmXBOn                       = False
res2@cnLineDrawOrder              = "PostDraw"
plot1                             = gsn_csm_contour(wks,Uc,res2)

overlay(plot, plot1)
draw(plot)
frame(wks)



end

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2024-2-11 17:59:23 来自手机 | 显示全部楼层
友友,求分享更正后的代码
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表