氣象編程 | NCL來製作厄爾尼諾年的環流合成

2021-02-15 氣象學家
厄爾尼諾年的環流合成

腳本主要內容:

腳本略有缺失,完整腳本請購買施寧教授出的《NCL數據處理與繪圖實習手冊》紙質書籍。版權歸施寧教授所有。

效果如下圖所示:

另外推薦高端封面配圖的書:

由北京大學、中科院化學所等擁有物理化學生物等專業博士學位團隊製作,相關文章發表Nat.Commun./Sci. Adv./Adv. Mater.等SCI論文期刊,擁有深厚的科研背景。

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/csm/contributed.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"

begin
year=ispan(1979,2013,1)  ; 79/80 - 13/14

it_s=197912  ;起始年月
it_e=201411  ;結束年月

refmag = 3   ;參考箭頭所表示的風速大小

;;;read data ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
   ;;  sst


   time   = f_sst->time              ; 讀取其日期
       ; 轉換成公曆日期

          ; 截取指定時間段
          ;
    ;

   ;; h300 
   f_h300 = addfile("./data/h300-197901-201412.nc", "r")
   h300   = short2flt(f_h300->hgt(rec_s:rec_e,0,{-90:90},:))  

   ;; u850 
   f_u850 = addfile("./data/u850-197901-201412.nc", "r")
   u850   = short2flt(f_u850->uwnd(rec_s:rec_e,0,{-90:90},:))  ; 850 hPa    
   
   ;; v850 
   f_v850 = addfile("./data/v850-197901-201412.nc", "r")
   v850   = short2flt(f_v850->vwnd(rec_s:rec_e,0,{-90:90},:))  ; 850 hPa

   ;; air2m 
   f_air2m = addfile("./data/air2m-197901-201412.nc", "r")
   air2m   = short2flt(f_air2m->air(rec_s:rec_e,0,{-90:90},:))  ; T at 2m    

;;;DJF 平均 & 異常 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
    ;JFM季節平均,實際是12/1/2月三個月平均,因為從1979年12月開始截取
  copy_VarMeta(sst(0,:,:),sst_DJF(0,:,:))
  sst_DJF!0 = "year"
  sst_DJF&year=year 
  
  sst_ano = dim_rmvmean_n_Wrap(sst_DJF,0)
   
  ;; h300
  h300_DJF = month_to_season(h300, "JFM") 
  copy_VarMeta(h300(0,:,:),h300_DJF(0,:,:))
  h300_DJF!0 = "year"
  h300_DJF&year=year 

  h300_ano = dim_rmvmean_n_Wrap(h300_DJF,0)

  ;; u850 與h300 同維  
  u850_DJF = month_to_season(u850, "JFM") 
  copy_VarMeta(h300_DJF,u850_DJF)

  u850_ano = dim_rmvmean_n_Wrap(u850_DJF,0)
  
  ;; v850 與h300 同維  
  v850_DJF = month_to_season(v850, "JFM") 
  copy_VarMeta(h300_DJF,v850_DJF)   

  v850_ano = dim_rmvmean_n_Wrap(v850_DJF,0)
    
  ;; air2m
  air2m_DJF = month_to_season(air2m, "JFM") 
  copy_VarMeta(air2m(0,:,:),air2m_DJF(0,:,:))
  air2m_DJF!0   ="year"
  air2m_DJF&year=year   
    
  air2m_ano = dim_rmvmean_n_Wrap(air2m_DJF,0)
    
;;;(3) enso index (5N-5S, 170-120W);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     ; 0表示僅用非預設的數值進行計算 
     ;1 表示標準化時除以的是[N] ; 而0表示除以[N-1]
  
  ;; 輸出至netcdf文件
  path_out = "ENSO-index.nc"
  system("rm -f "+ path_out)      ; 若當前路徑下有同名文件,則刪除
  ncdf = addfile(path_out,"c")    ; "c" 表示創建 netCDF 文件
  ncdf->ensoi = ensoi
  
