水平输送水汽通量matlab,NCL专辑 | 水汽通量散度以及垂直积分可视化

mfc_div_1.ncl: Calculate various divergence and moisture quantities including Vertically Integrated Moisture Flux Convergence (VIMFC). VIMFC has a high correlation with frontal and convective activity. Positive values indicate net precipitation. The following equation is implemented within mfc_div_1.ncl

水平输送水汽通量matlab,NCL专辑 | 水汽通量散度以及垂直积分可视化_第1张图片

This example uses uv2dvF_Wrap [uv2dvF] because the grid is a global fixed grid. For global gaussian, uv2dvG_Wrap [uv2dvG] should be used. For a regional grid uv2dv_cfd should be used.

水平输送水汽通量matlab,NCL专辑 | 水汽通量散度以及垂直积分可视化_第2张图片

水平输送水汽通量matlab,NCL专辑 | 水汽通量散度以及垂直积分可视化_第3张图片

水平输送水汽通量matlab,NCL专辑 | 水汽通量散度以及垂直积分可视化_第4张图片

水平输送水汽通量matlab,NCL专辑 | 水汽通量散度以及垂直积分可视化_第5张图片

水平输送水汽通量matlab,NCL专辑 | 水汽通量散度以及垂直积分可视化_第6张图片

mfc_div_1.ncl

;*************************************************

; 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 = 300              ; 'shum' upper level

ptop@units = "hPa"

g    = 9.80665          ; m/s2

date  = 20080715        ; NH summer

;---ESRL: CDC data

diri = "./"

filq = "shum.2008.nc"   ; daily data for current year [366 days]

filu = "uwnd.2008.nc"

filv = "vwnd.2008.nc"

filps= "pres.sfc.2008.nc"

pthu = diri+filu

pthv = diri+filv

pthq = diri+filq

pthps= diri+filps

fu   = addfile(pthu ,"r")

fv   = addfile(pthv ,"r")

fq   = addfile(pthq ,"r")

fps  = addfile(pthps,"r")

;---Time

ymd  = cd_calendar(fu->time, -2)    ; ymd[*]: human readable

nt   = ind(ymd.eq.date)             ; date for plotting and testing

TEST = True

if (.not.TEST) then                   ; all times

u    = fu->uwnd(:,{1000:ptop},:,:)  ; m/s, (time,level,lat,lon)

v    = fv->vwnd(:,{1000:ptop},:,:)

q    = fq->shum                     ; [kg/kg], 1000-300 levels only

ps   = fps->pres                    ; Pa=>[kg/(m-s2)], (time,lat,lon)

else                                  ; one time step; keep time dimension [ nt:nt: ]

u    = fu->uwnd(nt:nt,{1000:ptop},:,:); m/s, (time,level,lat,lon)

v    = fv->vwnd(nt:nt,{1000:ptop},:,:)

q    = fq->shum(nt:nt,:,:,:)        ; [kg/kg], 1000-300 levels only

ps   = fps->pres(nt:nt,:,:)         ; Pa=>[kg/(m-s2)], (time,lat,lon)

nt   = 0                            ; only one time step

end if

;---Vertical levels

ptop = ptop*100

ptop@units = "Pa"

plev = q&level                      ; hPa

plev = plev*100                     ; [100000,...,30000] 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"

;---Divergence function [used later] requires S->N grid order

u    = u(:,:,::-1,:)

v    = v(:,:,::-1,:)

q    = q(:,:,::-1,:)

ps   =ps(:,  ::-1,:)

;---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)

PRINT_RAW = True

if (PRINT_RAW) then

printVarSummary(q)                          ; (time,level,lat,lon); g/kg

printMinMax(q,0)

print("-----")

printVarSummary(u)                          ; (time,level,lat,lon); m/s

printMinMax(u,0)

print("-----")

printVarSummary(v)

printMinMax(v,0)

print("-----")

printVarSummary(ps)                         ; (time,lat,lon); Pa => kg/(m-s2)

printMinMax(ps,0)

print("-----")

printVarSummary(uq)                         ; (time,level,lat,lon); (m/s)(g/kg)

printMinMax(uq,0)

print("-----")

printVarSummary(vq)

printMinMax(vq,0)

print("-----")

printVarSummary(dp)                         ; (time,level,lat,lon); Pa => kg/(m-s2)

printMinMax(dp,0)

print("-----")

; examine layer thickness at selected locations

