diff --git a/BRAMS/Template/RAMSIN b/BRAMS/Template/RAMSIN index 42f6311a4..ebe7fe808 100644 --- a/BRAMS/Template/RAMSIN +++ b/BRAMS/Template/RAMSIN @@ -2129,9 +2129,10 @@ $ED2_INFO ! SLCOL_DATABASE -- If ISLCOLFLG=1, this variable specifies the path and prefix of ! ! soil colour data base. ! ! LU_DATABASE -- land-use change disturbance rates database, used only when ! - ! IANTH_DISTURB is set to 1. Fill with the path and the prefix. ! + ! IANTH_DISTURB is set to 1 or 2. Fill with the path and the ! + ! prefix. ! ! PLANTATION_FILE -- Character string for the path to the forest plantation fraction ! - ! file. This is used only when IANTH_DISTURB is set to 1 and ! + ! file. This is used only when IANTH_DISTURB is set to 1 or 2 and ! ! the user wants to simulate forest plantations. Otherwise, leave ! ! it empty (PLANTATION_FILE='') ! ! THSUMS_DATABASE -- input directory with dataset to initialise chilling-degree and ! @@ -2827,43 +2828,11 @@ $ED2_INFO ! IANTH_DISTURB -- This flag controls whether to include anthropogenic disturbances ! ! such as land clearing, abandonment, and logging. ! ! 0. No anthropogenic disturbance. ! - ! 1. Use anthropogenic disturbance dataset (ED-2.2 default when ! - ! anthropogenic disturbance is sought). ! - ! 2. Site-specific forest plantation or selective logging cycle. ! - ! (Longo et al., in prep.) (Beta) ! - ! ! - ! The following variables are used only when IANTH_DISTURB is 2. ! - ! ! - ! SL_SCALE -- This flag assumes whether the simulation scale is local or ! - ! landscape. This controls the recurrence of logging. ! - ! 0. Local. The simulation represents one logging unit. Apply ! - ! logging only once every SL_NYRS ! - ! 1. Landscape. The simulation represents a landscape. Logging ! - ! occurs every year but it is restricted to patches with age ! - ! greater than or equal to SL_NYRS ! - ! SL_YR_FIRST -- The first year to apply logging. In case IANTH_DISTURB is 2 it ! - ! must be a simulation year (i.e. between IYEARA and IYEARZ). ! - ! SL_NYRS -- This variable defines the logging cycle, in years (see variable ! - ! SL_SCALE above) ! - ! SL_PFT -- PFTs that can be harvested. ! - ! SL_PROB_HARVEST -- Logging intensity (one value for each PFT provided in SL_PFT). ! - ! Values should be between 0.0 and 1.0, with 0 meaning no ! - ! removal, and 1 removal of all trees needed to meet demands. ! - ! SL_MINDBH_HARVEST -- Minimum DBH for logging (one value for each PFT provided in ! - ! SL_PFT). ! - ! SL_BIOMASS_HARVEST -- Target biomass to be harvested in each cycle, in kgC/m2. If ! - ! zero, then all trees that meet the minimum DBH and minimum ! - ! patch age will be logged. In case you don't want logging to ! - ! occur, don't set this value to zero! Instead, set IANTH_DISTURB ! - ! to zero. ! - ! ! - ! The following variables are used when IANTH_DISTURB is 1 or 2. ! - ! ! - ! SL_SKID_REL_AREA -- area damaged by skid trails (relative to felled area). ! - ! SL_SKID_DBH_THRESH -- DBH threshold for damage caused in skid trails. ! - ! SL_SKID_S_GTHARV -- survivorship of trees with DBH > MINDBH in skid trails. ! - ! SL_SKID_S_LTHARV -- survivorship of trees with DBH < MINDBH in skid trails. ! - ! SL_FELLING_S_LTHARV -- survivorship of trees with DBH < MINDBH in felling gaps. ! + ! 1. Use anthropogenic disturbance datasets, with either mass-based ! + ! harvesting targets, or selective logging when the target is -1 ! + ! (ED-2.2 default when anthropogenic disturbance is sought). ! + ! 2. Use anthropogenic disturbance datasets, with area-based ! + ! harvesting targets (beta). ! ! ! ! Cropland variables, used when IANTH_DISTURB is 1 or 2. ! ! ! @@ -2872,18 +2841,6 @@ $ED2_INFO ! CL_FLEAF_HARVEST -- fraction of leaves that is harvested in croplands. ! !---------------------------------------------------------------------------------------! IANTH_DISTURB = 0, - SL_SCALE = 1, - SL_YR_FIRST = 2017, - SL_NYRS = 40, - SL_PFT = 2,3,4, - SL_INTENSITY = 1.0,1.0,1.0, - SL_MINDBH_HARVEST = 35.0,35.0,35.0, - SL_BIOMASS_HARVEST = 0., - SL_SKID_REL_AREA = 0.6, - SL_SKID_DBH_THRESH = 30., - SL_SKID_S_GTHARV = 1.00, - SL_SKID_S_LTHARV = 0.60, - SL_FELLING_S_LTHARV = 0.35, CL_FSEEDS_HARVEST = 0.75, CL_FSTORAGE_HARVEST = 0.0, CL_FLEAF_HARVEST = 0.0, diff --git a/BRAMS/run/RAMSIN b/BRAMS/run/RAMSIN index 260bdbd2b..e5749dfae 100644 --- a/BRAMS/run/RAMSIN +++ b/BRAMS/run/RAMSIN @@ -2147,9 +2147,10 @@ $ED2_INFO ! SLCOL_DATABASE -- If ISLCOLFLG=1, this variable specifies the path and prefix of ! ! soil colour data base. ! ! LU_DATABASE -- land-use change disturbance rates database, used only when ! - ! IANTH_DISTURB is set to 1. Fill with the path and the prefix. ! + ! IANTH_DISTURB is set to 1 or 2. Fill with the path and the ! + ! prefix. ! ! PLANTATION_FILE -- Character string for the path to the forest plantation fraction ! - ! file. This is used only when IANTH_DISTURB is set to 1 and ! + ! file. This is used only when IANTH_DISTURB is set to 1 or 2 and ! ! the user wants to simulate forest plantations. Otherwise, leave ! ! it empty (PLANTATION_FILE='') ! ! THSUMS_DATABASE -- input directory with dataset to initialise chilling-degree and ! @@ -2846,43 +2847,11 @@ $ED2_INFO ! IANTH_DISTURB -- This flag controls whether to include anthropogenic disturbances ! ! such as land clearing, abandonment, and logging. ! ! 0. No anthropogenic disturbance. ! - ! 1. Use anthropogenic disturbance dataset (ED-2.2 default when ! - ! anthropogenic disturbance is sought). ! - ! 2. Site-specific forest plantation or selective logging cycle. ! - ! (Longo et al., in prep.) (Beta) ! - ! ! - ! The following variables are used only when IANTH_DISTURB is 2. ! - ! ! - ! SL_SCALE -- This flag assumes whether the simulation scale is local or ! - ! landscape. This controls the recurrence of logging. ! - ! 0. Local. The simulation represents one logging unit. Apply ! - ! logging only once every SL_NYRS ! - ! 1. Landscape. The simulation represents a landscape. Logging ! - ! occurs every year but it is restricted to patches with age ! - ! greater than or equal to SL_NYRS ! - ! SL_YR_FIRST -- The first year to apply logging. In case IANTH_DISTURB is 2 it ! - ! must be a simulation year (i.e. between IYEARA and IYEARZ). ! - ! SL_NYRS -- This variable defines the logging cycle, in years (see variable ! - ! SL_SCALE above) ! - ! SL_PFT -- PFTs that can be harvested. ! - ! SL_PROB_HARVEST -- Logging intensity (one value for each PFT provided in SL_PFT). ! - ! Values should be between 0.0 and 1.0, with 0 meaning no ! - ! removal, and 1 removal of all trees needed to meet demands. ! - ! SL_MINDBH_HARVEST -- Minimum DBH for logging (one value for each PFT provided in ! - ! SL_PFT). ! - ! SL_BIOMASS_HARVEST -- Target biomass to be harvested in each cycle, in kgC/m2. If ! - ! zero, then all trees that meet the minimum DBH and minimum ! - ! patch age will be logged. In case you don't want logging to ! - ! occur, don't set this value to zero! Instead, set IANTH_DISTURB ! - ! to zero. ! - ! ! - ! The following variables are used when IANTH_DISTURB is 1 or 2. ! - ! ! - ! SL_SKID_REL_AREA -- area damaged by skid trails (relative to felled area). ! - ! SL_SKID_DBH_THRESH -- DBH threshold for damage caused in skid trails. ! - ! SL_SKID_S_GTHARV -- survivorship of trees with DBH > MINDBH in skid trails. ! - ! SL_SKID_S_LTHARV -- survivorship of trees with DBH < MINDBH in skid trails. ! - ! SL_FELLING_S_LTHARV -- survivorship of trees with DBH < MINDBH in felling gaps. ! + ! 1. Use anthropogenic disturbance datasets, with either mass-based ! + ! harvesting targets, or selective logging when the target is -1 ! + ! (ED-2.2 default when anthropogenic disturbance is sought). ! + ! 2. Use anthropogenic disturbance datasets, with area-based ! + ! harvesting targets (beta). ! ! ! ! Cropland variables, used when IANTH_DISTURB is 1 or 2. ! ! ! diff --git a/BRAMS/src/ed2/edcp_load_namelist.f90 b/BRAMS/src/ed2/edcp_load_namelist.f90 index d81563f18..57e848909 100644 --- a/BRAMS/src/ed2/edcp_load_namelist.f90 +++ b/BRAMS/src/ed2/edcp_load_namelist.f90 @@ -76,18 +76,6 @@ subroutine read_ednl(iunit,filename) use disturb_coms , only : include_fire & ! intent(out) , fire_parameter & ! intent(out) , ianth_disturb & ! intent(out) - , sl_scale & ! intent(out) - , sl_yr_first & ! intent(out) - , sl_nyrs & ! intent(out) - , sl_pft & ! intent(out) - , sl_prob_harvest & ! intent(out) - , sl_mindbh_harvest & ! intent(out) - , sl_biomass_harvest & ! intent(out) - , sl_skid_rel_area & ! intent(out) - , sl_skid_dbh_thresh & ! intent(out) - , sl_skid_s_gtharv & ! intent(out) - , sl_skid_s_ltharv & ! intent(out) - , sl_felling_s_ltharv & ! intent(out) , cl_fseeds_harvest & ! intent(out) , cl_fstorage_harvest & ! intent(out) , cl_fleaf_harvest & ! intent(out) @@ -263,16 +251,13 @@ subroutine read_ednl(iunit,filename) ,trait_plasticity_scheme,iddmort_scheme,cbr_scheme,ddmort_const & ,carbon_mortality_scheme,hydraulic_mortality_scheme & ,thetacrit & - ,quantum_efficiency_t,n_plant_lim,n_decomp_lim,include_fire,sl_pft & - ,sl_prob_harvest,sl_mindbh_harvest,sl_biomass_harvest & - ,sl_skid_rel_area,sl_skid_dbh_thresh,sl_skid_s_gtharv & - ,sl_skid_s_ltharv,sl_felling_s_ltharv,cl_fseeds_harvest & - ,cl_fstorage_harvest,cl_fleaf_harvest,icanturb,include_these_pft & - ,pasture_stock,agri_stock,plantation_stock,pft_1st_check,ifusion & - ,maxpatch,maxcohort,min_patch_area,treefall_disturbance_rate & - ,time2canopy,iprintpolys,npvars,printvars,pfmtstr,ipmin,ipmax & - ,imetrad,iphenys1,iphenysf,iphenyf1,iphenyff,iedcnfgf,event_file & - ,phenpath + ,quantum_efficiency_t,n_plant_lim,n_decomp_lim,include_fire & + ,ianth_disturb,cl_fseeds_harvest,cl_fstorage_harvest & + ,cl_fleaf_harvest,icanturb,include_these_pft,pasture_stock & + ,agri_stock,plantation_stock,pft_1st_check,ifusion,maxpatch & + ,maxcohort,min_patch_area,treefall_disturbance_rate,time2canopy & + ,iprintpolys,npvars,printvars,pfmtstr,ipmin,ipmax,imetrad,iphenys1 & + ,iphenysf,iphenyf1,iphenyff,iedcnfgf,event_file,phenpath !----- Initialise some database variables with a non-sense path. -----------------------! islcolflg (:) = undef_integer diff --git a/BRAMS/src/ed2/edcp_mpiutils.F90 b/BRAMS/src/ed2/edcp_mpiutils.F90 index 3399ad8e2..3b3445b65 100644 --- a/BRAMS/src/ed2/edcp_mpiutils.F90 +++ b/BRAMS/src/ed2/edcp_mpiutils.F90 @@ -152,18 +152,6 @@ subroutine masterput_ednl(mainnum) use disturb_coms , only : include_fire & ! intent(in) , fire_parameter & ! intent(in) , ianth_disturb & ! intent(in) - , sl_scale & ! intent(in) - , sl_yr_first & ! intent(in) - , sl_nyrs & ! intent(in) - , sl_pft & ! intent(in) - , sl_prob_harvest & ! intent(in) - , sl_mindbh_harvest & ! intent(in) - , sl_biomass_harvest & ! intent(in) - , sl_skid_rel_area & ! intent(in) - , sl_skid_dbh_thresh & ! intent(in) - , sl_skid_s_gtharv & ! intent(in) - , sl_skid_s_ltharv & ! intent(in) - , sl_felling_s_ltharv & ! intent(in) , cl_fseeds_harvest & ! intent(in) , cl_fstorage_harvest & ! intent(in) , cl_fleaf_harvest & ! intent(in) @@ -309,18 +297,6 @@ subroutine masterput_ednl(mainnum) call MPI_Bcast(fire_parameter,1,MPI_REAL,mainnum,MPI_COMM_WORLD,ierr) call MPI_Bcast(sm_fire,1,MPI_REAL,mainnum,MPI_COMM_WORLD,ierr) call MPI_Bcast(ianth_disturb,1,MPI_INTEGER,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_scale , 1,MPI_INTEGER,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_yr_first , 1,MPI_INTEGER,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_nyrs , 1,MPI_INTEGER,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_pft ,n_pft,MPI_INTEGER,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_prob_harvest ,n_pft,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_mindbh_harvest ,n_pft,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_biomass_harvest , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_rel_area , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_dbh_thresh , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_s_gtharv , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_s_ltharv , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_felling_s_ltharv, 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fseeds_harvest , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fstorage_harvest, 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fleaf_harvest , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) @@ -608,18 +584,6 @@ subroutine nodeget_ednl(master_num) use disturb_coms , only : include_fire & ! intent(out) , fire_parameter & ! intent(out) , ianth_disturb & ! intent(out) - , sl_scale & ! intent(out) - , sl_yr_first & ! intent(out) - , sl_nyrs & ! intent(out) - , sl_pft & ! intent(out) - , sl_prob_harvest & ! intent(out) - , sl_mindbh_harvest & ! intent(out) - , sl_biomass_harvest & ! intent(out) - , sl_skid_rel_area & ! intent(out) - , sl_skid_dbh_thresh & ! intent(out) - , sl_skid_s_gtharv & ! intent(out) - , sl_skid_s_ltharv & ! intent(out) - , sl_felling_s_ltharv & ! intent(out) , cl_fseeds_harvest & ! intent(out) , cl_fstorage_harvest & ! intent(out) , cl_fleaf_harvest & ! intent(out) @@ -766,18 +730,6 @@ subroutine nodeget_ednl(master_num) call MPI_Bcast(fire_parameter,1,MPI_REAL,master_num,MPI_COMM_WORLD,ierr) call MPI_Bcast(sm_fire,1,MPI_REAL,master_num,MPI_COMM_WORLD,ierr) call MPI_Bcast(ianth_disturb,1,MPI_INTEGER,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_scale , 1,MPI_INTEGER,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_yr_first , 1,MPI_INTEGER,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_nyrs , 1,MPI_INTEGER,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_pft ,n_pft,MPI_INTEGER,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_prob_harvest ,n_pft,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_mindbh_harvest ,n_pft,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_biomass_harvest , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_rel_area , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_dbh_thresh , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_s_gtharv , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_s_ltharv , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_felling_s_ltharv, 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fseeds_harvest , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fstorage_harvest, 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fleaf_harvest , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) diff --git a/ED/Template/Template/ED2IN b/ED/Template/Template/ED2IN index 2a6147327..84bc874d4 100644 --- a/ED/Template/Template/ED2IN +++ b/ED/Template/Template/ED2IN @@ -665,9 +665,10 @@ $ED_NL ! SLCOL_DATABASE -- If ISLCOLFLG=1, this variable specifies the path and prefix of ! ! soil colour data base. ! ! LU_DATABASE -- land-use change disturbance rates database, used only when ! - ! IANTH_DISTURB is set to 1. Fill with the path and the prefix. ! + ! IANTH_DISTURB is set to 1 or 2. Fill with the path and the ! + ! prefix. ! ! PLANTATION_FILE -- Character string for the path to the forest plantation fraction ! - ! file. This is used only when IANTH_DISTURB is set to 1 and ! + ! file. This is used only when IANTH_DISTURB is set to 1 or 2 and ! ! the user wants to simulate forest plantations. Otherwise, leave ! ! it empty (PLANTATION_FILE='') ! ! THSUMS_DATABASE -- input directory with dataset to initialise chilling-degree and ! @@ -1374,43 +1375,11 @@ $ED_NL ! IANTH_DISTURB -- This flag controls whether to include anthropogenic disturbances ! ! such as land clearing, abandonment, and logging. ! ! 0. No anthropogenic disturbance. ! - ! 1. Use anthropogenic disturbance dataset (ED-2.2 default when ! - ! anthropogenic disturbance is sought). ! - ! 2. Site-specific forest plantation or selective logging cycle. ! - ! (Longo et al., in prep.) (Beta) ! - ! ! - ! The following variables are used only when IANTH_DISTURB is 2. ! - ! ! - ! SL_SCALE -- This flag assumes whether the simulation scale is local or ! - ! landscape. This controls the recurrence of logging. ! - ! 0. Local. The simulation represents one logging unit. Apply ! - ! logging only once every SL_NYRS ! - ! 1. Landscape. The simulation represents a landscape. Logging ! - ! occurs every year but it is restricted to patches with age ! - ! greater than or equal to SL_NYRS ! - ! SL_YR_FIRST -- The first year to apply logging. In case IANTH_DISTURB is 2 it ! - ! must be a simulation year (i.e. between IYEARA and IYEARZ). ! - ! SL_NYRS -- This variable defines the logging cycle, in years (see variable ! - ! SL_SCALE above) ! - ! SL_PFT -- PFTs that can be harvested. ! - ! SL_PROB_HARVEST -- Logging intensity (one value for each PFT provided in SL_PFT). ! - ! Values should be between 0.0 and 1.0, with 0 meaning no ! - ! removal, and 1 removal of all trees needed to meet demands. ! - ! SL_MINDBH_HARVEST -- Minimum DBH for logging (one value for each PFT provided in ! - ! SL_PFT). ! - ! SL_BIOMASS_HARVEST -- Target biomass to be harvested in each cycle, in kgC/m2. If ! - ! zero, then all trees that meet the minimum DBH and minimum ! - ! patch age will be logged. In case you don't want logging to ! - ! occur, don't set this value to zero! Instead, set IANTH_DISTURB ! - ! to zero. ! - ! ! - ! The following variables are used when IANTH_DISTURB is 1 or 2. ! - ! ! - ! SL_SKID_REL_AREA -- area damaged by skid trails (relative to felled area). ! - ! SL_SKID_DBH_THRESH -- DBH threshold for damage caused in skid trails. ! - ! SL_SKID_S_GTHARV -- survivorship of trees with DBH > MINDBH in skid trails. ! - ! SL_SKID_S_LTHARV -- survivorship of trees with DBH < MINDBH in skid trails. ! - ! SL_FELLING_S_LTHARV -- survivorship of trees with DBH < MINDBH in felling gaps. ! + ! 1. Use anthropogenic disturbance datasets, with either mass-based ! + ! harvesting targets, or selective logging when the target is -1 ! + ! (ED-2.2 default when anthropogenic disturbance is sought). ! + ! 2. Use anthropogenic disturbance datasets, with area-based ! + ! harvesting targets (beta). ! ! ! ! Cropland variables, used when IANTH_DISTURB is 1 or 2. ! ! ! diff --git a/ED/run/ED2IN b/ED/run/ED2IN index 75da1c011..b7df194cd 100644 --- a/ED/run/ED2IN +++ b/ED/run/ED2IN @@ -648,9 +648,10 @@ $ED_NL ! SLCOL_DATABASE -- If ISLCOLFLG=1, this variable specifies the path and prefix of ! ! soil colour data base. ! ! LU_DATABASE -- land-use change disturbance rates database, used only when ! - ! IANTH_DISTURB is set to 1. Fill with the path and the prefix. ! + ! IANTH_DISTURB is set to 1 or 2. Fill with the path and the ! + ! prefix. ! ! PLANTATION_FILE -- Character string for the path to the forest plantation fraction ! - ! file. This is used only when IANTH_DISTURB is set to 1 and ! + ! file. This is used only when IANTH_DISTURB is set to 1 or 2 and ! ! the user wants to simulate forest plantations. Otherwise, leave ! ! it empty (PLANTATION_FILE='') ! ! THSUMS_DATABASE -- input directory with dataset to initialise chilling-degree and ! @@ -1386,43 +1387,11 @@ $ED_NL ! IANTH_DISTURB -- This flag controls whether to include anthropogenic disturbances ! ! such as land clearing, abandonment, and logging. ! ! 0. No anthropogenic disturbance. ! - ! 1. Use anthropogenic disturbance dataset (ED-2.2 default when ! - ! anthropogenic disturbance is sought). ! - ! 2. Site-specific forest plantation or selective logging cycle. ! - ! (Longo et al., in prep.) (Beta) ! - ! ! - ! The following variables are used only when IANTH_DISTURB is 2. ! - ! ! - ! SL_SCALE -- This flag assumes whether the simulation scale is local or ! - ! landscape. This controls the recurrence of logging. ! - ! 0. Local. The simulation represents one logging unit. Apply ! - ! logging only once every SL_NYRS ! - ! 1. Landscape. The simulation represents a landscape. Logging ! - ! occurs every year but it is restricted to patches with age ! - ! greater than or equal to SL_NYRS ! - ! SL_YR_FIRST -- The first year to apply logging. In case IANTH_DISTURB is 2 it ! - ! must be a simulation year (i.e. between IYEARA and IYEARZ). ! - ! SL_NYRS -- This variable defines the logging cycle, in years (see variable ! - ! SL_SCALE above) ! - ! SL_PFT -- PFTs that can be harvested. ! - ! SL_PROB_HARVEST -- Logging intensity (one value for each PFT provided in SL_PFT). ! - ! Values should be between 0.0 and 1.0, with 0 meaning no ! - ! removal, and 1 removal of all trees needed to meet demands. ! - ! SL_MINDBH_HARVEST -- Minimum DBH for logging (one value for each PFT provided in ! - ! SL_PFT). ! - ! SL_BIOMASS_HARVEST -- Target biomass to be harvested in each cycle, in kgC/m2. If ! - ! zero, then all trees that meet the minimum DBH and minimum ! - ! patch age will be logged. In case you don't want logging to ! - ! occur, don't set this value to zero! Instead, set IANTH_DISTURB ! - ! to zero. ! - ! ! - ! The following variables are used when IANTH_DISTURB is 1 or 2. ! - ! ! - ! SL_SKID_REL_AREA -- area damaged by skid trails (relative to felled area). ! - ! SL_SKID_DBH_THRESH -- DBH threshold for damage caused in skid trails. ! - ! SL_SKID_S_GTHARV -- survivorship of trees with DBH > MINDBH in skid trails. ! - ! SL_SKID_S_LTHARV -- survivorship of trees with DBH < MINDBH in skid trails. ! - ! SL_FELLING_S_LTHARV -- survivorship of trees with DBH < MINDBH in felling gaps. ! + ! 1. Use anthropogenic disturbance datasets, with either mass-based ! + ! harvesting targets, or selective logging when the target is -1 ! + ! (ED-2.2 default when anthropogenic disturbance is sought). ! + ! 2. Use anthropogenic disturbance datasets, with area-based ! + ! harvesting targets (beta). ! ! ! ! Cropland variables, used when IANTH_DISTURB is 1 or 2. ! ! ! @@ -1431,18 +1400,6 @@ $ED_NL ! CL_FLEAF_HARVEST -- fraction of leaves that is harvested in croplands. ! !---------------------------------------------------------------------------------------! NL%IANTH_DISTURB = 0 - NL%SL_SCALE = 1 - NL%SL_YR_FIRST = 1992 - NL%SL_NYRS = 50 - NL%SL_PFT = 2,3,4 - NL%SL_PROB_HARVEST = 1.0,1.0,1.0 - NL%SL_MINDBH_HARVEST = 50.,50.,50. - NL%SL_BIOMASS_HARVEST = 0 - NL%SL_SKID_REL_AREA = 1 - NL%SL_SKID_DBH_THRESH = 30. - NL%SL_SKID_S_GTHARV = 1 - NL%SL_SKID_S_LTHARV = 0.6 - NL%SL_FELLING_S_LTHARV = 0.35 NL%CL_FSEEDS_HARVEST = 0.75 NL%CL_FSTORAGE_HARVEST = 0.00 NL%CL_FLEAF_HARVEST = 0.00 diff --git a/ED/src/dynamics/disturbance.f90 b/ED/src/dynamics/disturbance.f90 index 66f14a65e..9d3ebc839 100644 --- a/ED/src/dynamics/disturbance.f90 +++ b/ED/src/dynamics/disturbance.f90 @@ -63,7 +63,8 @@ subroutine apply_disturbances(cgrid) use mortality , only : disturbance_mortality ! ! subroutine use consts_coms , only : lnexp_max & ! intent(in) , tiny_num & ! intent(in) - , huge_num ! ! intent(in) + , huge_num & ! intent(in) + , almost_one ! ! intent(in) use forestry , only : find_lambda_harvest ! ! sub-routine use detailed_coms , only : idetailed ! ! intent(in) use update_derived_utils, only : update_patch_thermo_props & ! subroutine @@ -115,9 +116,12 @@ subroutine apply_disturbances(cgrid) logical :: disturbed logical :: same_pft logical :: is_primary - real , dimension(n_pft) :: mindbh_harvest + real , dimension(n_pft) :: mindbh_felling real , dimension(n_pft) :: felling_s_gtharv real , dimension(n_pft) :: felling_s_ltharv + real , dimension(n_pft) :: thinning_dbh_thresh + real , dimension(n_pft) :: thinning_s_gtharv + real , dimension(n_pft) :: thinning_s_ltharv real , dimension(n_pft) :: skid_dbh_thresh real , dimension(n_pft) :: skid_s_gtharv real , dimension(n_pft) :: skid_s_ltharv @@ -139,8 +143,10 @@ subroutine apply_disturbances(cgrid) real :: cb_water_np real :: cb_co2_np logical :: is_managed + logical :: is_logged logical :: is_oldgrowth logical :: is_plantation + logical :: time_to_thin logical :: print_detailed !------------------------------------------------------------------------------------! @@ -168,7 +174,7 @@ subroutine apply_disturbances(cgrid) !------------------------------------------------------------------------------------! ! nnsp_ble stands for the new number of site patches for big leaf. Each site ! ! may have additional mypfts, except if land use is 1 (cropland/pasture), 2 ! - ! (forest plantation), or 8 (cropland), in which case only one PFT is allowed. ! + ! (forest plantation), or 9 (cropland), in which case only one PFT is allowed. ! !------------------------------------------------------------------------------------! nnsp_ble = 3 + (n_dist_types - 3) * mypfts !------------------------------------------------------------------------------------! @@ -227,12 +233,15 @@ subroutine apply_disturbances(cgrid) !------------------------------------------------------------------------------! ! Copy harvest and skid trail instructions to local variables. ! !------------------------------------------------------------------------------! - mindbh_harvest (:) = cpoly%mindbh_harvest (:,isi) - felling_s_gtharv(:) = cpoly%felling_s_gtharv(:,isi) - felling_s_ltharv(:) = cpoly%felling_s_ltharv(:,isi) - skid_dbh_thresh (:) = cpoly%skid_dbh_thresh (:,isi) - skid_s_gtharv (:) = cpoly%skid_s_gtharv (:,isi) - skid_s_ltharv (:) = cpoly%skid_s_ltharv (:,isi) + mindbh_felling (:) = cpoly%mindbh_felling (:,isi) + felling_s_gtharv (:) = cpoly%felling_s_gtharv (:,isi) + felling_s_ltharv (:) = cpoly%felling_s_ltharv (:,isi) + thinning_dbh_thresh(:) = cpoly%thinning_dbh_thresh(:,isi) + thinning_s_gtharv (:) = cpoly%thinning_s_gtharv (:,isi) + thinning_s_ltharv (:) = cpoly%thinning_s_ltharv (:,isi) + skid_dbh_thresh (:) = cpoly%skid_dbh_thresh (:,isi) + skid_s_gtharv (:) = cpoly%skid_s_gtharv (:,isi) + skid_s_ltharv (:) = cpoly%skid_s_ltharv (:,isi) !------------------------------------------------------------------------------! @@ -274,7 +283,7 @@ subroutine apply_disturbances(cgrid) !------------------------------------------------------------------------------! ! Find the area to be harvested when biomass targets have been ! - ! established. ! + ! established. Returns zero if ianth != 1 ! !------------------------------------------------------------------------------! call find_lambda_harvest(cpoly,isi,onsp,lambda_harv_og_max,lambda_harvest) !------------------------------------------------------------------------------! @@ -397,8 +406,10 @@ subroutine apply_disturbances(cgrid) ! sense that anything can potentially grow in there. ! !---------------------------------------------------------------------------! old_lu = csite%dist_type(ipa) - is_managed = old_lu == 1 .or. old_lu == 2 .or. old_lu == 8 + is_managed = any(old_lu == [1,2,9]) + is_logged = any(old_lu == [2,6,7]) is_oldgrowth = csite%age(ipa) >= min_oldgrowth(old_lu) + time_to_thin = abs(csite%age(ipa) - cpoly%thinning_age_offset(isi)) < 0.5 !---------------------------------------------------------------------------! !---------------------------------------------------------------------------! @@ -489,6 +500,21 @@ subroutine apply_disturbances(cgrid) !---------------------------------------------------------------------------! + !---------------------------------------------------------------------------! + ! Canopy thinning. For now we allow canopy thinning only on patches ! + ! whose last disturbance was either forest plantation, selective logging ! + ! or skid trails. ! + !---------------------------------------------------------------------------! + if (is_logged .and. time_to_thin) then + if (cpoly%thinning_frac_area(isi) > almost_one) then + lambda_now(8) = lnexp_max + else + lambda_now(8) = log( 1.0 / (1.0 - cpoly%thinning_frac_area(isi)) ) + end if + end if + !---------------------------------------------------------------------------! + + !---------------------------------------------------------------------------! ! Total area loss depends on the sum of all disturbance rates. The ! ! individual loss is then calculated to be proportional to each disturbance ! @@ -616,7 +642,7 @@ subroutine apply_disturbances(cgrid) ! transition patch. ! !---------------------------------------------------------------------! select case (new_lu) - case (1,2,8) + case (1,2,9) !------------------------------------------------------------------! ! Cropland, pasture, and forest plantation. Only one PFT is ! ! allowed in such patches. ! @@ -624,7 +650,7 @@ subroutine apply_disturbances(cgrid) select case (new_lu) case (1,2) npa = onsp + new_lu - case (8) + case (9) npa = onsp + 2 + (new_lu - 3)*mypfts + 1 end select !------------------------------------------------------------------! @@ -713,7 +739,6 @@ subroutine apply_disturbances(cgrid) ! patch area here. ! !---------------------------------------------------------------------! if (disturbed) then - !------------------------------------------------------------------! ! Add area and survivors to the new patches. Here again we ! ! must check whether this is a conventional or a big leaf ! @@ -730,14 +755,17 @@ subroutine apply_disturbances(cgrid) ,cb_mass_np,cb_molar_np,cb_water_np & ,cb_co2_np) call insert_survivors(csite,onsp+new_lu,ipa,new_lu,area_fac & - ,mindbh_harvest,felling_s_gtharv & - ,felling_s_ltharv,skid_dbh_thresh & - ,skid_s_gtharv,skid_s_ltharv) + ,mindbh_felling,felling_s_gtharv & + ,felling_s_ltharv,thinning_dbh_thresh & + ,thinning_s_gtharv,thinning_s_ltharv & + ,skid_dbh_thresh,skid_s_gtharv & + ,skid_s_ltharv) call accum_dist_harv_litt(cpoly,isi,1,onsp+new_lu,ipa,new_lu & - ,area_fac,mindbh_harvest & + ,area_fac,mindbh_felling & ,felling_s_gtharv,felling_s_ltharv & - ,skid_dbh_thresh,skid_s_gtharv & - ,skid_s_ltharv) + ,thinning_dbh_thresh,thinning_s_gtharv & + ,skid_s_ltharv,skid_dbh_thresh & + ,skid_s_gtharv,skid_s_ltharv) !---------------------------------------------------------------! case (1) !---------------------------------------------------------------! @@ -745,14 +773,14 @@ subroutine apply_disturbances(cgrid) ! we are creating. ! !---------------------------------------------------------------! select case (new_lu) - case (1,2,8) + case (1,2,9) !------------------------------------------------------------! ! Find the correct index. ! !------------------------------------------------------------! select case (new_lu) case (1,2) npa = onsp + new_lu - case (8) + case (9) npa = onsp + 2 + (new_lu - 3) * mypfts + 1 end select !------------------------------------------------------------! @@ -766,12 +794,17 @@ subroutine apply_disturbances(cgrid) ,cb_mass_np,cb_molar_np,cb_water_np & ,cb_co2_np) call insert_survivors(csite,npa,ipa,new_lu,area_fac & - ,mindbh_harvest,felling_s_gtharv & - ,felling_s_ltharv,skid_dbh_thresh & - ,skid_s_gtharv,skid_s_ltharv) + ,mindbh_felling,felling_s_gtharv & + ,felling_s_ltharv,thinning_dbh_thresh & + ,thinning_s_gtharv,thinning_s_ltharv & + ,skid_dbh_thresh,skid_s_gtharv & + ,skid_s_ltharv) call accum_dist_harv_litt(cpoly,isi,1,npa,ipa,new_lu & - ,area_fac,mindbh_harvest & + ,area_fac,mindbh_felling & ,felling_s_gtharv,felling_s_ltharv & + ,thinning_dbh_thresh & + ,thinning_s_gtharv & + ,thinning_s_ltharv & ,skid_dbh_thresh,skid_s_gtharv & ,skid_s_ltharv) !------------------------------------------------------------! @@ -825,13 +858,20 @@ subroutine apply_disturbances(cgrid) ,cb_mass_np,cb_molar_np & ,cb_water_np,cb_co2_np) call insert_survivors(csite,npa,ipa,new_lu,area_fac & - ,mindbh_harvest,felling_s_gtharv & - ,felling_s_ltharv,skid_dbh_thresh & + ,mindbh_felling,felling_s_gtharv & + ,felling_s_ltharv & + ,thinning_dbh_thresh & + ,thinning_s_gtharv & + ,thinning_s_ltharv & + ,skid_dbh_thresh & ,skid_s_gtharv,skid_s_ltharv) call accum_dist_harv_litt(cpoly,isi,1,npa,ipa,new_lu & - ,area_fac,mindbh_harvest & + ,area_fac,mindbh_felling & ,felling_s_gtharv & ,felling_s_ltharv & + ,thinning_dbh_thresh & + ,thinning_s_gtharv & + ,thinning_s_ltharv & ,skid_dbh_thresh & ,skid_s_gtharv,skid_s_ltharv) end if @@ -890,7 +930,7 @@ subroutine apply_disturbances(cgrid) ,cpoly%plantation_stocking_density(isi) & ,cpoly%ntext_soil(:,isi), 2.0 & ,cpoly%lsl(isi)) - case (8) + case (9) call plant_patch(csite,onsp+new_lu,nzg & ,cpoly%agri_stocking_pft(isi) & ,cpoly%agri_stocking_density(isi) & @@ -1023,9 +1063,11 @@ subroutine apply_disturbances(cgrid) !------------------------------------------------------------------------------! old_lu_l4th: do ipa=1,onsp pat_area_loss = act_area_loss(ipa,:) - call disturbance_mortality(csite,ipa,pat_area_loss,mindbh_harvest & + call disturbance_mortality(csite,ipa,pat_area_loss,mindbh_felling & ,felling_s_gtharv,felling_s_ltharv & - ,skid_dbh_thresh,skid_s_gtharv,skid_s_ltharv) + ,thinning_dbh_thresh,thinning_s_gtharv & + ,thinning_s_ltharv,skid_dbh_thresh,skid_s_gtharv & + ,skid_s_ltharv) csite%area(ipa) = csite%area(ipa) - sum(pat_area_loss) end do old_lu_l4th !------------------------------------------------------------------------------! @@ -1048,7 +1090,7 @@ subroutine apply_disturbances(cgrid) case (2) apa = onsp + 2 zpa = onsp + 2 - case (8) + case (9) apa = onsp + 2 + ( new_lu - 3 ) * mypfts + 1 zpa = onsp + 2 + ( new_lu - 3 ) * mypfts + 1 case default @@ -1344,12 +1386,12 @@ subroutine site_disturbance_rates(year, cgrid) , plantation_year & ! intent(in) , plantation_rotation & ! intent(in) , mature_harvest_age & ! intent(in) - , min_oldgrowth & ! intent(in) - , sl_biomass_harvest ! ! intent(in) + , min_oldgrowth ! ! intent(in) use ed_max_dims , only : n_pft & ! intent(in) , n_dist_types ! ! intent(in) use ed_misc_coms , only : current_time ! ! intent(in) - use consts_coms , only : lnexp_max ! ! intent(in) + use consts_coms , only : lnexp_max & ! intent(in) + , almost_one ! ! intent(in) implicit none !----- Arguments. -------------------------------------------------------------------! @@ -1369,7 +1411,6 @@ subroutine site_disturbance_rates(year, cgrid) integer :: iyear integer :: useyear real :: bharvest - real :: pot_harvest_target real :: fire_disturbance_rate real :: lambda_harv_og_max real :: f_harv_prim_max @@ -1412,7 +1453,8 @@ subroutine site_disturbance_rates(year, cgrid) ! 5. Abandoned ! ! 6. Logged (felling) ! ! 7. Logged (skid trail / road) ! - ! 8. Agricultural lands (cropland / pasture) ! + ! 8. Logged (canopy thinning) ! + ! 9. Agricultural lands (cropland / pasture) ! !------------------------------------------------------------------------------! cpoly%disturbance_rates(:,:,isi) = 0.0 !------------------------------------------------------------------------------! @@ -1447,11 +1489,7 @@ subroutine site_disturbance_rates(year, cgrid) ! Disturbance that creates new "tree fall patches". Only non-cultivated ! ! lands may suffer this disturbance. ! !------------------------------------------------------------------------------! - cpoly%disturbance_rates(3,3,isi) = treefall_disturbance_rate - cpoly%disturbance_rates(3,4,isi) = treefall_disturbance_rate - cpoly%disturbance_rates(3,5,isi) = treefall_disturbance_rate - cpoly%disturbance_rates(3,6,isi) = treefall_disturbance_rate - cpoly%disturbance_rates(3,7,isi) = treefall_disturbance_rate + cpoly%disturbance_rates(3,3:8,isi) = treefall_disturbance_rate !------------------------------------------------------------------------------! @@ -1460,11 +1498,7 @@ subroutine site_disturbance_rates(year, cgrid) ! Disturbance that creates new "burnt patches". Only non-cultivated ! ! lands may suffer this disturbance. ! !------------------------------------------------------------------------------! - cpoly%disturbance_rates(4,3,isi) = fire_disturbance_rate - cpoly%disturbance_rates(4,4,isi) = fire_disturbance_rate - cpoly%disturbance_rates(4,5,isi) = fire_disturbance_rate - cpoly%disturbance_rates(4,6,isi) = fire_disturbance_rate - cpoly%disturbance_rates(4,7,isi) = fire_disturbance_rate + cpoly%disturbance_rates(4,3:8,isi) = fire_disturbance_rate !------------------------------------------------------------------------------! @@ -1546,20 +1580,22 @@ subroutine site_disturbance_rates(year, cgrid) cpoly%disturbance_rates(1,5,isi) = clutime%landuse(9) cpoly%disturbance_rates(1,6,isi) = clutime%landuse(9) cpoly%disturbance_rates(1,7,isi) = clutime%landuse(9) - cpoly%disturbance_rates(1,8,isi) = clutime%landuse(1) + cpoly%disturbance_rates(1,8,isi) = clutime%landuse(9) + cpoly%disturbance_rates(1,9,isi) = clutime%landuse(1) !------------------------------------------------------------------------------! !------------------------------------------------------------------------------! ! Apply disturbance rates that generate cropland (see table above). ! !------------------------------------------------------------------------------! - cpoly%disturbance_rates(8,1,isi) = clutime%landuse(2) - cpoly%disturbance_rates(8,2,isi) = clutime%landuse(7) - cpoly%disturbance_rates(8,3,isi) = clutime%landuse(5) - cpoly%disturbance_rates(8,4,isi) = clutime%landuse(7) - cpoly%disturbance_rates(8,5,isi) = clutime%landuse(7) - cpoly%disturbance_rates(8,6,isi) = clutime%landuse(7) - cpoly%disturbance_rates(8,7,isi) = clutime%landuse(7) + cpoly%disturbance_rates(9,1,isi) = clutime%landuse(2) + cpoly%disturbance_rates(9,2,isi) = clutime%landuse(7) + cpoly%disturbance_rates(9,3,isi) = clutime%landuse(5) + cpoly%disturbance_rates(9,4,isi) = clutime%landuse(7) + cpoly%disturbance_rates(9,5,isi) = clutime%landuse(7) + cpoly%disturbance_rates(9,6,isi) = clutime%landuse(7) + cpoly%disturbance_rates(9,7,isi) = clutime%landuse(7) + cpoly%disturbance_rates(9,8,isi) = clutime%landuse(7) !------------------------------------------------------------------------------! @@ -1572,14 +1608,14 @@ subroutine site_disturbance_rates(year, cgrid) case (0) !----- Abandoned lands only. -----------------------------------------------! cpoly%disturbance_rates(5,1,isi) = clutime%landuse( 3) + clutime%landuse(10) - cpoly%disturbance_rates(5,8,isi) = clutime%landuse( 6) + clutime%landuse( 8) + cpoly%disturbance_rates(5,9,isi) = clutime%landuse( 6) + clutime%landuse( 8) !---------------------------------------------------------------------------! case (1) !----- "Secondary" sends area to plantation, "Primary" to abandoned. -------! cpoly%disturbance_rates(2,1,isi) = clutime%landuse(10) - cpoly%disturbance_rates(2,8,isi) = clutime%landuse( 8) + cpoly%disturbance_rates(2,9,isi) = clutime%landuse( 8) cpoly%disturbance_rates(5,1,isi) = clutime%landuse( 3) - cpoly%disturbance_rates(5,8,isi) = clutime%landuse( 6) + cpoly%disturbance_rates(5,9,isi) = clutime%landuse( 6) !---------------------------------------------------------------------------! end select !------------------------------------------------------------------------------! @@ -1591,8 +1627,8 @@ subroutine site_disturbance_rates(year, cgrid) ! possible for old-growth forests. The actual disturbance rate may be lower ! ! (but never higher) than the rates obtained from the instruction file. ! ! We save this information in cpoly%disturbance_rates(6,3,isi) only but this ! - ! is accounted for any old-growth patch (which includes types 4, 5, 6, and 7 ! - ! if their age is old). ! + ! is accounted for any old-growth patch (which includes types 4-8) if their ! + ! age is old). ! !------------------------------------------------------------------------------! lambda_harv_og_max = max(0.,min(lnexp_max,clutime%landuse(11))) if (lambda_harv_og_max == lnexp_max) then @@ -1607,11 +1643,10 @@ subroutine site_disturbance_rates(year, cgrid) !------------------------------------------------------------------------------! - ! Harvesting (either plantation -> plantation or logging) when a biomass ! - ! target does not exist (e.g. SimAmazonia)). Convert the harvest probability ! - ! of being cut given that the DBH exceeds the minimum DBH. This is done only ! - ! when anthropogenic disturbance is on and we are not seeking the biomass ! - ! target, otherwise we set it to zero. ! + ! Decide the biomass harvesting target for primary and secondary forests. ! + ! This is done only when IANTH_DIST = 1 and the biomass targets are positive. ! + ! Otherwise, these are not intended for mass-based logging, so force memory ! + ! variables to zero. quaquaquaraqua ! !------------------------------------------------------------------------------! select case (ianth_disturb) case (0) @@ -1620,7 +1655,7 @@ subroutine site_disturbance_rates(year, cgrid) cpoly%primary_harvest_target (isi) = 0. cpoly%secondary_harvest_target(isi) = 0. !---------------------------------------------------------------------------! - case default + case (1) !------ Read anthropogenic disturbance from external data set. -------------! if (clutime%landuse(12) < 0. .or. clutime%landuse(14) < 0.) then find_target = .true. @@ -1634,6 +1669,25 @@ subroutine site_disturbance_rates(year, cgrid) + clutime%landuse(16) end if !---------------------------------------------------------------------------! + case (2) + !---------------------------------------------------------------------------! + ! Logging based on grid fraction and tree size. Harvest creates new ! + ! patches and target biomass harvest set to zero. ! + !---------------------------------------------------------------------------! + find_target = .false. + if (clutime%landuse(15) > almost_one) then + cpoly%disturbance_rates (6,6,isi) = lnexp_max + else + cpoly%disturbance_rates (6,6,isi) = log(1./(1.-clutime%landuse(15))) + end if + if (clutime%landuse(13) > almost_one) then + cpoly%disturbance_rates (2,2,isi) = lnexp_max + else + cpoly%disturbance_rates (2,2,isi) = log(1./(1.-clutime%landuse(13))) + end if + cpoly%primary_harvest_target (isi) = 0.0 + cpoly%secondary_harvest_target (isi) = 0.0 + !------------------------------------------------------------------------! end select !------------------------------------------------------------------------------! @@ -1662,7 +1716,7 @@ subroutine site_disturbance_rates(year, cgrid) !----- Select the minimum DBH depending on the forest category. ---------! select case(ilu) - case (1,8) + case (1,9) !----- Pasture and agriculture. No timber harvesting here. ----------! harv_primary = .false. harv_secondary = .false. @@ -1677,7 +1731,7 @@ subroutine site_disturbance_rates(year, cgrid) harv_primary = is_mature harv_secondary = .false. !---------------------------------------------------------------------! - case (4:7) + case (4:8) !---------------------------------------------------------------------! ! Other disturbances. Assume "primary" in case this is old- ! ! growth, otherwise assume it secondary vegetation. ! @@ -1696,8 +1750,8 @@ subroutine site_disturbance_rates(year, cgrid) if (harv_primary .or. harv_secondary) then do ico=1,cpatch%ncohorts ipft = cpatch%pft(ico) - if (cpatch%dbh(ico) >= cpoly%mindbh_harvest(ipft,isi)) then - bharvest = bharvest + cpoly%prob_harvest(ipft,isi) & + if (cpatch%dbh(ico) >= cpoly%mindbh_felling(ipft,isi)) then + bharvest = bharvest + cpoly%prob_felling(ipft,isi) & * cpatch%nplant(ico) * cpatch%btimber(ico) end if end do @@ -1724,25 +1778,6 @@ subroutine site_disturbance_rates(year, cgrid) !------------------------------------------------------------------------------! - !------------------------------------------------------------------------------! - ! Check whether to scale targets. ! - !------------------------------------------------------------------------------! - if (ianth_disturb == 2 .and. sl_biomass_harvest > 0.) then - pot_harvest_target = cpoly%primary_harvest_target (isi) & - + cpoly%secondary_harvest_target(isi) - if (pot_harvest_target > 0) then - cpoly%primary_harvest_target (isi) = & - cpoly%primary_harvest_target (isi) * sl_biomass_harvest & - / pot_harvest_target - cpoly%secondary_harvest_target(isi) = & - cpoly%secondary_harvest_target(isi) * sl_biomass_harvest & - / pot_harvest_target - end if - !---------------------------------------------------------------------------! - end if - !------------------------------------------------------------------------------! - - !------------------------------------------------------------------------------! ! In case anthropogenic disturbance is turned on, make sure that croplands ! ! that remain croplands are completely ploughed. This may need to change for ! @@ -1750,7 +1785,10 @@ subroutine site_disturbance_rates(year, cgrid) !------------------------------------------------------------------------------! select case (ianth_disturb) case (0) - !----- Anthropogenic disturbance is off. No logging should occur. ----------! + !---------------------------------------------------------------------------! + ! Anthropogenic disturbance is off. No land use transitions should ! + ! occur. ! + !---------------------------------------------------------------------------! continue !---------------------------------------------------------------------------! case default @@ -1758,8 +1796,8 @@ subroutine site_disturbance_rates(year, cgrid) ! Anthropogenic disturbance is on. All area that is not abandoned or ! ! converted to pasture should be cleared again for cropland. ! !---------------------------------------------------------------------------! - cpoly%disturbance_rates(8,8,isi) = lnexp_max & - - sum(cpoly%disturbance_rates(1:7,8,isi)) + cpoly%disturbance_rates(9,9,isi) = lnexp_max & + - sum(cpoly%disturbance_rates(1:8,9,isi)) !---------------------------------------------------------------------------! end select !------------------------------------------------------------------------------! @@ -3403,8 +3441,9 @@ end subroutine norm_canopy_air_props ! This subroutine will populate the disturbed patch with the cohorts that were ! ! disturbed but did not go extinct. ! !---------------------------------------------------------------------------------------! - subroutine insert_survivors(csite,np,cp,new_lu,area_fac,mindbh_harvest,felling_s_gtharv & - ,felling_s_ltharv,skid_dbh_thresh,skid_s_gtharv & + subroutine insert_survivors(csite,np,cp,new_lu,area_fac,mindbh_felling,felling_s_gtharv & + ,felling_s_ltharv,thinning_dbh_thresh,thinning_s_gtharv & + ,thinning_s_ltharv,skid_dbh_thresh,skid_s_gtharv & ,skid_s_ltharv) use ed_state_vars , only : sitetype & ! structure , patchtype ! ! structure @@ -3418,9 +3457,12 @@ subroutine insert_survivors(csite,np,cp,new_lu,area_fac,mindbh_harvest,felling_s integer , intent(in) :: new_lu integer , intent(in) :: np integer , intent(in) :: cp - real , dimension(n_pft), intent(in) :: mindbh_harvest + real , dimension(n_pft), intent(in) :: mindbh_felling real , dimension(n_pft), intent(in) :: felling_s_gtharv real , dimension(n_pft), intent(in) :: felling_s_ltharv + real , dimension(n_pft), intent(in) :: thinning_dbh_thresh + real , dimension(n_pft), intent(in) :: thinning_s_gtharv + real , dimension(n_pft), intent(in) :: thinning_s_ltharv real , dimension(n_pft), intent(in) :: skid_dbh_thresh real , dimension(n_pft), intent(in) :: skid_s_gtharv real , dimension(n_pft), intent(in) :: skid_s_ltharv @@ -3457,10 +3499,11 @@ subroutine insert_survivors(csite,np,cp,new_lu,area_fac,mindbh_harvest,felling_s survivalloop: do ico = 1,cpatch%ncohorts ipft = cpatch%pft(ico) - survival_fac(ico) = survivorship(new_lu,csite%dist_type(cp),mindbh_harvest & + survival_fac(ico) = survivorship(new_lu,csite%dist_type(cp),mindbh_felling & ,felling_s_gtharv,felling_s_ltharv & - ,skid_dbh_thresh,skid_s_gtharv,skid_s_ltharv & - ,cpatch,ico ) & + ,thinning_dbh_thresh,thinning_s_gtharv & + ,thinning_s_ltharv,skid_dbh_thresh & + ,skid_s_gtharv,skid_s_ltharv,cpatch,ico) & * area_fac n_survivors = cpatch%nplant(ico) * survival_fac(ico) @@ -3545,7 +3588,8 @@ end subroutine insert_survivors ! place. ! !---------------------------------------------------------------------------------------! subroutine accum_dist_harv_litt(cpoly,isi,census_flag,np,cp,new_lu,area_fac & - ,mindbh_harvest,felling_s_gtharv,felling_s_ltharv & + ,mindbh_felling,felling_s_gtharv,felling_s_ltharv & + ,thinning_dbh_thresh,thinning_s_gtharv,thinning_s_ltharv & ,skid_dbh_thresh,skid_s_gtharv,skid_s_ltharv) use ed_state_vars, only : sitetype & ! structure , patchtype & ! structure @@ -3574,9 +3618,12 @@ subroutine accum_dist_harv_litt(cpoly,isi,census_flag,np,cp,new_lu,area_fac integer , intent(in) :: census_flag integer , intent(in) :: np integer , intent(in) :: cp - real , dimension(n_pft), intent(in) :: mindbh_harvest + real , dimension(n_pft), intent(in) :: mindbh_felling real , dimension(n_pft), intent(in) :: felling_s_gtharv real , dimension(n_pft), intent(in) :: felling_s_ltharv + real , dimension(n_pft), intent(in) :: thinning_dbh_thresh + real , dimension(n_pft), intent(in) :: thinning_s_gtharv + real , dimension(n_pft), intent(in) :: thinning_s_ltharv real , dimension(n_pft), intent(in) :: skid_dbh_thresh real , dimension(n_pft), intent(in) :: skid_s_gtharv real , dimension(n_pft), intent(in) :: skid_s_ltharv @@ -3686,7 +3733,7 @@ subroutine accum_dist_harv_litt(cpoly,isi,census_flag,np,cp,new_lu,area_fac ! thing remains in the patch. ! !---------------------------------------------------------------------------------! select case(new_lu) - case (8) + case (9) !------ Agriculture. Harvest living tissues and NSC. --------------------------! a_bfast_remove = f_labile_leaf(ipft) * cl_fleaf_harvest * cpatch%bleaf(ico) a_bstruct_remove = ( 1.0 - f_labile_leaf(ipft) ) & @@ -3753,8 +3800,11 @@ subroutine accum_dist_harv_litt(cpoly,isi,census_flag,np,cp,new_lu,area_fac ! ing contribute to biomass loss. ! !---------------------------------------------------------------------------------! select case(new_lu) - case (2) - !------ Forest plantation, everything is cut. ---------------------------------! + case (2,8) + !------------------------------------------------------------------------------! + ! Forest plantation or canopy thinning, all losses are assumed to be from ! + ! cutting trees. ! + !------------------------------------------------------------------------------! agb_cut = cpatch%agb(ico) agb_mort = 0. ba_cut = cpatch%basarea(ico) @@ -3765,7 +3815,7 @@ subroutine accum_dist_harv_litt(cpoly,isi,census_flag,np,cp,new_lu,area_fac ! Logging, we must decide whether the losses are due to cutting or due to ! ! mortality. ! !------------------------------------------------------------------------------! - if (cpatch%dbh(ico) >= mindbh_harvest(ipft)) then + if (cpatch%dbh(ico) >= mindbh_felling(ipft)) then agb_cut = cpatch%agb(ico) agb_mort = 0. ba_cut = cpatch%basarea(ico) @@ -3789,9 +3839,11 @@ subroutine accum_dist_harv_litt(cpoly,isi,census_flag,np,cp,new_lu,area_fac !----- Find survivorship. --------------------------------------------------------! - survival_fac = survivorship(new_lu,csite%dist_type(cp),mindbh_harvest & - ,felling_s_gtharv,felling_s_ltharv,skid_dbh_thresh & - ,skid_s_gtharv,skid_s_ltharv,cpatch,ico) + survival_fac = survivorship(new_lu,csite%dist_type(cp),mindbh_felling & + ,felling_s_gtharv,felling_s_ltharv & + ,thinning_dbh_thresh,thinning_s_gtharv & + ,thinning_s_ltharv,skid_dbh_thresh,skid_s_gtharv & + ,skid_s_ltharv,cpatch,ico) !---------------------------------------------------------------------------------! diff --git a/ED/src/dynamics/forestry.f90 b/ED/src/dynamics/forestry.f90 index 7b8593ff1..3f233c4ca 100644 --- a/ED/src/dynamics/forestry.f90 +++ b/ED/src/dynamics/forestry.f90 @@ -57,6 +57,7 @@ subroutine find_lambda_harvest(cpoly,isi,onsp,lambda_harv_og_max,lambda_harvest) integer :: ilu logical :: is_oldgrowth logical :: is_mature + logical :: is_rotation logical :: print_detailed real, dimension(onsp) :: pat_hvmax_btimber real, dimension(onsp) :: pat_hvpot_btimber @@ -68,6 +69,9 @@ subroutine find_lambda_harvest(cpoly,isi,onsp,lambda_harv_og_max,lambda_harvest) real :: area_mature_primary real :: area_mature_secondary real :: area_mature_plantation + real :: lambda_mature_primary + real :: lambda_mature_secondary + real :: lambda_mature_plantation real :: hvmax_mature_primary real :: hvmax_mature_secondary real :: hvmax_mature_plantation @@ -78,132 +82,202 @@ subroutine find_lambda_harvest(cpoly,isi,onsp,lambda_harv_og_max,lambda_harvest) !------------------------------------------------------------------------------------! - !----- Nothing to do here in case anthropogenic disturbance is turned off. ----------! - if (ianth_disturb == 0) return - !------------------------------------------------------------------------------------! - - !------------------------------------------------------------------------------------! - ! Find out whether to print detailed information on screen. ! - !------------------------------------------------------------------------------------! - print_detailed = btest(idetailed,6) - !------------------------------------------------------------------------------------! - - - !----- Link to the current site. ----------------------------------------------------! - csite => cpoly%site(isi) + ! Decide how to calculate the harvestable area. ! !------------------------------------------------------------------------------------! + case_anth_disturb: select case (ianth_disturb) + !----- Nothing to do because not basing harvest off of biomass ----------------------! + case (0) ! Nothing to do because anthropogenic disturbance is turned off + return + case (1) ! Mass-based harvesting, or selective logging based on size, PFT and age. + !---------------------------------------------------------------------------------! + ! Find out whether to print detailed information on screen. ! + !---------------------------------------------------------------------------------! + print_detailed = btest(idetailed,6) + !---------------------------------------------------------------------------------! - !----- Initialise book keeping variables. -------------------------------------------! - pat_hvmax_btimber(:) = 0.0 - pat_hvpot_btimber(:) = 0.0 - !------------------------------------------------------------------------------------! + !----- Link to the current site. -------------------------------------------------! + csite => cpoly%site(isi) + !---------------------------------------------------------------------------------! - !------------------------------------------------------------------------------------! - ! Set biomass targets based on current rates and unapplied harvest from ! - ! previous years (memory). These are in kgC/m2. In case DBH-based logging is ! - ! applied, then harvest target is set to zero. ! - !------------------------------------------------------------------------------------! - primary_harvest_target = cpoly%primary_harvest_target (isi) & - + cpoly%primary_harvest_memory (isi) - secondary_harvest_target = cpoly%secondary_harvest_target(isi) & - + cpoly%primary_harvest_memory (isi) - site_harvest_target = primary_harvest_target + secondary_harvest_target - !------------------------------------------------------------------------------------! - + !----- Initialise book keeping variables. ----------------------------------------! + pat_hvmax_btimber(:) = 0.0 + pat_hvpot_btimber(:) = 0.0 + !---------------------------------------------------------------------------------! - !------------------------------------------------------------------------------------! - ! Find total harvestable biomass density in kgC/m2. The harvestable biomass is ! - ! not necessarily the same as the total site biomass, because it is possible that ! - ! the demand is for trees above a minimum size (which is very common practice in the ! - ! tropics). Also, we distinguish between the maximum harvestable biomass and the ! - ! potential, because it may be required to leave behind a fraction of commercial ! - ! trees that meet the logging size. ! - !------------------------------------------------------------------------------------! - site_hvmax_btimber = 0. - site_hvpot_btimber = 0. - hpat_loop: do ipa=1,onsp - cpatch => csite%patch(ipa) - ilu = csite%dist_type(ipa) !---------------------------------------------------------------------------------! - ! Save some flags here so we can account for the different types of patches. ! + ! Set biomass targets based on current rates and unapplied harvest from ! + ! previous years (memory). These are in kgC/m2. In case DBH-based logging is ! + ! applied, then harvest target is set to zero. ! !---------------------------------------------------------------------------------! - ilu = csite%dist_type(ipa) - is_oldgrowth = csite%age(ipa) >= min_oldgrowth(ilu) + primary_harvest_target = cpoly%primary_harvest_target (isi) & + + cpoly%primary_harvest_memory (isi) + secondary_harvest_target = cpoly%secondary_harvest_target(isi) & + + cpoly%primary_harvest_memory (isi) + site_harvest_target = primary_harvest_target + secondary_harvest_target !---------------------------------------------------------------------------------! !---------------------------------------------------------------------------------! - ! Go over each cohort, seek harvestable biomass. We don't bother looking at ! - ! croplands and pastures. ! + ! Find total harvestable biomass density in kgC/m2. The harvestable biomass ! + ! is not necessarily the same as the total site biomass, because it is possible ! + ! that the demand is for trees above a minimum size (which is very common ! + ! practice in the tropics). Also, we distinguish between the maximum harvestable ! + ! biomass and the potential one, because at least in the tropics, many forestry ! + ! concessions require loggers to leave a fraction of commercial trees that meet ! + ! the logging size unharvested for conservation purposes. ! !---------------------------------------------------------------------------------! - select case(ilu) - case (1,8) - !---- Pasture or cropland. Do nothing. ----------------------------------------! - continue + site_hvmax_btimber = 0. + site_hvpot_btimber = 0. + hpat_loop: do ipa=1,onsp + cpatch => csite%patch(ipa) + ilu = csite%dist_type(ipa) + !------------------------------------------------------------------------------! - case (2:7) - hcoh_loop: do ico=1,cpatch%ncohorts - ipft = cpatch%pft(ico) - if (cpatch%dbh(ico) >= cpoly%mindbh_harvest(ipft,isi)) then - !----- Cohort is harvestable. -------------------------------------------! - pat_hvmax_btimber(ipa) = pat_hvmax_btimber(ipa) & - + cpoly%prob_harvest(ipft,isi) & - * cpatch%nplant(ico) * cpatch%btimber(ico) - pat_hvpot_btimber(ipa) = pat_hvpot_btimber(ipa) & - + cpatch%nplant(ico) * cpatch%btimber(ico) - !------------------------------------------------------------------------! - end if + ! Save some flags here so we can account for the different types of ! + ! patches. ! + !------------------------------------------------------------------------------! + ilu = csite%dist_type(ipa) + is_oldgrowth = csite%age(ipa) >= min_oldgrowth(ilu) + !------------------------------------------------------------------------------! + + + !------------------------------------------------------------------------------! + ! Go over each cohort, seek harvestable biomass. We don't bother looking ! + ! at croplands and pastures. ! + !------------------------------------------------------------------------------! + select case(ilu) + case (1,9) + !---- Pasture or cropland. Do nothing. -------------------------------------! + continue !---------------------------------------------------------------------------! - end do hcoh_loop - end select - !---------------------------------------------------------------------------------! + case (2:8) + hcoh_loop: do ico=1,cpatch%ncohorts + ipft = cpatch%pft(ico) + if (cpatch%dbh(ico) >= cpoly%mindbh_felling(ipft,isi)) then + !----- Cohort is harvestable. ----------------------------------------! + pat_hvmax_btimber(ipa) = pat_hvmax_btimber(ipa) & + + cpoly%prob_felling(ipft,isi) & + * cpatch%nplant(ico) * cpatch%btimber(ico) + pat_hvpot_btimber(ipa) = pat_hvpot_btimber(ipa) & + + cpatch%nplant(ico) * cpatch%btimber(ico) + !---------------------------------------------------------------------! + end if + !------------------------------------------------------------------------! + end do hcoh_loop + end select + !------------------------------------------------------------------------------! + !------------------------------------------------------------------------------! + ! Update site harvestable biomass only when the patch has sufficient ! + ! harvestable biomass (after accounting for prob_felling). ! + !------------------------------------------------------------------------------! + if (pat_hvmax_btimber(ipa) >= min_harvest_biomass) then + site_hvmax_btimber = site_hvmax_btimber & + + pat_hvmax_btimber(ipa) * csite%area(ipa) + site_hvpot_btimber = site_hvpot_btimber & + + pat_hvpot_btimber(ipa) * csite%area(ipa) + end if + !------------------------------------------------------------------------------! + end do hpat_loop !---------------------------------------------------------------------------------! - ! Update site harvestable biomass only when the patch has sufficient ! - ! harvestable biomass (after accounting for prob_harvest). ! + + + + !=================================================================================! + !=================================================================================! + ! Find out whether any harvest can occur at this site. For harvest to occur, ! + ! the site must meet two criteria: ! + ! a. Harvestable biomass must be greater than min_harvest_biomass; ! + ! b. Target biomass must be greater than min_harvest_biomass. ! + ! ! + ! In case one or both criteria are not met, we add the harvest target to ! + ! memory. ! !---------------------------------------------------------------------------------! - if (pat_hvmax_btimber(ipa) >= min_harvest_biomass) then - site_hvmax_btimber = site_hvmax_btimber & - + pat_hvmax_btimber(ipa) * csite%area(ipa) - site_hvpot_btimber = site_hvpot_btimber & - + pat_hvpot_btimber(ipa) * csite%area(ipa) + if ( site_hvmax_btimber < min_harvest_biomass .or. & + site_harvest_target <= site_hvmax_btimber * min_patch_area ) then + cpoly%primary_harvest_target (isi) = 0.0 + cpoly%secondary_harvest_target(isi) = 0.0 + cpoly%primary_harvest_memory (isi) = primary_harvest_target + cpoly%secondary_harvest_memory(isi) = secondary_harvest_target + !------------------------------------------------------------------------------! + + + !------------------------------------------------------------------------------! + ! Print the inventory and the target. ! + !------------------------------------------------------------------------------! + if (print_detailed) then + write (unit=*,fmt='(a)' ) ' ' + write (unit=*,fmt='(a)' ) '---------------------------------------' + write (unit=*,fmt='(a)' ) ' FORESTRY. NO HARVEST THIS YEAR...' + write (unit=*,fmt='(a)' ) ' ' + write (unit=*,fmt='(a,1x,i5)') ' ISI = ',isi + write (unit=*,fmt='(a,1x,es12.5)') ' PRIMARY TARGET BIOMASS = ' & + , primary_harvest_target + write (unit=*,fmt='(a,1x,es12.5)') ' SECONDARY TARGET BIOMASS = ' & + , secondary_harvest_target + write (unit=*,fmt='(a,1x,es12.5)') ' TOTAL TARGET BIOMASS = ' & + , site_harvest_target + write (unit=*,fmt='(a,1x,es12.5)') ' MAXIMUM HARVESTABLE BIOMASS = ' & + , site_hvmax_btimber + write (unit=*,fmt='(a,1x,es12.5)') ' POTENTIAL HARVESTABLE BIOMASS = ' & + , site_hvpot_btimber + write (unit=*,fmt='(a)' ) '---------------------------------------' + write (unit=*,fmt='(a)' ) ' ' + end if + !------------------------------------------------------------------------------! + + + return end if !---------------------------------------------------------------------------------! - end do hpat_loop - !------------------------------------------------------------------------------------! - !====================================================================================! - !====================================================================================! - ! Find out whether any harvest can occur at this site. For harvest to occur, ! - ! the site must meet two criteria: ! - ! a. Harvestable biomass must be greater than min_harvest_biomass; ! - ! b. Target biomass must be greater than min_harvest_biomass. ! - ! ! - ! In case one or both criteria are not met, we add the harvest target to memory. ! - !------------------------------------------------------------------------------------! - if ( site_hvmax_btimber < min_harvest_biomass .or. & - site_harvest_target <= site_hvmax_btimber * min_patch_area ) then - cpoly%primary_harvest_target (isi) = 0.0 - cpoly%secondary_harvest_target(isi) = 0.0 - cpoly%primary_harvest_memory (isi) = primary_harvest_target - cpoly%secondary_harvest_memory(isi) = secondary_harvest_target + !------ Compute current stocks of timber in mature forests. ----------------------! + call inventory_mature_forests(cpoly,isi,onsp,pat_hvmax_btimber,pat_hvpot_btimber & + ,area_mature_primary ,hvmax_mature_primary & + ,hvpot_mature_primary ,area_mature_secondary & + ,hvmax_mature_secondary ,hvpot_mature_secondary & + ,area_mature_plantation ,hvmax_mature_plantation & + ,hvpot_mature_plantation) + !---------------------------------------------------------------------------------! + + + + !------ Compute the mature-forest harvest rates. ---------------------------------! + call mature_forest_harvest(cpoly,isi,onsp & + ,hvmax_mature_primary,hvpot_mature_primary & + ,hvmax_mature_secondary,hvpot_mature_secondary & + ,hvmax_mature_plantation,hvpot_mature_plantation & + ,primary_harvest_target,secondary_harvest_target & + ,pat_hvmax_btimber,lambda_harv_og_max,lambda_harvest & + ,harvest_deficit) !---------------------------------------------------------------------------------! + + !---------------------------------------------------------------------------------! + ! Compute the disturbance rate applied to young patches to help meet the ! + ! biomass demands. ! + !---------------------------------------------------------------------------------! + call young_forest_harvest(cpoly,isi,onsp,pat_hvmax_btimber,pat_hvpot_btimber & + ,lambda_harv_og_max,lambda_harvest,harvest_deficit) + !---------------------------------------------------------------------------------! + + + !---------------------------------------------------------------------------------! ! Print the inventory and the target. ! !---------------------------------------------------------------------------------! if (print_detailed) then write (unit=*,fmt='(a)' ) ' ' write (unit=*,fmt='(a)' ) '------------------------------------------' - write (unit=*,fmt='(a)' ) ' FORESTRY. NO HARVEST THIS YEAR...' + write (unit=*,fmt='(a)' ) ' FORESTRY. HARVEST RATES' write (unit=*,fmt='(a)' ) ' ' write (unit=*,fmt='(a,1x,i5)') ' ISI = ',isi write (unit=*,fmt='(a,1x,es12.5)') ' PRIMARY TARGET BIOMASS = ' & @@ -216,139 +290,154 @@ subroutine find_lambda_harvest(cpoly,isi,onsp,lambda_harv_og_max,lambda_harvest) , site_hvmax_btimber write (unit=*,fmt='(a,1x,es12.5)') ' POTENTIAL HARVESTABLE BIOMASS = ' & , site_hvpot_btimber + write (unit=*,fmt='(a,1x,es12.5)') ' HVMAX BIOMASS (PRIMARY) = ' & + , hvmax_mature_primary + write (unit=*,fmt='(a,1x,es12.5)') ' HVMAX BIOMASS (SECONDARY) = ' & + , hvmax_mature_secondary + write (unit=*,fmt='(a,1x,es12.5)') ' HVMAX BIOMASS (PLANTATION) = ' & + , hvmax_mature_plantation + write (unit=*,fmt='(a,1x,es12.5)') ' HVPOT BIOMASS (PRIMARY) = ' & + , hvpot_mature_primary + write (unit=*,fmt='(a,1x,es12.5)') ' HVPOT BIOMASS (SECONDARY) = ' & + , hvpot_mature_secondary + write (unit=*,fmt='(a,1x,es12.5)') ' HVPOT BIOMASS (PLANTATION) = ' & + , hvpot_mature_plantation + write (unit=*,fmt='(a,1x,es12.5)') ' HARVEST AREA (PRIMARY) = ' & + , area_mature_primary + write (unit=*,fmt='(a,1x,es12.5)') ' HARVEST AREA (SECONDARY) = ' & + , area_mature_secondary + write (unit=*,fmt='(a,1x,es12.5)') ' HARVEST AREA (PLANTATION) = ' & + , area_mature_plantation + write (unit=*,fmt='(a)' ) ' ' + write (unit=*,fmt='(a,1x,es12.5)') ' HARVEST DEFICIT = ' & + , harvest_deficit + write (unit=*,fmt='(a)' ) ' ' + write (unit=*,fmt='(a,1x,es12.5)') ' MAXIMUM LAMBDA (OLD-GROWTH) = ' & + , lambda_harv_og_max + write (unit=*,fmt='(a)' ) ' ' + write (unit=*,fmt='(a)' ) '------------------------------------------' + write (unit=*,fmt='(9(a,1x))' ) ' IPA',' LU',' AGE' & + ,' AREA',' PAT_HVMAX' & + ,' PAT_HVPOT',' LAMBDA' & + ,' MATURE',' OLD_GROWTH' + write (unit=*,fmt='(a)' ) '------------------------------------------' + do ipa=1,onsp + + !---------------------------------------------------------------------------! + ! Save some flags here so we can account for the different types of ! + ! patches. ! + !---------------------------------------------------------------------------! + ilu = csite%dist_type(ipa) + select case (ilu) + case (2) + is_mature = csite%age(ipa) >= plantation_rotation + is_oldgrowth = .false. + case (3:8) + is_mature = csite%age(ipa) >= mature_harvest_age + is_oldgrowth = csite%age(ipa) >= min_oldgrowth(ilu) + case default + is_mature = .false. + is_oldgrowth = .false. + end select + !---------------------------------------------------------------------------! + write (unit=*,fmt='(2(i5,1x),5(f12.7,1x),2(11x,l1,1x))') & + ipa,csite%dist_type(ipa),csite%age(ipa),csite%area(ipa) & + ,pat_hvmax_btimber(ipa),pat_hvpot_btimber(ipa),lambda_harvest(ipa) & + ,is_mature,is_oldgrowth + end do write (unit=*,fmt='(a)' ) '------------------------------------------' write (unit=*,fmt='(a)' ) ' ' end if !---------------------------------------------------------------------------------! - return - end if - !------------------------------------------------------------------------------------! - - - - !------ Compute current stocks of timber in mature forests. -------------------------! - call inventory_mature_forests(cpoly,isi,onsp,pat_hvmax_btimber,pat_hvpot_btimber & - ,area_mature_primary ,hvmax_mature_primary & - ,hvpot_mature_primary ,area_mature_secondary & - ,hvmax_mature_secondary ,hvpot_mature_secondary & - ,area_mature_plantation ,hvmax_mature_plantation & - ,hvpot_mature_plantation) - !------------------------------------------------------------------------------------! + !---------------------------------------------------------------------------------! + ! Reset the primary forest memory, and assign any remaining deficit to the ! + ! secondary forest memory. ! + !---------------------------------------------------------------------------------! + cpoly%primary_harvest_memory (isi) = 0.0 + cpoly%secondary_harvest_memory(isi) = harvest_deficit + !---------------------------------------------------------------------------------! + case (2) ! Harvest is based on site + area + !----- Link to the current site. -------------------------------------------------! + csite => cpoly%site(isi) + !---------------------------------------------------------------------------------! - !------ Compute the mature-forest harvest rates. ------------------------------------! - call mature_forest_harvest(cpoly,isi,onsp & - ,hvmax_mature_primary,hvpot_mature_primary & - ,hvmax_mature_secondary,hvpot_mature_secondary & - ,hvmax_mature_plantation,hvpot_mature_plantation & - ,primary_harvest_target,secondary_harvest_target & - ,pat_hvmax_btimber,lambda_harv_og_max,lambda_harvest & - ,harvest_deficit) - !------------------------------------------------------------------------------------! + !----- Area-based forestry, no need to track memory. -----------------------------! + cpoly%primary_harvest_memory (isi) = 0.0 + cpoly%secondary_harvest_memory(isi) = 0.0 + !---------------------------------------------------------------------------------! - !------------------------------------------------------------------------------------! - ! Compute the disturbance rate applied to young patches to help meet the ! - ! biomass demands. ! - !------------------------------------------------------------------------------------! - call young_forest_harvest(cpoly,isi,onsp,pat_hvmax_btimber,pat_hvpot_btimber & - ,lambda_harv_og_max,lambda_harvest,harvest_deficit) - !------------------------------------------------------------------------------------! + !----- Copy the site-level disturbance rates to be applied to the patches. -------! + lambda_mature_primary = cpoly%disturbance_rates(6,3,isi) + lambda_mature_secondary = cpoly%disturbance_rates(6,6,isi) + lambda_mature_plantation = cpoly%disturbance_rates(2,2,isi) + !---------------------------------------------------------------------------------! - !------------------------------------------------------------------------------------! - ! Print the inventory and the target. ! - !------------------------------------------------------------------------------------! - if (print_detailed) then - write (unit=*,fmt='(a)' ) ' ' - write (unit=*,fmt='(a)' ) '---------------------------------------------' - write (unit=*,fmt='(a)' ) ' FORESTRY. HARVEST RATES' - write (unit=*,fmt='(a)' ) ' ' - write (unit=*,fmt='(a,1x,i5)') ' ISI = ',isi - write (unit=*,fmt='(a,1x,es12.5)') ' PRIMARY TARGET BIOMASS = ' & - , primary_harvest_target - write (unit=*,fmt='(a,1x,es12.5)') ' SECONDARY TARGET BIOMASS = ' & - , secondary_harvest_target - write (unit=*,fmt='(a,1x,es12.5)') ' TOTAL TARGET BIOMASS = ' & - , site_harvest_target - write (unit=*,fmt='(a,1x,es12.5)') ' MAXIMUM HARVESTABLE BIOMASS = ' & - , site_hvmax_btimber - write (unit=*,fmt='(a,1x,es12.5)') ' POTENTIAL HARVESTABLE BIOMASS = ' & - , site_hvpot_btimber - write (unit=*,fmt='(a,1x,es12.5)') ' HVMAX BIOMASS (PRIMARY) = ' & - , hvmax_mature_primary - write (unit=*,fmt='(a,1x,es12.5)') ' HVMAX BIOMASS (SECONDARY) = ' & - , hvmax_mature_secondary - write (unit=*,fmt='(a,1x,es12.5)') ' HVMAX BIOMASS (PLANTATION) = ' & - , hvmax_mature_plantation - write (unit=*,fmt='(a,1x,es12.5)') ' HVPOT BIOMASS (PRIMARY) = ' & - , hvpot_mature_primary - write (unit=*,fmt='(a,1x,es12.5)') ' HVPOT BIOMASS (SECONDARY) = ' & - , hvpot_mature_secondary - write (unit=*,fmt='(a,1x,es12.5)') ' HVPOT BIOMASS (PLANTATION) = ' & - , hvpot_mature_plantation - write (unit=*,fmt='(a,1x,es12.5)') ' HARVEST AREA (PRIMARY) = ' & - , area_mature_primary - write (unit=*,fmt='(a,1x,es12.5)') ' HARVEST AREA (SECONDARY) = ' & - , area_mature_secondary - write (unit=*,fmt='(a,1x,es12.5)') ' HARVEST AREA (PLANTATION) = ' & - , area_mature_plantation - write (unit=*,fmt='(a)' ) ' ' - write (unit=*,fmt='(a,1x,es12.5)') ' HARVEST DEFICIT = ' & - , harvest_deficit - write (unit=*,fmt='(a)' ) ' ' - write (unit=*,fmt='(a,1x,es12.5)') ' MAXIMUM LAMBDA (OLD-GROWTH) = ' & - , lambda_harv_og_max - write (unit=*,fmt='(a)' ) ' ' - write (unit=*,fmt='(a)' ) '---------------------------------------------' - write (unit=*,fmt='(9(a,1x))' ) ' IPA',' LU',' AGE',' AREA' & - ,' PAT_HVMAX',' PAT_HVPOT',' LAMBDA' & - ,' MATURE',' OLD_GROWTH' - write (unit=*,fmt='(a)' ) '---------------------------------------------' - do ipa=1,onsp + !---------------------------------------------------------------------------------! + ! Loop over patches. ! + !---------------------------------------------------------------------------------! + patch_loop: do ipa=1,onsp !------------------------------------------------------------------------------! - ! Save some flags here so we can account for the different types of ! - ! patches. ! + ! Save some flags here to account for the different types of patches. ! !------------------------------------------------------------------------------! ilu = csite%dist_type(ipa) - select case (ilu) + is_oldgrowth = csite%age(ipa) >= min_oldgrowth(ilu) + is_mature = csite%age(ipa) >= mature_harvest_age + is_rotation = csite%age(ipa) >= plantation_rotation + !---------------------------------------------------------------------------------! + + !------------------------------------------------------------------------------! + ! Find out whether to harvest this patch. ! + !------------------------------------------------------------------------------! + select case (csite%dist_type(ipa)) case (2) - is_mature = csite%age(ipa) >= plantation_rotation - is_oldgrowth = .false. - case (3:7) - is_mature = csite%age(ipa) >= mature_harvest_age - is_oldgrowth = csite%age(ipa) >= min_oldgrowth(ilu) + !----- Forest plantation. --------------------------------------------------! + if ( is_rotation ) then + lambda_harvest(ipa) = lambda_mature_plantation + else + lambda_harvest(ipa) = 0.0 + end if + !---------------------------------------------------------------------------! + case (3) + !----- Tree fall, use primary forest disturbance rate. ---------------------! + if ( is_mature ) then + lambda_harvest(ipa) = lambda_mature_primary + else + lambda_harvest(ipa) = 0.0 + end if + !---------------------------------------------------------------------------! + case (4:8) + !---------------------------------------------------------------------------! + ! Other disturbances, assume secondary in case the patch is not ! + ! considered old-growth, and primary otherwise. ! + !---------------------------------------------------------------------------! + if (is_mature .and. is_oldgrowth) then + lambda_harvest(ipa) = lambda_mature_primary + else if (is_mature) then + lambda_harvest(ipa) = lambda_mature_secondary + else + lambda_harvest(ipa) = 0.0 + end if + !---------------------------------------------------------------------------! case default - is_mature = .false. - is_oldgrowth = .false. - end select + !----- Probably pasture/croplands, skip the patch. -------------------------! + lambda_harvest(ipa) = 0.0 + !---------------------------------------------------------------------------! + end select !------------------------------------------------------------------------------! - write (unit=*,fmt='(2(i5,1x),5(f12.7,1x),2(11x,l1,1x))') & - ipa,csite%dist_type(ipa),csite%age(ipa),csite%area(ipa) & - ,pat_hvmax_btimber(ipa),pat_hvpot_btimber(ipa),lambda_harvest(ipa) & - ,is_mature,is_oldgrowth - end do - write (unit=*,fmt='(a)' ) '---------------------------------------------' - write (unit=*,fmt='(a)' ) ' ' - end if - !------------------------------------------------------------------------------------! - - - !------------------------------------------------------------------------------------! - ! Reset the primary forest memory, and assign any remaining deficit to the ! - ! secondary forest memory. ! - !------------------------------------------------------------------------------------! - cpoly%primary_harvest_memory (isi) = 0.0 - cpoly%secondary_harvest_memory(isi) = harvest_deficit + end do patch_loop + !---------------------------------------------------------------------------------! + end select case_anth_disturb !------------------------------------------------------------------------------------! - return end subroutine find_lambda_harvest !=======================================================================================! @@ -460,7 +549,7 @@ subroutine inventory_mature_forests( cpoly,isi,onsp,pat_hvmax_btimber,pat_hvpot_ end if !------------------------------------------------------------------------------! - case (4:7) + case (4:8) !------------------------------------------------------------------------------! ! Other disturbances, assume secondary in case the patch is not considered ! ! old-growth, and primary otherwise. ! @@ -739,7 +828,7 @@ subroutine mature_forest_harvest(cpoly,isi,onsp end if !------------------------------------------------------------------------------! - case (4:7) + case (4:8) !------------------------------------------------------------------------------! ! Other types of forest. We decide whether they are old_growth ! ! ("primary") or secondary depending on their age. ! @@ -910,7 +999,7 @@ subroutine young_forest_harvest(cpoly,isi,onsp,pat_hvmax_btimber,pat_hvpot_btimb ilu = csite%dist_type(ipa) is_harvestable = pat_hvmax_btimber(ipa) >= min_harvest_biomass select case (ilu) - case (4:7) + case (4:8) is_secondary = csite%age(ipa) < min_oldgrowth(ilu) case default is_secondary = .false. @@ -991,7 +1080,7 @@ subroutine young_forest_harvest(cpoly,isi,onsp,pat_hvmax_btimber,pat_hvpot_btimb select case (ilu) case (3) is_primary = .true. - case (4:7) + case (4:8) is_primary = csite%age(ipa) >= min_oldgrowth(ilu) case default is_primary = .false. diff --git a/ED/src/dynamics/mortality.f90 b/ED/src/dynamics/mortality.f90 index fd59ee899..a05737fac 100644 --- a/ED/src/dynamics/mortality.f90 +++ b/ED/src/dynamics/mortality.f90 @@ -144,7 +144,8 @@ end subroutine mortality_rates ! disturbance. ! !---------------------------------------------------------------------------------------! subroutine disturbance_mortality(csite,ipa,area_loss,mindbh_harvest,felling_s_gtharv & - ,felling_s_ltharv,skid_dbh_thresh,skid_s_gtharv & + ,felling_s_ltharv,thinning_dbh_thresh,thinning_s_gtharv & + ,thinning_s_ltharv,skid_dbh_thresh,skid_s_gtharv & ,skid_s_ltharv) use ed_state_vars, only : sitetype & ! structure , patchtype ! ! structure @@ -161,6 +162,9 @@ subroutine disturbance_mortality(csite,ipa,area_loss,mindbh_harvest,felling_s_gt real , dimension(n_pft) , intent(in) :: mindbh_harvest real , dimension(n_pft) , intent(in) :: felling_s_gtharv real , dimension(n_pft) , intent(in) :: felling_s_ltharv + real , dimension(n_pft) , intent(in) :: thinning_dbh_thresh + real , dimension(n_pft) , intent(in) :: thinning_s_gtharv + real , dimension(n_pft) , intent(in) :: thinning_s_ltharv real , dimension(n_pft) , intent(in) :: skid_dbh_thresh real , dimension(n_pft) , intent(in) :: skid_s_gtharv real , dimension(n_pft) , intent(in) :: skid_s_ltharv @@ -194,8 +198,9 @@ subroutine disturbance_mortality(csite,ipa,area_loss,mindbh_harvest,felling_s_gt do ico=1,cpatch%ncohorts f_survival = survivorship(new_lu,csite%dist_type(ipa),mindbh_harvest & ,felling_s_gtharv,felling_s_ltharv & - ,skid_dbh_thresh,skid_s_gtharv,skid_s_ltharv & - ,cpatch,ico) + ,thinning_dbh_thresh,thinning_s_gtharv & + ,thinning_s_ltharv,skid_dbh_thresh,skid_s_gtharv & + ,skid_s_ltharv,cpatch,ico) a_factor(ico) = a_factor(ico) & + ( 1.0 - f_survival ) * area_loss(new_lu) / csite%area(ipa) end do @@ -239,32 +244,37 @@ end subroutine disturbance_mortality ! 5. Forest regrowth. ! ! 6. Logging (tree felling). ! ! 7. Logging (mechanical damage). ! - ! 8. Cropland. ! + ! 8. Logging (canopy thinning). ! + ! 9. Cropland. ! ! -- mindbh_harvest: minimum DBH for selective logging. All trees above threshold ! ! will be logged in the tree felling patch. ! ! -- cpatch: current patch. ! ! -- ico: index for current cohort. ! !---------------------------------------------------------------------------------------! real function survivorship(new_lu,old_lu,mindbh_harvest,felling_s_gtharv & - ,felling_s_ltharv,skid_dbh_thresh,skid_s_gtharv,skid_s_ltharv & - ,cpatch,ico) - use ed_state_vars, only : patchtype ! ! structure - use disturb_coms , only : treefall_height_threshold ! ! intent(in) - use pft_coms , only : treefall_s_ltht & ! intent(in) - , treefall_s_gtht & ! intent(in) - , fire_s_min & ! intent(in) - , fire_s_max & ! intent(in) - , fire_s_inter & ! intent(in) - , fire_s_slope ! ! intent(in) - use ed_max_dims , only : n_pft ! ! intent(in) - use consts_coms , only : lnexp_min & ! intent(in) - , lnexp_max ! ! intent(in) + ,felling_s_ltharv,thinning_dbh_thresh,thinning_s_gtharv & + ,thinning_s_ltharv,skid_dbh_thresh,skid_s_gtharv & + ,skid_s_ltharv,cpatch,ico) + use ed_state_vars, only : patchtype ! ! structure + use disturb_coms , only : treefall_hite_threshold ! ! intent(in) + use pft_coms , only : treefall_s_ltht & ! intent(in) + , treefall_s_gtht & ! intent(in) + , fire_s_min & ! intent(in) + , fire_s_max & ! intent(in) + , fire_s_inter & ! intent(in) + , fire_s_slope ! ! intent(in) + use ed_max_dims , only : n_pft ! ! intent(in) + use consts_coms , only : lnexp_min & ! intent(in) + , lnexp_max ! ! intent(in) implicit none !----- Arguments. -------------------------------------------------------------------! type(patchtype) , target :: cpatch real , dimension(n_pft), intent(in) :: mindbh_harvest real , dimension(n_pft), intent(in) :: felling_s_gtharv real , dimension(n_pft), intent(in) :: felling_s_ltharv + real , dimension(n_pft), intent(in) :: thinning_dbh_thresh + real , dimension(n_pft), intent(in) :: thinning_s_gtharv + real , dimension(n_pft), intent(in) :: thinning_s_ltharv real , dimension(n_pft), intent(in) :: skid_dbh_thresh real , dimension(n_pft), intent(in) :: skid_s_gtharv real , dimension(n_pft), intent(in) :: skid_s_ltharv @@ -287,7 +297,7 @@ real function survivorship(new_lu,old_lu,mindbh_harvest,felling_s_gtharv ! and size. ! !------------------------------------------------------------------------------------! select case(new_lu) - case (1,2,8) + case (1,2,9) !---------------------------------------------------------------------------------! ! Clear cut (cropland/pasture/forest plantation). Nothing survives. ! !---------------------------------------------------------------------------------! @@ -324,7 +334,7 @@ real function survivorship(new_lu,old_lu,mindbh_harvest,felling_s_gtharv ! occurs after one last harvest, or the field/plantation is left as is. ! !---------------------------------------------------------------------------------! select case (old_lu) - case (8) + case (9) !----- Cropland: final harvest. -----------------------------------------------! survivorship = 0.0 !------------------------------------------------------------------------------! @@ -349,7 +359,7 @@ real function survivorship(new_lu,old_lu,mindbh_harvest,felling_s_gtharv !---------------------------------------------------------------------------------! case (6) !---------------------------------------------------------------------------------! - ! Tree felling. ! + ! Tree felling (for timber wood). ! !---------------------------------------------------------------------------------! if (cpatch%dbh(ico) >= mindbh_harvest(ipft)) then survivorship = felling_s_gtharv(ipft) @@ -371,6 +381,17 @@ real function survivorship(new_lu,old_lu,mindbh_harvest,felling_s_gtharv survivorship = skid_s_ltharv(ipft) end if !---------------------------------------------------------------------------------! + case (8) + !---------------------------------------------------------------------------------! + ! Canopy thinning. This most likely targets smaller trees, which are ! + ! harvested to reduce competition with larger, marketable timber. ! + !---------------------------------------------------------------------------------! + if (cpatch%dbh(ico) >= thinning_dbh_thresh(ipft)) then + survivorship = thinning_s_gtharv(ipft) + else + survivorship = thinning_s_ltharv(ipft) + end if + !---------------------------------------------------------------------------------! end select !------------------------------------------------------------------------------------! diff --git a/ED/src/dynamics/reproduction.f90 b/ED/src/dynamics/reproduction.f90 index 278778b2d..9e34de9f4 100644 --- a/ED/src/dynamics/reproduction.f90 +++ b/ED/src/dynamics/reproduction.f90 @@ -251,7 +251,7 @@ subroutine reproduction_driver(cgrid,month,veget_dyn_on) cpoly%min_monthly_temp(isi) >= plant_min_temp(ipft) - 5.0 .and. & repro_scheme /= 0 !------------------------------------------------------------------! - case (8) + case (9) !----- Cropland. --------------------------------------------------! allow_pft = & include_pft_ag(ipft) .and. & @@ -756,7 +756,7 @@ subroutine reproduction_driver(cgrid,month,veget_dyn_on) repro_scheme /= 0 !------------------------------------------------------------------! - case (8) + case (9) !----- Cropland. --------------------------------------------------! allow_pft = & include_pft_ag(ipft) .and. & @@ -1047,7 +1047,7 @@ subroutine seed_dispersal(cpoly,late_spring) repro_scheme /= 0 !---------------------------------------------------------------------! - case (8) + case (9) !----- Cropland. -----------------------------------------------------! allow_pft = & include_pft_ag(ipft) .and. & diff --git a/ED/src/dynamics/structural_growth.f90 b/ED/src/dynamics/structural_growth.f90 index cd11977e2..c6238cff7 100644 --- a/ED/src/dynamics/structural_growth.f90 +++ b/ED/src/dynamics/structural_growth.f90 @@ -456,7 +456,7 @@ subroutine dbstruct_dt(cgrid,veget_dyn_on,new_year) ! also set a fraction of seeds as crop yield. ! !------------------------------------------------------------------------! select case (csite%dist_type(ipa)) - case (8) + case (9) !---------------------------------------------------------------------! ! Cropland patch. Here we must account for harvesting of seeds. ! ! Leaves and non-structural carbon must be harvested at the end of ! diff --git a/ED/src/init/ed_params.f90 b/ED/src/init/ed_params.f90 index 4621380ce..bc2338481 100644 --- a/ED/src/init/ed_params.f90 +++ b/ED/src/init/ed_params.f90 @@ -921,6 +921,9 @@ subroutine init_disturb_params !---------------------------------------------------------------------------------------! ! Find the minimum age above which we disregard the disturbance type because the ! ! patch can be considered old growth. ! + ! MLO - In the future, disturbances that primarily impact the under storey could have a ! + ! much shorter age to be considered old-growth, as repopulating the under storey ! + ! likely takes less time than repopulating the upper canopy. ! !---------------------------------------------------------------------------------------! !----- Non-cultivated patches: use the mean age for tree fall disturbances. ------------! if (abs(treefall_disturbance_rate) > tiny_num) then @@ -931,7 +934,7 @@ subroutine init_disturb_params !----- Cultivated lands should never be considered old-growth. -------------------------! min_oldgrowth(1) = huge_num min_oldgrowth(2) = huge_num - min_oldgrowth(8) = huge_num + min_oldgrowth(9) = huge_num !---------------------------------------------------------------------------------------! return diff --git a/ED/src/init/landuse_init.f90 b/ED/src/init/landuse_init.f90 index 44eca5870..8058c0602 100644 --- a/ED/src/init/landuse_init.f90 +++ b/ED/src/init/landuse_init.f90 @@ -13,26 +13,19 @@ subroutine read_landuse_matrix , sitetype & ! structure , edgrid_g ! ! structure use pft_coms , only : is_grass & ! intent(in) - , is_liana ! ! intent(in) + , is_liana & ! intent(in) + , pasture_stock & ! intent(in) + , agri_stock & ! intent(in) + , plantation_stock ! ! intent(in) use consts_coms , only : erad & ! intent(in) , pio180 & ! intent(in) - , lnexp_max ! ! intent(in) + , lnexp_max & ! intent(in) + , huge_num ! ! intent(in) use disturb_coms , only : lutime & ! intent(in) , max_lu_years & ! intent(in) , num_lu_trans & ! intent(in) , ianth_disturb & ! intent(in) - , lu_database & ! intent(in) - , sl_pft & ! intent(in) - , sl_scale & ! intent(in) - , sl_nyrs & ! intent(in) - , sl_yr_first & ! intent(in) - , sl_skid_rel_area & ! intent(in) - , sl_skid_dbh_thresh & ! intent(in) - , sl_skid_s_gtharv & ! intent(in) - , sl_skid_s_ltharv & ! intent(in) - , sl_felling_s_ltharv & ! intent(in) - , sl_mindbh_harvest & ! intent(in) - , sl_prob_harvest ! ! intent(in) + , lu_database ! ! intent(in) use ed_misc_coms , only : iyeara & ! intent(in) , iyearz ! ! intent(in) use grid_coms , only : ngrids ! ! intent(in) @@ -42,7 +35,6 @@ subroutine read_landuse_matrix , maxlist & ! intent(in) , undef_real & ! intent(in) , undef_integer ! ! intent(in) - use detailed_coms , only : idetailed ! ! intent(in) implicit none !----- Local variables --------------------------------------------------------------! @@ -60,8 +52,6 @@ subroutine read_landuse_matrix character(len=str_len) :: lu_name character(len=str_len) :: cdum character(len=str_len) :: vkey - character(len=13) :: hifmt - character(len=15) :: hffmt integer :: nharvest integer , dimension(n_pft) :: harvest_pft integer :: nf @@ -80,18 +70,21 @@ subroutine read_landuse_matrix integer :: yd_last integer :: poseq logical :: inside - logical :: write_lu_settings real :: skid_rel_area - real , dimension(n_pft) :: mindbh_slog - real , dimension(n_pft) :: harvprob_slog - real , dimension(n_pft) :: mindbh_fplt - real , dimension(n_pft) :: harvprob_fplt - real , dimension(n_pft) :: skid_dbh_thresh + real :: thinning_age_offset + real :: thinning_frac_area + real , dimension(n_pft) :: mindbh_felling + real , dimension(n_pft) :: prob_harv_felling + real , dimension(n_pft) :: mindbh_plantation + real , dimension(n_pft) :: prob_harv_plantation real , dimension(n_pft) :: felling_s_gtharv real , dimension(n_pft) :: felling_s_ltharv + real , dimension(n_pft) :: thinning_dbh_thresh + real , dimension(n_pft) :: thinning_s_gtharv + real , dimension(n_pft) :: thinning_s_ltharv + real , dimension(n_pft) :: skid_dbh_thresh real , dimension(n_pft) :: skid_s_gtharv real , dimension(n_pft) :: skid_s_ltharv - real , dimension(num_lu_trans) :: landuse_now real :: lu_area real :: lu_area_i real :: wlon @@ -102,10 +95,8 @@ subroutine read_landuse_matrix character(len=12) , parameter :: fffmt = '(a,1x,f12.5)' character(len=13) , parameter :: esfmt = '(a,1x,es12.5)' real , parameter :: huge_dbh = huge(1.) - character(len=str_len), parameter :: lu_table = "anth_disturb_table.txt" !----- External function. -----------------------------------------------------------! real , external :: dist_gc - real , external :: solid_area !------------------------------------------------------------------------------------! @@ -114,12 +105,10 @@ subroutine read_landuse_matrix sim_years = iyearz-iyeara+1 !------------------------------------------------------------------------------------! - !------ Decide whether to write lu settings. ----------------------------------------! - write_lu_settings = btest(idetailed,6) .and. ianth_disturb /= 0 - !------------------------------------------------------------------------------------! - - !----- Crashing the run if the user set up a very long run... -----------------------! + !------------------------------------------------------------------------------------! + ! Graciously fail if the user set up an extremely long run. ! + !------------------------------------------------------------------------------------! if (ianth_disturb /= 0 .and. sim_years > max_lu_years) then write (unit=*,fmt='(a,1x,i5)') 'IYEARA (From namelist) :',iyeara write (unit=*,fmt='(a,1x,i5)') 'IYEARZ (From namelist) : ',iyearz @@ -134,15 +123,66 @@ subroutine read_landuse_matrix !------------------------------------------------------------------------------------! + + !------------------------------------------------------------------------------------! + ! This check was migrated from ed_opspec to here because the definition of life ! + ! forms can be modified through xml. ! + !------------------------------------------------------------------------------------! + if (ianth_disturb /= 0) then + !---------------------------------------------------------------------------------! + ! Pasture stocks must come from grasses. ! + !---------------------------------------------------------------------------------! + if (.not. is_grass(pasture_stock)) then + write(unit=*,fmt='(a,1x,i5)') ' PASTURE_STOCK = ',pasture_stock + write(unit=*,fmt='(a,5x,l1)') ' IS_GRASS = ',is_grass(agri_stock) + call fatal_error ('Pasture stock must come from a grass PFT.' & + ,'read_landuse_matrix','landuse_init.f90') + end if + !---------------------------------------------------------------------------------! + + + + !---------------------------------------------------------------------------------! + ! Cropland (agricultural) stocks must come from grasses. This may be ! + ! revisited if we start simulating tree crops. ! + !---------------------------------------------------------------------------------! + if (.not. is_grass(agri_stock)) then + write(unit=*,fmt='(a,1x,i5)') ' AGRI_STOCK = ',agri_stock + write(unit=*,fmt='(a,5x,l1)') ' IS_GRASS = ',is_grass(agri_stock) + call fatal_error ('Cropland stock must come from a grass PFT.' & + ,'read_landuse_matrix','landuse_init.f90') + end if + !---------------------------------------------------------------------------------! + + + + !----- Plantation stocks must come from tree PFTs. -------------------------------! + if (is_grass(plantation_stock) .or. is_liana(plantation_stock)) then + write(unit=*,fmt='(a,1x,i5)') ' PLANTATION_STOCK = ',plantation_stock + write(unit=*,fmt='(a,5x,l1)') ' IS_GRASS = ',is_grass(plantation_stock) + write(unit=*,fmt='(a,5x,l1)') ' IS_LIANA = ',is_liana(plantation_stock) + call fatal_error ('Plantation stock must come from a tree PFT.' & + ,'read_landuse_matrix','landuse_init.f90') + end if + !---------------------------------------------------------------------------------! + end if + !------------------------------------------------------------------------------------! + + + + !------------------------------------------------------------------------------------! + ! Loop through all grid cells. ! + !------------------------------------------------------------------------------------! gridloop: do igr = 1,ngrids !---------------------------------------------------------------------------------! ! Find the list of disturbance rate files. ! !---------------------------------------------------------------------------------! - if (ianth_disturb == 1) then + select case (ianth_disturb) + case (1,2) call ed_filelist(full_list,lu_database(igr),nflist) call ed1_fileinfo('.lu',nflist,full_list,nfllu,lu_list,llon_list,llat_list) - end if + end select !---------------------------------------------------------------------------------! cgrid=>edgrid_g(igr) @@ -165,21 +205,24 @@ subroutine read_landuse_matrix !----- Set the parameters in a way that no logging/ploughing will happen. --! do isi = 1,cpoly%nsites - cpoly%num_landuse_years (isi) = 1 - cpoly%mindbh_harvest (:,isi) = huge_dbh - cpoly%prob_harvest (:,isi) = 0. - cpoly%skid_dbh_thresh (:,isi) = huge_dbh - cpoly%skid_s_gtharv (:,isi) = 1. - cpoly%skid_s_ltharv (:,isi) = 1. - cpoly%felling_s_gtharv(:,isi) = 1. - cpoly%felling_s_ltharv(:,isi) = 1. + cpoly%num_landuse_years (isi) = 1 + cpoly%mindbh_felling (:,isi) = huge_dbh + cpoly%prob_felling (:,isi) = 0. + cpoly%felling_s_gtharv (:,isi) = 1. + cpoly%felling_s_ltharv (:,isi) = 1. + cpoly%thinning_dbh_thresh (:,isi) = huge_dbh + cpoly%thinning_s_gtharv (:,isi) = 1. + cpoly%thinning_s_ltharv (:,isi) = 1. + cpoly%skid_dbh_thresh (:,isi) = huge_dbh + cpoly%skid_s_gtharv (:,isi) = 1. + cpoly%skid_s_ltharv (:,isi) = 1. cpoly%clutimes(1,isi)%landuse_year = iyeara cpoly%clutimes(1,isi)%landuse(1:num_lu_trans) = 0.0 end do !---------------------------------------------------------------------------! - case (1) + case (1,2) !---------------------------------------------------------------------------! ! Initialise plantation patches if plantation information is available. ! @@ -191,20 +234,20 @@ subroutine read_landuse_matrix !---------------------------------------------------------------------------! - ! Initialise the PFT-dependent arrays with namelist data, but keep ! - ! harvest probability zero and minimum DBH for harvesting to infinity, to ! - ! prevent felling of these PFTs. ! + ! Initialise the PFT-dependent arrays with values that will prevent any ! + ! harvesting. Only if the data are found these will be defined. ! !---------------------------------------------------------------------------! do isi = 1,cpoly%nsites - cpoly%mindbh_harvest (:,isi) = huge_dbh - cpoly%prob_harvest (:,isi) = 0. - cpoly%skid_dbh_thresh (:,isi) = merge(huge_dbh,sl_skid_dbh_thresh & - ,is_grass(:)) - cpoly%skid_s_gtharv (:,isi) = merge( 1.00,sl_skid_s_gtharv,is_grass(:)) - cpoly%skid_s_ltharv (:,isi) = merge( 1.00,sl_skid_s_ltharv,is_grass(:)) - cpoly%felling_s_gtharv(:,isi) = merge( 0.70, 0.00,is_grass(:)) - cpoly%felling_s_ltharv(:,isi) = merge( 0.70,sl_felling_s_ltharv & - ,is_grass(:)) + cpoly%mindbh_felling (:,isi) = huge_dbh + cpoly%prob_felling (:,isi) = 0. + cpoly%felling_s_gtharv (:,isi) = 1. + cpoly%felling_s_ltharv (:,isi) = 1. + cpoly%thinning_dbh_thresh (:,isi) = huge_dbh + cpoly%thinning_s_gtharv (:,isi) = 1. + cpoly%thinning_s_ltharv (:,isi) = 1. + cpoly%skid_dbh_thresh (:,isi) = huge_dbh + cpoly%skid_s_gtharv (:,isi) = 1. + cpoly%skid_s_ltharv (:,isi) = 1. end do !---------------------------------------------------------------------------! @@ -240,18 +283,19 @@ subroutine read_landuse_matrix !---------------------------------------------------------------------------! ! Top header variables. Initialise them with dummy values. Except for ! - ! skid_area, they must be all assigned. Skid area by default the value ! - ! from the namelist. ! + ! skid_area, they must be all assigned. Skid area is zero by default. ! !---------------------------------------------------------------------------! - wlon = undef_real - elon = undef_real - slat = undef_real - nlat = undef_real - lu_area = undef_real - yd_1st = undef_integer - yd_last = undef_integer - skid_rel_area = sl_skid_rel_area - nharvest = undef_integer + wlon = undef_real + elon = undef_real + slat = undef_real + nlat = undef_real + lu_area = undef_real + yd_1st = undef_integer + yd_last = undef_integer + skid_rel_area = 0. + thinning_age_offset = huge_num + thinning_frac_area = 0. + nharvest = undef_integer !---------------------------------------------------------------------------! @@ -260,16 +304,19 @@ subroutine read_landuse_matrix ! optional variables, but they are useful to define logging strategies in ! ! more detail. ! !---------------------------------------------------------------------------! - harvest_pft (1:n_pft) = undef_integer - mindbh_slog (1:n_pft) = undef_real - harvprob_slog (1:n_pft) = undef_real - mindbh_fplt (1:n_pft) = undef_real - harvprob_fplt (1:n_pft) = undef_real - skid_dbh_thresh (1:n_pft) = undef_real - skid_s_gtharv (1:n_pft) = undef_real - skid_s_ltharv (1:n_pft) = undef_real - felling_s_gtharv(1:n_pft) = undef_real - felling_s_ltharv(1:n_pft) = undef_real + harvest_pft (1:n_pft) = undef_integer + mindbh_felling (1:n_pft) = undef_real + prob_harv_felling (1:n_pft) = 0. + mindbh_plantation (1:n_pft) = undef_real + prob_harv_plantation(1:n_pft) = 0. + felling_s_gtharv (1:n_pft) = 1. + felling_s_ltharv (1:n_pft) = 1. + thinning_dbh_thresh (1:n_pft) = undef_real + thinning_s_gtharv (1:n_pft) = 1. + thinning_s_ltharv (1:n_pft) = 1. + skid_dbh_thresh (1:n_pft) = undef_real + skid_s_gtharv (1:n_pft) = 1. + skid_s_ltharv (1:n_pft) = 1. !---------------------------------------------------------------------------! @@ -335,6 +382,14 @@ subroutine read_landuse_matrix !---- Damage area due to skid trails and roads. ----------------------! read(cdum,fmt=*) skid_rel_area !---------------------------------------------------------------------! + case ('THINNING_FRAC_AREA','THINNING.FRAC.AREA') + !---- Relative area to be thinned after logging. ---------------------! + read(cdum,fmt=*) thinning_frac_area + !---------------------------------------------------------------------! + case ('THINNING_AGE_OFFSET','THINNING.AGE.OFFSET') + !---- Time (age) offset to apply canopy thinning after harvesting. ---! + read(cdum,fmt=*) thinning_age_offset + !---------------------------------------------------------------------! case ('N_PFT_HARVEST' ,'N.PFT.HARVEST' ) !---- Number of PFTs to harvest. -------------------------------------! read(cdum,fmt=*) nharvest @@ -371,15 +426,19 @@ subroutine read_landuse_matrix write (unit=*,fmt='(a)') '------------------------------------' write (unit=*,fmt='(2(a,1x))') ' - File: ',trim(lu_name) write (unit=*,fmt='(a)') '------------------------------------' - write (unit=*,fmt='(a,1x,es12.5)') ' - WEST_LONGITUDE = ',wlon - write (unit=*,fmt='(a,1x,es12.5)') ' - EAST_LONGITUDE = ',elon - write (unit=*,fmt='(a,1x,es12.5)') ' - SOUTH_LATITUDE = ',slat - write (unit=*,fmt='(a,1x,es12.5)') ' - NORTH_LATITUDE = ',nlat - write (unit=*,fmt='(a,1x,es12.5)') ' - BLOCK_AREA = ',lu_area - write (unit=*,fmt='(a,1x,i6)') ' - FIRST_LUYEAR = ',yd_1st - write (unit=*,fmt='(a,1x,i6)') ' - LAST_LUYEAR = ',yd_last - write (unit=*,fmt='(a,1x,es12.5)') ' - SKID_AREA = ',skid_rel_area - write (unit=*,fmt='(a,1x,i6)') ' - N_PFT_HARVEST = ',nharvest + write (unit=*,fmt='(a,1x,es12.5)') ' - WEST_LONGITUDE = ',wlon + write (unit=*,fmt='(a,1x,es12.5)') ' - EAST_LONGITUDE = ',elon + write (unit=*,fmt='(a,1x,es12.5)') ' - SOUTH_LATITUDE = ',slat + write (unit=*,fmt='(a,1x,es12.5)') ' - NORTH_LATITUDE = ',nlat + write (unit=*,fmt='(a,1x,es12.5)') ' - BLOCK_AREA = ',lu_area + write (unit=*,fmt='(a,1x,i6)') ' - FIRST_LUYEAR = ',yd_1st + write (unit=*,fmt='(a,1x,i6)') ' - LAST_LUYEAR = ',yd_last + write (unit=*,fmt='(a,1x,es12.5)') ' - SKID_AREA = ',skid_rel_area + write (unit=*,fmt='(a,1x,es12.5)') ' - THIN_FRAC_AREA = ' & + , thinning_frac_area + write (unit=*,fmt='(a,1x,es12.5)') ' - THIN_AGE_OFFSET = ' & + , thinning_age_offset + write (unit=*,fmt='(a,1x,i6)') ' - N_PFT_HARVEST = ',nharvest write (unit=*,fmt='(a)') '------------------------------------' call fatal_error('Missing variables in input file (not an ED2 bug)!' & ,'read_landuse_matrix','landuse_init.f90') @@ -414,6 +473,7 @@ subroutine read_landuse_matrix !---------------------------------------------------------------------! + !---------------------------------------------------------------------! ! Identify which variable to read (multiple options are for ! ! back compatibility). ! @@ -421,57 +481,54 @@ subroutine read_landuse_matrix select case (trim(vkey)) case ('HARVEST_PFT','HARVEST.PFT') !---- PFTs to read. -----------------------------------------------! - read (cdum, fmt=*) (harvest_pft(h) ,h=1,nharvest) - !------------------------------------------------------------------! - - !------------------------------------------------------------------! - ! Assign defaults to variables in case they have not been ! - ! read yet. ! - !------------------------------------------------------------------! - mindbh_slog = merge( mindbh_slog , 0. & - , harvest_pft /= undef_integer .and. & - mindbh_slog /= undef_real ) - harvprob_slog = merge( harvprob_slog , 1. & - , harvest_pft /= undef_integer .and. & - harvprob_slog /= undef_real ) - mindbh_fplt = merge( mindbh_fplt , 0. & - , harvest_pft /= undef_integer .and. & - mindbh_fplt /= undef_real ) - harvprob_fplt = merge( harvprob_fplt , 1. & - , harvest_pft /= undef_integer .and. & - harvprob_fplt /= undef_real ) - skid_dbh_thresh = merge( skid_dbh_thresh , sl_skid_dbh_thresh & - , harvest_pft /= undef_integer .and. & - skid_dbh_thresh /= undef_real ) - skid_s_gtharv = merge( skid_s_gtharv , sl_skid_s_gtharv & - , harvest_pft /= undef_integer .and. & - skid_s_gtharv /= undef_real ) - skid_s_ltharv = merge( skid_s_ltharv , sl_skid_s_ltharv & - , harvest_pft /= undef_integer .and. & - skid_s_ltharv /= undef_real ) - felling_s_ltharv = merge( felling_s_ltharv, sl_felling_s_ltharv & - , harvest_pft /= undef_integer .and. & - felling_s_ltharv /= undef_real ) - felling_s_gtharv = merge( felling_s_gtharv, 0. & - , harvest_pft /= undef_integer .and. & - felling_s_gtharv /= undef_real ) + read (cdum, fmt=*) (harvest_pft (h),h=1,nharvest) !------------------------------------------------------------------! - - case ('MINDBH_SLOG','MINDBH.SLOG','MINDBH_1ARY','MINDBH.1ARY') + case ('MINDBH_SLOG','MINDBH.SLOG','MINDBH_1ARY','MINDBH.1ARY' & + ,'MINDBH_FELLING','MINDBH.FELLING') !---- Minimum DBH for harvesting: (selective) logging. ------------! - read (cdum, fmt=*) (mindbh_slog (h),h=1,nharvest) + read (cdum, fmt=*) (mindbh_felling (h),h=1,nharvest) !------------------------------------------------------------------! - case ('HARVPROB_SLOG','HARVPROB.SLOG','HARVPROB_1ARY','HARVPROB.1ARY') + case ('HARVPROB_SLOG','HARVPROB.SLOG','HARVPROB_1ARY','HARVPROB.1ARY' & + ,'HARVPROB_FELLING','HARVPROB.FELLING') !---- Harvest probability: (selective) logging. -------------------! - read (cdum, fmt=*) (harvprob_slog (h),h=1,nharvest) + read (cdum, fmt=*) (prob_harv_felling (h),h=1,nharvest) !------------------------------------------------------------------! - case ('MINDBH_FPLT','MINDBH.FPLT','MINDBH_2ARY','MINDBH.2ARY') + case ('MINDBH_FPLT','MINDBH.FPLT','MINDBH_2ARY','MINDBH.2ARY' & + ,'MINDBH_PLANTATION','MINDBH.PLANTATION') !---- Minimum DBH for harvesting: forest plantation. --------------! - read (cdum, fmt=*) (mindbh_fplt (h),h=1,nharvest) + read (cdum, fmt=*) (mindbh_plantation (h),h=1,nharvest) !------------------------------------------------------------------! - case ('HARVPROB_FPLT','HARVPROB.FPLT','HARVPROB_2ARY','HARVPROB.2ARY') + case ('HARVPROB_FPLT','HARVPROB.FPLT','HARVPROB_2ARY','HARVPROB.2ARY' & + ,'HARVPROB_PLANTATION','HARVPROB.PLANTATION') !---- Harvest probability: forest plantation. ---------------------! - read (cdum, fmt=*) (harvprob_fplt (h),h=1,nharvest) + read (cdum, fmt=*) (prob_harv_plantation(h),h=1,nharvest) + !------------------------------------------------------------------! + case ('FELLING_S_LTHARV','FELLING.S.LTHARV') + !---- Tree felling: Survivorship of small trees. ------------------! + read (cdum, fmt=*) (felling_s_ltharv (h),h=1,nharvest) + !------------------------------------------------------------------! + case ('FELLING_S_GTHARV','FELLING.S.GTHARV') + !------------------------------------------------------------------! + ! Tree felling: Survivorship of large trees. Leaving this as ! + ! a future option, though there is no strong reason to make this ! + ! survivorship anything other than 0. ! + !------------------------------------------------------------------! + read (cdum, fmt=*) (felling_s_gtharv (h),h=1,nharvest) + !------------------------------------------------------------------! + case ('THIN_DBH_THRESH','THIN.DBH.THRESH' & + ,'THINNING_DBH_THRESH','THINNING.DBH.THRESH') + !---- Canopy thinning: DBH threshold for small/large tree. --------! + read (cdum, fmt=*) (thinning_dbh_thresh (h),h=1,nharvest) + !------------------------------------------------------------------! + case ('THIN_S_GTHARV','THIN.S.GTHARV' & + ,'THINNING_S_GTHARV','THINNING.S.GTHARV') + !---- Canopy thinning: Survivorship of large trees. ---------------! + read (cdum, fmt=*) (thinning_s_gtharv (h),h=1,nharvest) + !------------------------------------------------------------------! + case ('THIN_S_LTHARV','THIN.S.LTHARV' & + ,'THINNING_S_LTHARV','THINNING.S.LTHARV') + !---- Canopy thinning: Survivorship of small trees. ---------------! + read (cdum, fmt=*) (thinning_s_ltharv (h),h=1,nharvest) !------------------------------------------------------------------! case ('SKID_DBH_THRESH','SKID.DBH.THRESH') !---- Skid damage: DBH threshold for small/large tree. ------------! @@ -485,18 +542,6 @@ subroutine read_landuse_matrix !---- Skid damage: Survivorship of small trees. -------------------! read (cdum, fmt=*) (skid_s_ltharv (h),h=1,nharvest) !------------------------------------------------------------------! - case ('FELLING_S_LTHARV','FELLING.S.LTHARV') - !---- Tree felling: Survivorship of small trees. ------------------! - read (cdum, fmt=*) (felling_s_ltharv(h),h=1,nharvest) - !------------------------------------------------------------------! - case ('FELLING_S_GTHARV','FELLING.S.GTHARV') - !------------------------------------------------------------------! - ! Tree felling: Survivorship of large trees. Leaving this as ! - ! a future option, though there is no strong reason to make this ! - ! survivorship anything other than 0. ! - !------------------------------------------------------------------! - read (cdum, fmt=*) (felling_s_gtharv(h),h=1,nharvest) - !------------------------------------------------------------------! case default !----- Key is not recognised. Stop the model. ---------------------! write (unit=*,fmt='(a)' ) '--------------------------------' @@ -512,9 +557,10 @@ subroutine read_landuse_matrix !------------------------------------------------------------------------! else !------------------------------------------------------------------------! - ! No specific PFT information was given, this is likely to be a case ! - ! in which the logging is based on absolute target biomass (PFT- and ! - ! DBH-blind). ! + ! No specific PFT information was given. This is likely an old file. ! + ! Back then all logging was assumed to be clear-cut for all PFTs, set ! + ! parameters to be based on absolute target biomass. Set all tree PFTs ! + ! to behave like clear cut, for back compatibility. ! !------------------------------------------------------------------------! h = 0 nopftloop: do ipft=1,n_pft @@ -524,16 +570,19 @@ subroutine read_landuse_matrix !----- Fill in with default. -----------------------------------------! - h = h + 1 - mindbh_slog (h) = 0. - harvprob_slog (h) = 1. - mindbh_fplt (h) = 0. - harvprob_fplt (h) = 1. - skid_dbh_thresh (h) = sl_skid_dbh_thresh - skid_s_gtharv (h) = sl_skid_s_gtharv - skid_s_ltharv (h) = sl_skid_s_ltharv - felling_s_ltharv(h) = sl_felling_s_ltharv - felling_s_gtharv(h) = 0. + h = h + 1 + mindbh_felling (h) = 0. + prob_harv_felling (h) = 1. + mindbh_plantation (h) = 0. + prob_harv_plantation(h) = 1. + felling_s_ltharv (h) = 0. + felling_s_gtharv (h) = 0. + thinning_dbh_thresh (h) = 0. + thinning_s_gtharv (h) = 0. + thinning_s_ltharv (h) = 0. + skid_dbh_thresh (h) = 0. + skid_s_gtharv (h) = 0. + skid_s_ltharv (h) = 0. !---------------------------------------------------------------------! end do nopftloop !------------------------------------------------------------------------! @@ -594,24 +643,36 @@ subroutine read_landuse_matrix !------------------------------------------------------------------------! + !------------------------------------------------------------------------! + ! Set some PFT-independent canopy thinning instructions: the ! + ! fraction of area previously logged where canopy thinning will occur, ! + ! and the time (age) offset to apply thinning. The minimum offset is one ! + ! year. If the offset is set to zero, then we will assume 1. Likewise, ! + ! the maximum fraction allowed is 1. ! + !------------------------------------------------------------------------! + cpoly%thinning_frac_area (isi) = min(1.0,thinning_frac_area ) + cpoly%thinning_age_offset(isi) = max(1.0,thinning_age_offset) + !------------------------------------------------------------------------! + + !----- Fill the arrays with the appropriate PFT. ------------------------! select case(cpoly%plantation(isi)) case (0) - harvloop_slog: do h=1,nharvest + harvloop_felling: do h=1,nharvest ipft = harvest_pft(h) if (ipft >= 1 .and. ipft <= n_pft) then - cpoly%mindbh_harvest(ipft,isi) = mindbh_slog (h) - cpoly%prob_harvest (ipft,isi) = harvprob_slog(h) + cpoly%mindbh_felling(ipft,isi) = mindbh_felling (h) + cpoly%prob_felling (ipft,isi) = prob_harv_felling(h) end if - end do harvloop_slog + end do harvloop_felling case (1) - harvloop_fplt: do h=1,nharvest + harvloop_plantation: do h=1,nharvest ipft = harvest_pft(h) if (ipft >= 1 .and. ipft <= n_pft) then - cpoly%mindbh_harvest(ipft,isi) = mindbh_fplt (h) - cpoly%prob_harvest (ipft,isi) = harvprob_fplt(h) + cpoly%mindbh_felling(ipft,isi) = mindbh_plantation (h) + cpoly%prob_felling (ipft,isi) = prob_harv_plantation(h) end if - end do harvloop_fplt + end do harvloop_plantation end select !------------------------------------------------------------------------! @@ -624,11 +685,14 @@ subroutine read_landuse_matrix skidloop_site: do h=1,nharvest ipft = harvest_pft(h) if (ipft >= 1 .and. ipft <= n_pft) then - cpoly%skid_dbh_thresh (ipft,isi) = skid_dbh_thresh (h) - cpoly%skid_s_gtharv (ipft,isi) = skid_s_gtharv (h) - cpoly%skid_s_ltharv (ipft,isi) = skid_s_ltharv (h) - cpoly%felling_s_ltharv(ipft,isi) = felling_s_ltharv(h) - cpoly%felling_s_gtharv(ipft,isi) = felling_s_gtharv(h) + cpoly%felling_s_ltharv (ipft,isi) = felling_s_ltharv (h) + cpoly%felling_s_gtharv (ipft,isi) = felling_s_gtharv (h) + cpoly%thinning_dbh_thresh(ipft,isi) = thinning_dbh_thresh(h) + cpoly%thinning_s_gtharv (ipft,isi) = thinning_s_gtharv (h) + cpoly%thinning_s_ltharv (ipft,isi) = thinning_s_ltharv (h) + cpoly%skid_dbh_thresh (ipft,isi) = skid_dbh_thresh (h) + cpoly%skid_s_gtharv (ipft,isi) = skid_s_gtharv (h) + cpoly%skid_s_ltharv (ipft,isi) = skid_s_ltharv (h) end if end do skidloop_site !------------------------------------------------------------------------! @@ -693,14 +757,23 @@ subroutine read_landuse_matrix !---------------------------------------------------------------------! + !----- Define canopy thinning instructions. --------------------------! + cpoly%thinning_frac_area (isi) = cpoly%thinning_frac_area (1) + cpoly%thinning_age_offset(isi) = cpoly%thinning_age_offset(1) + !---------------------------------------------------------------------! + + !----- PFT-dependent harvest characteristics. ------------------------! - cpoly%mindbh_harvest (:,isi) = cpoly%mindbh_harvest (:,1) - cpoly%prob_harvest (:,isi) = cpoly%prob_harvest (:,1) - cpoly%skid_dbh_thresh (:,isi) = cpoly%skid_dbh_thresh (:,1) - cpoly%skid_s_gtharv (:,isi) = cpoly%skid_s_gtharv (:,1) - cpoly%skid_s_ltharv (:,isi) = cpoly%skid_s_ltharv (:,1) - cpoly%felling_s_ltharv(:,isi) = cpoly%felling_s_ltharv(:,1) - cpoly%felling_s_gtharv(:,isi) = cpoly%felling_s_gtharv(:,1) + cpoly%mindbh_felling (:,isi) = cpoly%mindbh_felling (:,1) + cpoly%prob_felling (:,isi) = cpoly%prob_felling (:,1) + cpoly%felling_s_gtharv (:,isi) = cpoly%felling_s_gtharv (:,1) + cpoly%felling_s_ltharv (:,isi) = cpoly%felling_s_ltharv (:,1) + cpoly%thinning_dbh_thresh (:,isi) = cpoly%thinning_dbh_thresh (:,1) + cpoly%thinning_s_gtharv (:,isi) = cpoly%thinning_s_gtharv (:,1) + cpoly%thinning_s_ltharv (:,isi) = cpoly%thinning_s_ltharv (:,1) + cpoly%skid_dbh_thresh (:,isi) = cpoly%skid_dbh_thresh (:,1) + cpoly%skid_s_gtharv (:,isi) = cpoly%skid_s_gtharv (:,1) + cpoly%skid_s_ltharv (:,isi) = cpoly%skid_s_ltharv (:,1) !---------------------------------------------------------------------! @@ -744,14 +817,19 @@ subroutine read_landuse_matrix do isi = 1,cpoly%nsites cpoly%clutimes(1,isi)%landuse_year = iyeara cpoly%clutimes(1,isi)%landuse(1:num_lu_trans) = 0.0 - cpoly%skid_rel_area (isi) = 0. - cpoly%mindbh_harvest (:,isi) = huge_dbh - cpoly%prob_harvest (:,isi) = 0. - cpoly%skid_dbh_thresh (:,isi) = huge_dbh - cpoly%skid_s_gtharv (:,isi) = 1. - cpoly%skid_s_ltharv (:,isi) = 1. - cpoly%felling_s_ltharv(:,isi) = 1. - cpoly%felling_s_gtharv(:,isi) = 1. + cpoly%skid_rel_area (isi) = 0. + cpoly%thinning_frac_area (isi) = 0. + cpoly%thinning_age_offset (isi) = huge_num + cpoly%mindbh_felling (:,isi) = huge_dbh + cpoly%prob_felling (:,isi) = 0. + cpoly%felling_s_gtharv (:,isi) = 1. + cpoly%felling_s_ltharv (:,isi) = 1. + cpoly%thinning_dbh_thresh (:,isi) = huge_dbh + cpoly%thinning_s_gtharv (:,isi) = 1. + cpoly%thinning_s_ltharv (:,isi) = 1. + cpoly%skid_dbh_thresh (:,isi) = huge_dbh + cpoly%skid_s_gtharv (:,isi) = 1. + cpoly%skid_s_ltharv (:,isi) = 1. end do end if !---------------------------------------------------------------------------! @@ -760,246 +838,12 @@ subroutine read_landuse_matrix !----- Close the land use file, outside the if statement. ------------------! close(unit=12,status='keep') !---------------------------------------------------------------------------! - - case (2) - !---------------------------------------------------------------------------! - ! Make the land use data based on ED2IN. ! - ! Work with the first site, then copy the data to the others. ! - !---------------------------------------------------------------------------! - isi = 1 - csite => cpoly%site(isi) - !---------------------------------------------------------------------------! - - - !----- No plantations. -----------------------------------------------------! - cpoly%plantation(:) = 0 - !---------------------------------------------------------------------------! - - - - !----- Determine the number of disturbance years. --------------------------! - cpoly%num_landuse_years(isi) = sim_years - !---------------------------------------------------------------------------! - - - - !----- File exists, allocate the maximum number of years. ------------------! - allocate(cpoly%clutimes(sim_years,cpoly%nsites)) - !---------------------------------------------------------------------------! - - - !----- Define the degree of damage relative to felling. --------------------! - cpoly%skid_rel_area(isi) = cpoly%skid_rel_area(1) - !---------------------------------------------------------------------------! - - - !----- Initialise the PFT-dependent arrays. --------------------------------! - cpoly%mindbh_harvest (:,isi) = huge_dbh - cpoly%prob_harvest (:,isi) = 0. - cpoly%skid_dbh_thresh (:,isi) = merge(huge_dbh,sl_skid_dbh_thresh & - ,is_grass(:)) - cpoly%skid_s_gtharv (:,isi) = merge( 1.00,sl_skid_s_gtharv ,is_grass(:)) - cpoly%skid_s_ltharv (:,isi) = merge( 1.00,sl_skid_s_ltharv ,is_grass(:)) - cpoly%felling_s_gtharv(:,isi) = merge( 0.70, 0.00 ,is_grass(:)) - cpoly%felling_s_ltharv(:,isi) = merge( 0.70,sl_felling_s_ltharv,is_grass(:)) - !---------------------------------------------------------------------------! - - - - !------ Find the number of PFT that can be harvested. ----------------------! - nharvest = count(sl_pft >= 1 .and. sl_pft <= n_pft) - !---------------------------------------------------------------------------! - - !----- Fill the arrays with the appropriate PFT. ---------------------------! - harvloop_two: do h=1,nharvest - ipft = sl_pft(h) - if (ipft >= 1 .and. ipft <= n_pft) then - cpoly%mindbh_harvest(ipft,isi) = sl_mindbh_harvest(h) - cpoly%prob_harvest (ipft,isi) = sl_prob_harvest (h) - end if - end do harvloop_two - !---------------------------------------------------------------------------! - - - - !---------------------------------------------------------------------------! - ! Fill in the disturbance matrices and biomass target. ! - !---------------------------------------------------------------------------! - iyear = 0 - do yd_this = iyeara,iyearz - iyear = iyear + 1 - clutime => cpoly%clutimes(iyear,isi) - - clutime%landuse_year = yd_this - clutime%landuse(1:num_lu_trans) = 0. - - !------------------------------------------------------------------------! - ! Decide whether to include logging disturbance in this year. ! - !------------------------------------------------------------------------! - if (yd_this >= sl_yr_first) then - if ( (sl_scale == 1) .or. (mod(yd_this-sl_yr_first,sl_nyrs) == 0) ) & - then - clutime%landuse(11) = lnexp_max - clutime%landuse(12) = -1.0 - clutime%landuse(14) = -1.0 - end if - end if - !------------------------------------------------------------------------! - end do - !---------------------------------------------------------------------------! - - - !---------------------------------------------------------------------------! - ! Copy the information from the first site to the others. ! - !---------------------------------------------------------------------------! - siteloop_two: do isi = 2,cpoly%nsites - csite => cpoly%site(isi) - - !----- Determine the number of disturbance years. -----------------------! - cpoly%num_landuse_years(isi) = cpoly%num_landuse_years(1) - !------------------------------------------------------------------------! - - - !----- Define the degree of damage relative to felling. -----------------! - cpoly%skid_rel_area(isi) = cpoly%skid_rel_area(1) - !------------------------------------------------------------------------! - - - !----- PFT-dependent harvest characteristics. ---------------------------! - cpoly%mindbh_harvest (:,isi) = cpoly%mindbh_harvest (:,1) - cpoly%prob_harvest (:,isi) = cpoly%prob_harvest (:,1) - cpoly%skid_dbh_thresh (:,isi) = cpoly%skid_dbh_thresh (:,1) - cpoly%skid_s_gtharv (:,isi) = cpoly%skid_s_gtharv (:,1) - cpoly%skid_s_ltharv (:,isi) = cpoly%skid_s_ltharv (:,1) - cpoly%felling_s_gtharv(:,isi) = cpoly%felling_s_gtharv(:,1) - cpoly%felling_s_ltharv(:,isi) = cpoly%felling_s_ltharv(:,1) - !------------------------------------------------------------------------! - - - - !----- Disturbances. ----------------------------------------------------! - do iyear = 1,cpoly%num_landuse_years(isi) - clutime => cpoly%clutimes(iyear,isi) - onelutime => cpoly%clutimes(iyear,1) - clutime%landuse_year = onelutime%landuse_year - clutime%landuse(1:num_lu_trans) = onelutime%landuse(1:num_lu_trans) - end do - !------------------------------------------------------------------------! - - end do siteloop_two end select !------------------------------------------------------------------------------! - - - !------------------------------------------------------------------------------! - ! Write a table somewhat similar to lu file. ! - !------------------------------------------------------------------------------! - if (write_lu_settings) then - cpoly => cgrid%polygon(ipy) - isi = 1 - - wlon = 0.1 * real(nint(10.*cgrid%lon(ipy))) - 0.5 - elon = 0.1 * real(nint(10.*cgrid%lon(ipy))) + 0.5 - slat = 0.1 * real(nint(10.*cgrid%lat(ipy))) - 0.5 - nlat = 0.1 * real(nint(10.*cgrid%lat(ipy))) + 0.5 - lu_area = solid_area(wlon,slat,elon,nlat) - - !---------------------------------------------------------------------------! - ! Find which PFTs to harvest. If none is provided, we skip this part ! - ! of the header. ! - !---------------------------------------------------------------------------! - nharvest = count(cpoly%prob_harvest(:,isi) > 0.0) - write(hifmt,fmt='(a,i2.2,a)') '(a,',nharvest,'(i2,1x))' - write(hffmt,fmt='(a,i2.2,a)') '(a,',nharvest,'(f8.3,1x))' - h = 0 - do ipft=1,n_pft - if (cpoly%prob_harvest(ipft,isi) > 0.0) then - h = h + 1 - harvest_pft (h) = ipft - mindbh_slog (h) = cpoly%mindbh_harvest (ipft,isi) - harvprob_slog (h) = cpoly%prob_harvest (ipft,isi) - mindbh_fplt (h) = cpoly%mindbh_harvest (ipft,isi) - harvprob_fplt (h) = cpoly%prob_harvest (ipft,isi) - skid_dbh_thresh (h) = cpoly%skid_dbh_thresh (ipft,isi) - skid_s_gtharv (h) = cpoly%skid_s_gtharv (ipft,isi) - skid_s_ltharv (h) = cpoly%skid_s_ltharv (ipft,isi) - felling_s_ltharv(h) = cpoly%felling_s_ltharv(ipft,isi) - felling_s_gtharv(h) = cpoly%felling_s_gtharv(ipft,isi) - end if - end do - !---------------------------------------------------------------------------! - - - - !---------------------------------------------------------------------------! - ! Write the LU-like file. ! - !---------------------------------------------------------------------------! - - - - !---------------------------------------------------------------------------! - ! Write the LU-like file. ! - !---------------------------------------------------------------------------! - open(unit=16,file=trim(lu_table),status='replace',action='write') - write(unit=16,fmt='(a,1x,f8.3)' ) 'WEST_LONGITUDE = ',wlon - write(unit=16,fmt='(a,1x,f8.3)' ) 'EAST_LONGITUDE = ',elon - write(unit=16,fmt='(a,1x,f8.3)' ) 'SOUTH_LATITUDE = ',slat - write(unit=16,fmt='(a,1x,f8.3)' ) 'NORTH_LATITUDE = ',nlat - write(unit=16,fmt='(a,1x,f20.5)') 'BLOCK_AREA = ',lu_area - write(unit=16,fmt='(a,1x,i4.4)' ) 'FIRST_LUYEAR = ',iyeara - write(unit=16,fmt='(a,1x,i4.4)' ) 'LAST_LUYEAR = ',iyearz - write(unit=16,fmt='(a,1x,f8.3)' ) 'SKID_AREA = ',skid_rel_area - write(unit=16,fmt='(a,1x,i2)' ) 'N_PFT_HARVEST = ',nharvest - if (nharvest > 0) then - write(unit=16,fmt=hifmt) & - 'HARVEST_PFT = ',(harvest_pft (h),h=1,nharvest) - write(unit=16,fmt=hffmt) & - 'MINDBH_SLOG = ',(mindbh_slog (h),h=1,nharvest) - write(unit=16,fmt=hffmt) & - 'HARVPROB_SLOG = ',(harvprob_slog (h),h=1,nharvest) - write(unit=16,fmt=hffmt) & - 'MINDBH_FPLT = ',(mindbh_fplt (h),h=1,nharvest) - write(unit=16,fmt=hffmt) & - 'HARVPROB_FPLT = ',(harvprob_fplt (h),h=1,nharvest) - write(unit=16,fmt=hffmt) & - 'SKID_DBH_THRESH = ',(skid_dbh_thresh (h),h=1,nharvest) - write(unit=16,fmt=hffmt) & - 'SKID_S_GTHARV = ',(skid_s_gtharv (h),h=1,nharvest) - write(unit=16,fmt=hffmt) & - 'SKID_S_LTHARV = ',(skid_s_ltharv (h),h=1,nharvest) - write(unit=16,fmt=hffmt) & - 'FELLING_S_LTHARV = ',(felling_s_ltharv(h),h=1,nharvest) - write(unit=16,fmt=hffmt) & - 'FELLING_S_GTHARV = ',(felling_s_gtharv(h),h=1,nharvest) - end if - write(unit=16,fmt='(a,19(1x,a))') 'YEAR',' CPL_PST',' PST_CPL' & - ,' PST_VEG',' VEG_PST',' VEG_CLP',' CPL_VEG' & - ,' SEC_CPL',' CPL_SEC',' SEC_PST',' PST_SEC' & - ,' VEG_SEC',' BT_MAT_SEC',' FL_MAT_SEC',' BT_MAT_VEG' & - ,' FL_MAT_VEG',' BT_YNG_SEC',' FL_YNG_SEC',' BT_YNG_VEG' & - ,' FL_YNG_VEG' - !----- Disturbances. -------------------------------------------------------! - do iyear = 1,cpoly%num_landuse_years(isi) - clutime => cpoly%clutimes(iyear,isi) - landuse_now = clutime%landuse - if (landuse_now(12) > 0.) landuse_now(12) = lu_area * landuse_now(12) - if (landuse_now(14) > 0.) landuse_now(14) = lu_area * landuse_now(14) - landuse_now(16) = lu_area * landuse_now(16) - landuse_now(18) = lu_area * landuse_now(18) - - write(unit=16,fmt='(i4.4,19(1x,es12.5))') & - clutime%landuse_year,(landuse_now(h),h=1,num_lu_trans) - !------------------------------------------------------------------------! - end do - close(unit=16,status='keep') - !---------------------------------------------------------------------------! - end if - !------------------------------------------------------------------------------! end do polyloop !---------------------------------------------------------------------------------! end do gridloop !------------------------------------------------------------------------------------! - return end subroutine read_landuse_matrix !=======================================================================================! diff --git a/ED/src/io/ed_init_history.f90 b/ED/src/io/ed_init_history.f90 index f21d25361..4ab673559 100644 --- a/ED/src/io/ed_init_history.f90 +++ b/ED/src/io/ed_init_history.f90 @@ -640,14 +640,7 @@ end subroutine resume_from_history !=======================================================================================! !=======================================================================================! subroutine fill_history_grid(cgrid,ipy,py_index) - use ed_state_vars, only : edtype & ! structure - , polygontype ! ! structure - use ed_max_dims , only : n_pft & ! intent(in) - , n_dbh & ! intent(in) - , n_age & ! intent(in) - , max_site & ! intent(in) - , n_dist_types ! ! intent(in) - use hdf5 + use ed_state_vars, only : edtype ! ! structure implicit none !------------------------------------------------------------------------------------! @@ -688,13 +681,7 @@ end subroutine fill_history_grid !=======================================================================================! !=======================================================================================! subroutine fill_history_grid_p11(cgrid,ipy,py_index) - use ed_state_vars, only : edtype & ! structure - , polygontype ! ! structure - use ed_max_dims , only : n_pft & ! intent(in) - , n_dbh & ! intent(in) - , n_age & ! intent(in) - , max_site & ! intent(in) - , n_dist_types ! ! intent(in) + use ed_state_vars, only : edtype ! ! structure use hdf5 use hdf5_coms , only : globdims & ! intent(inout) , chnkdims & ! intent(inout) @@ -894,13 +881,7 @@ end subroutine fill_history_grid_p11 !=======================================================================================! !=======================================================================================! subroutine fill_history_grid_p11dmean(cgrid,ipy,py_index) - use ed_state_vars, only : edtype & ! structure - , polygontype ! ! structure - use ed_max_dims , only : n_pft & ! intent(in) - , n_dbh & ! intent(in) - , n_age & ! intent(in) - , max_site & ! intent(in) - , n_dist_types ! ! intent(in) + use ed_state_vars, only : edtype ! ! structure use hdf5 use hdf5_coms , only : globdims & ! intent(inout) , chnkdims & ! intent(inout) @@ -1304,13 +1285,7 @@ end subroutine fill_history_grid_p11dmean !=======================================================================================! !=======================================================================================! subroutine fill_history_grid_p11mmean(cgrid,ipy,py_index) - use ed_state_vars, only : edtype & ! structure - , polygontype ! ! structure - use ed_max_dims , only : n_pft & ! intent(in) - , n_dbh & ! intent(in) - , n_age & ! intent(in) - , max_site & ! intent(in) - , n_dist_types ! ! intent(in) + use ed_state_vars, only : edtype ! ! structure use hdf5 use hdf5_coms , only : globdims & ! intent(inout) , chnkdims & ! intent(inout) @@ -1831,14 +1806,8 @@ end subroutine fill_history_grid_p11mmean !=======================================================================================! !=======================================================================================! subroutine fill_history_grid_p12(cgrid,ipy,py_index) - use ed_state_vars, only : edtype & ! structure - , polygontype ! ! structure + use ed_state_vars, only : edtype ! ! structure use grid_coms , only : nzg ! ! intent(in) - use ed_max_dims , only : n_pft & ! intent(in) - , n_dbh & ! intent(in) - , n_age & ! intent(in) - , max_site & ! intent(in) - , n_dist_types ! ! intent(in) use hdf5 use hdf5_coms , only : globdims & ! intent(inout) , chnkdims & ! intent(inout) @@ -1976,13 +1945,7 @@ end subroutine fill_history_grid_p12 !=======================================================================================! !=======================================================================================! subroutine fill_history_grid_m11(cgrid,ipy,py_index) - use ed_state_vars, only : edtype & ! structure - , polygontype ! ! structure - use ed_max_dims , only : n_pft & ! intent(in) - , n_dbh & ! intent(in) - , n_age & ! intent(in) - , max_site & ! intent(in) - , n_dist_types ! ! intent(in) + use ed_state_vars, only : edtype ! ! structure use hdf5 use hdf5_coms , only : globdims & ! intent(inout) , chnkdims & ! intent(inout) @@ -2426,13 +2389,7 @@ end subroutine fill_history_grid_m11 !=======================================================================================! !=======================================================================================! subroutine fill_history_grid_p19(cgrid,ipy,py_index) - use ed_state_vars, only : edtype & ! structure - , polygontype ! ! structure - use ed_max_dims , only : n_pft & ! intent(in) - , n_dbh & ! intent(in) - , n_age & ! intent(in) - , max_site & ! intent(in) - , n_dist_types ! ! intent(in) + use ed_state_vars, only : edtype ! ! structure use hdf5 use hdf5_coms , only : globdims & ! intent(inout) , chnkdims & ! intent(inout) @@ -2532,13 +2489,7 @@ end subroutine fill_history_grid_p19 !=======================================================================================! !=======================================================================================! subroutine fill_history_grid_p191(cgrid,ipy,py_index) - use ed_state_vars, only : edtype & ! structure - , polygontype ! ! structure - use ed_max_dims , only : n_pft & ! intent(in) - , n_dbh & ! intent(in) - , n_age & ! intent(in) - , max_site & ! intent(in) - , n_dist_types ! ! intent(in) + use ed_state_vars, only : edtype ! ! structure use hdf5 use hdf5_coms , only : globdims & ! intent(inout) , chnkdims & ! intent(inout) @@ -2635,14 +2586,8 @@ end subroutine fill_history_grid_p191 !=======================================================================================! !=======================================================================================! subroutine fill_history_grid_m12(cgrid,ipy,py_index) - use ed_state_vars, only : edtype & ! structure - , polygontype ! ! structure + use ed_state_vars, only : edtype ! ! structure use grid_coms , only : nzg ! ! intent(in) - use ed_max_dims , only : n_pft & ! intent(in) - , n_dbh & ! intent(in) - , n_age & ! intent(in) - , max_site & ! intent(in) - , n_dist_types ! ! intent(in) use hdf5 use hdf5_coms , only : globdims & ! intent(inout) , chnkdims & ! intent(inout) @@ -2767,10 +2712,7 @@ subroutine fill_history_grid_p146(cgrid,ipy,py_index) use ed_state_vars, only : edtype & ! structure , polygontype ! ! structure use ed_max_dims , only : n_pft & ! intent(in) - , n_dbh & ! intent(in) - , n_age & ! intent(in) - , max_site & ! intent(in) - , n_dist_types ! ! intent(in) + , n_dbh ! ! intent(in) use hdf5 use hdf5_coms , only : globdims & ! intent(inout) , chnkdims & ! intent(inout) diff --git a/ED/src/io/ed_load_namelist.f90 b/ED/src/io/ed_load_namelist.f90 index 3b61320d2..cd181df0b 100644 --- a/ED/src/io/ed_load_namelist.f90 +++ b/ED/src/io/ed_load_namelist.f90 @@ -136,17 +136,6 @@ subroutine copy_nl(copy_type) , sm_fire & ! intent(out) , time2canopy & ! intent(out) , min_patch_area & ! intent(out) - , sl_scale & ! intent(out) - , sl_yr_first & ! intent(out) - , sl_nyrs & ! intent(out) - , sl_pft & ! intent(out) - , sl_prob_harvest & ! intent(out) - , sl_mindbh_harvest & ! intent(out) - , sl_biomass_harvest & ! intent(out) - , sl_skid_rel_area & ! intent(out) - , sl_skid_s_gtharv & ! intent(out) - , sl_skid_s_ltharv & ! intent(out) - , sl_felling_s_ltharv & ! intent(out) , cl_fseeds_harvest & ! intent(out) , cl_fstorage_harvest & ! intent(out) , cl_fleaf_harvest ! ! intent(out) @@ -280,7 +269,6 @@ subroutine copy_nl(copy_type) character(len=*), intent(in) :: copy_type !----- Internal variables. -------------------------------------------------------------! integer :: ifm - integer, dimension(n_pft) :: idx !---------------------------------------------------------------------------------------! !---------------------------------------------------------------------------------------! @@ -419,17 +407,6 @@ subroutine copy_nl(copy_type) fire_parameter = nl%fire_parameter sm_fire = nl%sm_fire ianth_disturb = nl%ianth_disturb - sl_scale = nl%sl_scale - sl_yr_first = nl%sl_yr_first - sl_nyrs = nl%sl_nyrs - sl_pft = nl%sl_pft - sl_prob_harvest = nl%sl_prob_harvest - sl_mindbh_harvest = nl%sl_mindbh_harvest - sl_biomass_harvest = nl%sl_biomass_harvest - sl_skid_rel_area = nl%sl_skid_rel_area - sl_skid_s_gtharv = nl%sl_skid_s_gtharv - sl_skid_s_ltharv = nl%sl_skid_s_ltharv - sl_felling_s_ltharv = nl%sl_felling_s_ltharv cl_fseeds_harvest = nl%cl_fseeds_harvest cl_fstorage_harvest = nl%cl_fstorage_harvest cl_fleaf_harvest = nl%cl_fleaf_harvest @@ -638,21 +615,6 @@ subroutine copy_nl(copy_type) call sort_up(include_these_pft,n_pft) !---------------------------------------------------------------------------------------! - - - - !----- Sort up the PFTs that may be logged. --------------------------------------------! - where (sl_pft < 1 .or. sl_pft > n_pft) - sl_pft = skip_integer - sl_mindbh_harvest = skip_real - sl_prob_harvest = skip_real - end where - call rank_up_i(n_pft,sl_pft,idx) - sl_pft (idx) = sl_pft(:) - sl_mindbh_harvest(idx) = sl_mindbh_harvest(:) - sl_prob_harvest (idx) = sl_prob_harvest(:) - !---------------------------------------------------------------------------------------! - !----- Determine the length of simuation. ----------------------------------------------! call date_2_seconds (iyearz,imonthz,idatez,itimez*100,iyeara,imontha,idatea,itimea*100 & diff --git a/ED/src/io/ed_opspec.F90 b/ED/src/io/ed_opspec.F90 index c688538ca..2cff44de0 100644 --- a/ED/src/io/ed_opspec.F90 +++ b/ED/src/io/ed_opspec.F90 @@ -1167,8 +1167,6 @@ subroutine ed_opspec_misc , iooutput & ! intent(in) , isoutput & ! intent(in) , igoutput & ! intent(in) - , iyeara & ! intent(in) - , iyearz & ! intent(in) , iadd_site_means & ! intent(in) , iadd_patch_means & ! intent(in) , iadd_cohort_means & ! intent(in) @@ -1230,18 +1228,6 @@ subroutine ed_opspec_misc , time2canopy & ! intent(in) , treefall_disturbance_rate & ! intent(in) , min_patch_area & ! intent(in) - , sl_scale & ! intent(in) - , sl_yr_first & ! intent(in) - , sl_nyrs & ! intent(in) - , sl_pft & ! intent(in) - , sl_prob_harvest & ! intent(in) - , sl_mindbh_harvest & ! intent(in) - , sl_biomass_harvest & ! intent(in) - , sl_skid_rel_area & ! intent(in) - , sl_skid_dbh_thresh & ! intent(in) - , sl_skid_s_gtharv & ! intent(in) - , sl_skid_s_ltharv & ! intent(in) - , sl_felling_s_ltharv & ! intent(in) , cl_fseeds_harvest & ! intent(in) , cl_fstorage_harvest & ! intent(in) , cl_fleaf_harvest ! ! intent(in) @@ -1286,7 +1272,7 @@ subroutine ed_opspec_misc logical :: plantation_ok logical :: patch_detailed logical :: lu_detailed - !---------------------------------------------------------------------------------------! + !---------------------------------------------------------------------------------------! !----- IFATERR will count the number of bad set ups. -----------------------------------! ifaterr=0 @@ -1994,156 +1980,12 @@ subroutine ed_opspec_misc call opspec_fatal(reason,'opspec_misc') ifaterr = ifaterr +1 end if - - !---------------------------------------------------------------------------------------! - ! The following settings matter only when ianth_disturb is 2. ! - !---------------------------------------------------------------------------------------! - select case (ianth_disturb) - case (2) - if (sl_scale < 0 .or. sl_scale > 1) then - write (reason,fmt='(a,1x,i4,a)') & - 'Invalid SL_SCALE, it must be either 0 and 1. Yours is set to' & - ,sl_scale,'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr = ifaterr +1 - end if - - if (sl_yr_first < iyeara .or. sl_yr_first > iyearz) then - write (reason,fmt='(a,i4,2a,i4,a,1x,i4,a)') & - 'Invalid SL_YR_FIRST, it must be between IYEARA (',iyeara,') and ' & - ,'IYEARZ (',iyearz,'). Yours is set to',sl_yr_first,'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr = ifaterr +1 - end if - - if (sl_nyrs < 1 .or. sl_nyrs > 2000) then - write (reason,fmt='(a,1x,i4,a)') & - 'Invalid SL_NYRS, it must be between 1 and 2000. Yours is set to' & - ,sl_nyrs,'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr = ifaterr +1 - end if - - !------------------------------------------------------------------------------------! - ! Check whether the user is attempting to include invalid pfts. ! - !------------------------------------------------------------------------------------! - sl_pft_loop: do ipft=1,n_pft - if (sl_pft(ipft) == skip_integer) then - if (ipft /= 1) then - exit sl_pft_loop - else - write (reason,fmt='(a)') 'You did not specify any valid SL_PFT.' - call opspec_fatal(reason,'opspec_misc') - ifaterr=ifaterr+1 - end if - elseif (sl_pft(ipft) < 0 .or. sl_pft(ipft) > n_pft) then - write (reason,fmt='(a,1x,i4,a,1x,i4,a)') & - 'Invalid SL_PFT, it must be between 1 and ',n_pft & - ,'. One of yours is set to',sl_pft(ipft),'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr=ifaterr+1 - end if - end do sl_pft_loop - !------------------------------------------------------------------------------------! - - !------------------------------------------------------------------------------------! - ! Check whether the user is attempting to include invalid minimum DBH. ! - !------------------------------------------------------------------------------------! - sl_mindbh_loop: do ipft=1,n_pft - if (sl_mindbh_harvest(ipft) == skip_real) then - if (ipft /= 1) then - exit sl_mindbh_loop - else - write (reason,fmt='(a)') 'You did not specify any valid SL_MINDBH_HARVEST.' - call opspec_fatal(reason,'opspec_misc') - ifaterr=ifaterr+1 - end if - elseif (sl_mindbh_harvest(ipft) < 0) then - write (reason,fmt='(2a,1x,es12.5,a)') & - 'Invalid SL_MINDBH_HARVEST, it must be non-negative.' & - ,' One of yours is set to',sl_mindbh_harvest(ipft),'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr=ifaterr+1 - end if - end do sl_mindbh_loop - !------------------------------------------------------------------------------------! - - !------------------------------------------------------------------------------------! - ! Check whether the user is attempting to include invalid harvest probability. ! - !------------------------------------------------------------------------------------! - sl_pharv_loop: do ipft=1,n_pft - if (sl_prob_harvest(ipft) == skip_real) then - if (ipft /= 1) then - exit sl_pharv_loop - else - write (reason,fmt='(a)') 'You did not specify any valid SL_PROB_HARVEST.' - call opspec_fatal(reason,'opspec_misc') - ifaterr=ifaterr+1 - end if - elseif (sl_prob_harvest(ipft) < 0. .or. sl_prob_harvest(ipft) > 1.) then - write (reason,fmt='(2a,1x,es12.5,a)') & - 'Invalid SL_MINDBH_HARVEST, it must be between 0.0 and 1.0.' & - ,'. One of yours is set to',sl_prob_harvest(ipft),'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr=ifaterr+1 - end if - end do sl_pharv_loop - !------------------------------------------------------------------------------------! - - if (sl_biomass_harvest < 0. .or. sl_biomass_harvest > 50.) then - write (reason,fmt='(2a,1x,es12.5,a)') & - 'Invalid SL_BIOMASS_HARVEST, it must be between 0. and 50.' & - ,' Yours is set to',sl_biomass_harvest,'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr = ifaterr +1 - end if - end select !---------------------------------------------------------------------------------------! - ! The following settings matter only when ianth_disturb is 1 or 2. ! + ! The following settings matter only when anthropogenic disturbance is enabled. ! !---------------------------------------------------------------------------------------! select case (ianth_disturb) case (1,2) - if (sl_skid_rel_area < 0. .or. sl_skid_rel_area > 5.) then - write (reason,fmt='(2a,1x,es12.5,a)') & - 'Invalid SL_SKID_REL_AREA, it must be between 0. and 5.' & - ,' Yours is set to',sl_skid_rel_area,'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr = ifaterr +1 - end if - - if (sl_skid_dbh_thresh < 0. .or. sl_skid_dbh_thresh > 1000.) then - write (reason,fmt='(2a,1x,es12.5,a)') & - 'Invalid SL_SKID_DBH_THRESH, it must be between 0. and 1000.' & - ,' Yours is set to',sl_skid_dbh_thresh,'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr = ifaterr +1 - end if - - if (sl_skid_s_gtharv < 0. .or. sl_skid_s_gtharv > 1.) then - write (reason,fmt='(2a,1x,es12.5,a)') & - 'Invalid SL_SKID_S_GTHARV, it must be between 0. and 1.' & - ,' Yours is set to',sl_skid_s_gtharv,'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr = ifaterr +1 - end if - - if (sl_skid_s_ltharv < 0. .or. sl_skid_s_ltharv > 1.) then - write (reason,fmt='(2a,1x,es12.5,a)') & - 'Invalid SL_SKID_S_LTHARV, it must be between 0. and 1.' & - ,' Yours is set to',sl_skid_s_ltharv,'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr = ifaterr +1 - end if - - if (sl_felling_s_ltharv < 0. .or. sl_felling_s_ltharv > 1.) then - write (reason,fmt='(2a,1x,es12.5,a)') & - 'Invalid SL_FELLING_S_LTHARV, it must be between 0. and 1.' & - ,' Yours is set to',sl_felling_s_ltharv,'...' - call opspec_fatal(reason,'opspec_misc') - ifaterr = ifaterr +1 - end if - if (cl_fseeds_harvest < 0. .or. cl_fseeds_harvest > 1.) then write (reason,fmt='(2a,1x,es12.5,a)') & 'Invalid CL_FSEEDS_HARVEST, it must be between 0. and 1.' & @@ -2270,6 +2112,11 @@ subroutine ed_opspec_misc ifaterr = ifaterr +1 call opspec_fatal(reason,'opspec_misc') end if + + + + + end select !---------------------------------------------------------------------------------------! diff --git a/ED/src/io/ed_read_ed21_history.f90 b/ED/src/io/ed_read_ed21_history.f90 index 997b1c7fd..07f6d78d2 100644 --- a/ED/src/io/ed_read_ed21_history.f90 +++ b/ED/src/io/ed_read_ed21_history.f90 @@ -1356,7 +1356,7 @@ subroutine read_ed21_history_unstruct slat_rscl(:) = 100. nlat_rscl(:) = -100. inquire(file=trim(lu_rescale_file(igr)),exist=exists) - rescale_glob = ianth_disturb == 1 .and. exists + rescale_glob = ianth_disturb >= 1 .and. exists nrescale = 0 if (rescale_glob) then open (unit=13,file=trim(lu_rescale_file(igr)),status='old',action='read') @@ -1376,7 +1376,7 @@ subroutine read_ed21_history_unstruct end do readrescale rescale_glob = nrescale > 0 close (unit=13,status='keep') - elseif (ianth_disturb == 1 .and. len_trim(lu_rescale_file(igr)) > 0) then + elseif (ianth_disturb >= 1 .and. len_trim(lu_rescale_file(igr)) > 0) then write (unit=*,fmt='(a)') '-------------------------------------------------------' write (unit=*,fmt='(a)') ' WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! ' write (unit=*,fmt='(a)') ' WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! ' @@ -2763,7 +2763,7 @@ subroutine read_ed21_polyclone slat_rscl(:) = 100. nlat_rscl(:) = -100. inquire(file=trim(lu_rescale_file(igr)),exist=exists) - rescale_glob = ianth_disturb == 1 .and. exists + rescale_glob = ianth_disturb /= 0 .and. exists nrescale = 0 if (rescale_glob) then open (unit=13,file=trim(lu_rescale_file(igr)),status='old',action='read') @@ -2783,7 +2783,7 @@ subroutine read_ed21_polyclone end do readrescale rescale_glob = nrescale > 0 close (unit=13,status='keep') - elseif (ianth_disturb == 1 .and. len_trim(lu_rescale_file(igr)) > 0) then + elseif (ianth_disturb /= 0 .and. len_trim(lu_rescale_file(igr)) > 0) then write (unit=*,fmt='(a)') '-------------------------------------------------------' write (unit=*,fmt='(a)') ' WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! ' write (unit=*,fmt='(a)') ' WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! ' diff --git a/ED/src/memory/disturb_coms.f90 b/ED/src/memory/disturb_coms.f90 index bc1f738d9..e04e1cacd 100644 --- a/ED/src/memory/disturb_coms.f90 +++ b/ED/src/memory/disturb_coms.f90 @@ -68,9 +68,21 @@ module disturb_coms !---- Maximum height for non-grass cohort to be considered part of fuel. ---------------! real :: fuel_height_max - !---------------------------------------------------------------------------------------! - ! Anthropogenic disturbance. 1 means that anthropogenic disturbances will be ! - ! included, whereas 0 means that it won't. ! +! +! ! FROM MARCOS +! !----- Fractions of fast and structural carbon and nitrogen lost through combustion. ---! +! real :: f_combusted_fast_c +! real :: f_combusted_struct_c +! real :: f_combusted_fast_n +! real :: f_combusted_struct_n +! !---- Maximum height for non-grass cohort to be considered part of fuel. ---------------! +! real :: fuel_height_max + + !---------------------------------------------------------------------------------------! + ! Anthropogenic disturbance. ! + ! 0. No anthropogenic disturbance ! + ! 1. Anthropogenic disturbances; harvest based on biomass ! + ! 2. Anthropogenic disturbances; forest harvest based on land area ! !---------------------------------------------------------------------------------------! integer :: ianth_disturb !---------------------------------------------------------------------------------------! @@ -111,58 +123,12 @@ module disturb_coms !---------------------------------------------------------------------------------------! - ! Selective logging characteristics (when IANTH_DISTURB is set to 2). Included in ! - ! ED2IN because selective logging is site-dependent. Variable description. ! - ! ! - ! SL_SCALE -- This flag assumes whether the simulation scale is local or ! - ! landscape. This controls the recurrence of logging. ! - ! 0. Local. The simulation represents one logging unit. Apply ! - ! logging only once every SL_NYRS ! - ! 1. Landscape. The simulation represents a landscape. Logging ! - ! occurs every year but it is restricted to patches with age ! - ! greater than or equal to SL_NYRS ! - ! SL_YR_FIRST -- The first year to apply logging. In case IANTH_DISTURB is 2 it ! - ! must be a simulation year (i.e. between IYEARA and IYEARZ). ! - ! SL_NYRS -- This variable defines the logging cycle, in years (see variable ! - ! SL_SCALE above) ! - ! SL_PFT -- PFTs that can be harvested. ! - ! SL_PROB_HARVEST -- Logging intensity (one value for each PFT provided in SL_PFT). ! - ! Values should be between 0.0 and 1.0, with 0 meaning no ! - ! removal, and 1 removal of all trees needed to meet demands. ! - ! SL_MINDBH_HARVEST -- Minimum DBH for logging (one value for each PFT provided in ! - ! SL_PFT). ! - ! SL_BIOMASS_HARVEST -- Target biomass to be harvested in each cycle, in kgC/m2. If ! - ! zero, then all trees that meet the minimum DBH and minimum ! - ! patch age will be logged. In case you don't want logging to ! - ! occur, don't set this value to zero! Instead, set IANTH_DISTURB ! - ! to zero. ! - ! ! - ! The following variables are used when IANTH_DISTURB is 1 or 2. ! - ! ! - ! SL_SKID_REL_AREA -- area damaged by skid trails (relative to felled area). ! - ! SL_SKID_DBH_THRESH -- DBH threshold for damage caused in skid trails. ! - ! SL_SKID_S_GTHARV -- survivorship of trees with DBH > MINDBH in skid trails. ! - ! SL_SKID_S_LTHARV -- survivorship of trees with DBH < MINDBH in skid trails. ! - ! SL_FELLING_S_LTHARV -- survivorship of trees with DBH < MINDBH in felling gaps. ! - ! ! ! Cropland variables, used when IANTH_DISTURB is 1 or 2. ! ! ! ! CL_FSEEDS_HARVEST -- fraction of seeds that is harvested. ! ! CL_FSTORAGE_HARVEST -- fraction of non-structural carbon that is harvested. ! ! CL_FLEAF_HARVEST -- fraction of leaves that is harvested in croplands. ! !---------------------------------------------------------------------------------------! - integer :: sl_scale - integer :: sl_yr_first - integer :: sl_nyrs - integer , dimension(n_pft) :: sl_pft - real(kind=4), dimension(n_pft) :: sl_prob_harvest - real(kind=4), dimension(n_pft) :: sl_mindbh_harvest - real(kind=4) :: sl_biomass_harvest - real(kind=4) :: sl_skid_rel_area - real(kind=4) :: sl_skid_dbh_thresh - real(kind=4) :: sl_skid_s_gtharv - real(kind=4) :: sl_skid_s_ltharv - real(kind=4) :: sl_felling_s_ltharv real(kind=4) :: cl_fseeds_harvest real(kind=4) :: cl_fstorage_harvest real(kind=4) :: cl_fleaf_harvest diff --git a/ED/src/memory/ed_max_dims.F90 b/ED/src/memory/ed_max_dims.F90 index 7aa48b705..647ee9bcb 100644 --- a/ED/src/memory/ed_max_dims.F90 +++ b/ED/src/memory/ed_max_dims.F90 @@ -192,11 +192,12 @@ module ed_max_dims ! 3 -- Tree fall. ! ! 4 -- Fire. ! ! 5 -- Forest regrowth. ! - ! 6 -- Logged forest (felling). ! + ! 6 -- Logged forest (tree felling). ! ! 7 -- Logged forest (skid trail + road). ! - ! 8 -- Cropland. ! + ! 8 -- Logged forest (mechanical canopy thinning). ! + ! 9 -- Cropland. ! !---------------------------------------------------------------------------------------! - integer, parameter :: n_dist_types = 8 + integer, parameter :: n_dist_types = 9 !---------------------------------------------------------------------------------------! diff --git a/ED/src/memory/ed_mem_alloc.f90 b/ED/src/memory/ed_mem_alloc.f90 index e4370265c..5f3256f84 100644 --- a/ED/src/memory/ed_mem_alloc.f90 +++ b/ED/src/memory/ed_mem_alloc.f90 @@ -11,14 +11,9 @@ module ed_mem_alloc !---------------------------------------------------------------------------------------! subroutine ed_memory_allocation(proc_type) - use ed_max_dims , only : n_pft & ! intent(in) - , n_dist_types & ! intent(in) - , n_dbh & ! intent(in) - , maxgrds ! ! intent(in) use ed_state_vars , only : gdpy & ! intent(in) , edgrid_g & ! intent(out) , allocate_edglobals & ! subroutine - , nullify_edtype & ! subroutine , allocate_edtype ! ! subroutine use grid_coms , only : nnxp & ! intent(in) , nnyp & ! intent(in) diff --git a/ED/src/memory/ed_state_vars.F90 b/ED/src/memory/ed_state_vars.F90 index 9f6a0307f..f3478606a 100644 --- a/ED/src/memory/ed_state_vars.F90 +++ b/ED/src/memory/ed_state_vars.F90 @@ -1119,7 +1119,8 @@ module ed_state_vars ! 5. Forest regrowth. ! ! 6. Logged forest (felling). ! ! 7. Logged forest (skid trail + road). ! - ! 8. Cropland. ! + ! 8. Logged forest (canopy thinning). ! + ! 9. Cropland. ! !------------------------------------------------------------------------------------! real , pointer,dimension(:) :: area !< Patch area relative to the total SITE area (dimensionless) @@ -1134,7 +1135,8 @@ module ed_state_vars !!5. Forest regrowth.\n !!6. Logged forest (felling).\n !!7. Logged forest (skid trail + road).\n - !!8. Cropland.\n + !!8. Logged forest (canopy thinning).\n + !!9. Cropland.\n real , pointer,dimension(:) :: fbeam !< Correction term to account for neighbouring shaded (1.0 unless ihrzrad /= 0) @@ -2379,12 +2381,18 @@ module ed_state_vars !< Area of collateral damage disturbance in logged areas due to skid trails and !< roads. - real , pointer, dimension(:,:) :: mindbh_harvest - ! + !< mindbh_felling. If stand-clearing logging, this can be set to zero. + + real , pointer, dimension(:,:) :: prob_felling + ! mindbh_harvest) in patches with tree felling. @@ -2392,6 +2400,17 @@ module ed_state_vars real , pointer, dimension(:,:) :: felling_s_ltharv !< Survivorship of small trees (DBH < mindbh_harvest) in patches with tree felling. + real , pointer, dimension(:,:) :: thinning_dbh_thresh + !< DBH threshold for canopy thinning. Typically canopy thinning operations remove + !< more small trees than large ones, though some large trees may also be removed + !< depending on the treatment. + + real , pointer, dimension(:,:) :: thinning_s_gtharv + !< Survivorship of large trees (DBH > maxdbh_thinning) in patches with canopy thinning. + + real , pointer, dimension(:,:) :: thinning_s_ltharv + !< Survivorship of small trees (DBH < maxdbh_thinning) in patches with canopy thinning. + real , pointer, dimension(:,:) :: skid_dbh_thresh !< DBH threshold for survivorship to logging collateral damage (skid trails and !< roads). Typically skid/road damage affect small trees more than large trees. @@ -2508,6 +2527,7 @@ module ed_state_vars !------------------------------------------------------------------------------------! + real,pointer,dimension(:) :: cosaoi !----- Length of day light, used to average light levels properly. -------------------! @@ -2517,6 +2537,8 @@ module ed_state_vars !----- Light-phenology variable. real, pointer, dimension(:) :: rad_avg + + !====================================================================================! !====================================================================================! ! Polygon-level diagnostic variables: these are pretty much the meteorological ! @@ -4794,10 +4816,15 @@ subroutine allocate_polygontype(cpoly,nsites) allocate(cpoly%min_monthly_temp ( nsites)) allocate(cpoly%num_landuse_years ( nsites)) allocate(cpoly%skid_rel_area ( nsites)) - allocate(cpoly%mindbh_harvest ( n_pft,nsites)) - allocate(cpoly%prob_harvest ( n_pft,nsites)) + allocate(cpoly%thinning_frac_area ( nsites)) + allocate(cpoly%thinning_age_offset ( nsites)) + allocate(cpoly%mindbh_felling ( n_pft,nsites)) + allocate(cpoly%prob_felling ( n_pft,nsites)) allocate(cpoly%felling_s_gtharv ( n_pft,nsites)) allocate(cpoly%felling_s_ltharv ( n_pft,nsites)) + allocate(cpoly%thinning_dbh_thresh ( n_pft,nsites)) + allocate(cpoly%thinning_s_gtharv ( n_pft,nsites)) + allocate(cpoly%thinning_s_ltharv ( n_pft,nsites)) allocate(cpoly%skid_dbh_thresh ( n_pft,nsites)) allocate(cpoly%skid_s_gtharv ( n_pft,nsites)) allocate(cpoly%skid_s_ltharv ( n_pft,nsites)) @@ -7084,10 +7111,15 @@ subroutine nullify_polygontype(cpoly) nullify(cpoly%min_monthly_temp ) nullify(cpoly%num_landuse_years ) nullify(cpoly%skid_rel_area ) - nullify(cpoly%mindbh_harvest ) - nullify(cpoly%prob_harvest ) + nullify(cpoly%thinning_frac_area ) + nullify(cpoly%thinning_age_offset ) + nullify(cpoly%mindbh_felling ) + nullify(cpoly%prob_felling ) nullify(cpoly%felling_s_gtharv ) nullify(cpoly%felling_s_ltharv ) + nullify(cpoly%thinning_dbh_thresh ) + nullify(cpoly%thinning_s_gtharv ) + nullify(cpoly%thinning_s_ltharv ) nullify(cpoly%skid_dbh_thresh ) nullify(cpoly%skid_s_gtharv ) nullify(cpoly%skid_s_ltharv ) @@ -21840,6 +21872,26 @@ subroutine filltab_polygontype_p21inst(cpoly,igr,init,var_len,var_len_global,max ,'[0-1]','(isite)') end if + if (associated(cpoly%thinning_frac_area)) then + nvar=nvar+1 + call vtable_edio_r(npts,cpoly%thinning_frac_area,nvar,igr,init & + ,cpoly%siglob_id,var_len,var_len_global,max_ptrs & + ,'THINNING_FRAC_AREA :21:hist') + call metadata_edio(nvar,igr & + ,'Fraction of area to receive canopy thinning after logging' & + ,'[0-1]','(isite)') + end if + + if (associated(cpoly%thinning_age_offset)) then + nvar=nvar+1 + call vtable_edio_r(npts,cpoly%thinning_age_offset,nvar,igr,init & + ,cpoly%siglob_id,var_len,var_len_global,max_ptrs & + ,'THINNING_AGE_OFFSET :21:hist') + call metadata_edio(nvar,igr & + ,'Age offset since logging before canopy thinning happens' & + ,'[yr]','(isite)') + end if + if (associated(cpoly%agri_stocking_density)) then nvar=nvar+1 call vtable_edio_r(npts,cpoly%agri_stocking_density,nvar,igr,init & @@ -22783,23 +22835,23 @@ subroutine filltab_polygontype_p24(cpoly,igr,init,var_len,var_len_global,max_ptr ,'[m2_leaf/kgC]','(n_pft,isite)') end if - if (associated(cpoly%mindbh_harvest)) then + if (associated(cpoly%mindbh_felling)) then nvar=nvar+1 - call vtable_edio_r(npts,cpoly%mindbh_harvest & + call vtable_edio_r(npts,cpoly%mindbh_felling & ,nvar,igr,init,cpoly%siglob_id,var_len,var_len_global,max_ptrs & - ,'MINDBH_HARVEST :24:hist') + ,'MINDBH_FELLING :24:hist') call metadata_edio(nvar,igr & - ,'Minimum DBH for harvesting in selective logging' & + ,'Minimum DBH for tree felling in selective logging' & ,'[cm]','(n_pft,isite)') end if - if (associated(cpoly%prob_harvest)) then + if (associated(cpoly%prob_felling)) then nvar=nvar+1 - call vtable_edio_r(npts,cpoly%prob_harvest & + call vtable_edio_r(npts,cpoly%prob_felling & ,nvar,igr,init,cpoly%siglob_id,var_len,var_len_global,max_ptrs & - ,'PROB_HARVEST :24:hist') + ,'PROB_FELLING :24:hist') call metadata_edio(nvar,igr & - ,'Harvesting probability in selective logging' & + ,'Tree felling probability in selective logging' & ,'[0-1]','(n_pft,isite)') end if @@ -22823,6 +22875,36 @@ subroutine filltab_polygontype_p24(cpoly,igr,init,var_len,var_len_global,max_ptr ,'[0-1]','(n_pft,isite)') end if + if (associated(cpoly%thinning_dbh_thresh)) then + nvar=nvar+1 + call vtable_edio_r(npts,cpoly%thinning_dbh_thresh & + ,nvar,igr,init,cpoly%siglob_id,var_len,var_len_global,max_ptrs & + ,'THINNING_DBH_THRESH :24:hist') + call metadata_edio(nvar,igr & + ,'DBH threshold for canopy thinning treatment' & + ,'[cm]','(n_pft,isite)') + end if + + if (associated(cpoly%thinning_s_gtharv)) then + nvar=nvar+1 + call vtable_edio_r(npts,cpoly%thinning_s_gtharv & + ,nvar,igr,init,cpoly%siglob_id,var_len,var_len_global,max_ptrs & + ,'THINNING_S_GTHARV :24:hist') + call metadata_edio(nvar,igr & + ,'Thinning survivorship: trees with DBH > THINNING_DBH_THRESH' & + ,'[0-1]','(n_pft,isite)') + end if + + if (associated(cpoly%thinning_s_ltharv)) then + nvar=nvar+1 + call vtable_edio_r(npts,cpoly%thinning_s_ltharv & + ,nvar,igr,init,cpoly%siglob_id,var_len,var_len_global,max_ptrs & + ,'THINNING_S_LTHARV :24:hist') + call metadata_edio(nvar,igr & + ,'Thinning survivorship: trees with DBH < THINNING_DBH_THRESH' & + ,'[0-1]','(n_pft,isite)') + end if + if (associated(cpoly%skid_dbh_thresh)) then nvar=nvar+1 call vtable_edio_r(npts,cpoly%skid_dbh_thresh & diff --git a/ED/src/memory/ename_coms.f90 b/ED/src/memory/ename_coms.f90 index 6650db08c..e4f7fc55d 100644 --- a/ED/src/memory/ename_coms.f90 +++ b/ED/src/memory/ename_coms.f90 @@ -184,18 +184,6 @@ module ename_coms real :: fire_parameter real :: sm_fire integer :: ianth_disturb - integer :: sl_scale - integer :: sl_yr_first - integer :: sl_nyrs - integer , dimension(n_pft) :: sl_pft - real , dimension(n_pft) :: sl_prob_harvest - real , dimension(n_pft) :: sl_mindbh_harvest - real :: sl_biomass_harvest - real :: sl_skid_rel_area - real :: sl_skid_dbh_thresh - real :: sl_skid_s_gtharv - real :: sl_skid_s_ltharv - real :: sl_felling_s_ltharv real :: cl_fseeds_harvest real :: cl_fstorage_harvest real :: cl_fleaf_harvest @@ -443,18 +431,6 @@ subroutine init_ename_vars(enl) enl%fire_parameter = undef_real enl%sm_fire = undef_real enl%ianth_disturb = undef_integer - enl%sl_scale = undef_integer - enl%sl_yr_first = undef_integer - enl%sl_nyrs = undef_integer - enl%sl_pft = (/(undef_integer,i=1,n_pft)/) - enl%sl_prob_harvest = (/(undef_real ,i=1,n_pft)/) - enl%sl_mindbh_harvest = (/(undef_real ,i=1,n_pft)/) - enl%sl_biomass_harvest = undef_real - enl%sl_skid_rel_area = undef_real - enl%sl_skid_dbh_thresh = undef_real - enl%sl_skid_s_gtharv = undef_real - enl%sl_skid_s_ltharv = undef_real - enl%sl_felling_s_ltharv = undef_real enl%cl_fseeds_harvest = undef_real enl%cl_fstorage_harvest = undef_real enl%cl_fleaf_harvest = undef_real diff --git a/ED/src/mpi/ed_mpass_init.F90 b/ED/src/mpi/ed_mpass_init.F90 index 274bbb722..24e37d3f1 100644 --- a/ED/src/mpi/ed_mpass_init.F90 +++ b/ED/src/mpi/ed_mpass_init.F90 @@ -290,18 +290,6 @@ subroutine ed_masterput_nl(par_run) use disturb_coms , only : include_fire & ! intent(in) , fire_parameter & ! intent(in) , ianth_disturb & ! intent(in) - , sl_scale & ! intent(in) - , sl_yr_first & ! intent(in) - , sl_nyrs & ! intent(in) - , sl_pft & ! intent(in) - , sl_prob_harvest & ! intent(in) - , sl_mindbh_harvest & ! intent(in) - , sl_biomass_harvest & ! intent(in) - , sl_skid_rel_area & ! intent(in) - , sl_skid_dbh_thresh & ! intent(in) - , sl_skid_s_gtharv & ! intent(in) - , sl_skid_s_ltharv & ! intent(in) - , sl_felling_s_ltharv & ! intent(in) , cl_fseeds_harvest & ! intent(in) , cl_fstorage_harvest & ! intent(in) , cl_fleaf_harvest & ! intent(in) @@ -507,18 +495,6 @@ subroutine ed_masterput_nl(par_run) call MPI_Bcast(fire_parameter,1,MPI_REAL,mainnum,MPI_COMM_WORLD,ierr) call MPI_Bcast(sm_fire,1,MPI_REAL,mainnum,MPI_COMM_WORLD,ierr) call MPI_Bcast(ianth_disturb,1,MPI_INTEGER,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_scale , 1,MPI_INTEGER,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_yr_first , 1,MPI_INTEGER,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_nyrs , 1,MPI_INTEGER,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_pft ,n_pft,MPI_INTEGER,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_prob_harvest ,n_pft,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_mindbh_harvest ,n_pft,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_biomass_harvest , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_rel_area , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_dbh_thresh , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_s_gtharv , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_s_ltharv , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_felling_s_ltharv, 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fseeds_harvest , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fstorage_harvest, 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fleaf_harvest , 1,MPI_REAL ,mainnum,MPI_COMM_WORLD,ierr) @@ -1479,18 +1455,6 @@ subroutine ed_nodeget_nl use disturb_coms , only : include_fire & ! intent(out) , fire_parameter & ! intent(out) , ianth_disturb & ! intent(out) - , sl_scale & ! intent(out) - , sl_yr_first & ! intent(out) - , sl_nyrs & ! intent(out) - , sl_pft & ! intent(out) - , sl_prob_harvest & ! intent(out) - , sl_mindbh_harvest & ! intent(out) - , sl_biomass_harvest & ! intent(out) - , sl_skid_rel_area & ! intent(out) - , sl_skid_dbh_thresh & ! intent(out) - , sl_skid_s_gtharv & ! intent(out) - , sl_skid_s_ltharv & ! intent(out) - , sl_felling_s_ltharv & ! intent(out) , cl_fseeds_harvest & ! intent(out) , cl_fstorage_harvest & ! intent(out) , cl_fleaf_harvest & ! intent(out) @@ -1700,18 +1664,6 @@ subroutine ed_nodeget_nl call MPI_Bcast(fire_parameter,1,MPI_REAL,master_num,MPI_COMM_WORLD,ierr) call MPI_Bcast(sm_fire,1,MPI_REAL,master_num,MPI_COMM_WORLD,ierr) call MPI_Bcast(ianth_disturb,1,MPI_INTEGER,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_scale , 1,MPI_INTEGER,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_yr_first , 1,MPI_INTEGER,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_nyrs , 1,MPI_INTEGER,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_pft ,n_pft,MPI_INTEGER,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_prob_harvest ,n_pft,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_mindbh_harvest ,n_pft,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_biomass_harvest , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_rel_area , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_dbh_thresh , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_s_gtharv , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_skid_s_ltharv , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) - call MPI_Bcast(sl_felling_s_ltharv, 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fseeds_harvest , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fstorage_harvest, 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) call MPI_Bcast(cl_fleaf_harvest , 1,MPI_REAL ,master_num,MPI_COMM_WORLD,ierr) diff --git a/EDTS/Templates/ED2IN-MAIN b/EDTS/Templates/ED2IN-MAIN index de87f9cdc..f5d62d32f 100644 --- a/EDTS/Templates/ED2IN-MAIN +++ b/EDTS/Templates/ED2IN-MAIN @@ -625,9 +625,10 @@ $ED_NL ! SOIL_DATABASE -- soil database, used to determine the soil type. Fill with the ! ! path and the prefix. ! ! LU_DATABASE -- land-use change disturbance rates database, used only when ! - ! IANTH_DISTURB is set to 1. Fill with the path and the prefix. ! + ! IANTH_DISTURB is set to 1 or 2. Fill with the path and the ! + ! prefix. ! ! PLANTATION_FILE -- Character string for the path to the forest plantation fraction ! - ! file. This is used only when IANTH_DISTURB is set to 1 and ! + ! file. This is used only when IANTH_DISTURB is set to 1 or 2 and ! ! the user wants to simulate forest plantations. Otherwise, leave ! ! it empty (PLANTATION_FILE='') ! ! THSUMS_DATABASE -- input directory with dataset to initialise chilling-degree and ! @@ -1284,12 +1285,22 @@ $ED_NL ! IANTH_DISTURB -- This flag controls whether to include anthropogenic disturbances ! ! such as land clearing, abandonment, and logging. ! ! 0. No anthropogenic disturbance. ! - ! 1. Use anthropogenic disturbance dataset (ED-2.2 default when ! - ! anthropogenic disturbance is sought). ! - ! 2. Site-specific forest plantation or selective logging cycle. ! - ! (Longo et al., in prep.) (Beta) ! + ! 1. Use anthropogenic disturbance datasets, with either mass-based ! + ! harvesting targets, or selective logging when the target is -1 ! + ! (ED-2.2 default when anthropogenic disturbance is sought). ! + ! 2. Use anthropogenic disturbance datasets, with area-based ! + ! harvesting targets (beta). ! + ! ! + ! Cropland variables, used when IANTH_DISTURB is 1 or 2. ! + ! ! + ! CL_FSEEDS_HARVEST -- fraction of seeds that is harvested. ! + ! CL_FSTORAGE_HARVEST -- fraction of non-structural carbon that is harvested. ! + ! CL_FLEAF_HARVEST -- fraction of leaves that is harvested in croplands. ! !---------------------------------------------------------------------------------------! NL%IANTH_DISTURB = 0 + NL%CL_FSEEDS_HARVEST = 0.75 + NL%CL_FSTORAGE_HARVEST = 0.00 + NL%CL_FLEAF_HARVEST = 0.00 !---------------------------------------------------------------------------------------! @@ -1382,6 +1393,8 @@ $ED_NL ! used in this simulation. ! ! ! ! INCLUDE_THESE_PFT -- which PFTs to be considered for the simulation. ! + ! PASTURE_STOCK -- which PFT should be used for pastures ! + ! (used only when IANTH_DISTURB = 1 or 2) ! ! AGRI_STOCK -- which PFT should be used for agriculture ! ! (used only when IANTH_DISTURB = 1 or 2) ! ! PLANTATION_STOCK -- which PFT should be used for plantation ! @@ -1408,7 +1421,8 @@ $ED_NL ! 17 - (Beta) Lianas ! !---------------------------------------------------------------------------------------! NL%INCLUDE_THESE_PFT = 1,2,3,4,16 - NL%AGRI_STOCK = 16 + NL%PASTURE_STOCK = 1 + NL%AGRI_STOCK = 1 NL%PLANTATION_STOCK = 3 !---------------------------------------------------------------------------------------! diff --git a/EDTS/Templates/ED2IN-TEST b/EDTS/Templates/ED2IN-TEST index b8661840a..5c7ac833d 100644 --- a/EDTS/Templates/ED2IN-TEST +++ b/EDTS/Templates/ED2IN-TEST @@ -634,9 +634,10 @@ $ED_NL ! SOIL_DATABASE -- soil database, used to determine the soil type. Fill with the ! ! path and the prefix. ! ! LU_DATABASE -- land-use change disturbance rates database, used only when ! - ! IANTH_DISTURB is set to 1. Fill with the path and the prefix. ! + ! IANTH_DISTURB is set to 1 or 2. Fill with the path and the ! + ! prefix. ! ! PLANTATION_FILE -- Character string for the path to the forest plantation fraction ! - ! file. This is used only when IANTH_DISTURB is set to 1 and ! + ! file. This is used only when IANTH_DISTURB is set to 1 or 2 and ! ! the user wants to simulate forest plantations. Otherwise, leave ! ! it empty (PLANTATION_FILE='') ! ! THSUMS_DATABASE -- input directory with dataset to initialise chilling-degree and ! @@ -1367,43 +1368,11 @@ $ED_NL ! IANTH_DISTURB -- This flag controls whether to include anthropogenic disturbances ! ! such as land clearing, abandonment, and logging. ! ! 0. No anthropogenic disturbance. ! - ! 1. Use anthropogenic disturbance dataset (ED-2.2 default when ! - ! anthropogenic disturbance is sought). ! - ! 2. Site-specific forest plantation or selective logging cycle. ! - ! (Longo et al., in prep.) (Beta) ! - ! ! - ! The following variables are used only when IANTH_DISTURB is 2. ! - ! ! - ! SL_SCALE -- This flag assumes whether the simulation scale is local or ! - ! landscape. This controls the recurrence of logging. ! - ! 0. Local. The simulation represents one logging unit. Apply ! - ! logging only once every SL_NYRS ! - ! 1. Landscape. The simulation represents a landscape. Logging ! - ! occurs every year but it is restricted to patches with age ! - ! greater than or equal to SL_NYRS ! - ! SL_YR_FIRST -- The first year to apply logging. In case IANTH_DISTURB is 2 it ! - ! must be a simulation year (i.e. between IYEARA and IYEARZ). ! - ! SL_NYRS -- This variable defines the logging cycle, in years (see variable ! - ! SL_SCALE above) ! - ! SL_PFT -- PFTs that can be harvested. ! - ! SL_PROB_HARVEST -- Logging intensity (one value for each PFT provided in SL_PFT). ! - ! Values should be between 0.0 and 1.0, with 0 meaning no ! - ! removal, and 1 removal of all trees needed to meet demands. ! - ! SL_MINDBH_HARVEST -- Minimum DBH for logging (one value for each PFT provided in ! - ! SL_PFT). ! - ! SL_BIOMASS_HARVEST -- Target biomass to be harvested in each cycle, in kgC/m2. If ! - ! zero, then all trees that meet the minimum DBH and minimum ! - ! patch age will be logged. In case you don't want logging to ! - ! occur, don't set this value to zero! Instead, set IANTH_DISTURB ! - ! to zero. ! - ! ! - ! The following variables are used when IANTH_DISTURB is 1 or 2. ! - ! ! - ! SL_SKID_REL_AREA -- area damaged by skid trails (relative to felled area). ! - ! SL_SKID_DBH_THRESH -- DBH threshold for damage caused in skid trails. ! - ! SL_SKID_S_GTHARV -- survivorship of trees with DBH > MINDBH in skid trails. ! - ! SL_SKID_S_LTHARV -- survivorship of trees with DBH < MINDBH in skid trails. ! - ! SL_FELLING_S_LTHARV -- survivorship of trees with DBH < MINDBH in felling gaps. ! + ! 1. Use anthropogenic disturbance datasets, with either mass-based ! + ! harvesting targets, or selective logging when the target is -1 ! + ! (ED-2.2 default when anthropogenic disturbance is sought). ! + ! 2. Use anthropogenic disturbance datasets, with area-based ! + ! harvesting targets (beta). ! ! ! ! Cropland variables, used when IANTH_DISTURB is 1 or 2. ! ! ! @@ -1412,17 +1381,6 @@ $ED_NL ! CL_FLEAF_HARVEST -- fraction of leaves that is harvested in croplands. ! !---------------------------------------------------------------------------------------! NL%IANTH_DISTURB = 0 - NL%SL_SCALE = 0 - NL%SL_YR_FIRST = 1992 - NL%SL_NYRS = 50 - NL%SL_PFT = 2,3,4 - NL%SL_PROB_HARVEST = 1.0,1.0,1.0 - NL%SL_MINDBH_HARVEST = 50.,50.,50. - NL%SL_BIOMASS_HARVEST = 0 - NL%SL_SKID_REL_AREA = 1 - NL%SL_SKID_S_GTHARV = 1 - NL%SL_SKID_S_LTHARV = 0.6 - NL%SL_FELLING_S_LTHARV = 0.35 NL%CL_FSEEDS_HARVEST = 0.75 NL%CL_FSTORAGE_HARVEST = 0.00 NL%CL_FLEAF_HARVEST = 0.00 diff --git a/EDTS/Templates/ED2IN-tonzi b/EDTS/Templates/ED2IN-tonzi index 685f216d3..f18e8e84c 100644 --- a/EDTS/Templates/ED2IN-tonzi +++ b/EDTS/Templates/ED2IN-tonzi @@ -584,10 +584,12 @@ $ED_NL ! SLCOL_DATABASE -- If ISLCOLFLG=1, this variable specifies the path and prefix of ! ! soil colour data base. ! ! LU_DATABASE -- land-use change disturbance rates database, used only when ! - ! IANTH_DISTURB is set to 1. Fill with the path and the prefix. ! - ! PLANTATION_FILE -- plantation fraction file. In case you don't have such a file or ! - ! you do not want to use it, you must leave this variable empty: ! - ! (NL%PLANTATION_FILE = '' ! + ! IANTH_DISTURB is set to 1 or 2. Fill with the path and the ! + ! prefix. ! + ! PLANTATION_FILE -- Character string for the path to the forest plantation fraction ! + ! file. This is used only when IANTH_DISTURB is set to 1 or 2 and ! + ! the user wants to simulate forest plantations. Otherwise, leave ! + ! it empty (PLANTATION_FILE='') ! ! THSUMS_DATABASE -- input directory with dataset to initialise chilling degrees and ! ! growing degree days, which is used to drive the cold-deciduous ! ! phenology (you must always provide this, even when your PFTs are ! @@ -1220,43 +1222,11 @@ $ED_NL ! IANTH_DISTURB -- This flag controls whether to include anthropogenic disturbances ! ! such as land clearing, abandonment, and logging. ! ! 0. No anthropogenic disturbance. ! - ! 1. Use anthropogenic disturbance dataset (ED-2.2 default when ! - ! anthropogenic disturbance is sought). ! - ! 2. Site-specific forest plantation or selective logging cycle. ! - ! (Longo et al., in prep.) (Beta) ! - ! ! - ! The following variables are used only when IANTH_DISTURB is 2. ! - ! ! - ! SL_SCALE -- This flag assumes whether the simulation scale is local or ! - ! landscape. This controls the recurrence of logging. ! - ! 0. Local. The simulation represents one logging unit. Apply ! - ! logging only once every SL_NYRS ! - ! 1. Landscape. The simulation represents a landscape. Logging ! - ! occurs every year but it is restricted to patches with age ! - ! greater than or equal to SL_NYRS ! - ! SL_YR_FIRST -- The first year to apply logging. In case IANTH_DISTURB is 2 it ! - ! must be a simulation year (i.e. between IYEARA and IYEARZ). ! - ! SL_NYRS -- This variable defines the logging cycle, in years (see variable ! - ! SL_SCALE above) ! - ! SL_PFT -- PFTs that can be harvested. ! - ! SL_PROB_HARVEST -- Logging intensity (one value for each PFT provided in SL_PFT). ! - ! Values should be between 0.0 and 1.0, with 0 meaning no ! - ! removal, and 1 removal of all trees needed to meet demands. ! - ! SL_MINDBH_HARVEST -- Minimum DBH for logging (one value for each PFT provided in ! - ! SL_PFT). ! - ! SL_BIOMASS_HARVEST -- Target biomass to be harvested in each cycle, in kgC/m2. If ! - ! zero, then all trees that meet the minimum DBH and minimum ! - ! patch age will be logged. In case you don't want logging to ! - ! occur, don't set this value to zero! Instead, set IANTH_DISTURB ! - ! to zero. ! - ! ! - ! The following variables are used when IANTH_DISTURB is 1 or 2. ! - ! ! - ! SL_SKID_REL_AREA -- area damaged by skid trails (relative to felled area). ! - ! SL_SKID_DBH_THRESH -- DBH threshold for damage caused in skid trails. ! - ! SL_SKID_S_GTHARV -- survivorship of trees with DBH > MINDBH in skid trails. ! - ! SL_SKID_S_LTHARV -- survivorship of trees with DBH < MINDBH in skid trails. ! - ! SL_FELLING_S_LTHARV -- survivorship of trees with DBH < MINDBH in felling gaps. ! + ! 1. Use anthropogenic disturbance datasets, with either mass-based ! + ! harvesting targets, or selective logging when the target is -1 ! + ! (ED-2.2 default when anthropogenic disturbance is sought). ! + ! 2. Use anthropogenic disturbance datasets, with area-based ! + ! harvesting targets (beta). ! ! ! ! Cropland variables, used when IANTH_DISTURB is 1 or 2. ! ! ! @@ -1265,18 +1235,6 @@ $ED_NL ! CL_FLEAF_HARVEST -- fraction of leaves that is harvested in croplands. ! !---------------------------------------------------------------------------------------! NL%IANTH_DISTURB = 0 - NL%SL_SCALE = 1 - NL%SL_YR_FIRST = 1992 - NL%SL_NYRS = 50 - NL%SL_PFT = 2,3,4 - NL%SL_PROB_HARVEST = 1.0,1.0,1.0 - NL%SL_MINDBH_HARVEST = 50.,50.,50. - NL%SL_BIOMASS_HARVEST = 0 - NL%SL_SKID_REL_AREA = 1 - NL%SL_SKID_DBH_THRESH = 30. - NL%SL_SKID_S_GTHARV = 1 - NL%SL_SKID_S_LTHARV = 0.6 - NL%SL_FELLING_S_LTHARV = 0.35 NL%CL_FSEEDS_HARVEST = 0.75 NL%CL_FSTORAGE_HARVEST = 0.00 NL%CL_FLEAF_HARVEST = 0.00 @@ -1367,10 +1325,12 @@ $ED_NL ! used in this simulation. ! ! ! ! INCLUDE_THESE_PFT -- a list containing all the PFTs you want to include in this run ! + ! PASTURE_STOCK -- which PFT should be used for pastures ! + ! (used only when IANTH_DISTURB = 1 or 2) ! ! AGRI_STOCK -- which PFT should be used for agriculture ! - ! (used only when IANTH_DISTURB = 1) ! + ! (used only when IANTH_DISTURB = 1 or 2) ! ! PLANTATION_STOCK -- which PFT should be used for plantation ! - ! (used only when IANTH_DISTURB = 1) ! + ! (used only when IANTH_DISTURB = 1 or 2) ! ! ! ! PFT table ! !---------------------------------------------------------------------------------------! @@ -1386,7 +1346,7 @@ $ED_NL NL%INCLUDE_THESE_PFT = 11,5,7 NL%AGRI_STOCK = 5 NL%PLANTATION_STOCK = 6 - NL%PASTURE_STOCK = 5 + NL%PASTURE_STOCK = 5 !---------------------------------------------------------------------------------------! diff --git a/EDTS/Templates/ED2IN-tonzi.harvest b/EDTS/Templates/ED2IN-tonzi.harvest index 04709a6b1..def693a1c 100644 --- a/EDTS/Templates/ED2IN-tonzi.harvest +++ b/EDTS/Templates/ED2IN-tonzi.harvest @@ -584,10 +584,12 @@ $ED_NL ! SLCOL_DATABASE -- If ISLCOLFLG=1, this variable specifies the path and prefix of ! ! soil colour data base. ! ! LU_DATABASE -- land-use change disturbance rates database, used only when ! - ! IANTH_DISTURB is set to 1. Fill with the path and the prefix. ! - ! PLANTATION_FILE -- plantation fraction file. In case you don't have such a file or ! - ! you do not want to use it, you must leave this variable empty: ! - ! (NL%PLANTATION_FILE = '' ! + ! IANTH_DISTURB is set to 1 or 2. Fill with the path and the ! + ! prefix. ! + ! PLANTATION_FILE -- Character string for the path to the forest plantation fraction ! + ! file. This is used only when IANTH_DISTURB is set to 1 or 2 and ! + ! the user wants to simulate forest plantations. Otherwise, leave ! + ! it empty (PLANTATION_FILE='') ! ! THSUMS_DATABASE -- input directory with dataset to initialise chilling degrees and ! ! growing degree days, which is used to drive the cold-deciduous ! ! phenology (you must always provide this, even when your PFTs are ! @@ -1219,43 +1221,11 @@ $ED_NL ! IANTH_DISTURB -- This flag controls whether to include anthropogenic disturbances ! ! such as land clearing, abandonment, and logging. ! ! 0. No anthropogenic disturbance. ! - ! 1. Use anthropogenic disturbance dataset (ED-2.2 default when ! - ! anthropogenic disturbance is sought). ! - ! 2. Site-specific forest plantation or selective logging cycle. ! - ! (Longo et al., in prep.) (Beta) ! - ! ! - ! The following variables are used only when IANTH_DISTURB is 2. ! - ! ! - ! SL_SCALE -- This flag assumes whether the simulation scale is local or ! - ! landscape. This controls the recurrence of logging. ! - ! 0. Local. The simulation represents one logging unit. Apply ! - ! logging only once every SL_NYRS ! - ! 1. Landscape. The simulation represents a landscape. Logging ! - ! occurs every year but it is restricted to patches with age ! - ! greater than or equal to SL_NYRS ! - ! SL_YR_FIRST -- The first year to apply logging. In case IANTH_DISTURB is 2 it ! - ! must be a simulation year (i.e. between IYEARA and IYEARZ). ! - ! SL_NYRS -- This variable defines the logging cycle, in years (see variable ! - ! SL_SCALE above) ! - ! SL_PFT -- PFTs that can be harvested. ! - ! SL_PROB_HARVEST -- Logging intensity (one value for each PFT provided in SL_PFT). ! - ! Values should be between 0.0 and 1.0, with 0 meaning no ! - ! removal, and 1 removal of all trees needed to meet demands. ! - ! SL_MINDBH_HARVEST -- Minimum DBH for logging (one value for each PFT provided in ! - ! SL_PFT). ! - ! SL_BIOMASS_HARVEST -- Target biomass to be harvested in each cycle, in kgC/m2. If ! - ! zero, then all trees that meet the minimum DBH and minimum ! - ! patch age will be logged. In case you don't want logging to ! - ! occur, don't set this value to zero! Instead, set IANTH_DISTURB ! - ! to zero. ! - ! ! - ! The following variables are used when IANTH_DISTURB is 1 or 2. ! - ! ! - ! SL_SKID_REL_AREA -- area damaged by skid trails (relative to felled area). ! - ! SL_SKID_DBH_THRESH -- DBH threshold for damage caused in skid trails. ! - ! SL_SKID_S_GTHARV -- survivorship of trees with DBH > MINDBH in skid trails. ! - ! SL_SKID_S_LTHARV -- survivorship of trees with DBH < MINDBH in skid trails. ! - ! SL_FELLING_S_LTHARV -- survivorship of trees with DBH < MINDBH in felling gaps. ! + ! 1. Use anthropogenic disturbance datasets, with either mass-based ! + ! harvesting targets, or selective logging when the target is -1 ! + ! (ED-2.2 default when anthropogenic disturbance is sought). ! + ! 2. Use anthropogenic disturbance datasets, with area-based ! + ! harvesting targets (beta). ! ! ! ! Cropland variables, used when IANTH_DISTURB is 1 or 2. ! ! ! @@ -1264,18 +1234,6 @@ $ED_NL ! CL_FLEAF_HARVEST -- fraction of leaves that is harvested in croplands. ! !---------------------------------------------------------------------------------------! NL%IANTH_DISTURB = 0 - NL%SL_SCALE = 1 - NL%SL_YR_FIRST = 1992 - NL%SL_NYRS = 50 - NL%SL_PFT = 2,3,4 - NL%SL_PROB_HARVEST = 1.0,1.0,1.0 - NL%SL_MINDBH_HARVEST = 50.,50.,50. - NL%SL_BIOMASS_HARVEST = 0 - NL%SL_SKID_REL_AREA = 1 - NL%SL_SKID_DBH_THRESH = 30. - NL%SL_SKID_S_GTHARV = 1 - NL%SL_SKID_S_LTHARV = 0.6 - NL%SL_FELLING_S_LTHARV = 0.35 NL%CL_FSEEDS_HARVEST = 0.75 NL%CL_FSTORAGE_HARVEST = 0.00 NL%CL_FLEAF_HARVEST = 0.00 @@ -1366,10 +1324,12 @@ $ED_NL ! used in this simulation. ! ! ! ! INCLUDE_THESE_PFT -- a list containing all the PFTs you want to include in this run ! + ! PASTURE_STOCK -- which PFT should be used for pastures ! + ! (used only when IANTH_DISTURB = 1 or 2) ! ! AGRI_STOCK -- which PFT should be used for agriculture ! - ! (used only when IANTH_DISTURB = 1) ! + ! (used only when IANTH_DISTURB = 1 or 2) ! ! PLANTATION_STOCK -- which PFT should be used for plantation ! - ! (used only when IANTH_DISTURB = 1) ! + ! (used only when IANTH_DISTURB = 1 or 2) ! ! ! ! PFT table ! !---------------------------------------------------------------------------------------! @@ -1385,7 +1345,7 @@ $ED_NL NL%INCLUDE_THESE_PFT = 11,5,7 NL%AGRI_STOCK = 5 NL%PLANTATION_STOCK = 6 - NL%PASTURE_STOCK = 5 + NL%PASTURE_STOCK = 5 !---------------------------------------------------------------------------------------! diff --git a/EDTS/Templates/ED2IN-umbs.bg b/EDTS/Templates/ED2IN-umbs.bg index 410383b27..58209b5af 100644 --- a/EDTS/Templates/ED2IN-umbs.bg +++ b/EDTS/Templates/ED2IN-umbs.bg @@ -139,19 +139,6 @@ $ED_NL NL%FIRE_PARAMETER = 0.2 NL%SM_FIRE = -1.45 NL%IANTH_DISTURB = 0 - NL%SL_SCALE = 1 - NL%SL_SCALE = 0 - NL%SL_YR_FIRST = 1992 - NL%SL_NYRS = 50 - NL%SL_PFT = 2,3,4 - NL%SL_PROB_HARVEST = 1.0,1.0,1.0 - NL%SL_MINDBH_HARVEST = 50.,50.,50. - NL%SL_BIOMASS_HARVEST = 0 - NL%SL_SKID_REL_AREA = 1 - NL%SL_SKID_DBH_THRESH = 30. - NL%SL_SKID_S_GTHARV = 1 - NL%SL_SKID_S_LTHARV = 0.6 - NL%SL_FELLING_S_LTHARV = 0.35 NL%CL_FSEEDS_HARVEST = 0.75 NL%CL_FSTORAGE_HARVEST = 0.00 NL%CL_FLEAF_HARVEST = 0.00