;;;(4) composite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  nnumb = dimsizes(irec_positive) 
  
    
  h300_comp  = dim_avg_n_Wrap(h300_ano(irec_positive,:,:),0) 
  u850_comp  = dim_avg_n_Wrap(u850_ano(irec_positive,:,:),0)    
  v850_comp  = dim_avg_n_Wrap(v850_ano(irec_positive,:,:),0) 
  air2m_comp = dim_avg_n_Wrap(air2m_ano(irec_positive,:,:),0)  

;;; (5) t-test ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; sst


  ;; h300
  h300_std = dim_variance_n_Wrap(h300_ano(irec_positive,:,:),0)
  h300_std = sqrt(h300_std/nnumb)
  t_h300   = h300_comp/h300_std       
  confi_h300 = h300_comp
  confi_h300 = student_t(t_h300, nnumb-1)   

  ;; air2m
  air2m_std = dim_variance_n_Wrap(air2m_ano(irec_positive,:,:),0)
  air2m_std = sqrt(air2m_std/nnumb)
  t_air2m   = air2m_comp/air2m_std       
  confi_air2m = air2m_comp
  confi_air2m = student_t(t_air2m, nnumb-1) 
    
;;; (5) plot
  wks = gsn_open_wks("eps","plot-comp-enso")
  gsn_define_colormap(wks,"rainbow+gray")  ; 調用rainbow+gray色板,,其它色板名稱請查閱http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml
  
  base = new(3,"graphic")
  plot = new(3,"graphic")  
        
  res                   = True   ; 調整地圖及顯著性等值線, 每個子圖均需該res
  res@gsnAddCyclic      = True   ; 添加循環點,否則會在0度經線左側出現一根白條
  res@gsnDraw           = False        
  res@gsnFrame          = False        
  res@gsnLeftString     = ""
  res@gsnRightString    = ""
  
  resc = res  ;拷貝
  resv = res  ;
  rest = res  ;
  
  res@mpFillOn             = False        ; 不填色地圖
  res@mpCenterLonF         = 180          ; 地圖的中心經度 
  res@mpGeophysicalLineThicknessF = 0.5   ; 地圖邊界的粗細
  res@pmTickMarkDisplayMode= "Always"     ; 坐標上標籤上添加度符號
  res@mpGridAndLimbOn      = True         ; 繪製經緯度線
             ; 經緯度線間隔
             ;
              ; 經緯度線線型取為類型為2的虛線。共17種線型供選擇。
            ; 其粗細
              
  res@cnFillOn             = True         ; 填色等值線
  res@cnLinesOn            = True         ; 繪製等值線
  res@cnLineColor          = "white"      ; 顏色
  res@cnLineThicknessF     = 0.3          ; 粗細
  res@cnLineLabelsOn       = False        ; 關閉標籤

  
  
    ; 用GMT_gray 進行填色。即調用了第2種色板
    ; -1 為透明 
  res@cnInfoLabelOn         = False       ; 關閉圖右下方的等值線信息標籤
  res@lbLabelBarOn          = False       ; 關閉labelbar
 
  resc@cnLevelSelectionMode  = "ExplicitLevels"                ; 指定每根需繪製的等值線
  resc@cnLevels              = (/-0.75,-0.25,0.25,0.75,1.25/)  ;   
  resc@cnFillOn              = False     ; 關閉等值線填色 
  resc@cnLineThicknessF      = 2.        ; 等值線粗細  
  resc@gsnContourZeroLineThicknessF = 0. ; 設置0值線粗細。0則不畫
  resc@cnLineLabelsOn        = False     ; 關閉標籤
  resc@cnLineDashPattern     = 16        ; 線型為16的虛線
  resc@cnInfoLabelOn         = True      ; 打開圖右下方的等值線信息標籤
  resc@cnInfoLabelOrthogonalPosF = 0.05  ; 移動等值線信息標籤的位置

  resv@vcPositionMode            = "ArrowTail"  ;箭頭尾部對應著格點的位置
  resv@vcGlyphStyle              = "Fillarrow"  ;其餘三種選項為「LineArrow」、「WindBarb」 、「CurlyVector」
  resv@vcFillArrowEdgeThicknessF = 2         ; 箭頭邊界粗細
  resv@vcFillArrowEdgeColor      = "white"   ; 及顏色
  resv@vcFillArrowFillColor      = "black"  ; 箭頭內部填充顏色
  resv@vcFillArrowWidthF         = 0.1       ; 箭頭寬度
  resv@vcFillArrowHeadXF         = 0.6       ; 請參考附錄中Fillarrow箭頭示意圖
  resv@vcFillArrowHeadYF         = 0.2       ;
  resv@vcFillArrowHeadInteriorXF = 0.25      ; 
           
  resv@vcMinDistanceF            = 0.03    ; 箭頭之間的最小距離(在單位平方中)
  resv@vcMinMagnitudeF           = 1.0     ; 要繪製箭頭所表示的最小數值,即小於該數值則不繪製

  resv@vcFillArrowMinFracWidthF =1.0 
  resv@vcFillArrowHeadMinFracXF =1.0  
  resv@vcFillArrowHeadMinFracYF =1.0 
  
    ;****設定參考箭頭****
    resv@vcRefAnnoOn               = True  
    resv@vcRefMagnitudeF           = refmag  ;標準長度箭頭所表示的大小
    resv@vcRefLengthF              = 0.045   ;標準長度箭頭在單位平方中的大小
    resv@vcRefAnnoBackgroundColor  = "white" ;背景顏色     
    resv@vcRefAnnoPerimOn          = False   ;關閉邊框    
                                        
    resv@vcRefAnnoFontHeightF      = 0.015   ;參考箭頭標籤字體大小      
    
    resv@vcRefAnnoString1On     = False   ;設定參考箭頭上、下的字符        
    resv@vcRefAnnoString2On     = True    ; 這裡僅設定其下方的字符
    resv@vcRefAnnoString2       = refmag+" m/s"  
           
    resv@vcRefAnnoSide            = "Top" ; 參考箭頭放至圖形上方
    resv@vcRefAnnoOrthogonalPosF  = -0.12 ; 調整其位置
    resv@vcRefAnnoParallelPosF    = 0.95 
    

  res@gsnCenterString            = "sst" ;子圖的主標題 
  res@gsnCenterStringFontHeightF = 0.03  ; 標題字體的大小。由於後面沒有修改該值,則每幅圖的主標題字體均是此大小
    ; 只有底圖可有地圖(map)  
        ; 調用的繪圖函數不可帶「map」
  plot(0) = ColorNegDashZeroPosContour(plot(0),"blue","white","red") ; 負值用藍色虛線表示,0線用白色實線,正值紅色實線
       ; 帶地圖的圖必須放在最下圖層

  ; 繪製多邊形及折線以標明nino 3.4區 
  plres                  = True
  plres@gsLineColor      = "black"
  plres@gsLineThicknessF = 1.0
  
  gres                   = True
  gres@gsFillColor       = "yellow"
  gres@gsFillOpacityF    = 0.5
  gres@gsLineColor       = "black"
   
  latx = (/-5,    5,  5, -5, -5/)    ; nino3.4區的坐標位置
  lonx = (/190, 190,240, 240, 190/)  ;
  dum1 = gsn_add_polyline(wks, base(0),lonx,latx,plres)   
  dum2 = gsn_add_polygon(wks,base(0),lonx,latx,gres)
  
  res@gsnCenterString = "h300&V850"  
  resc@cnLevelSelectionMode  = "AutomaticLevels" 
  resc@cnLevelSpacingF = 15.
  base(1) = gsn_csm_contour_map(wks,confi_h300,res)  
  plot(1) = gsn_csm_contour(wks,h300_comp,resc) 
  plot(1) = ColorNegDashZeroPosContour(plot(1),"blue","white","red")
  overlay(base(1),plot(1))
  
  plotv   = gsn_csm_vector(wks,u850_comp,v850_comp,resv) 
  overlay(base(1),plotv)  ; 也可用gsn_csm_vector_map(wks,h300_comp,u850,v850,res_new)

  res@gsnCenterString       = "air2m"  
  resc@cnLevelSelectionMode = "ManualLevels" 
  resc@cnMaxLevelValF       = 2
  resc@cnMinLevelValF       = -2 
  resc@cnLevelSpacingF      = 0.5    
  base(2) = gsn_csm_contour_map(wks,confi_air2m,res)  
  plot(2) = gsn_csm_contour(wks,air2m_comp,resc) 
  plot(2) = ColorNegDashZeroPosContour(plot(2),"blue","black","red")
  overlay(base(2),plot(2))  
  
  resP = True                        ; 繪製panel圖
  resP@txString       = "El nino"    ; 添加主標題
  resP@txFontHeightF  = 0.03         ; 修改其大小  

 ; resP@gsnPanelFigureStrings= (/"a)","b)","c)"/)  ;各個子圖的標號
  resP@gsnPanelFigureStringsFontHeightF = 0.015   ;字體的大小 
  resP@amJust = "TopLeft"                         ;擺放的位置,默認是「BottomRight」
  
          ; 指定每行繪製的子圖的個數
          ; 第1行繪製1幅,第2行繪製2幅
end

相關焦點

  • 海洋氣象▏厄爾尼諾現象、沃克環流的影響分析
    厄爾尼諾年的夏季,由於赤道東太平洋海溫升高、哈得來環流加強,導至太平洋副熱帶高壓強度增強;但西太平洋海溫降低,大氣對流活動減弱,卻使副高位置偏南。研究表明,西太平洋副高對厄爾尼諾的響應要落後幾個月,因而往往厄爾尼諾發生第二年這種相關關係更加顯著一些。
  • 沃克環流與厄爾尼諾(拉尼娜)現象(附專題設計)
    1928年在向皇家氣象學會提交的一篇論文中,沃克將這種蹺蹺板式的氣壓型定義為 南方濤動(Southern Oscillation),還給出了測量兩個地區之間的氣壓差的尺度。 他觀測得到,每當氣壓東高西低時,印度的季風雨量就會很大。而東西氣壓差異不大時, 雨量則很小,甚至無雨。
  • 今年會是1998年以來又一個厄爾尼諾年嗎?
    2014年4月15日,總部位於瑞士日內瓦的世界氣象組織(World Meteorological Organization,WMO)發布了一則新聞公告:今年2月以來,赤道太平洋海水溫度上升,已經達到厄爾尼諾先兆的程度,預測今年可能會出現厄爾尼諾現象,並很有可能成為自1998年以來最嚴重的厄爾尼諾年。
  • 【氣象科普】兄妹現象——厄爾尼諾與拉尼娜
    (如圖:厄爾尼諾年所出現的全球海面溫度圖)氣象成因每年的10月至次年的3月時值南半球夏季。南半球海域水溫普遍升高。向東流動的赤道逆流得到加強, 恰逢此時, 全球的氣壓帶和風帶向南移動, 東北信風跨過赤道受到南半球的自轉偏向力作用, 向左偏轉成西北季風。
  • 【地理備考】沃克環流、厄爾尼諾及拉尼娜現象對我國的影響
    沃克環流形成的原理是海面冷熱不均。沃克環流增強就會出現拉尼娜現象,偏弱則會出現厄爾尼諾現象。 正常年份赤道附近太平洋地區海氣狀況材料二  通常每2~7年,東太平洋水溫會異常上升,導致「沃克環流」發生變化,不僅使南美洲、大洋洲等地氣候異常
  • 厄爾尼諾、拉尼娜、沃克環流、洪澇與乾旱災害
    (2)相互作用:①大氣環流的改變,會引起洋流的變化,進而破壞海洋生態系統;②洋流的改變,表層海水溫度也會隨之變化,反作用於大氣圈,引起降水異常。精講精析:(1)分析厄爾尼諾的形成過程。①大氣環流(信風、西風等)強度和方向的改變,會引起海洋裡洋流的變化,從而破壞原本穩定的海洋生態系統;②洋流的改變,同時也會引起大氣的變化(增溫增溼、降溫減溼),進而影響降水。
  • 拉尼娜與厄爾尼諾相反的現象
    從去年春季開始,太平洋上出現了本世紀最嚴重的厄爾尼諾現象,造成了大氣環流異常,給全球帶來了嚴重災害。但最近,氣象專家預測:今年7月—9月,太平洋上可能發生與厄爾尼諾相反的拉尼娜(LaNina)現象。  什麼是拉尼娜現象?
  • 厄爾尼諾為什麼導致氣候異常?
    厄爾尼諾究竟是什麼?  數百年來,生活在秘魯北部和厄瓜多的漁民發現一種奇怪的現象:每隔幾年,在聖誕節前後,赤道太平洋東海岸海水持續增暖,秘魯亞卡俄沿海龐大的魚群悄然失蹤,原來以魚為食的海鳥失去了賴以生存的食源,不久也都死去。原來生機勃勃的海灘一片悽涼。
  • 高中地理——每日講1題(厄爾尼諾、拉尼娜、沃克環流、洪澇)
    厄爾尼諾現象就是大氣、海洋相互作用而導致地理環境發生變化的典型。1、說明厄爾尼諾的形成發展過程,並據此概述大氣圈、水圈、生物圈的相互作用。(2)相互作用:①大氣環流的改變,會引起洋流的變化,進而破壞海洋生態系統;②洋流的改變,表層海水溫度也會隨之變化,反作用於大氣圈,引起降水異常。精講精析:(1)分析厄爾尼諾的形成過程。
  • 厄爾尼諾年究竟是什麼?等於冷冬還是暖冬?
    這年頭,小夥伴們的氣象素養,是越來越高了,連厄爾尼諾這種之前感覺很深奧的話題,都能參與一二。  氣象汪表示,很欣慰,祖國的氣象事業有一定的群眾基礎啦。  然後,一個問題就出來了:既然今年是厄爾尼諾年,厄爾尼諾的強度越來越強,那麼,今年冬天會是冷冬還是暖冬?
  • 最強厄爾尼諾來了 83年陝南洪水就與厄爾尼諾有關
    3 當偏東信風減弱時,維持赤道太平洋海面西高東低的支柱被破壞,西太平洋堆積的高水位暖海水迅速向東擴展,使得西太平洋海溫降低,赤道東太平洋海溫上升,厄爾尼諾現象由此形成。  厄爾尼諾是西班牙語「聖嬰」的意思,但以這個溫柔名字命名的氣象,卻不像孩子那樣柔弱,發怒的它曾經給人類帶來毀滅性災難。
  • 「聖嬰」厄爾尼諾知多少
    厄爾尼諾對中國氣候的影響厄爾尼諾現象雖發生在距離我國比較遙遠的東太平洋,並不對我國的天氣氣候產生強烈的直接影響,但它仍然會通過大氣環流的變化來影響中國,所以不少氣象學家認為,厄爾尼諾的出現與否是影響中國天氣氣候異常的一個強信號。不過,我國的天氣氣候變化還要受其因素的影響,不應簡單地把任何氣候異常都歸結為受厄爾尼諾的影響,也不能說厄爾尼諾發生後必然對中國氣候產生某種特定的影響。
  • 氣象報告指出,2020年出現厄爾尼諾現象的概率低
    鑑於去年出現了厄爾尼諾現象,再加上多地氣象組織對2020年的氣象預測,不少氣象專家認為2020年還會出現厄爾尼諾現象。該消息一傳出去,立即引起了公眾的熱議。如果今年再次上演厄爾尼諾現象,那麼很多地區又將迎來極端天氣,不僅會導致農作物欠收,還會導致大量海洋生物的死亡。
  • 警惕 | 厄爾尼諾又來了!
    今天中國氣象局發布信息監測數據顯示厄爾尼諾事件又來了
  • 厄爾尼諾會致暴雨更頻繁嗎?
    中國氣象報記者徐文彬  剛剛在5月送走了「史上最強」的厄爾尼諾,我國接踵而至的暴雨還是讓人憂心忡忡。值得注意的是,厄爾尼諾是一種周期性的自然現象,大約每隔7年出現一次。  由於大氣環流和海洋環流都是「移動」並且「聯通」的,雖然只是赤道中東太平洋海水溫度發生變化,卻會逐漸引發全球大氣對其響應。這種響應既體現在空間上,也體現在時間上。
  • 氣象科普——厄爾尼諾暖流
    2015年3月,美國國家大氣監測組織稱今年很有可能是厄爾尼諾年。厄爾尼諾現象通常會導致南方梅雨時期從通常的5月中旬推遲到6月。[1] 拉尼娜現象與厄爾尼諾相反,指東太平洋海水溫度異常降低。兩種現象都與全球氣候有密切聯繫,可能導致極端天氣出現的機率增加。 可是每隔數年,東南信風減弱,東太平洋冷水上翻現象消失,表層暖水向東回流,導致赤道東太平洋海面上升,海面水溫升高,秘魯、厄瓜多沿岸由冷洋流轉變為暖洋流。
  • 什麼是厄爾尼諾現象?什麼是拉尼娜現象?
    厄爾尼諾(ELNINO)和拉尼娜(LANINA)都是西班牙文的音譯,前者厄爾尼諾原意為「聖嬰」,後者拉尼娜原意為「聖女」。他們在氣象學中都是指影響全球氣候的海洋大氣現象。拉尼娜現象與厄爾尼諾現象正好相反,是指太平洋中部和東部的熱帶海域表面水溫低於平時的狀況。
  • 焦點科普:「超強厄爾尼諾」的懸疑
    印度極端高溫「熱死」上千人、美國南部連遭暴雨襲擊……有關「超強厄爾尼諾」的話題近期引起社會廣泛關注。當前的厄爾尼諾事件究竟發展到什麼程度?「超強厄爾尼諾」真的要來了嗎?  根據氣象學定義,厄爾尼諾現象是指太平洋赤道海域海水大範圍持續異常升溫的現象。如果赤道中東太平洋區域的海域持續3個月高於常年平均溫度0.5攝氏度,就被認為出現了厄爾尼諾現象,持續6個月以上,就被認為是厄爾尼諾事件。  已有研究揭示,赤道中東太平洋海水表面溫度平均升高1攝氏度,就會使海水上空的大氣溫度升高6攝氏度,造成大氣環流異常。
  • 今冬發生厄爾尼諾現象可能性高達80%,華北霧霾或有所增多
    日前,世界氣象組織(WMO)發布《全球季節性氣候最新信息》和《厄爾尼諾最新情況》稱,今年12月到明年2月,發生厄爾尼諾現象的可能性為75%至80%,預計不會發生強事件。世界氣象組織官員表示,預計此次事件強度低於2015年至2016年的厄爾尼諾事件。
  • 2015厄爾尼諾或將製造「凌亂」夏天
    (來源:中國氣象報) 按照國家氣候中心ENSO監測,從2014年5-10月,當赤道中東太平洋海水表面溫度已經持續6個月以上比常年同期偏高0.5℃以上,表明一次新的厄爾尼諾事件正式形成。我國也是國際上首個確認厄爾尼諾事件的國家。本次厄爾尼諾將持續多久?