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