1%% Copyright (C) 2013-2014 Alexander Barth
2%%
3%% This program is free software; you can redistribute it and/or modify
4%% it under the terms of the GNU General Public License as published by
5%% the Free Software Foundation; either version 2 of the License, or
6%% (at your option) any later version.
7%%
8%% This program is distributed in the hope that it will be useful,
9%% but WITHOUT ANY WARRANTY; without even the implied warranty of
10%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11%% GNU General Public License for more details.
12%%
13%% You should have received a copy of the GNU General Public License
14%% along with this program; If not, see <http://www.gnu.org/licenses/>.
15
16function test_netcdf_attributes()
17import_netcdf
18
19
20% rename attributes
21
22fname = [tempname '-octave-netcdf-rename-attrib.nc'];
23ncid = netcdf.create(fname,'NC_CLOBBER');
24gid = netcdf.getConstant('global');
25netcdf.putAtt(ncid,gid,'toto',int8(123));
26name = netcdf.inqAttName(ncid,gid,0);
27assert(strcmp(name,'toto'));
28netcdf.renameAtt(ncid,gid,'toto','lala');
29name = netcdf.inqAttName(ncid,gid,0);
30assert(strcmp(name,'lala'));
31netcdf.close(ncid);
32delete(fname)
33
34
35% delete attributes
36
37fname = [tempname '-octave-netcdf-delete-attrib.nc'];
38ncid = netcdf.create(fname,'NC_CLOBBER');
39gid = netcdf.getConstant('global');
40netcdf.putAtt(ncid,gid,'toto',int8(123));
41varid = netcdf.defVar(ncid,'double_var','double',[]);
42[ndims,nvars,natts] = netcdf.inq(ncid);
43assert(natts == 1);
44netcdf.delAtt(ncid,gid,'toto');
45[ndims,nvars,natts] = netcdf.inq(ncid);
46assert(natts == 0);
47netcdf.close(ncid);
48delete(fname)
49
50% copy attributes
51
52fname = [tempname '-octave-netcdf-copy-attrib.nc'];
53ncid = netcdf.create(fname,'NC_CLOBBER');
54gid = netcdf.getConstant('global');
55netcdf.putAtt(ncid,gid,'toto',int8(123));
56varid = netcdf.defVar(ncid,'double_var','double',[]);
57netcdf.copyAtt(ncid,gid,'toto',ncid,varid);
58[ndims,nvars,natts] = netcdf.inq(ncid);
59assert(natts == 1);
60[varname,xtype,dimids,natts] = netcdf.inqVar(ncid,varid);
61val = netcdf.getAtt(ncid,varid,'toto');
62assert(isequal(val,123));
63netcdf.close(ncid);
64delete(fname)
65
66% attributes id
67
68fname = [tempname '-octave-netcdf-delete-attrib.nc'];
69ncid = netcdf.create(fname,'NC_CLOBBER');
70gid = netcdf.getConstant('global');
71netcdf.putAtt(ncid,gid,'toto',int8(123));
72attnum = netcdf.inqAttID(ncid,gid,'toto');
73name = netcdf.inqAttName(ncid,gid,attnum);
74assert(strcmp(name,'toto'))
75netcdf.close(ncid);
76delete(fname)
77
78
79
80% test one unlimited dimensions
81fname = [tempname '-octave-netcdf-unlimdim.nc'];
82ncid = netcdf.create(fname,'NC_CLOBBER');
83dimID = netcdf.defDim(ncid,'time',netcdf.getConstant('NC_UNLIMITED'));
84unlimdimIDs = netcdf.inqUnlimDims(ncid);
85assert(dimID == unlimdimIDs);
86netcdf.close(ncid);
87delete(fname)
88
89
90% test netcdf_classic format
91fname = [tempname '-octave-netcdf-classic-model.nc'];
92mode =  bitor(netcdf.getConstant('classic_model'),netcdf.getConstant('netcdf4'));
93ncid = netcdf.create(fname,mode);
94netcdf.close(ncid);
95info = ncinfo(fname);
96assert(strcmp(info.Format,'netcdf4_classic'));
97delete(fname);
98
99
100% test two unlimited dimensions
101fname = [tempname '-octave-netcdf-2unlimdim.nc'];
102mode =  bitor(netcdf.getConstant('NC_CLOBBER'),netcdf.getConstant('NC_NETCDF4'));
103ncid = netcdf.create(fname,mode);
104dimID = netcdf.defDim(ncid,'time',netcdf.getConstant('NC_UNLIMITED'));
105dimID2 = netcdf.defDim(ncid,'time2',netcdf.getConstant('NC_UNLIMITED'));
106unlimdimIDs = netcdf.inqUnlimDims(ncid);
107assert(isequal(sort([dimID,dimID2]),sort(unlimdimIDs)));
108netcdf.close(ncid);
109delete(fname);
110
111
112% test fill mode
113fname = [tempname '-octave-netcdf-fill-mode.nc'];
114mode =  bitor(netcdf.getConstant('NC_CLOBBER'),netcdf.getConstant('NC_NETCDF4'));
115ncid = netcdf.create(fname,mode);
116old_mode = netcdf.setFill(ncid,'nofill');
117old_mode = netcdf.setFill(ncid,'nofill');
118assert(old_mode == netcdf.getConstant('nofill'))
119netcdf.close(ncid);
120delete(fname);
121
122
123% deflate for 64bit_offset files
124fname = [tempname '-octave-netcdf-deflate.nc'];
125ncid = netcdf.create(fname,'64BIT_OFFSET');
126dimids = [netcdf.defDim(ncid,'x',123) netcdf.defDim(ncid,'y',12)];
127varid = netcdf.defVar(ncid,'double_var','double',dimids);
128[shuffle,deflate,deflateLevel] = netcdf.inqVarDeflate(ncid,varid);
129assert(shuffle == 0)
130assert(deflate == 0)
131assert(deflateLevel == 0)
132netcdf.close(ncid);
133%system(['ncdump -h ' fname])
134delete(fname);
135
136
137% deflate
138fname = [tempname '-octave-netcdf-deflate.nc'];
139ncid = netcdf.create(fname,'NC_NETCDF4');
140dimids = [netcdf.defDim(ncid,'x',123) netcdf.defDim(ncid,'y',12)];
141varid = netcdf.defVar(ncid,'double_var','double',dimids);
142netcdf.defVarDeflate(ncid,varid,true,true,9);
143[shuffle,deflate,deflateLevel] = netcdf.inqVarDeflate(ncid,varid);
144assert(shuffle)
145assert(deflate)
146assert(deflateLevel == 9)
147netcdf.close(ncid);
148%system(['ncdump -h ' fname])
149delete(fname);
150
151
152
153% chunking - contiguous storage
154fname = [tempname '-octave-netcdf-chunking.nc'];
155ncid = netcdf.create(fname,'NC_NETCDF4');
156dimids = [netcdf.defDim(ncid,'x',123) netcdf.defDim(ncid,'y',12)];
157varid = netcdf.defVar(ncid,'double_var','double',dimids);
158netcdf.defVarChunking(ncid,varid,'contiguous');
159[storage,chunksize] = netcdf.inqVarChunking(ncid,varid);
160assert(strcmp(storage,'contiguous'))
161assert(isempty(chunksize))
162netcdf.close(ncid);
163%system(['ncdump -h ' fname])
164delete(fname);
165
166
167% chunking - chunked storage
168fname = [tempname '-octave-netcdf-chunking.nc'];
169ncid = netcdf.create(fname,'NC_NETCDF4');
170dimids = [netcdf.defDim(ncid,'x',123) netcdf.defDim(ncid,'y',12)];
171varid = netcdf.defVar(ncid,'double_var','double',dimids);
172netcdf.defVarChunking(ncid,varid,'chunked',[3 4]);
173[storage,chunksize] = netcdf.inqVarChunking(ncid,varid);
174assert(strcmp(storage,'chunked'))
175assert(isequal(chunksize,[3 4]))
176netcdf.close(ncid);
177%system(['ncdump -h ' fname])
178delete(fname);
179
180
181% checksum
182fname = [tempname '-octave-netcdf-checksum.nc'];
183ncid = netcdf.create(fname,'NC_NETCDF4');
184dimids = [netcdf.defDim(ncid,'x',123) netcdf.defDim(ncid,'y',12)];
185varid = netcdf.defVar(ncid,'double_var','double',dimids);
186checksum = netcdf.inqVarFletcher32(ncid,varid);
187assert(strcmp(checksum,'NOCHECKSUM'))
188netcdf.defVarFletcher32(ncid,varid,'fletcher32');
189checksum = netcdf.inqVarFletcher32(ncid,varid);
190assert(strcmp(checksum,'FLETCHER32'))
191netcdf.close(ncid);
192%system(['ncdump -h ' fname])
193delete(fname);
194
195
196% variable fill
197fname = [tempname '-octave-netcdf-fill.nc'];
198ncid = netcdf.create(fname,'NC_NETCDF4');
199dimids = [netcdf.defDim(ncid,'x',123) netcdf.defDim(ncid,'y',12)];
200varid = netcdf.defVar(ncid,'double_var','double',dimids);
201netcdf.defVarFill(ncid,varid,false,-99999.);
202[nofill,fillval] = netcdf.inqVarFill(ncid,varid);
203assert(isequal(nofill,false))
204assert(fillval == -99999.)
205netcdf.close(ncid);
206%system(['ncdump -h ' fname])
207delete(fname);
208
209% variable fill single
210fname = [tempname '-octave-netcdf-fill.nc'];
211ncid = netcdf.create(fname,'NC_NETCDF4');
212dimids = [netcdf.defDim(ncid,'x',123) netcdf.defDim(ncid,'y',12)];
213varid = netcdf.defVar(ncid,'single_var','float',dimids);
214netcdf.defVarFill(ncid,varid,false,single(-99999.));
215[nofill,fillval] = netcdf.inqVarFill(ncid,varid);
216assert(isequal(nofill,false))
217assert(fillval == -99999.)
218netcdf.close(ncid);
219%system(['ncdump -h ' fname])
220delete(fname);
221
222
223% variable fill char
224fname = [tempname '-octave-netcdf-fill-char.nc'];
225ncid = netcdf.create(fname,'NC_NETCDF4');
226dimids = [netcdf.defDim(ncid,'x',123) netcdf.defDim(ncid,'y',12)];
227varid = netcdf.defVar(ncid,'double_var','char',dimids);
228netcdf.defVarFill(ncid,varid,false,'X');
229[fill,fillval] = netcdf.inqVarFill(ncid,varid);
230assert(~fill)
231assert(fillval == 'X')
232netcdf.close(ncid);
233delete(fname);
234
235
236
237% check default state of fill
238fname = [tempname '-octave-netcdf-fill.nc'];
239ncid = netcdf.create(fname,'NC_NETCDF4');
240dimids = [netcdf.defDim(ncid,'x',123) netcdf.defDim(ncid,'y',12)];
241varid = netcdf.defVar(ncid,'double_var','double',dimids);
242[nofill,fillval] = netcdf.inqVarFill(ncid,varid);
243assert(isequal(nofill,false))
244netcdf.close(ncid);
245%system(['ncdump -h ' fname])
246delete(fname);
247
248
249% create groups
250fname = [tempname '-octave-netcdf-groups.nc'];
251ncid = netcdf.create(fname,'NC_NETCDF4');
252id1 = netcdf.defGrp(ncid,'group1');
253id2 = netcdf.defGrp(ncid,'group2');
254id3 = netcdf.defGrp(id1,'subgroup');
255ids = netcdf.inqGrps(ncid);
256assert(isequal(sort([id1,id2]),sort(ids)));
257
258id4 = netcdf.inqNcid(ncid,'group1');
259assert(id1 == id4)
260
261name = netcdf.inqGrpName(id3);
262assert(strcmp(name,'subgroup'))
263
264name = netcdf.inqGrpNameFull(id3);
265assert(strcmp(name,'/group1/subgroup'))
266
267parentid = netcdf.inqGrpParent(id3);
268assert(id1 == parentid);
269
270if 0
271  id3bis = netcdf.inqGrpFullNcid(ncid,'/group1/subgroup');
272  assert(id3 == id3bis);
273end
274
275netcdf.close(ncid);
276%system(['ncdump -h ' fname])
277delete(fname);
278
279
280
281% check rename dimension
282fname = [tempname '-octave-rename-dim.nc'];
283ncid = netcdf.create(fname,'NC_NETCDF4');
284dimid = netcdf.defDim(ncid,'x',123);
285[name,len] = netcdf.inqDim(ncid,dimid);
286assert(strcmp(name,'x'));
287netcdf.renameDim(ncid,dimid,'y');
288[name,len] = netcdf.inqDim(ncid,dimid);
289assert(strcmp(name,'y'));
290netcdf.close(ncid);
291delete(fname);
292
293
294% rename variable
295fname = [tempname '-octave-netcdf-rename-var.nc'];
296ncid = netcdf.create(fname,'NC_NETCDF4');
297dimids = [netcdf.defDim(ncid,'x',123) netcdf.defDim(ncid,'y',12)];
298varid = netcdf.defVar(ncid,'double_var','char',dimids);
299[varname] = netcdf.inqVar(ncid,varid);
300assert(strcmp(varname,'double_var'));
301netcdf.renameVar(ncid,varid,'doublev');
302[varname] = netcdf.inqVar(ncid,varid);
303assert(strcmp(varname,'doublev'));
304netcdf.close(ncid);
305delete(fname);
306