Visualizing data in Cubed-Sphere grid: Difference between revisions

From GEOS-5
Jump to navigation Jump to search
Make the in progress quite visible. A few edits to the GrADS section
Line 8: Line 8:
== Fortran ==
== Fortran ==


To map the cubed-sphere grid data to lat-lon gird data, the program c2l_CFIO_offline.x  is built with AGCM at src/GEOSgcs_GridComp/GEOSgcm_GridComp/GEOSagcm_GridComp/GEOSsuperdyn_GridComp/FVdycoreCubed_GridComp. The example configure file c2l_CFIO_offline.rc is also generated. It should be run as mpirun –np 6 ./c2l_CFIO_offline.x. This will produce a lat-lon grid data file whose name is configured in c2l_CFIO_offline.rc  
To map the cubed-sphere grid data to lat-lon gird data, the program c2l_CFIO_offline.x  is built with AGCM at src/GEOSgcs_GridComp/GEOSgcm_GridComp/GEOSagcm_GridComp/GEOSsuperdyn_GridComp/FVdycoreCubed_GridComp. The example configure file c2l_CFIO_offline.rc is also generated. It should be run as mpirun –np 6 ./c2l_CFIO_offline.x. This will produce a lat-lon grid data file whose name is configured in c2l_CFIO_offline.rc. Users then can use their familiar tools to visualize the lat-lon grid data.


== Matlab ==
== Matlab ==

Revision as of 07:11, 22 June 2016

IN PROGRESS

Cubed-Sphere grid background

The GEOS-5 now has products that are stored natively in cubed-sphere grid. The utilities listed here may help users visualize the data in cubed-sphere grid or map the data to lat-lon grid.

Fortran

To map the cubed-sphere grid data to lat-lon gird data, the program c2l_CFIO_offline.x is built with AGCM at src/GEOSgcs_GridComp/GEOSgcm_GridComp/GEOSagcm_GridComp/GEOSsuperdyn_GridComp/FVdycoreCubed_GridComp. The example configure file c2l_CFIO_offline.rc is also generated. It should be run as mpirun –np 6 ./c2l_CFIO_offline.x. This will produce a lat-lon grid data file whose name is configured in c2l_CFIO_offline.rc. Users then can use their familiar tools to visualize the lat-lon grid data.

Matlab

Users can find a “GridUtils” package in MATLAB ( R2015b and R2016a) at http://wiki.seas.harvard.edu/geos-chem/index.php/GEOS-Chem_HP_Output_Data#MATLAB_.28Cubed-sphere_and_regular_data.29 . The instructions are straight forward. Although it is intended for GCHP, it can be used for all the other outputs that use the same formats as that of GCHP.

IDL

The script read_and_interpolate_cube.pro can read data in the cubed-sphere grid in NetCDF files, interpolate the data , map the data in lat-lon format and plot. The script cube_to_latlon.pro uses read_and_interpolate_cube.pro to convert the variables in cubed-sphere grid to lat-lon grid and write the variables to NetCDF files. It should be noted that the tile files, input and output files are hard-wired in the code. The users will need to provide those files and change the code accordingly.

; read_and_interpolate_cube.pro
pro read_and_interpolate_cube, myfile, myVar, data, gLons, gLats, LonBeg, LonEnd, LatBeg, LatEnd, undef, TRIANGLES=TR, SCALE_FACTOR=SCALE_FACTOR, PIXEL=PIXEL, FLIP=FLIP, regridCubeToLatlon=regridCubeToLatlon, TIME=TIME, LEVEL=LEVEL, DATA_LEVELS=DATA_LEVELS, RANGE=RANGE, regridResolution=regridResolution, LOG=LOG, NCOLORS=NCOLORS, PROJECT=PROJECT, LISTVARS=LISTVARS, CMORPH_DATA=CMORPH_DATA, TRMM_DATA=TRMM_DATA, FILEID=INFILEID, STRETCH=STRETCH, CONSERV=CONSERV

 print, myfile
 help, myVar
;help, LonBeg, LonEnd, LatBeg, LatEnd
if (~keyword_set(TIME)) then TIME=0

exists = FILE_TEST(myfile)
if (exists) then begin
  if ( keyword_set(INFILEID)) then fileID = INFILEID
  if (~keyword_set(INFILEID)) then fileID = ncdf_open(myfile, /NOWRITE)

  if (keyword_set(LISTVARS)) then begin
    ;find the number of variables
    fileinq_struct = ncdf_inquire(fileID)
    nvars = fileinq_struct.nvars
    ; print output so far
    print, myfile
    print, nvars, ' variables in file'
    print, ' '
    print, ' '
    ;loop through variables
    for varndx = 0,nvars-1 do begin
     ; get the name, datatype, dims, number of attributes
       varstruct = ncdf_varinq(fileID,varndx)
     ; print the variable index, name, datatype, dims
       print, '--------------------------------------------------------'
       print,varndx,'    ',varstruct.name, '     ',varstruct.datatype
       print,'dims = ',varstruct.dim
    endfor ; variable loop
    stop
  endif

  finq = NCDF_INQUIRE( fileID )         ; finq /str = ndims, nvars, ngatts, recdim
  dim_unlimited = finq.recdim           ; = -1 if undefined, otherwise index into dim array
  if ( finq.ndims ge 2 ) then begin
   dimstr = ' '
   dimsize = 0L
   NCDF_DIMINQ, fileID, 0, dimstr, dimsize
  ;help, dimstr
   NX=dimsize
   NCDF_DIMINQ, fileID, 1, dimstr, dimsize
  ;help, dimstr
   NY=dimsize
  endif
  NZ=0L
  NT=1L
  if ( finq.ndims ge 3 ) then begin
   NCDF_DIMINQ, fileID, 2, dimstr, dimsize
  ;help, dimstr
   if (dimstr eq 'time') then begin
     NT=dimsize
   endif else begin
     NZ=dimsize
   endelse
  endif else begin
    if ( finq.ndims ge 4 ) then begin
     NCDF_DIMINQ, fileID, 3, dimstr, dimsize
    ;help, dimstr
     NT=dimsize
    endif
  endelse
 ;help, NX, NY, NZ, NT

  if (keyword_set(LEVEL)) then begin
   if (NZ ge 1) then begin
    varID=ncdf_varid(fileID,'lev')
    ncdf_varget,fileID,varID,levs
   endif
  endif

  if (myVar eq 'WSPD50M') then begin

     varID=ncdf_varid(fileID,'U50M')
     ncdf_varget,fileID,varID,u
     varID=ncdf_varid(fileID,'V50M')
     ncdf_varget,fileID,varID,v
     cdataM = SQRT(u*U + v*v)

  endif else begin

  myVars=STRSPLIT(myVar,'*', /extract)
  s=SIZE(myVars)
  if (s(1) eq 1) then begin
     varID=ncdf_varid(fileID,myVar)
     if (keyword_set(LEVEL)) then begin
      print, 'Reading LEVEL: ', LEVEL
      ifind = WHERE(levs eq LEVEL)
      if (ifind(0) ne -1) then begin
        ncdf_varget,fileID,varID,cdataM,COUNT=[NX,NY,1,1], OFFSET=[0,0,ifind(0),TIME]
      endif else begin
        print, 'ERROR: bad level: ', LEVEL
        print, levs
        stop
      endelse
     endif else begin
     ;help, TIME
      ncdf_varget,fileID,varID,cdataM,COUNT=[NX,NY,1], OFFSET=[0,0,TIME]
     endelse
  endif else begin
     varID=ncdf_varid(fileID,myVars(0))
     if (keyword_set(LEVEL)) then begin
      print, 'Reading LEVEL: ', LEVEL
      ifind = WHERE(levs eq LEVEL)
      if (ifind(0) ne -1) then begin
        ncdf_varget,fileID,varID,cdataA,COUNT=[NX,NY,1,1], OFFSET=[0,0,ifind(0),0]
      endif else begin
        print, 'ERROR: bad level: ', LEVEL
        print, levs
        stop
      endelse
     endif else begin
      ncdf_varget,fileID,varID,cdataA
     endelse
     isUNDEF = WHERE(cdataA eq undef)
     if (N_ELEMENTS(isUNDEF) eq N_ELEMENTS(cdataA)) then stop
     if (isUNDEF(0) ne -1) then cdataA(isUNDEF) = 0.0 ;!VALUES.F_NAN
     varID=ncdf_varid(fileID,myVars(1))
     if (keyword_set(LEVEL)) then begin
      print, 'Reading LEVEL: ', LEVEL
      ifind = WHERE(levs eq LEVEL)
      if (ifind(0) ne -1) then begin
        ncdf_varget,fileID,varID,cdataB,COUNT=[NX,NY,1,1], OFFSET=[0,0,ifind(0),0]
      endif else begin
        print, 'ERROR: bad level: ', LEVEL
        print, levs
        stop
      endelse
     endif else begin
      ncdf_varget,fileID,varID,cdataB
     endelse
     isUNDEF = WHERE(cdataB eq undef)
     if (N_ELEMENTS(isUNDEF) eq N_ELEMENTS(cdataB)) then stop
     if (isUNDEF(0) ne -1) then cdataB(isUNDEF) = 0.0 ;!VALUES.F_NAN
     cdataM=cdataA*cdataB
     cdataA=0
     cdataB=0
  endelse

  endelse

  if (keyword_set(TRMM_DATA)) then begin
    nLons = 1440
    nLats = 720
    data = FLTARR(nLons,nLats)
    data(*,*) = !VALUES.F_NAN
    data(*,160:559) = cdataM
    cdataM=data
  endif

  if (keyword_set(CMORPH_DATA)) then begin
    nLons = 1440
    nLats = 720
    data = FLTARR(nLons,nLats)
    data(*,*) = !VALUES.F_NAN
    data(*,120:599) = REVERSE(cdataM,2)
    cdataM=data
    isUNDEF = WHERE(cdataM eq MIN(cdataM,/NAN))
    if (isUNDEF(0) ne -1) then cdataM(isUNDEF) = !VALUES.F_NAN
    flip_hemispheres, cdataM
  endif

  isUNDEF = WHERE(cdataM eq undef)
  if (N_ELEMENTS(isUNDEF) eq N_ELEMENTS(cdataM)) then stop
  if (isUNDEF(0) ne -1) then cdataM(isUNDEF) = !VALUES.F_NAN

  if (keyword_set(SCALE_FACTOR)) then begin
      print, 'SCALING by: ', SCALE_FACTOR
      cdataM = cdataM*SCALE_FACTOR
  endif

