diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index db1cc110..5c9e382f 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -5,3 +5,4 @@ | yaswant | Yaswant Pradhan | Met Office | 2026-06-30 | | doucla | Douglas Clark | UKCEH | 2026-07-03 | | james-bruten-mo | James Bruten | Met Office | 2026-07-09 | +| eleanorgb | Eleanor Burke | Met Office | 2026-08-24 | diff --git a/doc/source/namelists/fire.nml.rst b/doc/source/namelists/fire.nml.rst index 96c8f492..fc8a8c05 100644 --- a/doc/source/namelists/fire.nml.rst +++ b/doc/source/namelists/fire.nml.rst @@ -1,7 +1,7 @@ ``fire.nml`` =================== -This file contains a single namelist called :nml:lst:`FIRE_SWITCHES` that sets time-invariant parameters for performing wildfire-related calculations. +This file contains two namelists one called :nml:lst:`JULES_FIRE_WEATHER_INDEX` that contains switches used to calculate the different fire weather indices available. The second namelist is for parameters associated with the inferno fire model called :nml:lst:`JULES_INFERNO` ``FIRE_SWITCHES`` namelist members ----------------------------------- @@ -57,3 +57,109 @@ This file contains a single namelist called :nml:lst:`FIRE_SWITCHES` that sets t :default: F Switch for calculating the Nesterov Index. + + +``JULES_INFERNO`` namelist members +----------------------------------- + +.. nml:member:: z_burn_max + + :type: real + :default: 0.2 + + Parameter controlling the depth to which fire burns soil litter carbon in metres. At depths shallower than this value, the fire can burn soil carbon in the two litter pools (dpm and rpm). If z_burn_max falls within a layer only a proportion of the soil carbon is burnt. Only used with layered soil carbon scheme (:nml:mem:`JULES_SOIL_BIOGEOCHEM::l_layeredc` = TRUE) and fire (either :nml:mem:`JULES_VEGETATION::l_trif_fire` or :nml:mem:`JULES_VEGETATION::l_inferno` or both). In reality the burn depth varies so please check whether the default value of 0.2 is suitable for your application. + +.. nml:member:: flam_sm_func + + :type: integer + :permitted: 1, 2 + :default: 1 + + Switch used to define the function used to parameterise the relationship between soil moisture and flammability + + 1. A linear relationship which has a flammability of 0 at saturation and 1 when soil is completely dry. + + 2. An exponential relationship controlled by :nml:mem:`flam_sm_low` and :nml:mem:`flam_sm_up` + + .. nml:member:: flam_sm_low + + :type: real + :default: 0.0 + + Soil moisture below which flammability is 1.0. Expressed as a fraction of saturation. Only used if :nml:mem:`flam_sm_func` = 2. + +.. nml:member:: flam_sm_up + + :type: real + :default: 2.4 + + Exponential decay parameter for relationship between soil moisture and flammability. Only used if :nml:mem:`flam_sm_func` = 2. + +.. nml:member:: flam_rhum_low + + :type: real + :default: 10.0 + + Lower relative humidity threshold for relationship between relative humidity and flammability below which value of function is 1.0. Expressed as a percentage. + +.. nml:member:: flam_rhum_up + + :type: real + :default: 90.0 + + Upper relative humidity threshold for relationship between relative humidity and flammability above which value of function is 0.0. Expressed as a percentage. + +.. nml:member:: flam_rain_const + + :type: real + :default: 14929920000.0 + + An exponential decay factor that defines the relationship between flammability and rainfall. + In order to recreate the relationship hardwired into JULES version 8.2 and lower this value + should be set to 14929920000.0. However, this is not the relationship that + was documented by Mangeon et al. (2016). If you want the Mangeon et al. relationship + then this value should be 172800.0. + If you want to remove the dependence of flammability on rainfall then this value should be set to 0.0. + + .. seealso:: + References: + + * Mangeon, S., Voulgarakis, A., Gilham, R., Harper, A., Sitch, S., and Folberth, G.: INFERNO: a fire and emissions scheme for the UK Met Office’s Unified Model, Geosci. Model Dev., 9, 2685-2700, https://doi.org/10.5194/gmd-9-2685-2016, 2016. + +.. nml:member:: flam_fuel_low + + :type: real + :default: 0.02 + +.. nml:member:: flam_fuel_up + :type: real + :default: 0.2 + +.. nml:member:: ccdpm_min + + :type: real + :default: 0.8 + + Minimum DPM soil carbon pool combustion completeness fraction. + +.. nml:member:: ccdpm_max + + :type: real + :default: 1.0 + + Maximum DPM soil carbon pool combustion completeness fraction. + +.. nml:member:: ccrpm_min + + :type: real + :default: 0.0 + + Minimum RPM soil carbon pool combustion completeness fraction. + + +.. nml:member:: ccrpm_max + + :type: real + :default: 0.2 + + Maximum RPM soil carbon pool combustion completeness fraction. diff --git a/doc/source/namelists/jules_soil_biogeochem.nml.rst b/doc/source/namelists/jules_soil_biogeochem.nml.rst index b90452db..6f3f255f 100644 --- a/doc/source/namelists/jules_soil_biogeochem.nml.rst +++ b/doc/source/namelists/jules_soil_biogeochem.nml.rst @@ -259,13 +259,6 @@ If using the ECOSSE soil model, most soil parameters are read from a separate fi Parameter controlling the rate of re-filling of the available inorganic nitrogen pool (1/360 days). This parameter determines how quickly the inorganic nitrogen reaches the roots after the roots uptake from the soil around them. This should be quicker than the turnover rate of inorganic nitrogen. In addition, it has to be small compared with the triffid timestep (360/triffid_period) otherwise the available inorganic nitrogen becomes unstable. Hence the choice of the default value 5. Only used with layered soil carbon and nitrogen scheme (:nml:mem:`l_layeredc` = TRUE and :nml:mem:`JULES_VEGETATION::l_nitrogen` = TRUE). When :nml:mem:`JULES_VEGETATION::l_trif_eq` = TRUE or :nml:mem:`JULES_SOIL_BIOGEOCHEM::diff_n_pft` is greater than (0.5 * 360 / :nml:mem:`JULES_VEGETATION::triffid_period`) then all of the inorganic nitrogen pool is deemed to be available. - .. nml:member:: z_burn_max - - :type: real - :default: 0.2 - - Parameter controlling the depth to which fire burns soil litter carbon in metres. At depths shallower than this value, the fire can burn soil carbon in the two litter pools (dpm and rpm). If z_burn_max falls within a layer only a proportion of the soil carbon is burnt. Only used with layered soil carbon scheme (:nml:mem:`l_layeredc` = TRUE) and fire (either :nml:mem:`JULES_VEGETATION::l_trif_fire` or :nml:mem:`JULES_VEGETATION::l_inferno` or both). In reality the burn depth varies so please check whether the default value of 0.2 is suitable for your application. - .. nml:group:: Parameters for the 4-pool- or ECOSSE-based models (only used if :nml:mem:`soil_bgc_model` = 2 or 3): diff --git a/doc/source/namelists/triffid_params.nml.rst b/doc/source/namelists/triffid_params.nml.rst index 48b18cc4..e348bdc3 100644 --- a/doc/source/namelists/triffid_params.nml.rst +++ b/doc/source/namelists/triffid_params.nml.rst @@ -178,3 +178,19 @@ This namelist is used to read PFT parameters that are only needed by the dynamic .. note:: :nml:mem:`lai_min_io` must be set such that PFT height at :nml:mem:`lai_min_io` <= :nml:mem:`harvest_ht_io`, otherwise JULES will not start (the required value will be shown in error output). +.. nml:member:: fireveg_c_to_atmos_io + + :type: real(npft) + :default: None + + Only used if :nml:mem:`JULES_VEGETATION::l_trif_fire` = TRUE. + + Fraction of burnt carbon that goes to the atmosphere as CO2 instead of in the soil. + Based on mean whole-plant mortality factor from Li et al (2012) table 2. + + .. seealso:: + References: + + * Li, F., Zeng, X. D., and Levis, S.: A process-based fire parameterization + of intermediate complexity in a Dynamic Global Vegetation Model, Biogeosciences, + 9, 2761-2780, https://doi.org/10.5194/bg-9-2761-2012, 2012. diff --git a/rose-meta/jules-shared/jules-inferno/HEAD/rose-meta.conf b/rose-meta/jules-shared/jules-inferno/HEAD/rose-meta.conf new file mode 100644 index 00000000..dab62cc0 --- /dev/null +++ b/rose-meta/jules-shared/jules-inferno/HEAD/rose-meta.conf @@ -0,0 +1,114 @@ +[namelist:jules_inferno] +compulsory=true +description=Options for inferno fire parametrisations +ns=namelist/JULES Science Settings/jules_inferno +sort-key=Section-A12p +title=Fire options +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html + +[namelist:jules_inferno=ccdpm_max] +compulsory=true +description=Maximum fraction of DPM consumed by fire +range=0.0:1.0 +sort-key=Panel-J06 +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::ccdpm_max + +[namelist:jules_inferno=ccdpm_min] +compulsory=true +description=Minimum fraction of DPM consumed by fire +range=0.0:1.0 +sort-key=Panel-J05 +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::ccdpm_min + +[namelist:jules_inferno=ccrpm_max] +compulsory=true +description=Maximum fraction of RPM consumed by fire +range=0.0:1.0 +sort-key=Panel-J08 +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::ccrpm_max + +[namelist:jules_inferno=ccrpm_min] +compulsory=true +description=Minimum fraction of RPM consumed by fire +range=0.0:1.0 +sort-key=Panel-J07 +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::ccrpm_min + +[namelist:jules_inferno=flam_fuel_low] +compulsory=true +description=Lower fuel load threshold for flammability +range=0.0: +sort-key=Panel-J12 +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::flam_fuel_low + +[namelist:jules_inferno=flam_fuel_up] +compulsory=true +description=Upper fuel load threshold for flammability +range=0.0:1.0 +sort-key=Panel-J13 +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::flam_fuel_up + +[namelist:jules_inferno=flam_rain_const] +compulsory=true +description=Rainfall flammability scaling constant +range=0.0: +sort-key=Panel-J14 +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::flam_rain_const + +[namelist:jules_inferno=flam_rhum_low] +compulsory=true +description=Lower relative humidity threshold for relationship between relative humidity and flammability +range=0.0:100.0 +sort-key=Panel-J09 +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::flam_rhum_low + +[namelist:jules_inferno=flam_rhum_up] +compulsory=true +description=Upper relative humidity threshold for relationship between relative humidity and flammability +range=0.0:100.0 +sort-key=Panel-J10 +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::flam_rhum_up + +[namelist:jules_inferno=flam_sm_func] +compulsory=true +description=Function relating soil moisture to flammability 1=linear, 2=exponential +sort-key=Panel-J11 +trigger=namelist:jules_inferno=flam_sm_low: 2; + =namelist:jules_inferno=flam_sm_up: 2; +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::flam_sm_func +value-titles=(1) linear, + =(2) exponential +values=1,2 + +[namelist:jules_inferno=flam_sm_low] +compulsory=true +description=Soil moisture below which flammability is 1.0 +range=0.0:1.0 +sort-key=Panel-J11b +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::flam_sm_low + +[namelist:jules_inferno=flam_sm_up] +compulsory=true +description=Exponential decay parameter for relationship between soil moisture and flammability +range=0.0:10.0 +sort-key=Panel-J11c +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::flam_sm_up + +[namelist:jules_inferno=z_burn_max] +compulsory=true +description=Maximum burn depth for soil - soil carbon is burned above this level +range=0.0:10.0 +sort-key=Panel-J04 +type=real +url=https://metoffice.github.io/jules/latest/namelists/jules_inferno.nml.html#JULES_INFERNO::z_burn_max diff --git a/rose-meta/jules-shared/jules-vegetation/HEAD/rose-meta.conf b/rose-meta/jules-shared/jules-vegetation/HEAD/rose-meta.conf index 5c8f7f03..8425ce1f 100644 --- a/rose-meta/jules-shared/jules-vegetation/HEAD/rose-meta.conf +++ b/rose-meta/jules-shared/jules-vegetation/HEAD/rose-meta.conf @@ -101,7 +101,8 @@ compulsory=true description=Use interactive fire linked to INFERNO including interactive fire emissions. fail-if=this == '.true.' and (namelist:jules_vegetation=l_trif_eq == '.true.'); sort-key=Panel-I02c -trigger=namelist:jules_pftparm=fire_mort_io: .true. +trigger=namelist:jules_pftparm=fire_mort_io: .true.; + =namelist:jules_triffid=fireveg_c_to_atmos_io: .true.; type=logical url=https://metoffice.github.io/jules/latest/namelists/jules_vegetation.nml.html#JULES_VEGETATION::l_trif_fire diff --git a/rose-meta/jules-standalone/HEAD/rose-meta.conf b/rose-meta/jules-standalone/HEAD/rose-meta.conf index e30a27c5..746c941e 100644 --- a/rose-meta/jules-standalone/HEAD/rose-meta.conf +++ b/rose-meta/jules-standalone/HEAD/rose-meta.conf @@ -1,6 +1,7 @@ # Please see jules:wiki:SharingJULESmetadata -import=jules-shared/jules-hydrology/HEAD +import=jules-shared/jules-inferno/HEAD + =jules-shared/jules-hydrology/HEAD =jules-shared/jules-model-environment/HEAD =jules-shared/jules-nvegparm/HEAD =jules-shared/jules-pftparm/HEAD @@ -5004,7 +5005,7 @@ sort-key=b trigger=namelist:jules_soil_biogeochem=tau_resp: .true.; =namelist:jules_soil_biogeochem=l_label_frac_cs: .true.; =namelist:jules_soil_biogeochem=diff_n_pft: .true.; - =namelist:jules_soil_biogeochem=z_burn_max: .true.; + =namelist:jules_inferno=z_burn_max: .true.; type=logical url=https://metoffice.github.io/jules/latest/namelists/jules_soil_biogeochem.nml.html#JULES_SOIL_BIOGEOCHEM::l_layeredc @@ -5203,14 +5204,6 @@ sort-key=b2 type=real url=https://metoffice.github.io/jules/latest/namelists/jules_soil_biogeochem.nml.html#JULES_SOIL_BIOGEOCHEM::tau_resp -[namelist:jules_soil_biogeochem=z_burn_max] -compulsory=true -description=Maximum burn depth for soil - soil carbon is burned above this level -range=0.0:10.0 -sort-key=b2 -type=real -url=https://metoffice.github.io/jules/latest/namelists/jules_soil_biogeochem.nml.html#JULES_SOIL_BIOGEOCHEM::z_burn_max - [namelist:jules_soil_ecosse] compulsory=true ns=namelist/JULES Science Settings/jules_soil_ecosse @@ -6241,6 +6234,16 @@ length=: type=real url=https://metoffice.github.io/jules/latest/namelists/triffid_params.nml.htm#JULES_TRIFFID::dpm_rpm_ratio_io +[namelist:jules_triffid=fireveg_c_to_atmos_io] +compulsory=true +description=Fraction of burnt carbon that goes to the atmosphere as CO2 instead of in the soil. +fail-if=len(this) != namelist:jules_surface_types=npft +length=: +ns=namelist/JULES Science Settings/jules_pftparm/Other parameters +range=0:1 +type=real +url=https://metoffice.github.io/jules/latest/namelists/triffid_params.nml.html#JULES_TRIFFID::fireveg_c_to_atmos_io + [namelist:jules_triffid=g_area_io] compulsory=true description=Disturbance rate (/360days) diff --git a/rose-meta/jules-standalone/versions.py b/rose-meta/jules-standalone/versions.py index 1d4c41a9..11dc43f1 100644 --- a/rose-meta/jules-standalone/versions.py +++ b/rose-meta/jules-standalone/versions.py @@ -45,15 +45,45 @@ from .version81_82 import * -class vnYY_txxxx(MacroUpgrade): - """Upgrade macro from JULES by Author""" +class vn82_t61(MacroUpgrade): - BEFORE_TAG = "vnY.Y" - AFTER_TAG = "vnY.Y_txxxx" + """Upgrade macro from JULES by Eleanor Burke""" + + BEFORE_TAG = "vn8.2" + AFTER_TAG = "vn8.2_t61" def upgrade(self, config, meta_config=None): """Upgrade a JULES runtime app configuration.""" - # Add settings + self.add_setting(config, ["namelist:jules_inferno"]) + + source = self.get_setting_value(config, ["file:fire.nml","source"]) + source = source.replace("namelist:fire_switches", + "namelist:fire_switches namelist:jules_inferno") + self.change_setting_value(config, ["file:fire.nml","source"], source) + + z_burn_max = self.get_setting_value(config, ["namelist:jules_soil_biogeochem", "z_burn_max"]) + self.add_setting(config, + ["namelist:jules_inferno", "z_burn_max"], z_burn_max) + self.remove_setting(config, ["namelist:jules_soil_biogeochem", "z_burn_max"]) + + self.add_setting(config, ["namelist:jules_inferno", "ccdpm_min"], "0.8") + self.add_setting(config, ["namelist:jules_inferno", "ccdpm_max"], "1.0") + self.add_setting(config, ["namelist:jules_inferno", "ccrpm_min"], "0.0") + self.add_setting(config, ["namelist:jules_inferno", "ccrpm_max"], "0.2") + + self.add_setting(config, ["namelist:jules_inferno", "flam_rhum_low"], "10.0") + self.add_setting(config, ["namelist:jules_inferno", "flam_rhum_up"], "90.0") + self.add_setting(config, ["namelist:jules_inferno", "flam_sm_low"], "0.0") + self.add_setting(config, ["namelist:jules_inferno", "flam_sm_up"], "2.4") + self.add_setting(config, ["namelist:jules_inferno", "flam_fuel_low"], "0.02") + self.add_setting(config, ["namelist:jules_inferno", "flam_fuel_up"], "0.2") + self.add_setting(config, ["namelist:jules_inferno", "flam_rain_const"], "14929920000.0") + self.add_setting(config, ["namelist:jules_inferno", "flam_sm_func"], "1") + + npft = int(self.get_setting_value(config, ["namelist:jules_surface_types", "npft"])) + self.add_setting( + config, ["namelist:jules_triffid", "fireveg_c_to_atmos_io"], ",".join(["0.13"] * npft)) + return config, self.reports diff --git a/rose-meta/jules-um/HEAD/rose-meta.conf b/rose-meta/jules-um/HEAD/rose-meta.conf index 0f8fdd05..1c665640 100644 --- a/rose-meta/jules-um/HEAD/rose-meta.conf +++ b/rose-meta/jules-um/HEAD/rose-meta.conf @@ -8,7 +8,8 @@ # Please see jules:wiki:SharingJULESmetadata ############################################################################### -import=jules-shared/jules-hydrology/HEAD +import=jules-shared/jules-inferno/HEAD + =jules-shared/jules-hydrology/HEAD =jules-shared/jules-model-environment/HEAD =jules-shared/jules-nvegparm/HEAD =jules-shared/jules-pftparm/HEAD diff --git a/rose-stem/app/fab_jules/bin/gfortran_10_plus_rivers.json b/rose-stem/app/fab_jules/bin/gfortran_10_plus_rivers.json index ee11274a..9e0a567d 100644 --- a/rose-stem/app/fab_jules/bin/gfortran_10_plus_rivers.json +++ b/rose-stem/app/fab_jules/bin/gfortran_10_plus_rivers.json @@ -241,4 +241,4 @@ "-fopenmp", "-Wl,--rpath=/data/apps/spack/opt/linux-rhel9-zen2/gcc-12.2.0/netcdf-fortran-4.6.1-3bu2pvjyujppdgn446jxste4k7vq6xay/lib" ] -} \ No newline at end of file +} diff --git a/src/control/shared/jules_inferno_mod.F90 b/src/control/shared/jules_inferno_mod.F90 new file mode 100644 index 00000000..e8d746dd --- /dev/null +++ b/src/control/shared/jules_inferno_mod.F90 @@ -0,0 +1,467 @@ +! *****************************COPYRIGHT******************************* +! (C) Crown copyright Met Office. All rights reserved. +! For further details please refer to the file COPYRIGHT.txt +! which you should have received as part of this distribution. +! *****************************COPYRIGHT******************************* + +MODULE jules_inferno_mod + +! ----------------------------------------------------------------------------- +! Description: +! Contains switches and other parameters for l_inferno and l_trif_fire +! In the future will also contain l_inferno, l_trif_fire and +! ignition_method +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in TECHNICAL +! ----------------------------------------------------------------------------- + +USE um_types, ONLY: real_jlslsm +USE missing_data_mod, ONLY: rmdi, imdi + +IMPLICIT NONE + +INTEGER :: & + flam_sm_func = 1 + ! Switch for relationship between INFERNO fire + ! flammability and soil moisture + ! FLAM_SM_FUNC=1:Linear (doesnt require flam_sm_low / flam_sm_up) + ! FLAM_SM_FUNC=2:Exponential + + +REAL(KIND=real_jlslsm) :: & + flam_sm_low = rmdi, & + ! Below this soil moisture, flammability is 1.0 (flam_sm_func=2) + ! Expressed as a fraction of saturation (between 0 and 1) + flam_sm_up = rmdi, & + ! Exponential decay parameter for relationship between soil moisture + ! and flammability (flam_sm_func=2) + flam_rhum_low = rmdi, & + ! Lower boundary to the relative humidity (%, between 0 and 100 %) + flam_rhum_up = rmdi, & + ! Upper boundary to the relative humidity (%, between 0 and 100 %) + flam_rain_const = rmdi, & + ! Precipitation factor (2(day/mm)*(kg/m2/s) WRONG UNITS) + flam_fuel_low = rmdi, & + ! Lower boundary to the fuel density (UNITS) + flam_fuel_up = rmdi, & + ! Upper boundary to the fuel density (UNITS) + ccdpm_min = rmdi, & + ! Minimum decomposable plant material burn fraction (0 <= fraction <= 1) + ccdpm_max = rmdi, & + ! Decomposable Plant Material burn fraction (0 <= fraction <= 1) + ccrpm_min = rmdi, & + ! Minimum resistant plant material urn fraction (0 <= fraction <= 1) + ccrpm_max = rmdi, & + ! Maximum resistant Plant Material burn fraction (0 <= fraction <= 1) + z_burn_max = rmdi + ! Parameter setting maximum depth of burn (m) + +INTEGER, PARAMETER :: ignition_constant = 1 +INTEGER, PARAMETER :: ignition_vary_natural = 2 +INTEGER, PARAMETER :: ignition_vary_natural_human = 3 + +!----------------------------------------------------------------------- +! Set up a namelist to allow switches to be set. +!----------------------------------------------------------------------- +NAMELIST / jules_inferno/ & + flam_sm_func,flam_sm_low, flam_sm_up, flam_rhum_low, flam_rhum_up, & + flam_rain_const, flam_fuel_low, flam_fuel_up, & + ccdpm_min, ccdpm_max, ccrpm_min, ccrpm_max, z_burn_max + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='JULES_INFERNO_MOD' + +CONTAINS + +SUBROUTINE check_jules_inferno() + + +!----------------------------------------------------------------------------- +! Description: +! Checks JULES_INFERNO namelist for consistency and calculates some +! derived values. +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in TECHNICAL +!----------------------------------------------------------------------------- + +USE jules_vegetation_mod, ONLY: l_inferno, l_trif_fire, ignition_method + +USE ereport_mod, ONLY: ereport +USE jules_print_mgr, ONLY: jules_print, jules_message + +IMPLICIT NONE + +INTEGER :: errorstatus + + +CHARACTER(LEN=*), PARAMETER :: RoutineName='CHECK_JULES_INFERNO' + +errorstatus = 101 + +IF ( l_inferno ) THEN + ! Check a suitable ignition_method was given + IF ( ignition_method /= ignition_constant .AND. & + ignition_method /= ignition_vary_natural .AND. & + ignition_method /= ignition_vary_natural_human ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + 'ignition_method must be 1, 2 or 3') + END IF + + ! Check a suitable flam_sm_func was given + IF ( flam_sm_func /= 1 .AND. flam_sm_func /= 2 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + 'flam_sm_func must be 1 or 2') + END IF + + IF ( flam_sm_func == 2 ) THEN + IF ( ABS(flam_sm_low - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_sm_low needs to be specified.") + ELSE IF ( flam_sm_low < 0.0 .OR. flam_sm_low > 1.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_sm_low must be >= 0.0 and <= 1.0.") + END IF + + IF ( ABS(flam_sm_up - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_sm_up needs to be specified.") + ELSE IF ( flam_sm_up < 0.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_sm_up must be >= 0.0") + END IF + END IF + + IF ( ABS(flam_rhum_low - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_rhum_low needs to be specified.") + ELSE IF ( flam_rhum_low < 0.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_rhum_low must be >= 0.0.") + END IF + + IF ( ABS(flam_rhum_up - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_rhum_up needs to be specified.") + ELSE IF ( flam_rhum_up <= flam_rhum_low ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_rhum_up must be >= flam_rhum_low") + ELSE IF ( flam_rhum_up > 100.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_rhum_up must be <= 100.0.") + END IF + + IF ( ABS(flam_fuel_low - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_fuel_low needs to be specified.") + ELSE IF ( flam_fuel_low < 0.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_fuel_low must be >= 0.0.") + END IF + + IF ( ABS(flam_fuel_up - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_fuel_up needs to be specified.") + ELSE IF ( flam_fuel_up < flam_fuel_low ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_fuel_up must be > flam_fuel_low") + ELSE IF ( flam_fuel_up > 1.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_fuel_up must be <= 1.0.") + END IF + + IF ( ABS(flam_rain_const - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_rain_const needs to be specified.") + ELSE IF ( flam_rain_const < 0.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "flam_rain_const must be >= 0.0.") + END IF +END IF ! end of l_inferno check + + +IF ( l_trif_fire .OR. l_inferno ) THEN + IF ( ABS(ccdpm_min - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "ccdpm_min needs to be specified.") + ELSE IF ( ccdpm_min < 0.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "ccdpm_min must be >= 0.0.") + END IF + + IF ( ABS(ccdpm_max - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "ccdpm_max needs to be specified.") + ELSE IF ( ccdpm_max < ccdpm_min ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "ccdpm_max must be >= ccdpm_min") + ELSE IF ( ccdpm_max > 1.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "ccdpm_max must be < 1.0.") + END IF + + IF ( ABS(ccrpm_min - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "ccrpm_min needs to be specified.") + ELSE IF ( ccrpm_min < 0.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "ccrpm_min must be >= 0.0.") + END IF + + IF ( ABS(ccrpm_max - rmdi) < EPSILON(rmdi) ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "ccrpm_max needs to be specified.") + ELSE IF ( ccrpm_max < ccrpm_min ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "ccrpm_max must be >= ccrpm_min") + ELSE IF ( ccrpm_max > 1.0 ) THEN + CALL ereport( TRIM(RoutineName), errorstatus, & + "ccrpm_max must be < 1.0.") + END IF + +END IF ! end of l_trif_fire check + + +END SUBROUTINE check_jules_inferno + + +SUBROUTINE print_nlist_jules_inferno() + +USE jules_vegetation_mod, ONLY: l_inferno, l_trif_fire, ignition_method + +USE jules_print_mgr, ONLY: jules_print + +IMPLICIT NONE + +CHARACTER(LEN=50000) :: lineBuffer + +CALL jules_print('jules_inferno', 'Contents of namelist jules_inferno') + +CALL jules_print('jules_inferno_mod', & + 'Contents of namelist jules_inferno') + +IF ( l_inferno ) THEN + WRITE(lineBuffer,*)' ignition_method = ',ignition_method + CALL jules_print('jules_inferno_mod',lineBuffer) + + IF (ignition_method == ignition_constant ) THEN + WRITE(lineBuffer,*)'Constant or ubiquitous ignitions (l_inferno=T)' + ELSE IF (ignition_method == ignition_vary_natural ) THEN + WRITE(lineBuffer,*)'Constant human ignitions, varying lightning (l_inferno=T)' + ELSE IF (ignition_method == ignition_vary_natural_human ) THEN + WRITE(lineBuffer,*)'Fully prescribed ignitions (l_inferno=T)' + END IF + + WRITE(lineBuffer,*)' flam_sm_func = ',flam_sm_func + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer,*)' flam_sm_low = ',flam_sm_low + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer,*)' flam_sm_up = ',flam_sm_up + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer,*)' flam_rhum_low = ',flam_rhum_low + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer,*)' flam_rhum_up = ',flam_rhum_up + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer,*)' flam_rain_const = ',flam_rain_const + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer,*)' flam_fuel_low = ',flam_fuel_low + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer,*)' flam_fuel_up = ',flam_fuel_up + CALL jules_print('jules_inferno_mod',lineBuffer) +END IF + +IF ( l_trif_fire ) THEN + WRITE(lineBuffer,*)' ccdpm_min = ',ccdpm_min + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer,*)' ccdpm_max = ',ccdpm_max + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer,*)' ccrpm_min = ',ccrpm_min + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer,*)' ccrpm_max = ',ccrpm_max + CALL jules_print('jules_inferno_mod',lineBuffer) + + WRITE(lineBuffer, *) ' z_burn_max = ', z_burn_max + CALL jules_print('jules_inferno_mod', lineBuffer) +END IF + +CALL jules_print('jules_inferno_mod', & + '- - - - - - end of namelist - - - - - -') + +END SUBROUTINE print_nlist_jules_inferno + +#if defined(UM_JULES) && !defined(LFRIC) +SUBROUTINE read_nml_jules_inferno (unitnumber) + +! Description: +! Read the JULES_INFERNO namelist + +USE setup_namelist, ONLY: setup_nml_type +USE check_iostat_mod, ONLY: check_iostat +USE UM_parcore, ONLY: mype + +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +USE errormessagelength_mod, ONLY: errormessagelength + +IMPLICIT NONE + +! Subroutine arguments +INTEGER, INTENT(IN) :: unitnumber +INTEGER :: my_comm +INTEGER :: mpl_nml_type +INTEGER :: errorstatus +INTEGER :: icode +CHARACTER(LEN=errormessagelength) :: iomessage +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='READ_NML_JULES_INFERNO' +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 + +! set number of each type of variable in my_namelist type +INTEGER, PARAMETER :: no_of_types = 2 +INTEGER, PARAMETER :: n_int = 1 +INTEGER, PARAMETER :: n_real = 12 + +TYPE :: my_namelist + SEQUENCE + REAL(KIND=real_jlslsm) :: flam_sm_low + REAL(KIND=real_jlslsm) :: flam_sm_up + REAL(KIND=real_jlslsm) :: flam_rhum_low + REAL(KIND=real_jlslsm) :: flam_rhum_up + REAL(KIND=real_jlslsm) :: flam_rain_const + REAL(KIND=real_jlslsm) :: flam_fuel_low + REAL(KIND=real_jlslsm) :: flam_fuel_up + REAL(KIND=real_jlslsm) :: ccdpm_min + REAL(KIND=real_jlslsm) :: ccdpm_max + REAL(KIND=real_jlslsm) :: ccrpm_min + REAL(KIND=real_jlslsm) :: ccrpm_max + REAL(KIND=real_jlslsm) :: z_burn_max + INTEGER :: flam_sm_func +END TYPE my_namelist + +TYPE (my_namelist) :: my_nml + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +CALL gc_get_communicator(my_comm, icode) + +CALL setup_nml_type(no_of_types, mpl_nml_type, n_int_in = n_int, & + n_real_in = n_real) + +IF (mype == 0) THEN + + READ (UNIT = unitnumber, NML = jules_inferno, IOSTAT = errorstatus, & + IOMSG = iomessage) + CALL check_iostat(errorstatus, "namelist jules_inferno", iomessage) + + my_nml % flam_sm_func = flam_sm_func + my_nml % flam_sm_low = flam_sm_low + my_nml % flam_sm_up = flam_sm_up + my_nml % flam_rhum_low = flam_rhum_low + my_nml % flam_rhum_up = flam_rhum_up + my_nml % flam_rain_const = flam_rain_const + my_nml % flam_fuel_low = flam_fuel_low + my_nml % flam_fuel_up = flam_fuel_up + my_nml % ccdpm_min = ccdpm_min + my_nml % ccdpm_max = ccdpm_max + my_nml % ccrpm_min = ccrpm_min + my_nml % ccrpm_max = ccrpm_max + my_nml % z_burn_max = z_burn_max +END IF + +CALL mpl_bcast(my_nml,1,mpl_nml_type,0,my_comm,icode) + +IF (mype /= 0) THEN + + flam_sm_func = my_nml % flam_sm_func + flam_sm_low = my_nml % flam_sm_low + flam_sm_up = my_nml % flam_sm_up + flam_rhum_low = my_nml % flam_rhum_low + flam_rhum_up = my_nml % flam_rhum_up + flam_rain_const = my_nml % flam_rain_const + flam_fuel_low = my_nml % flam_fuel_low + flam_fuel_up = my_nml % flam_fuel_up + ccdpm_min = my_nml % ccdpm_min + ccdpm_max = my_nml % ccdpm_max + ccrpm_min = my_nml % ccrpm_min + ccrpm_max = my_nml % ccrpm_max + z_burn_max = my_nml % z_burn_max +END IF + +CALL mpl_type_free(mpl_nml_type,icode) + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE read_nml_jules_inferno +#endif + +#if !defined(UM_JULES) +SUBROUTINE read_nml_jules_inferno(nml_dir) + +!----------------------------------------------------------------------------- +! Description: +! Read the JULES_INFERNO namelist (standalone) +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in TECHNICAL +!----------------------------------------------------------------------------- + +USE io_constants, ONLY: namelist_unit + +USE string_utils_mod, ONLY: to_string + +USE logging_mod, ONLY: log_info, log_fatal + +USE errormessagelength_mod, ONLY: errormessagelength + +IMPLICIT NONE + +! Arguments +CHARACTER(LEN=*), INTENT(IN) :: nml_dir ! The directory containing the + ! namelists + +INTEGER :: ERROR ! Error indicator +CHARACTER(LEN=errormessagelength) :: iomessage + +! Open the fire namelist file +OPEN(namelist_unit, FILE=(TRIM(nml_dir) // '/' // 'fire.nml'), & + STATUS='old', POSITION='rewind', ACTION='read', IOSTAT = ERROR, & + IOMSG = iomessage) +IF ( ERROR /= 0 ) & + CALL log_fatal("init_inferno", "Error opening namelist file fire.nml " // & + "(IOSTAT=" // TRIM(to_string(ERROR)) // " IOMSG=" // & + TRIM(iomessage) // ")") + +! There is one namelist to read from this file for jules inferno +CALL log_info("init_inferno", "Reading JULES_INFERNO namelist...") +READ(namelist_unit, NML = jules_inferno, IOSTAT = ERROR, IOMSG = iomessage) +IF ( ERROR /= 0 ) & + CALL log_fatal("init_inferno", & + "Error reading namelist JULES_INFERNO " // & + "(IOSTAT=" // TRIM(to_string(ERROR)) // " IOMSG=" // & + TRIM(iomessage) // ")") + +! Close the namelist file +CLOSE(namelist_unit, IOSTAT = ERROR, IOMSG = iomessage) +IF ( ERROR /= 0 ) & + CALL log_fatal("init_inferno", & + "Error closing namelist file fire.nml " // & + "(IOSTAT=" // TRIM(to_string(ERROR)) // " IOMSG=" // & + TRIM(iomessage) // ")") + +END SUBROUTINE read_nml_jules_inferno +#endif + +END MODULE jules_inferno_mod diff --git a/src/control/shared/jules_soil_biogeochem_mod.F90 b/src/control/shared/jules_soil_biogeochem_mod.F90 index 4b6588f6..23bdc2ce 100644 --- a/src/control/shared/jules_soil_biogeochem_mod.F90 +++ b/src/control/shared/jules_soil_biogeochem_mod.F90 @@ -180,10 +180,6 @@ MODULE jules_soil_biogeochem_mod tau_lit = rmdi ! Parameter controlling the decay of litter inputs with depth (m-1). -REAL(KIND=real_jlslsm) :: & - z_burn_max = rmdi - ! Parameter setting maximum depth of burn - !----------------------------------------------------------------------------- ! Namelist variables used in the CH4 Emission Scheme !----------------------------------------------------------------------------- @@ -256,7 +252,7 @@ MODULE jules_soil_biogeochem_mod t0_ch4, const_ch4_cs, const_ch4_npp, const_ch4_resps, q10_ch4_cs, & q10_ch4_npp, q10_ch4_resps, tau_ch4, ch4_cpow, k2_ch4, kd_ch4, rho_ch4, & q10_mic_ch4, cue_ch4, mu_ch4, alpha_ch4, frz_ch4, ev_ch4, q10_ev_ch4, & - l_label_frac_cs, z_burn_max, l_bgc_heat, heat_of_respiration, & + l_label_frac_cs, l_bgc_heat, heat_of_respiration, & fsthsat_cs_decomp_opt1 CHARACTER(LEN=*), PARAMETER, PRIVATE :: & @@ -280,6 +276,8 @@ SUBROUTINE check_jules_soil_biogeochem() ! imported scalars l_triffid, l_trif_fire, l_nitrogen, l_inferno +USE jules_inferno_mod, ONLY: z_burn_max + USE ereport_mod, ONLY: ereport @@ -523,12 +521,13 @@ SUBROUTINE check_jules_soil_biogeochem() END IF ! check value of z_burn_max with l_layeredc -IF ( l_layeredc ) THEN - IF ( ABS( z_burn_max - rmdi ) > EPSILON(1.0) ) THEN - IF ( z_burn_max <= 0.0 .OR. z_burn_max > 10.0 ) THEN - CALL ereport(RoutineName, errorstatus, & - "z_burn_max must be positive & less than 10 meters") - END IF +IF ( ( l_layeredc .AND. l_trif_fire ) .OR. & + ( l_layeredc .AND. l_inferno ) ) THEN + IF ( ABS( z_burn_max - rmdi ) < EPSILON(1.0) ) THEN + CALL ereport(RoutineName, errorstatus, "z_burn_max not found") + ELSE IF ( z_burn_max <= 0.0 .OR. z_burn_max > 10.0 ) THEN + CALL ereport(RoutineName, errorstatus, & + "z_burn_max must be positive & less than 10 meters") END IF END IF @@ -748,9 +747,6 @@ SUBROUTINE print_nlist_jules_soil_biogeochem() WRITE(lineBuffer, *) ' tau_lit = ', tau_lit CALL jules_print('jules_soil_biogeochem_mod', lineBuffer) -WRITE(lineBuffer, *) ' z_burn_max = ', z_burn_max -CALL jules_print('jules_soil_biogeochem_mod', lineBuffer) - WRITE(lineBuffer, *) ' diff_n_pft = ', diff_n_pft CALL jules_print('jules_soil_biogeochem_mod', lineBuffer) @@ -873,7 +869,7 @@ SUBROUTINE read_nml_jules_soil_biogeochem (unitnumber) ! set number of each type of variable in my_namelist type INTEGER, PARAMETER :: no_of_types = 3 INTEGER, PARAMETER :: n_int = 3 -INTEGER, PARAMETER :: n_real = 30 + 4 +INTEGER, PARAMETER :: n_real = 29 + 4 INTEGER, PARAMETER :: n_log = 8 TYPE :: my_namelist @@ -911,7 +907,6 @@ SUBROUTINE read_nml_jules_soil_biogeochem (unitnumber) REAL(KIND=real_jlslsm) :: ev_ch4 REAL(KIND=real_jlslsm) :: q10_ev_ch4 REAL(KIND=real_jlslsm) :: heat_of_respiration - REAL(KIND=real_jlslsm) :: z_burn_max LOGICAL :: l_layeredC LOGICAL :: l_label_frac_cs LOGICAL :: l_q10 @@ -979,7 +974,6 @@ SUBROUTINE read_nml_jules_soil_biogeochem (unitnumber) my_nml % alpha_ch4 = alpha_ch4 my_nml % ev_ch4 = ev_ch4 my_nml % q10_ev_ch4 = q10_ev_ch4 - my_nml % z_burn_max = z_burn_max my_nml % heat_of_respiration = heat_of_respiration END IF @@ -1027,7 +1021,6 @@ SUBROUTINE read_nml_jules_soil_biogeochem (unitnumber) alpha_ch4 = my_nml % alpha_ch4 ev_ch4 = my_nml % ev_ch4 q10_ev_ch4 = my_nml % q10_ev_ch4 - z_burn_max = my_nml % z_burn_max heat_of_respiration = my_nml % heat_of_respiration END IF diff --git a/src/initialisation/shared/check_compatible_options_mod.F90 b/src/initialisation/shared/check_compatible_options_mod.F90 index ff64bbec..12ef09fe 100644 --- a/src/initialisation/shared/check_compatible_options_mod.F90 +++ b/src/initialisation/shared/check_compatible_options_mod.F90 @@ -33,7 +33,8 @@ SUBROUTINE check_compatible_options(call_type) l_albedo_obs USE jules_rivers_mod, ONLY: i_river_vn, l_rivers, rivers_um_trip, & l_inland_outflow -USE jules_soil_biogeochem_mod, ONLY: l_layeredc, z_burn_max +USE jules_soil_biogeochem_mod, ONLY: l_layeredc +USE jules_inferno_mod, ONLY: z_burn_max USE jules_soil_mod, ONLY: l_tile_soil, l_holdwater USE jules_surface_mod, ONLY: l_flake_model, l_aggregate USE jules_surface_types_mod, ONLY: urban_roof, npft, nnvg, ntype diff --git a/src/initialisation/standalone/init.F90 b/src/initialisation/standalone/init.F90 index f96a37ed..6d2ed2cf 100644 --- a/src/initialisation/standalone/init.F90 +++ b/src/initialisation/standalone/init.F90 @@ -52,6 +52,7 @@ SUBROUTINE init(nml_dir, crop_vars_data, crop_vars, & USE init_output_mod, ONLY: init_output USE init_plant_n_uptake_mod, ONLY: init_plant_n_uptake USE init_vegetation_mod, ONLY: init_vegetation +USE init_inferno_mod, ONLY: init_inferno USE init_hydrology_mod, ONLY: init_hydrology USE init_model_environment_mod, ONLY: init_model_environment USE init_radiation_mod, ONLY: init_radiation @@ -273,6 +274,9 @@ SUBROUTINE init(nml_dir, crop_vars_data, crop_vars, & ! Must be called after init_soil to check soil tiling flags CALL init_vegetation(nml_dir) +! Initialise inferno options +CALL init_inferno(nml_dir) + ! Initialise irrigation options CALL init_irrigation(nml_dir) diff --git a/src/initialisation/standalone/init_inferno_mod.F90 b/src/initialisation/standalone/init_inferno_mod.F90 new file mode 100644 index 00000000..3b2d24d4 --- /dev/null +++ b/src/initialisation/standalone/init_inferno_mod.F90 @@ -0,0 +1,78 @@ +#if !defined(UM_JULES) +! *****************************COPYRIGHT************************************** +! (C) Crown copyright Met Office. All rights reserved. +! For further details please refer to the file COPYRIGHT.txt +! which you should have received as part of this distribution. +! *****************************COPYRIGHT************************************** + +MODULE init_inferno_mod + +IMPLICIT NONE + +CONTAINS + +SUBROUTINE init_inferno(nml_dir) + +USE jules_inferno_mod, ONLY: read_nml_jules_inferno, & + print_nlist_jules_inferno, & + check_jules_inferno + +USE jules_vegetation_mod, ONLY:l_inferno, l_trif_fire, ignition_method, & + ignition_constant, ignition_vary_natural, & + ignition_vary_natural_human + +USE logging_mod, ONLY: log_info + +IMPLICIT NONE + +!----------------------------------------------------------------------------- +! Description: +! Initialises the inferno fire model parameters and properties +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in TECHNICAL +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +CHARACTER(LEN=*), INTENT(IN) :: nml_dir ! The directory containing the + ! namelists + +CALL read_nml_jules_inferno(nml_dir) + +CALL print_nlist_jules_inferno() + +IF ( .NOT. l_inferno .AND. .NOT. l_trif_fire ) RETURN + +CALL check_jules_inferno() + +!----------------------------------------------------------------------------- +! Print some human friendly summary information about the selected options. +!----------------------------------------------------------------------------- +IF ( l_inferno ) THEN + CALL log_info("init_inferno", & + "Interactive fires and emissions (INFERNO) will be diagnosed") + IF (ignition_method == ignition_constant ) THEN + CALL log_info("init_inferno", & + "Constant or ubiquitous ignitions (INFERNO)") + ELSE IF (ignition_method == ignition_vary_natural ) THEN + CALL log_info("init_inferno", & + "Constant human ignitions, varying lightning (INFERNO)") + ELSE IF (ignition_method == ignition_vary_natural_human ) THEN + CALL log_info("init_inferno", & + "Fully prescribed ignitions (INFERNO)") + END IF +END IF + +IF ( l_trif_fire ) THEN + CALL log_info("init_inferno", & + "Fires will interact with the carbon cycle in triffid") +END IF + +RETURN + +END SUBROUTINE init_inferno +END MODULE init_inferno_mod +#endif diff --git a/src/initialisation/standalone/params/init_triffid.inc b/src/initialisation/standalone/params/init_triffid.inc index 4627501c..7864d5cf 100644 --- a/src/initialisation/standalone/params/init_triffid.inc +++ b/src/initialisation/standalone/params/init_triffid.inc @@ -24,7 +24,7 @@ USE jules_vegetation_mod, ONLY: l_triffid, l_phenol, l_trif_crop, l_ag_expand, & USE trif, ONLY: crop, harvest_type, harvest_freq, ag_expand, & g_area, g_grow, g_root, g_wood, lai_max, lai_min, & alloc_fast, alloc_med, alloc_slow, dpm_rpm_ratio, & - retran_r, retran_l, harvest_ht + retran_r, retran_l, harvest_ht, fireveg_c_to_atmos USE trif_io, ONLY: jules_triffid, & crop_io, harvest_type_io, harvest_freq_io, & @@ -32,7 +32,7 @@ USE trif_io, ONLY: jules_triffid, & g_wood_io,lai_max_io,lai_min_io, & alloc_fast_io,alloc_med_io,alloc_slow_io, & dpm_rpm_ratio_io,retran_l_io,retran_r_io, & - harvest_ht_io + harvest_ht_io, fireveg_c_to_atmos_io USE errormessagelength_mod, ONLY: errormessagelength @@ -106,6 +106,7 @@ crop(:) = crop_io(1:npft) harvest_freq(:) = harvest_freq_io(1:npft) harvest_type(:) = harvest_type_io(1:npft) ag_expand(:) = ag_expand_io(1:npft) +fireveg_c_to_atmos(:) = fireveg_c_to_atmos_io(1:npft) g_area(:) = g_area_io(1:npft) g_grow(:) = g_grow_io(1:npft) g_root(:) = g_root_io(1:npft) diff --git a/src/initialisation/um/read_jules_namelists_mod.F90 b/src/initialisation/um/read_jules_namelists_mod.F90 index 5b0f9cc3..0c51cd6a 100644 --- a/src/initialisation/um/read_jules_namelists_mod.F90 +++ b/src/initialisation/um/read_jules_namelists_mod.F90 @@ -194,6 +194,37 @@ END SUBROUTINE read_jules_deposition_species ! ********************************************************************* +SUBROUTINE read_jules_inferno (unitnumber) + +! Description: +! Read the JULES_INFERNO namelist + +USE jules_inferno_mod, ONLY: & + print_nlist_jules_inferno, & + check_jules_inferno, read_nml_jules_inferno + +IMPLICIT NONE + +! Subroutine arguments +INTEGER, INTENT(IN) :: unitnumber + +REAL(KIND=jprb) :: zhook_handle +CHARACTER(LEN=*), PARAMETER :: RoutineName='READ_JULES_INFERNO' + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +CALL read_nml_jules_inferno(unitnumber) +IF (PrintStatus >= PrStatus_Oper .AND. mype == 0) THEN + CALL print_nlist_jules_inferno() +END IF +CALL check_jules_inferno() + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE read_jules_inferno + +! ********************************************************************* + SUBROUTINE read_jules_nvegparm (unitnumber) ! Description: diff --git a/src/initialisation/um/surf_couple_allocate_mod.F90 b/src/initialisation/um/surf_couple_allocate_mod.F90 index 56174ac5..0497b1ac 100644 --- a/src/initialisation/um/surf_couple_allocate_mod.F90 +++ b/src/initialisation/um/surf_couple_allocate_mod.F90 @@ -64,7 +64,7 @@ SUBROUTINE surf_couple_allocate (land_field, ntiles, sm_levels, & ! namelist variables: crop_io, harvest_freq_io, & harvest_type_io, ag_expand_io, & - g_area_io, g_grow_io, & + g_area_io, g_grow_io, fireveg_c_to_atmos_io, & g_root_io, g_wood_io, lai_max_io, & lai_min_io, alloc_fast_io, alloc_med_io, & alloc_slow_io, dpm_rpm_ratio_io, retran_l_io, & @@ -73,7 +73,7 @@ SUBROUTINE surf_couple_allocate (land_field, ntiles, sm_levels, & USE trif, ONLY: & crop, harvest_freq, & harvest_type, ag_expand, & - g_area, g_grow, & + g_area, g_grow, fireveg_c_to_atmos, & g_root, g_wood, lai_max, & lai_min, alloc_fast, alloc_med, & alloc_slow, dpm_rpm_ratio, retran_l, & @@ -312,6 +312,7 @@ SUBROUTINE surf_couple_allocate (land_field, ntiles, sm_levels, & harvest_freq(:) = harvest_freq_io(1:npft) harvest_type(:) = harvest_type_io(1:npft) ag_expand(:) = ag_expand_io(1:npft) + fireveg_c_to_atmos(:) = fireveg_c_to_atmos_io(1:npft) g_area(:) = g_area_io(1:npft) g_grow(:) = g_grow_io(1:npft) g_root(:) = g_root_io(1:npft) diff --git a/src/initialisation/um/surf_couple_read_namelists_mod.F90 b/src/initialisation/um/surf_couple_read_namelists_mod.F90 index cb2ed184..83813e6d 100644 --- a/src/initialisation/um/surf_couple_read_namelists_mod.F90 +++ b/src/initialisation/um/surf_couple_read_namelists_mod.F90 @@ -37,7 +37,8 @@ SUBROUTINE surf_couple_read_namelists(call_type, shared_unit, atmoscntl_unit) read_jules_soil_biogeochem, read_jules_surface, & read_jules_model_environment, read_jules_water_resources, & read_jules_irrigation, read_jules_red, & - read_jules_deposition, read_jules_deposition_species + read_jules_deposition, read_jules_deposition_species, & + read_jules_inferno USE jules_deposition_mod, ONLY: l_deposition @@ -75,6 +76,7 @@ SUBROUTINE surf_couple_read_namelists(call_type, shared_unit, atmoscntl_unit) CALL read_jules_sea_seaice(shared_unit) CALL read_jules_soil(shared_unit) CALL read_jules_vegetation(shared_unit) +CALL read_jules_inferno(shared_unit) CALL read_jules_irrigation(shared_unit) CALL read_jules_soil_biogeochem(shared_unit) CALL read_jules_snow(shared_unit) diff --git a/src/io/model_interface/populate_var.inc b/src/io/model_interface/populate_var.inc index 5b1ca8af..f4db74f5 100644 --- a/src/io/model_interface/populate_var.inc +++ b/src/io/model_interface/populate_var.inc @@ -1554,7 +1554,7 @@ CASE ( 'deposition_n' ) trif_vars%deposition_n_gb(:) = const_val END IF -CASE ( 'trif_vars%g_burn_pft' ) +CASE ( 'g_burn_pft' ) IF ( PRESENT(cube) ) THEN cube_land = map_to_land(cube) CALL cube_get_data(cube_land, trif_vars%g_burn_pft) diff --git a/src/science/fire/inferno_io_mod.F90 b/src/science/fire/inferno/inferno_io_mod.F90 similarity index 97% rename from src/science/fire/inferno_io_mod.F90 rename to src/science/fire/inferno/inferno_io_mod.F90 index 1fb36dda..7ac99677 100644 --- a/src/science/fire/inferno_io_mod.F90 +++ b/src/science/fire/inferno/inferno_io_mod.F90 @@ -53,6 +53,10 @@ SUBROUTINE inferno_io( & avg_ba, fire_mort ! Average Burned Area per PFT, and fire mortality rate +USE jules_inferno_mod, ONLY: & + flam_rhum_low, flam_rhum_up, & + flam_sm_low, flam_sm_up, flam_fuel_low, & + flam_fuel_up, flam_rain_const, flam_sm_func USE qsat_mod, ONLY: qsat_wat @@ -161,11 +165,9 @@ SUBROUTINE inferno_io( & fef_c3h8_rpm = 0.0 , fef_hcho_rpm = 0.0, & fef_mecho_rpm = 0.0, & fef_nh3_rpm = 0.0 , fef_dms_rpm = 0.0, & - ! HARDCODED Emission factors for RPM in g kg-1 - pmtofuel = 0.7, & + ! HARDCODED Emission factors for DPM and RPM in g kg-1 + pmtofuel = 0.7 ! Plant Material that is available as fuel (on the surface) - fuel_low = 0.02, fuel_high = 0.2 - ! Fuel availability high/low threshold REAL(KIND=real_jlslsm) , PARAMETER :: & rain_tolerance = 1.0e-18 ! kg/m2/s @@ -313,8 +315,8 @@ SUBROUTINE inferno_io( & DO i = 1, npft ! Calculate the fuel density ! We use normalised Leaf Carbon + the available DPM - inferno_fuel(:) = (leaf_inf(:,i) + dpm_fuel - fuel_low) & - /(fuel_high - fuel_low) + inferno_fuel(:) = (leaf_inf(:,i) + dpm_fuel - flam_fuel_low) & + /(flam_fuel_up - flam_fuel_low) WHERE (inferno_fuel < 0.0) inferno_fuel = 0.0 @@ -363,6 +365,8 @@ SUBROUTINE inferno_io( & !Point Intent(IN) inferno_temp(l), inferno_rhum(l), inferno_fuel(l), & inferno_sm(l), inferno_rain(l), & + flam_rhum_low, flam_rhum_up, flam_sm_low, flam_sm_up, & + flam_rain_const, flam_sm_func, & !Point Intent(INOUT) fire_vars%flammability_ft(l,i)) diff --git a/src/science/fire/inferno_mod.F90 b/src/science/fire/inferno/inferno_mod.F90 similarity index 93% rename from src/science/fire/inferno_mod.F90 rename to src/science/fire/inferno/inferno_mod.F90 index 3a7d18ff..f3597b30 100644 --- a/src/science/fire/inferno_mod.F90 +++ b/src/science/fire/inferno/inferno_mod.F90 @@ -165,6 +165,8 @@ END SUBROUTINE calc_ignitions SUBROUTINE calc_flam( & !Point Intent(IN) temp_l, rhum_l, fuel_l, sm_l, rain_l, & + flam_rhum_low, flam_rhum_up, flam_sm_low, flam_sm_up, & + flam_rain_const, flam_sm_func, & !Point Intent(INOUT) flam_l) @@ -195,9 +197,28 @@ SUBROUTINE calc_flam( & sm_l, & ! The INFERNO soil moisture fraction (sthu's 1st level) rain_l, & - ! The precipitation rate (kg.m-2.s-1) - fuel_l + ! The rain rate (kg.m-2.s-1) + fuel_l, & ! The Fuel Density (0-1) + flam_rhum_up, & + ! Upper boundary to the relative humidity + flam_rhum_low, & + ! Lower boundary to the relative humidity + flam_sm_low, & + ! Below this soil moisture, flammability is 1.0 + ! Expressed as a fraction of saturation (between 0 and 1) (flam_sm_func=2) + flam_sm_up, & + ! Exponential decay parameter for relationship between soil moisture + ! and flammability (> 0.0) (flam_sm_func=2) + flam_rain_const + ! decay function for exponential relationship between rain & flammability. + +INTEGER, INTENT(IN) :: & + flam_sm_func + ! The function used to parameterise the + ! relationship between soil moisture and flammability + ! 1 = linear, + ! 2 = exponential REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & flam_l @@ -212,16 +233,12 @@ SUBROUTINE calc_flam( & b = 5.02808, & f = 8.1328e-03, & h=-3.49149, & - Ts = 373.16, & + Ts = 373.16 ! Water saturation temperature - cr=-2.0 * s_in_day, & - ! Precipitation factor (-2(day/mm)*(kg/m2/s)) - rhum_up = 90.0, & - ! Upper boundary to the relative humidity - rhum_low = 10.0 - ! Lower boundary to the relative humidity REAL(KIND=real_jlslsm) :: & + cr, & + ! Precipitation factor (mm/day) Z_l, & ! Component of the Goff-Gratch saturation vapor pressure TsbyT_l, & @@ -243,20 +260,26 @@ SUBROUTINE calc_flam( & + c * (10.0**( d * (1.0 - TsbyT_l)) - 1.0) & + f * (10.0**( h * (TsbyT_l-1.0)) - 1.0) -f_rhum_l = (rhum_up - rhum_l) / (rhum_up - rhum_low) +f_rhum_l = (flam_rhum_up - rhum_l) / (flam_rhum_up - flam_rhum_low) ! Create boundary limits ! First for relative humidity -IF (rhum_l < rhum_low) f_rhum_l = 1.0 - ! Always fires for RH < 10% -IF (rhum_l > rhum_up) f_rhum_l = 0.0 - ! No fires for RH > 90% +IF (rhum_l < flam_rhum_low) f_rhum_l = 1.0 + ! Always fires for RH < flam_rhum_low +IF (rhum_l > flam_rhum_up) f_rhum_l = 0.0 + ! No fires for RH > flam_rhum_up + +IF ( flam_sm_func == 1 ) THEN ! linear + f_sm_l = (1 - sm_l) +ELSE IF ( flam_sm_func == 2 ) THEN ! exponential + f_sm_l = EXP(-flam_sm_up * (sm_l - flam_sm_low) ) + f_sm_l = MAX(MIN(f_sm_l, 1.0), 0.0) +END IF -f_sm_l = (1 - sm_l) - ! The flammability goes down linearly with soil moisture rain_rate = rain_l * s_in_day ! convert rain rate from kg/m2/s to mm/day +cr = -flam_rain_const / s_in_day flam_l = MAX(MIN(10.0**Z_l * f_rhum_l * fuel_l * f_sm_l & * EXP( cr * rain_rate) ,1.0) ,0.0) @@ -395,6 +418,9 @@ SUBROUTINE calc_emitted_carbon_soil( & ! Language: Fortran 90 ! +USE jules_inferno_mod, ONLY: ccdpm_min, ccdpm_max, & + ccrpm_min, ccrpm_max + USE yomhook, ONLY: lhook, dr_hook USE parkind1, ONLY: jprb @@ -418,16 +444,6 @@ SUBROUTINE calc_emitted_carbon_soil( & emitted_carbon_RPM(land_pts) ! The RPM emitted carbon (kg.m-2.s-1) -REAL(KIND=real_jlslsm) , PARAMETER :: & - ccdpm_min = 0.8, & - ccdpm_max = 1.0, & - ! Decomposable Plant Material burns between 80 to 100 % - ccrpm_min = 0.0, & - ccrpm_max = 0.2 - ! Resistant Plant Material burns between 0 to 20 % - ! These values are also set soilcarb and soilcarb_layers to calculate - ! burnt_carbon_RPM using the soil pools - INTEGER :: l ! landpoint loop counter REAL(KIND=jprb) :: zhook_handle @@ -597,7 +613,8 @@ SUBROUTINE calc_soil_carbon_pools(land_pts, soil_pts, soil_index, dim_cs1, & ! these are used as a proxy for litter USE jules_soil_biogeochem_mod, ONLY: soil_bgc_model, soil_model_4pool, & - soil_model_1pool, z_burn_max, l_layeredc + soil_model_1pool, l_layeredc +USE jules_inferno_mod, ONLY: z_burn_max USE jules_soil_mod, ONLY: dzsoil USE ancil_info, ONLY: nsoilt, dim_cslayer diff --git a/src/science/params/trif_io_mod.F90 b/src/science/params/trif_io_mod.F90 index b11744b3..027a7796 100644 --- a/src/science/params/trif_io_mod.F90 +++ b/src/science/params/trif_io_mod.F90 @@ -33,6 +33,7 @@ MODULE trif_io ag_expand_io(npft_max) = imdi REAL(KIND=real_jlslsm) :: & + fireveg_c_to_atmos_io(npft_max) = rmdi, & g_area_io(npft_max) = rmdi, & g_grow_io(npft_max) = rmdi, & g_root_io(npft_max) = rmdi, & @@ -55,7 +56,7 @@ MODULE trif_io g_wood_io,lai_max_io,lai_min_io, & alloc_fast_io,alloc_med_io,alloc_slow_io, & dpm_rpm_ratio_io,retran_l_io,retran_r_io, & - harvest_ht_io + harvest_ht_io, fireveg_c_to_atmos_io CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='TRIF_IO' @@ -70,6 +71,8 @@ SUBROUTINE print_nlist_jules_triffid() WRITE(lineBuffer,*)' crop_io = ',crop_io CALL jules_print('trif_io',lineBuffer) +WRITE(lineBuffer,*)' fireveg_c_to_atmos_io = ',fireveg_c_to_atmos_io +CALL jules_print('trif_io',lineBuffer) WRITE(lineBuffer,*)' g_area_io = ',g_area_io CALL jules_print('trif_io',lineBuffer) WRITE(lineBuffer,*)' g_grow_io = ',g_grow_io @@ -140,7 +143,7 @@ SUBROUTINE read_nml_jules_triffid (unitnumber) ! set number of each type of variable in my_namelist type INTEGER, PARAMETER :: no_of_types = 2 INTEGER, PARAMETER :: n_int = 4 * npft_max -INTEGER, PARAMETER :: n_real = 13 * npft_max +INTEGER, PARAMETER :: n_real = 14 * npft_max TYPE :: my_namelist SEQUENCE @@ -149,6 +152,7 @@ SUBROUTINE read_nml_jules_triffid (unitnumber) INTEGER :: harvest_type_io(npft_max) INTEGER :: ag_expand_io(npft_max) REAL(KIND=real_jlslsm) :: harvest_ht_io(npft_max) + REAL(KIND=real_jlslsm) :: fireveg_c_to_atmos_io(npft_max) REAL(KIND=real_jlslsm) :: g_area_io(npft_max) REAL(KIND=real_jlslsm) :: g_grow_io(npft_max) REAL(KIND=real_jlslsm) :: g_root_io(npft_max) @@ -183,6 +187,7 @@ SUBROUTINE read_nml_jules_triffid (unitnumber) my_nml % harvest_type_io = harvest_type_io my_nml % ag_expand_io = ag_expand_io my_nml % harvest_ht_io = harvest_ht_io + my_nml % fireveg_c_to_atmos_io = fireveg_c_to_atmos_io my_nml % g_area_io = g_area_io my_nml % g_grow_io = g_grow_io my_nml % g_root_io = g_root_io @@ -206,6 +211,7 @@ SUBROUTINE read_nml_jules_triffid (unitnumber) harvest_type_io = my_nml % harvest_type_io ag_expand_io = my_nml % ag_expand_io harvest_ht_io = my_nml % harvest_ht_io + fireveg_c_to_atmos_io = my_nml % fireveg_c_to_atmos_io g_area_io = my_nml % g_area_io g_grow_io = my_nml % g_grow_io g_root_io = my_nml % g_root_io diff --git a/src/science/params/trif_mod.F90 b/src/science/params/trif_mod.F90 index 666b1728..eea78d69 100644 --- a/src/science/params/trif_mod.F90 +++ b/src/science/params/trif_mod.F90 @@ -37,7 +37,11 @@ MODULE trif ! 0 = no (default) , 1 = yes . Used only if l_ag_expand=T REAL(KIND=real_jlslsm), ALLOCATABLE :: & - g_area(:) & + fireveg_c_to_atmos(:) & + ! Fraction of burnt carbon that goes to the atmosphere as CO2 instead + ! of in the soil. Based on mean whole-plant mortality factor from + ! Li et al (2012) table 2. +,g_area(:) & ! Disturbance rate (/360days). ,g_grow(:) & ! Rate of leaf growth (/360days) @@ -104,6 +108,7 @@ SUBROUTINE trif_alloc(npft, & ALLOCATE( harvest_freq(npft)) ALLOCATE( harvest_type(npft)) ALLOCATE( ag_expand(npft)) + ALLOCATE( fireveg_c_to_atmos(npft)) ALLOCATE( g_area(npft)) ALLOCATE( g_grow(npft)) ALLOCATE( g_root(npft)) @@ -121,6 +126,7 @@ SUBROUTINE trif_alloc(npft, & harvest_freq(:) = 0 harvest_type(:) = 0 ag_expand(:) = 0 + fireveg_c_to_atmos(:) = 0.0 g_area(:) = 0.0 g_grow(:) = 0.0 g_root(:) = 0.0 diff --git a/src/science/vegetation/soilcarb_jls.F90 b/src/science/vegetation/soilcarb_jls.F90 index 7d72507a..4946d6c3 100644 --- a/src/science/vegetation/soilcarb_jls.F90 +++ b/src/science/vegetation/soilcarb_jls.F90 @@ -45,7 +45,9 @@ SUBROUTINE soilcarb (land_pts, trif_pts, trif_index, & USE jules_soil_mod, ONLY: cs_min, sm_levels USE ancil_info, ONLY: dim_cslayer, nsoilt, dim_cs1 -USE jules_vegetation_mod, ONLY: l_trif_fire !usage inside ifdef +USE jules_vegetation_mod, ONLY: l_trif_fire +USE jules_inferno_mod, ONLY: ccdpm_min, ccdpm_max, & + ccrpm_min, ccrpm_max USE dpm_rpm_mod, ONLY: dpm_rpm USE decay_mod, ONLY: decay @@ -137,15 +139,6 @@ SUBROUTINE soilcarb (land_pts, trif_pts, trif_index, & !----------------------------------------------------------------------------- REAL(KIND=real_jlslsm), PARAMETER :: lit_cn = 300.0 REAL(KIND=real_jlslsm), PARAMETER :: nminl_gas = 0.01 -REAL(KIND=real_jlslsm), PARAMETER :: & - ccdpm_min = 0.8, & - ccdpm_max = 1.0, & - ! Decomposable Plant Material burns between 80 to 100 % - ccrpm_min = 0.0, & - ccrpm_max = 0.2 - ! Resistant Plant Material burns between 0 to 20 % - ! These values are also set in inferno_mod to calculate emitted_carbon_DPM - ! and emitted_carbon_RPM, and are also set in soilcarb_layers !----------------------------------------------------------------------------- ! Local variables. diff --git a/src/science/vegetation/soilcarb_layers_jls_mod.F90 b/src/science/vegetation/soilcarb_layers_jls_mod.F90 index 1bd9b62a..5d057ced 100644 --- a/src/science/vegetation/soilcarb_layers_jls_mod.F90 +++ b/src/science/vegetation/soilcarb_layers_jls_mod.F90 @@ -37,12 +37,12 @@ SUBROUTINE soilcarb_layers (land_pts, trif_pts, trif_index, forw, r_gamma, & USE jules_surface_types_mod, ONLY: npft -USE jules_soil_biogeochem_mod, ONLY: bio_hum_cn, tau_lit, l_label_frac_cs, & - z_burn_max +USE jules_soil_biogeochem_mod, ONLY: bio_hum_cn, tau_lit, l_label_frac_cs USE soilcarb_tracer_age_mod, ONLY: soilcarb_tracer_age USE jules_vegetation_mod, ONLY: l_nitrogen - +USE jules_inferno_mod, ONLY: ccdpm_min, ccdpm_max, & + ccrpm_min, ccrpm_max, z_burn_max USE jules_soil_mod, ONLY: cs_min, dzsoil, sm_levels USE veg_param, ONLY: litc_norm USE pftparm, ONLY: rootd_ft @@ -152,16 +152,6 @@ SUBROUTINE soilcarb_layers (land_pts, trif_pts, trif_index, forw, r_gamma, & REAL(KIND=real_jlslsm), PARAMETER :: nminl_gas = 0.01 ! Fraction of net mineralisation of N that is lost as gas. -REAL(KIND=real_jlslsm), PARAMETER :: & - ccdpm_min = 0.8, & - ccdpm_max = 1.0, & - ! Decomposable Plant Material burns between 80 to 100 % - ccrpm_min = 0.0, & - ccrpm_max = 0.2 - ! Resistant Plant Material burns between 0 to 20 % - ! These values are also set in inferno_mod to calculate emitted_carbon_DPM - ! and emitted_carbon_RPM, and are also set in soilcarb - !----------------------------------------------------------------------------- ! Local variables. !----------------------------------------------------------------------------- diff --git a/src/science/vegetation/triffid_jls.F90 b/src/science/vegetation/triffid_jls.F90 index 5fcf3a61..2bb4bda6 100644 --- a/src/science/vegetation/triffid_jls.F90 +++ b/src/science/vegetation/triffid_jls.F90 @@ -130,7 +130,8 @@ SUBROUTINE triffid (land_pts, trif_pts, trif_index, forw, r_gamma, & USE pftparm, ONLY: a_wl, a_ws, b_wl, eta_sl, lma, sigl -USE trif, ONLY: crop, harvest_freq, harvest_ht, harvest_type, lai_min +USE trif, ONLY: crop, harvest_freq, harvest_ht, harvest_type, lai_min, & + fireveg_c_to_atmos USE jules_soil_biogeochem_mod, ONLY: & ! imported scalar parameters @@ -404,10 +405,6 @@ SUBROUTINE triffid (land_pts, trif_pts, trif_index, forw, r_gamma, & ! Fraction of litter diverted as harvest. ! This fraction ends up in the product pools instead of in the soil. -REAL(KIND=real_jlslsm), PARAMETER :: fire_ratio = 0.13 - ! Fraction of burnt carbon that goes to the atmosphere as CO2 instead - ! of in the soil. Based on mean whole-plant mortality factor from - ! Li et al (2012) table 2. !----------------------------------------------------------------------------- ! Local scalar variables. @@ -1169,7 +1166,7 @@ SUBROUTINE triffid (land_pts, trif_pts, trif_index, forw, r_gamma, & lit_n_fire_pft(l,n) = 0.0 END IF - veg_c_fire_emission_pft(l,n) = lit_c_fire_pft(l,n) * fire_ratio + veg_c_fire_emission_pft(l,n) = lit_c_fire_pft(l,n) * fireveg_c_to_atmos(n) veg_c_fire_emission_gb(l) = veg_c_fire_emission_gb(l) + & veg_c_fire_emission_pft(l,n)