<div dir="ltr">There is a netcdf-C Github ticket for this issue:<br><div><a href="https://github.com/Unidata/netcdf-c/issues/390">https://github.com/Unidata/netcdf-c/issues/390</a><br></div><div><br></div><div>I would like to suggest that NCL should wait and follow whatever fix is made in the netcdf-C API.  I could see that going either of two valid ways: either correct support for changing _FillValue in netcdf-4 format, or reverting to firm prohibition.  The core HDF5 library has a firm prohibition, and there are some good reasons for that.</div><div><br></div><div>--Dave A.</div><div><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 7, 2017 at 11:31 AM, David Brown <span dir="ltr">&lt;<a href="mailto:dbrown@ucar.edu" target="_blank">dbrown@ucar.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">A JIRA ticket NCL-2589 has been created for this issue with major<br>
priority to be fixed for 6.4.1.<br>
<br>
On Tue, Mar 28, 2017 at 10:29 PM, David Brown &lt;<a href="mailto:dbrown@ucar.edu">dbrown@ucar.edu</a>&gt; wrote:<br>
&gt; As Rick recounts above, we thought that the NetCDF4 library went<br>
&gt; through a lot of hoops in 4.4.1 to do just as you suggest Dave,<br>
&gt; totally rewriting the variable, just to allow changing the _FillValue,<br>
&gt; as was possible in NetCDF3.<br>
&gt;<br>
&gt; However, it seems that, at least as far back as 4.1.3 (~2011) the<br>
&gt; documentation (nc_def_var_fill) has explicitly stated that the<br>
&gt; _FillValue cannot be changed once the data variable has been read or<br>
&gt; written.<br>
&gt;<br>
&gt; I knew this about HDF5, but until now I thought that NetCDF4 had<br>
&gt; overcome this limitation. Given the situation, it appears you are<br>
&gt; correct that the only correct response is to refuse to try to change<br>
&gt; the _FillValue and return an error, although actually it seems that it<br>
&gt; should really be the responsibility of the NetCDF library to give us<br>
&gt; the ELATEFILL error message and not allow the data to be modified.<br>
&gt;  -dave<br>&gt;<br>
&gt;<br>
&gt; On Tue, Mar 28, 2017 at 6:09 PM, Dave Allured - NOAA Affiliate<br>
&gt; &lt;<a href="mailto:dave.allured@noaa.gov">dave.allured@noaa.gov</a>&gt; wrote:<br>
&gt;&gt; Rick,<br>
&gt;&gt;<br>
&gt;&gt; I discovered that my current complaint is all due to the underlying Netcdf<br>
&gt;&gt; library, currently version 4.4.1.  I would not have sent an NCL bug report<br>
&gt;&gt; if I had realized this earlier.  I do intend to report this back to Netcdf.<br>
&gt;&gt;<br>
&gt;&gt; In Netcdf-4 file format, there is apparently a restriction that _FillValue<br>
&gt;&gt; may not be changed after data is written.  This is a notable difference from<br>
&gt;&gt; Netcdf-3 format.  Functions in the nc_put_att family list this possible<br>
&gt;&gt; error, which I think applies to Netcdf-4 file access only:<br>
&gt;&gt;<br>
&gt;&gt;     NC_ELATEFILL -- Fill values must be written while the file is still in<br>
&gt;&gt; initial define mode.<br>
&gt;&gt;<br>
&gt;&gt; This is probably due to the underlying HDF5 layer:<br>
&gt;&gt;<br>
&gt;&gt;     &quot;the fill value for a dataset cannot be modified once the dataset has<br>
&gt;&gt; been created&quot;<br>
&gt;&gt;     <a href="https://support.hdfgroup.org/HDF5/hdf5-quest.html#pfillvalue" rel="noreferrer" target="_blank">https://support.hdfgroup.org/<wbr>HDF5/hdf5-quest.html#<wbr>pfillvalue</a><br>
&gt;&gt;<br>
&gt;&gt; This is why I think the correct response for both NCL and C programs should<br>
&gt;&gt; be to fail with NC_ELATEFILL or equivalent, rather than &quot;just work&quot;.  To<br>
&gt;&gt; &quot;just work&quot; might involve a large performance penalty along the lines of<br>
&gt;&gt; scanning or re-writing the entire file variable.  Either way, previous data<br>
&gt;&gt; should not be erased, i.e. set to _FillValue.<br>
&gt;&gt;<br>
&gt;&gt; --Dave<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Tue, Mar 28, 2017 at 4:44 PM, Rick Brownrigg &lt;<a href="mailto:brownrig@ucar.edu">brownrig@ucar.edu</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Hi Dave,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I will look into this and likely file a bug report. At one point, there<br>
&gt;&gt;&gt; was an issue whereby if _FillValue (or any attribute) was added to a<br>
&gt;&gt;&gt; variable, it caused all the other attributes to be dropped (but the data was<br>
&gt;&gt;&gt; preserved). This was traced to a bug in the underlying NetCDF library, which<br>
&gt;&gt;&gt; was fixed in version 4.4.1 around summer 2016.  The NetCDF library was going<br>
&gt;&gt;&gt; to a lot of effort to make it possible to rewrite a preexisting variable, so<br>
&gt;&gt;&gt; I would think the correct response is for it to &quot;just work&quot;, rather than<br>
&gt;&gt;&gt; error out and do nothing?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Rick<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Tue, Mar 28, 2017 at 2:59 PM, Dave Allured - NOAA Affiliate<br>
&gt;&gt;&gt; &lt;<a href="mailto:dave.allured@noaa.gov">dave.allured@noaa.gov</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; NCL team,<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Under some conditions, adding a _FillValue attribute to an existing<br>
&gt;&gt;&gt;&gt; Netcdf-4 file erases previous data.  I find this behavior with both NCL<br>
&gt;&gt;&gt;&gt; 6.3.0 and 6.4.0 on Mac OS 10.11 (El Capitan).  I get the same behavior with<br>
&gt;&gt;&gt;&gt; both netcdf4-classic and full netcdf4 formats.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; mac56:~/ncl/bugs/fillvalue1 2&gt; ncdump -s <a href="http://test3.nc" rel="noreferrer" target="_blank">test3.nc</a><br>
&gt;&gt;&gt;&gt; netcdf test3 {<br>
&gt;&gt;&gt;&gt; dimensions:<br>
&gt;&gt;&gt;&gt; dim = 10 ;<br>
&gt;&gt;&gt;&gt; variables:<br>
&gt;&gt;&gt;&gt; int var(dim) ;<br>
&gt;&gt;&gt;&gt; var:_Storage = &quot;contiguous&quot; ;<br>
&gt;&gt;&gt;&gt; var:_Endianness = &quot;little&quot; ;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; // global attributes:<br>
&gt;&gt;&gt;&gt; :_NCProperties = &quot;version=1|netcdflibversion=4.<wbr>4.1|hdf5libversion=1.8.17&quot;<br>
&gt;&gt;&gt;&gt; ;<br>
&gt;&gt;&gt;&gt; :_SuperblockVersion = 0 ;<br>
&gt;&gt;&gt;&gt; :_IsNetcdf4 = 1 ;<br>
&gt;&gt;&gt;&gt; :_Format = &quot;netCDF-4 classic model&quot; ;<br>
&gt;&gt;&gt;&gt; data:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;  var = 11, 22, 33, 44, 55, _, _, _, _, _ ;<br>
&gt;&gt;&gt;&gt; }<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; mac56:~/ncl/bugs/fillvalue1 3&gt; ncl<br>
&gt;&gt;&gt;&gt;  Copyright (C) 1995-2017 - All Rights Reserved<br>
&gt;&gt;&gt;&gt;  University Corporation for Atmospheric Research<br>
&gt;&gt;&gt;&gt;  NCAR Command Language Version 6.4.0<br>
&gt;&gt;&gt;&gt;  The use of this software is governed by a License Agreement.<br>
&gt;&gt;&gt;&gt;  See <a href="http://www.ncl.ucar.edu/" rel="noreferrer" target="_blank">http://www.ncl.ucar.edu/</a> for more details.<br>
&gt;&gt;&gt;&gt; ncl 0&gt; f=addfile(&quot;<a href="http://test3.nc" rel="noreferrer" target="_blank">test3.nc</a>&quot;,&quot;w&quot;)<br>
&gt;&gt;&gt;&gt; ncl 1&gt; f-&gt;var@_FillValue = 99<br>
&gt;&gt;&gt;&gt; ncl 2&gt; exit<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; mac56:~/ncl/bugs/fillvalue1 4&gt; ncdump -s <a href="http://test3.nc" rel="noreferrer" target="_blank">test3.nc</a><br>
&gt;&gt;&gt;&gt; netcdf test3 {<br>
&gt;&gt;&gt;&gt; dimensions:<br>
&gt;&gt;&gt;&gt; dim = 10 ;<br>
&gt;&gt;&gt;&gt; variables:<br>
&gt;&gt;&gt;&gt; int var(dim) ;<br>
&gt;&gt;&gt;&gt; var:_FillValue = 99 ;<br>
&gt;&gt;&gt;&gt; var:_Storage = &quot;contiguous&quot; ;<br>
&gt;&gt;&gt;&gt; var:_Endianness = &quot;little&quot; ;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; // global attributes:<br>
&gt;&gt;&gt;&gt; :_NCProperties = &quot;version=1|netcdflibversion=4.<wbr>4.1|hdf5libversion=1.8.17&quot;<br>
&gt;&gt;&gt;&gt; ;<br>
&gt;&gt;&gt;&gt; :_SuperblockVersion = 0 ;<br>
&gt;&gt;&gt;&gt; :_IsNetcdf4 = 1 ;<br>
&gt;&gt;&gt;&gt; :_Format = &quot;netCDF-4 classic model&quot; ;<br>
&gt;&gt;&gt;&gt; data:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;  var = _, _, _, _, _, _, _, _, _, _ ;<br>
&gt;&gt;&gt;&gt; }<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; In my opinion, the correct response for netcdf-4 formats should be an<br>
&gt;&gt;&gt;&gt; error, something like &quot;Can not change _FillValue after data is written in<br>
&gt;&gt;&gt;&gt; netcdf-4&quot;, and the file is unchanged.  In any case, previous data should not<br>
&gt;&gt;&gt;&gt; be silently erased.  If you agree, please fix this for the next release.<br>
&gt;&gt;&gt;&gt; Thanks.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; --Dave<br></blockquote></div></div></div></div>