Skip to content

Commit c13ef5b

Browse files
committed
remove multirate=true argument from run! and infer it in ModelMapping
and update tests + doc
1 parent 75a96e2 commit c13ef5b

14 files changed

Lines changed: 375 additions & 113 deletions

docs/src/API/API_public.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,13 @@ Scope selection detail:
6060
```julia
6161
req_hold = OutputRequest("Leaf", :A; name=:A_hourly, process=:assim, policy=HoldLast())
6262
req_day = OutputRequest("Leaf", :A; name=:A_daily_sum, process=:assim, policy=Integrate(), clock=ClockSpec(24.0, 1.0))
63-
run!(sim, meteo; multirate=true, tracked_outputs=[req_hold, req_day], executor=SequentialEx())
63+
run!(sim, meteo; tracked_outputs=[req_hold, req_day], executor=SequentialEx())
6464
out = collect_outputs(sim; sink=DataFrame)
6565

6666
# or directly:
6767
out_status, out = run!(
6868
sim,
6969
meteo;
70-
multirate=true,
7170
tracked_outputs=[req_hold, req_day],
7271
return_requested_outputs=true,
7372
)

docs/src/model_execution.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ mapping = ModelMapping(
131131
)
132132
```
133133

134-
When `multirate=true` is passed to `run!`, the runtime resolves inputs from producer temporal streams according to these policies.
134+
When the `ModelMapping` declares multirate configuration, the runtime resolves inputs from producer temporal streams according to these policies.
135135
Meteo rows are also sampled at each model clock. By default, meteo variables are aggregated from
136136
the finest weather step (for example `T` and `Rh` as weighted means, `Tmin/Tmax`, and radiation
137137
quantity aliases such as `Ri_SW_q` in MJ m-2). You can override these rules with `MeteoBindings(...)`
@@ -154,7 +154,7 @@ req = OutputRequest("Leaf", :carbon_assimilation;
154154
clock=ClockSpec(24.0, 1.0)
155155
)
156156

157-
run!(sim, meteo; multirate=true, tracked_outputs=[req], executor=SequentialEx())
157+
run!(sim, meteo; tracked_outputs=[req], executor=SequentialEx())
158158
exported = collect_outputs(sim; sink=DataFrame)
159159
```
160160

@@ -165,7 +165,6 @@ You can also return them directly from `run!`:
165165
out_status, exported = run!(
166166
sim,
167167
meteo;
168-
multirate=true,
169168
tracked_outputs=[req],
170169
return_requested_outputs=true,
171170
)

docs/src/multirate/multirate_tutorial.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,6 @@ req_plant_weekly = OutputRequest("Plant", :plant_assim_w;
173173
out_status, exported = run!(
174174
sim,
175175
meteo_hourly;
176-
multirate=true,
177176
executor=SequentialEx(),
178177
tracked_outputs=[req_leaf_hourly, req_plant_daily, req_plant_daily_T, req_plant_weekly],
179178
return_requested_outputs=true,

docs/src/planned_features.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
### Varying timesteps
66

77
Model-level varying timesteps are now available experimentally for MTG simulations
8-
through multi-rate execution (`multirate=true`) and mapping-level `ModelSpec` transforms
8+
through mapping-declared multi-rate execution and mapping-level `ModelSpec` transforms
99
such as `TimeStepModel`, `InputBindings`, `OutputRouting`, and `ScopeModel`.
1010

1111
Current remaining gaps for this area are:

src/mtg/GraphSimulation.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct GraphSimulation{T,S,U,O,V,TS,MS}
3131
outputs::Dict{String,O}
3232
outputs_index::Dict{String, Int}
3333
temporal_state::TS
34+
is_multirate::Bool
3435
end
3536

3637
function GraphSimulation(graph, mapping; nsteps=1, outputs=nothing, type_promotion=nothing, check=true, verbose=false)
@@ -47,6 +48,7 @@ get_models(g::GraphSimulation) = g.models
4748
get_model_specs(g::GraphSimulation) = g.model_specs
4849
outputs(g::GraphSimulation) = g.outputs
4950
temporal_state(g::GraphSimulation) = g.temporal_state
51+
is_multirate(g::GraphSimulation) = g.is_multirate
5052

5153
"""
5254
convert_outputs(sim_outputs::Dict{String,O} where O, sink; refvectors=false, no_value=nothing)

src/mtg/initialisation.jl

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,11 @@ function init_simulation(mtg, mapping; nsteps=1, outputs=nothing, type_promotion
315315
end
316316

317317
models = Dict(first(m) => parse_models(get_models(last(m))) for m in mapping)
318-
model_specs = Dict(first(m) => parse_model_specs(last(m)) for m in mapping)
318+
model_specs = if mapping isa ModelMapping && !isempty(mapping.info.model_specs)
319+
deepcopy(mapping.info.model_specs)
320+
else
321+
Dict(first(m) => parse_model_specs(last(m)) for m in mapping)
322+
end
319323
scale_reachability = _scale_reachability_from_mtg(mtg)
320324
infer_model_specs_configuration!(model_specs; scale_reachability=scale_reachability)
321325
validate_model_specs_configuration(model_specs)
@@ -356,5 +360,19 @@ function init_simulation(mtg, mapping; nsteps=1, outputs=nothing, type_promotion
356360

357361
outputs_index = Dict{String, Int}(s => 1 for s in keys(outputs))
358362
temporal_state = TemporalState()
359-
return (; mtg, statuses, status_templates, reverse_multiscale_mapping, vars_need_init, dependency_graph=dep_graph, models, model_specs, outputs, outputs_index, temporal_state)
363+
mapping_is_multirate = mapping isa ModelMapping ? is_multirate(mapping) : false
364+
return (;
365+
mtg,
366+
statuses,
367+
status_templates,
368+
reverse_multiscale_mapping,
369+
vars_need_init,
370+
dependency_graph=dep_graph,
371+
models,
372+
model_specs,
373+
outputs,
374+
outputs_index,
375+
temporal_state,
376+
is_multirate=mapping_is_multirate
377+
)
360378
end

0 commit comments

Comments
 (0)