print(dp(nt,:,{40},{180}))    ; mid-Pacific

print(dp(nt,:,{40},{255}))    ; Boulder, CO

print("-----")

end if

;---Integrated mass weighted moisture flux components

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@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(:,0,:,:), 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@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(:,0,:,:), ivq); (time,lat,lon)

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@long_name = "Integrated Mass Wgt MFC"

iduvq@LONG_NAME = "Integrated Mass Weighted Moisture Flux Convergence"

iduvq@units     = "g/(m2-s)"

copy_VarCoords(u(:,0,:,:), iduvq)      ; (time,lat,lon)

delete(duvq_dpg)

VIMFC =  iduvq           ; keep meta data

VIMFC = -VIMFC           ; Note the preceding -1 [negative precedes integration]

VIMFC@long_name = "VIMFC"

;---Another way to compute Integrated divergence of moisture flux [iduvq_1]

;;IDUVQ = wgt_vertical_n(duvq, dp, 2, 1)

;;iduvq_0 = IDUVQ[0]

;;iduvq_0 = iduvq_0/g                    ; complete mass weighting

;;iduvq_0@long_name = "Average Mass Weighted MFC"

;;iduvq_0@LONG_NAME = "Average Mass Weighted Moisture Flux Convergence"

;;iduvq_0@units     = "g/(m2-s)"

;;iduvq_1 = IDUVQ[1]                     ; same as iuvq_sum

;;iduvq_1 = iduvq_1/g

;;iduvq_1@long_name = "Integrated MFC"

;;iduvq_1@LONG_NAME = "Integrated Moisture Flux Convergence"

;;iduvq_1@units     = "g/(m2-s)"

PRINT_RESULT = True

if (PRINT_RESULT) then

printVarSummary(iuq)                 ; (time,lat,lon)

printMinMax(iuq,0)

print("-----")

printVarSummary(ivq)                 ; (time,lat,lon)

printMinMax(ivq,0)

print("-----")

printVarSummary(duvq)                ; (time,lev,lat,lon)

printMinMax(duvq,0)

print("-----")

printVarSummary(iduvq)               ; (time,lat,lon)

printMinMax(iduvq,0)

print("-----")

;;  printVarSummary(iduvq_0)             ; (time,lat,lon)

;;  printMinMax(iduvq_0,0)

;;  print("-----")

;;  printVarSummary(iduvq_1)             ; (time,lat,lon)

;;  printMinMax(iduvq_1,0)

;;  print("-----")

end if

;*************************************************

; Calculate divergence: Use Wrap to include meta data

; Calculate divergent wind components; used for graphics

;*************************************************

div = uv2dvF_Wrap(u,v)                ; u,v ==> divergence; (:,:,:,:)

ud  = new ( dimsizes(u), typeof(u), "No_FillValue")

vd  = new ( dimsizes(v), typeof(v), "No_FillValue")

dv2uvf(div,ud,vd)                     ; divergence ==> divergent components

copy_VarCoords(u, ud )

copy_VarCoords(u, vd )

ud@long_name  = "Zonal Divergent Wind"

ud@units      = u@units

vd@long_name  = "Meridional Divergent Wind"

vd@units      = v@units

if (PRINT_RESULT) then

printVarSummary(ud)                 ; (time,level,lat,lon)

printMinMax(ud,0)

print("-----")

printVarSummary(vd)                 ; (time,level,lat,lon)

printMinMax(vd,0)

print("-----")

end if

;*************************************************

; plot results

;*************************************************

scl5  = 1e5                                  ; arbitrary: used for nicer plot values

sclab5= "(10~S~-5~N~)"                       ; used later

SCLAB5= "(10~S~5~N~)"

scl6  = 1e6

sclab6= "(10~S~-6~N~)"

SCLAB6= "(10~S~6~N~)"

plot := new(2,graphic)

wks   = gsn_open_wks("png","mfc_div")        ; send graphics to PNG file

resd                 = True

resd@cnFillOn        = True                  ; color

resd@cnLinesOn       = False                 ; turn off contour lines

resd@cnLevelSelectionMode = "ManualLevels"   ; set manual contour levels

resd@cnMinLevelValF  = -15.                  ; set min contour level

resd@cnMaxLevelValF  =  15.                  ; set max contour level

resd@cnLevelSpacingF =   1.                  ; set contour spacing

;resd@cnFillPalette   = "cmocean_balance"     ; NCL 6.5.0

resd@cnFillPalette   = "ViBlGrWhYeOrRe"

