diff --git a/Project.toml b/Project.toml index 2cf071f..e51499c 100644 --- a/Project.toml +++ b/Project.toml @@ -10,6 +10,7 @@ version = "0.2.4" CFTime = "179af706-886a-5703-950a-314cd64e0468" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +DiskArrays = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" Preferences = "21216c6a-2e73-6563-6e65-726566657250" @@ -17,4 +18,5 @@ Preferences = "21216c6a-2e73-6563-6e65-726566657250" julia = "1.6" Preferences = "1.3" DataStructures = "0.17, 0.18" +DiskArrays = "0.3" CFTime = "0.1.1" diff --git a/src/CommonDataModel.jl b/src/CommonDataModel.jl index 8cf04ef..504f841 100644 --- a/src/CommonDataModel.jl +++ b/src/CommonDataModel.jl @@ -6,6 +6,9 @@ using Printf using Preferences import Base: isopen, show, display, close using DataStructures +import DiskArrays: AbstractDiskArray, readblock!, writeblock!, haschunks, eachchunk +using DiskArrays: GridChunks, Unchunked +using DiskArrays: @implement_diskarray """ diff --git a/src/cfvariable.jl b/src/cfvariable.jl index 120e134..6828680 100644 --- a/src/cfvariable.jl +++ b/src/cfvariable.jl @@ -9,6 +9,8 @@ mutable struct CFVariable{T,N,TV,TA,TSA} <: AbstractVariable{T, N} _storage_attrib::TSA end +@implement_diskarray CFVariable + """ sz = size(var::CFVariable) @@ -384,43 +386,49 @@ end @inline CFinvtransformdata(data::Char,fv,scale_factor,add_offset,time_origin,time_factor,DT) = CFtransform_replace_missing(data,fv) -function Base.getindex(v::CFVariable, +function readblock!(v::CFVariable, aout, indexes::Union{Int,Colon,AbstractRange{<:Integer}}...) - data = v.var[indexes...] - return CFtransformdata(data,fill_and_missing_values(v),scale_factor(v),add_offset(v), + rawdata = getindex(v.var, indexes...) + aout .= CFtransformdata(rawdata,fill_and_missing_values(v),scale_factor(v),add_offset(v), time_origin(v),time_factor(v),eltype(v)) end -function Base.setindex!(v::CFVariable,data::Array{Missing,N},indexes::Union{Int,Colon,AbstractRange{<:Integer}}...) where N - v.var[indexes...] = fill(fillvalue(v),size(data)) +function writeblock!(v::CFVariable,data::Array{Missing,N},indexes::Union{Int,Colon,AbstractRange{<:Integer}}...) where N + transformed = fill(fillvalue(v), size(data)) + setindex!(v.var, transformed, indexes...) + return transformed end -function Base.setindex!(v::CFVariable,data::Missing,indexes::Union{Int,Colon,AbstractRange{<:Integer}}...) - v.var[indexes...] = fillvalue(v) +function writeblock!(v::CFVariable,data::Missing,indexes::Union{Int,Colon,AbstractRange{<:Integer}}...) + transformed = fillvalue(v) + setindex!(v.var, transformed, indexes...) + return transformed end -function Base.setindex!(v::CFVariable,data::Union{T,Array{T,N}},indexes::Union{Int,Colon,AbstractRange{<:Integer}}...) where N where T <: Union{AbstractCFDateTime,DateTime,Union{Missing,DateTime,AbstractCFDateTime}} +function writeblock!(v::CFVariable,data::Union{T,Array{T,N}},indexes::Union{Int,Colon,AbstractRange{<:Integer}}...) where N where T <: Union{AbstractCFDateTime,DateTime,Union{Missing,DateTime,AbstractCFDateTime}} if calendar(v) !== nothing # can throw an convertion error if calendar attribute already exists and # is incompatible with the provided data - v.var[indexes...] = CFinvtransformdata( + transformed = CFinvtransformdata( data,fill_and_missing_values(v),scale_factor(v),add_offset(v), time_origin(v),time_factor(v),eltype(v.var)) - return data + setindex!(v.var, transformed, indexes...) + return transformed end @error "Time units and calendar must be defined during defVar and cannot change" end -function Base.setindex!(v::CFVariable,data,indexes::Union{Int,Colon,AbstractRange{<:Integer}}...) - v.var[indexes...] = CFinvtransformdata( +function writeblock!(v::CFVariable,data,indexes::Union{Int,Colon,AbstractRange{<:Integer}}...) + transformed = CFinvtransformdata( data,fill_and_missing_values(v), scale_factor(v),add_offset(v), time_origin(v),time_factor(v),eltype(v.var)) + setindex!(v.var, transformed, indexes...) - return data + return transformed end diff --git a/src/variable.jl b/src/variable.jl index 3e35104..3e043b5 100644 --- a/src/variable.jl +++ b/src/variable.jl @@ -150,6 +150,12 @@ function dataset(v::AbstractVariable) error("unimplemented for abstract type") end +function Base.parent(var::AbstractVariable) + error("unimplemented for abstract type") +end + +eachchunk(A::AbstractVariable) = GridChunks(A, size(A)) +haschunks(A::AbstractVariable) = Unchunked() function Base.show(io::IO,v::AbstractVariable) level = get(io, :level, 0)