@@ -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