; Check if data is on cubed-sphere grid
  isCubedSphere=0
  if (NY eq 6*NX) then isCubedSphere=1
  if (ARRAY_EQUAL(cdataM,0.0)) then stop
 ;isNAN = WHERE(FINITE(cdataM))
 ;if (N_ELEMENTS(isNAN) ne N_ELEMENTS(cdataM)) then stop 
 ;isUNDEF = WHERE(cdataM eq undef)
 ;if (N_ELEMENTS(isUNDEF) eq N_ELEMENTS(cdataM)) then stop
  if (~keyword_set(INFILEID)) then ncdf_close,fileID

  if (isCubedSphere AND keyword_set(regridCubeToLatlon)) then begin
  data=FLTARR(gLons,gLats)
  get_domain, data, LonBeg, LonEnd, LatBeg, LatEnd
  m=size(data)
  cLons=m(1)
  cLats=m(2)
  endif else begin
  cLons=gLons
  cLats=gLats
  endelse

 ;help, isCubedSphere, regridCubeToLatlon
  if (isCubedSphere AND keyword_set(regridCubeToLatlon)) then begin
     print, myVar
     print, min(cdataM,/NAN), max(cdataM,/NAN)
     if (keyword_set(regridResolution)) then begin
        print, 'Reducing Cubed-Sphere Resolution to: ', regridResolution
        print, NX, NY
        t1 = FLTARR(NX,NX)
        t2 = FLTARR(NX,NX)
        t3 = FLTARR(NX,NX)
        t4 = FLTARR(NX,NX)
        t5 = FLTARR(NX,NX)
        t6 = FLTARR(NX,NX)
        for n=0,5 do begin
          i1=0
          i2=NX-1
          j1=NX*n
          j2=j1+NX-1
          if (n eq 0) then t1(*,*) = cdataM(i1:i2,j1:j2)
          if (n eq 1) then t2(*,*) = cdataM(i1:i2,j1:j2)
          if (n eq 2) then t3(*,*) = cdataM(i1:i2,j1:j2)
          if (n eq 3) then t4(*,*) = cdataM(i1:i2,j1:j2)
          if (n eq 4) then t5(*,*) = cdataM(i1:i2,j1:j2)
          if (n eq 5) then t6(*,*) = cdataM(i1:i2,j1:j2)
        endfor
        NX2 = regridResolution
        XLocs = NX*FINDGEN(NX2)/FLOAT(NX2-1)
        t1 = INTERPOLATE(t1, XLocs, XLocs, /GRID);, CUBIC=-0.5)
        t2 = INTERPOLATE(t2, XLocs, XLocs, /GRID);, CUBIC=-0.5)
        t3 = INTERPOLATE(t3, XLocs, XLocs, /GRID);, CUBIC=-0.5)
        t4 = INTERPOLATE(t4, XLocs, XLocs, /GRID);, CUBIC=-0.5)
        t5 = INTERPOLATE(t5, XLocs, XLocs, /GRID);, CUBIC=-0.5)
        t6 = INTERPOLATE(t6, XLocs, XLocs, /GRID);, CUBIC=-0.5)
      ; t1 = BILINEAR(t1, XLocs, XLocs)
      ; t2 = BILINEAR(t2, XLocs, XLocs)
      ; t3 = BILINEAR(t3, XLocs, XLocs)
      ; t4 = BILINEAR(t4, XLocs, XLocs)
      ; t5 = BILINEAR(t5, XLocs, XLocs)
      ; t6 = BILINEAR(t6, XLocs, XLocs)
        cdataM=[[t1],[t2],[t3],[t4],[t5],[t6]]
       ;help, cdataM
        NX = NX2
        NY = NX2*6
        print, NX, NY
     endif
