1%% Copyright (C) 2013 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_low_level_interface 17 18import_netcdf 19 20% 2 dimensions 21 22fname = [tempname '-octave-netcdf.nc']; 23 24ncid = netcdf.create(fname,'NC_CLOBBER'); 25assert(strcmp(netcdf.inqFormat(ncid),'FORMAT_CLASSIC')); 26 27n = 10; 28m = 5; 29 30dimid_lon = netcdf.defDim(ncid,'lon',m); 31dimid = netcdf.defDim(ncid,'time',n); 32 33varidd = netcdf.defVar(ncid,'double_var','double',[dimid_lon,dimid]); 34 35varid = netcdf.defVar(ncid,'byte_var','byte',[dimid]); 36 37varidf = netcdf.defVar(ncid,'float_var','float',[dimid]); 38 39varidi = netcdf.defVar(ncid,'int_var','int',[dimid]); 40 41varids = netcdf.defVar(ncid,'short_var','short',[dimid]); 42assert(varidd == netcdf.inqVarID(ncid,'double_var')) 43 44[numdims, numvars, numglobalatts, unlimdimID] = netcdf.inq(ncid); 45assert(numvars == 5) 46 47[varname,xtype,dimids,natts] = netcdf.inqVar(ncid,varidd); 48assert(strcmp(varname,'double_var')); 49 50[dimname,len] = netcdf.inqDim(ncid,dimid); 51assert(len == n); 52assert(strcmp(dimname,'time')); 53 54 55types = {'double','float','byte','short','int'}; 56 57 58for i=1:length(types) 59 vid{i} = netcdf.defVar(ncid,[types{i} '_variable'],types{i},[dimid_lon,dimid]); 60end 61 62 63netcdf.endDef(ncid) 64 65 66z = randn(m,n); 67netcdf.putVar(ncid,varidd,z); 68 69varf = randn(n,1); 70netcdf.putVar(ncid,varidf,varf); 71 72vari = floor(randn(n,1)); 73netcdf.putVar(ncid,varidi,vari); 74 75netcdf.putVar(ncid,varids,[1:n]) 76 77z2 = netcdf.getVar(ncid,varidd); 78assert(all(all(abs(z2 - z) < 1e-5))) 79 80z2 = netcdf.getVar(ncid,varidd,[0 0]); 81assert(z2 == z(1,1)) 82 83z2 = netcdf.getVar(ncid,varidd,[2 2],[3 5]); 84assert(isequal(z2,z(3:5,3:7))) 85 86z2 = netcdf.getVar(ncid,varidd,[2 2],[3 4],[1 2]); 87assert(isequal(z2,z(3:5,3:2:9))) 88 89 90netcdf.putVar(ncid,varidd,[0 0],123.); 91z(1,1) = 123; 92z2 = netcdf.getVar(ncid,varidd); 93assert(isequal(z,z2)) 94 95netcdf.putVar(ncid,varidd,[2 2],[3 3],ones(3,3)); 96z(3:5,3:5) = 1; 97z2 = netcdf.getVar(ncid,varidd); 98assert(isequal(z,z2)) 99 100 101netcdf.putVar(ncid,varidd,[0 0],[3 5],[2 2],zeros(3,5)); 102z(1:2:5,1:2:9) = 0; 103z2 = netcdf.getVar(ncid,varidd); 104assert(isequal(z,z2)) 105 106 107z2 = netcdf.getVar(ncid,varidf); 108assert(all(z2 - varf < 1e-5)) 109 110 111vari2 = netcdf.getVar(ncid,varidi); 112assert(all(vari2 == vari)) 113 114 115netcdf.close(ncid); 116delete(fname); 117 118% test with different dimensions 119 120for i = 1:5 121 nc_test_ndims(i); 122end 123 124 125 126function nc_test_ndims(ndims) 127import_netcdf 128 129fname = [tempname '-octave-netcdf.nc']; 130 131ncid = netcdf.create(fname,'NC_CLOBBER'); 132 133sz = ones(1,ndims); 134dimids = ones(1,ndims); 135 136for i = 1:ndims 137 sz(i) = 10+i; 138 dimids(i) = netcdf.defDim(ncid,sprintf('dim%g',i),sz(i)); 139end 140 141varid = netcdf.defVar(ncid,'double_var','double',dimids); 142 143[varname,xtype,dimids,natts] = netcdf.inqVar(ncid,varid); 144assert(strcmp(varname,'double_var')); 145 146for i = 1:ndims 147 [dimname,len] = netcdf.inqDim(ncid,dimids(i)); 148 assert(len == sz(i)); 149 assert(strcmp(dimname,sprintf('dim%g',i))); 150end 151 152 153netcdf.endDef(ncid) 154 155if ndims == 1 156 z = randn(sz,1); 157else 158 z = randn(sz); 159end 160 161netcdf.putVar(ncid,varid,z); 162 163 164z2 = netcdf.getVar(ncid,varid); 165assert(isequal(z,z2)) 166 167z2 = netcdf.getVar(ncid,varid,zeros(ndims,1)); 168assert(z2 == z(1)) 169 170start = 2 * ones(1,ndims); 171count = 5 * ones(1,ndims); 172z2 = netcdf.getVar(ncid,varid,start,count); 173idx = scs(start,count); 174assert(isequal(z2,z(idx{:}))) 175 176 177start = 2 * ones(1,ndims); 178count = 5 * ones(1,ndims); 179stride = 2 * ones(1,ndims); 180z2 = netcdf.getVar(ncid,varid,start,count,stride); 181idx = scs(start,count,stride); 182assert(isequal(z2,z(idx{:}))) 183 184 185% put with start 186start = zeros(1,ndims); 187netcdf.putVar(ncid,varid,start,123.); 188z(1) = 123; 189z2 = netcdf.getVar(ncid,varid); 190assert(isequal(z,z2)) 191 192 193% put with start and count 194 195start = 2 * ones(1,ndims); 196count = 5 * ones(1,ndims); 197if ndims == 1 198 data = ones(count,1); 199else 200 data = ones(count); 201end 202netcdf.putVar(ncid,varid,start,count,data); 203idx = scs(start,count); 204z(idx{:}) = 1; 205z2 = netcdf.getVar(ncid,varid); 206assert(isequal(z,z2)) 207 208% put with start, count and stride 209 210start = 2 * ones(1,ndims); 211count = 5 * ones(1,ndims); 212stride = 2 * ones(1,ndims); 213if ndims == 1 214 data = zeros(count,1); 215else 216 data = zeros(count); 217end 218netcdf.putVar(ncid,varid,start,count,stride,data); 219idx = scs(start,count,stride); 220z(idx{:}) = 0; 221z2 = netcdf.getVar(ncid,varid); 222assert(isequal(z,z2)) 223 224 225 226netcdf.close(ncid); 227delete(fname); 228 229function idx = scs(start,count,stride) 230idx = cell(length(start),1); 231 232if nargin == 2 233 stride = ones(length(start),1); 234end 235 236for i = 1:length(start) 237 idx{i} = start(i) + 1 + stride(i) * [0:count(i)-1]; 238end 239