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