-
Notifications
You must be signed in to change notification settings - Fork 35
Closed
Labels
Description
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.