气象编程 您所在的位置:网站首页 calculate缩写 气象编程

气象编程

2023-10-23 04:20| 来源: 网络整理| 查看: 265

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

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.

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].

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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有