Skip to content

Dot-setting fails for variables with a time dimension #512

@jrising

Description

@jrising

If you try to set multiple elements of a variable, where one of the dimensions is time, you get a error from dotview. Here is a simple example:

@defcomp Simple begin
    region = Index()
    
    var = Variable(index=[time, region], unit="\$/yr")
    
    function run_timestep(p, v, d, t)
        v.var[t, :] .= 0
    end
end

model = Model()
set_dimension!(model, :time, collect(1:10))
set_dimension!(model, :region, ["Tropics", "Subtropics", "Temperates"])
add_comp!(model, Simple)
run(model)

produces the error:

ERROR: ArgumentError: invalid index: Mimi.FixedTimestep{1,1,10}(1) of type Mimi.FixedTimestep{1,1,10}
Stacktrace:
 [1] to_index(::Mimi.FixedTimestep{1,1,10}) at ./indices.jl:266
 [2] to_index(::Array{Union{Missing, Float64},2}, ::Mimi.FixedTimestep{1,1,10}) at ./indices.jl:247
 [3] to_indices at ./indices.jl:294 [inlined]
 [4] to_indices at ./indices.jl:290 [inlined]
 [5] view at ./subarray.jl:146 [inlined]
 [6] maybeview at ./views.jl:124 [inlined]
 [7] dotview at ./broadcast.jl:1074 [inlined]
 [8] dotview(::Mimi.TimestepArray{Mimi.FixedTimestep{1,1,LAST} where LAST,Union{Missing, Float64},2}, ::Mimi.FixedTimestep{1,1,10}, ::Function) at /Users/jrising/.julia/dev/Mimi/src/core/time.jl:359
 [9] run_timestep_Simple(::Mimi.ComponentInstanceParameters{NamedTuple{(),Tuple{}}}, ::Mimi.ComponentInstanceVariables{NamedTuple{(:var,),Tuple{Mimi.TimestepArray{Mimi.FixedTimestep{1,1,LAST} where LAST,Union{Missing, Float64},2}}}}, ::Mimi.DimDict, ::Mimi.FixedTimestep{1,1,10}) at /Users/jrising/.julia/dev/Mimi/src/core/defcomp.jl:7
 [10] run_timestep(::Mimi.ComponentInstance{Mimi.ComponentInstanceVariables{NamedTuple{(:var,),Tuple{Mimi.TimestepArray{Mimi.FixedTimestep{1,1,LAST} where LAST,Union{Missing, Float64},2}}}},Mimi.ComponentInstanceParameters{NamedTuple{(),Tuple{}}}}, ::Mimi.Clock{Mimi.FixedTimestep}) at /Users/jrising/.julia/dev/Mimi/src/core/instances.jl:264
 [11] _run_components(::Mimi.ModelInstance, ::Mimi.Clock{Mimi.FixedTimestep}, ::Array{Int64,1}, ::Array{Int64,1}, ::Array{Mimi.Clock{Mimi.FixedTimestep},1}) at /Users/jrising/.julia/dev/Mimi/src/core/instances.jl:277
 [12] run(::Mimi.ModelInstance, ::Int64, ::Nothing) at /Users/jrising/.julia/dev/Mimi/src/core/instances.jl:313
 [13] #run#114(::Int64, ::Nothing, ::Function, ::Model) at /Users/jrising/.julia/dev/Mimi/src/core/model.jl:399
 [14] run(::Model) at /Users/jrising/.julia/dev/Mimi/src/core/model.jl:390
 [15] top-level scope at none:0

You can do this with a variable that does not have a time dimension. It is possible to do this with a loop, but that gets messy for my use-case where I often have 4 dimensions.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions