爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 285|回复: 10

NCL计算水汽通量散度(Moisture Flux Convergence)以及垂直积分

[复制链接]

新浪微博达人勋

发表于 2024-4-19 15:05:49 | 显示全部楼层 |阅读模式

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

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

x
各位同仁,我不是气象专业背景的,但是文章的一个部分需要做moisture budget,因此需要计算vertically integrated moisture flux convergence (VIMFC)。数据的精度是逐小时的,老板的要求做到多年平均之后降水趋势项,也就是moisture storage为零。

参考了https://mp.weixin.qq.com/s/1Pco6yXf1v-91Dse_0gdyQ等代码之后,我目前的代码如下,但是有些问题:(1)模型本身采用atmosphere_hybrid_sigma_pressure_coordinate,能不能直接在这个气压水平上进行积分;还是说需要重新插值,用于插值的大气压力水平应该如何选择,才能规避掉青藏高原那边的问题。(2)这个究竟要做到多久的时间段,才能看到moisture storage近乎零。(3)以及其他任何关于原理、单位的问题,谢谢大家的任何建议!

;*************************************************
; mfc_div_1.ncl
;
; Concepts illustrated:
;   - Read daily mean wind components, humidity and sfc. pressure
;     from different files
;   - Reorder the input (N==>S) grid order to (S==>N) via NCL syntax  ::-1
;   - Calculate mass weightined layer thickness [units="kg/m2"]
;   - Calculate moisture flux [uq, vq]            
;   - Calculate moisture flux divergence using spherical harmonics              
;   - Integrate the moisture flux divergence using mass weighting
;   - Plot a number of quantities
;*************************************************
;---Calculate the Horizontal Moisture Flux Convergence [MFC]
;*************************************************
;---High frequency source data: hourly/3hr/6hr/12hr/daily .... NOT monthly values
;---References:
;---http://www.cgd.ucar.edu/cas/catalog/newbudgets/
;---http://tornado.sfsu.edu/geosciences/classes/e260/AtmosphericRivers/Moisture%20Flux.pdf
;---https://www.spc.noaa.gov/publications/banacos/mfc-sls.pdf
;===================================================================
;   Data Source: ESRL Physical Sciences Division
;        https://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html
;   NCEP Reanalysis data provided by the NOAA/OAR/ESRL PSD, Boulder, Colorado, USA,
;   from their Web site at https://www.esrl.noaa.gov/psd/
;===================================================================
;;;先计算散度再积分
  ptop = 0.              ; 'shum' upper level                  
  ptop@units = "hPa"
  g    = 9.80665          ; m/s2

  pbot = 110000. ;to ensure integral from psfc

;---ESRL: CDC data
       
   dir    = ""
   fils    = systemfunc("cd "+dir+" ; ls *.cam.h1.*.nc")  ; all files beginning with 'ACCESS_SRF'
   f1 = addfiles(dir+fils, "r")   ; read variables from all files
   a = ListCount(f1)

  ref = addfile("508-02.cam.h0.2055-09.nc","r")
  P0mb =   1000.
  lat  =   ref->lat
        ;lev_p           = (/0,50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000/)
        lev_p           = (/0,50,100,150,200,250,300,350,400,450,500,550/)
  lev_p@units     = "hPa"                        ; required for vinth2p
  lev_p@positive  = "down"

         print(a)
       
   opt     = True
   opt@nval_crit = 10              ; require at least 10 values

   ndim    = 0

  do m = 0,a-1

          ;uu := calculate_daily_values (f1[m]->U, "avg", ndim, opt)
          ;vv := calculate_daily_values (f1[m]->V, "avg", ndim, opt)
          ;qq := calculate_daily_values (f1[m]->Q, "avg", ndim, opt)
          ;ps := calculate_daily_values (f1[m]->PS, "avg", ndim, opt)
                ;PRECC := calculate_daily_values (f1[m]->PRECC, "avg", ndim, opt)
          ;PRECL := calculate_daily_values (f1[m]->PRECL, "avg", ndim, opt)
          ;EVAP := calculate_daily_values (f1[m]->QFLX, "avg", ndim, opt)
         
          uu := f1[m]->U
          vv := f1[m]->V
          qq := f1[m]->Q
          ps := f1[m]->PS
                PRECC := f1[m]->PRECC
          PRECL := f1[m]->PRECL
          EVAP := f1[m]->QFLX
         
          hyam :=   f1[m]->hyam         
          hybm :=   f1[m]->hybm

          intyp_m=1  ;1--linear,2--log
          kxtrp = False ;Logical. False => no extrapolation when the pressure level is outside of the range of psfc.

                u = vinth2p (uu, hyam,hybm, lev_p ,ps, intyp_m, P0mb, 1, kxtrp )
                v = vinth2p (vv, hyam,hybm, lev_p ,ps, intyp_m, P0mb, 1, kxtrp )
                q = vinth2p (qq, hyam,hybm, lev_p ,ps, intyp_m, P0mb, 1, kxtrp )
       
          ;if  (m .eq. 0) then
                  ;print(u)
          ;end if

         u!1 = "lev"
         u!2 = "lat"
         u!3 = "lon"
         u&lev = lev_p
         u&lat = ref->U&lat
         u&lon = ref->U&lon

   copy_VarCoords(u,v)
   copy_VarCoords(u,q)

         ps!1 = "lat"
         ps!2 = "lon"
         ps&lat = ref->U&lat
         ps&lon = ref->U&lon
         
         copy_VarCoords(ps,PRECC)
         copy_VarCoords(ps,PRECL)
         copy_VarCoords(ps,EVAP)

;---Vertical levels

  ptop = ptop*100.
  ptop@units = "Pa"

  plev = lev_p                      ; hPa  
  plev = plev*100                     ; [0,...,100000] Pa [kg/(m-s2)]
  plev@units = "Pa"

;---Change [kg/kg] to [g/kg]; not necessary: but common units for q

  q    = q*1000            
  q@units = "g/kg"

;---Layer thickness: ; Pa=>[kg/(m-s2)], (time,level,lat,lon)
;---Mass weighting:  (dp/g) => [Pa/(m/s2)] => (Pa-s2)/m => [kg/(m-s2)][s2/m] =>  (kg/m2)
;---Reference: http://www.cgd.ucar.edu/cas/catalog/newbudgets/

  dp   = dpres_plevel_Wrap(plev, ps, ptop, 0) ; Pa; layar thickness

  dpg  = dp/g   
  dpg@long_name = "Layer Mass Weighting"
  dpg@units     = "kg/m2"                     ; dp/g, Pa/(m s-2), reduce to kg m-2

;---Moisture flux components at each pressure level

  uq   = u*q                                  ; (:,:,:,:)
  uq@long_name = "Zonal Moisture Flux [uq]"
  uq@units = "["+u@units+"]["+q@units+"]"     ; [m/s][g/kg]     
  copy_VarCoords(u,uq)                        ; (time,level,lat,lon)

  vq   = v*q                                  ; (:,:,:,:)
  vq@long_name = "Meridional Moisture Flux [vq]"
  vq@units = "["+v@units+"]["+q@units+"]"
  copy_VarCoords(v,vq)                        ; (time,level,lat,lon)

;---Integrated mass weighted moisture flux components
  linlog        = 1
  uq_dpg = uq*dpg                ; mass weighted 'uq'; [m/s][g/kg][kg/m2]=>[m/s][g/kg]
  iuq    = dim_sum_n(uq_dpg, 1)
  ;iuq           = vibeta(plev(::-1),uq(time|:,lat|:,lon|:,lev|::-1),linlog,ps,pbot,ptop)/g
  iuq@long_name = "Integrated Zonal UQ [uq*dpg]"
  iuq@LONG_NAME = "Sum: Mass Weighted Integrated Zonal Moisture Flux [uq*dpg]"
  iuq@units     = "[m/s][g/kg]"
  ;copy_VarCoords(u, iuq); (time,lat,lon)
  copy_VarCoords(ps, iuq); (time,lat,lon)
  delete(uq_dpg)

  vq_dpg = vq*dpg                ; mass weighted 'vq'; [m/s][g/kg][kg/m2]=>[m/s][g/kg]
  ivq    = dim_sum_n(vq_dpg, 1)
  ;ivq           = vibeta(plev(::-1),vq(time|:,lat|:,lon|:,lev|::-1),linlog,ps,pbot,ptop)/g   ;;;;units are all Pa.
  ivq@long_name = "Integrated Meridional VQ [vq*dpg]"
  ivq@LONG_NAME = "Sum: Mass Weighted Integrated Meridional Moisture Flux [vq*dpg]"
  ivq@units     = "[m/s][g/kg]"
  ;copy_VarCoords(v, ivq); (time,lat,lon)
  copy_VarCoords(ps, ivq)
  delete(vq_dpg)

;---Divergence of moisture flux: uv2dvF => global 'fixed' rectilinear grid

  duvq  = uv2dvF_Wrap(uq, vq)    ; (time,level,lat,lon)
  duvq@long_name = "Divergence of Moisture Flux"
  duvq@units     = "g/(kg-s)"    ; (1/m)*[(m/s)(g/kg)] => [g/(kg-s)]

;---Mass weighted integration [sum] of the divergence of moisture flux

  duvq_dpg = duvq*dpg            ;  [g/(kg-s)][kg/m2] => [g/(m2-s)]
  iduvq    = dim_sum_n(duvq_dpg, 1)
  ;iduvq    = dim_sum_n(duvq_dpg, 0)
  iduvq@long_name = "Integrated Mass Wgt MFC"
  iduvq@LONG_NAME = "Integrated Mass Weighted Moisture Flux Convergence"
  iduvq@units     = "g/(m2-s)"
  ;copy_VarCoords(u, iduvq)      ; (time,lat,lon)
  copy_VarCoords(ps, iduvq)
  delete(duvq_dpg)

  iduvq           = 24.*3600.*iduvq/1000.
  iduvq@units     = "mm/day"
  copy_VarCoords(u(:,0,:,:), iduvq)      ; (time,lat,lon)

  VIMFC =  iduvq           ; keep meta data                        
  VIMFC = -VIMFC           ; Note the preceding -1 [negative precedes integration]
  VIMFC@long_name = "VIMFC"
  copy_VarCoords(u(:,0,:,:), VIMFC)

;*************************************************
; Calculate divergence: Use Wrap to include meta data
; Calculate divergent wind components; used for graphics
;*************************************************

  fname = "/iodati/mgr04_users/yhzhou/sppfinal/508-03-new-new-new/508-03.moisture.h1." + m + ".nc"
        output = addfile(fname, "c")
  output->VIMFC = VIMFC
  output->PRECC    = PRECC
  output->PRECL    = PRECL
  output->EVAP    = EVAP

  ; 删除创建的变量以释放内存
  delete(PRECL)
  delete(PRECC)
  delete(EVAP)
  delete(u)
  delete(v)
  delete(q)

  end do



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

新浪微博达人勋

 楼主| 发表于 2024-4-19 22:19:41 | 显示全部楼层
反思之一:

计算散度因为包含缺测值,不能用uv2dvF_Wrap,目前改用uv2dv_cfd (uq,vq,uq&lat,uq&lon, 2);

反思之二:

lev_p的选择很重要!感觉最高层不能设置为0 hPa,这一层差值出来的值很异常;目前改为从10 hPa开始,但是不确定究竟要怎么选择。

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-4-19 22:51:29 | 显示全部楼层
计算水汽垂直积分,可以1000-300hPa
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-4-19 23:01:45 | 显示全部楼层
dieam 发表于 2024-4-19 22:51
计算水汽垂直积分,可以1000-300hPa

谢谢您!只是因为我做moisture budget,需要计算整个大气层的水汽通量散度,以此来看降水、蒸发、水汽辐合是否平衡,也可以选取这一段的大气柱吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-4-20 13:02:04 | 显示全部楼层
更新一下实验进度:

对于VIMFC的计算,有先积分再计算散度,和先算散度和再积分两种方式,两种代码我都在别的帖子下面有看过;我自己的测试结果是,先计算散度再积分,因为常常有数据缺测的情况;先积分再计算散度,计算出的VIMFC,与P-E的pattern很相似了,且误差比前一种方式小了很多,还在用更长时间的数据观察......
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-4-20 14:43:14 | 显示全部楼层
再更新一下实验进度:

虽然不知道为什么,但是,大气压力水平设置为300 hPa~1000 hPa,上述的误差,比设置为10 hPa~1000 hPa小得多;设置为10 hPa~1000 hPa时,算出来的VIMFC显著偏大。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-4-20 22:43:44 | 显示全部楼层
byshpkzyh 发表于 2024-4-20 14:43
再更新一下实验进度:

虽然不知道为什么,但是,大气压力水平设置为300 hPa~1000 hPa,上述的误差,比设 ...

水汽主要在中低层,一般会积分到300hPa
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-4-20 22:50:50 | 显示全部楼层
再更新一下实验进度:

参考https://www.ncl.ucar.edu/Applications/Scripts/shapefiles_23.ncl,以及https://bbs.06climate.com/forum. ... 0%B2%D8%B8%DF%D4%AD提供的青藏高原shp文件,mask掉青藏高原的数据,最后做纬向平均,每个纬度带基本平衡。但是不清楚是否要精确到格点平衡。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-4-20 22:53:57 | 显示全部楼层
dieam 发表于 2024-4-20 22:43
水汽主要在中低层,一般会积分到300hPa

谢谢点拨!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-4-25 10:11:01 | 显示全部楼层
再更新一下实验进度:

给老板看了结果,他基本满意。但是出现一个新的问题,即0度经线处的数据有些不连续,图形呈现上会出现像尖刺一样的形状。他说应该是计算问题,让我再找找原因......
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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