[ncl-talk] Reading PRISM 4km data onto regular lat/lon grid

Scott Capps scott at allvertum.com
Thu Oct 1 10:53:14 MDT 2015


Greetings,

I am trying to read in PRISM 4km data in bil format and output on the 
regular lat/lon grid, saving as a NetCDF file.  I eventually want to 
mask the data using a shapefile and want to keep it on a regular lat/lon 
grid.

The script works fine but I am concerned about the issues below where 
the dx and dy do not equate to 0.04166667 degrees (See lines enclosed 
by: *************).  I can provide the PRISM data when needed.  Any help 
is appreciated.

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/esmf/ESMF_regridding.ncl"
; USAGE
; ncl 'dir_in="./"' 'fil_in="PRISM_ppt_stable_4kmD2_19820210_bil.bil"' 
'dir_out="./"' 'file_out="prism_socalif_ppt_4km_02101982"' 
prism_to_netcdf.ncl
;
begin
;----------------------------------------------------------------------------
; FROM THE HEADER FILE:
;
; BYTEORDER      I
; LAYOUT         BIL
; NROWS          621
; NCOLS          1405
; NBANDS         1
; NBITS          32
; BANDROWBYTES   5620
; TOTALROWBYTES  56201
; PIXELTYPE      FLOAT
; ULXMAP         -125
; ULYMAP         49.9166666666687
; XDIM           0.04166666666667
; YDIM           0.04166666666667
; NODATA         -9999
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
   NBANDS = 1
   NROWS  = 621
   NCOLS  = 1405
   ORDER  = "I"
   TYPE   = "float"
   NODATA = -9999.0

   ULXMAP = -125.0d0
   ULYMAP = 49.9166666666687d0

   XDIM   = 0.04166666666667d0
   YDIM   = 0.04166666666667d0

   diri  = dir_in
   fili  = fil_in

   if (ORDER.ne."I") then
       setfileoption("bin","ReadByteOrder","LittleEndian") ; perform 
byte swapping
   end if

   pltType = "ps"
   pltDir  = "./"
   ;
   ; I am on a littleendian machine
   ;if (isbigendian() ) then
   ;  print("bigendian")
   ;else
   ;  print("littleendian")
   ;end if
   ;
   do NB=0,NBANDS-1
      dat   = fbindirread(diri+fili,NB, (/NROWS,NCOLS/), TYPE)
      dat at _FillValue = NODATA
      dat at long_name = "Daily Total Precipitation"
      dat at units     = "mm"
      dat = dat(::-1,:)
   end do
   ; 4km resolution (0.04166667x0.04166667 decimal degrees)
   lat=fspan(24.0625d0,49.9375d0,NROWS)  ; Bounded by 24.0625 to 49.9375 
Degrees North
   lon=fspan(-125.0208333d0,-66.4791667d0,NCOLS) ; Bounded by 
-125.0208333 to -66.4791667 Degrees East
   ; ***********************************
   ; Should be intervals of 0.04166667 (or, close to that at least)
   ;   instead it has unequal intervals on the order of: 0.04173387096774661
   ; ***********************************
   print(lat(1:NROWS-1)-lat(0:NROWS-2))
   ; ***********************************
   ; Should be intervals of 0.04166667
   ;   instead it has unequal intervals on the order of: 0.0416963437
   ; ***********************************
   print(lon(1:NCOLS-1)-lon(0:NCOLS-2))
   ;
   lat!0="lat"
   lat at units="degrees_north"
   lat&lat=lat
   lon!0="lon"
   lon at units="degrees_east"
   lon&lon=lon
   dat!0="lat"
   dat!1="lon"
   dat&lat=lat
   dat&lon=lon

  ; Subset for Southern California
   lat1 = 100
   lat2 = 500
   lon1 = 0
   lon2 = 250
   ;
   lat_out = lat(lat1:lat2)
   lon_out = lon(lon1:lon2)
   dat_out = dat(lat1:lat2,lon1:lon2)
   dat_out at long_name    = "Daily Total Precipitation"
   dat_out at units        = "mm"
   dat_out at _FillValue   = NODATA
   dat_out at missingvalue = NODATA
   nlat    = dimsizes(lat_out)
   nlon    = dimsizes(lon_out)
   ;
   ; Write out to netcdf file
   diro      = dir_out
   filo      = file_out+".nc"
   system("/bin/rm -f " + diro + filo)
   fout  = addfile (diro + filo, "c")
   setfileoption(fout,"DefineMode",True)
   fAtt               = True
   fAtt at title         = ""
   fAtt at source_file   =  ""
   fAtt at Conventions   = "None"
   fAtt at creation_date = systemfunc("date")
   fileattdef( fout, fAtt )
   dimNames = (/"time","lat","lon" /)
   dimSizes = (/ 1,nlat,nlon /)
   dimUnlim = (/ True,False,False /)
   filedimdef(fout,dimNames,dimSizes,dimUnlim)
   filevardef(fout,"lat" ,typeof(lat_out),(/"lat"/))
   filevardef(fout,"lon",typeof(lon_out),(/"lon"/))
   filevardef(fout,"ppt",typeof(dat_out),(/"lat","lon"/))
   ;
   fout->lat                 = lat_out
   fout->lon                 = lon_out
   fout->ppt                 = dat_out
   delete(fout)
   delete(lat)
   delete(lon)
   delete(dat)
   delete(dat_out)
end


More information about the ncl-talk mailing list