if (keyword_set(CONSERV)) then begin
     print, 'Conservative Regridding Cube to Latlon'
     NLONS=NX*4
     NLATS=NX*2 + 1
     sNX=STRING(NX,FORMAT='(i4.4)')
     sNLONS=STRING(NLONS,FORMAT='(i4.4)')
     sNLATS=STRING(NLATS,FORMAT='(i4.4)')
     TILE_FILE='/discover/nobackup/ltakacs/bcs/Ganymed-4_0/Ganymed-4_0_Ostia/Shared/DC'+sNLONS+'xPC'+sNLATS+'_CF'+sNX+'x6C.bin'
     print, TILE_FILE
     spawn, 'ls -l '+TILE_FILE
     openr, tile_lun, TILE_FILE, /GET_LUN, /F77_UNFORMATTED
     NT=0L
     NGRIDS=0
     GRIDNAME=''
     IM=0L
     JM=0L
     readu, tile_lun, NT
     readu, tile_lun, NGRIDS
     help, NT, NGRIDS
     for n=1,NGRIDS do begin
       readu, tile_lun, GRIDNAME
       readu, tile_lun, IM
       readu, tile_lun, JM
       help, IM, JM
     endfor
     IIo=LONARR(NT)
     JJo=LONARR(NT)
      Wo=FLTARR(NT)
     IIi=LONARR(NT)
     JJi=LONARR(NT)
      Wi=FLTARR(NT)
     dummy=''
     readu, tile_lun, dummy ;TYPE
     readu, tile_lun, dummy ;X
     readu, tile_lun, dummy ;Y
   ; Output Grid
     dLON   = 360.0/FLOAT(NLONS)
     dLAT   = 180.0/FLOAT(NLATS-1)
     lonsO  = (-180.0 + 0.5*dLON + FINDGEN(NLONS)*dLON)
     latsO  = ( -90.0 + FINDGEN(NLATS)*dLAT)
     readu, tile_lun,  Wo
                   IIo=Wo
     readu, tile_lun,  Wo
                   JJo=Wo
     readu, tile_lun,  Wo
   ; Input Grid
     readu, tile_lun,  Wi
                   IIi=Wi
     readu, tile_lun,  Wi
                   JJi=Wi
     readu, tile_lun,  Wi
   ; DONE
     close, tile_lun
     free_lun, tile_lun
     help, IIo, JJo, Wo
     print, MIN(IIo), MAX(IIo)
     print, MIN(JJo), MAX(JJo)
     print, MIN( Wo), MAX( Wo)
     help, IIi, JJi, Wi
     print, MIN(IIi), MAX(Iii)
     print, MIN(JJi), MAX(JJi)
     print, MIN( Wi), MAX( Wi)
     cdataO=FLTARR(NLONS,NLATS)
     cdataO(*,*) = 0.0
         FF=FLTARR(NLONS,NLATS)
         FF(*,*) = 0.0
     for N=0,NT-1 do begin
        IO=IIo(N)-1
        JO=JJo(N)-1
       ; Check if I'm in plot Range
        if ( (lonsO(IO) ge LonBeg) and (lonsO(IO) le LonEnd) AND $
             (latsO(JO) ge LatBeg) and (latsO(JO) le LatEnd) ) then begin
         II=IIi(N)-1
         JI=JJi(N)-1
         VALI = cdataM(II,JI)
         if (VALI ne undef) then begin
           W = Wo(N)
           cdataO(IO,JO) = cdataO(IO,JO) + W * VALI
               FF(IO,JO) =     FF(IO,JO) + W
         endif
        endif
     endfor
     izeros = WHERE(FF eq 0.0, COMPLEMENT=isVALID)
     cdataO(isVALID)=cdataO(isVALID)/FF(isVALID)
     cdataO(izeros) =!VALUES.F_NAN
     cdataM=cdataO
     isCubedSphere=0
     PIXEL=1
     cLons=gLons
     cLats=gLats
endif else begin
     print, 'Regridding Cube to Latlon'
;  Fix missing data
     imiss = WHERE(cdataM eq undef)
     if (imiss(0) ne -1) then cdataM(imiss) = !VALUES.F_NAN

