SESPES: socio-ecological systems and payment for ecosystem services model

SESPES: socio-ecological systems and payment for ecosystem services model preview image

1 collaborator

Default-person Eulalia Baulenas (Author)

Tags

evapotranspiration 

Tagged by Eulalia Baulenas 6 months ago

forest 

Tagged by Eulalia Baulenas 6 months ago

landowners 

Tagged by Eulalia Baulenas 6 months ago

Visible to everyone | Changeable by everyone
Model was written in NetLogo 6.1.1 • Viewed 82 times • Downloaded 6 times • Run 0 times
Download the 'SESPES: socio-ecological systems and payment for ecosystem services model' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


Comments and Questions

Click to Run Model

;__includes[ "social-model.nls" ] ; All together for BehavioralSpace

;; CREATE WORLD
extensions [gis]

globals [ ;; recall that 'global' variables are accessed by ALL types (patches, turtles, etc.) // they all receive the same value // sliders, choosers, etc. are all globals
  ambit-dataset ;; this stores the project data
  MCSC_R-dataset
  ;; land areas percentages
  conifers quercus shrubland waterfield no-land land-area
  ;; ECOLOGICAL INTERACTIONS
  bwater-conifer bwater-quercus ET-conifer ET-quercus
  ;; global? precipitation
  dry-forests dry-conifers dry-quercus dry-shrubland forest-mass precipitation
  ; counters
  ha-multi-total ha-multi multi-ha multi-per count-multi ha-envir-total ha-envir envir-ha envir-per count-envir ha-maxim-total
  ha-tradi-total ha-tradi tradi-ha tradi-per count-tradi ha-passi-total ha-passi passi-ha count-passi passi-per ha-optim-total
  drought-total n_mfu n_env n_tra n_pas
  ; to speed the program
  conifer-multi quercus-multi conifer-envir quercus-envir
  conifer-tradi quercus-tradi conifer-passi quercus-passi
  ;territory
  ; because "if ticks n mod = 0 [" not working
  drought-list short-conifer long-conifer short-quercus long-quercus rc-bwater re-bwater
]

;; Give an identity to forest owners (Maximizers, etc.)
breed [maximizers maximizer]
breed [optimizers optimizer]
breed [traditionalists traditionalist]
breed [passives passive]
breed [multifunctionalists multifunctionalist]
breed [environmentalists environmentalist]

patches-own [
  popu         ;; species/polygons in vector data
  landcover    ;; types
  age drought bwater managed
  belong-to id-owner
  ;   land-use  management-plan ;; used for extensions
]

turtles-own [territory forestsize]

;;#######################################

to setup
  ca
  set-current-directory "..."

  load-map
  paint-world ;; add color depending on land cover
  count-species ;; keep track of the land cover composition
  base-scenario
  ;add-land-use
  add-owners
  count-ha
  ;distribute-management-plans
  tickers

  file-close
  reset-ticks
end 

to load-map
  ;; credit to: https://stackoverflow.com/questions/33437711/extension-exception-1944553-while-applying-raster-netlogo-gis
  set MCSC_R-dataset gis:load-dataset "mcsc_raster.asc" ;; loading the vector data
  resize-world 0 gis:width-of MCSC_R-dataset - 1 0 gis:height-of MCSC_R-dataset - 1
  gis:set-world-envelope-ds gis:envelope-of MCSC_R-dataset
  gis:apply-raster MCSC_R-dataset popu
end 

