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