From b4e4718f06512f7d5193c388ce5f41bedb3a0615 Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Wed, 31 Jul 2019 17:16:52 -0600 Subject: [PATCH 01/13] Fixes ignition metadata and clarify in spitfire code --- biogeochem/EDPatchDynamicsMod.F90 | 15 +++++---------- fire/SFMainMod.F90 | 18 ++++++++---------- main/EDTypesMod.F90 | 2 -- main/FatesHistoryInterfaceMod.F90 | 6 +++--- parameter_files/fates_params_default.cdl | 4 ++-- 5 files changed, 18 insertions(+), 27 deletions(-) diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 410160ca0d..a6f3b31f94 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -208,12 +208,11 @@ subroutine disturbance_rates( site_in, bc_in) endif ! Fire Disturbance Rate - ! Fudge - fires can't burn the whole patch, as this causes /0 errors. - ! This is accumulating the daily fires over the whole 30 day patch generation phase. - currentPatch%disturbance_rates(dtype_ifire) = & - min(0.99_r8,currentPatch%disturbance_rates(dtype_ifire) + currentPatch%frac_burnt) + ! Fires can't burn the whole patch, as this causes /0 errors. + currentPatch%disturbance_rates(dtype_ifire) = currentPatch%frac_burnt - if (currentPatch%disturbance_rates(dtype_ifire) > 0.98_r8)then + if (debug) then + if (currentPatch%disturbance_rates(dtype_ifire) > 0.98_r8)then write(fates_log(),*) 'very high fire areas', & currentPatch%disturbance_rates(dtype_ifire),currentPatch%frac_burnt endif @@ -1613,10 +1612,8 @@ subroutine zero_patch(cp_p) currentPatch%fire = 999 ! sr decide_fire.1=fire hot enough to proceed. 0=stop everything- no fires today currentPatch%fd = 0.0_r8 ! fire duration (mins) currentPatch%ros_back = 0.0_r8 ! backward ros (m/min) - currentPatch%ab = 0.0_r8 ! area burnt daily m2 - currentPatch%nf = 0.0_r8 ! number of fires initiated daily currentPatch%sh = 0.0_r8 ! average scorch height for the patch(m) - currentPatch%frac_burnt = 0.0_r8 ! fraction burnt in each timestep. + currentPatch%frac_burnt = 0.0_r8 ! fraction burnt daily currentPatch%burnt_frac_litter(:) = 0.0_r8 currentPatch%btran_ft(:) = 0.0_r8 @@ -1953,8 +1950,6 @@ subroutine fuse_2_patches(csite, dp, rp) rp%fi = (dp%fi*dp%area + rp%fi*rp%area) * inv_sum_area rp%fd = (dp%fd*dp%area + rp%fd*rp%area) * inv_sum_area rp%ros_back = (dp%ros_back*dp%area + rp%ros_back*rp%area) * inv_sum_area - rp%ab = (dp%ab*dp%area + rp%ab*rp%area) * inv_sum_area - rp%nf = (dp%nf*dp%area + rp%nf*rp%area) * inv_sum_area rp%sh = (dp%sh*dp%area + rp%sh*rp%area) * inv_sum_area rp%frac_burnt = (dp%frac_burnt*dp%area + rp%frac_burnt*rp%area) * inv_sum_area rp%burnt_frac_litter(:) = (dp%burnt_frac_litter(:)*dp%area + rp%burnt_frac_litter(:)*rp%area) * inv_sum_area diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index 9761f1b9e8..8311e1736e 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -710,7 +710,8 @@ subroutine area_burnt ( currentSite ) !currentPatch%AB !daily area burnt (m2) !currentPatch%NF !Daily number of ignitions (lightning and human-caused), adjusted for size of patch. - use EDParamsMod, only : ED_val_nignitions + use EDParamsMod, only : ED_val_nignitions + use FatesConstantsMod, only : years_per_day type(ed_site_type), intent(inout), target :: currentSite type(ed_patch_type), pointer :: currentPatch @@ -758,14 +759,12 @@ subroutine area_burnt ( currentSite ) ! INTERF-TODO: ! THIS SHOULD HAVE THE COLUMN AND LU AREA WEIGHT ALSO, NO? - - gridarea = km2_to_m2 ! 1M m2 in a km2 ! NF = number of lighting strikes per day per km2 - currentPatch%NF = ED_val_nignitions * currentPatch%area/area /365 + NF = ED_val_nignitions * years_per_day - ! If there are 15 lightening strickes per year, per km2. (approx from NASA product) - ! then there are 15/365 s/km2 each day. + ! If there are 15 lightning strikes per year, per km2. (approx from NASA product) + ! then there are 15 * 1/365 strikes/km2 each day. ! Equation 1 in Thonicke et al. 2010 ! To Do: Connect here with the Li & Levis GDP fire suppression algorithm. @@ -777,18 +776,17 @@ subroutine area_burnt ( currentSite ) !AB = daily area burnt = size fires in m2 * num ignitions * prob ignition starts fire ! m2 per km2 per day - currentPatch%AB = size_of_fire * currentPatch%NF * currentSite%FDI + AB = size_of_fire * NF * currentSite%FDI - patch_area_in_m2 = gridarea *currentPatch%area/area + currentPatch%frac_burnt = min(0.99_r8, AB / km2_to_m2) - currentPatch%frac_burnt = currentPatch%AB / patch_area_in_m2 if(write_SF == itrue)then if ( hlm_masterproc == itrue ) write(fates_log(),*) 'frac_burnt',currentPatch%frac_burnt endif if (currentPatch%frac_burnt > 1.0_r8 ) then !all of patch burnt. - currentPatch%frac_burnt = 1.0_r8 ! capping at 1 same as %AB/patch_area_in_m2 + currentPatch%frac_burnt = 1.0_r8 ! capping at 1 same as %AB/km2_to_m2 if ( hlm_masterproc == itrue ) write(fates_log(),*) 'burnt all of patch',currentPatch%patchno if ( hlm_masterproc == itrue ) write(fates_log(),*) 'ros',currentPatch%ROS_front,currentPatch%FD, & diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index dd77c2cb20..b5501adead 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -536,11 +536,9 @@ module EDTypesMod real(r8) :: fi ! average fire intensity of flaming front: kj/m/s or kw/m integer :: fire ! Is there a fire? 1=yes 0=no real(r8) :: fd ! fire duration: mins - real(r8) :: nf ! number of fires initiated daily: n/gridcell/day real(r8) :: sh ! average scorch height: m ! FIRE EFFECTS - real(r8) :: ab ! area burnt: m2/day real(r8) :: frac_burnt ! fraction burnt: frac gridcell/day real(r8) :: tfc_ros ! total fuel consumed - no trunks. KgC/m2/day real(r8) :: burnt_frac_litter(nfsc) ! fraction of each litter pool burned:- diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 41ed6811d3..4c916651d8 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -3598,12 +3598,12 @@ subroutine define_history_vars(this, initialize_variables) ivar=ivar, initialize=initialize_variables, index = ih_fire_intensity_pa ) call this%set_history_var(vname='FIRE_AREA', units='fraction', & - long='spitfire fire area:m2', use_default='active', & + long='spitfire fire area burn fraction:%', use_default='active', & avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_fire_area_pa ) call this%set_history_var(vname='SCORCH_HEIGHT', units='m', & - long='spitfire fire area:m2', use_default='active', & + long='spitfire flame height:m', use_default='active', & avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_scorch_height_pa ) @@ -3612,7 +3612,7 @@ subroutine define_history_vars(this, initialize_variables) avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_fire_fuel_mef_pa ) - call this%set_history_var(vname='fire_fuel_bulkd', units='m', & + call this%set_history_var(vname='fire_fuel_bulkd', units='kgbiomass/m2', & long='spitfire fuel bulk density', use_default='active', & avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_fire_fuel_bulkd_pa ) diff --git a/parameter_files/fates_params_default.cdl b/parameter_files/fates_params_default.cdl index 49b7662508..45f5cfa383 100644 --- a/parameter_files/fates_params_default.cdl +++ b/parameter_files/fates_params_default.cdl @@ -502,8 +502,8 @@ variables: fates_fire_miner_total:units = "fraction" ; fates_fire_miner_total:long_name = "spitfire parameter, total mineral content, Table A1 Thonicke et al 2010" ; double fates_fire_nignitions ; - fates_fire_nignitions:units = "ignitions per day" ; - fates_fire_nignitions:long_name = "number of daily ignitions" ; + fates_fire_nignitions:units = "ignitions per year per km2" ; + fates_fire_nignitions:long_name = "number of annual ignitions per square km" ; double fates_fire_part_dens ; fates_fire_part_dens:units = "kg/m2" ; fates_fire_part_dens:long_name = "spitfire parameter, oven dry particle density, Table A1 Thonicke et al 2010" ; From 6daeb5cf55560442c4f98e3291c08f788ea8dfcc Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Thu, 1 Aug 2019 15:14:14 -0600 Subject: [PATCH 02/13] Define local variables and add comments --- fire/SFMainMod.F90 | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index 8311e1736e..eb86c0d189 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -716,10 +716,11 @@ subroutine area_burnt ( currentSite ) type(ed_site_type), intent(inout), target :: currentSite type(ed_patch_type), pointer :: currentPatch - real lb !length to breadth ratio of fire ellipse - real df !distance fire has travelled forward - real db !distance fire has travelled backward - real patch_area_in_m2 !'actual' patch area as applied to whole grid cell + real lb !length to breadth ratio of fire ellipse (unitless) + real df !distance fire has travelled forward in m + real db !distance fire has travelled backward in m + real NF !number of lightning strikes per day per km2 + real AB !daily area burnt in m2 per km2 real(r8) gridarea real(r8) size_of_fire !in m2 real(r8),parameter :: km2_to_m2 = 1000000.0_r8 !area conversion for square km to square m @@ -774,8 +775,8 @@ subroutine area_burnt ( currentSite ) !size of fire = equation 14 Arora and Boer JGR 2005 size_of_fire = ((3.1416_r8/(4.0_r8*lb))*((df+db)**2.0_r8)) - !AB = daily area burnt = size fires in m2 * num ignitions * prob ignition starts fire - ! m2 per km2 per day + !AB = daily area burnt = size fires in m2 * num ignitions per day per km2 * prob ignition starts fire + !AB = m2 per km2 per day AB = size_of_fire * NF * currentSite%FDI currentPatch%frac_burnt = min(0.99_r8, AB / km2_to_m2) @@ -786,7 +787,7 @@ subroutine area_burnt ( currentSite ) if (currentPatch%frac_burnt > 1.0_r8 ) then !all of patch burnt. - currentPatch%frac_burnt = 1.0_r8 ! capping at 1 same as %AB/km2_to_m2 + currentPatch%frac_burnt = 1.0_r8 ! capping at 1 if ( hlm_masterproc == itrue ) write(fates_log(),*) 'burnt all of patch',currentPatch%patchno if ( hlm_masterproc == itrue ) write(fates_log(),*) 'ros',currentPatch%ROS_front,currentPatch%FD, & From 7813db606391a2e00a94778ac6612f166aec5563 Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Thu, 1 Aug 2019 15:29:02 -0600 Subject: [PATCH 03/13] Remove unused variable lines --- fire/SFMainMod.F90 | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index eb86c0d189..c9c9e43c03 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -80,7 +80,6 @@ subroutine fire_model( currentSite, bc_in) currentPatch => currentSite%youngest_patch do while(associated(currentPatch)) currentPatch%frac_burnt = 0.0_r8 - currentPatch%AB = 0.0_r8 currentPatch%fire = 0 currentPatch => currentPatch%older enddo @@ -707,8 +706,6 @@ end subroutine fire_intensity !***************************************************************** subroutine area_burnt ( currentSite ) !***************************************************************** - !currentPatch%AB !daily area burnt (m2) - !currentPatch%NF !Daily number of ignitions (lightning and human-caused), adjusted for size of patch. use EDParamsMod, only : ED_val_nignitions use FatesConstantsMod, only : years_per_day @@ -791,7 +788,7 @@ subroutine area_burnt ( currentSite ) if ( hlm_masterproc == itrue ) write(fates_log(),*) 'burnt all of patch',currentPatch%patchno if ( hlm_masterproc == itrue ) write(fates_log(),*) 'ros',currentPatch%ROS_front,currentPatch%FD, & - currentPatch%NF,currentPatch%FI,size_of_fire + currentPatch%FI,size_of_fire endif From 129ea311b40e60cf0c582e5516705bb3ec1b6a3f Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Thu, 1 Aug 2019 15:37:14 -0600 Subject: [PATCH 04/13] Remove Patch%AB --- fire/SFMainMod.F90 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index c9c9e43c03..faaedd102f 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -727,7 +727,6 @@ subroutine area_burnt ( currentSite ) currentPatch => currentSite%oldest_patch; do while(associated(currentPatch)) - currentPatch%AB = 0.0_r8 currentPatch%frac_burnt = 0.0_r8 lb = 0.0_r8; db = 0.0_r8; df = 0.0_r8 @@ -767,7 +766,7 @@ subroutine area_burnt ( currentSite ) ! Equation 1 in Thonicke et al. 2010 ! To Do: Connect here with the Li & Levis GDP fire suppression algorithm. ! Equation 16 in arora and boer model JGR 2005 - !currentPatch%AB = currentPatch%AB *3.0_r8 + ! AB = AB *3.0_r8 !size of fire = equation 14 Arora and Boer JGR 2005 size_of_fire = ((3.1416_r8/(4.0_r8*lb))*((df+db)**2.0_r8)) From 7e00fe8683f435ed998ca9e1a4abd6618eedf2f7 Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Thu, 1 Aug 2019 16:04:14 -0600 Subject: [PATCH 05/13] Complete endif --- biogeochem/EDPatchDynamicsMod.F90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index a6f3b31f94..b3f44f94fc 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -214,7 +214,8 @@ subroutine disturbance_rates( site_in, bc_in) if (debug) then if (currentPatch%disturbance_rates(dtype_ifire) > 0.98_r8)then write(fates_log(),*) 'very high fire areas', & - currentPatch%disturbance_rates(dtype_ifire),currentPatch%frac_burnt + currentPatch%disturbance_rates(dtype_ifire),currentPatch%frac_burnt + endif endif From 1db47eb66725742d86f9740d86cfec50e6d6e60f Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Fri, 2 Aug 2019 14:33:57 -0600 Subject: [PATCH 06/13] Move ignitions calculation, remove unnecessary comments and checks, correct units for burnt area fraction --- fire/SFMainMod.F90 | 26 ++++++-------------------- main/FatesHistoryInterfaceMod.F90 | 2 +- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index faaedd102f..f993515836 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -725,6 +725,12 @@ subroutine area_burnt ( currentSite ) currentSite%frac_burnt = 0.0_r8 + !NF = number of lighting strikes per day per km2 + NF = ED_val_nignitions * years_per_day + + ! If there are 15 lightning strikes per year, per km2. (approx from NASA product for S.A.) + ! then there are 15 * 1/365 strikes/km2 each day. + currentPatch => currentSite%oldest_patch; do while(associated(currentPatch)) currentPatch%frac_burnt = 0.0_r8 @@ -753,15 +759,6 @@ subroutine area_burnt ( currentSite ) ! --- calculate area burnt--- if(lb > 0.0_r8) then - - ! INTERF-TODO: - ! THIS SHOULD HAVE THE COLUMN AND LU AREA WEIGHT ALSO, NO? - - ! NF = number of lighting strikes per day per km2 - NF = ED_val_nignitions * years_per_day - - ! If there are 15 lightning strikes per year, per km2. (approx from NASA product) - ! then there are 15 * 1/365 strikes/km2 each day. ! Equation 1 in Thonicke et al. 2010 ! To Do: Connect here with the Li & Levis GDP fire suppression algorithm. @@ -781,17 +778,6 @@ subroutine area_burnt ( currentSite ) if ( hlm_masterproc == itrue ) write(fates_log(),*) 'frac_burnt',currentPatch%frac_burnt endif - if (currentPatch%frac_burnt > 1.0_r8 ) then !all of patch burnt. - - currentPatch%frac_burnt = 1.0_r8 ! capping at 1 - - if ( hlm_masterproc == itrue ) write(fates_log(),*) 'burnt all of patch',currentPatch%patchno - if ( hlm_masterproc == itrue ) write(fates_log(),*) 'ros',currentPatch%ROS_front,currentPatch%FD, & - currentPatch%FI,size_of_fire - - endif - - endif endif! fire currentSite%frac_burnt = currentSite%frac_burnt + currentPatch%frac_burnt * currentPatch%area/area diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 4c916651d8..225f989a52 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -3598,7 +3598,7 @@ subroutine define_history_vars(this, initialize_variables) ivar=ivar, initialize=initialize_variables, index = ih_fire_intensity_pa ) call this%set_history_var(vname='FIRE_AREA', units='fraction', & - long='spitfire fire area burn fraction:%', use_default='active', & + long='spitfire fire area burn fraction', use_default='active', & avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_fire_area_pa ) From fb64435a3fbb1561589e03611bcbf119eb560135 Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Thu, 22 Aug 2019 15:40:02 -0600 Subject: [PATCH 07/13] Clean up reals in Spitfire code --- fire/SFMainMod.F90 | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index f993515836..1d5bc1789a 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -117,14 +117,14 @@ subroutine fire_danger_index ( currentSite, bc_in) type(ed_site_type) , intent(inout), target :: currentSite type(bc_in_type) , intent(in) :: bc_in - real(r8) :: temp_in_C ! daily averaged temperature in celcius - real(r8) :: rainfall ! daily precip in mm/day - real(r8) :: rh ! daily rh + real(r8) :: temp_in_C ! daily averaged temperature in celcius + real(r8) :: rainfall ! daily precip in mm/day + real(r8) :: rh ! daily rh - real yipsolon; !intermediate varable for dewpoint calculation - real dewpoint; !dewpoint in K - real d_NI; !daily change in Nesterov Index. C^2 - integer :: iofp ! index of oldest the fates patch + real(r8) :: yipsolon !intermediate varable for dewpoint calculation + real(r8) :: dewpoint !dewpoint in K + real(r8) :: d_NI !daily change in Nesterov Index. C^2 + integer :: iofp ! index of oldest the fates patch ! NOTE that the boundary conditions of temperature, precipitation and relative humidity ! are available at the patch level. We are currently using a simplification where the whole site @@ -713,17 +713,18 @@ subroutine area_burnt ( currentSite ) type(ed_site_type), intent(inout), target :: currentSite type(ed_patch_type), pointer :: currentPatch - real lb !length to breadth ratio of fire ellipse (unitless) - real df !distance fire has travelled forward in m - real db !distance fire has travelled backward in m - real NF !number of lightning strikes per day per km2 - real AB !daily area burnt in m2 per km2 + real(r8) lb !length to breadth ratio of fire ellipse (unitless) + real(r8) df !distance fire has travelled forward in m + real(r8) db !distance fire has travelled backward in m + real(r8) NF !number of lightning strikes per day per km2 + real(r8) AB !daily area burnt in m2 per km2 real(r8) gridarea real(r8) size_of_fire !in m2 real(r8),parameter :: km2_to_m2 = 1000000.0_r8 !area conversion for square km to square m integer g, p - currentSite%frac_burnt = 0.0_r8 + ! ---initialize site parameters to zero--- + currentSite%frac_burnt = 0.0_r8 !NF = number of lighting strikes per day per km2 NF = ED_val_nignitions * years_per_day @@ -733,8 +734,8 @@ subroutine area_burnt ( currentSite ) currentPatch => currentSite%oldest_patch; do while(associated(currentPatch)) + ! ---initialize patch parameters to zero--- currentPatch%frac_burnt = 0.0_r8 - lb = 0.0_r8; db = 0.0_r8; df = 0.0_r8 if (currentPatch%fire == 1) then ! The feedback between vegetation structure and ellipse size if turned off for now, From 21b0df09ef09cb81f73e7d0fa7f94e15f3c59de6 Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Fri, 23 Aug 2019 13:43:27 -0600 Subject: [PATCH 08/13] Clean up units and comments in Spitfire --- fire/SFMainMod.F90 | 11 ++++++++--- main/FatesHistoryInterfaceMod.F90 | 6 +++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index 1d5bc1789a..6c966fa7a0 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -194,7 +194,7 @@ subroutine charecteristics_of_fuel ( currentSite ) ! zero fire arrays. currentPatch%fuel_eff_moist = 0.0_r8 - currentPatch%fuel_bulkd = 0.0_r8 !this is kgBiomass/m2 for use in rate of spread equations + currentPatch%fuel_bulkd = 0.0_r8 !this is kgBiomass/m3 for use in rate of spread equations currentPatch%fuel_sav = 0.0_r8 currentPatch%fuel_frac(:) = 0.0_r8 currentPatch%fuel_mef = 0.0_r8 @@ -470,7 +470,8 @@ subroutine rate_of_spread ( currentSite ) ! ---heat of pre-ignition--- ! Equation A4 in Thonicke et al. 2010 - ! conversion of Rohtermal (1972) equation 12 in BTU/lb to current kJ/kg + ! Rothermal EQ12= 250 Btu/lb + 1116 Btu/lb * fuel_eff_moist + ! conversion of Rothermal (1972) EQ12 in BTU/lb to current kJ/kg ! q_ig in kJ/kg q_ig = 581.0_r8 +2594.0_r8 * currentPatch%fuel_eff_moist @@ -665,7 +666,10 @@ subroutine fire_intensity ( currentSite ) do while(associated(currentPatch)) ROS = currentPatch%ROS_front / 60.0_r8 !m/min to m/sec W = currentPatch%TFC_ROS / 0.45_r8 !kgC/m2 to kgbiomass/m2 + + !units of fire intensity = (kJ/kg)*(kgBiomass/m2)*(m/min) currentPatch%FI = SF_val_fuel_energy * W * ROS !kj/m/s, or kW/m + if(write_sf == itrue)then if( hlm_masterproc == itrue ) write(fates_log(),*) 'fire_intensity',currentPatch%fi,W,currentPatch%ROS_front endif @@ -675,7 +679,8 @@ subroutine fire_intensity ( currentSite ) ! Equation 7 from Venevsky et al GCB 2002 (modification of equation 8 in Thonicke et al. 2010) ! FDI 0.1 = low, 0.3 moderate, 0.75 high, and 1 = extreme ignition potential for alpha 0.000337 - currentSite%FDI = 1.0_r8 - exp(-SF_val_fdi_alpha*currentSite%acc_NI) + currentSite%FDI = 1.0_r8 - exp(-SF_val_fdi_alpha*currentSite%acc_NI) + ! Equation 14 in Thonicke et al. 2010 ! fire duration in minutes diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index 225f989a52..80e3ac3210 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -3587,7 +3587,7 @@ subroutine define_history_vars(this, initialize_variables) avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_effect_wspeed_pa ) - call this%set_history_var(vname='FIRE_TFC_ROS', units='none', & + call this%set_history_var(vname='FIRE_TFC_ROS', units='kgC/m2', & long ='total fuel consumed', use_default='active', & avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_TFC_ROS_pa ) @@ -3612,7 +3612,7 @@ subroutine define_history_vars(this, initialize_variables) avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_fire_fuel_mef_pa ) - call this%set_history_var(vname='fire_fuel_bulkd', units='kgbiomass/m2', & + call this%set_history_var(vname='fire_fuel_bulkd', units='kg biomass/m3', & long='spitfire fuel bulk density', use_default='active', & avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_fire_fuel_bulkd_pa ) @@ -3622,7 +3622,7 @@ subroutine define_history_vars(this, initialize_variables) avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_fire_fuel_eff_moist_pa ) - call this%set_history_var(vname='fire_fuel_sav', units='m', & + call this%set_history_var(vname='fire_fuel_sav', units='per m', & long='spitfire fuel surface/volume ', use_default='active', & avgflag='A', vtype=patch_r8, hlms='CLM:ALM', flushval=0.0_r8, upfreq=1, & ivar=ivar, initialize=initialize_variables, index = ih_fire_fuel_sav_pa ) From b8a0c837cf4d8e1ea32610f98410370022ea2033 Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Fri, 23 Aug 2019 14:25:19 -0600 Subject: [PATCH 09/13] Remove unnecessary gridarea variable in area burnt calculation --- fire/SFMainMod.F90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index 6c966fa7a0..7fc9f4dd19 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -723,7 +723,6 @@ subroutine area_burnt ( currentSite ) real(r8) db !distance fire has travelled backward in m real(r8) NF !number of lightning strikes per day per km2 real(r8) AB !daily area burnt in m2 per km2 - real(r8) gridarea real(r8) size_of_fire !in m2 real(r8),parameter :: km2_to_m2 = 1000000.0_r8 !area conversion for square km to square m integer g, p @@ -777,7 +776,8 @@ subroutine area_burnt ( currentSite ) !AB = daily area burnt = size fires in m2 * num ignitions per day per km2 * prob ignition starts fire !AB = m2 per km2 per day AB = size_of_fire * NF * currentSite%FDI - + + !frac_burnt in units of m2 here. currentPatch%frac_burnt = min(0.99_r8, AB / km2_to_m2) if(write_SF == itrue)then @@ -786,6 +786,7 @@ subroutine area_burnt ( currentSite ) endif endif! fire + ! convert frac_burnt to % prior to accumulating at site level currentSite%frac_burnt = currentSite%frac_burnt + currentPatch%frac_burnt * currentPatch%area/area currentPatch => currentPatch%younger From 22b7f99616e1a930309eb7d9aefca2f6ced7063b Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Fri, 30 Aug 2019 13:18:30 -0600 Subject: [PATCH 10/13] Vary live grass via Nesterov Index --- fire/SFMainMod.F90 | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index 7fc9f4dd19..5d06ccf8b8 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -229,13 +229,13 @@ subroutine charecteristics_of_fuel ( currentSite ) endif currentPatch%fuel_frac(lg_sf) = currentPatch%livegrass / currentPatch%sum_fuel - MEF(1:nfsc) = 0.524_r8 - 0.066_r8 * log10(SF_val_SAV(1:nfsc)) + MEF(1:nfsc) = 0.524_r8 - 0.066_r8 * log10(SF_val_SAV(1:nfsc)) !--- weighted average of relative moisture content--- ! Equation 6 in Thonicke et al. 2010. across twig, small branch, large branch, and dead leaves ! dead leaves and twigs included in 1hr pool per Thonicke (2010) ! Calculate fuel moisture for trunks to hold value for fuel consumption - alpha_FMC(tw_sf:dl_sf) = SF_val_SAV(tw_sf:dl_sf)/SF_val_drying_ratio + alpha_FMC(tw_sf:dl_sf) = SF_val_SAV(tw_sf:dl_sf)/SF_val_drying_ratio fuel_moisture(tw_sf:dl_sf) = exp(-1.0_r8 * alpha_FMC(tw_sf:dl_sf) * currentSite%acc_NI) @@ -245,12 +245,11 @@ subroutine charecteristics_of_fuel ( currentSite ) if ( hlm_masterproc == itrue ) write(fates_log(),*) 'csa ',currentSite%acc_NI if ( hlm_masterproc == itrue ) write(fates_log(),*) 'sfv ',alpha_FMC endif - ! FIX(RF,032414): needs refactoring. - ! average water content !is this the correct metric? - timeav_swc = sum(currentSite%water_memory(1:numWaterMem)) / real(numWaterMem,r8) - ! Equation B2 in Thonicke et al. 2010 - ! live grass moisture content depends on upper soil layer - fuel_moisture(lg_sf) = max(0.0_r8, 10.0_r8/9._r8 * timeav_swc - 1.0_r8/9.0_r8) + + ! live grass moisture is a function of SAV and changes via Nesterov Index + ! along the same relationship as the 1 hour fuels (live grass has same SAV as dead grass, + ! but retains more moisture with this calculation.) + fuel_moisture(lg_sf) = exp(-1.0_r8 * ((SF_val_SAV(tw_sf)/SF_val_drying_ratio) * currentSite%acc_NI) ! Average properties over the first three litter pools (twigs, s branches, l branches) currentPatch%fuel_bulkd = sum(currentPatch%fuel_frac(tw_sf:lb_sf) * SF_val_FBD(tw_sf:lb_sf)) From f42e4dd2b836977c68032d9da2006ad26c3525ca Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Fri, 30 Aug 2019 13:25:34 -0600 Subject: [PATCH 11/13] Remove call to soil moisture for fuels --- fire/SFMainMod.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index 5d06ccf8b8..0ce3fcca32 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -164,7 +164,6 @@ subroutine charecteristics_of_fuel ( currentSite ) type(ed_patch_type), pointer :: currentPatch type(ed_cohort_type), pointer :: currentCohort - real(r8) timeav_swc real(r8) alpha_FMC(nfsc) ! Relative fuel moisture adjusted per drying ratio real(r8) fuel_moisture(nfsc) ! Scaled moisture content of small litter fuels. real(r8) MEF(nfsc) ! Moisture extinction factor of fuels integer n From 443cd8a097e3f3e678f8e83a2010d027213740d8 Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Thu, 5 Sep 2019 10:08:36 -0600 Subject: [PATCH 12/13] Add missing parenthesis in SFMain --- fire/SFMainMod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index 0ce3fcca32..de894219ca 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -248,7 +248,7 @@ subroutine charecteristics_of_fuel ( currentSite ) ! live grass moisture is a function of SAV and changes via Nesterov Index ! along the same relationship as the 1 hour fuels (live grass has same SAV as dead grass, ! but retains more moisture with this calculation.) - fuel_moisture(lg_sf) = exp(-1.0_r8 * ((SF_val_SAV(tw_sf)/SF_val_drying_ratio) * currentSite%acc_NI) + fuel_moisture(lg_sf) = exp(-1.0_r8 * ((SF_val_SAV(tw_sf)/SF_val_drying_ratio) * currentSite%acc_NI)) ! Average properties over the first three litter pools (twigs, s branches, l branches) currentPatch%fuel_bulkd = sum(currentPatch%fuel_frac(tw_sf:lb_sf) * SF_val_FBD(tw_sf:lb_sf)) From bd688a3d6f61ad354c44407b771ca8e003aee657 Mon Sep 17 00:00:00 2001 From: Jacquelyn Shuman Date: Thu, 12 Sep 2019 18:14:09 -0600 Subject: [PATCH 13/13] Update param drying_ratio to Thonicke et al 2010 value of 66000 --- parameter_files/fates_params_default.cdl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parameter_files/fates_params_default.cdl b/parameter_files/fates_params_default.cdl index 45f5cfa383..41a49c5e42 100644 --- a/parameter_files/fates_params_default.cdl +++ b/parameter_files/fates_params_default.cdl @@ -1104,7 +1104,7 @@ data: fates_cwd_flig = 0.24 ; - fates_fire_drying_ratio = 13000 ; + fates_fire_drying_ratio = 66000 ; fates_fire_durat_slope = -11.06 ;