From 6a7aa4b2e680e10d718dc4f064ea968e1f180e08 Mon Sep 17 00:00:00 2001 From: Marco Matthies <71844+marcom@users.noreply.github.com> Date: Mon, 22 Jul 2024 20:06:35 +0200 Subject: [PATCH] Introduce initcropmodel, initfields! functions for switchable crop models --- src/Persefone.jl | 1 + src/core/simulation.jl | 27 +++------------------------ src/crop/cropmodels.jl | 30 ++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 24 deletions(-) create mode 100644 src/crop/cropmodels.jl diff --git a/src/Persefone.jl b/src/Persefone.jl index eeb8ec0..ad32aef 100644 --- a/src/Persefone.jl +++ b/src/Persefone.jl @@ -144,6 +144,7 @@ include("world/landscape.jl") include("world/weather.jl") include("crop/farmplot.jl") +include("crop/cropmodels.jl") include("crop/almass.jl") include("crop/simplecrop.jl") diff --git a/src/core/simulation.jl b/src/core/simulation.jl index 0a18828..b3e4cf0 100644 --- a/src/core/simulation.jl +++ b/src/core/simulation.jl @@ -117,23 +117,9 @@ function initmodel(settings::Dict{String, Any}) settings["world.weatherfile"]), settings["core.startdate"], settings["core.enddate"]) - - # TODO: make this switching on cropmodel simpler - if settings["crop.cropmodel"] == "almass" - Tcroptype = ALMaSS.CropType - Tcropstate = ALMaSS.CropState - crops = ALMaSS.readcropparameters(settings["crop.cropfile"], - settings["crop.growthfile"]) - elseif settings["crop.cropmodel"] == "simple" - Tcroptype = SimpleCrop.CropType - Tcropstate = SimpleCrop.CropState - crops_almass = ALMaSS.readcropparameters(settings["crop.cropfile"], + crops, Tcroptype, Tcropstate = initcropmodel(settings["crop.cropmodel"], + settings["crop.cropfile"], settings["crop.growthfile"]) - crops = Dict(name => SimpleCrop.CropType(ct.name) for (name, ct) in crops_almass) - else - error("Init for crop model \"$(settings["crop.cropmodel"])\" not implemented") - end - farmers = Vector{Farmer}() farmplots = Vector{FarmPlot{Tcropstate}}() model = AgricultureModel{Tcroptype,Tcropstate}( @@ -154,14 +140,7 @@ function initmodel(settings::Dict{String, Any}) ) saveinputfiles(model) - if settings["crop.cropmodel"] == "almass" - ALMaSS.initfields!(model) - elseif settings["crop.cropmodel"] == "simple" - SimpleCrop.initfields!(model) - else - error("initfields! for crop model \"$(settings["crop.cropmodel"])\" not implemented") - end - + initfields!(model, settings["crop.cropmodel"]) initfarms!(model) initnature!(model) model diff --git a/src/crop/cropmodels.jl b/src/crop/cropmodels.jl new file mode 100644 index 0000000..6b47594 --- /dev/null +++ b/src/crop/cropmodels.jl @@ -0,0 +1,30 @@ +### Persefone.jl - a model of agricultural landscapes and ecosystems in Europe. +### +### Crop model helper functions. +### + +function initcropmodel(cropmodel::AbstractString, cropfile::AbstractString, growthfile::AbstractString) + if cropmodel == "almass" + Tcroptype = ALMaSS.CropType + Tcropstate = ALMaSS.CropState + crops = ALMaSS.readcropparameters(cropfile, growthfile) + elseif cropmodel == "simple" + Tcroptype = SimpleCrop.CropType + Tcropstate = SimpleCrop.CropState + crops_almass = ALMaSS.readcropparameters(cropfile, growthfile) + crops = Dict(name => SimpleCrop.CropType(ct.name) for (name, ct) in crops_almass) + else + error("initcropmodel: no implementation for crop model '$cropmodel'") + end + return crops, Tcroptype, Tcropstate +end + +function initfields!(model::SimulationModel, cropmodel::AbstractString) + if cropmodel == "almass" + ALMaSS.initfields!(model) + elseif cropmodel == "simple" + SimpleCrop.initfields!(model) + else + error("initfields! for crop model '$cropmodel'") + end +end -- GitLab