error converting GRIB1 to netCDF

From: Yolande Serra <serra_at_nyahnyahspammersnyahnyah>
Date: Thu, 15 May 2008 22:20:40 -0700

Hi,

I'm a new user (as of today) to NCL and I am trying to convert some
GRIB1 files (1GB in size) to netCDF files to use with my own analysis
code. I have a PowerMac G5 dual core 64-bit machine running OS X
10.4.11 and the latest version of NCL/NCAR graphics (installed
today). I've used the netcdf library for several years now and have
no trouble creating large (>2GB) netcdf files using FORTRAN code and
the netcdf library routines. However, when I try to convert my GRIB
files I'm getting this error:

warning:FileVarAttDef: Variable (time) has no attributes to assign
ncl(22003) malloc: *** vm_allocate(size=2279014400) failed (error
code=3)
ncl(22003) malloc: *** error: can't allocate region
ncl(22003) malloc: *** set a breakpoint in szone_error to debug
fatal:NclMalloc Failed:[errno=12]
Bus error
[cassava:ECMWF/4x/NCAR] serra%

The script I am running is a makeover of one of the scripts I found
on the NCL site for converting grib to netcdf including changing
names of variables and dimensions which is ultimately what I'd like
to do. Attached at the end of this message is my version of this script.

I get basically the same error if I try to run ncl_convert2nc even
with the -L option. However, if I use another script I found on your
website it works but the resulting netCDF file is 2GB (2279031580
bytes), twice the size of the GRIB file. Here is that script:

begin
;***********************************************
; get variable names from grib file
;***********************************************
    grib_in = addfile("./e4oper.an.pl.t106.q.1980.grb","r")
    names = getfilevarnames(grib_in); extract all variable names
;***********************************************
; create output netcdf file
;***********************************************
    system("rm e4oper.an.pl.t106.q.1980.nc") ; remove any pre-
existing file
    ncdf_out = addfile("e4oper.an.pl.t106.q.1980.nc" ,"c") ;
create output netCDF file
;***********************************************
; loop through variables and output each to netcdf
;***********************************************
    do i = 1, dimsizes(names)-1
    ncdf_out->$names(i)$ = grib_in->$names(i)$
    end do
end

This script will not work if the do loop goes from 0 to dimsizes
(names)-1 as the first variable seems to not be one that can be
written to a netcdf file?? What is strange is that the script below
that does not work (gives the bus error) should write a smaller
netcdf file since I don't put out all the time variables and I change
time to an integer from a double.

Any ideas??

Best regards, Yolande Serra

----------------------------------------------------------
Yolande Serra, Research Faculty
Department of Atmospheric Science
524 PAS Bldg
1118 E 4th St, P.O. Box 210081
University of Arizona
Tucson, AZ 85721-0081
Tel: (520) 621-6619; Fax: (520) 621-6833

**** begin script to convert grib to netcdf *****

load "/usr/local/lib/ncarg/nclscripts/csm/contributed.ncl"

function rdVar4D (f:file, vName:string, time:integer)
; read GRIB 4D variable and assign new dimension names
begin
   var = f->$vName$; read variable
   var!0 = "time" ; assign 'conventional' dimension names
   var!1 = "level"
   var!2 = "lat"
   var!3 = "lon"
   var&time = time ; assign time coord variable
   return(var)
end

begin
;***********************************************
; read in data from GRIB file
;***********************************************
    gribdir = "./"
    gribfil = "e4oper.an.pl.t106.q.1980.grb"
    grib_in = addfile(gribdir+gribfil, "r")

    print( grib_in ) ; file overview

    TIME = grib_in->initial_time0_hours ; time as "hours since"
    lat = grib_in->g4_lat_2 ; latitude
    lon = grib_in->g4_lon_3 ; longitude
    level = grib_in->lv_ISBL1 ; level

    lat!0 = "lat" ; assign new dimension name
    lon!0 = "lon"
    level!0 = "level"
; TIME!0= "time"

    date = ut_calendar(TIME, 0) ; change to date syntax
    dtime = ut_inv_calendar(floattointeger(date(:,0)),floattointeger
(date(:,1)),floattointeger(date(:,2)),floattointeger(date(:,
3)),floattointeger(date(:,4)),date(:,5),"hours since 1-1-1 00:00:0.0",0)
    time = doubletointeger(dtime)
    time!0 = "time"

    shum = rdVar4D (grib_in, "Q_GDS4_ISBL" ,time)

;***********************************************
; create parameters and output file
;***********************************************
     ntim = dimsizes(time)
     klev = dimsizes(level)
     nlat = dimsizes(lat)
     mlon = dimsizes(lon)

     system("'rm' -f e4oper.an.pl.t106.q.1980.nc") ; remove pre-
exit file (if any)
     ncdf = addfile("e4oper.an.pl.t106.q.1980.nc","c") ; create
output file

;***************************************************
; define file options [Version a033]
;***********************************************
     setfileoption(ncdf, "prefill", False)
     setfileoption(ncdf, "suppressclose", True)
     setfileoption(ncdf, "definemode", True)

;***********************************************
; assign file attributes
;***********************************************
     fAtt = True
     fAtt_at_title = "GRIB-to-netCDF: Efficient Approach"

     fAtt_at_source_file = "e4oper.an.pl.t106.q.1980"
     fAtt_at_Conventions = "None"

     fAtt_at_creation_date = systemfunc("date")
     fileattdef( ncdf, fAtt )

;***********************************************
; predefine coordinate information
;***********************************************
     dimNames = (/"time", "lat", "lon", "level" /)
     dimSizes = (/ ntim , nlat, mlon, klev /)
     dimUnlim = (/ True , False, False, False /)
     filedimdef(ncdf, dimNames , dimSizes, dimUnlim )
     filevardef(ncdf, "time" , typeof(time), getvardims(time) )
     filevarattdef(ncdf, "time", time)
     filevardef(ncdf, "level" , typeof(level) , getvardims(level) )
     filevarattdef(ncdf, "level", level)
     filevardef(ncdf, "lat", typeof(lat), getvardims(lat) )
     filevarattdef(ncdf, "lat", lat)
     filevardef(ncdf, "lon", typeof(lon), getvardims(lon) )
     filevarattdef(ncdf, "lon", lon)

;***********************************************
; predefine variable sizes
;***********************************************
     filevardef(ncdf,"shum",typeof(shum), getvardims(shum) )
     filevarattdef(ncdf,"shum",shum)

;***********************************************
; terminate define mode: not necessary but for clarity
;***********************************************
     setfileoption(ncdf, "definemode", False)

;***********************************************
; write data values to predefined locations
; (/ .../) operator transfer values only
;***********************************************
     ncdf->time = (/ time /)
     ncdf->level = (/ level /)
     ncdf->lat = (/ lat /)
     ncdf->lon = (/ lon /)

     ncdf->shum = (/ shum /)
end

_______________________________________________
ncl-talk mailing list
ncl-talk_at_ucar.edu
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
Received on Thu May 15 2008 - 23:20:40 MDT

This archive was generated by hypermail 2.2.0 : Mon May 19 2008 - 08:42:48 MDT