@@ -203,14 +203,65 @@ Defines and return the variable in the data set `ds`
203
203
copied from the variable `src`. The dimension name, attributes
204
204
and data are copied from `src` as well as the variable name (unless provide by `name`).
205
205
"""
206
- function defVar (dest:: AbstractDataset ,name:: SymbolOrString ,srcvar:: AbstractVariable ; kwargs... )
207
- v = defVar (dest,name,
208
- Array (srcvar),
209
- dimnames (srcvar),
210
- attrib= attribs (srcvar); kwargs... )
211
- return v
206
+ function defVar (dest:: AbstractDataset ,varname:: SymbolOrString ,srcvar:: AbstractVariable ; kwargs... )
207
+ _ignore_checksum = false
208
+ if haskey (kwargs,:checksum )
209
+ _ignore_checksum = kwargs[:checksum ] === nothing
210
+ end
211
+
212
+ src = dataset (srcvar)
213
+
214
+ # dimensions
215
+ unlimited_dims = unlimited (src)
216
+
217
+ for dimname in dimnames (srcvar)
218
+ if dimname in _dimnames_recursive (dest)
219
+ # dimension is already defined
220
+ continue
221
+ end
222
+
223
+ if dimname in unlimited_dims
224
+ defDim (dest, dimname, Inf )
225
+ else
226
+ defDim (dest, dimname, dim (src,dimname))
227
+ end
228
+ end
229
+
230
+ var = srcvar. var
231
+ dimension_names = dimnames (var)
232
+ cfdestvar = defVar (dest, varname, eltype (var), dimension_names;
233
+ attrib = attribs (var))
234
+ destvar = variable (dest,varname)
235
+
236
+ storage,chunksizes = chunking (var)
237
+ @debug " chunking " name (var) size (var) size (cfdestvar) storage chunksizes
238
+ chunking (cfdestvar,storage,chunksizes)
239
+
240
+ isshuffled,isdeflated,deflate_level = deflate (var)
241
+ @debug " compression" isshuffled isdeflated deflate_level
242
+ deflate (cfdestvar,isshuffled,isdeflated,deflate_level)
243
+
244
+ if ! _ignore_checksum
245
+ checksummethod = checksum (var)
246
+ @debug " check-sum" checksummethod
247
+ checksum (cfdestvar,checksummethod)
248
+ end
249
+
250
+ # copy data
251
+ # TODO use DiskArrays.eachchunk
252
+ # if hasmethod(eachchunk,Tuple{typeof(var)})
253
+ # for indices in eachchunk(var)
254
+ # destvar[indices...] = var[indices...]
255
+ # end
256
+ # else
257
+ indices = ntuple (i -> axes (var,i),ndims (var))
258
+ destvar[indices... ] = var[indices... ]
259
+ # end
260
+
261
+ return cfdestvar
212
262
end
213
263
264
+
214
265
function defVar (dest:: AbstractDataset ,srcvar:: AbstractVariable ; kwargs... )
215
266
defVar (dest,name (srcvar),srcvar; kwargs... )
216
267
end
261
312
262
313
263
314
chunking (v:: AbstractVariable ) = (:contiguous ,size (v))
315
+ chunking (v:: AbstractVariable ,storage,chunksizes) = nothing
316
+
264
317
deflate (v:: AbstractVariable ) = (false ,false ,0 )
318
+ deflate (v:: AbstractVariable ,isshuffled,isdeflated,deflate_level) = nothing
319
+
265
320
checksum (v:: AbstractVariable ) = :nochecksum
321
+ checksum (v:: AbstractVariable ,checksummethod) = nothing
266
322
267
323
fillvalue (v:: AbstractVariable{T} ) where T = v. attrib[" _FillValue" ]:: T
268
324
0 commit comments