to paint-world ; see Excel "Vector-excel" in folder "GIS"
   ask patches [
    if popu = 1 [ set pcolor 64      ; "pi roig"
      set landcover "conifers" ]
    if popu = 2 [ set pcolor 56      ; "matollar"
      set landcover "shrubland" ]
    if popu = 3 [ set pcolor 62      ; "pinassa"
      set landcover "conifers" ]
    if popu = 6  [ set pcolor 76     ; "pi blanc"
      set landcover "conifers" ]
    if popu = 5 [ set pcolor 52      ; "altres: roure/alzina"
      set landcover "quercus" ]
    if popu = 4 [ set pcolor 88      ; "camp o aigua"ask territory [ ; random 2 = 1, but just in case it wants to be increased // ask n-of (int (0.30 * count turtles)) turtles [die]
      set landcover "waterfield" ]
    if pcolor = black [              ; black = no map
      set landcover "no-land" ]
  ]
end 

to base-scenario
   ask patches [
     set age random (150 - 20 + 1) + 20   ;; choose a random number between 20 and 150
     set drought 0
     set managed "No" ]
   ask patches [
      if landcover = "conifers" [
        set bwater (100 - initial-ET-conifer) ]
      if landcover = "quercus" [
        set bwater (100 - initial-ET-quercus) ]
   ]
  set precipitation initial-rain
  set ET-conifer initial-ET-conifer
  set ET-quercus initial-ET-quercus
end 

to count-ha
  ; initialize global agentsets of patches by landcover (to speed up the model)
  set conifer-multi patches with [ belong-to = "multifunctionalists" and landcover = "conifers" ]
  set quercus-multi patches with [ belong-to = "multifunctionalists" and landcover = "quercus" ]
  set conifer-envir patches with [ belong-to = "environmentalists" and landcover = "conifers" ]
  set quercus-envir patches with [ belong-to = "environmentalists" and landcover = "quercus" ]
  set conifer-tradi patches with [ belong-to = "traditionalists" and landcover = "conifers" ]
  set quercus-tradi patches with [ belong-to = "traditionalists" and landcover = "quercus" ]
  set conifer-passi patches with [ belong-to = "passives" and landcover = "conifers" ]
  set quercus-passi patches with [ belong-to = "passives" and landcover = "quercus" ]

  set ha-maxim-total ( count patches with [ belong-to = "maximalists" ] )
  set ha-optim-total ( count patches with [ belong-to = "optimizers" ] )
  set ha-multi-total ( count patches with [ belong-to = "multifunctionalists" ] )
  set ha-envir-total ( count patches with [ belong-to = "environmentalists" ] )
  set ha-tradi-total ( count patches with [ belong-to = "traditionalists" ] )
  set ha-passi-total ( count patches with [ belong-to = "passives" ] )

  set drought-total ( count patches with [ drought = 1 ] )
  set n_mfu ( count multifunctionalists )
  set n_mfu ( count environmentalists )
  set n_tra ( count traditionalists )
  set n_pas ( count passives )
end 

to count-species
  ;; create a group based on each land to check all is fine (landcover = 100%, see observer in interface)
  set land-area (count patches with [ pcolor != black ])
  set conifers ((count patches with [ landcover = "conifers" ]/ land-area) * 100) ;; percentage of land area
  set quercus ((count patches with [ landcover = "quercus" ]/ land-area) * 100)
  set shrubland ((count patches with [ landcover = "shrubland" ]/ land-area) * 100)
  set waterfield ((count patches with [ landcover = "waterfield" ]/ land-area) * 100)
  set no-land ((count patches with [ landcover = "no-land" ]/ land-area) * 100)
  show conifers + quercus + shrubland + waterfield ;; Last check all OK ;
end 

to tickers ; lists set for time finishing at 150 years
   set drought-list (list 20 40 60 80 100 120 140)
   set short-conifer (list 1 15 30 45 60 75 90 105 120 135 150)
   set short-quercus (list 1 35 70 105 140)
   set long-conifer (list 1 50 100 150)
   set long-quercus (list 1 75 150)
   set rc-bwater (list 45 44 43 42 41 40 40 39 38 37 36 35)
   set re-bwater (list 20 19 18 17 16 15)
end 

to go
  ; reset-ticks --> THIS WAS THE PROBLEM, IF ON NOT RUNNING
  ;; stop model if conifers and quercus are all brown
  if ( dry-forests = 100 ) [
    stop ]
  ;; commands
  grow-old
  experience-drought
  change-blue-water
  update-landcover
  initiate-management
  update-ha
  ;update-plots // taken out for model efficiency
  tick
end 

;; distribute different ages and convert land depending on the age

to grow-old
   ask patches [
   ;; grow 1 every tick
   set age age + 1
   ]
end 

to experience-drought

  ask patches [
  if ( age > 100 ) and ( precipitation > 500 ) and ( ( landcover = "conifers" ) or ( landcover = "quercus" ) ) [
      let dice random 6
      if dice = 0 [ set pcolor brown ]
      if dice = 1 [ set landcover "shrubland"
                    set drought 1 ]
      if dice > 1 [ set age 20 ] ; before set age 10
    ]

  if ( age > 100 ) and ( precipitation < 500 ) and ( precipitation > 450 ) and ( ( landcover = "conifers" ) or ( landcover = "quercus" ) ) [
      let dice random 5
      if dice = 0 [ set pcolor brown ]
      if dice = 1 [ set drought 1
                    set landcover "shrubland" ] ; ideally: set landcover = "shrubland"
      if dice > 1 [ set age 20 ]
    ]

  if ( age > 100 ) and ( precipitation < 450 ) and ( ( landcover = "conifers" ) or ( landcover = "quercus" ) ) [
      let dice random 4
      if dice = 0 [ set pcolor brown ]
      if dice = 1 [ set landcover "shrubland"
                    set drought 1 ] ; ideally: set landcover = "shrubland"
      if dice > 1 [ set age 20 ]
    ]
  ]
end 

to change-blue-water

  ifelse climate-change
      [ set precipitation ( precipitation - 1.15 )
        set ET-conifer ( ET-conifer + 0.03 )
        set ET-quercus ( ET-quercus + 0.03 ) ] ; amount said to decrease each year due to climate change
      [ ] ; it never changes...

  ask patches with [ landcover = "conifers" and managed = "No" ] [
    set bwater ( 100 - ET-conifer ) ]
  ask patches with [ landcover = "quercus" and managed = "No" ] [
    set bwater ( 100 - ET-quercus ) ]
end 

;to add-land-use

;  ask patches [ set land-use 0 ] ; 0 = only forestry

;  ask patches with [pycor < 75] [   ; southern coordinates
;    ifelse agriculture-too?
;      [ set land-use 1] ; 1 = forestry and agriculture
;      [ set land-use 0] ; 0 = forestry
;    ]
;end

to update-landcover

  set bwater-conifer mean [bwater] of patches with [ landcover = "conifers" ]
  set bwater-quercus mean [bwater] of patches with [ landcover = "quercus" ]

  set forest-mass (count patches with [ landcover = "conifers" ] +
                   count patches with [ landcover = "quercus" ] +
                   count patches with [ landcover = "shrubland" ])

  set dry-conifers ( count patches with [ pcolor = brown and landcover = "conifers" ]
    / forest-mass ) * 100 ;/ count patches with [ landcover = "conifers" ] ) * 100
  set dry-quercus ( count patches with [ pcolor = brown and landcover = "quercus" ]
    / forest-mass ) * 100 ;/ count patches with [ landcover = "quercus" ] ) * 100
  set dry-shrubland ( count patches with [ drought = 1 and landcover = "shrubland" ]
    / forest-mass ) * 100
  set dry-forests (( dry-conifers + dry-quercus ) / 2 )