; Setup the mapping
     if (~keyword_set(PROJECT)) then begin
      SET_PLOT, 'Z'
      DEVICE, SET_RESOLUTION=[cLons, cLats]
      loadct, 0
      erase, 0
      maplimit=STRING(LatBeg)+STRING(LonBeg)+STRING(LatEnd)+STRING(LonEnd)
      strMap = "MAP_SET, XMARGIN=0, YMARGIN=0, /NOBORDER, LIMIT=["+STRJOIN(STRSPLIT(maplimit,/EXTRACT),',')+"]"
      print, strMap
      res=EXECUTE(strMap)
     endif
     bdataM=BYTSCL(cdataM)
     if (keyword_set(DATA_LEVELS)) then begin
       dlevs=DATA_LEVELS
       nlevs=N_ELEMENTS(dlevs)
       blevs=254L*(FINDGEN(nlevs)/(nlevs-1))+1
      ;help, dlevs, blevs
     endif else begin
       if (keyword_set(RANGE)) then begin
         cMIN=RANGE[0]
         cMAX=RANGE[1]
       endif else begin
         cMIN=MIN(cdataM, /NAN)
         cMAX=MAX(cdataM, /NAN)
       endelse
      ;help, cMIN, cMAX
       dlevs=(FINDGEN(255)/254.0)*(cMAX-cMIN) + cMIN
       if (keyword_set(LOG)) then begin
          logBins=cMIN + [0.345, 0.402, 0.468, 0.545, 0.634, 0.7381, 0.859129, 1, 1.16397, 1.35483, 1.57698, 1.83556, 2.13654, 2.48687, 2.89464, 3.36928, 3.92175, 4.5648, 5.31329, 6.18452, 7.1986, 8.37896, 9.75287, 11.3521, 13.2135, 15.3801, 17.902, 20.8374, 24.2541, 28.2311, 32.8602, 38.2483, 44.5199, 51.8198, 60.3168, 70.207, 81.7189, 95.1185, 110.715, 128.869, 150.0, 174.6, 203.2]*(cMAX-cMIN)/203.2
          XLocs = (N_ELEMENTS(logBins)-1)*FINDGEN(255)/FLOAT(255-1)
          dlevs = INTERPOLATE(logBins, XLocs, /GRID)
          print, dlevs
       endif
       blevs=(FINDGEN(255)+1)
     endelse
     NCOLORS=255
     if (keyword_set(NCOLORS)) then begin
        XLocs = (N_ELEMENTS(dlevs)-1)*FINDGEN(NCOLORS)/FLOAT(NCOLORS-1)
        dlevs = INTERPOLATE(dlevs, XLocs)
        nIncr = FLOAT(N_ELEMENTS(dlevs)-1)/3.0
        dlevs = SMOOTH(dlevs,nIncr)
        blevs=(FINDGEN(NCOLORS)+1)
     endif
     print, dlevs

; map the data
if (1) then begin
     iplot=0
   ; CUBE FACES
     for tile=1,6 do begin

     inDomain=0
     print, 'Checking for data in Cube Tile '+STRTRIM(STRING(tile),1)
     gridfile='/discover/nobackup/projects/gmao/g6dev/FMS_MOSAICS/mosaic_20090716/CUBED_GRIDS/c48_grid.tile'+STRTRIM(STRING(tile),1)+'.nc'
     if (keyword_set(STRETCH)) then gridfile='/discover/nobackup/projects/gmao/g6dev/FMS_MOSAICS/mosaic_20160301/CUBED_GRIDS/c48_grid_stretch.tile'+STRTRIM(STRING(tile),1)+'.nc'
     fileID = ncdf_open(gridfile, /NOWRITE)
     varID=ncdf_varid(fileID,'x')
     ncdf_varget,fileID,varID,Xverts
     iNeg=WHERE(Xverts gt 180)
     if (iNeg(0) ne -1) then Xverts(iNeg)=Xverts(iNeg)-360
     varID=ncdf_varid(fileID,'y')
     ncdf_varget,fileID,varID,Yverts
     ncdf_close, fileID
     ifind = WHERE( (Xverts ge LonBeg) AND (Xverts le LonEnd) )
     if (ifind(0) ne -1) then inDomain=1
     ifind = WHERE( (Yverts ge LatBeg) AND (Yverts le LatEnd) )
     if (ifind(0) ne -1) then inDomain=inDomain+1
     print, MIN(Xverts), MAX(Xverts)

     if (inDomain eq 2) then begin
       gridfile='/discover/nobackup/projects/gmao/g6dev/FMS_MOSAICS/mosaic_20090716/CUBED_GRIDS/c'+STRTRIM(STRING(NX),1)+'_grid.tile'+STRTRIM(STRING(tile),1)+'.nc'
       if (keyword_set(STRETCH)) then gridfile='/discover/nobackup/projects/gmao/g6dev/FMS_MOSAICS/mosaic_20160301/CUBED_GRIDS/c'+STRTRIM(STRING(NX),1)+'_grid_stretch.tile'+STRTRIM(STRING(tile),1)+'.nc'
       fileID = ncdf_open(gridfile, /NOWRITE)
       varID=ncdf_varid(fileID,'x')
       ncdf_varget,fileID,varID,Xverts
       iNeg=WHERE(Xverts gt 180)
       if (iNeg(0) ne -1) then Xverts(iNeg)=Xverts(iNeg)-360
       varID=ncdf_varid(fileID,'y')
       ncdf_varget,fileID,varID,Yverts
     ; help, Xverts, Yverts
       print, MIN(Xverts), MAX(Xverts)
     ; print, MIN(Yverts), MAX(Yverts)
       print, 'Plotting Cube Tiles '+STRTRIM(STRING(tile),1)
         for i = 0, NX-1 do begin
            if ((i mod 288) eq 0) then print, 'Plotting Cube Tiles '+STRTRIM(STRING(tile),1)+' i='+STRTRIM(STRING(i),1)
            for j = 0, NX-1 do begin
              iS=i*2
              jS=j*2
              iC=i
              jC=j + (tile-1)*NX
             ; Check if I'm in plot Range
              if ( (MAX(Xverts(iS:iS+2,jS:jS+2)) ge LonBeg) and (MIN(Xverts(iS:iS+2,jS:jS+2)) le LonEnd) ) then begin
              if ( (MAX(Yverts(iS:iS+2,jS:jS+2)) ge LatBeg) and (MIN(Yverts(iS:iS+2,jS:jS+2)) le LatEnd) ) then begin
               xsym = [Xverts(iS,jS),Xverts(iS,jS+2),Xverts(iS+2,jS+2),Xverts(iS+2,jS)]
               ysym = [Yverts(iS,jS),Yverts(iS,jS+2),Yverts(iS+2,jS+2),Yverts(iS+2,jS)]
               ifind=WHERE(dlevs ge cdataM(iC,jC))
               myColor = ifind(0)+1
               if (FINITE(cdataM(iC,jC)) eq 0) then myColor = 0

               if ( (keyword_set(STRETCH)) AND $
                    ((MIN(Yverts(iS:iS+2,jS:jS+2)) gt 85) OR MAX(Yverts(iS:iS+2,jS:jS+2)) lt -85) ) then begin
            ;    SORTING = SORT(xsym)
            ;    ysym = ysym(SORTING)
            ;    xsym = xsym(SORTING)
                 if (iplot eq 0) then begin
                ;help, iplot
                ;print, xsym, ysym
                ;polyfill, xsym, ysym, /data, color=myColor
                 endif
                 iplot=iplot+1
               endif else begin
                 polyfill, xsym, ysym, /data, color=myColor
               endelse
            ;  plots,  xsym, ysym, /data, color=myColor, thick=3

              endif
              endif
            endfor
         endfor
       ncdf_close, fileID
     endif
     endfor ; tiles
endif else begin
     varID=ncdf_varid(fileID,'CLONS')
     ncdf_varget,fileID,varID,LONS
     varID=ncdf_varid(fileID,'CLATS')
     ncdf_varget,fileID,varID,LATS
     ncdf_close,fileID
     LONS=LONS*(180.0/!DPI)
     LATS=LATS*(180.0/!DPI)
     mySym=SYM(1)
     for i=0,NX-1 do begin
     if ((i mod 288) eq 0) then print, 'Plotting Cube Points i='+STRTRIM(STRING(i),1)
     for j=0,NY-1 do begin
        ifind=WHERE(dlevs ge cdataM(i,j)) + 1
       ;plots,LONS[i,j],LATS[i,j],COLOR=ifind(0),PSYM=3
        plots,LONS[i,j],LATS[i,j],COLOR=ifind(0),PSYM=mySym,SYMSIZE=0.5
     endfor
     endfor
endelse
    cdataM=FLOAT(TVRD())
   ;help, cdataM
    if (0) then begin
     for i=0,cLons-1 do begin
     for j=0,cLats-1 do begin
        ifind=WHERE(blevs ge cdataM(i,j))
        cdataM(i,j) = dlevs(ifind(0))
     endfor
     endfor
    endif else begin
      cdataB=cdataM
      for n=1,N_ELEMENTS(dlevs) do begin
        ifind = WHERE(cdataB ge n)
        if (ifind(0) ne -1) then begin
           cdataM(ifind) = dlevs(n-1)
        endif
      endfor
    endelse
    imiss = WHERE(cdataB eq 0)
    if (imiss(0) ne -1) then cdataM(imiss)=!VALUES.F_NAN
    help, imiss
    ifind = WHERE(cdataM lt dlevs(0))
    cdataM(ifind) = dlevs(0)
    print, min(cdataM,/NAN), max(cdataM,/NAN)
  endelse
  endif


endif else begin
  print, myVar
  print, myfile
  stop
endelse
imiss = WHERE(cdataM eq undef)
if (imiss(0) ne -1) then cdataM(imiss) = !VALUES.F_NAN
s= SIZE(cdataM)
is3D=0
if (s(0) eq 3) then is3D=1
is2D=0
if (s(0) eq 2) then is2D=1
is1D=0
if (s(0) eq 1) then is1D=1
nLevs=0
if (is3D) then nLevs=s(3)

if ( (not isCubedSphere) OR (isCubedSphere and keyword_set(regridCubeToLatlon)) ) then begin
if (~keyword_set(PROJECT)) then begin
; Interpolate
s= SIZE(cdataM)
nLons=DOUBLE(s(1))
nLats=DOUBLE(s(2))
if ( (nLons ne cLons) OR (nLats ne cLats) ) then begin
  if (is3D) then begin
     XLocs = nLons*FINDGEN(cLons)/FLOAT(cLons-1)
     YLocs = nLats*FINDGEN(cLats)/FLOAT(cLats-1)
     ZLocs = FINDGEN(nLevs)
     cdataM = INTERPOLATE(cdataM, XLocs, YLocs, ZLocs, /GRID)
  endif else begin
     if (is2D) then begin
       if (keyword_set(PIXEL)) then begin
       print, 'PIXEL Interpolation'
       XLocs = LONG(nLons*FINDGEN(cLons)/FLOAT(cLons-1))
       YLocs = LONG(nLats*FINDGEN(cLats)/FLOAT(cLats-1))
       cdataM = INTERPOLATE(cdataM, XLocs, YLocs, /GRID)
       endif else begin
       print, 'SMOOTH Interpolation'
      ;if (nLons GT cLons) then begin
      ;  oLons = nLons
      ;  oLats = nLats
      ;  iLons = oLons/2.0
      ;  iLats = (oLats-1)/2.0 + 1.0
      ;  while (iLons ge cLons) do begin  
      ;    help, cdataM
      ;    print, iLons, iLats, cLons, cLats
      ;    XLocs = (oLons*FINDGEN(iLons)/FLOAT(iLons-1))
      ;    YLocs = (oLats*FINDGEN(iLats)/FLOAT(iLats-1))
      ;    cdataM = INTERPOLATE(cdataM, XLocs, YLocs, /GRID)
      ;    oLons = iLons
      ;    oLats = iLats
      ;    iLons = oLons/2.0
      ;    iLats = (oLats-1)/2.0 + 1.0
      ;  endwhile
      ;endif else begin
         XLocs = (nLons*FINDGEN(cLons)/FLOAT(cLons-1))
         YLocs = (nLats*FINDGEN(cLats)/FLOAT(cLats-1))
         cdataM = INTERPOLATE(cdataM, XLocs, YLocs, /GRID)
      ;  help, XLocs, YLocs
      ;  help, cdataM
      ;endelse
       endelse
     endif
  endelse
endif
;help, cdataM

; Subdomain
if ( (not isCubedSphere) OR (isCubedSphere and ~keyword_set(regridCubeToLatlon)) ) then begin
if (is3D) then begin
  if (keyword_set(FLIP)) then flip_hemispheres, cdataM
  for k=0,nLevs-1 do begin
     data2D=cdataM(*,*,k)
     get_domain, data2D, LonBeg, LonEnd, LatBeg, LatEnd
     if (k eq 0) then begin
        s=size(data2D)
        sLons=s(1)
        sLats=s(2)
        data3D=FLTARR(sLons,sLats,nLevs)
     endif
    ; Flip the vertical so 0:nLevs-1 goes from surface:top
     data3D(*,*,nLevs-k-1)=data2D
  endfor
  data=cdataM
  data2D=0
  data3D=0
endif else begin
  if (is2D) then begin
     if (keyword_set(FLIP)) then flip_hemispheres, cdataM
     get_domain, cdataM, LonBeg, LonEnd, LatBeg, LatEnd
     data=cdataM
  endif else begin
   if (myVar eq "lon") then begin
      dlon = FLOAT(LonEnd-LonBeg)/FLOAT(cLons)
      data = LonBeg + dlon*FINDGEN(cLons)
   endif
   if (myVar eq "lat") then begin
      dlat = FLOAT(LatEnd-LatBeg)/FLOAT(cLats)
      data = LatBeg + dlat*FINDGEN(cLats)
   endif
  endelse
