From a2a9876e762821c52a053ad3c8fb846a41c59353 Mon Sep 17 00:00:00 2001 From: Stuart Daines Date: Sat, 4 Jan 2025 14:46:41 +0000 Subject: [PATCH] Define and test behaviour of get_data Change in behaviour (really a bugfix) for get_data for a CellSpace variable in a Domain with one cell: now returns a Vector ie spatial dimension is squeezed out (previously, returned a Vector-of-length 1 Vectors) PB.get_data(fr::FieldRecord; records=nothing, squeeze_all_single_dims=true) Get data records in raw format. Only recommended for variables with scalar data ie one value per record. `records` may be `nothing` to get all records, an `Int` to select a single record, or a range to select multiple records. If `squeeze_all_single_dims=true` (the default), if each record represents a scalar (eg a PALEO Variable with Space PB.ScalarSpace, or a PB.CellSpace variable in a Domain with a single cell), then data is returned as a Julia Vector. NB: if `records` is an Int, the single record requested is returned as a length-1 Vector. Non-scalar data (eg a non-ScalarSpace variable from a Domain with > 1 cell) is returned in internal format as a Vector-of-Vectors. --- docs/src/PALEOmodelOutput.md | 1 + src/FieldRecord.jl | 64 ++++++--- src/OutputWriters.jl | 49 ++++--- test/runfieldtests.jl | 270 ++++++++++++++++++++++++++++------- test/runoutputwritertests.jl | 2 +- 5 files changed, 290 insertions(+), 96 deletions(-) diff --git a/docs/src/PALEOmodelOutput.md b/docs/src/PALEOmodelOutput.md index bd74844..3bc395a 100644 --- a/docs/src/PALEOmodelOutput.md +++ b/docs/src/PALEOmodelOutput.md @@ -47,6 +47,7 @@ PB.has_variable(output::PALEOmodel.AbstractOutputWriter, varname::AbstractString PALEOmodel.get_array(output::PALEOmodel.AbstractOutputWriter, varname::AbstractString, allselectargs::NamedTuple; kwargs...) PB.get_field(output::PALEOmodel.AbstractOutputWriter, varname::AbstractString) PB.get_data(output::PALEOmodel.AbstractOutputWriter, varname::AbstractString; records=nothing) +PB.get_data(fr::PALEOmodel.FieldRecord; records=nothing) PB.get_mesh(output::PALEOmodel.AbstractOutputWriter, domainname::AbstractString) ``` ```@meta diff --git a/src/FieldRecord.jl b/src/FieldRecord.jl index 826dd48..1ce3512 100644 --- a/src/FieldRecord.jl +++ b/src/FieldRecord.jl @@ -230,26 +230,53 @@ function Base.copy(fr::FieldRecord{FieldData, Space, V, N, Mesh, R}) where {Fiel end """ - PB.get_data(fr::FieldRecord; records=nothing) + PB.get_data(fr::FieldRecord; records=nothing, squeeze_all_single_dims=true) -Get data records in raw format. +Get data records in raw format. Only recommended for variables with scalar data ie one value per record. `records` may be `nothing` to get all records, an `Int` to select a single record, or a range to select multiple records. + +If `squeeze_all_single_dims=true` (the default), if each record represents a scalar +(eg a PALEO Variable with Space PB.ScalarSpace, or a PB.CellSpace variable in a Domain with +a single cell), then data is returned as a Julia Vector. NB: if `records` is an Int, +the single record requested is returned as a length-1 Vector. + +Non-scalar data (eg a non-ScalarSpace variable from a Domain with > 1 cell) +is returned in internal format as a Vector-of-Vectors. """ -function PB.get_data(fr::FieldRecord; records=nothing) +function PB.get_data(fr::FieldRecord; records=nothing, squeeze_all_single_dims=true) - if isnothing(records) - data_output = fr.records - else - # bodge - fix scalar data - # if isa(records, Integer) && !isa(data_output, AbstractVector) - # data_output =[data_output] - # - if isa(records, Integer) && field_single_element(fr) - # represent a scalar as a length 1 Vector - # (a 0D Array might be more logical, but for backwards compatibility keep as a Vector) - data_output =[fr.records[records]] + # Optionally squeeze out single cell stored internally as a Vector-of-Vectors, length 1 + # (eg a CellSpace Variable in a Domain with 1 cell) + squeeze_vecvec = squeeze_all_single_dims && !isempty(fr.records) && length(first(fr.records)) == 1 + if field_single_element(fr) || squeeze_vecvec + if field_single_element(fr) + # internal format already is a Vector + records_vec = fr.records + else + # combine Vector of length 1 Vectors into a Vector + records_vec = [only(r) for r in fr.records] + end + if isnothing(records) + data_output = records_vec + else + # bodge - fix scalar data + # if isa(records, Integer) && !isa(data_output, AbstractVector) + # data_output =[data_output] + # + if isa(records, Integer) + # represent a scalar as a length 1 Vector + # (a 0D Array might be more logical, but for backwards compatibility keep as a Vector) + data_output =[records_vec[records]] + else + data_output = records_vec[records] + end + end + else + # Vector-of-Vectors - return raw data + if isnothing(records) + data_output = fr.records else data_output = fr.records[records] end @@ -467,8 +494,7 @@ function get_array( # get record indices to use ridx_to_use = select_indices[recorddimidx] - have_recorddim = !isnothing(dims_coords[recorddimidx]) - + # Non-record dimensions # read non-record coordinates, from first record selected @@ -510,7 +536,11 @@ function get_array( select_indices[i] = first(select_indices[i]) end end + # record dimension may have just been squeezed out + ridx_to_use = select_indices[recorddimidx] end + + have_recorddim = !isnothing(dims_coords[recorddimidx]) dims_coords_sq = Pair{PB.NamedDimension, Vector{FieldArray}}[dc for dc in dims_coords if !isnothing(dc)] dims_sq = [d for (d, c) in dims_coords_sq] @@ -566,7 +596,7 @@ function get_array( _fill_array_from_records(avalues, Tuple(nonrecordindicies_sq), fr.records, expand_fn, ridx_to_use, Tuple(nonrecordindicies)) else if isempty(nonrecordindicies_sq) - avalues[] .= @view expand_fn(fr.records[ridx_to_use])[nonrecordindicies...] + avalues[] = expand_fn(fr.records[ridx_to_use])[nonrecordindicies...] else avalues[nonrecordindicies_sq...] .= @view expand_fn(fr.records[ridx_to_use])[nonrecordindicies...] end diff --git a/src/OutputWriters.jl b/src/OutputWriters.jl index 5f84747..8954f22 100644 --- a/src/OutputWriters.jl +++ b/src/OutputWriters.jl @@ -148,11 +148,19 @@ Return the [`PALEOmodel.FieldRecord`](@ref) for `varname`. function PB.get_field(output::PALEOmodel.AbstractOutputWriter, varname::AbstractString) end """ - get_data(output::PALEOmodel.AbstractOutputWriter, varname; records=nothing) -> values + get_data(output::PALEOmodel.AbstractOutputWriter, varname; records=nothing, kwargs...) -> values -Get Variable `varname` raw data array, optionally restricting to `records` +Get Variable `varname` raw data array, optionally restricting to `records`. + +Equivalent to `PB.get_data(PB.get_field(output, varname); records, kwargs...)`, +see [`PB.get_data(fr::PALEOmodel.FieldRecord)`](@ref). """ -function PB.get_data(output::PALEOmodel.AbstractOutputWriter, varname::AbstractString; records=nothing) end +function PB.get_data(output::PALEOmodel.AbstractOutputWriter, varname::AbstractString; records=nothing, kwargs...) + + fr = PB.get_field(output, varname) + + return PB.get_data(fr; records, kwargs...) +end """ get_mesh(output::PALEOmodel.AbstractOutputWriter, domainname::AbstractString) -> grid::Union{AbstractMesh, Nothing} @@ -464,12 +472,12 @@ function PB.get_field(odom::OutputMemoryDomain, varname_or_varnamefull::Abstract return fr end -function PB.get_data(output::OutputMemoryDomain, varname::AbstractString; records=nothing) +function PB.get_data(odom::OutputMemoryDomain, varname::AbstractString; records=nothing, kwargs...) + @warn "get_data(odom::OutputMemoryDomain, ...) is deprecated, Domain name $(odom.name) varname $varname" + fr = PB.get_field(odom, varname) - fr = PB.get_field(output, varname) - - return PB.get_data(fr; records) -end + return PALEOmodel.get_data(fr; records, kwargs...) +end function PB.show_variables( odom::OutputMemoryDomain; @@ -495,15 +503,19 @@ end function PB.get_table( - odom::OutputMemoryDomain, varnames::Vector{<:AbstractString} = AbstractString[], + odom::OutputMemoryDomain, varnames::Vector{<:AbstractString} = AbstractString[]; + squeeze_all_single_dims=true, ) df = DataFrames.DataFrame( - [k => v.records for (k, v) in odom.data if (isempty(varnames) || string(k) in varnames)] + # [k => v.records for (k, v) in odom.data if (isempty(varnames) || string(k) in varnames)] + [vn => PB.get_data(fr; squeeze_all_single_dims) for (vn, fr) in odom.data if (isempty(varnames) || string(vn) in varnames)] ) return df end + + function PB.get_dimensions(odom::OutputMemoryDomain) spatial_dims = isnothing(odom.grid) ? PB.NamedDimension[] : PB.get_dimensions(odom.grid) return vcat(spatial_dims, odom.data_dims, odom.record_dim) @@ -597,14 +609,16 @@ function PB.get_table(output::OutputMemory, domainname::AbstractString, varnames return PB.get_table(output.domains[domainname], varnames) end -function PB.get_table(output::OutputMemory, varnamefulls::Vector{<:AbstractString}) +function PB.get_table(output::OutputMemory, varnamefulls::Vector{<:AbstractString}; + squeeze_all_single_dims=true, +) df = DataFrames.DataFrame() for varnamefull in varnamefulls vdom, varname = domain_variable_name(varnamefull) if haskey(output.domains, vdom) if PB.has_variable(output.domains[vdom], varname) - vardata = PB.get_data(output.domains[vdom], varname) + vardata = PB.get_data(output.domains[vdom], varname; squeeze_all_single_dims=true) df = DataFrames.insertcols!(df, varnamefull=>vardata) else @warn "no Variable found for $varnamefull" @@ -772,17 +786,6 @@ function PB.add_field!(output::OutputMemory, fr::PALEOmodel.FieldRecord) return PB.add_field!(output.domains[domainname], fr) end -function PB.get_data(output::OutputMemory, varnamefull::AbstractString; records=nothing) - - domainname, varname = domain_variable_name(varnamefull, defaultdomainname=nothing) - - haskey(output.domains, domainname) || - error("Variable $varnamefull not found in output: domain $(domainname) not present") - - odom = output.domains[domainname] - - return PB.get_data(odom, varname; records) -end ########################### diff --git a/test/runfieldtests.jl b/test/runfieldtests.jl index 68ac8bb..cb0ad32 100644 --- a/test/runfieldtests.jl +++ b/test/runfieldtests.jl @@ -5,7 +5,7 @@ using Logging import PALEOboxes as PB import PALEOmodel -function test_scalar_field(f::PB.Field) +#= function test_scalar_field(f::PB.Field) @test isnan(f.values[]) f.values[] = 42.0 @@ -50,26 +50,143 @@ function test_scalar_field(f::PB.Field) return nothing end - + =# @testset "Fields" begin @testset "ScalarData, ScalarSpace" begin + @info "ScalarData, ScalarSpace" f = PB.Field(PB.ScalarData, (), Float64, PB.ScalarSpace, nothing; allocatenans=true) - test_scalar_field(f) + @test isnan(f.values[]) + f.values[] = 42.0 + + fr = PALEOmodel.FieldRecord( + # (record_dim = PB.NamedDimension("records", -1), record_dim_coordinates=String[]), # mock dataset to supply record_dim + (record_dim = (name = "records",), ), # mock dataset to supply record_dim.name + f, + Dict{Symbol, Any}() + ) + + # FieldRecord with 1 record + push!(fr, f) + @test PB.get_data(fr) == [42.0] + @test PB.get_data(fr; records=1) == [42.0] + fra = PALEOmodel.get_array(fr; squeeze_all_single_dims=false) + @test size(fra.values) == (1, ) + @test fra.values == [42.0] # Vector + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 1 + @test fra_dimensions[1].name == "records" + + fra = PALEOmodel.get_array(fr; squeeze_all_single_dims=true) # should squeeze out record dim + @test size(fra.values) == () + @test fra.values == fill(42.0) # 0D Array + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 0 + + + # FieldRecord with 2 records + f.values[] = 43.0 + push!(fr, f) + @test PB.get_data(fr) == [42.0, 43.0] + @test PB.get_data(fr; records=2) == [43.0] + fra = PALEOmodel.get_array(fr; squeeze_all_single_dims=false) + @test size(fra.values) == (2, ) # + @test fra.values == [42.0, 43.0] + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 1 + @test fra_dimensions[1].name == "records" + end + + + function test_ScalarData_1cell(f::PB.Field) + @test isnan(f.values[]) + f.values[] = 42.0 + + fr = PALEOmodel.FieldRecord( + # (record_dim = PB.NamedDimension("records", -1), record_dim_coordinates=String[]), # mock dataset to supply record_dim + (record_dim = (name = "records",), ), # mock dataset to supply record_dim.name + f, + Dict{Symbol, Any}() + ) + + # FieldRecord with 1 record + push!(fr, f) + @test PB.get_data(fr) == [42.0] + @test PB.get_data(fr; records=1) == [42.0] + fra = PALEOmodel.get_array(fr; squeeze_all_single_dims=false) + @test size(fra.values) == (1, 1) + @test fra.values == [42.0;;] # 1×1 Matrix{Float64} + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 2 + @test fra_dimensions[1].name == "cells" + @test fra_dimensions[2].name == "records" + + # FieldArray, should squeeze out cells and record dim + fra = PALEOmodel.get_array(fr; squeeze_all_single_dims=true) + @test size(fra.values) == () + @test fra.values == fill(42.0) # 0D Array + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 0 + + # FieldRecord with 2 records + f.values[] = 43.0 + push!(fr, f) + @test PB.get_data(fr) == [42.0, 43.0] + @test PB.get_data(fr; records=2) == [43.0] + fra = PALEOmodel.get_array(fr; squeeze_all_single_dims=false) + @test size(fra.values) == (1, 2) + @test fra.values == [42.0 43.0] # 1×2 Matrix{Float64} + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 2 + @test fra_dimensions[1].name == "cells" + @test fra_dimensions[2].name == "records" + + # FieldArray should squeeze out cells dim + fra = PALEOmodel.get_array(fr; squeeze_all_single_dims=true) + @test size(fra.values) == (2, ) + @test fra.values == [42.0, 43.0] # Vector + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 1 + @test fra_dimensions[1].name == "records" + + # FieldArray should be zero dim + fra = PALEOmodel.get_array(fr, (cell=1, records=1)) + @test size(fra.values) == () + @test fra.values == fill(42.0) # 0D array + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 0 + + end + + @testset "ScalarData, CellSpace, no grid" begin - # check that a CellSpace Field with no grid behaves as a ScalarSpace Field + @info "ScalarData, CellSpace, no grid" f = PB.Field(PB.ScalarData, (), Float64, PB.CellSpace, nothing; allocatenans=true) - test_scalar_field(f) + test_ScalarData_1cell(f) + + end + + @testset "ScalarData, CellSpace, grid with 1 cell" begin + @info "ScalarData, CellSpace, grid with 1 cell" + # should behave identically to no grid case + + g = PB.Grids.UnstructuredVectorGrid(ncells=1) + + f = PB.Field(PB.ScalarData, (), Float64, PB.CellSpace, g; allocatenans=true) + + test_ScalarData_1cell(f) end @testset "ScalarData, CellSpace, UnstructuredColumnGrid" begin + @info "ScalarData, CellSpace, UnstructuredColumnGrid" + g = PB.Grids.UnstructuredColumnGrid(ncells=5, Icolumns=[collect(1:5)]) f = PB.Field(PB.ScalarData, (), Float64, PB.CellSpace, g; allocatenans=true) @@ -84,8 +201,9 @@ end f.values .= 43.0 push!(fr, f) - @test fr.records == [fill(42.0, 5), fill(43.0, 5)] + @test PB.get_data(fr) == [fill(42.0, 5), fill(43.0, 5)] # Vector of Vectors + @test fr[1] isa PB.Field @test fr[1].values == fill(42.0, 5) fa = PALEOmodel.get_array(fr, (column=1, )) @@ -102,38 +220,44 @@ end end @testset "ArrayScalarData, ScalarSpace" begin + @info "ArrayScalarData, ScalarSpace" + f = PB.Field(PB.ArrayScalarData, (PB.NamedDimension("test", 2), ), Float64, PB.ScalarSpace, nothing; allocatenans=true) @test isnan.(f.values) == [true, true] f.values .= [42.0, 43.0] - # fa = PALEOmodel.get_array(f) - # @test length(fa.dims) == 1 - # @test fa.dims[1].name == "test" - # @test fa.dims[1].size == 2 - - # @test fa.values == [42.0, 43.0] - - fr = PALEOmodel.FieldRecord( (record_dim = (name = "records",), ), # mock dataset to supply record_dim.name f, Dict{Symbol, Any}(), ) push!(fr, f) - @test fr.records == [[42.0, 43.0]] + @test PB.get_data(fr) == [[42.0, 43.0]] # Vector of Vectors + + # FieldArray from FieldRecord - records dim squeezed out + fra = PALEOmodel.get_array(fr) + @test size(fra.values) == (2, ) + @test fra.values == [42.0, 43.0] + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 1 + @test fra_dimensions[1].name == "test" + # FieldArray from FieldRecord - records dim not squeezed out + fra = PALEOmodel.get_array(fr; squeeze_all_single_dims=false) + @test size(fra.values) == (2, 1) + @test fra.values == [42.0 ; 43.0;;] # 2×1 Matrix{Float64} + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 2 + @test fra_dimensions[1].name == "test" + @test fra_dimensions[2].name == "records" + f.values .= [44.0, 45.0] push!(fr, f) - @test fr.records == [[42.0, 43.0], [44.0, 45.0]] + @test PB.get_data(fr) == [[42.0, 43.0], [44.0, 45.0]] # Vector of Vectors + @test PB.get_data(fr; records=2) == [44.0, 45.0] # Vector @test fr[2].values == f.values - # FieldArray from Field - # fa = PALEOmodel.get_array(f) - # @test fa.values == [44.0, 45.0] - # @test length(fa.dims) == 1 - # @test fa.dims[1].name == "test" - # FieldArray from FieldRecord fra = PALEOmodel.get_array(fr) @test fra.values == [42.0 44.0; 43.0 45.0] @@ -143,15 +267,10 @@ end @test fra_dimensions[2].name == "records" end - @testset "ArrayScalarData, CellSpace, no grid" begin - # TODO this is possibly inconsistent with (ScalarData, CellSpace, no grid), - # as Field.values here is a (1, 2) Array, not a (2,) Vector - f = PB.Field(PB.ArrayScalarData, (PB.NamedDimension("test", 2), ), Float64, PB.CellSpace, nothing; allocatenans=true) - - @test_broken size(f.values) == (2, ) # TODO should be a Vector ? - @test size(f.values) == (1, 2) - @test isnan.(f.values) == [true true] # TODO 1x2 Array or Vector ? - f.values .= [42.0 43.0] # TODO + function test_ArrayScalarData_1cell(f) + @test size(f.values) == (1, 2) # Matrix size(1, 2) + @test isnan.(f.values) == [true true] # + f.values .= [42.0 43.0] fr = PALEOmodel.FieldRecord( (record_dim = (name = "records",), ), # mock dataset to supply record_dim.name @@ -159,18 +278,23 @@ end Dict{Symbol, Any}(), ) push!(fr, f) - @test fr.records == [[42.0 43.0]] + @test PB.get_data(fr) == [[42.0 43.0]] f.values .= [44.0 45.0] + # FieldArray from FieldRecord, records dimension squeezed out + fra = PALEOmodel.get_array(fr) + @test size(fra.values) == (2,) + @test fra.values == [42.0, 43.0] + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 1 + @test fra_dimensions[1].name == "test" + @test fra_dimensions[1].size == 2 + + push!(fr, f) - @test fr.records == [[42.0 43.0], [44.0 45.0]] + @test PB.get_data(fr) == [[42.0 43.0], [44.0 45.0]] + @test PB.get_data(fr; records=2) == [44.0 45.0] @test fr[2].values == f.values - # FieldArray from Field - # fa = PALEOmodel.get_array(f) - # @test fa.values == [44.0, 45.0] - # @test length(fa.dims) == 1 - # @test fa.dims[1].name == "test" - # @test fa.dims[1].size == 2 # FieldArray from FieldRecord fra = PALEOmodel.get_array(fr) @@ -181,10 +305,59 @@ end @test fra_dimensions[1].size == 2 @test fra_dimensions[2].name == "records" @test fra_dimensions[2].size == 2 + + # FieldArray should be 1 D + fra = PALEOmodel.get_array(fr, (cell=1, records=1)) + @test size(fra.values) == (2,) + @test fra.values == [42.0, 43.0] + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 1 + @test fra_dimensions[1].name == "test" + @test fra_dimensions[1].size == 2 + + # FieldArray should be 1 D + fra = PALEOmodel.get_array(fr, (cell=1, test_isel=2)) + @test size(fra.values) == (2,) + @test fra.values == [43.0, 45.0] + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 1 + @test fra_dimensions[1].name == "records" + @test fra_dimensions[1].size == 2 + + # FieldArray should be zero dim + fra = PALEOmodel.get_array(fr, (cell=1, records=1, test_isel=2)) + @test size(fra.values) == () + @test fra.values == fill(43.0) # 0D array + fra_dimensions = PB.get_dimensions(fra) + @test length(fra_dimensions) == 0 + end + + @testset "ArrayScalarData, CellSpace, no grid" begin + @info "ArrayScalarData, CellSpace, no grid" + + # NB: Field.values here is a (1, 2) Array, not a (2,) Vector + f = PB.Field(PB.ArrayScalarData, (PB.NamedDimension("test", 2), ), Float64, PB.CellSpace, nothing; allocatenans=true) + + test_ArrayScalarData_1cell(f) end + @testset "ArrayScalarData, CellSpace, grid with 1 cell" begin + @info "ArrayScalarData, CellSpace, grid with 1 cell" + # should behave identically to no grid case + + g = PB.Grids.UnstructuredVectorGrid(ncells=1) + + # NB: Field.values here is a (1, 2) Array, not a (2,) Vector + f = PB.Field(PB.ArrayScalarData, (PB.NamedDimension("test", 2), ), Float64, PB.CellSpace, g; allocatenans=true) + + test_ArrayScalarData_1cell(f) + + end + @testset "ArrayScalarData, CellSpace, UnstructuredColumnGrid" begin + @info "ArrayScalarData, CellSpace, UnstructuredColumnGrid" + g = PB.Grids.UnstructuredColumnGrid(ncells=5, Icolumns=[collect(1:5)]) f = PB.Field(PB.ArrayScalarData, (PB.NamedDimension("test", 2), ), Float64, PB.CellSpace, g; allocatenans=true) @@ -201,25 +374,10 @@ end f.values .= 43.0 push!(fr, f) - @test fr.records == [fill(42.0, 5, 2), fill(43.0, 5, 2)] + @test PB.get_data(fr) == [fill(42.0, 5, 2), fill(43.0, 5, 2)] @test fr[1].values == fill(42.0, 5, 2) - # FieldArray from Field - # fa = PALEOmodel.get_array(f, (column=1,)) - # @test length(fa.dims) == 2 - # @test fa.dims[1].name == "z" - # @test fa.dims[2].name == "test" - # @test size(fa.values) == (5, 2) - # @test fa.values == fill(43.0, 5, 2) - - # fa = PALEOmodel.get_array(f, (column=1, cell=1)) - # @test length(fa.dims) == 1 - # @test fa.dims[1].name == "test" - # @test size(fa.values) == (2, ) - # @test fa.values == fill(43.0, 2) - - # FieldArray from FieldRecord fra = PALEOmodel.get_array(fr, (column=1)) fra_dimensions = PB.get_dimensions(fra) @@ -243,6 +401,8 @@ end @testset "copy FieldRecord" begin + @info "copy FieldRecord" + g = PB.Grids.UnstructuredColumnGrid(ncells=5, Icolumns=[collect(1:5)]) f = PB.Field(PB.ScalarData, (), Float64, PB.CellSpace, g; allocatenans=true) diff --git a/test/runoutputwritertests.jl b/test/runoutputwritertests.jl index 0db1c04..f2d5e76 100644 --- a/test/runoutputwritertests.jl +++ b/test/runoutputwritertests.jl @@ -164,7 +164,7 @@ end # add a diagnostic fr_O = PB.get_field(output, "global.O") my_diag = copy(fr_O) - my_diag.records .= -42.0 + my_diag.records .= -42.0 # TODO directly accessing records is only valid for scalar data my_diag.attributes[:var_name] = "my_diag" my_diag.attributes[:description] = "a model diagnostic calculated from global.O" PB.add_field!(diag, my_diag)