NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Hi Dennis, the autoconversion from short-_FillValue to float-0.0 is done in the netcdf-c library when reading with shorts with nc_get_vara_float. It does not happen with ncdump, since ncdump doesn't use type-conversion https://www.unidata.ucar.edu/software/netcdf/netcdf-4/newdocs/netcdf/Type-Conversion.html#Type-Conversion I attach an example file and C-program: gcc simple_xy_rd.c -lnetcdf -o simple_xy_rd ./simple_xy_rd out.nc | less Output will be many -0.0 where I would expect -32767., which I get when I change float to short in the defines at the beginning of the file: #define TYPE float #define NC_GETVARA nc_get_vara_float Heiko On 2017-01-16 20:11, dmh@xxxxxxxx wrote: > Ok, the first thing to check is if the problem is in the netcdf-c > library or in ncview. Try dumping the variable in question using > ncdump and the -v option. > =Dennis Heimbigner > Unidata > > p.s. If the netcdf file is not too large, then you can send it to me > at dmh at ucar dot edu. > > On 1/16/2017 7:12 AM, Heiko Klein wrote: >> Hi, >> >> I just was surprised by strange results from ncview when reading a >> variable with 'short' values, where all data is undefined. ncview reads >> all data with nc_geta_vara_float. >> >> >> _FillValues are defined as -32767s. Reading undefined data with >> nc_get_vara_float results in values = -0 or 0 for all _FillValues. I had >> expected a value like -32767.f (or more generally, the _FillValue >> translated into float) >> >> Is the 0-result really the expected behaviour of nc_get_vara_float? I >> have then no idea how to handling _FillValues correctly. >> >> Best regards, >> >> Heiko >> >> >> >> >> >> _______________________________________________ >> NOTE: All exchanges posted to Unidata maintained email lists are >> recorded in the Unidata inquiry tracking system and made publicly >> available through the web. Users who post to any of the lists we >> maintain are reminded to remove any personal information that they >> do not want to be made public. >> >> >> netcdfgroup mailing list >> netcdfgroup@xxxxxxxxxxxxxxxx >> For list information or to unsubscribe, visit: >> http://www.unidata.ucar.edu/mailing_lists/ >> > > _______________________________________________ > NOTE: All exchanges posted to Unidata maintained email lists are > recorded in the Unidata inquiry tracking system and made publicly > available through the web. Users who post to any of the lists we > maintain are reminded to remove any personal information that they > do not want to be made public. > > > netcdfgroup mailing list > netcdfgroup@xxxxxxxxxxxxxxxx > For list information or to unsubscribe, visit: > http://www.unidata.ucar.edu/mailing_lists/ -- Dr. Heiko Klein Norwegian Meteorological Institute Tel. + 47 22 96 32 58 P.O. Box 43 Blindern http://www.met.no 0313 Oslo NORWAY
/* This is part of the netCDF package. Copyright 2006 University Corporation for Atmospheric Research/Unidata. See COPYRIGHT file for conditions of use. This is a simple example which reads a small dummy array, which was written by simple_xy_wr.c. This is intended to illustrate the use of the netCDF C API. This program is part of the netCDF tutorial: http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial Full documentation of the netCDF C API can be found at: http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-c $Id: simple_xy_rd.c,v 1.9 2006/08/17 23:00:55 russ Exp $ */ #include <stdlib.h> #include <stdio.h> #include <netcdf.h> #include <math.h> /* This is the name of the data file we will read. */ /* We are reading 2D data, a 6 x 12 grid. */ #define NX 3600 #define NY 1801 #define NZ 49 #define NT 10 /* Handle errors by printing an error message and exiting with a * non-zero status. */ #define ERRCODE 2 #define ERR(e) {printf("Error: %s\n", nc_strerror(e)); exit(ERRCODE);} #define TYPE float #define NC_GETVARA nc_get_vara_float int main(int argc, char* argv[]) { if (argc < 2) { printf("usage: %s filename\n", argv[0]); exit(1); } /* This will be the netCDF ID for the file and data variable. */ int ncid, varid; //short data_in[NX][NY][NZ]; TYPE *data_in; data_in = (TYPE*) malloc(NX*NY*NZ*sizeof(TYPE)); for (int i = 0; i < NX*NY*NZ; i++) { data_in[i] = -111; } /* Loop indexes, and error handling. */ int x, y, z, t, retval; /* Open the file. NC_NOWRITE tells netCDF we want read-only access * to the file.*/ if ((retval = nc_open(argv[1], NC_NOWRITE, &ncid))) ERR(retval); /* Get the varid of the data variable, based on its name. */ if ((retval = nc_inq_varid(ncid, "air_temperature_ml", &varid))) ERR(retval); size_t start[4], count[4]; start[0]=0; start[1]=0; start[2]=0; start[3]=0; count[0]=1; count[1]=NZ; count[2]=NY; count[3]=NX; for (t = 0; t < NT; t++) { start[0] = t; /* Read the data. */ if ((retval = NC_GETVARA(ncid, varid, start, count, data_in))) ERR(retval); /* Check the data. */ for (z = 0; z < NZ; z++) for (y = 0; y < NY; y++) for (x = 0; x < NX; x++) if (data_in[x+NX*y+NX*NY*z] != -32767) { printf("%d %d %d %d: %f\n", x, y ,z, t, data_in[x+NX*y+NX*NY*z]); // return ERRCODE; } } /* Close the file, freeing all resources. */ if ((retval = nc_close(ncid))) ERR(retval); printf("*** SUCCESS reading example file %s!\n", argv[1]); return 0; }
Attachment:
out.nc
Description: Cdf file
netcdfgroup
archives: