@@ -84,7 +84,7 @@ ds = NCDataset("foo.nc");
8484close(ds)
8585```
8686"""
87- function cfvariable (ds,
87+ function cfvariable (ds,
8888 varname;
8989 _v = variable (ds,varname),
9090 attrib = _v. attrib,
@@ -441,56 +441,83 @@ end
441441 return CFinvtransform (data,fv,inv_scale_factor,minus_offset,time_origin,inv_time_factor,maskingvalue,DT)
442442end
443443
444+ # # Define for DiskArrays
445+ @inline function CFinvtransformdata (data:: AbstractDiskArray{T,N} ,fv,scale_factor,add_offset,time_origin,time_factor,maskingvalue,DT) where {T,N}
446+ data_materialized = Array (data)
447+ return CFinvtransformdata (data_materialized,fv,scale_factor,add_offset,time_origin,time_factor,maskingvalue,DT)
448+ end
449+
450+ @inline function CFinvtransformdata (
451+ data:: AbstractDiskArray{T,N} ,fv:: Tuple{} ,scale_factor:: Nothing ,
452+ add_offset:: Nothing ,time_origin:: Nothing ,time_factor:: Nothing ,maskingvalue,:: Type{T} ) where {T,N}
453+ # no transformation necessary (avoid allocation)
454+ return data
455+ end
456+
444457
445458
446459# this function is necessary to avoid "iterating" over a single character in Julia 1.0 (fixed Julia 1.3)
447460# https://discourse.julialang.org/t/broadcasting-and-single-characters/16836
448461# @inline CFtransformdata(data::Char,fv,scale_factor,add_offset,time_origin,time_factor,DTcast) = CFtransform_missing(data,fv)
449462# @inline CFinvtransformdata(data::Char,fv,scale_factor,add_offset,time_origin,time_factor,DT) = CFtransform_replace_missing(data,fv)
450463
451- function Base. getindex (v:: CFVariable , indexes:: TIndices... )
452- data = parent (v)[indexes... ]
453- return CFtransformdata (data,fill_and_missing_values (v),scale_factor (v),add_offset (v),
454- time_origin (v),time_factor (v),maskingvalue (v),eltype (v))
464+ function DiskArrays. readblock! (v:: CFVariable{T, N} ,
465+ aout,
466+ indexes:: Vararg{OrdinalRange, N} ) where {T, N}
467+
468+ parent_var = parent (v)
469+ data = similar (aout, eltype (parent_var))
470+ DiskArrays. readblock! (parent_var, data, indexes... )
471+
472+ CFtransformdata! (aout, data,fill_and_missing_values (v),scale_factor (v),add_offset (v),
473+ time_origin (v),time_factor (v),maskingvalue (v))
474+
475+
476+ return nothing
455477end
456478
457- function Base. setindex! (v:: CFVariable ,data:: Array{Missing,N} ,indexes:: TIndices... ) where N
458- parent (v)[indexes... ] = fill (fillvalue (v),size (data))
479+
480+ function DiskArrays. writeblock! (v:: CFVariable{T, N} , data:: Array{Missing,N} , indexes:: Vararg{OrdinalRange, N} ) where {T, N}
481+ parent (v)[indexes... ] .= fillvalue (v)
459482end
460483
461- function Base . setindex ! (v:: CFVariable , data:: Missing ,indexes:: TIndices... )
462- parent (v)[indexes... ] = fillvalue (v)
484+ function DiskArrays . writeblock ! (v:: CFVariable{T, N} , data:: Missing , indexes:: Vararg{OrdinalRange, N} ) where {T, N}
485+ parent (v)[indexes... ] . = fillvalue (v)
463486end
464487
465- function Base. setindex! (v:: CFVariable ,data:: Union{T,Array{T}} ,indexes:: TIndices... ) where T <: Union{AbstractCFDateTime,DateTime,Missing}
466488
489+ function DiskArrays. writeblock! (v:: CFVariable{T, N} , data:: Union{DT,Array{DT}} , indexes:: Vararg{OrdinalRange, N} ) where {T, N, DT <: Union{AbstractCFDateTime,DateTime,Missing} }
467490 if calendar (v) != = nothing
468491 # can throw an convertion error if calendar attribute already exists and
469492 # is incompatible with the provided data
470- parent (v)[indexes ... ] = CFinvtransformdata (
493+ data_transformed = CFinvtransformdata (
471494 data,fill_and_missing_values (v),scale_factor (v),add_offset (v),
472495 time_origin (v),time_factor (v),
473496 maskingvalue (v),
474497 eltype (parent (v)))
498+
499+ DiskArrays. writeblock! (parent (v), data_transformed, indexes... )
500+
475501 return data
476502 end
477503
478504 @error " Time units and calendar must be defined during defVar and cannot change"
479505end
480506
507+ function DiskArrays. writeblock! (v:: CFVariable{T,N} , data, indexes:: Vararg{OrdinalRange, N} ) where {T, N}
481508
482- function Base. setindex! (v:: CFVariable ,data,indexes:: TIndices... )
483- parent (v)[indexes... ] = CFinvtransformdata (
484- data,fill_and_missing_values (v),
485- scale_factor (v),add_offset (v),
486- time_origin (v),time_factor (v),
487- maskingvalue (v),
488- eltype (parent (v)))
509+ data_transformed = CFinvtransformdata (
510+ data,fill_and_missing_values (v),
511+ scale_factor (v),add_offset (v),
512+ time_origin (v),time_factor (v),
513+ maskingvalue (v),
514+ eltype (parent (v)))
489515
490- return data
516+ DiskArrays . writeblock! ( parent (v), data_transformed, indexes ... )
491517end
492518
493519
520+
494521# can be implemented overridden for faster implementation
495522function boundsParentVar (ds,varname)
496523 for vn in varnames (ds)
@@ -526,7 +553,7 @@ function _getattrib(ds,v,parentname,attribname,default)
526553 end
527554end
528555
529- function _isrelated (v1:: AbstractVariable ,v2:: AbstractVariable )
556+ function _isrelated (v1:: Union{ AbstractVariable,SubVariable} , v2:: Union{ AbstractVariable,SubVariable} )
530557 dimnames (v1) ⊆ dimnames (v2)
531558end
532559
0 commit comments