end 

; ##############################################################################################################
; SOCIAL SUBMODEL
; Set number of forest owners in the interface

;; Create breeds based on the numbers and percentages in the interface

to add-owners
  ask patches [
    if pcolor != black and pcolor != 88 [ set belong-to nobody ]
  ]

  create-traditionalists (number-owners * (tradi / 100)) [
    set color 15
    set shape "dot"
    set size 5 ]
  ask traditionalists [
    move-to one-of patches with [ belong-to = nobody ]
    pd
    set territory patches in-radius (random 7) with [ belong-to = nobody ]
    ask territory [
      set belong-to "traditionalists"
      set id-owner myself
    ]
    set forestsize count territory
   ]

  create-multifunctionalists (number-owners * (multi / 100)) [
    set color 25
    set shape "dot"
    set size 5 ]
  ask multifunctionalists [
    move-to one-of patches with [ belong-to = nobody ]
    pd
    set territory patches in-radius (random 7) with [ belong-to = nobody ]
    ask territory [
      set belong-to "multifunctionalists"
      set id-owner myself
    ]
    set forestsize count territory
   ]

  create-environmentalists (number-owners * (envir / 100)) [
    set color 45
    set shape "dot"
    set size 5 ]
  ask environmentalists [
    move-to one-of patches with [ belong-to = nobody ]
    pd
    set territory patches in-radius (random 7) with [ belong-to = nobody ]
    ask territory [
      set belong-to "environmentalists"
      set id-owner myself
    ]
    set forestsize count territory
   ]

  create-passives (number-owners * (passi / 100)) [
    set color 125
    set shape "dot"
    set size 5 ]
  ask passives [
    carefully [ move-to one-of patches with [ belong-to = nobody ] ] [ user-message "Please, create world and add owners again" ]
    pd
    set territory patches in-radius (random 7) with [ belong-to = nobody ]
    ask territory [
      set belong-to "passives"
      set id-owner myself
        ]
    set forestsize count territory
   ; if any? patches in-radius 25 with [ belong-to = nobody ]
    ;   [ set territory patches in-radius 20 with [ belong-to = nobody ]
     ;    ask territory [
      ;       set belong-to "passives"
       ;      set id-owner myself ]]
   ]

  if maxim + optim + tradi + passi + multi + envir != 100 [ user-message "Please, make sure forest owners categories sum up to 100%" stop ]
