@@ -292,4 +292,153 @@ end;
292292 end
293293 end
294294 end
295- end
295+ end
296+
297+
298+
299+
300+ using PlantSimEngine
301+ # Include the example dummy processes:
302+ using PlantSimEngine. Examples
303+ using Test, Aqua
304+ using Tables, DataFrames, CSV
305+ using MultiScaleTreeGraph
306+ using PlantMeteo, Statistics
307+ using Documenter # for doctests
308+
309+ using PlantMeteo. Dates
310+ include (" helper-functions.jl" )
311+
312+
313+
314+ # These models might be worth exposing in the future ?
315+ PlantSimEngine. @process " basic_current_timestep" verbose = false
316+
317+ struct HelperCurrentTimestepModel <: AbstractBasic_Current_TimestepModel
318+ end
319+
320+ PlantSimEngine. inputs_ (:: HelperCurrentTimestepModel ) = (next_timestep= 1 ,)
321+ PlantSimEngine. outputs_ (m:: HelperCurrentTimestepModel ) = (current_timestep= 1 ,)
322+
323+ function PlantSimEngine. run! (m:: HelperCurrentTimestepModel , models, status, meteo, constants= nothing , extra= nothing )
324+ status. current_timestep = status. next_timestep
325+ end
326+
327+ PlantSimEngine. ObjectDependencyTrait (:: Type{<:HelperCurrentTimestepModel} ) = PlantSimEngine. IsObjectDependent ()
328+ PlantSimEngine. TimeStepDependencyTrait (:: Type{<:HelperCurrentTimestepModel} ) = PlantSimEngine. IsTimeStepDependent ()
329+
330+ PlantSimEngine. timestep_range_ (m:: HelperCurrentTimestepModel ) = Day (1 )
331+
332+
333+ PlantSimEngine. @process " basic_next_timestep" verbose = false
334+ struct HelperNextTimestepModel <: AbstractBasic_Next_TimestepModel
335+ end
336+
337+ PlantSimEngine. inputs_ (:: HelperNextTimestepModel ) = (current_timestep= 1 ,)
338+ PlantSimEngine. outputs_ (m:: HelperNextTimestepModel ) = (next_timestep= 1 ,)
339+
340+ function PlantSimEngine. run! (m:: HelperNextTimestepModel , models, status, meteo, constants= nothing , extra= nothing )
341+ status. next_timestep = status. current_timestep + 1
342+ end
343+
344+ PlantSimEngine. timestep_range_ (m:: HelperNextTimestepModel ) = Day (1 )
345+
346+
347+
348+
349+
350+ PlantSimEngine. @process " ToyDay" verbose = false
351+
352+ struct MyToyDayModel <: AbstractToydayModel end
353+
354+ PlantSimEngine. inputs_ (m:: MyToyDayModel ) = (a= 1 ,)
355+ PlantSimEngine. outputs_ (m:: MyToyDayModel ) = (daily_temperature= - Inf ,)
356+
357+ function PlantSimEngine. run! (m:: MyToyDayModel , models, status, meteo, constants= nothing , extra= nothing )
358+ status. daily_temperature = meteo. T
359+ end
360+
361+ PlantSimEngine. @process " ToyWeek" verbose = false
362+
363+ struct MyToyWeekModel <: AbstractToyweekModel
364+ temperature_threshold:: Float64
365+ end
366+
367+ MyToyWeekModel () = MyToyWeekModel (30.0 )
368+ function PlantSimEngine. inputs_ (:: MyToyWeekModel )
369+ (weekly_max_temperature= - Inf ,)
370+ end
371+ PlantSimEngine. outputs_ (m:: MyToyWeekModel ) = (hot = false ,)
372+
373+ function PlantSimEngine. run! (m:: MyToyWeekModel , models, status, meteo, constants= nothing , extra= nothing )
374+ status. hot = status. weekly_max_temperature > m. temperature_threshold
375+ end
376+
377+ PlantSimEngine. timestep_range_ (m:: MyToyWeekModel ) = Week (1 )
378+
379+
380+
381+ PlantSimEngine. @process " DWConnector" verbose = false
382+
383+ struct MyDwconnectorModel <: AbstractDwconnectorModel
384+ T_daily:: Array{Float64}
385+ end
386+
387+ MyDwconnectorModel () = MyDwconnectorModel (Array {Float64} (undef, 7 ))
388+
389+ function PlantSimEngine. inputs_ (:: MyDwconnectorModel )
390+ (daily_temperature= - Inf , current_timestep= 1 ,)
391+ end
392+ PlantSimEngine. outputs_ (m:: MyDwconnectorModel ) = (weekly_max_temperature = 0.0 ,)
393+
394+ function PlantSimEngine. run! (m:: MyDwconnectorModel , models, status, meteo, constants= nothing , extra= nothing )
395+ m. T_daily[1 + (status. current_timestep % 7 )] = status. daily_temperature
396+
397+ if (status. current_timestep % 7 == 1 )
398+ status. weekly_max_temperature = sum (m. T_daily)/ 7.0
399+ else
400+ status. weekly_max_temperature = 0
401+ end
402+ end
403+
404+ PlantSimEngine. timestep_range_ (m:: MyDwconnectorModel ) = Day (1 )
405+
406+
407+
408+
409+
410+ meteo_day = read_weather (joinpath (pkgdir (PlantSimEngine), " examples/meteo_day.csv" ), duration= Day)
411+
412+ m = Dict (" Default" => (
413+ MyToyDayModel (),
414+ MyToyWeekModel (),
415+ MyDwconnectorModel (),
416+ HelperNextTimestepModel (),
417+ MultiScaleModel (
418+ model= HelperCurrentTimestepModel (),
419+ mapped_variables= [PreviousTimeStep (:next_timestep ),],
420+ ),
421+ Status (a= 1 ,)))
422+
423+ to_initialize (m)
424+
425+ models_timestep = Dict (MyToyDayModel=> 1 , MyDwconnectorModel => 1 , MyToyWeekModel => 7 , HelperNextTimestepModel => 1 , HelperCurrentTimestepModel => 1 )
426+
427+ mtg = Node (MultiScaleTreeGraph. NodeMTG (" /" , " Default" , 1 , 1 ))
428+
429+ out = run! (mtg, m, meteo_day, default_timestep= 1 , model_timesteps= models_timestep)
430+
431+ @testset " Test varying timestep" begin
432+
433+
434+ @test
435+ @test
436+
437+ end
438+
439+
440+ # NOTE : replace_mapping_status_vectors_with_generated_models is assumed to have already run if used
441+ # otherwise there might be vector length conflicts with timesteps
442+ sim = @enter PlantSimEngine. GraphSimulation (mtg, m, nsteps= nothing , check= true , outputs= nothing , default_timestep= 1 , model_timesteps= models_timestep)
443+
444+ using PlantSimEngine
0 commit comments