resd@mpFillOn        = False                 ; turn off map fill

resd@vcRefMagnitudeF = 3.                    ; make vectors larger

resd@vcRefLengthF    = 0.025                 ; reference vector length

resd@vcGlyphStyle    = "CurlyVector"         ; turn on curly vectors

resd@vcMinDistanceF  = 0.010                 ; thin the vectors

resd@vcRefAnnoOrthogonalPosF = -1.0          ; move ref vector up

resd@gsnLeftString   = "Divergent Wind"

resd@gsnScalarContour= True                  ; vectors over contours

LEVP = 700

DIV  = div(nt,{LEVP},:,:)                     ; keep meta data

DIV  = DIV*scl6                               ; nicer numbers

resd@tiMainString    = "Divergence and Divergent Winds"

resd@gsnCenterString = LEVP+"hPa: "+date

resd@gsnRightString  = sclab6+" "+div@units

dplt = gsn_csm_vector_scalar_map(wks,ud(nt,{LEVP},:,:),vd(nt,{LEVP},:,:),DIV,resd)

;--- Moisture Transport [uq, vq] at a specified pressure level

res                   = True             ; plot mods desired

res@gsnDraw           = False            ; don't draw yet

res@gsnFrame          = False            ; don't advance frame yet

res@cnFillOn          = True             ; turn on color

res@cnLinesOn         = False            ; turn off contour lines

res@cnLineLabelsOn    = False            ; turn off contour lines

res@cnFillPalette     = "ViBlGrWhYeOrRe" ; set White-in-Middle color map

res@lbLabelBarOn      = False            ; turn off individual cb's

res@mpFillOn          = False            ; turn off map fill

; Use a common scale

res@cnLevelSelectionMode = "ManualLevels"; manual set levels so lb consistent

res@cnMaxLevelValF       =  140.0        ; max level

res@cnMinLevelValF       = -res@cnMaxLevelValF     ; min level

res@cnLevelSpacingF      =   10.0        ; contour interval

LEVP    = 700

res@gsnCenterString      = LEVP+"hPa"

plot(0) = gsn_csm_contour_map(wks,uq(nt,{LEVP},:,:),res)

plot(1) = gsn_csm_contour_map(wks,vq(nt,{LEVP},:,:),res)

resP                     = True                ; modify the panel plot

resP@gsnPanelMainString  = date+": Unweighted Moisture Flux Components"

resP@gsnPanelLabelBar    = True                ; add common colorbar

gsn_panel(wks,plot,(/2,1/),resP)               ; now draw as one plot

;--- Integrated Moisture Transport [iuq, ivq]

delete(res@gsnCenterString)              ; not used for this plot

res@cnMaxLevelValF       = 10.0          ; min level

res@cnMinLevelValF       = -res@cnMaxLevelValF     ; min level

res@cnLevelSpacingF      =  0.5          ; contour interval

IUQ     = iuq(nt,:,:)                    ; local array: keep meta data

IUQ     = IUQ/scl5                       ; scale for plot

res@gsnRightString  = SCLAB5+" "+iuq@units

plot(0) = gsn_csm_contour_map(wks,IUQ,res)

IVQ     = ivq(nt,:,:)                    ; local array: keep meta data

IVQ     = IVQ/scl5

res@gsnRightString  = SCLAB5+" "+ivq@units

plot(1) = gsn_csm_contour_map(wks,IVQ,res)

resP@gsnPanelMainString  = date+": Mass Wgt. Component Moisture Flux"

gsn_panel(wks,plot,(/2,1/),resP)               ; now draw as one plot

delete( [/IUQ, IVQ/] )                   ; no longer needed

;---Divergence of Moisture Flux

res@cnMaxLevelValF       = 100.0          ; min level

res@cnMinLevelValF       = -res@cnMaxLevelValF     ; min level

res@cnLevelSpacingF      =  5.0          ; contour interval

LEVP    = 700

DUVQ    = duvq(nt,{LEVP},:,:)                    ; keep meta data

DUVQ    = DUVQ*scl6                              ; scale for plot

res@gsnCenterString = LEVP+"hPa"

res@gsnRightString  = sclab6+" "+duvq@units

plot(0) = gsn_csm_contour_map(wks,DUVQ,res)

LEVP    = 500

DUVQ    = duvq(nt,{LEVP},:,:)                    ; keep meta data

DUVQ    = DUVQ*scl6

res@gsnCenterString = LEVP+"hPa"

res@gsnRightString  = sclab6+" "+duvq@units

plot(1) = gsn_csm_contour_map(wks,DUVQ,res)

resP@gsnPanelMainString  = date+": Divergence of Moisture Flux"

gsn_panel(wks,plot,(/2,1/),resP)                ; now draw as one plot

delete(DUVQ)                                        ; no longer needed

delete([/res@gsnCenterString, res@gsnRightString/]) ; not used in next plot

;---Integrated Divergence of Moisture Flux Convergence [no scaling]

res@gsnDraw              = True

res@gsnFrame             = True

res@lbLabelBarOn         = True

;res@cnFillPalette        = "cmp_flux"

res@cnMaxLevelValF       =  0.50                ; min level

res@cnMinLevelValF       = -res@cnMaxLevelValF  ; min level

res@cnLevelSpacingF      =  0.050               ; contour interval

res@tiMainString         = date+": VIMFC"

plt = gsn_csm_contour_map(wks,VIMFC(nt,:,:) ,res)

mfc_div_2.ncl

mfc_div_2.ncl: The above MFC equation can be partitioned as follows:

MFC => Moisture Flux Convergence

MFC_advect = -(u*(dq/dx)+v*(dq/dy))   ; advect moisture term

MFC_conv   =  -q*((du/dx)+(dv/dy) )   ; [con/div]ergence term

MFC        = MFC_advect + MFC_conv

The MFC_advect can be derived using advect_variable for global rectilinear grids or advect_variable_cfd for regional rectilinear grids The MFC_conv can be derived using: uv2dvF_Wrap or uv2dvG_Wrap for global rectilinear grids or uv2dv_cfd for regional rectilinear grids. Then, multiply the derived quantity by specific humidity [q].

水平输送水汽通量matlab,NCL专辑 | 水汽通量散度以及垂直积分可视化_第7张图片

水平输送水汽通量matlab,NCL专辑 | 水汽通量散度以及垂直积分可视化_第8张图片

水平输送水汽通量matlab,NCL专辑 | 水汽通量散度以及垂直积分可视化_第9张图片

;*************************************************

; mfc_div_2.ncl

;

; Similar to mfc_div_1.ncl except a different approach is used.

;

; Rather tha using DIV(U*Q) directly, this script expands this into two separate components.

;

; Concepts illustrated:

;   MFC = Moisture Flux Convergence

;

;   MFC_advect = -(u*(dq/dx)+v*(dq/dy) )    ; advection term

;   MFC_conv   = -q*((du/dx)+(dv/dy) )      ; con(div)-vergence

;

;   MFC = MFC_advect + MFC_convection

;

;   - 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 = 300              ; 'shum' upper level

ptop@units = "hPa"

g    = 9.80665          ; m/s2

date  = 20080715        ; NH summer

;---ESRL: CDC data

diri = "./"

filq = "shum.2008.nc"   ; daily data for current year [366 days]

filu = "uwnd.2008.nc"

filv = "vwnd.2008.nc"

filps= "pres.sfc.2008.nc"

pthu = diri+filu

pthv = diri+filv

pthq = diri+filq

pthps= diri+filps

fu   = addfile(pthu ,"r")

fv   = addfile(pthv ,"r")

fq   = addfile(pthq ,"r")

fps  = addfile(pthps,"r")

;---Time

ymd  = cd_calendar(fu->time, -2)    ; ymd[*]: human readable

nt   = ind(ymd.eq.date)             ; date for plotting and testing

TEST = True

if (.not.TEST) then                   ; all times

u    = fu->uwnd(:,{1000:ptop},:,:)  ; m/s, (time,level,lat,lon)

v    = fv->vwnd(:,{1000:ptop},:,:)

q    = fq->shum                     ; [kg/kg], 1000-300 levels only

ps   = fps->pres                    ; Pa=>[kg/(m-s2)], (time,lat,lon)

else                                  ; one time step; keep time dimension [ nt:nt: ]

u    = fu->uwnd(nt:nt,{1000:ptop},:,:); m/s, (time,level,lat,lon)

v    = fv->vwnd(nt:nt,{1000:ptop},:,:)

q    = fq->shum(nt:nt,:,:,:)        ; [kg/kg], 1000-300 levels only

ps   = fps->pres(nt:nt,:,:)         ; Pa=>[kg/(m-s2)], (time,lat,lon)

nt   = 0                            ; only one time step