end 

;to distribute-management-plans

  ;ask n-of ((num-of-plans / 100) * ha-tradi-total) patches with [belong-to = "traditionalists"] [ set management-plan 1 ]
  ;ask n-of ((num-of-plans / 100) * ha-multi-total) patches with [belong-to = "multifunctionalists"] [ set management-plan 1 ]
  ;ask n-of ((num-of-plans / 100) * ha-envir-total) patches with [belong-to = "environmentalists"] [ set management-plan 1 ]
  ;ask n-of ((num-of-plans / 100) * ha-passi-total) patches with [belong-to = "passives"] [ set management-plan 1 ]

  ; ask n-of ((num-of-plans / 100) * number-owners) patches with [id-owner = (random 1000)] [ set management-plan 1 ]

;end

; ##############################################################################################################
; POLICY SUBMODEL
; Each identity responds differently to the policy design

to initiate-management

  if ( dry-forests = 100 ) [
    stop ]

  ask multifunctionalists [
  ; Multifunctionlists
  ; If below cost or more ES are on = 50 years, otherwise 15 years
    (ifelse Below-cost-coverage? [ ]; [ ask territory [ manage-long-multi ] ]
            Additional-ES-goal? [ manage-long ] ;[ ask territory [ manage-long-multi ] ]
            One-time-payment? [ attrition
                                manage-short ]
            ; else command
            [ manage-short ] )
  ]

  ask environmentalists [
  ; Multifunctionlists
  ; If below cost or more ES are on = 50 years, otherwise 15 years
    (ifelse Below-cost-coverage? [ ]; [ ask territory [ manage-long-multi ] ]
            No-intermediary? [ ]
            ;Additional-ES-goal? [ manage-long ] ; not needed
            One-time-payment? [ attrition
                                manage-long ]
            ; else command
            [ manage-long ] )
  ]

  ask traditionalists [
  ; Follows neighbours
    if any? patches in-radius 5 with [managed = "Yes" and belong-to != "traditionalists"] [
       manage-short ] ; Traditionalists manage if neighbors do
  ]
end 

; For speed reasons

; COMPLETE MANAGEMENT: every 15/35 years there is forest thinning and at 50/100 there is forest cutting

to manage-short
  ; conifers are "managed" every 15-20 years / quercus every 35 (Informe DEMORGEST)
  ; old conifers are cut and new are planted (every 50 years), 30% following "Baronia Balanc Hidric"

  if member? ticks short-conifer and landcover = "conifers" [ ;  and managed = "No"
    ;ask territory with [who = myself] [ ; random 2 = 1, but just in case it wants to be increased // ask n-of (int (0.30 * count turtles)) turtles [die]
    ask n-of (int (0.3 * forestsize)) patches with [id-owner = myself] [
    set age (age - age - (50 - ticks))
    set bwater random (46 - 35 + 1) + 35 ; between 0-10% gain
    set drought 0
    set managed "Yes"
    set landcover "conifers"
    set pcolor 67 ]
  ]

  if member? ticks short-quercus and landcover = "quercus" [
    ;ask territory  [ ; random 2 = 1, but just in case it wants to be increased // ask n-of (int (0.30 * count turtles)) turtles [die]
    ask n-of (int (0.3 * forestsize)) patches with [id-owner = myself] [
    set age (age - age - (100 - ticks))
    set bwater random (21 - 15 + 1) + 15 ; between 0-5%
    set drought 0
    set managed "Yes"
    set landcover "quercus"
    set pcolor 67 ]
  ]
end 

; CLOSE-TO-NATURE MANAGEMENT (long-terms)

to manage-long

  if member? ticks long-conifer and landcover = "conifers" [
    ask n-of (int (0.15 * forestsize)) patches with [id-owner = myself] [
    set age (age - age - (50 - ticks))
    set bwater random (46 - 35 + 1) + 35 ; between 0-10% gain
    set drought 0
    set managed "Yes"
    set landcover "conifers"
    set pcolor 67 ]
  ]

  if member? ticks long-quercus and landcover = "quercus" [
    ask n-of (int (0.15 * forestsize)) patches with [id-owner = myself] [
    set age (age - age - (100 - ticks))
    set bwater random (21 - 15 + 1) + 15 ; between 0-5%
    set drought 0
    set managed "Yes"
    set landcover "quercus"
    set pcolor 67 ]
  ]
end 

to attrition

  if member? ticks short-quercus [
    let dice random 19
      if dice = 0 [ die ] ]
end 

; OUTPUT

to update-ha

   set ha-multi ( count patches with [ managed = "Yes" and belong-to = "multifunctionalists" ] )
   set multi-per ( ha-multi / ha-multi-total ) * 100
   set multi-ha ( ha-multi * 0.01 )

   set ha-envir ( count patches with [ managed = "Yes" and belong-to = "environmentalists" ] )
   set envir-per ( ha-envir / ha-envir-total ) * 100
   set envir-ha ( ha-envir * 0.01 )

   set ha-tradi ( count patches with [ managed = "Yes" and belong-to = "traditionalists" ] )
   set tradi-per ( ha-tradi / ha-tradi-total ) * 100
   set tradi-ha ( ha-tradi * 0.01 )

   set ha-passi ( count patches with [ managed = "Yes" and belong-to = "passives" ] )
   set passi-per ( ha-passi / ha-passi-total ) * 100
   set passi-ha ( ha-passi * 0.01 )
end 



;; see: https://stackoverflow.com/questions/38619289/storing-recalling-the-value-of-a-variable-in-netlogo

There are 3 versions of this model.

Uploaded by When Description Download
Eulalia Baulenas 27 days ago Calibration Download this version
Eulalia Baulenas 27 days ago Calibration of parameters Download this version
Eulalia Baulenas 6 months ago Initial upload Download this version

Attached files

File Type Description Last updated
mcsc_raster.asc extension GIS map (required to run the model) 6 months ago, by Eulalia Baulenas Download
SESPES: socio-ecological systems and payment for ecosystem services model.png preview Preview for 'SESPES: socio-ecological systems and payment for ecosystem services model' 6 months ago, by Eulalia Baulenas Download

This model does not have any ancestors.

This model does not have any descendants.