This page was automatically generated by NetLogo 5.0.5.
The applet requires Java 5 or higher. Java must be enabled in your browser settings. Mac users must have Mac OS X 10.4 or higher. Windows and Linux users may obtain the latest Java from Oracle's Java site.
In order for this to work, this file, your model file (AgentBased Switchgrass Model.nlogo), and the files NetLogoLite.jar and NetLogoLite.jar.pack.gz must all be in the same directory. (You can copy NetLogoLite.jar and NetLogoLite.jar.pack.gz from the directory where you installed NetLogo.)
On some systems, you can test the applet locally on your computer before uploading it to a web server. It doesn't work on all systems, though, so if it doesn't work from your hard drive, please try uploading it to a web server.
You don't need to include everything in this file in your page. If you want, you can just take the HTML code beginning with <applet> and ending with </applet>, and paste it into any HTML file you want. It's even OK to put multiple <applet> tags on a single page.
If the NetLogoLite files and your model are in different directories, you must modify the archive= and value= lines in the HTML code to point to their actual locations. (For example, if you have multiple applets in different directories on the same web server, you may want to put a single copy of the NetLogoLite files in one central place and change the archive= lines of all the HTML files to point to that one central copy. This will save disk space for you and download time for your users.)
powered by NetLogo
view/download model file: AgentBased Switchgrass Model.nlogo
The case study that will be used to demonstrate the usefulness of an AB-LCA framework is the switchgrass bioenergy system. Although it has been grown in buffer strips to reduce non-point source emissions from agriculture, switchgrass is not currently cultivated as a commodity crop. In the long run, switchgrass may grow as a dedicated energy crop as envisioned by both existing bioenergy plans (e.g., EISA or state RPS) or proposed pathways such as the “90-Billion Gallon Biofuel Deployment Study” conducted by the Sandia National Laboratories and General Motors [West et al. 2009].
Switchgrass was chosen for this research effort due to a variety of reasons. First, its broad cultivation range allows it to be grown throughout the U.S. In this way, the heterogeneous nature of different policy regimes and logistical supply chains can be explored.
The model encompasses the following entities:
1. Agents
• Farmers: There are the main actors of this model. The strength of this modeling framework is the explicit use of spatially variable data, which cannot be accurately represented with at traditional LCA approach. Here, each farmer possesses various individual characteristics (e.g., age, land size, familiarity, risk aversion, etc.) that will affect their decision-making.
• Refineries (Fuel Plants): Biofuel refineries process switchgrass into ethanol, which is used as a substitute for gasoline in the transportation sector. Currently, first generation bio-refineries process corn sugars into ethanol. Second generation “advanced cellulosic” refineries have been proven in concept but have not been established on a commercial scale. The switchgrass biofuel supply chain analyzed in our case study uses these second-generation cellulosic refineries. Each refinery agent in the case study has its own operating parameters much like each farmer agent has its own growing conditions. Conversion rates (liters of fuel per tonne of switchgrass), process energy intensity, and location are all factors that vary among refineries. These values need to be set before importing the refineries into the scenario modeler.
• Co-fired Generation Plants (Electric Plants): Another agent type for the switchgrass case study is co-fired generation plant. These electricity-generating utility plants can burn dry switchgrass to heat water in a typical Rankine power cycle. Typically biomass is used to supplement a more energy dense fuel such as coal. The percentage of biomass to total fuel mass is called the co-fired percentage. Typical co-fired percentages are around 6%. The scenario modeler will analyze the emissions associated with burning biomass to produce electricity and will compare it to the fuel that it is replacing in the generation plants. Values such as heat rate, parasitic energy loss, and geographic location are set for each generation plant agent before running the scenario modeler.
A farm agent has its own state, which is updated after every simulation period of one. The state of the farm agent includes personal characteristics and potential gain from planting switchgrass. The model encompasses the following entities:
1. Agents
• Farmers: There are the main actors of this model. The strength of this modeling framework is the explicit use of spatially variable data, which cannot be accurately represented with at traditional LCA approach. Here, each farmer possesses various individual characteristics (e.g., age, land size, familiarity, risk aversion, etc.) that will affect their decision-making.
• Refineries (Fuel Plants): Biofuel refineries process switchgrass into ethanol, which is used as a substitute for gasoline in the transportation sector. Currently, first generation bio-refineries process corn sugars into ethanol. Second generation “advanced cellulosic” refineries have been proven in concept but have not been established on a commercial scale. The switchgrass biofuel supply chain analyzed in our case study uses these second-generation cellulosic refineries. Each refinery agent in the case study has its own operating parameters much like each farmer agent has its own growing conditions. Conversion rates (liters of fuel per tonne of switchgrass), process energy intensity, and location are all factors that vary among refineries. These values need to be set before importing the refineries into the scenario modeler.
• Co-fired Generation Plants (Electric Plants): Another agent type for the switchgrass case study is co-fired generation plant. These electricity-generating utility plants can burn dry switchgrass to heat water in a typical Rankine power cycle. Typically biomass is used to supplement a more energy dense fuel such as coal. The percentage of biomass to total fuel mass is called the co-fired percentage. Typical co-fired percentages are around 6%. The scenario modeler will analyze the emissions associated with burning biomass to produce electricity and will compare it to the fuel that it is replacing in the generation plants. Values such as heat rate, parasitic energy loss, and geographic location are set for each generation plant agent before running the scenario modeler.
A farm agent has its own state, which is updated after every simulation period of one. The state of the farm agent includes personal characteristics and potential gain from planting switchgrass.
Farmer agents decide at the beginning of each growing season whether to continue their previous year’s cropland allocation. The growing season is simulated and switchgrass carbon sequestration is calculated. At the end of the growing season, the model calculates farmer’s revenues and determines their profitability, and accounts for the tailpipe emissions when the fuel is eventually used. To better understand the model conceptualization, we present below the detailed model scheduling which is a description of the agent routine and their actions for every iterations, At every time step, each agent performs the following tasks in a chronological order:
CO2 emissions from each process of the life cycle of the system are calculated using life cycle inventory (LCI) data (Appendix E) from GREET model [Argonne National Laboratory 2012]. The LCI includes CO2 emissions sequestrated by switchgrass plantation, emissions generated from harvesting, transportation fuel use in logistics, power generation, and biofuel production, and emissions avoided by replacing fossil fuels or fossil fuel-based electricity.
(how to use the model, including a description of each of the items in the Interface tab)
(suggested things for the user to notice while running the model)
(suggested things for the user to try to do (move sliders, switches, etc.) with the model)
(suggested things to add or change in the Code tab to make the model more complicated, detailed, accurate, etc.)
(interesting or unusual features of NetLogo that the model uses, particularly in the Code tab; or where workarounds were needed for missing features)
(models in the NetLogo Models Library and elsewhere which are of related interest)
;;;Copyright 2013 by Najet BICHRAOUI. All rights reserved.
;;;No part of this model may be reproduced or transmitted in any form or
;;;by any means, electronic, photocopying, recording, or otherwise, without
;;;prior written permission of the author.
;;;;; SWITCHGRASS ADOPTION MODEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DATE ;; Ver. ;; By ;; Comments
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 28-10- 2013;; 001 ;; NB ;;
globals [
Price_of_base
Price_of_SG
SGPriceMem
MaxSGPrice?
MeanSGPrice?
MinSGPrice?
FieldToStorageCost
StorageToRefineryCost
FieldToRefineryCost
new_sgprice
new_basecost
average_age
average_education
SG_root
Area_planted_global
PropWithSuccessor
PropComputerUse
; Distance_to_refinery ;; Average distance between farm and fuel refinery ;;
Co2_Global
co2_pertonne_km ; Amount of CO2 equivalents emitted for transporting one tonne of switchgrass one mile
co2_growth ; Used to keep a running total of the amount of CO2 equivalents emitted (negative = sequestered) in the entire study area from switchgrass growth
co2_delivery ; Used to keep a running total of the amount of CO2 equivalents emitted in the entire study area from switchgrass delivery from farmers to plants
co2_electric_gen ; Used to keep a running total of the amount of CO2 equivalents emitted in the entire study area from switchgrass-based electricity generation
co2_fuel_gen ; Used to keep a running total of the amount of CO2 equivalents emitted in the entire study area from switchgrass-based fuel production/manufacturing
co2_fuel_burn ; Used to keep a running total of the amount of CO2 equivalents emitted in the entire study area from switchgrass-based fuel combustion
co2_per_liter_burn
co2_gasoline_TFC ;per liter
co2_corn_etoh_TFC ;per liter
co2_coal_TFC ;per MWh
co2_natgas_TFC ;per MWh
Lgas_per_Letoh
fplantegen ;MWh electricity produced by fuel plants per liter of EtOH produced
market_fuel_supply ;liters of switchgrass EtOH delivered to the market in this itteration
market_MWh_supply ;MWH of switchgrass electricity delivered to the market in this itteration
net_co2_per_liter ;CO2 emissions from conversion of biomass to fuel in tonnes per liter
Net_co2_per_tonne
year_fuel_produced ;sum of total yearly production in liters
year_fuel_transfo_co2 ;sum of total yearly emissions in tonnes
liters_per_tonne ;conversion rate in liters of EtOH per tonne of switchgrass
heat_rate ;thousand Btu per MWh
MWhper_tonne_coal ;MWh per tonne coal
MWh_per_tonne_sg ;MWh per tonne sg
tonnes_per_MWh ;tonnes of sg per MWh
net_co2_per_MWh ;CO2 emissions associated with combusting biomass in $ per MWh
year_MWh_produced ;Total annual generation in MWh
year_eplant_co2 ;Total annual CO2 emissions in tonnes
MWh_per_tonne_coal
heat_content_coal
heat_content_sg
TotHarvest ; Used as a placeholder to quantify the amount of switchgrass harvested
trade
]
;; Main agents (turtle)
breed [
Be_Farmers Be_Farmer
]
breed [ No_Be_Farmers
No_Be_Farmer
]
patches-own [
SG_yield ;; yield of SG
Base_yield ;; yield of whatever they would be planting instead of SG
Owned-by ;; which farmer owns the field (one patch = one field)
Area_to_plant? ;; for the followraing years;;boolean TRUE or FALSE;; will evolve from year to year
farm_ID]
turtles-own [
;; Economic attributes
; farm_color
Fixed_cost_peracre ;; Current FC per acre
Total_fixed_cost ;; Current TFC
Variable_cost_peracre ;; Current VC per acre
Total_variable_cost ;; Current TVC
Total_cost_peracre ;; FC per acre + VC per acre
Total_cost ;; TFC + TVC
Sales_price_SG_peracre ;; slider determined by the user in the GUI
Sales_price_Base_peracre
Current_revenues ;; Current revenues based pre-SG based on base_yield
Current_profit ;; Idem; based on current revenues
Potential_revenues ;; of planting SG ;; based on SG price
Potential_profit ;; of planting SG;; based on potential revenues
Breakeven? ;; TRUE or FALSE;; (Potential prof - Current prof) if TRUE go to next step: generate Interest Score (IS)
SG_harvested
SG_revenues
SG_profit
;; Personal attributes
age_of_farmer
ageofdeath
education
computer_use?
age_mem
successor?
risk_aversion
farm_successor?
Familiarity_with_SG ;; Index Randomly distributed (Mean 50; SD 30)
highra?
medra?
lowra?
highfa?
medfa?
lowfa?
highis?
medis?
lowis?
highEd?
medEd?
lowEd?
highPotProf?
medPotProf?
lowPotProf?
highPriceSG?
medPriceSG?
lowPriceSG?
highCost?
medCost?
lowCost?
On_the_fence?
mindchanged?
Interest_score ;; Score = Familiarity * level_of_financial_risk ;; for the first test year
Happy? ;; happy if they made a profit selling SG (revenues > 0);; On setup, happy? is FALSE for everybody
Rep?
;; Agricultural attributes
Number_of_fields_owned ;; Number of paches owned (just the number)
Farm_root ;; Center patch where my farm is located, used to color my land (contiguous patches) with the same shade
My_farm ;; group of paches owned (agentset)
Parcels_col ;; color of my parcel, used to color the rest of my land with the same color of farm_root
Acres_owned ;; number_of_field_owned * 10 acres
number_of_field_planted
Plant_SG? ;; TRUE or FALSE
Initial_Percent_of_planting ;; Random percentage up to 40% of their land
My_percent_increase ;; pseudo random percentage of increase; "proportional to profit made"
Percent_of_planting ;; Increased Initial percent of planting
SG_planted_ton
SG_harvArea
Portion_of_planting ;; Number of field that will be devoted to SG (just the number)
My_SGplant
my_SGparcel
;; Number of paches to be planted (agentset)
My_area_planted ;; Surface SG plantes in acres
harv? ;; TRUE of FALSE
CollRev? ;; TRUE of FALSE
Memory_planted ;; Record the number of field planted (list of number)
Memory_lot_planted ;; Record the number of patches planted (list agentset)
;;temp variables for troubleshotting; to be deleted when model done!;;
BE ;; list
Distance_to_refinery
TransCost
usingStorage?
Myco2_growth ; Used to keep a running total of the amount of CO2 equivalents emitted (negative = sequestered) in the entire study area from switchgrass growth
Myco2_delivery ; Used to keep a running total of the amount of CO2 equivalents emitted in the entire study area from switchgrass delivery from farmers to plants
Myco2_electric_gen ; Used to keep a running total of the amount of CO2 equivalents emitted in the entire study area from switchgrass-based electricity generation
Myco2_fuel_gen ; Used to keep a running total of the amount of CO2 equivalents emitted in the entire study area from switchgrass-based fuel production/manufacturing
Myco2_fuel_burn ; Used to keep a running total of the amount of CO2 equivalents emitted in the entire study area from switchgrass-based fuel combustion
Myyear_fuel_transfo_co2
Myyear_eplant_co2
DistFieldToRefinery
DistFieldToStorage
DistStorageToRefinery
]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;SETUP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SETUP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SETUP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to setup
;; (for this model to work with NetLogo's new plotting features,
;; __clear-all-and-reset-ticks should be replaced with clear-all at
;; the beginning of your setup procedure and reset-ticks at the end
;; of the procedure.)
;if ticks mod = 3 [go]
__clear-all-and-reset-ticks
;set snapshot-directory user-directory
setup-patches-and-create-turtles
set-farmer-attributes
set PropWithSuccessor random-normal 0.4 0.05
set PropComputerUse random-normal 0.6 0.05
set Price_of_base precision random-normal 350 50 0
set Price_of_SG precision random-normal 350 100 0
set SGPriceMem []
set Area_planted_global sum [My_area_planted] of turtles
set Co2_Global sum [Co2_total_from_SG] of turtles
set co2_pertonne_km 0.00017623926144 ; (0.00010951 miles)= (0.0094 gal diesel/tonne mile) * (25,630 lbs TFC CO2 emissions/ 1000 gal) * (1 tonne / 2200 lbs)
set co2_fuel_burn 0.001507 ;tonnes CO2 per liter ethanol, Ethanol = (789 g EtOH/L) / (46.07 g EtOH / mol EtOH) * (2 mol CO2 / mol EtOH) * (44 g CO2 / mol CO2) * (1 tonne / 1,000,000 g)
set co2_gasoline_TFC 0.00297 ;tonnes CO2 per liter http://solar.gwu.edu/index_files/Resources_files/LCA_for_PHEVs.pdf
set co2_corn_etoh_TFC 0.003 ;tonnes CO2 per liter Source
set co2_coal_TFC 1.05 ;tonnes CO2 per MWh (Meta-analysis of TFC emissions) Benjamin K. Sovacool. Valuing the greenhouse gas emissions from nuclear power: A critical survey. Energy Policy, Vol. 36, 2008, p. 2950.
set co2_natgas_TFC 0.443 ;tonnes CO2 per MWh (Meta-analysis of TFC emissions) Benjamin K. Sovacool. Valuing the greenhouse gas emissions from nuclear power: A critical survey. Energy Policy, Vol. 36, 2008, p. 2950.
; set co2delivery (co2delivery + (trade * co2pertonnemile * disttoe)) ;using the distance to the electric plant, calculate the transportation CO2 emissions and add them to the running total for co2delivery
set Lgas_per_Letoh 1.4678 ;Heat content conversion rate (One gallon of gasoline has 1.4678 x the energy content of one liter of EtOH)
set fplantegen 0.00007407 ;GREET in MWh per L EtOH ; (0.26 kWH/gal EtOH) * (1 gal EtOH / 3.78 L EtOH) * (1 MWh / 1000 kWh)
set heat_content_sg 20935 ;MJ/tonne
set heat_content_coal 20000 ;;btu per lb
set liters_per_tonne floor random-normal 320 20 ;sets the yield of fuel (in liters) that can be produced per tonne of switchgrass input (normal distribution)
set heat_rate random-normal 11.6 1 ;MJ/kWh (1.0551 * kbtu/kWh) -- Sets the heatrate of the plant
set MWh_per_tonne_coal (heat_content_coal * 2.326) / (1000 * heat_rate) ;1 btu/lb = 2.326 MJ/tonne -- Calculates the MWh produced from one tonne of coal
set MWh_per_tonne_sg (heat_content_sg / (1000 * heat_rate)) ;Calculates the MWh produced from one tnne of switchgrass
set tonnes_per_MWh (1 / MWH_per_tonne_sg)
set net_co2_per_MWh 0.946 ;tonnes CO2e per MWH = (946 g/kWh) * (1000 kWh / 1 MWh) * (1 tonne / 1,000,000 g)
set Net_co2_per_tonne -1.097 ;Source: GREET (tonnes of CO2 emitted [negative value = sequestered] per tonne of switchgrass during growth phase only). Note this value is slightly highraer than 1 due to extra carbon sequestration in the soil.
set FieldToStorageCost 1.22 ; dollars per tonne ;;http://www.extension.iastate.edu/agdm/crops/pdf/a1-22.pdf
set StorageToRefineryCost 0.2883 ;dollars per tonne;;;http://www.extension.iastate.edu/agdm/crops/pdf/a1-22.pdf
set FieldToRefineryCost 0.14 ;dollars per tonne ;;;http://www.sciencedirect.com/science/article/pii/S0960852410018006
export-data
;export-dataShort
end
to setup-patches-and-create-turtles
set-default-shape turtles "farm"
create-turtles initial-number-of-farmers
[
setxy random-pxcor random-pycor
if any? other turtles-here [ move-to one-of patches with [ not any? turtles-here ] ]
set color brown
set size 1
set label who set label-color black
set pcolor 43 + random 5
set farm_root patch-here
set parcels_col [pcolor] of farm_root
set average_age random-normal 55 5
set ageofdeath random-normal 75 5
set average_education 1 ;;post high-school
set successor? FALSE
; set Distance_to_refinery random-normal 60 40
set DistFieldToRefinery random-normal 60 20
set DistFieldToStorage random-normal 20 10
set DistStorageToRefinery random-normal 50 20
; set mindchanged? FALSE
;set computer_use? FALSE
; set average_age 35
set age_mem []
set memory_planted []
set memory_lot_planted []
;set Plant_SG? FALSE
; set harv? FALSE
; set CollRev? FALSE
; set Rep? FALSE
]
ask patches
[
set owned-by min-one-of turtles [distance myself]
set SG_yield 2.5 ;; ton per acre
set base_yield random-normal 2 0.5
set area_to_plant? FALSE
]
;; turtle owns patches it's nearest to
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;GO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to go
farmer-decision-start-point
ask turtles [ifelse learn? = TRUE [learn_from_neighbors] []
]
;if Price_shock? [shock_price]
ask turtles [if commodity_shock? [commodity_shock]]
update-attributes
update_patches
defineeffect
update_effect
update_global
;CountPlantbySGprice
;ask turtles [if Transp_Scenarios [Transportation_Scenarios]]
;exportview
;ask patches [recolor]
; export-files
;export-filesShort
;if ticks mod 10 = 0 [export-view (word "View-on-tick-" ticks ".png")]
;export-view (word "View-on-tick-" ticks ".eps")
; if record-movie?
; [update-movie]
tick
if ticks = 50 [stop]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PROCEDURES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PROCEDURES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PROCEDURES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; setting farmers attributes
to set-farmer-attributes
ask turtles
[
set age_of_farmer precision (random-normal average_age 10) 0
; set average_education 1 ;;post high-school
set education random-normal average_education 3
; ask n-of (PropComputerUse * count turtles ) turtles [ set computer_use? TRUE ]
set risk_aversion (age_of_farmer + random-normal 0.9 0.3) / 100
(if (age_of_farmer < average_age) [set risk_aversion risk_aversion - 0.1])
; if (computer_use? = TRUE) [
set familiarity_with_SG (age_of_farmer + random-normal 4 2 + 2) / 10
;]
(if (age_of_farmer < average_age) [set familiarity_with_SG familiarity_with_SG + 2])
ask n-of (PropWithSuccessor * count turtles ) turtles [ set successor? TRUE ]
set number_of_fields_owned count patches with [ owned-by = myself ]
set my_farm patches with [ owned-by = myself]
ask my_farm [set pcolor [parcels_col] of myself]
set acres_owned number_of_fields_owned * 10 ;; 6 acres per patch
set variable_cost_peracre random-normal 250 100 ;;V
set Total_variable_cost variable_cost_peracre * acres_owned
set fixed_cost_peracre random-normal 100 50 ;;;F;; per acre
set total_fixed_cost fixed_cost_peracre * acres_owned
set Total_cost_peracre precision (fixed_cost_peracre + variable_cost_peracre) 0
set Total_cost precision (total_fixed_cost + Total_variable_cost) 0
;SG;;;;
set Sales_price_SG_peracre price_of_SG;;S;; formula BEunit= F/(S-V);; $ BEdollars=BEunit*S
set Potential_revenues SG_yield * acres_owned * price_of_SG
set Potential_profit Potential_revenues - Total_cost
;;Base;;;
set Sales_price_Base_peracre price_of_base;;S;; formula BEunit= F/(S-V);; $ BEdollars=BEunit*S
set current_revenues base_yield * acres_owned * price_of_base
set Current_profit current_revenues - Total_cost
;;be;;
set BE Potential_profit - Current_profit
set initial_Percent_of_planting random-float 0.4
set my_percent_increase 1 + random-float .3
; set Distance_to_refinery random-normal 60 40
]
end
to farmer-decision-start-point
ask turtles
[
ifelse Potential_profit >= Current_Profit
[
set Breed Be_farmers set color 135; set size 1
calculate_interest_score
]
[
set Breed No_be_farmers ;set size 2
]
]
end
to calculate_interest_score
set interest_score (Familiarity_with_SG * risk_aversion)
ifelse interest_score > mean [Interest_score] of be_farmers
[
set Plant_SG? TRUE
Plant_SG ;set size 3
]
[]
end
to Plant_SG
ifelse Plant_SG? = TRUE
[
set portion_of_planting precision (number_of_fields_owned * percent_of_planting) 0
set My_SGplant n-of portion_of_planting my_farm ;; number of patches
ask My_SGplant
[
set area_to_plant? TRUE
recolor ]
set number_of_field_planted count my_SGplant with [ area_to_plant? = TRUE ];;
set My_area_planted number_of_field_planted * 10 ;; surface planted
set SG_planted_ton My_area_planted * SG_yield ;; ton planted
; recolor
set harv? TRUE
harvest_SG
]
[]
end
to harvest_SG
set co2_growth 0 ;clear previous year's growth from short-term memory variabl
set co2_growth co2_growth + (SG_planted_ton * Net_co2_per_tonne ) ;adds current farmers sequestration to the running total variable "co2growth" for all farmer
set Myco2_growth SG_planted_ton * Net_co2_per_tonne ;adds current farmers sequestration to the running total variable "co2growth" for all farmer
set SG_harvArea My_area_planted * random-normal 0.8 0.1 ;; surface acres harvested with rate loss
set SG_harvested SG_harvArea * SG_yield ;; ton harvested with rate of loss
set collRev? TRUE
set area_to_plant? FALSE
set TotHarvest sum [SG_planted_ton] of be_farmers ;calculates that year's total switchgrass harvest
recolor
Collect_revenues
; transport
Transp_Scen
end
to transport
set co2_delivery 0
; set co2delivery (co2delivery + (trade * co2pertonnemile * disttoe)) ;using the distance to the electric plant, calculate the transportation CO2 emissions and add them to the running total for co2delivery
set co2_delivery ( co2_delivery + (trade * co2_pertonne_km * Distance_to_refinery)) ;using the distance to the fuel plant, calculate the transportation CO2 emissions and add them to the running total for co2delivery
set Myco2_delivery SG_harvested * co2_pertonne_km * Distance_to_refinery
calculate_SGEnerg_production_use
end
to Transp_Scen
set co2_delivery 0
if Transp_Scenarios = "FieldtoRefinery"
[
set co2_delivery co2_delivery + (SG_harvested * co2_pertonne_km * DistFieldToRefinery)
set TransCost FieldToRefineryCost * SG_harvested * DistFieldToRefinery
set Myco2_delivery SG_harvested * co2_pertonne_km * DistFieldToRefinery
set usingStorage? false
]
if Transp_Scenarios = "FieldtoStorageandRefinery"
[
set co2_delivery co2_delivery + (SG_harvested * co2_pertonne_km * (DistFieldToStorage + DistStorageToRefinery))
set TransCost (FieldToStorageCost + StorageToRefineryCost) * SG_harvested * Distance_to_refinery
set Myco2_delivery SG_harvested * co2_pertonne_km * DistFieldToStorage + DistStorageToRefinery
set usingStorage? true
]
set Myco2_delivery SG_harvested * co2_pertonne_km * (DistFieldToStorage + DistStorageToRefinery)
calculate_SGEnerg_production_use
end
to Collect_revenues
set SG_revenues SG_harvested * price_of_SG ;; in dollars
set SG_profit precision (SG_revenues - (Total_cost_peracre * My_area_planted)) 0
set Rep? TRUE
ask be_farmers with [Rep? = TRUE] [replant?]
end
to replant?
ifelse SG_profit > 0
[set happy? TRUE]
[set happy? FALSE]
end
to learn_from_neighbors
ask be_farmers with [Plant_SG? != true]
[
set On_the_fence? TRUE
if count be_farmers in-radius influence_radius with [happy? = TRUE] > count be_farmers in-radius influence_radius with [happy? = FALSE]
[
Plant_SG; set size 2; print who print "I have changed to" print breed
set mindchanged? TRUE
]
]
end
to recolor
ifelse area_to_plant? = TRUE
[set pcolor 53 + random 5]
[set pcolor 43 + random 6]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;; script for producing fuel and electricity from the delivered switchgrass ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to calculate_SGEnerg_production_use ;
set co2_fuel_gen 0 ;clear the previous year's running total of co2 from fuel generation from memeory
set market_fuel_supply 0 ;clear the previous year's running total of fuel supplied to the market from memory
set co2_electric_gen 0 ;clear the previous year's running totatl of co2 from electricity generation from memory
set market_MWh_supply 0 ;clear the previous year's running total of electricity supplied to the market from memory
set year_fuel_produced (Total_Harvested_ton * liters_per_tonne) ;calculate the liters of fuel that will be produced this year based on the amount of switchgrass on hand
set market_fuel_supply (market_fuel_supply + year_fuel_produced) ;add that plant's annual output to the running total for the entire fuel market
set year_fuel_transfo_co2 (net_co2_per_liter * year_fuel_produced) ;calcuate the co2 produced for that particular plant during fuel production
set co2_fuel_gen (co2_fuel_gen + year_fuel_transfo_co2) ;add that plant's co2 emissions to the running total for all fuel plants
set year_MWh_produced (Total_Harvested_ton / tonnes_per_MWh ) ;calculate the MWh that will be produced this year based on the amout of switchgrass on hand
set market_MWh_supply (market_MWh_supply + year_MWh_produced) ;add that particular plant's electricty generation to the running total for the entire electric market
set year_eplant_co2 (net_co2_per_MWh * year_MWh_produced) ;calculate the co2 produced from that particular plant while generating electricity from switchgrass
set co2_electric_gen (co2_electric_gen + year_eplant_co2) ;add that plant's co2 emissions to the running total for all electric plants
set co2_fuel_burn (market_fuel_supply * co2_per_liter_burn) ;calculate the emissions from fuel combustion based on the amount of fuel produced from fuel plants. Note this assumes that all fuel produced in a year is burned in that same year.
;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;
set Myyear_fuel_transfo_co2 (net_co2_per_liter * year_fuel_produced) ;calcuate the co2 produced fo
set Myco2_fuel_gen Myyear_fuel_transfo_co2 ;add that plant's co2 emissions to the running total for all fuel plants
set Myyear_eplant_co2 (net_co2_per_MWh * year_MWh_produced) ;calculate the co2 produced from that particular plant while generating electricity from switchgrass
set Myco2_electric_gen Myyear_eplant_co2 ;add that plant's co2 emissions to the running total for all electric plants
set Myco2_fuel_burn (year_MWh_produced * co2_per_liter_burn) ;calculate the emissions from fuel combustion based on the amount of fuel produced from fuel plants. Note this assumes that all fuel produced in a year is burned in that same year.
;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;;;MY;;
end
to calculate_ffuel_production_use
set MWh_per_tonne_coal (heat_content_coal * 2.326) / (1000 * heat_rate) ;1 btu/lb = 2.326 MJ/tonne
set MWh_per_tonne_sg (heat_content_sg / (1000 * heat_rate))
set tonnes_per_MWh (1 / MWh_per_tonne_sg)
end
;script to compare the emissions from fuel and electricity produced in that year from switchgrass to an equvalent amount of fuel and elesctricity produced by other means.
;;;;;;;;;;;;;;;;;;;; Note: as written, this doesn't calculate the difference in impact associated with switching from conventional fuels to switchgrass. This just compares the co2 associated with equal amounts of energy produced
;;;;;;;;;;;;;;;;;;;; from different fuel sources. For example: if the model showed that 1000 liters of fuel were produced and 500 mWh of electricity were produced from switchgrass, this script will calculate the co2 impact from
;;;;;;;;;;;;;;;;;;;; producing conventional fuel (gasoline) with equivalent energy content to that in 1000 liters of switchgrass fuel, and also the co2 associated with producing 500 MWh of electricity from conventional sources (coal, ng, etc).
;;;;;;;;;;;;;;;;;;;; To figure out the co2 impact from utilizing switchgrass, the user will need to define a total market demand for fuel and electricity. Then this calculation section can be modified to calculate the emissions when switchgrass
;;;;;;;;;;;;;;;;;;;; provides x% of the total fuel demand, and y% of the total electricity demand (with conventional sources providing (100-x)% of the fuel and (100-y)% of the electricity demand).
to-report Total_Harvested_ton
report sum [SG_harvested] of turtles
end
to-report Total_HarvArea_acres
report sum [SG_harvArea] of turtles
end
to-report Total_planted_acres ;;acres
report sum [My_area_planted] of turtles
end
to-report Total_planted_ton ;;ton
report sum [SG_planted_ton] of turtles
end
to-report Total_SG_revenues
report sum [SG_revenues] of turtles
end
to-report Mean_SG_revenues
report mean [SG_revenues] of turtles
end
to-report Mean_age
report mean [age_of_farmer] of turtles
end
to-report Mean_Interest_score
report mean [Interest_score] of turtles
end
to-report Mean_risk_aversion
report mean [risk_aversion] of turtles
end
to-report Mean_familiarity_with_SG
report mean [familiarity_with_SG] of turtles
end
to-report Mean_My_area_planted
report mean [My_area_planted] of turtles
end
to-report Co2_total_from_SG
report co2_growth + co2_delivery + co2_fuel_gen + co2_electric_gen + co2_fuel_burn
end
to-report Co2delivery
report co2_delivery
end
to-report Co2_from_gas_and_coal
report (market_MWH_supply * co2_coal_TFC) + (market_fuel_supply * Lgas_per_Letoh * co2_gasoline_TFC)
end
to-report Co2_from_gas_and-natgas
report (market_MWH_supply * co2_natgas_TFC) + (market_fuel_supply * Lgas_per_Letoh * co2_gasoline_TFC)
end
to-report Price_of_baseBS
report Price_of_base
end
to-report Price_of_SGBS
report Price_of_SG
end
to-report Mean_my_percent_increase
report mean [my_percent_increase] of turtles
end
to-report Mean_SG_yield
report mean [SG_yield] of turtles
end
to-report Mean_percent_of_planting
report mean [percent_of_planting] of turtles
end
to-report Mean_base_yield
report mean [base_yield] of turtles
end
to-report Mean_DistFieldToRefinery
report mean [DistFieldToRefinery] of turtles
end
to-report Mean_DistFieldToStorage
report mean [DistFieldToStorage] of turtles
end
to-report Mean_DistFieldToStoragetoRefinery
report mean [DistFieldToStorage + DistStorageToRefinery] of turtles
end
to-report TOTDistFieldToRefinery
report sum [DistFieldToRefinery] of turtles
end
to-report TOTDistFieldToStorage
report sum [DistFieldToStorage] of turtles
end
to-report TOTDistFieldToStoragetoRefinery
report sum [DistFieldToStorage + DistStorageToRefinery] of turtles
end
to-report MeanAcOwned
report mean [acres_owned] of turtles
end
to-report MeanPotRev
report mean [Potential_revenues] of turtles
end
to-report MeanTotCostPerAcre
report mean [Total_cost_peracre] of turtles
end
to-report MeanTotCost
report mean [Total_cost] of turtles
end
to-report CountRepl
report count turtles with [Rep? = TRUE]
end
to-report MeanEducation
report mean [education] of turtles
end
to-report CountComputeruse
report count turtles with [computer_use? = TRUE]
end
to-report CountSuccessor
report count turtles with [successor? = TRUE]
end
to-report MeanPotProfit
report mean [Potential_profit] of turtles
end
to-report CountUserStorage
report count turtles with [usingStorage? = true]
end
to-report MeanTransCost
report mean [TransCost] of turtles
end
to-report totDistance_to_refinery
report sum [Distance_to_refinery] of turtles
end
;###################################################################################################
;###################################################################################################
to-report MeanMyco2_growth
report mean [Myco2_growth ] of turtles
end
to-report MeanMyco2_delivery
report mean [Myco2_delivery] of turtles
end
to-report MeanMyco2_electric_gen
report mean [Myco2_electric_gen] of turtles
end
to-report MeanMyco2_fuel_gen
report mean [Myco2_fuel_gen ] of turtles
end
to-report MeanMyco2_fuel_burn
report mean [Myco2_fuel_burn ] of turtles
end
to-report MeanMyyear_fuel_transfo_co2
report mean [Myyear_fuel_transfo_co2] of turtles
end
to-report MeanMyyear_eplant_co2
report mean [Myyear_eplant_co2] of turtles
end
to-report TOTMyco2_delivery
report sum [Myco2_delivery] of turtles
end
;###################################################################################################
;###################################################################################################
;
;###################################################################################################
;###################################################################################################
; for beahavior space to add
;###################################################################################################
;###################################################################################################
to-report highra
report random-normal max [risk_aversion] of turtles 0
end
to-report medra
report random-normal mean [risk_aversion] of turtles 0
end
to-report lowra
report random-normal min [risk_aversion] of turtles 0
end
to-report highfa
report random-normal max [familiarity_with_SG] of turtles 0
end
to-report medfa
report random-normal mean [familiarity_with_SG] of turtles 0
end
to-report lowfa
report random-normal min [familiarity_with_SG] of turtles 0
end
to-report highis
report random-normal max [interest_score] of turtles 0
end
to-report medis
report random-normal mean [interest_score] of turtles 0
end
to-report lowis
report random-normal min [interest_score] of turtles 0
end
;###################################################################################################
;###################################################################################################
;###################################################################################################
;###################################################################################################
; for beahavior space to add
;###################################################################################################
;###################################################################################################
;###################################################################################################
;###################################################################################################
;;education
to-report highEd
report random-normal max [education] of turtles 0
end
to-report medEd
report random-normal mean [education] of turtles 0
end
to-report lowEd
report random-normal min [education] of turtles 0
end
;###################################################################################################
;###################################################################################################
;; ECONOMIC
to-report highPotProf
report random-normal max [Potential_profit] of turtles 0
end
to-report medPotProf
report random-normal mean [Potential_profit] of turtles 0
end
to-report lowPotProf
report random-normal min [Potential_profit] of turtles 0
end
;###########################################################
to-report highPriceSG
report random-normal max [Price_of_SG] of turtles 0
end
to-report medPriceSG
report random-normal mean [Price_of_SG] of turtles 0
end
to-report lowPriceSG
report random-normal min [Price_of_SG] of turtles 0
end
;###########################################################
to-report highCost
report random-normal max [Total_cost] of turtles 0
end
to-report medCost
report random-normal mean [Total_cost] of turtles 0
end
to-report lowCost
report random-normal min [Total_cost] of turtles 0
end
;###################################################################################################
;###################################################################################################
to CountPlantbySGprice
ask be_farmers
[
ifelse plant_SG? = TRUE [
if plant_SG? != FALSE [
ifelse (Price_of_SG > mean SGPriceMem)
and (Price_of_SG <= max SGPriceMem)
[set MaxSGPrice? TRUE]
[set MaxSGPrice? FALSE]
ifelse (Price_of_SG > min SGPriceMem)
and (Price_of_SG <= mean SGPriceMem)
[set MeanSGPrice? TRUE]
[set MeanSGPrice? FALSE]
ifelse (MaxSGPrice? != TRUE) and (MeanSGPrice? != TRUE)
[set MinSGPrice? TRUE]
[set MinSGPrice? FALSE]
]
]
[]
]
end
;###################################################################################################
;###################################################################################################
to defineeffect
ask be_farmers
; with [Plant_SG? = TRUE]
[
ifelse plant_SG? = TRUE [
if plant_SG? != FALSE [
ifelse (risk_aversion > medra)
and (risk_aversion <= highra)
[set highra? TRUE]
[set highra? FALSE]
ifelse (risk_aversion > lowra)
and (risk_aversion < medra)
[set medra? TRUE]
[set medra? FALSE]
ifelse (highra? != TRUE) and (medra? != TRUE)
[set lowra? TRUE]
[set lowra? FALSE]
;###################################################################################################
ifelse (familiarity_with_SG > medfa)
and (familiarity_with_SG <= highfa)
[set highfa? TRUE]
[set highfa? FALSE]
ifelse (familiarity_with_SG > lowfa)
and (familiarity_with_SG < medfa)
[set medfa? TRUE]
[set medfa? FALSE]
ifelse (highfa? != TRUE) and (medfa? != TRUE)
[set lowfa? TRUE]
[set lowfa? FALSE]
;###################################################################################################
ifelse (Interest_score > medis)
and (Interest_score <= highis)
[set highis? TRUE]
[set highis? FALSE]
ifelse (Interest_score > lowis)
and (Interest_score < medis)
[set medis? TRUE]
[set medis? FALSE]
ifelse (highis? != TRUE) and (medis? != TRUE)
[set lowis? TRUE]
[set lowis? FALSE]
;###################################################################################################
ifelse (education > medEd)
and (education <= highEd)
[set highEd? TRUE]
[set highEd? FALSE]
ifelse (education > lowEd)
and (education < medEd)
[set medEd? TRUE]
[set medEd? FALSE]
ifelse (highEd? != TRUE) and (medEd? != TRUE)
[set lowEd? TRUE]
[set lowEd? FALSE]
;###################################################################################################
ifelse (Potential_profit > medPotProf)
and (Potential_profit <= highPotProf)
[set highPotProf? TRUE]
[set highPotProf? FALSE]
ifelse (Potential_profit > lowPotProf)
and (Potential_profit < medPotProf)
[set medPotProf? TRUE]
[set medPotProf? FALSE]
ifelse (highPotProf? != TRUE) and (medPotProf? != TRUE)
[set lowPotProf? TRUE]
[set lowPotProf? FALSE]
;###################################################################################################
ifelse (Price_of_SG > medPriceSG)
and (Price_of_SG <= highPriceSG)
[set highPriceSG? TRUE]
[set highPriceSG? FALSE]
ifelse (Price_of_SG > lowPriceSG)
and (Price_of_SG < medPriceSG)
[set medPriceSG? TRUE]
[set medPriceSG? FALSE]
ifelse (highPriceSG != TRUE) and (medPriceSG? != TRUE)
[set lowPriceSG? TRUE]
[set lowPriceSG? FALSE]
;###################################################################################################
ifelse (Total_cost > medCost)
and (Total_cost <= highCost)
[set highCost? TRUE]
[set highCost? FALSE]
ifelse (Total_cost > lowCost)
and (Total_cost < medCost)
[set medCost? TRUE]
[set medCost? FALSE]
ifelse (highCost? != TRUE) and (medCost? != TRUE)
[set lowCost? TRUE]
[set lowCost? FALSE]
]
]
[]
; ask be_farmers [
; if (highra? = TRUE) and (Plant_SG? = TRUE)
;[set PHighra? TRUE]
]
; ]
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; UPDATES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to update-attributes
ask turtles
[
;;; the Following goes up with time ;;;;;;;;;;;
set age_of_farmer precision (age_of_farmer + 1) 0
set age_mem lput age_of_farmer age_mem
set memory_planted lput My_SGplant memory_planted ;; agentset
set memory_lot_planted lput portion_of_planting memory_lot_planted
ifelse happy? = TRUE
[
ifelse SG_profit < mean [SG_profit] of turtles
[set my_percent_increase 1 + random-float .5 ;set low? TRUE
set Percent_of_planting initial_Percent_of_planting * my_percent_increase]
[set my_percent_increase 2 + random-float .5; set low? FALSE
set Percent_of_planting initial_Percent_of_planting * my_percent_increase]
]
[set Percent_of_planting initial_Percent_of_planting]
;;;; ;; death at 75 - if have a successor all attributes stay same except age, if no successor, all change
if ( age_of_farmer > ( ageofdeath * random-normal 1 0.2 ) ) and ( successor? = TRUE ) [ set age_of_farmer 45 ]
if ( age_of_farmer > ( ageofdeath * random-normal 1 0.2 ) ) and ( successor? = FALSE )
[
set age_of_farmer precision (random-normal average_age 10) 0
set risk_aversion (age_of_farmer + random-normal 0.9 0.3) / 100
(if (age_of_farmer < average_age) [set risk_aversion risk_aversion - 0.1])
; if (computer_use? = TRUE) [
set familiarity_with_SG (age_of_farmer + random-normal 4 2 + 2) / 10
;]
(if (age_of_farmer < average_age) [set familiarity_with_SG familiarity_with_SG + 2])
set education random-normal average_education 3
ifelse ( random-float 1 + 0.00001 ) > PropWithSuccessor
[set successor? FALSE ]
[set successor? TRUE ]
set number_of_fields_owned count patches with [ owned-by = myself ]
set my_farm patches with [ owned-by = myself]
ask my_farm [set pcolor [parcels_col] of myself]
set acres_owned number_of_fields_owned * 10 ;; 6 acres per patch
set variable_cost_peracre random-normal 250 100 ;;V
set Total_variable_cost variable_cost_peracre * acres_owned
set fixed_cost_peracre random-normal 100 50 ;;;F;; per acre
set total_fixed_cost fixed_cost_peracre * acres_owned
set Total_cost_peracre precision (fixed_cost_peracre + variable_cost_peracre) 0
set Total_cost precision (total_fixed_cost + Total_variable_cost) 0
;SG;;;;
set Sales_price_SG_peracre price_of_SG;;S;; formula BEunit= F/(S-V);; $ BEdollars=BEunit*S
set Potential_revenues SG_yield * acres_owned * price_of_SG
set Potential_profit Potential_revenues - Total_cost
;;Base;;;
set Sales_price_Base_peracre price_of_base;;S;; formula BEunit= F/(S-V);; $ BEdollars=BEunit*S
set current_revenues base_yield * acres_owned * price_of_base
set Current_profit current_revenues - Total_cost
;;be;;
set BE Potential_profit - Current_profit
set initial_Percent_of_planting random-float 0.4
set my_percent_increase 1 + random-float .3
; set Distance_to_refinery random-normal 60 40
]
]
end
to update_effect
ask be_farmers
; with [Plant_SG? = TRUE]
[
ifelse plant_SG? = TRUE [
if plant_SG? != FALSE [
ifelse (risk_aversion > medra)
and (risk_aversion <= highra)
[set highra? TRUE]
[set highra? FALSE]
ifelse (risk_aversion > lowra)
and (risk_aversion < medra)
[set medra? TRUE]
[set medra? FALSE]
ifelse (highra? != TRUE) and (medra? != TRUE)
[set lowra? TRUE]
[set lowra? FALSE]
;###################################################################################################
ifelse (familiarity_with_SG > medfa)
and (familiarity_with_SG <= highfa)
[set highfa? TRUE]
[set highfa? FALSE]
ifelse (familiarity_with_SG > lowfa)
and (familiarity_with_SG < medfa)
[set medfa? TRUE]
[set medfa? FALSE]
ifelse (highfa? != TRUE) and (medfa? != TRUE)
[set lowfa? TRUE]
[set lowfa? FALSE]
;###################################################################################################
ifelse (Interest_score > medis)
and (Interest_score <= highis)
[set highis? TRUE]
[set highis? FALSE]
ifelse (Interest_score > lowis)
and (Interest_score < medis)
[set medis? TRUE]
[set medis? FALSE]
ifelse (highis? != TRUE) and (medis? != TRUE)
[set lowis? TRUE]
[set lowis? FALSE]
;###################################################################################################
ifelse (education > medEd)
and (education <= highEd)
[set highEd? TRUE]
[set highEd? FALSE]
ifelse (education > lowEd)
and (education < medEd)
[set medEd? TRUE]
[set medEd? FALSE]
ifelse (highEd? != TRUE) and (medEd? != TRUE)
[set lowEd? TRUE]
[set lowEd? FALSE]
;###################################################################################################
ifelse (Potential_profit > medPotProf)
and (Potential_profit <= highPotProf)
[set highPotProf? TRUE]
[set highPotProf? FALSE]
ifelse (Potential_profit > lowPotProf)
and (Potential_profit < medPotProf)
[set medPotProf? TRUE]
[set medPotProf? FALSE]
ifelse (highPotProf? != TRUE) and (medPotProf? != TRUE)
[set lowPotProf? TRUE]
[set lowPotProf? FALSE]
;###################################################################################################
ifelse (Price_of_SG > medPriceSG)
and (Price_of_SG <= highPriceSG)
[set highPriceSG? TRUE]
[set highPriceSG? FALSE]
ifelse (Price_of_SG > lowPriceSG)
and (Price_of_SG < medPriceSG)
[set medPriceSG? TRUE]
[set medPriceSG? FALSE]
ifelse (highPriceSG != TRUE) and (medPriceSG? != TRUE)
[set lowPriceSG? TRUE]
[set lowPriceSG? FALSE]
;###################################################################################################
ifelse (Total_cost > medCost)
and (Total_cost <= highCost)
[set highCost? TRUE]
[set highCost? FALSE]
ifelse (Total_cost > lowCost)
and (Total_cost < medCost)
[set medCost? TRUE]
[set medCost? FALSE]
ifelse (highCost? != TRUE) and (medCost? != TRUE)
[set lowCost? TRUE]
[set lowCost? FALSE]
;;;;;;;;;;;;;;;;
]
]
[]
; ask be_farmers [
; if (highra? = TRUE) and (Plant_SG? = TRUE)
;[set PHighra? TRUE]
]
; ]
end
to update_patches
ask patches
[
set SG_yield 2.5 ;; ton per acre
set base_yield random-normal 2 0.5
set area_to_plant? FALSE
]
end
to update_global
set Price_of_SG precision random-normal 350 100 0
set SGPriceMem lput Price_of_SG SGPriceMem
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;SHOCKS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
to shock_price
if ticks = Price_shock_at_step
[
; Set Price_of_SG Price_of_SG * (1.2 + random-float 0.6)
Set Price_of_SG Price_of_SG * (0.2 + random-float 2)
set new_sgprice Price_of_SG
]
end
to commodity_shock
if ticks = Price_shock_at_step [
Set Total_cost_peracre Total_cost_peracre * (0.2 + random-float 2)
set new_basecost Total_cost_peracre
]
end
;;;;==============================================================================================;;;
;;;;==============================================================================================;;;
;;;;==============================================================================================;;;
; Turtles log for individual analysis with output file
to exportview
if file-exists? "TESTcombineIMAGES.eps"
[ file-delete "TESTcombineIMAGES.eps"]
file-open "TESTcombineIMAGES.eps"
;if ticks mod 10 = 0 (
;file-write
;(task [export-view (word "View-on-tick-" ticks ".png")])
;)
file-close
end
to export-data
;; If the file already exists, we begin by deleting it, otherwise
;; new data would be appended to the old contents.
if file-exists? "AgentResult.csv"
[ file-delete "AgentResult.csv"]
if ticks = 1 [create-files]
end
to create-files
;; create the file and give the first row column headings
let spacer ","
file-open "AgentResult.csv"
file-print (list
"BSRunNum" spacer
"ticks" spacer
"Who" spacer
"Breed" spacer
"TotalCostPeracre" spacer
"TotalCost" spacer
"SalesPriceSGPeracre" spacer
"SalesPriceBasePperacre" spacer
"CurrentRevenues" spacer
"CurrentProfit" spacer
"PotentialRevenues" spacer
"PotentialProfit" spacer
"SGHarvested" spacer
"SGRevenues" spacer
"SGProfit" spacer
"ageOfFarmer" spacer
"riskAversion" spacer
"FamiliarityWithSG" spacer
"highra" spacer
"medra" spacer
"lowra" spacer
"highfa" spacer
"medfa" spacer
"lowfa" spacer
"highis" spacer
"medis" spacer
"lowis" spacer
"OnTheFence" spacer
"mindchanged" spacer
"InterestScore" spacer
"Happy" spacer
"Rep" spacer
"NumberOfFieldsOwned" spacer
"AcresOwned" spacer
"NumbeOfFieldPlanted" spacer
"PlantSG" spacer
"InitialPercentOfPlanting" spacer
"MyPercentIncrease" spacer
"PercentOfPlanting" spacer
"SGHarvArea" spacer
"MyAreaPlanted" spacer
"InfRadius" spacer
"ComShock" spacer
"learn" spacer
"Priceshock" spacer
"education" spacer
"computer_use" spacer
"successor"
)
;file-newline
file-close
export-files
end
to export-files
;; write the information to the file
let spacer ","
file-open "AgentResult.csv"
ask turtles [file-print
(list
behaviorspace-run-number spacer
ticks spacer
who spacer
breed spacer
Total_cost_peracre spacer
Total_cost spacer
Sales_price_SG_peracre spacer
Sales_price_Base_peracre spacer
Current_revenues spacer
Current_profit spacer
Potential_revenues spacer
Potential_profit spacer
SG_harvested spacer
SG_revenues spacer
SG_profit spacer
age_of_farmer spacer
risk_aversion spacer
Familiarity_with_SG spacer
highra? spacer
medra? spacer
lowra? spacer
highfa? spacer
medfa? spacer
lowfa? spacer
highis? spacer
medis? spacer
lowis? spacer
On_the_fence? spacer
mindchanged? spacer
Interest_score spacer
Happy? spacer
Rep? spacer
Number_of_fields_owned spacer
Acres_owned spacer
number_of_field_planted spacer
Plant_SG? spacer
Initial_Percent_of_planting spacer
My_percent_increase spacer
Percent_of_planting spacer
SG_harvArea spacer
My_area_planted spacer
influence_radius spacer
commodity_shock? spacer
learn? spacer
Price_shock? spacer
education spacer
computer_use? spacer
successor?
)
]
file-close
end
;;;;==============================================================================================;;;
;;;;========================================= SHORT =====================================================;;;
;;;;==============================================================================================;;;
; Turtles log for individual analysis with output file
to export-dataShort
;; If the file already exists, we begin by deleting it, otherwise
;; new data would be appended to the old contents.
;if file-exists? "IndiAna7.csv"
; [ file-delete "IndiAna7.csv"]
if ticks = 1 [create-filesShort]
end
to create-filesShort
;; create the file and give the first row column headings
let spacer ","
file-open "Indi.2runsSHORT.csv"
file-print (list
"BSRunNum" spacer
"ticks" spacer
"Who" spacer
"Breed" spacer
"TotalCostPeracre" spacer
"SalesPriceSGPeracre" spacer
"SalesPriceBasePperacre" spacer
"PotentialRevenues" spacer
"SGHarvested" spacer
"SGRevenues" spacer
"ageOfFarmer" spacer
"riskAversion" spacer
"FamiliarityWithSG" spacer
"OnTheFence" spacer
"mindchanged" spacer
"InterestScore" spacer
"Happy" spacer
"Rep" spacer
"PlantSG" spacer
"InitialPercentOfPlanting" spacer
"MyPercentIncrease" spacer
"PercentOfPlanting" spacer
"MyAreaPlanted" spacer
"InfRadius" spacer
"ComShock" spacer
"learn" spacer
"Priceshock" spacer
"education" spacer
"computer_use" spacer
"successor"
)
;file-newline
file-close
export-filesShort
end
to export-filesShort
;; write the information to the file
let spacer ","
file-open "Indi.2runsSHORT.csv"
ask turtles [file-print
(list
behaviorspace-run-number spacer
ticks spacer
who spacer
breed spacer
Total_cost_peracre spacer
Sales_price_SG_peracre spacer
Sales_price_Base_peracre spacer
Potential_revenues spacer
SG_harvested spacer
SG_revenues spacer
age_of_farmer spacer
risk_aversion spacer
Familiarity_with_SG spacer
On_the_fence? spacer
mindchanged? spacer
Interest_score spacer
Happy? spacer
Rep? spacer
Plant_SG? spacer
Initial_Percent_of_planting spacer
My_percent_increase spacer
Percent_of_planting spacer
My_area_planted spacer
influence_radius spacer
commodity_shock? spacer
learn? spacer
Price_shock? spacer
education spacer
computer_use? spacer
successor?
)
]
file-close
end
;; makes a movie of the model; stops when there are 3000 turtles
;; and exports movie to a file
to make-movie
;; prompt user for movie location
user-message "First, save your new movie file (choose a name ending with .mov)"
let path user-new-file
if not is-string? path [ stop ] ;; stop if user canceled
;; run the model
setup
movie-start path
movie-grab-view
while [ count turtles < 3000 ]
[ go
movie-grab-view ]
;; export the movie
movie-close
user-message (word "Exported movie to " path)
end
to update-movie
ifelse movie-status = "No movie."
[let filename (word "insert-file-name-here.mov")
movie-start filename]
[ifelse capture-node = "entire interface"
[movie-grab-interface]
[movie-grab-view]]
end