diff --git a/.gitmodules b/.gitmodules index edb00607..9feec03b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -644,3 +644,6 @@ [submodule "vendor/grammars/smali-sublime"] path = vendor/grammars/smali-sublime url = https://github.com/ShaneWilton/sublime-smali +[submodule "vendor/grammars/language-ncl"] + path = vendor/grammars/language-ncl + url = https://github.com/rpavlick/language-ncl.git diff --git a/Rakefile b/Rakefile index b38486c0..1936c5f0 100644 --- a/Rakefile +++ b/Rakefile @@ -62,7 +62,7 @@ namespace :benchmark do corpus = File.expand_path(ENV["CORPUS"] || "samples") - require 'linguist/language' + require 'linguist' results = Hash.new Dir.glob("#{corpus}/**/*").each do |file| diff --git a/grammars.yml b/grammars.yml index 21a54c67..fbf3dabc 100644 --- a/grammars.yml +++ b/grammars.yml @@ -320,6 +320,8 @@ vendor/grammars/language-hy: vendor/grammars/language-javascript: - source.js - source.js.regexp +vendor/grammars/language-ncl: +- source.ncl vendor/grammars/language-python: - source.python - source.regexp.python diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 39e286bb..8fb41ced 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -274,6 +274,12 @@ module Linguist end end + disambiguate "Text", "NCL" do |data| + if data.include?("THE_TITLE") + Language["Text"] + end + end + disambiguate "NL", "NewLisp" do |data| if /^(b|g)[0-9]+ /.match(data) Language["NL"] diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index ba5c0103..c404baaa 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2049,6 +2049,14 @@ Myghty: tm_scope: none ace_mode: text +NCL: + type: programming + color: #28431f + extensions: + - .ncl + tm_scope: source.ncl + ace_mode: text + NL: type: data extensions: @@ -3261,6 +3269,7 @@ Text: extensions: - .txt - .fr + - .ncl tm_scope: none ace_mode: text diff --git a/samples/NCL/PrnOscPat_driver.ncl b/samples/NCL/PrnOscPat_driver.ncl new file mode 100644 index 00000000..9a4ba134 --- /dev/null +++ b/samples/NCL/PrnOscPat_driver.ncl @@ -0,0 +1,109 @@ +undef("PrnOscPat_driver") +function PrnOscPat_driver(eof[*][*][*]:numeric, eof_ts[*][*]:numeric, kPOP[1]:integer) +; ================================================================= +; compute Principal Oscillation Patterns (POPs) +; ================================================================= +local dim_ts, dim_eof, neof, ntim, nlat, mlon, dnam_ts, dnam_eof, neof, j \ + , cov0, cov1, cov0_inverse, A, z, Z, pr, pi, zr, zi, mean, stdev \ + , evlr, eigi, eigr +begin + + dim_ts = dimsizes(eof_ts) ; (neof,ntim) + dim_eof = dimsizes(eof) ; (neof,nlat,mlon) + + ntim = dim_ts(1) + neof = dim_eof(0) + nlat = dim_eof(1) + mlon = dim_eof(2) + + dnam_ts = getvardims(eof_ts) ; dimension names + dnam_eof= getvardims(eof) ; used at end for meta data + +; ================================================================= +; lag-0 and lag-1 matrices +; ================================================================= + + if (get_ncl_version().eq."6.1.2") then ; bug in 6.1.2 + cov0 = covcorm(eof_ts,(/1,0/)) ; lag-0 covariance matrix + else + cov0 = covcorm(eof_ts,(/0,1/)) ; lag-0 covariance matrix (n x n) + end if + ; either + cov1 = covcorm_xy(eof_ts, eof_ts, (/0,1,0/)) ; lag-1 + ;cov1 = covcorm_xy(eof_ts(:,0:ntim-2) \ ; alternative, brute force + ; ,eof_ts(:,1:ntim-1), (/0,0,0/)) + ;printVarSummary(cov1) + +; ================================================================= +; matrix A contains information for evolution of the POP system. +; POPs are eigenvectors of A. +; ================================================================= + + cov0_inverse = inverse_matrix(cov0) + A = cov1#inverse_matrix(cov0) ; [*][*] => neof x neof + +; ================================================================= +; NCL 6.1.1 of dgeevx: evlr(2,2,N,N) ; (left(0)/right(1), real(0)/imag(1),:,:) +; Eigenvalues are returned as attributes: eigi = evlr@eigi ; eigr = evlr@eigr +; ================================================================= + + evlr = dgeevx_lapack(A, "B", "V", "V", "B", False) + +; ================================================================= +; POP time series from eigenvalues and right eigenvectors +; ================================================================= + ;PR = (/ evlr(1,0,:,:) /) ; right ev (1), real part (0) + ;PI = (/ evlr(1,1,:,:) /) ; right ev (1), imag part (1) + ; kPOP is what we want; use righteigenvector + pr = (/ evlr(1,0,kPOP-1,:) /) ; right ev (1), real part (0), row 'kPOP-1' + pi = (/ evlr(1,1,kPOP-1,:) /) ; right ev (1), imag part (1), row 'kPOP-1' + + z = inverse_matrix( (/ (/sum(pr*pr), sum(pr*pi)/) \ + , (/sum(pr*pi), sum(pi*pi)/) /))#(/pr,pi/)#eof_ts + + ; complex conjugate + z = (/z(0,:), -z(1,:)/) ; real & imag series + z = dim_rmvmean_n(z,1) + mean = dim_avg_n(z,1) ; calculate mean + stdev= dim_stddev_n(z,1) ; calculate stdev + z = dim_standardize_n(z,1,1) ; standardize time series + + z!0 = "nPOP" ; add meta data + z!1 = dnam_ts(1) + z&nPOP = (/0,1/) + z&$dnam_ts(1)$ = eof_ts&$dnam_ts(1)$ + z@stdev = stdev + z@mean = mean + z@long_name = "POP timeseries" + ;printVarSummary(z) + +; ================================================================= +; POP spatial patterns +; ================================================================= + + zr = pr(0)*eof(0,:,:) ; construct POP spatial domain + zi = pi(0)*eof(0,:,:) + do j=1,neof-1 + zr = zr + pr(j)*eof(j,:,:) + zi = zi + pi(j)*eof(j,:,:) + end do + + Z = (/zr*stdev(0), -zi*stdev(1)/) ; scale patterns by time series stdev + + Z!0 = "nPOP" ; add meta data + Z!1 = dnam_eof(1) + Z!2 = dnam_eof(2) + + Z&nPOP = (/0,1/) + Z&$dnam_eof(1)$ = eof&$dnam_eof(1)$ + Z&$dnam_eof(2)$ = eof&$dnam_eof(2)$ + Z@long_name = "POP pattern" + ;printVarSummary(Z) + +; ================================================================= +; return POP time series and POP spatial patterns as a +; variable of type 'list' which contains 2 variables +; ================================================================= + + return( [/z, Z/] ) ; this is type "list" +end diff --git a/samples/NCL/WRF_static_2.ncl b/samples/NCL/WRF_static_2.ncl new file mode 100644 index 00000000..3f2eefd6 --- /dev/null +++ b/samples/NCL/WRF_static_2.ncl @@ -0,0 +1,115 @@ +;************************************************* +; WRF static: panel different variables +;************************************************ +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/wrf/WRF_contributed.ncl" +begin +;************************************************ +; open file and read in data +;************************************************ + f = addfile("static.wrfsi.nc", "r") +;************************************************ +; Read variables +;************************************************ + use = f->use(0,0,:,:) ; land use dominant category + stl = f->stl(0,0,:,:) ; top layer (0-30cm) dom cat soiltype + sbl = f->sbl(0,0,:,:) ; bottom layer (30-90cm) dom cat soiltype + lat2d = f->lat(0,0,:,:) + lon2d = f->lon(0,0,:,:) + lsMask= f->lnd(0,0,:,:) ; land (1) water (0) mas + +;************************************************ +; Use mask function to set all ocean areas to _FillValue +;************************************************ + use = mask(use,lsMask,1) + stl = mask(stl,lsMask,1) + sbl = mask(sbl,lsMask,1) + +;************************************************ +; Associate 2D coordinates with variables for plotting +;************************************************ + use@lat2d = lat2d + use@lon2d = lon2d + stl@lat2d = lat2d + stl@lon2d = lon2d + sbl@lat2d = lat2d + sbl@lon2d = lon2d + +;************************************************ +; The file should be examined via: ncdump -v grid_type static.wrsi +; This will print the print type. then enter below. +;************************************************ + projection = "mercator" + +;************************************************ +; create plots +;************************************************ + wks = gsn_open_wks("ps" ,"WRF_static") ; ps,pdf,x11,ncgm,eps + gsn_define_colormap(wks ,"BlAqGrYeOrReVi200"); choose colormap + + res = True ; plot mods desired + res@gsnSpreadColors = True ; use full range of colormap + res@cnFillOn = True ; color plot desired + res@cnLinesOn = False ; turn off contour lines + res@cnLineLabelsOn = False ; turn off contour labels + res@cnLevelSpacingF = 1 ; manually specify interval + res@cnFillMode = "RasterFill" ; activate raster mode + res@lbLabelAutoStride = True ; let NCL figure lb stride + +;************************************************ +; Turn on lat / lon labeling +;************************************************ +;;res@pmTickMarkDisplayMode = "Always" ; turn on tickmarks + + dimll = dimsizes(lat2d) + nlat = dimll(0) + mlon = dimll(1) + + res@mpProjection = projection + res@mpLimitMode = "Corners" + res@mpLeftCornerLatF = lat2d(0,0) + res@mpLeftCornerLonF = lon2d(0,0) + res@mpRightCornerLatF = lat2d(nlat-1,mlon-1) + res@mpRightCornerLonF = lon2d(nlat-1,mlon-1) + + res@mpCenterLonF = f->LoV ; set center logitude + + if (projection.eq."LambertConformal") then + res@mpLambertParallel1F = f->Latin1 + res@mpLambertParallel2F = f->Latin2 + res@mpLambertMeridianF = f->LoV + end if + + res@mpFillOn = False ; turn off map fill + res@mpOutlineDrawOrder = "PostDraw" ; draw continental outline last + res@mpOutlineBoundarySets = "GeophysicalAndUSStates" ; state boundaries + +;;res@tfDoNDCOverlay = True ; True only for 'native' grid + res@gsnAddCyclic = False ; data are not cyclic + +;************************************************ +; allocate array for 3 plots +;************************************************ + plts = new (3,"graphic") + +;************************************************ +; Tell NCL not to draw or advance frame for individual plots +;************************************************ + res@gsnDraw = False ; (a) do not draw + res@gsnFrame = False ; (b) do not advance 'frame' + + plts(0) = gsn_csm_contour_map(wks,use,res) + plts(1) = gsn_csm_contour_map(wks,stl,res) + plts(2) = gsn_csm_contour_map(wks,sbl,res) +;************************************************ +; create panel: panel plots have their own set of resources +;************************************************ + resP = True ; modify the panel plot + resP@txString = "Land Use and Soil Type" + resP@gsnMaximize = True ; maximize panel area + resP@gsnPanelRowSpec = True ; specify 1 top, 2 lower level + gsn_panel(wks,plts,(/1,2/),resP) ; now draw as one plot + +end + diff --git a/samples/NCL/WRF_track_1.ncl b/samples/NCL/WRF_track_1.ncl new file mode 100644 index 00000000..9d818519 --- /dev/null +++ b/samples/NCL/WRF_track_1.ncl @@ -0,0 +1,160 @@ +;******************************************************** +; Plot storm stracks from wrfout files. +;******************************************************** +; +; JUN-18-2005 +; So-Young Ha (MMM/NCAR) +; SEP-01-2006 +; Slightly modified by Mary Haley to add some extra comments. +; =========================================== + +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/wrf/WRF_contributed.ncl" +load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl" + + +begin + +; DATES + date = (/1512,1600,1612,1700,1712,1800,1812,1900/) + ndate = dimsizes(date) + + sdate = sprinti("%4.0i",date) + +; Experiment name (for legend) + EXP = (/"EXP_I"/) ; (/"EXP_I","EXP_II","EXP_III"/) + nexp = dimsizes(EXP) + +; To get lat/lon info. + + a = addfile("wrfout_d01_2003-07-15_00:00:00.nc","r") + + lat2d = a->XLAT(0,:,:) + lon2d = a->XLONG(0,:,:) + dimll = dimsizes(lat2d) + nlat = dimll(0) + mlon = dimll(1) + +; Sea Level Pressure + slp = wrf_user_getvar(a,"slp",0) + dims = dimsizes(slp) + +; Array for track + time = new(ndate,string) + imin = new(ndate,integer) + jmin = new(ndate,integer) + smin = new(ndate,integer) + +; ======= +; ndate +; ======= + fs = systemfunc("ls wrfout*00") + nfs= dimsizes(fs) + if(nfs .ne. ndate) then + print("Check input data:"+nfs+" .ne. "+ndate) + end if + + do ifs=0,nfs-1 + f = addfile(fs(ifs)+".nc","r") + time(ifs) = wrf_user_list_times(f) +; print(time(ifs)) + slp2d = wrf_user_getvar(f,"slp",0) + +; We need to convert 2-D array to 1-D array to find the minima. + slp1d = ndtooned(slp2d) + smin(ifs) = minind(slp1d) + +; Convert the index for 1-D array back to the indeces for 2-D array. + minij = ind_resolve(ind(slp1d.eq.min(slp2d)),dims) + imin(ifs) = minij(0,0) + jmin(ifs) = minij(0,1) + +; print(time(ifs)+" : "+min(slp2d)+" ("+imin(ifs)+","+jmin(ifs)+")") + end do +; + +; Graphics section + + wks=gsn_open_wks("ps","track") ; Open PS file. + gsn_define_colormap(wks,"BlGrYeOrReVi200") ; Change color map. + + res = True + res@gsnDraw = False ; Turn off draw. + res@gsnFrame = False ; Turn off frame advance. + res@gsnMaximize = True ; Maximize plot in frame. + + res@tiMainString = "Hurricane Isabel" ; Main title + + WRF_map_c(a,res,0) ; Set up map resources + ; (plot options) + plot = gsn_csm_map(wks,res) ; Create a map. + +; Set up resources for polymarkers. + gsres = True + gsres@gsMarkerIndex = 16 ; filled dot + ;gsres@gsMarkerSizeF = 0.005 ; default - 0.007 + cols = (/5,160,40/) + +; Set up resources for polylines. + res_lines = True + res_lines@gsLineThicknessF = 3. ; 3x as thick + + dot = new(ndate,graphic) ; Make sure each gsn_add_polyxxx call + line = new(ndate,graphic) ; is assigned to a unique variable. + +; Loop through each date and add polylines to the plot. + do i = 0,ndate-2 + res_lines@gsLineColor = cols(0) + xx=(/lon2d(imin(i),jmin(i)),lon2d(imin(i+1),jmin(i+1))/) + yy=(/lat2d(imin(i),jmin(i)),lat2d(imin(i+1),jmin(i+1))/) + line(i) = gsn_add_polyline(wks,plot,xx,yy,res_lines) + end do + + lon1d = ndtooned(lon2d) + lat1d = ndtooned(lat2d) + +; Loop through each date and add polymarkers to the plot. + do i = 0,ndate-1 + print("dot:"+lon1d(smin(i))+","+lat1d(smin(i))) + gsres@gsMarkerColor = cols(0) + dot(i)=gsn_add_polymarker(wks,plot,lon1d(smin(i)),lat1d(smin(i)),gsres) + end do + +; Date (Legend) + txres = True + txres@txFontHeightF = 0.015 + txres@txFontColor = cols(0) + + txid1 = new(ndate,graphic) +; Loop through each date and draw a text string on the plot. + do i = 0, ndate-1 + txres@txJust = "CenterRight" + ix = smin(i) - 4 + print("Eye:"+ix) + if(i.eq.1) then + txres@txJust = "CenterLeft" + ix = ix + 8 + end if + txid1(i) = gsn_add_text(wks,plot,sdate(i),lon1d(ix),lat1d(ix),txres) + end do + +; Add marker and text for legend. (Or you can just use "pmLegend" instead.) + txres@txJust = "CenterLeft" + + txid2 = new(nexp,graphic) + pmid2 = new(nexp,graphic) + do i = 0,nexp-1 + gsres@gsMarkerColor = cols(i) + txres@txFontColor = cols(i) + ii = ((/129,119,109/)) ; ilat + jj = ((/110,110,110/)) ; jlon + ji = ii*mlon+jj ; col x row + pmid2(i) = gsn_add_polymarker(wks,plot,lon1d(ji(i)),lat1d(ji(i)),gsres) + txid2(i) = gsn_add_text(wks,plot,EXP(i),lon1d(ji(i)+5),lat1d(ji(i)),txres) + end do + + draw(plot) + frame(wks) +end diff --git a/samples/NCL/cru_8.ncl b/samples/NCL/cru_8.ncl new file mode 100644 index 00000000..465a9f85 --- /dev/null +++ b/samples/NCL/cru_8.ncl @@ -0,0 +1,129 @@ +;***************************************************** +; cru_8.ncl +; +; Concepts illustrated: +; - Plotting CRU (Climate Research Unit)/ BADC data +; - Selecting a sub-period +; - calculating a climatology +; - Drawing raster contours; very basic graphics +; +;***************************************************** + +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" ; not needed 6.20 onward +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl" +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" + +; create references (pointers) to the files + + diri = "./" + fcld = addfile(diri+"cru_ts3.21.1901.2012.cld.dat.nc", "r") + fdtr = addfile(diri+"cru_ts3.21.1901.2012.dtr.dat.nc", "r") + ffrs = addfile(diri+"cru_ts3.21.1901.2012.frs.dat.nc", "r") + fpet = addfile(diri+"cru_ts3.21.1901.2012.pet.dat.nc", "r") + fpre = addfile(diri+"cru_ts3.21.1901.2012.pre.dat.nc", "r") + ftmn = addfile(diri+"cru_ts3.21.1901.2012.tmn.dat.nc", "r") + ftmp = addfile(diri+"cru_ts3.21.1901.2012.tmp.dat.nc", "r") + ftmx = addfile(diri+"cru_ts3.21.1901.2012.tmx.dat.nc", "r") + fvap = addfile(diri+"cru_ts3.21.1901.2012.vap.dat.nc", "r") + fwet = addfile(diri+"cru_ts3.21.1901.2012.wet.dat.nc", "r") + +; specify start & last dates (arbitrary) + + ymStrt = 199101 + ymLast = 200012 + +; get index values of start/lat dates + + time = fcld->time + yyyymm = cd_calendar(time, -1) + + ntStrt = ind(yyyymm.eq.ymStrt) ; index values + ntLast = ind(yyyymm.eq.ymLast) + +; read time segment + + cld = fcld->cld(ntStrt:ntLast,:,:) + dtr = fdtr->dtr(ntStrt:ntLast,:,:) + frs = ffrs->frs(ntStrt:ntLast,:,:) + pet = fpet->pet(ntStrt:ntLast,:,:) + pre = fpre->pre(ntStrt:ntLast,:,:) + tmn = ftmn->tmn(ntStrt:ntLast,:,:) + tmp = ftmp->tmp(ntStrt:ntLast,:,:) + tmx = ftmx->tmx(ntStrt:ntLast,:,:) + vap = fvap->vap(ntStrt:ntLast,:,:) + wet = fwet->wet(ntStrt:ntLast,:,:) + + printVarSummary(cld) ; [time | 120] x [lat | 360] x [lon | 720] + +; calculate monthly climatologies + + cldclm = clmMonTLL(cld) + dtrclm = clmMonTLL(dtr) + frsclm = clmMonTLL(frs) + petclm = clmMonTLL(pet) + preclm = clmMonTLL(pre) + tmnclm = clmMonTLL(tmn) + tmpclm = clmMonTLL(tmp) + tmxclm = clmMonTLL(tmx) + vapclm = clmMonTLL(vap) + wetclm = clmMonTLL(wet) + + + printVarSummary(cldclm) ; [month | 12] x [lat | 360] x [lon | 720] + +;************************************ +; create plots ... very simple +;************************************ + + nt = 6 + month = "July" + yrStrt = ymStrt/100 + yrLast = ymLast/100 + title = month+": "+yrStrt+"-"+yrLast + + wks = gsn_open_wks("ps","cru") ; open a ps file + gsn_define_colormap(wks,"ncl_default") ; choose colormap; not needed 6.20 onward + plot = new(2,graphic) ; create graphic array + + res = True + res@cnFillOn = True ; turn on color fill; not needed 6.20 onward + res@cnFillMode = "RasterFill" ; Raster Mode + res@cnLinesOn = False ; Turn off contour lines + + res@gsnDraw = False ; do not draw picture + res@gsnFrame = False ; do not advance frame + res@lbOrientation = "Vertical" ; vertical label bar + + resp = True + resp@gsnMaximize = True ; make ps, eps, pdf large + + resp@txString = title+": CLD, FRS" + plot(0)=gsn_csm_contour_map_ce(wks,cldclm(nt,:,:),res) + plot(1)=gsn_csm_contour_map_ce(wks,frsclm(nt,:,:),res) + gsn_panel(wks,plot,(/2,1/),resp) + + resp@txString = title+": PET, VAP" + plot(0)=gsn_csm_contour_map_ce(wks,petclm(nt,:,:),res) + plot(1)=gsn_csm_contour_map_ce(wks,vapclm(nt,:,:),res) + gsn_panel(wks,plot,(/2,1/),resp) + + resp@txString = title+": TMN, TMX" + plot(0)=gsn_csm_contour_map_ce(wks,tmnclm(nt,:,:),res) + plot(1)=gsn_csm_contour_map_ce(wks,tmxclm(nt,:,:),res) + gsn_panel(wks,plot,(/2,1/),resp) + + resp@txString = title+": TMP, DTR" + plot(0)=gsn_csm_contour_map_ce(wks,tmpclm(nt,:,:),res) + plot(1)=gsn_csm_contour_map_ce(wks,dtrclm(nt,:,:),res) + gsn_panel(wks,plot,(/2,1/),resp) + + resp@txString = title+": WET, PRE" + plot(0)=gsn_csm_contour_map_ce(wks,wetclm(nt,:,:),res) + + ;colors = (/ ... /) + ;res@cnFillPalette = colors ; optional: distinct colors for categories + res@cnLevelSelectionMode = "ExplicitLevels" ; use unequal spacing + res@cnLevels = (/2.0,10,25,37.5,50,75,100,125,150,175,200,300,400,500,750/) + + plot(1)=gsn_csm_contour_map_ce(wks,preclm(nt,:,:),res) + gsn_panel(wks,plot,(/2,1/),resp) diff --git a/samples/NCL/gsn_csm_xy2_time_series_inputs.ncl b/samples/NCL/gsn_csm_xy2_time_series_inputs.ncl new file mode 100644 index 00000000..4efe39ab --- /dev/null +++ b/samples/NCL/gsn_csm_xy2_time_series_inputs.ncl @@ -0,0 +1,20 @@ +;******************** Inputs Regarding Input and Output Data ************************************* + +;netCDFFilePath = "NULL-MYD04_L2.051-MIL2ASAE.0022-AERONET_AOD_L2.2-20112106165049.nc" +;outputFilePath = "plot-output" + +;******************* Inputs Regarding Data Structure *********************************************** + +;lPlotVariablesList = "mean_AERONET_AOD_L2_2_AOD0558intrp_Ames,mean_MIL2ASAE_0022_AOD0866b_Ames" +;rPlotVariablesList = "medn_MYD04_L2_051_AOD0550dpbl_l_Ames" + +;xDimName = "time" +;xDimSize = 365 + +;******************* Inputs Regarding the View Annotations **************************************** + +;title = "MAPSS Time Series" +;yLAxisLabel = "Mean AOD" +;yRAxisLabel = "Median AOD" + +;*******************END INPUTS ******************************************************************** \ No newline at end of file diff --git a/samples/NCL/hdf4sds_7.ncl b/samples/NCL/hdf4sds_7.ncl new file mode 100644 index 00000000..f3aeff77 --- /dev/null +++ b/samples/NCL/hdf4sds_7.ncl @@ -0,0 +1,128 @@ +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" +;************************************************************** +; User Input +;*************************************************************** + ; INPUT + diri = "./" ; input directory + fili = "wv_LV3_MET08_20050102_12345678_L00013712E00013712.hdf" + + pltDir = "./" ; directory for plot output + sfx = get_file_suffix(fili,1) + ;pltName = sfx@fBase ; output graphic name + pltName = "hdf4sds" + pltType = "ps" + +;*************************************************************** +; End User Input +;*************************************************************** + +;*************************************************************** +; Open SEVIRI L3 'wv' HDF file +;*************************************************************** +; Note the rather unusual data format: flag *prepended* to data value +;*************************************************************** +; integer twc_lv3 ( fakeDim0, fakeDim1 ) +; long_name : total water vapour column + flag +; units : fmmmm +; format : I4 +; valid_range : ( 10000, 38000 ) +; _FillValue : -99 +; legend_01 : f = flag +; legend_02 : f = 1 averaged level 2 values +; legend_03 : f = 2 interpolated from averaged level 2 values +; legend_04 : f = 3 gaps filled with NVAP climatology +; legend_05 : mmmm = water vapour column in mm * 100. as integer +; legend_06 : Example: 11025 means: flag = 1, 10.25 mm water vapour column +; min_lat : -74.75 +; max_lat : 61.75 +; min_lon : -75.25 +; max_lon : 75.25 +; dlat : 0.5 +; dlon : 0.5 +;--------------------------------------------------------------- + + f = addfile (diri+fili, "r") + ifx = f->twc_lv3 ; fmmmm (integer) + printVarSummary(ifx) + + flag = ifx/10000 ; extract flag + ix = ifx - flag*10000 ; extract mmmm + x = ix*0.01 ; scale + +; create meta data for 'x' + + dimx = dimsizes(x) + nlat = dimx(0) ; grid size x(nlat,mlon) + mlon = dimx(1) + + lat = fspan(ifx@min_lat, ifx@max_lat, nlat) + lat@units = "degrees_north" + lon = fspan(ifx@min_lon, ifx@max_lon, mlon) + lon@units = "degrees_east" + + x!0 = "lat" + x!1 = "lon" + x&lat = lat + x&lon = lon + x@long_name = "SEVIRI: Total Water Vapor" + x@units = "mm" + + delete( [/ifx, ix/] ) ; no longer needed + +;*************************************************************** +; Create plot +;*************************************************************** + wks = gsn_open_wks(pltType, pltDir+pltName) + + plot = new (2, "graphic") + + res = True ; plot mods desired + res@gsnAddCyclic = False ; data noty global + res@gsnDraw = False + res@gsnFrame = False + + res@cnFillOn = True ; turn on color fill + res@cnLinesOn = False ; turn of contour lines + res@cnFillMode = "RasterFill" ; Raster Mode + res@cnLinesOn = False ; Turn off contour lines + res@cnLineLabelsOn = False ; Turn off contour lines + res@cnMissingValFillColor= "background" ; "foreground" + + res@mpCenterLonF = 0.5*(min(x&lon) + max(x&lon)) + res@mpMinLatF = min(x&lat) + res@mpMaxLatF = max(x&lat) + res@mpMinLonF = min(x&lon) + res@mpMaxLonF = max(x&lon) + + ;res@lbOrientation = "Vertical" + + plot(0) = gsn_csm_contour_map_ce(wks,x, res) + +; plot flag + + copy_VarCoords(x, flag) + flag@long_name = "Flag" + flag@units = "1=avg(L2), 2=int(L2), 3=NVAP" + print(flag&lat+" "+flag(:,{30})) + + res@cnLevelSelectionMode = "ManualLevels" ; set manual contour levels + res@cnMinLevelValF = 2 ; set min contour level + res@cnMaxLevelValF = 3 ; one less than max + res@cnLevelSpacingF = 1 ; set contour spacing + + res@lbLabelStrings = ispan(1,3,1) ; 1, 2, 3 + res@lbLabelPosition = "Center" ; label position + res@lbLabelAlignment = "BoxCenters" + + res@gsnLeftString = "" + res@gsnRightString = "" + res@gsnCenterString = "flag: 1=avg(L2), 2=int(L2), 3=NVAP" + + plot(1) = gsn_csm_contour_map_ce(wks,flag, res) + + resP = True ; modify the panel plot + resP@txString = fili + resP@gsnMaximize = True + gsn_panel(wks,plot,(/1,2/),resP) ; now draw as one plot diff --git a/samples/NCL/mask_12.ncl b/samples/NCL/mask_12.ncl new file mode 100644 index 00000000..30027c80 --- /dev/null +++ b/samples/NCL/mask_12.ncl @@ -0,0 +1,125 @@ +;---------------------------------------------------------------------- +; mask_12.ncl +; +; Concepts illustrated: +; - Using a worldwide shapefile to create a land/ocean mask +; - Masking a data array based on a geographical area +; - Attaching shapefile polylines to a map plot +; - Attaching lat/lon points to a map using gsn_coordinates +;---------------------------------------------------------------------- +; Downloaded GSHHS shapefiles from: +; +; http://www.ngdc.noaa.gov/mgg/shorelines/data/gshhg/latest/ +; +; Used the "coarsest" one: "GSHHS_shp/c/GSHHS_c_L1.shp". +;---------------------------------------------------------------------- + +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 "./shapefile_mask_data.ncl" + +;---------------------------------------------------------------------- +; Main code +;---------------------------------------------------------------------- +begin + WRITE_MASK = True + DEBUG = False + +;---Read data to plot and mask + dir = "$NCARG_ROOT/lib/ncarg/data/cdf/" + cdf_prefix = "uv300" + cdf_file = dir + cdf_prefix + ".nc" + fin = addfile(cdf_file,"r") + u = fin->U(1,:,:) +; +; Create a mask array the same size as "u", using +; lat/lon data read off a shapefile. +; + shpfile = "GSHHS_shp/c/GSHHS_c_L1.shp" + opt = True + opt@return_mask = True + + land_mask = shapefile_mask_data(u,shpfile,opt) + +;---Mask "u" against land and ocean. + u_land_mask = where(land_mask.eq.1,u,u@_FillValue) + u_ocean_mask = where(land_mask.eq.0,u,u@_FillValue) + copy_VarMeta(u,u_land_mask) + copy_VarMeta(u,u_ocean_mask) + +;---Start the graphics + wks = gsn_open_wks("ps","mask") + + res = True + + res@gsnMaximize = True ; maximize plot in frame + res@gsnDraw = False ; don't draw plot yet + res@gsnFrame = False ; don't advance frame yet + + res@cnFillOn = True + res@cnLineLabelsOn = False + res@cnLinesOn = False + +;---Make sure both plots have same contour levels + mnmxint = nice_mnmxintvl(min(u),max(u),25,False) + res@cnLevelSelectionMode = "ManualLevels" + res@cnMinLevelValF = mnmxint(0) + res@cnMaxLevelValF = mnmxint(1) + res@cnLevelSpacingF = mnmxint(2) + + res@lbLabelBarOn = False + res@gsnAddCyclic = False + + res@mpFillOn = False + res@mpOutlineOn = False + + res@gsnRightString = "" + res@gsnLeftString = "" + +;---Create plot of original data and attach shapefile outlines + res@tiMainString = "Original data with shapefile outlines" + map_data = gsn_csm_contour_map(wks,u,res) + dum1 = gsn_add_shapefile_polylines(wks,map_data,shpfile,False) + +;---Create plots of masked data + res@tiMainString = "Original data masked against land" + map_land_mask = gsn_csm_contour_map(wks,u_land_mask,res) + res@tiMainString = "Original data masked against ocean" + map_ocean_mask = gsn_csm_contour_map(wks,u_ocean_mask,res) + + if(DEBUG) then + mkres = True +; mkres@gsMarkerSizeF = 0.007 + mkres@gsnCoordsAttach = True + gsn_coordinates(wks,map_data,u,mkres) + mkres@gsnCoordsNonMissingColor = "yellow" + mkres@gsnCoordsMissingColor = "black" + gsn_coordinates(wks,map_land_mask,u_land_mask,mkres) + gsn_coordinates(wks,map_ocean_mask,u_ocean_mask,mkres) + end if + +;---Add shapefile outlines + dum2 = gsn_add_shapefile_polylines(wks,map_land_mask,shpfile,False) + dum3 = gsn_add_shapefile_polylines(wks,map_ocean_mask,shpfile,False) + +;---Draw all three plots on one page + pres = True + pres@gsnMaximize = True + pres@gsnPanelLabelBar = True + gsn_panel(wks,(/map_data,map_land_mask,map_ocean_mask/),(/3,1/),pres) + + if(WRITE_MASK) then + delete(fin) ; Close file before we open again. +; +; Make copy of file so we don't overwrite original. +; This is not necessary, but it's safer. +; + new_cdf_file = cdf_prefix + "_with_mask.nc" + system("/bin/cp " + cdf_file + " " + new_cdf_file) + finout = addfile(new_cdf_file,"w") + filevardef(finout, "land_mask", typeof(land_mask), (/ "lat", "lon" /) ) + finout->land_mask = (/land_mask/) + end if +end + diff --git a/samples/NCL/mcsst_1.ncl b/samples/NCL/mcsst_1.ncl new file mode 100644 index 00000000..338fe26f --- /dev/null +++ b/samples/NCL/mcsst_1.ncl @@ -0,0 +1,115 @@ +;***************************************************** +; mcsst_1.ncl +; +; Concepts illustrated: +; - Plotting NAVO MCSST data +; - Using fbindirread to read in fortran binary data +; - Converting "byte" data to "float" +; - Adding meta data (attributes and coordinates) to a variable +; - Adding gray to an existing color map +; - Spanning all but the last two colors in a color map for contour fill +; - Drawing raster contours +; +;***************************************************** +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl" +;*************************************** +; type of data available on file +;*************************************** +; ipar=0 Weekly Binned Sea Surface Temperature +; ipar=1 Number of Points in Bin +; ipar=2 Weekly Binned Sea Surface Temperature Anomaly +; ipar=3 Interpolated Sea Surface Temperature +; ipar=4 Interpolated Sea Surface Temperature Anomaly +;*************************************** +begin + ipar = 3 + fname = "2001311d18N16.dat" + tmp = fbindirread(fname,ipar,(/1024,2048/),"byte") +;*************************************** +; convert to float and then change to true SST +;*************************************** + xslope = 0.15 + if(ipar.eq.4.or.ipar.eq.2)then ; anom has different intercept + yint = -20.0 + end if + if(ipar.eq.3.or.ipar.eq.0)then + yint = -3.0 + end if + sst = new((/1024,2048/),"float") ; create float var + sst = tmp*xslope+yint ; convert to float + delete(tmp) ; delete unecessary array +;*************************************** +; assign missing values. The original missing value was zero, but since it was +; not assigned in NCL, it was not recognized. The new missing values are +; listed below. These will be changed later. +;*************************************** + if(ipar.eq.4)then + sst@_FillValue = -20 + end if + if(ipar.eq.3.or.ipar.eq.0)then + sst@_FillValue = -3 + end if +;*************************************** +; create coordinate variables +;*************************************** + nlat = 1024 + dy = 180./nlat + lat = (90. -(ispan(0,1023,1)*dy))-dy/2 + lat!0 = "lat" + lat&lat = lat + lat@units = "degrees_north" + + nlon = 2048 + dx = 360./nlon + lon = (ispan(0,2047,1)*dx)+dx/2-180. ; note -180. added by sjm to align + lon!0 = "lon" + lon&lon = lon + lon@units = "degrees_east" +;*************************************** +; fill out the netCDF data model +;*************************************** + sst!0 = "lat" ; name dimensions + sst!1 = "lon" ; ditto + sst = sst(::-1,:) ; reverse lat orientation + sst@long_name = "NAVO MCSST" ; assign long_name + sst@units = "deg C" ; assign units + sst&lat = lat ; assign lat cv + sst&lon = lon ; assign lon cv + sst@_FillValue = -999. ; assign missing value +;*************************************** +; get year and day from filename +;*************************************** + res = True ; plot mods desired + title = stringtochar(fname) ; parse file name to get date + year = title(0:3) + jday = title(4:6) + res@gsnCenterString = year+" "+jday ; create center string +;*************************************** +; create plot +;*************************************** + wks = gsn_open_wks("ps","mcsst") ; open workstation (plot destination) + gsn_define_colormap(wks,"BlGrYeOrReVi200") ; choose colormap +; +; This will not be necessary in V6.1.0 and later. Named colors can +; be used without having to first add them to the color map. +; + d = NhlNewColor(wks,0.8,0.8,0.8) ; add gray to colormap + + + res@cnFillOn = True ; turn on color + res@gsnSpreadColors = True ; use full range of colormap + res@gsnSpreadColorStart = 2 ; start at color 2 + res@gsnSpreadColorEnd = -3 ; don't use added gray + res@cnLinesOn = False ; no contour lines + res@cnFillDrawOrder = "PreDraw" ; draw contours before continents + res@gsnMaximize = True ; maximize plot + + +; For a grid this size, it is better to use raster mode. It will be +; significantly faster, and will not go over NCL's 16mb default plot size. + res@cnFillMode = "RasterFill" ; turn on raster mode + + plot = gsn_csm_contour_map_ce(wks,sst,res) ; contour the variable + +end diff --git a/samples/NCL/primero.ncl b/samples/NCL/primero.ncl new file mode 100644 index 00000000..7860ab8d --- /dev/null +++ b/samples/NCL/primero.ncl @@ -0,0 +1,3 @@ +val=102 +a=val/4. +print(a) diff --git a/samples/NCL/topo_9.ncl b/samples/NCL/topo_9.ncl new file mode 100644 index 00000000..e9bd62bf --- /dev/null +++ b/samples/NCL/topo_9.ncl @@ -0,0 +1,172 @@ +;---------------------------------------------------------------------- +; topo_9.ncl +; +; Concepts illustrated: +; - Recreating a jpeg topographic image as an NCL map object +; - Zooming in on a jpeg image +; - Drawing a box around an area of interest on a map +; - Attaching polylines to a map +; - Using "overlay" to overlay multiple contour plots +; - Using more than 256 colors per frame +; - Using functions for cleaner code +;---------------------------------------------------------------------- +; NOTE: This example will only work with NCL V6.1.0 and later. +; +; This script recreates a JPEG image that was converted to a NetCDF +; file with color separated bands using the open source tool +; "gdal_translate": +; +; gdal_translate -ot Int16 -of netCDF EarthMap_2500x1250.jpg \ +; EarthMap_2500x1250.nc +;---------------------------------------------------------------------- +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl" + +;---------------------------------------------------------------------- +; This function imports a JPEG image that's on the whole globe, +; and recreates it as an NCL map object that is zoomed in on the +; southern tip of Africa. +;---------------------------------------------------------------------- +undef("recreate_jpeg_image") +function recreate_jpeg_image(wks,minlat,maxlat,minlon,maxlon) +begin + orig_jpg_filename = "EarthMap_2500x1250.jpg" + nc_filename = "EarthMap_2500x1250.nc" + +;--You could use a system call to do the NetCDF conversion +; cmd = "gdal_translate -ot Int16 -of netCDF " + jpeg_filename + \ +; " " + nc_filename) +; system(cmd) + +;---Read the three bands of data + f = addfile(nc_filename,"r") + Band1 = where(f->Band1.gt.255, 255, f->Band1) ; red channel + Band2 = where(f->Band2.gt.255, 255, f->Band2) ; green channel + Band3 = where(f->Band3.gt.255, 255, f->Band3) ; blue channel + + band_dims = dimsizes(Band3) + nlat = band_dims(0) + nlon = band_dims(1) + print("dimensions of image = " + nlat + " x " + nlon) + +; +; Add lat/lon data so we can overlay on a map, and/or +; overlay contours. We know the image is global, +; cylindrical equidistant, and centered about lon=0. +; + lat = fspan( -90, 90,nlat) + lon = fspan(-180,180,nlon) + lat@units = "degrees_north" + lon@units = "degrees_east" + + Band1!0 = "lat" + Band1!1 = "lon" + Band2!0 = "lat" + Band2!1 = "lon" + Band3!0 = "lat" + Band3!1 = "lon" + Band1&lat = lat + Band1&lon = lon + Band2&lat = lat + Band2&lon = lon + Band3&lat = lat + Band3&lon = lon + + res = True + + res@gsnMaximize = True + + res@gsnFrame = False ; Don't draw or advance + res@gsnDraw = False ; frame yet. + + res@cnFillOn = True + res@cnFillMode = "RasterFill" ; Raster fill can be faster + + res@cnLevelSelectionMode = "EqualSpacedLevels" + res@cnMaxLevelCount = 254 + res@cnFillBackgroundColor = (/ 1., 1., 1., 1./) + + res@cnLinesOn = False ; Turn off contour lines . + res@cnLineLabelsOn = False ; Turn off contour labels + res@cnInfoLabelOn = False ; Turn off info label + res@lbLabelBarOn = False ; Turn off labelbar + res@gsnRightString = "" ; Turn off subtitles + res@gsnLeftString = "" + res@pmTickMarkDisplayMode = "Always" + +;---Construct RGBA colormaps... + ramp = fspan(0., 1., 255) + reds = new((/255, 4/), float) + greens = new((/255, 4/), float) + blues = new((/255, 4/), float) + + reds = 0 + greens = 0 + blues = 0 + + reds(:,0) = ramp + greens(:,1) = ramp + blues(:,2) = ramp + + ; The red contour map is plotted fully opaque; the green and blue + ; are plotted completely transparent. When overlain, the colors + ; combine (rather magically). + reds(:,3) = 1. + greens(:,3) = 0 + blues(:,3) = 0 + + res@cnFillColors = greens + greenMap = gsn_csm_contour(wks, Band2, res) + + res@cnFillColors = blues + blueMap = gsn_csm_contour(wks, Band3, res) + +;---This will be our base, so make it a map plot. + res@cnFillColors = reds + res@gsnAddCyclic = False + + res@mpFillOn = False + +;---Zoom in on area of interest + res@mpMinLatF = minlat + res@mpMaxLatF = maxlat + res@mpMinLonF = minlon + res@mpMaxLonF = maxlon + + redMap = gsn_csm_contour_map(wks, Band1, res) + +;---Overlay everything to create the topo map + overlay(redMap, greenMap) + overlay(redMap, blueMap) + + return(redMap) +end + +;---------------------------------------------------------------------- +; Main code +;---------------------------------------------------------------------- +begin +;---Recreating jpeg images only works for X11 and PNG. + wks = gsn_open_wks("png","topo") + +;---Southern part of Africa + minlat = -40 + maxlat = 5 + minlon = 10 + maxlon = 40 + + map = recreate_jpeg_image(wks,minlat,maxlat,minlon,maxlon) + +;---Overlay a red box + lonbox = (/ 15, 35, 35, 15, 15/) + latbox = (/-30,-30,-10,-10,-30/) + + lnres = True + lnres@gsLineColor = "red" ; red box + lnres@gsLineThicknessF = 4.0 ; make box thicker + box = gsn_add_polyline(wks,map,lonbox,latbox,lnres) + + draw(map) ; Drawing the map will draw the red box + frame(wks) + +end diff --git a/samples/NCL/traj_3.ncl b/samples/NCL/traj_3.ncl new file mode 100644 index 00000000..f01304b4 --- /dev/null +++ b/samples/NCL/traj_3.ncl @@ -0,0 +1,120 @@ +;************************************************* +; traj_3.ncl +;************************************************* +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" +external TRAJ "./particle.so" +;************************************************* +begin + + path = "./data.asc" + data = asciiread(path,(/500,6/),"float") +;************************************************* +; some parameters +;************************************************* + np = 1 + nq = 500 + ncor= 8 + xrot = new((/np,nq/),float) + yrot = new((/np,nq/),float) + xaxis = new(ncor,float) + yaxis = new(ncor,float) +;************************************************** +; convert data into rotated format +;************************************************** + TRAJ::particle(path,xrot,yrot,nq,np,xaxis,yaxis,ncor) +;************************************************** +; create plot +;************************************************** + wks = gsn_open_wks("ps","traj") ; Open an ps file + + xyres = True + xyres@gsnFrame = False ; don't advance the frame + xyres@gsnDraw = False ; don't draw indivdual plots + xyres@tmXTBorderOn = False ; don't draw top axis + xyres@tmXBBorderOn = False ; don't draw bottom axis + xyres@tmYRBorderOn = False ; don't draw right axis + xyres@tmYLBorderOn = False ; don't draw left axis + xyres@tmXTOn = False ; don't draw top-axis tick marks + xyres@tmXBOn = False ; don't draw bottom-axis tick marks + xyres@tmYROn = False ; don't draw right-axis tick marks + xyres@tmYLOn = False ; don't draw left-axis tick marks + + xyres@xyLineColors = (/"red"/) ; set the line color to red + xyres@xyLineThicknessF = 4.0 ; 4 times the line thickness + + xyres@trXMaxF = 15000 ; choose range of axis even though + xyres@trXMinF = -10000 ; we don't see them + xyres@trYMaxF = 1000 + xyres@trYMinF = -1000 + + plot = gsn_xy(wks,xrot,yrot,xyres) ; Draw trajectory +;********************************************** +; create arrays needed for the bounding box +;********************************************** + a1 = new(5,float) + b1 = new(5,float) + a2 = new(5,float) + b2 = new(5,float) + a3 = new(2,float) + b3 = new(2,float) + a4 = new(2,float) + b4 = new(2,float) + a5 = new(2,float) + b5 = new(2,float) + a6 = new(2,float) + b6 = new(2,float) + a0 = new(2,float) + b0 = new(2,float) +;********************************************** +; determine values of each bounding line from information +; returned from particle.f +;********************************************** + a1(0:3) = xaxis(:3) + b1(0:3) = yaxis(:3) + a1(4) = xaxis(0) + b1(4) = yaxis(0) + + a2(0:3) = xaxis(4:) + b2(0:3) = yaxis(4:) + a2(4) = xaxis(4) + b2(4) = yaxis(4) + + a3 = xaxis(0:4:4) + b3 = yaxis(0:4:4) + a4 = xaxis(1:5:4) + b4 = yaxis(1:5:4) + + a5 = xaxis(2:6:4) + b5 = yaxis(2:6:4) + a6 = xaxis(3:7:4) + b6 = yaxis(3:7:4) + + a0(0) = xaxis(3) + b0(0) = yaxis(3) + a0(1) = xrot(0,0) + b0(1) = yrot(0,0) +;*************************************************************** +; create bounding box by drawing multiple xy plots on top of +; each other. each with their individual axis turned off. +;*************************************************************** + xyres@xyLineColors = (/"black"/) ; line color + xyres@xyLineThicknessF = 1.0 ; regular line thickness + + bottom = gsn_xy(wks,a1,b1,xyres) ; Draw the bottom bounding box. + top = gsn_xy(wks,a2,b2,xyres) ; Draw the top bounding box. + side1 = gsn_xy(wks,a3,b3,xyres) ; Draw a side line. + side2 = gsn_xy(wks,a4,b4,xyres) ; Draw a side line. + side3 = gsn_xy(wks,a5,b5,xyres) ; Draw a side line. + side4 = gsn_xy(wks,a6,b6,xyres) ; Draw a side line. +;*************************************************************** +; now draw a large brown line to represent the chimney +;*************************************************************** + xyres@xyLineColors = (/"brown"/) ; chimney color + xyres@xyLineThicknessF = 9.0 ; thick line + xyres@tiMainString = "Pollutant Trajectory in a 3D Volume" + chimney = gsn_xy(wks,a0,b0,xyres) ; Draw the chimney. + + draw(wks) + frame(wks) + +end diff --git a/samples/NCL/tsdiagram_1.ncl b/samples/NCL/tsdiagram_1.ncl new file mode 100644 index 00000000..be9b2f6f --- /dev/null +++ b/samples/NCL/tsdiagram_1.ncl @@ -0,0 +1,167 @@ +; Read potential temp (TEMP), salinity (SALT) +; Compute potential density (PD) for specified range PD(t,s) +; (use ncl function based on Yeager's algorithm for rho computation) +; Assumes annual and zonally avgeraged input data set (i.e, one time slice) +; Used K.Lindsay's "za" for zonal avg -- already binned into basins +; Plots temp vs salt (scatter plot), pd overlay + +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 +; ================================> ; PARAMETERS + case = "PHC2_gx1v3" + ocnfile = "za_PHC2_T_S_gx1v3.nc" + + depth_min = 14895.82 ; in cm, depth of first layer to be included + depth_max = 537499.9 +; +; plot limits +; + smincn = 32.5 + smaxcn = 37.0 + tmincn = -2. + tmaxcn = 22. +; +; Choose basin index +; +; 0 = global 1 = southern ocean 2 = pacific 3 = indian 6 = atlantic +; 8 = labrador 9 = GIN 10 = arctic +; + bi = 2 + +;=====> basin check + + if(bi.lt.0.or.bi.gt.10) then + print("basin index "+ bi + " not supported") + exit + end if + + if(bi.eq.0) then + basin = "Global" + blab = "global" + end if + if(bi.eq.1) then + basin = "Southern Ocean" + blab = "so" + end if + if(bi.eq.2) then + basin = "Pacific Ocean" + blab = "pacific" + end if + if(bi.eq.3) then + basin = "Indian Ocean" + blab = "indian" + end if + if(bi.eq.6) then + basin = "Atlantic Ocean" + blab = "atlanticn" + end if + if(bi.eq.8) then + basin = "Labrador Sea" + blab = "lab" + end if + if(bi.eq.9) then + basin = "GIN Sea" + blab = "gin" + end if + if(bi.eq.10) then + basin = "Arctic Ocean" + blab = "arctic" + end if + +;=====> initial resource settings + + wks = gsn_open_wks("ps","tsdiagram") ; Open a Postscript file + +;===== data + focn = addfile(ocnfile, "r") + salt = focn->SALT(0,:,{depth_min:depth_max},:) ;(basins, z_t, lat_t) + temp = focn->TEMP(0,:,{depth_min:depth_max},:) + +;====section out choice basin + temp_ba = temp(bi,:,:) + salt_ba = salt(bi,:,:) + +;===== put into scatter array format + tdata_ba = ndtooned(temp_ba) + sdata_ba = ndtooned(salt_ba) + + ydata = tdata_ba + xdata = sdata_ba + +;============== compute potenial density (PD), using rho_mwjf +; +; for potential density, depth = 0. (i.e. density as if brought to surface) +; +;=========================================================================== +; WARNING: T-S diagrams use POTENTIAL DENSITY... if set depth to something +; other then 0, then you will be plotting density contours computed for the +; specified depth layer. +;=========================================================================== + + depth = 0. ;in meters + tspan = fspan(tmincn,tmaxcn,51) + sspan = fspan(smincn,smaxcn,51) + + ; the more points the better... using Yeager's numbers + + t_range = conform_dims((/51,51/),tspan,0) + s_range = conform_dims((/51,51/),sspan,1) + + pd = rho_mwjf(t_range,s_range,depth) + + pd!0 = "temp" + pd!1 = "salt" + pd&temp = tspan + pd&salt = sspan + pd = 1000.*(pd-1.) ; Put into kg/m3 pot den units + +; printVarSummary(pd) +; printVarInfo(pd,"rho_mwjf") + +;=================Graphics + +;--- scatter plot + res = True + res@gsnMaximize = True + res@gsnDraw = False + res@gsnFrame = False + + res@xyMarkLineModes = "Markers" + res@xyMarkers = 16 + res@xyMarkerColors = "black" + res@pmLegendDisplayMode = "Never" + res@txFontHeightF = 0.01 + res@tiMainString = case + " ANN AVG: T-S Diagram" + res@tiXAxisString = salt@units + res@tiXAxisFontHeightF = 0.02 + res@tiYAxisString = temp@units + res@tiYAxisFontHeightF = 0.02 + res@trXMinF = smincn + res@trXMaxF = smaxcn + res@trYMinF = tmincn + res@trYMaxF = tmaxcn + res@gsnRightString = depth_min/100. + "-"+depth_max/100. +"m" + res@gsnLeftString = basin + + plot = gsn_csm_xy(wks,xdata,ydata,res) + +;----- pd overlay + resov = True + resov@gsnDraw = False + resov@gsnFrame = False + resov@cnLevelSelectionMode = "AutomaticLevels" + resov@cnInfoLabelOn = "False" + resov@cnLineLabelPlacementMode = "Constant" + resov@cnLineLabelFontHeightF = ".02" + + plotpd = gsn_csm_contour(wks,pd,resov) + overlay(plot,plotpd) + + draw(plot) + frame(wks) + +end diff --git a/samples/NCL/unique_9.ncl b/samples/NCL/unique_9.ncl new file mode 100644 index 00000000..edcf8285 --- /dev/null +++ b/samples/NCL/unique_9.ncl @@ -0,0 +1,141 @@ +;************************************ +; unique_9.ncl +; +; Concepts illustrated: +; - Drawing raster contours over a map +; - Creating a topography plot using raster contours +; - Reading data from binary files +; - Manually creating lat/lon coordinate arrays +; - Customizing a labelbar for a contour plot +;************************************ +; This example generates a topo map over +; the area of Trinidad, Colorado. +;************************************ +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl" + +begin + + wks = gsn_open_wks("ps","unique") + +;----------------- read the west binary data ------------------------- + binfile = "trinidad-w.bin" + + quad_name = fbinrecread(binfile,0,60,"character") + + map_cornersW = fbinrecread(binfile,1,4,"double") + + lonW = fbinrecread(binfile,2,(/1201/),"double") + + latW = fbinrecread(binfile,3,(/1201/),"double") + + minmax_elevW = fbinrecread(binfile,4,2,"double") + + tmpW = fbinrecread(binfile,5,(/1201,1201/),"integer") + +;----------------- read the east binary data ------------------------- + binfile = "trinidad-e.bin" + + quad_name = fbinrecread(binfile,0,60,"character") + + map_cornersE = fbinrecread(binfile,1,4,"double") + + lonE = fbinrecread(binfile,2,(/1201/),"double") + + latE = fbinrecread(binfile,3,(/1201/),"double") + + minmax_elevE = fbinrecread(binfile,4,2,"double") + + tmpE = fbinrecread(binfile,5,(/1201,1201/),"integer") + +;---------------------------------------------------------------------- + min_elev = min((/minmax_elevW(0),minmax_elevE(0)/))*3.28 + max_elev = max((/minmax_elevW(1),minmax_elevE(1)/))*3.28 + + lat = new(1201,"double") + lat = latW + lat!0 = "lat" + lat&lat = latW ; same as latE + lat@long_name = "latitude" + lat@units = "degrees_north" + + lon = new(2401,"double") + lon(0:1200) = lonW + lon(1201:2400) = lonE(1:1200) + lon!0 = "lon" + lon&lon = lon + lon@long_name = "longitude" + lon@units = "degrees_east" + + data = new((/1201,2401/),"float") ; (lat,lon) + data!0 = "lat" + data&lat = lat + data!1 = "lon" + data&lon = lon + data(:,0:1200) = (/tmpW*3.28/) ; convert to feet + data(:,1201:2400) = (/tmpE(:,1:1200)*3.28/) ; convert to feet +;------------------------------------------------------------- + +; +; Define colormap. +; + cmap = (/(/1.00, 1.00, 1.00/),(/0.00, 0.00, 0.00/), \ + (/0.51, 0.13, 0.94/),(/0.00, 0.00, 0.59/), \ + (/0.00, 0.00, 0.80/),(/0.25, 0.41, 0.88/), \ + (/0.12, 0.56, 1.00/),(/0.00, 0.75, 1.00/), \ + (/0.63, 0.82, 1.00/),(/0.82, 0.96, 1.00/), \ + (/1.00, 1.00, 0.78/),(/1.00, 0.88, 0.20/), \ + (/1.00, 0.67, 0.00/),(/1.00, 0.43, 0.00/), \ + (/1.00, 0.00, 0.00/),(/0.78, 0.00, 0.00/), \ + (/0.63, 0.14, 0.14/),(/1.00, 0.41, 0.70/)/) + + gsn_define_colormap(wks,cmap) + + res = True + res@gsnMaximize = True + res@gsnAddCyclic = False + +; map plot resources + res@mpFillOn = False + res@mpLimitMode = "Corners" + res@mpDataBaseVersion = "Ncarg4_1" + res@mpOutlineBoundarySets = "AllBoundaries" + res@mpLeftCornerLonF = map_cornersW(0) + res@mpLeftCornerLatF = map_cornersW(1) + res@mpRightCornerLonF = map_cornersE(2) + res@mpRightCornerLatF = map_cornersE(3) + +; contour resources + res@cnFillOn = True + res@cnLinesOn = False + res@cnFillMode = "RasterFill" + res@cnLevelSelectionMode = "ExplicitLevels" + res@cnLevels = (/ 5000., 6000., 7000., 8000., 8500., 9000., \ + 9500.,10000.,10500.,11000.,11500.,12000., \ + 12500.,13000.,13500./) + +; tickmark resources + res@pmTickMarkDisplayMode = "Always" + res@tmXBLabelFontHeightF = 0.010 + +; labelbar resources + res@pmLabelBarWidthF = 0.60 + res@txFontHeightF = 0.012 + res@lbTitleString = "elevation above mean sea level (feet)" + res@lbTitleFontHeightF = 0.012 + res@lbLabelFontHeightF = 0.008 + res@lbTitleOffsetF = -0.27 + res@lbBoxMinorExtentF = 0.15 + res@pmLabelBarOrthogonalPosF = -.05 + +; title resources + res@tiMainString = "USGS DEM TRINIDAD (1 x 2 degrees)" + res@tiMainOffsetYF = -0.02 ; Move title down towards graphic. + res@tiMainFontHeightF = 0.015 + res@gsnLeftString = "Min Elevation: "+min_elev + res@gsnRightString = "Max Elevation: "+max_elev + res@gsnCenterString = "Scale 1:250,000" + + plot = gsn_csm_contour_map(wks,data,res) + +end diff --git a/samples/NCL/viewport_4.ncl b/samples/NCL/viewport_4.ncl new file mode 100644 index 00000000..3635a2fa --- /dev/null +++ b/samples/NCL/viewport_4.ncl @@ -0,0 +1,131 @@ +; *********************************************** +; viewport_4.ncl +; +; Concepts illustrated: +; - Drawing an XY plot with multiple curves +; - Using drawNDCGrid to draw a nicely labeled NDC grid +; - Changing the size/shape of an XY plot using viewport resources +; - Drawing two XY plots on the same page using viewport resources +; - Drawing polylines, polymarkers, and text in NDC space +; - Using "getvalues" to retrieve resource values +; - Maximizing plots after they've been created +; *********************************************** +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" + +;******************************************************************** +; Draw a box around the viewport of the given object.. +;******************************************************************** +procedure draw_vp_box(wks,plot) +local vpx, vpy, vpw, vph, xbox, ybox, lnres, mkres, txres +begin + +; Retrieve the viewport values of the drawable object. + getvalues plot + "vpXF" : vpx + "vpYF" : vpy + "vpWidthF" : vpw + "vpHeightF" : vph + end getvalues + +; Set up some marker resources. + mkres = True + mkres@gsMarkerIndex = 16 ; filled dot + mkres@gsMarkerSizeF = 0.02 ; larger than default + mkres@gsMarkerColor = "Red" + +; Draw a single marker at the vpXF/vpYF location. + gsn_polymarker_ndc(wks,vpx,vpy,mkres) + + +; Set up some text resources. + txres = True + txres@txJust = "BottomLeft" + txres@txFontHeightF = 0.018 + txres@txFontColor = "Blue" + txres@txBackgroundFillColor = "white" + + gsn_text_ndc(wks,"(vpXF="+vpx+", vpYF="+vpy+")",vpx,vpy+0.02,txres) +; Set up some line resources. + lnres = True + lnres@gsLineColor = "Red" ; line color + lnres@gsLineThicknessF = 2.0 ; 3.5 times as thick + +; Draw lines indicating the width and height + xline = (/vpx, vpx+vpw/) + yline = (/vpy-0.05,vpy-0.05/) + gsn_polyline_ndc(wks,xline,yline,lnres) + + xline = (/vpx+0.05,vpx+0.05/) + yline = (/vpy,vpy-vph/) + gsn_polyline_ndc(wks,xline,yline,lnres) + + txres@txJust = "CenterCenter" + gsn_text_ndc(wks,"vpWidthF = " + vpw,vpx+vpw/2.,vpy-0.05,txres) + + txres@txAngleF = 90. + gsn_text_ndc(wks,"vpHeightF = " + vph,vpx+0.05,vpy-vph/2.,txres) +end + +;******************************************************************** +; Main code +;******************************************************************** +begin +;************************************************ +; read in data +;************************************************ + f = addfile ("$NCARG_ROOT/lib/ncarg/data/cdf/uv300.nc","r") + u = f->U ; get u data +;************************************************ +; plotting parameters +;************************************************ + wks = gsn_open_wks ("ps","viewport") ; open workstation + + res = True ; plot mods desired + + res@gsnFrame = False ; don't advance frame yet + + res@vpWidthF = 0.8 ; set width and height + res@vpHeightF = 0.3 + +; First plot + res@tiMainString = "Plot 1" + + res@vpXF = 0.15 + res@vpYF = 0.9 ; Higher on the page + + plot1 = gsn_csm_xy (wks,u&lat,u(0,:,{82}),res) ; create plot + +; Second plot + res@tiMainString = "Plot 2" + + res@vpXF = 0.15 ; Same X location as first plot + res@vpYF = 0.4 ; Lower on the page + + plot2 = gsn_csm_xy (wks,u&lat,u(0,:,{3}),res) ; create plot + +; Advance the frame + frame(wks) + +; Now draw the two plots with illustrations. + + drawNDCGrid(wks) ; Draw helpful grid lines showing NDC square. + + draw(plot1) ; Draw the two plots + draw(plot2) + + draw_vp_box(wks,plot1) ; Draw boxes around the two viewports. + draw_vp_box(wks,plot2) + + frame(wks) ; Advance the frame. + + +; +; Uncomment the next two lines if you want to maximize these plots for +; PS or PDF output. +; +; psres = True +; maximize_output(wks,psres) ; calls draw and frame for you +end diff --git a/samples/NCL/weather_sym_6.ncl b/samples/NCL/weather_sym_6.ncl new file mode 100644 index 00000000..49ed16d1 --- /dev/null +++ b/samples/NCL/weather_sym_6.ncl @@ -0,0 +1,120 @@ +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" + +begin +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Example of plotting station model data over a map +; illustrating how the wind barb directions are adjusted +; for the map projection. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; City names. +; + cities = (/ "NCAR", "Seattle", "San Francisco", \ + "Los Angeles", "Billings", "El Paso", \ + "Houston", "Kansas City", "Minneapolis", \ + "Chicago", "Detroit", "Atlanta", \ + "Miami", "New York", "Eugene", \ + "Boise", "Salt Lake", "Phoenix", \ + "Albuquerque", "Bismarck", "Tulsa", \ + "Dallas", "Little Rock", "Lexington", \ + "Charlotte", "Norfolk", "Bangor" \ + /) + city_lats = (/ 40.0, 47.6, 37.8, \ + 34.1, 45.8, 31.8, \ + 29.8, 39.1, 45.0, \ + 41.9, 42.3, 33.8, \ + 25.8, 40.8, 44.1, \ + 43.6, 40.7, 33.5, \ + 35.1, 46.7, 36.0, \ + 32.8, 34.7, 38.1, \ + 35.2, 36.8, 44.8 \ + /) + city_lons = (/ -105.0, -122.3, -122.4, \ + -118.3, -108.5, -106.5, \ + -095.3, -094.1, -093.8, \ + -087.6, -083.1, -084.4, \ + -080.2, -074.0, -123.1, \ + -116.2, -111.9, -112.1, \ + -106.6, -100.8, -096.0, \ + -096.8, -092.3, -084.1, \ + -080.8, -076.3, -068.8 \ + /) +; +; Station model data for the 27 cities. +; + imdat = (/"11000000751126021360300004955054054600007757087712", \ + "11103100011104021080300004959055050600517043080369", \ + "11206200031102021040300004963056046601517084081470", \ + "11309300061000021020300004967057042602017125082581", \ + "11412400091002021010300004971058038602517166083592", \ + "11515500121004020000300004975050034603017207084703", \ + "11618600151006020030300004979051030603507248085814", \ + "11721700181008020050300004983052026604007289086925", \ + "11824800211009020070300004987053022604507323087036", \ + "11927900241011020110300004991054018605017364088147", \ + "11030000271013020130300004995055014605517405089258", \ + "11133100301015020170300004999056010606017446080369", \ + "11236200331017020200300004000057006606517487081470", \ + "11339300361019020230300004004058002607017528082581", \ + "11442400391021020250300004008050000607517569083692", \ + "11545500421023020270300004012051040608017603084703", \ + "11648600451025020290300004017052008608517644085814", \ + "11751700481027020310300004021053012609017685086925", \ + "11854800511029020330300004025054016609507726087036", \ + "11958900541031020360300004029055018610007767088147", \ + "11060000571033020380300004033056030610507808089258", \ + "11163100601035020410300004037057034611007849080369", \ + "11266200631037020430300004041058043611507883081470", \ + "11369300661039020470300004045050041612007924082581", \ + "11472400691041020500300004048051025612507965083692", \ + "11575500721043020530300004051052022613507996084703", \ + "11678600751048021580300004055053013614007337085814" \ + /) + +; +; Define a color map and open a workstation. +; + cmap = (/ \ + (/ 1., 1., 1. /), \ ; color index 0 - white + (/ 0., 0., 0. /) \ ; color index 1 - black + /) + wks = gsn_open_wks("ps","weather_sym") + gsn_define_colormap(wks,cmap) + +; +; Draw a world map. +; + mpres = True + mpres@gsnFrame = False + mpres@mpSatelliteDistF = 1.3 + mpres@mpOutlineBoundarySets = "USStates" + mpres@mpCenterLatF = 40. + mpres@mpCenterLonF = -97. + mpres@mpCenterRotF = 35. + map = gsn_map(wks,"Satellite",mpres) + +; +; Scale the station model plot (all aspects of the station +; model plots are scaled as per the size of the wind barb). +; + wmsetp("wbs",0.018) +; +; In the middle of Nebraska, draw a wind barb for a north wind +; with a magnitude of 15 knots. +; + wmbarbmap(wks,42.,-99.,0.,-15.) + +; +; Draw the station model data at the selected cities. The call +; to wmsetp informs wmstnm that the wind barbs will be drawn over +; a map. To illustrate the adjustment for plotting the model +; data over a map, all winds are from the north. +; + wmsetp("ezf",1) + wmstnm(wks,city_lats,city_lons,imdat) + + frame(wks) + +end diff --git a/samples/NCL/xy_29.ncl b/samples/NCL/xy_29.ncl new file mode 100644 index 00000000..ae231f75 --- /dev/null +++ b/samples/NCL/xy_29.ncl @@ -0,0 +1,151 @@ +; xy_29.ncl +; +; Concepts illustrated: +; - Reading data from an ASCII file with headers +; - Creating a separate procedure to create a specific plot +; - Attaching polymarkers to an XY plot +; +; This script was originally from Dr. Birgit Hassler (NOAA) +;**************************************************** + +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" + +;************************************************ +; Plot Procedure +;************************************************ +procedure plotTCOPolym(pltName[1]:string, pltType[1]:string, filName[1]:string \ + ,xTitle[1]:string , yTitle[1]:string \ + ,year[*]:numeric, y[*]:numeric) +local wks, res, ntim, gsres, MarkerCol, OldYear, i, xmarker, ymarker + +begin + wks = gsn_open_wks(pltType,pltName) + gsn_define_colormap(wks,"default") + + res = True + res@gsnMaximize = True ; make "ps", "eps", "pdf" large + + res@vpHeightF = 0.5 ; change aspect ratio of plot + res@vpWidthF = 0.75 + res@vpXF = 0.15 ; start plot at x ndc coord + res@tiXAxisString = xTitle + res@tiYAxisString = yTitle + res@tiMainString = filName + + ntim = dimsizes(year) + res@trXMinF = year(0)-1 + res@trXMaxF = year(ntim-1)+1 + + res@gsnDraw = False + res@gsnFrame = False + res@xyMarkLineMode = "markers" + res@xyMarker = 16 + res@xyMarkerColor = "Background" + plot = gsn_csm_xy (wks,year,y,res) ; create plot frame ork + + ; add different color polymarkers for each year + gsres = True + MarkerCol = 2 + OldYear = year(0) + + do i=0,ntim-1 + xmarker = year(i) + ymarker = y(i) + + if (i.gt.0) then + if (year(i).gt.OldYear) then + MarkerCol = MarkerCol+1 + end if + OldYear = year(i) + end if + + gsres@gsMarkerColor = MarkerCol + gsres@gsMarkerIndex = 16 + ;gsres@gsMarkerSizeF = 15.0 + ; add (attach) polymarkers to existing plot object + plot@$unique_string("dum")$ = gsn_add_polymarker(wks,plot,xmarker,ymarker,gsres) + end do + + draw(plot) + frame(wks) +end + +;*********************************************************** +; MAIN +;*********************************************************** + pltType = "ps" ; "ps", "eps", "png", "x11" + + ; read multiple ascii file names + ;;fili = "Southpole_TCOTimeSeries_11.dat" + + diri = "./" + fili = systemfunc("cd "+diri+" ; ls *TCOT*dat") + print(fili) + + nfil = dimsizes(fili) + + nhead= 4 ; number of header lines on ascii file(s) + ncol = 4 ; year, month, day, O3 + + do nf=0,nfil-1 + sfx = get_file_suffix(fili(nf), 0) ; sfx = ".dat" + filx = sfx@fBase ; filx= "Southpole_TCOTimeSeries_11" + ; read ascii files + data = readAsciiTable(diri+fili(nf), ncol, "float", nhead) + dimd = dimsizes(data) + ntim = dimd(0) ; # rows + + year = toint( data(:,0) ) ; user decision ... convert to integer + mon = toint( data(:,1) ) + day = toint( data(:,2) ) + + hour = new (ntim, "integer", "No_FillValue") + mn = new (ntim, "integer", "No_FillValue") + sec = new (ntim, "double" , "No_FillValue") + hour = 0 + mn = 0 + sec = 0d0 + ; create COARDS/udunits time variable + ;;tunits = "days since 1900-01-01 00:00:0.0" + tunits = "days since "+year(0)+"-"+mon(0)+"-"+day(0)+" 00:00:0.0" + time = cd_inv_calendar(year,mon,day,hour,mn,sec,tunits, 0) + time!0 = "time" + time&time = time + ;printVarSummary(time) + + ; create a Gregorin 'date' variable + date = year*10000 + mon*100 + day + date!0 = "time" + date@units = "yyyymmdd" + date&time = time + ;printVarSummary(date) + + O3 = data(:,3) + O3@long_name = "total column ozone" + O3@units = "DU" + + O3!0 = "time" + O3&time = time + ;printVarSummary(O3) + ;print(" ") + ;print(date+" "+time+" "+O3) + + ; plot + yTitle = O3@long_name + year@long_name = "YEAR" + + plotTCOPolym (filx, pltType, fili(nf), year@long_name, yTitle, year, O3) + + delete(time) ; delete ... size (# rows) may change in the next file + delete(date) + delete(year) + delete(mon ) + delete(day ) + delete(mn ) + delete(sec ) + delete(O3 ) + delete(data) + end do + diff --git a/samples/Text/01_top.ncl b/samples/Text/01_top.ncl new file mode 100644 index 00000000..92f12f77 --- /dev/null +++ b/samples/Text/01_top.ncl @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/samples/Text/LIDARLite.ncl b/samples/Text/LIDARLite.ncl new file mode 100644 index 00000000..f93f95f7 --- /dev/null +++ b/samples/Text/LIDARLite.ncl @@ -0,0 +1,34 @@ +G04 DipTrace 2.4.0.2* +%INLIDARLite.ncl*% +%MOIN*% +%ADD11C,0.0394*% +%FSLAX44Y44*% +G04* +G70* +G90* +G75* +G01* +%LNBoardOutline*% +%LPD*% +X0Y23622D2* +D11* +X27953D1* +Y0D1* +X0D1* +Y23622D1* +X591Y23110D2* +X13819D1* +X591Y591D2* +Y11614D1* +Y12087D2* +Y23110D1* +X14291D2* +X27520D1* +X591Y591D2* +X13819D1* +X14291D2* +X27520D1* +Y11614D1* +Y12087D2* +Y23110D1* +M02* diff --git a/samples/Text/Site.local.ncl b/samples/Text/Site.local.ncl new file mode 100644 index 00000000..695dfa24 --- /dev/null +++ b/samples/Text/Site.local.ncl @@ -0,0 +1,22 @@ +#define YmakeRoot $(DESTDIR)@prefix@ +#define ManRoot $(DESTDIR)@mandir@ +#define LibRoot $(DESTDIR)@libdir@/ncarg +#define SharePath $(DESTDIR)@datadir@ + +#define BuildWithF90 TRUE +#define IncSearch -I/usr/include/netcdf -I/usr/include/udunits2 -I/usr/include/freetype2 -I/usr/include/gdal +#define LibSearch -L@libdir@/hdf + +#define BuildNetCDF4 1 +#define NetCDF4lib -lnetcdf +#define BuildCAIRO 1 +#define CAIROlib -lcairo -lfreetype +#define BuildGDAL 1 +#define GDALlib -lgdal +#define BuildHDFEOS 0 +#define BuildHDFEOS5 0 +#define BuildTRIANGLE 0 +#define HDFlib -lmfhdf -ldf -ljpeg -lz +#define HDF5lib -lhdf5_hl -lhdf5 +#define BuildUdunits 1 +#define UdUnitslib -ludunits2 diff --git a/samples/Text/main.ncl b/samples/Text/main.ncl new file mode 100644 index 00000000..61bee15d --- /dev/null +++ b/samples/Text/main.ncl @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/Text/min-help.ncl b/samples/Text/min-help.ncl new file mode 100644 index 00000000..9fd20117 --- /dev/null +++ b/samples/Text/min-help.ncl @@ -0,0 +1,45 @@ +THE_URL:file://localhost/Users/hubery/Public/ucar/Document/Functions/Built-in/min.shtml +THE_TITLE:min + NCL Home > Documentation > Functions > General applied math + +min + + Computes the minimum value of a multi-dimensional array. + +Prototype + + function min ( + value : numeric + ) + + return_val [1] : numeric + +Arguments + + value + + An array of one or more numeric values of any dimension. + +Return value + + Returns a scalar of the same type as value. + +Description + + This function returns the minimum value for an array of any dimensionality. Missing values are ignored; a missing value + is returned only if all values are missing. + +See Also + + max, minind, maxind, dim_min, dim_max, dim_min_n, dim_max_n + +Examples + + Example 1 + + f = (/2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8/) + min_f = min(f) + print(min_f) ; Should be 2.1 + + + ©2015 UCAR | Privacy Policy | Terms of Use | Contact the Webmaster | Sponsored by NSF diff --git a/samples/Text/receiver.ncl b/samples/Text/receiver.ncl new file mode 100644 index 00000000..83996d66 --- /dev/null +++ b/samples/Text/receiver.ncl @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Text/rmMonAnnCycLLT-help.ncl b/samples/Text/rmMonAnnCycLLT-help.ncl new file mode 100644 index 00000000..9467861a --- /dev/null +++ b/samples/Text/rmMonAnnCycLLT-help.ncl @@ -0,0 +1,40 @@ +THE_URL:file://localhost/Users/hubery/Public/ucar/Document/Functions/Contributed/rmMonAnnCycLLT.shtml +THE_TITLE:rmMonAnnCycLLT + NCL Home > Documentation > Functions > Climatology + +rmMonAnnCycLLT + + Removes the annual cycle from "monthly" data. + +Prototype + +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" + + function rmMonAnnCycLLT ( + x [*][*][*] : numeric + ) + + return_val [dimsizes(x)] : typeof(x) + +Arguments + + x + + A three-dimensional array of monthly values, dimensioned lat x lon x time. The time dimension must be a multiple of 12. + +Return value + + The results are returned in an array of the same type and dimensionality as x. If the input data contains metadata, these + will be retained. + +Description + + This function removes the annual cycle from month (number of months = 12) data and subtracts the long term means from + each month. + +See Also + + rmMonAnnCycLLT, rmMonAnnCycTLL, rmMonAnnCycLLLT + + + ©2015 UCAR | Privacy Policy | Terms of Use | Contact the Webmaster | Sponsored by NSF diff --git a/samples/Text/zonalAve-help.ncl b/samples/Text/zonalAve-help.ncl new file mode 100644 index 00000000..20abf5de --- /dev/null +++ b/samples/Text/zonalAve-help.ncl @@ -0,0 +1,35 @@ +THE_URL:file://localhost/Users/hubery/Public/ucar/Document/Functions/Contributed/zonalAve.shtml +THE_TITLE:zonalAve + NCL Home > Documentation > Functions > General applied math + +zonalAve + + Computes a zonal average of the input array. + +Prototype + +load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" + + function zonalAve ( + x : numeric + ) + + return_val : typeof(x) + +Arguments + + x + + An array of any size and type. + +Return value + + The results are returned in an array of the same type and one dimension smaller than x. Metadata are preserved. + +Description + + This function computes a zonal average of the input array x. If the input array has a "long_name" or "short_name" + attribute, it will be updated. + + + ©2015 UCAR | Privacy Policy | Terms of Use | Contact the Webmaster | Sponsored by NSF diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index a13ae12a..010bf587 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -122,7 +122,7 @@ class TestHeuristcs < Minitest::Test assert_heuristics({ "Frege" => all_fixtures("Frege"), "Forth" => all_fixtures("Forth"), - "Text" => all_fixtures("Text") + "Text" => all_fixtures("Text", "*.fr") }) end diff --git a/vendor/grammars/language-ncl b/vendor/grammars/language-ncl new file mode 160000 index 00000000..ae46014e --- /dev/null +++ b/vendor/grammars/language-ncl @@ -0,0 +1 @@ +Subproject commit ae46014e687be08bc4a47012fe3f21a31c081b61