[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[IDV #QAW-317402]: Can't get IDV 2.7u2 to image a gridded field in a netCDF file that (I think) has data stored with best practices



Hi Jim-

> > What makes you think the IDV isn't using these values?
> 
> A couple of reasons. It doesn't list LATITUDE or LONGITUDE among the
> fields,which didn't seem like a good sign. 

The IDV does not display these as options since they are used as coordinates 
for the data variables.  You can see a dump of the file using the Data Source
properties menu under the MetaData tab.

Displays are getting plotted
> in rectangles with sides parallel to the window. The true grid is
> probably curvilinear on the coordinates chosen for the map.

Not in the file you sent me.  If you look at the latitude values, they are the 
same across the x dimension (lines) and longitude is the same across the y 
dimension (samples).  It is a rectilinear grid.

> > The netCDF
> > library converts the packed lat/lon values to unpacked versions.  In
> > the process, the lats go from  -139.951 to -95.0994 and the lats
> > from 25.0 to 49.851.  For example, the latitude is declared as:
> >
> >         short LATITUDE(lines, samples) ;
> >                 LATITUDE:units = "" ;
> >                 LATITUDE:missing_value = 51.f ;
> >                 LATITUDE:valid_min = 24.99975f ;
> >                 LATITUDE:valid_max = 49.90084f ;
> >                 LATITUDE:scale = 0.001f ;
> >                 LATITUDE:offset = 24.999f ;
> >                 LATITUDE:scale_factor = 0.001f ;
> >                 LATITUDE:add_offset = 24.999f ;
> >
> > The first value is 1, so that would translate to 1*.001+24.999 which
> > would be 25.  For the longitudes, the declaration is:
> >
> >         int LONGITUDE(lines, samples) ;
> >                 LONGITUDE:units = "" ;
> >                 LONGITUDE:missing_value = -94.f ;
> >                 LONGITUDE:valid_min = -140.0005f ;
> >                 LONGITUDE:valid_max = -95.0994f ;
> >                 LONGITUDE:scale = 1.e-007f ;
> >                 LONGITUDE:offset = -140.0005f ;
> >                 LONGITUDE:scale_factor = 1.e-007f ;
> >                 LONGITUDE:add_offset = -140.0005f ;
> >
> > and the first value is 0, so that would make it 0*1E-7 + -140.0005
> > which would be -140.0005.
> 
> Yes.
> 
> > This is being set to missing.
> > Is that what you are wondering about or is it something different?
> 
> I wasn't aware that it is -- or should be -- set to missing. And
> I have questions about the explanation given below.

It looks like the roundoff is causing it to be set to missing.
 
> > latitude is also set to NaN, but there, we have 24902*.001+24.999 =
> > 49.901 which is beyond the valid_max of 49.90084.
> >
> > I got some clarification from the netCDF folks on the use of the
> > missing and valid max/min values.  Here's what they replied:
> >
> > <quote>
> > Turns out the problem is missing_value, which must be in packed units:
> >
> > from
> http://www.unidata.ucar.edu/software/netcdf-java/v4.1/javadoc/index.html
> >
> > *Implementation rules for missing data with scale/offset*
> >
> >   1. Always converted to a float or double type.
> >   2. _FillValue and missing_value values are always in the units of the
> >      external (packed) data.
> 
> Let me offer an example to see if I understand this. Say the scale factor
> is
> .001 and offset is 20. Then will a missing value (in packed units) of 15
> get
> displayed by ncdump as 15*.001+20=20.015?

ncdump shows only the raw values as far as I know.  I don't see an option
(at least in 3.6.1) to do the scale and offset.  If you are using the 
netCDF-Java ToolsUI to dump the data, you can dump either the raw data or the 
transformed data.  That's what I've been using to check out your file.

The resulting scaled/offset missing value will be used to set data values to 
NaN after they have been unpacked if they are the same as the unpacked missing 
value.

> >   3. If valid_range is the same type as scale_factor (actually the
> >      wider of scale_factor and add_offset) and this is wider than the
> >      external data, then it will be interpreted as being in the units
> >      of the internal (unpacked) data. Otherwise it is in the units of
> >      the external (packed) data.
> >   4. The dataType is set to float if all attributes used are float
> >      (scale_factor, add_offset valid_min, valid_max, valid_range,
> >      missing_data and _FillValue) otherwise the dataType is set to double
> >
> >
> > technically, valid_min and max should also be in packed units
> > acording to the NUG, but we relaxed that in netcdf-java to
> > accomodate some existing datasets that misread the manual.
> >
> > also, he is using floats, and is encountering roundoff error,
> > looking in the debugger i see:
> >
> > valid_min = -140.00045776367188
> >
> > which will also cause problems.
> 
> Where does this roundoff error occur? It seems it must be just in the
> output
> of ncdump or the debugger would give the same value.

In the netCDF-Java library.

> > so:
> >
> > 1:  dont use missing_value or valid min/max unless you need them, eg
> > you actually have missing data.
> 
> The lats and longitudes should always be there but there will be
> missing values of some data.

That is the best way.

> > 2. missing_value must be in packed units.
> 
> See my example above.

Yes.
 
> > 3. make valid_min and valid_max a little wider than you need to
> > accomodate roundoff
> 
> Or have them in packed units??

Yes, that would work.

> > </quote>
> >
> > Also, take a look at the CF conventions about packed data:
> >
> > http://cf-pcmdi.llnl.gov/documents/cf-conventions/1.4/cf-
> > conventions.html#packed-data

Don

Ticket Details
===================
Ticket ID: QAW-317402
Department: Support IDV
Priority: Critical
Status: Open


NOTE: All email exchanges with Unidata User Support are recorded in the Unidata inquiry tracking system and then made publicly available through the web. If you do not want to have your interactions made available in this way, you must let us know in each email you send to us.