Re: Fill Value (fwd)



==============================================================================
Robb Kambic                                Unidata Program Center
Software Engineer III                      Univ. Corp for Atmospheric Research
rkambic@xxxxxxxxxxxxxxxx                   WWW: http://www.unidata.ucar.edu/
==============================================================================

---------- Forwarded message ----------
Date: Thu, 08 Apr 1999 14:39:53 -0600
From: Russ Rew <russ@xxxxxxxxxxxxxxxx>
To: Jason Burks <Jason.Burks@xxxxxxxx>
Subject: Re: Fill Value (fwd)
From: Jason Burks <Jason.Burks@xxxxxxxx>
To: rkambic@xxxxxxxxxxxxxxxx
Subject: Fill Value

Hi Jason,

I am decoding the NOAA Experimental Wave Model (Ocean Waves) from grib to netcdf. This model has missing values over land for obvious reasons. If the variable in the cdl file FillValue and the value in gbds.h define FILL_VAL are the same then the missing values get filled in with a _ rather than the fill value. This would be ok except when AWIPS sees this _ it tries to put the fill value in there and then displays it. So what I need to know is there a way to modify the gribtonc decoder to actually use the FillValue rather than put in the underscore? I would not normally care but I need to have in the data file that the fillvalue is -99999. and the missing data also has to show up as -99999.

The "_" appearing for fill values is just the way the ncdump utility
shows a fill value.  The value stored in the netCDF file is still the
numeric value -99999. in your case, as you can verify by calling the
appropriate nc_get_var() C function or NF_GET_VAR()Fortran function.

If you want the ncdump utility to show the numeric value instead of
the "_" abbreviation for fill values, you would need to modify
ncdump/vardata.c and rebuild ncdump, by deleting some lines.

From the printbval, printsval, and printival functions, delete

   if (varp->has_fillval) {
        double fillval = varp->fillval;
        if(fillval == val) {
            (void) sprintf(sout, FILL_STRING);
            return;
        }
   }

From the printfval function, delete

   if(varp->has_fillval) {
        double fillval = varp->fillval;
        if((val > 0) == (fillval > 0) && /* prevents potential overflow */
           (absval(val - fillval) <= absval(float_eps * fillval))) {
            (void) sprintf(sout, FILL_STRING);
            return;
        }
   }

And from the printdval function, delete

   if(varp->has_fillval) {
        double fillval = varp->fillval;
        if((val > 0) == (fillval > 0) && /* prevents potential overflow */
           (absval(val - fillval) <= absval(double_eps * fillval))) {
            (void) sprintf(sout, FILL_STRING);
            return;
        }
   }

There probably should be a command line option on ncdump to not print
"_" for fill values so you wouldn't have to modify the code and
recompile, but no one ever requested such a feature.

--Russ
_____________________________________________________________________

Russ Rew                                         UCAR Unidata Program
russ@xxxxxxxxxxxxxxxx                     http://www.unidata.ucar.edu