Skip to content
Snippets Groups Projects
Commit ead08443 authored by xo30xoqa's avatar xo30xoqa
Browse files

Continued work on farm model (doesn't run yet)

parent 53b9b861
Branches
No related tags found
No related merge requests found
...@@ -55,8 +55,19 @@ end ...@@ -55,8 +55,19 @@ end
## UTILITY FUNCTIONS ## UTILITY FUNCTIONS
"""
isgrassland(farmplot, model)
Classify a farmplot as grassland or not (i.e., is the landcover of >90% of its pixels grass?)
"""
function isgrassland(farmplot::FarmPlot, model::SimulationModel) function isgrassland(farmplot::FarmPlot, model::SimulationModel)
#TODO proportiongrass = count(pos -> @landcover() == grass, farmplot.pixels) / length(farmplot.pixels)
if proportiongrass > 0.9
return true
elseif proportiongrass > 0.1
@warn "Unclear classification: farm plot $(farmplot.id) has $(proportiongrass*100)% grass."
end
return false
end end
""" """
......
...@@ -3,9 +3,6 @@ ...@@ -3,9 +3,6 @@
### This file is responsible for managing the farm module(s). ### This file is responsible for managing the farm module(s).
### ###
###XXXXXXX In future, I want to expand Persefone into a proper ABM with multiple farm actors.
###XXXXXXX However, at the moment, all fields are controlled centrally -> see farm/farm.jl
""" """
Farmer Farmer
...@@ -24,11 +21,17 @@ end ...@@ -24,11 +21,17 @@ end
Update a farmer by one day. Update a farmer by one day.
""" """
function stepagent!(farmer::Farmer, model::SimulationModel) function stepagent!(farmer::Farmer, model::SimulationModel)
#TODO for f in farmer.fields
# - check each field, whether it can be harvested field = model.farmplots[f]
# - if so, harvest it and set its crop to "no growth" ctype = croptype(field)
# - [later: calculate income based on yield and annual price] if ctype.group != "semi-natural" && isharvestable(field) #TODO implement
# - if a field has been harvested, check if the next crop can be sown harvest!(field, model)
#XXX later: calculate income based on yield and annual price
(ctype.group != "grass") && @sow("no growth")
elseif cropname(field) == "no growth"
#TODO if a field has been harvested, check if the next crop can be sown
end
end
end end
""" """
...@@ -37,5 +40,59 @@ end ...@@ -37,5 +40,59 @@ end
Initialise the model with a set of farm agents. Initialise the model with a set of farm agents.
""" """
function initfarms!(model::SimulationModel) function initfarms!(model::SimulationModel)
#TODO #XXX initially, we only have one farmer controlling all fields in the region
farmer = Farmer(1, collect(1:length(model.farmplots)), 0)
model.farmers = [farmer]
setasides = findsetasides(farmer, model) #TODO implement
for field in model.farmplots
if isgrassland(field)
@sow("permanent grassland (seeded)")
elseif field.id in setasides
@sow("permanent set-aside")
else
@sow("no growth")
end
end
end
"""
findsetasides(farmer, model)
Return a vector of field IDs that this farmer should keep fallow to satisfy the configured
set-aside rules.
"""
function findsetasides(farmer::Farmer, model::SimulationModel)
@param(farm.setaside) == 0 && return []
croparea = reduce(f -> isgrassland(f) ? 0 : length(f.pixels), model.farmplots[farmer.fields]) *
@param(world.mapresolution)^2
setasidearea = 0
setasides = []
for f in farmer.fields #XXX should be sorted smallest-largest for highest efficiency
field = model.farmplots[f]
isgrassland(f) && continue
push!(setasides, f)
setasidearea += length(field.pixels)*@param(world.mapresolution)^2
if setasidearea >= croparea*@param(farm.setaside)
@debug "Farmer $(farmer.id) has set aside $(setasidearea |> ha)."
return setasides
end
end
end
"""
@sow(cropname)
Sow the named crop on the current field. Requires the variables `field` and `model`.
"""
macro sow(cropname)
:(sow!($(esc(:field)), $(esc(:model)), $(esc(cropname))))
end
"""
@harvest()
Harvest the current field. Requires the variables `field` and `model`.
"""
macro harvest()
:(harvest!($(esc(:field)), $(esc(:model))))
end end
...@@ -31,6 +31,7 @@ weatherfile = "weather.csv" # name of the weather data file in the map directory ...@@ -31,6 +31,7 @@ weatherfile = "weather.csv" # name of the weather data file in the map directory
[farm] [farm]
farmmodel = "FieldManager" # which version of the farm model to use (not yet implemented) farmmodel = "FieldManager" # which version of the farm model to use (not yet implemented)
setaside = 0.04 # proportion of farm area set aside as fallow
[nature] [nature]
#targetspecies = ["Wolpertinger", "Wyvern"] # list of target species to simulate - example species #targetspecies = ["Wolpertinger", "Wyvern"] # list of target species to simulate - example species
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment