Dear ferret list, there is a problem reading our climate model netcdf files with the new ferret double precision version. I boiled it down to a set of small files in the attachment. '-1E+34' is not recognized as 'missing value' (see 'ex_float'). To save space, all variables except dimensional variables in our climate model output are defined as "float" = "single precision". When a netcdf file is read into double-precision ferret, the entry '-1E+34' in a float (single precision) variable is not recognized as 'missing value' anymore, but has a numerical value of -9.999999790214768E+33 (prec=16). The bad values are thus not masked, which is inconvenient for plotting or analysis. yes? list press VARIABLE : pressure (Pa) FILENAME : ex_float.nc SUBSET : 3 points (TIME) 01-JAN-2000 00:20:00 / 1: 1.000E+04 01-JAN-2000 00:40:00 / 2: -1.000E+34 01-JAN-2000 01:00:00 / 3: 1.000E+05 The workaround 'set var/bad=-9.999999790214768E+33 <variable>' is inconvenient as well. Interestingly, when listing the bad value of the variable, the bad-value masking seems to work: yes? list `press,ret=bad` !-> list -1.E+34 VARIABLE : constant .... In 'ex_double' (attachment), I exchanged 'float' to 'double' by hand for all variables. The value '-1E+34' is then recognized correctly: yes? list press VARIABLE : pressure (Pa) FILENAME : ex_traj2.nc SUBSET : 3 points (TIME) 01-JAN-2000 00:20:00 / 1: 10000. 01-JAN-2000 00:40:00 / 2: .... 01-JAN-2000 01:00:00 / 3: 100020. The explicit definition of a missing value in the netCDF file does not solve the issue (attachment: ex_float_missing). Please help us with backwards compatibility as we cannot go into several terabyte of climate data output to change "float" to "double" in the variable definitions. Thanks a lot in advance, Hella
netcdf ex_float { dimensions: time = UNLIMITED ; // (3 currently) variables: float lat(time) ; lat:units = "degrees_north" ; float lon(time) ; lon:units = "degrees_east" ; float level(time) ; level:units = "Pa" ; double time(time) ; time:units = "seconds since 2000-01-01 00:00:00" ; float press(time) ; press:long_name = "pressure" ; press:units = "Pa" ; float rh(time) ; rh:long_name = "relative humidity" ; rh:valid_range = 0., 1. ; float temp(time) ; temp:long_name = "temperature" ; temp:units = "kelvin" ; // global attributes: :source = "Pulp Fictional Model Output" ; data: lat = 16, 17, 18 ; lon = 110, 115, 120 ; level = 90, 88, 89 ; time = 1200, 2400, 3600 ; press = 10000, -1E+34, 100020 ; rh = 0.1, 0.2, 0.3 ; temp = 290, 291, 292 ; }
Attachment:
ex_float.nc
Description: Cdf file
Attachment:
ex_double.nc
Description: Cdf file
netcdf ex_double { dimensions: time = UNLIMITED ; // (3 currently) variables: double lat(time) ; lat:units = "degrees_north" ; double lon(time) ; lon:units = "degrees_east" ; double level(time) ; level:units = "Pa" ; double time(time) ; time:units = "seconds since 2000-01-01 00:00:00" ; double press(time) ; press:long_name = "pressure" ; press:units = "Pa" ; double rh(time) ; rh:long_name = "relative humidity" ; rh:valid_range = 0., 1. ; double temp(time) ; temp:long_name = "temperature" ; temp:units = "kelvin" ; // global attributes: :source = "Pulp Fictional Model Output" ; data: lat = 16, 17, 18 ; lon = 110, 115, 120 ; level = 90, 88, 89 ; time = 1200, 2400, 3600 ; press = 10000, -1E+34, 100020 ; rh = 0.1, 0.2, 0.3 ; temp = 290, 291, 292 ; }
Attachment:
ex_float_missing.nc
Description: Cdf file
netcdf ex_traj1 { dimensions: time = UNLIMITED ; // (3 currently) variables: float lat(time) ; lat:units = "degrees_north" ; float lon(time) ; lon:units = "degrees_east" ; float level(time) ; level:units = "Pa" ; double time(time) ; time:units = "seconds since 2000-01-01 00:00:00" ; float press(time) ; press:long_name = "pressure" ; press:units = "Pa" ; press:missing = -1E+34 ; float rh(time) ; rh:long_name = "relative humidity" ; rh:valid_range = 0., 1. ; float temp(time) ; temp:long_name = "temperature" ; temp:units = "kelvin" ; // global attributes: :source = "Pulp Fictional Model Output" ; data: lat = 16, 17, 18 ; lon = 110, 115, 120 ; level = 90, 88, 89 ; time = 1200, 2400, 3600 ; press = 10000, -1E+34, 100020 ; rh = 0.1, 0.2, 0.3 ; temp = 290, 291, 292 ; }