end if

;---Vertical levels

ptop = ptop*100

ptop@units = "Pa"

plev = q&level                      ; hPa

plev = plev*100                     ; [100000,...,30000] 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"

;---Divergence function [used later] requires S->N grid order

u    = u(:,:,::-1,:)

v    = v(:,:,::-1,:)

q    = q(:,:,::-1,:)

ps   =ps(:,  ::-1,:)

;---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

;************************************************

; Calculate the MFC_advection term

;   MFC_advect = -(u*(dq/dx)+v*(dq/dy) )

; Internally, gradients are calculated via spherical harmonics

;*************************************************

long_name = "MFC_advection"

units     = "g/(kg-s)"       ; (m/s)*(g/kg)*(1/m) => (m/s)*(g/kg-m) => g/(kg-s)

gridType  = 1   ; global fixed grid ordered S->N

opt_adv   = 0   ; return only the advected variable; no gradients

mfc_adv   = advect_variable(u,v,q, gridType, long_name, units, opt_adv)

mfc_adv   = -mfc_adv

printVarSummary(mfc_adv)

printMinMax(mfc_adv, 0)

print("--------")

;************************************************

; Calculate the MFC_convergence term

;   MFC_conv   = -q*((du/dx)+(dv/dy) )      ; con(div)-vergence

;*************************************************

duv  = uv2dvF_Wrap(u, v)        ; (1/m)(m/s) => (1/s) ; (time,level,lat,lon)

mfc_con   = -q*duv

mfc_con@long_name = "MFC_convergence"

mfc_con@units     = "g/(kg-s)"  ; (g/kg)(1/s) => g/(kg-s)

copy_VarCoords(duv,mfc_con)

delete(duv)

;************************************************

; Calculate the total MFC

;*************************************************

mfc = mfc_adv + mfc_con

mfc@long_name = "Moisture Flux Convergence"

mfc@units     = "g/(kg-s)"  ; (g/kg)(1/s) => g/(kg-s)

PRINT_RAW = True

if (PRINT_RAW) then

printVarSummary(mfc_adv)                          ; (time,level,lat,lon)

printMinMax(mfc_adv,0)

printVarSummary(mfc_con)

printMinMax(mfc_con,0)

print("-----")

printVarSummary(mfc)

printMinMax(mfc,0)

print("-----")

printVarSummary(ps)                         ; (time,lat,lon); Pa => kg/(m-s2)

printMinMax(ps,0)

print("-----")

printVarSummary(dp)                         ; (time,level,lat,lon); Pa => kg/(m-s2)

printMinMax(dp,0)

print("-----")

; examine layer thickness at selected locations

print(dp(nt,:,{40},{180}))    ; mid-Pacific

print(dp(nt,:,{40},{255}))    ; Boulder, CO

print("-----")

end if

;---Integrated mass weighted moisture flux components

mfc_adv_dpg = mfc_adv*dpg                ; mass weighted 'uq'; [m/s][g/kg][kg/m2]=>[m/s][g/kg]

imfc_adv    =  dim_sum_n(mfc_adv_dpg, 1)

imfc_adv@long_name = "Integrated Mass Flux Advection"

imfc_adv@LONG_NAME = "Sum: Mass Weighted Integrated Mass Flux Advection: mfc_adv*dpg"

imfc_adv@units     = "[m/s][g/kg]"

copy_VarCoords(u(:,0,:,:), imfc_adv); (time,lat,lon)

delete(mfc_adv_dpg)

mfc_con_dpg = mfc_con*dpg                ; mass weighted 'mfc_con'; [m/s][g/kg][kg/m2]=>[m/s][g/kg]

imfc_con    = dim_sum_n(mfc_con_dpg, 1)

imfc_con@long_name = "Integrated  Mass Flux Convergence"

imfc_con@LONG_NAME = "Sum: Mass Weighted Integrated Mass Flux Convergence [mfc_con*dpg]"

imfc_con@units     = "[m/s][g/kg]"

copy_VarCoords(v(:,0,:,:), imfc_con); (time,lat,lon)

delete(mfc_con_dpg)

VIMFC =  imfc_adv +  imfc_con

VIMFC@long_name = "VIMFC"

VIMFC@LONG_NAME = "VIMFC: [imfc_adv+imfc_con]"

copy_VarCoords(q(:,0,:,:),VIMFC)            ; (time,lat,lon)

PRINT_RESULT = True

if (PRINT_RESULT) then

printVarSummary(imfc_adv)                 ; (time,lat,lon)

printMinMax(imfc_adv,0)

print("-----")

printVarSummary(imfc_con)                 ; (time,lat,lon)

printMinMax(imfc_con,0)

print("-----")

printVarSummary(VIMFC)               ; (time,lat,lon)

printMinMax(VIMFC,0)

print("-----")

end if

;*************************************************

; plot results

;*************************************************

scl5  = 1e5                                  ; arbitrary: used for nicer plot values

sclab5= "(10~S~-5~N~)"                       ; used later

SCLAB5= "(10~S~5~N~)"

scl6  = 1e6

sclab6= "(10~S~-6~N~)"

SCLAB6= "(10~S~6~N~)"

plot := new(2,graphic)

wks   = gsn_open_wks("png","mfc_div_2")        ; send graphics to PNG file

;--- mfc_adv and mfc_con at a specified pressure level

res                   = True             ; plot mods desired

res@gsnDraw           = False            ; don't draw yet

res@gsnFrame          = False            ; don't advance frame yet

res@cnFillOn          = True             ; turn on color

res@cnLinesOn         = False            ; turn off contour lines

res@cnLineLabelsOn    = False            ; turn off contour lines

res@cnFillPalette     = "ViBlGrWhYeOrRe" ; set White-in-Middle color map

res@mpFillOn          = False            ; turn off map fill

res@lbLabelBarOn      = False            ; turn off individual cb's

; Use a common scale

res@cnLevelSelectionMode = "ManualLevels"; manual set levels so lb consistent

res@cnMaxLevelValF       =   12.0        ; max level

res@cnMinLevelValF       = -res@cnMaxLevelValF     ; min level

res@cnLevelSpacingF      =    0.5        ; contour interval

LEVP    = 700

res@gsnCenterString      = LEVP+"hPa"

MFC_ADV = mfc_adv(nt,{LEVP},:,:)         ; keep meta data

MFC_ADV = MFC_ADV*scl5

res@gsnRightString  = sclab5+" "+mfc_adv@units

plot(0) = gsn_csm_contour_map(wks,MFC_ADV,res)

MFC_CON = mfc_con(nt,{LEVP},:,:)

MFC_CON = MFC_CON*scl5

res@gsnRightString  = sclab5+" "+mfc_con@units

plot(1) = gsn_csm_contour_map(wks,MFC_CON,res)

resP                     = True                ; modify the panel plot

resP@gsnPanelMainString  = date+": Unweighted MFC_ADV, MFC_CON"

resP@gsnPanelLabelBar    = True                ; add common colorbar

gsn_panel(wks,plot,(/2,1/),resP)               ; now draw as one plot

;--- Integrated Moisture Transport [iuq, ivq]

delete([/res@gsnRightString, res@gsnCenterString/]) ; not used for this plot

res@cnMaxLevelValF       =  0.50                   ; min level

res@cnMinLevelValF       = -res@cnMaxLevelValF     ; min level

res@cnLevelSpacingF      =  0.05                   ; contour interval

IMFC_ADV = imfc_adv(nt,:,:)                    ; local array: keep meta data

plot(0)  = gsn_csm_contour_map(wks,IMFC_ADV,res)

IMFC_CON = imfc_con(nt,:,:)                    ; local array: keep meta data

plot(1) = gsn_csm_contour_map(wks,IMFC_CON,res)

resP@gsnPanelMainString  = date+": Integrated Moisture Flux: Advect, Convergence"

gsn_panel(wks,plot,(/2,1/),resP)               ; now draw as one plot

delete( [/IMFC_ADV, IMFC_CON/] )                   ; no longer needed

res@lbLabelBarOn      = True

res@gsnDraw = True

res@gsnFrame= True

;---Integrated Divergence of Moisture Flux Convergence [no scaling]

;res@cnFillPalette        = "cmp_flux"

res@cnLevelSelectionMode = "ManualLevels"; manual set levels so lb consistent

res@cnMaxLevelValF       =  0.50                ; min level

res@cnMinLevelValF       = -res@cnMaxLevelValF  ; min level

res@cnLevelSpacingF      =  0.050               ; contour interval

res@tiMainString         = date+": VIMFC: [IMFC_ADV+IMFC_CON]"

plt = gsn_csm_contour_map(wks,VIMFC(nt,:,:) ,res)

你可能感兴趣的:(水平输送水汽通量matlab)