Dear all, I am attempting to convert 10 NetCDF files into a single NetCDF file, due to the data input requirements of a model I hope to use. I am using the ncdf package, version 1.6. The data are global-scale water values, on a monthly basis for 10 years (ie. 120 months of data in total; at present the data are separated by year, with 12 months of data in each file - mrunoff_1986 through to mrunoff_1995). For each month there are 720 longitude x 360 latitude values, each with a corresponding runoff value (although some of these may be NAs).
Here is my code so far: # READ IN NetCDF FILES FROM DISK library(ncdf) year <- 1986:1995 file_list <- paste("mrunoff-",year,".nc", sep="") file_list start <- 1986 for (i in file_list) { assign(paste("netcdf_",start,"_temp", sep=""),open.ncdf(i)) start = start+1 } # Start converting 10 files into 1 latitude <- get.var.ncdf(netcdf_1986_temp, "Lat") longitude <- get.var.ncdf(netcdf_1986_temp, "Lon") month <- get.var.ncdf(netcdf_1986_temp, "Mon") year <- 1986:1995 mrunoff_1986 <- get.var.ncdf(netcdf_1986_temp, "mrunoff") mrunoff_1987 <- get.var.ncdf(netcdf_1987_temp, "mrunoff") mrunoff_1988 <- get.var.ncdf(netcdf_1988_temp, "mrunoff") mrunoff_1989 <- get.var.ncdf(netcdf_1989_temp, "mrunoff") mrunoff_1990 <- get.var.ncdf(netcdf_1990_temp, "mrunoff") mrunoff_1991 <- get.var.ncdf(netcdf_1991_temp, "mrunoff") mrunoff_1992 <- get.var.ncdf(netcdf_1992_temp, "mrunoff") mrunoff_1993 <- get.var.ncdf(netcdf_1993_temp, "mrunoff") mrunoff_1994 <- get.var.ncdf(netcdf_1994_temp, "mrunoff") mrunoff_1995 <- get.var.ncdf(netcdf_1995_temp, "mrunoff") # Define variable dimensions dimx <- dim.def.ncdf("Lon", "deg E", as.double(longitude)) dimy <- dim.def.ncdf("Lat", "deg N", as.double(latitude)) month <- dim.def.ncdf("Mon", "Months: Jan 86=1, Dec 95=120)", 1:120) year <- dim.def.ncdf("Year", "year", year) # Assign data: extract mrunoff from each of the 10 files and put into one place mrunoff_data <- dim.def.ncdf("mrunoff", "mm/month", c(mrunoff_1986, mrunoff_1987, mrunoff_1988, mrunoff_1989, mrunoff_1990, mrunoff_1991, mrunoff_1992, mrunoff_1993, mrunoff_1994, mrunoff_1995)) # Define runoff variable mrunoff_dims <- var.def.ncdf("mrunoff_out", "mm/month", list(dimx, dimy, month), -9999.0, "Global Monthly Runoff for 1986-1995", "double") # Create file mrunoff_file <- create.ncdf("mrunoff.nc", mrunoff_dims) # Put mrunoff data into the file put.var.ncdf(mrunoff_file, mrunoff_dims, mrunoff_data) # Write to disk # close.ncdf(mrunoff_file) However, when I run the code, I get the following error message: > put.var.ncdf(mrunoff_file, mrunoff_dims, mrunoff_data) Error in put.var.ncdf(mrunoff_file, mrunoff_dims, mrunoff_data) : put.var.ncdf: error: you asked to write 31104000 values, but the passed data array only has 8 entries! I can understand where the 31104000 comes from ((720*360)*12)*10, but am confused as to why only 8 values are being passed to put.var.ncdf. I therefore tried doing a couple of tests to shed some light on this: > length(dimx); length(dimy); length(mrunoff_dims); length(mrunoff_data) [1] 8 [1] 8 [1] 9 [1] 8 > str(dimx); str(dimy) List of 8 $ name : chr "Lon" $ units : chr "deg E" $ vals : num [1:720] 0.25 0.75 1.25 1.75 2.25 2.75 3.25 3.75 4.25 4.75 ... $ len : int 720 $ id : num -1 $ unlim : logi FALSE $ dimvarid : num -1 $ create_dimvar: logi TRUE - attr(*, "class")= chr "dim.ncdf" List of 8 $ name : chr "Lat" $ units : chr "deg N" $ vals : num [1:360] -89.8 -89.2 -88.8 -88.2 -87.8 ... $ len : int 360 $ id : num -1 $ unlim : logi FALSE $ dimvarid : num -1 $ create_dimvar: logi TRUE - attr(*, "class")= chr "dim.ncdf" > str(mrunoff_dims); str(mrunoff_data) List of 9 $ name : chr "mrunoff_out" $ units : chr "mm/month" $ missval : num -9999 $ longname: chr "Global Monthly Runoff for 1986-1995" $ id : num -1 $ prec : chr "double" $ dim :List of 3 ..$ :List of 8 .. ..$ name : chr "Lon" .. ..$ units : chr "deg E" .. ..$ vals : num [1:720] 0.25 0.75 1.25 1.75 2.25 2.75 3.25 3.75 4.25 4.75 ... .. ..$ len : int 720 .. ..$ id : num -1 .. ..$ unlim : logi FALSE .. ..$ dimvarid : num -1 .. ..$ create_dimvar: logi TRUE .. ..- attr(*, "class")= chr "dim.ncdf" ..$ :List of 8 .. ..$ name : chr "Lat" .. ..$ units : chr "deg N" .. ..$ vals : num [1:360] -89.8 -89.2 -88.8 -88.2 -87.8 ... .. ..$ len : int 360 .. ..$ id : num -1 .. ..$ unlim : logi FALSE .. ..$ dimvarid : num -1 .. ..$ create_dimvar: logi TRUE .. ..- attr(*, "class")= chr "dim.ncdf" ..$ :List of 8 .. ..$ name : chr "Mon" .. ..$ units : chr "Months since Jan 1986 (Jan 86 =1)" .. ..$ vals : int [1:120] 1 2 3 4 5 6 7 8 9 10 ... .. ..$ len : int 120 .. ..$ id : num -1 .. ..$ unlim : logi FALSE .. ..$ dimvarid : num -1 .. ..$ create_dimvar: logi TRUE .. ..- attr(*, "class")= chr "dim.ncdf" $ ndims : int 3 $ unlim : logi FALSE - attr(*, "class")= chr "var.ncdf" List of 8 $ name : chr "mrunoff" $ units : chr "mm/month" $ vals : num [1:31104000] NA NA NA NA NA NA NA NA NA NA ... $ len : int 31104000 $ id : num -1 $ unlim : logi FALSE $ dimvarid : num -1 $ create_dimvar: logi TRUE - attr(*, "class")= chr "dim.ncdf" As you can see from this, the length of the objects and the $len values of the objects differ - the latter being the intended values - plus all the data (e.g. 1:31104000) appear to be present in the str of the object. I'm struggling to see therefore why only 8 'bits' of data are being passed on. Any help would be much appreciated. Thanks for your suggestions, Steve _________________________________________________________________ [[elided Hotmail spam]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.