endelse
cdataM=0
endif else begin
  data=cDataM
endelse

endif else begin
  data=cDataM
endelse

endif else begin ; PROJECT
  data=cDataM
endelse

print, myVar
help, data
print, min(data, /NAN), max(data, /NAN)

end
; cube_to_latlon.pro
pro cube_to_latlon

set_plot, 'Z'

LonBeg = -180
LonEnd =  180
LatBeg =  -90
LatEnd =   90
lonCen = 0.5*(LonBeg+LonEnd)
LatCen = 0.0
undef = 1.e15
pngImgIdim=1440*4.0
pngImgJdim=pngImgIdim*0.5 + 1
boundaryImageObj = get_map_image_new(LatBeg, LatEnd, LonBeg, LonEnd, LonCen, LatCen, $
                   /NOBORDER, HORIZ_DIMS=[pngImgIdim, pngImgJdim])
elevfile='/discover/nobackup/projects/gmao/osse2/stage/c1440_NR/DATA/0.0625_deg/const/const_2d_asm_Nx/Y2005/M11/D01/c1440_NR.const_2d_asm_Nx.20051101.nc4'
read_and_interpolate, elevfile, 'lon', lons, pngImgIdim, pngImgJdim, LonBeg, LonEnd, LatBeg, LatEnd, undef
read_and_interpolate, elevfile, 'lat', lats, pngImgIdim, pngImgJdim, LonBeg, LonEnd, LatBeg, LatEnd, undef
myfile = "/discover/nobackup/projects/gmao/osse2/G5FCST/forecast-20121024_150000-C3072-4390102/G5FCST.inst1_2d_asm_Nx.20121026_1200z.nc4"
;myfile = "/discover/nobackup/projects/gmao/osse2/c5760_NR/scratch-3550451.out/c5760_NR.inst10mn_2d_met1_Nx.20120616_0840z.nc4"
;myfile = "/discover/nobackup/projects/gmao/osse2/H10UC90R72/scratch-3861154/H10UC90R72.inst30mn_2d_met1_Nx.20150215_0000z.nc4"
read_and_interpolate_cube, myfile, 'U250', u250, pngImgIdim, pngImgJdim, LonBeg, LonEnd, LatBeg, LatEnd, undef, /regridCubeToLatlon
read_and_interpolate_cube, myfile, 'V250', v250, pngImgIdim, pngImgJdim, LonBeg, LonEnd, LatBeg, LatEnd, undef, /regridCubeToLatlon

; write netcdf file
; Create a new NetCDF file with the filename inquire.nc:
id = NCDF_CREATE('c3072_NR_U250-V250.nc', /CLOBBER)
; Fill the file with default values:
NCDF_CONTROL, id, /FILL
xid = NCDF_DIMDEF(id, 'x', pngImgIdim)
yid = NCDF_DIMDEF(id, 'y', pngImgJdim)
tid = NCDF_DIMDEF(id, 't', 1)
; Define variables:
latid  = NCDF_VARDEF(id,  'lat', [yid], /FLOAT)
lonid  = NCDF_VARDEF(id,  'lon', [xid], /FLOAT)
timeid = NCDF_VARDEF(id, 'time', [tid], /FLOAT)
uid    = NCDF_VARDEF(id, 'U250', [xid,yid], /FLOAT)
vid    = NCDF_VARDEF(id, 'V250', [xid,yid], /FLOAT)
NCDF_CONTROL, id, /ENDEF
; Input data:
NCDF_VARPUT, id, timeid, 0
NCDF_VARPUT, id,  lonid, lons
NCDF_VARPUT, id,  latid, lats
NCDF_VARPUT, id,    uid, u250
NCDF_VARPUT, id,    vid, v250
NCDF_CLOSE, id ; Close the NetCDF file.

end

GrADS

To use GrADS to display cube-sphere grid data in a NetCDF file, the path should be in the PATH environment: /discover/nobackup/projects/gmao/share/dasilva/opengrads/Contents/grads

Then the users can follow the steps. First, we assume a version of GEOS-5 is available.

  1. run $ESMADIR/src/GMAO_Shared/GEOS_Util/plots/configure. This will produce a .quickplotrc in that directory
  2. source $ESMADIR/src/GMAO_Shared/GEOS_Util/plots/.quickplotrc
  3. run grads
  4. sdfopen file.nc4
  5. run command dc to plot the cube-sphere grid NetCDF file. Users can get help by just run dc without any argument.