diff --git a/bld/CLMBuildNamelist.pm b/bld/CLMBuildNamelist.pm
index 4df42d5e74..fd1ce7de7f 100755
--- a/bld/CLMBuildNamelist.pm
+++ b/bld/CLMBuildNamelist.pm
@@ -2235,8 +2235,13 @@ sub setup_logic_crop_inparm {
}
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, "initial_seed_at_planting",
'use_crop'=>$nl->get_value('use_crop') );
+
+ my $crop_residue_removal_frac = $nl->get_value('crop_residue_removal_frac');
+ if ( $crop_residue_removal_frac < 0.0 or $crop_residue_removal_frac > 1.0 ) {
+ $log->fatal_error("crop_residue_removal_frac must be in range [0, 1]");
+ }
} else {
- error_if_set( $nl, "Can NOT be set without crop on", "baset_mapping", "baset_latvary_slope", "baset_latvary_intercept" );
+ error_if_set( $nl, "Can NOT be set without crop on", "baset_mapping", "baset_latvary_slope", "baset_latvary_intercept", "crop_residue_removal_frac" );
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'crop_fsat_equals_zero' );
}
}
diff --git a/bld/namelist_files/namelist_defaults_ctsm.xml b/bld/namelist_files/namelist_defaults_ctsm.xml
index 7891361238..3910f4052d 100644
--- a/bld/namelist_files/namelist_defaults_ctsm.xml
+++ b/bld/namelist_files/namelist_defaults_ctsm.xml
@@ -553,6 +553,8 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
.true.
.true.
+0.d+0
+
constant
varytropicsbylat
diff --git a/bld/namelist_files/namelist_definition_ctsm.xml b/bld/namelist_files/namelist_definition_ctsm.xml
index b672b43125..1ca1bb13b6 100644
--- a/bld/namelist_files/namelist_definition_ctsm.xml
+++ b/bld/namelist_files/namelist_definition_ctsm.xml
@@ -1164,6 +1164,13 @@ Toggle to turn on the prognostic fertilizer for crop model
Toggle to turn on the 1-year grain product pool in the crop model
+
+Fraction of post-harvest crop residues (leaf and stem) to move to
+1-year product pool instead of letting them fall as litter.
+Default: 0.0
+
+
Type of mapping to use for base temperature for prognostic crop model
diff --git a/doc/source/tech_note/Crop_Irrigation/CLM50_Tech_Note_Crop_Irrigation.rst b/doc/source/tech_note/Crop_Irrigation/CLM50_Tech_Note_Crop_Irrigation.rst
index 2addbd2507..200e9606d9 100755
--- a/doc/source/tech_note/Crop_Irrigation/CLM50_Tech_Note_Crop_Irrigation.rst
+++ b/doc/source/tech_note/Crop_Irrigation/CLM50_Tech_Note_Crop_Irrigation.rst
@@ -508,45 +508,47 @@ where :math:`{C}_{leaf}`, :math:`{C}_{stem}`, and :math:`{C}_{froot}` is the car
Harvest
'''''''
-Variables track the flow of grain C and N to food and of all other plant pools, including live stem C and N, to litter, and to biofuel feedstock. A fraction (determined by the :math:`biofuel\_harvfrac`, defined in :numref:`Table Plant functional type (PFT) parameters for harvested fraction of leaf/livestem for bioenergy production`) of leaf/livestem C and N from bioenergy crops is removed at harvest for biofuels (Equations :eq:`25.9`, :eq:`25.10`, :eq:`25.12`, and :eq:`25.13`), with the remaining portions going to the litter pools (Equations :eq:`20.14)`, :eq:`25.11`, and :eq:`25.14`). Putting live stem C and N into the litter and biofuel pools is in contrast to the approach for unmanaged PFTs which puts live stem C and N into dead stem pools first. Biofuel crop leaf C and N pools are routed to the litter and biofuel pools, in contrast to that of unmanaged PFTs and non-biofuel crops, which put leaf C and N into litter pools only. Root C and N pools are routed to the litter pools in the same manner as natural vegetation.
+Variables track the flow of grain C and N to food and of all other plant pools, including live stem C and N, to litter, and to biofuel feedstock. A fraction (determined by the :math:`biofuel\_harvfrac`, defined in :numref:`Table Plant functional type (PFT) parameters for harvested fraction of leaf/livestem for bioenergy production`) of leaf/livestem C and N from bioenergy crops is removed at harvest for biofuels (Equations :eq:`25.9`. :eq:`harv_c_to_removed_residue`, :eq:`25.12`, and :eq:`harv_n_to_removed_residue`), with the remaining portions going to the litter pools (Equations :eq:`20.14)`, :eq:`25.11`, and :eq:`25.14`). Putting live stem C and N into the litter and biofuel pools is in contrast to the approach for unmanaged PFTs which puts live stem C and N into dead stem pools first. Biofuel crop leaf and stem C and N pools are routed to the litter and biofuel pools, in contrast to that of unmanaged PFTs and non-biofuel crops, which under default settings put leaf C and N into litter pools only. All crops can have their leaf and stem pools routed to a "removed residue" pool by setting namelist parameter :math:`crop\_residue\_removal\_frac` to something greater than its default zero. Root C and N pools are routed to the litter pools in the same manner as natural vegetation.
+
+In the equations below, subscript :math:`p` refers to either the leaf or live stem biomass pool.
.. math::
:label: 25.9
- CF_{leaf,biofuel} = \left({CS_{leaf} \mathord{\left/ {\vphantom {CS_{leaf} \Delta t}} \right.} \Delta t}
+ CF_{p,biofuel} = \left({CS_{p} \mathord{\left/ {\vphantom {CS_{p} \Delta t}} \right.} \Delta t}
\right) * biofuel\_harvfrac
.. math::
- :label: 25.10
+ :label: harv_c_to_removed_residue
- CF_{livestem,biofuel} = \left({CS_{livestem} \mathord{\left/ {\vphantom {CS_{leaf} \Delta t}} \right.} \Delta t}
- \right) * biofuel\_harvfrac
+ CF_{p,removed\_residue} = \left({CS_{p} \mathord{\left/ {\vphantom {CS_{p} \Delta t}} \right.} \Delta t}
+ \right) * (1 - biofuel\_harvfrac) * crop\_residue\_removal\_frac
.. math::
:label: 25.11
- CF_{livestem,litter} = \left({CS_{livestem} \mathord{\left/ {\vphantom {CS_{livestem} \Delta t}} \right.} \Delta t}
- \right) * \left( 1-biofuel\_harvfrac \right) +CF_{alloc,livestem}
+ CF_{p,litter} = \left({CS_{p} \mathord{\left/ {\vphantom {CS_{p} \Delta t}} \right.} \Delta t}
+ \right) * \left( 1-biofuel\_harvfrac \right) * \left( 1-crop\_residue\_removal\_frac \right) +CF_{p,alloc}
with corresponding nitrogen fluxes:
.. math::
:label: 25.12
- NF_{leaf,biofuel} = \left({NS_{leaf} \mathord{\left/ {\vphantom {NS_{leaf} \Delta t}} \right.} \Delta t}
+ NF_{p,biofuel} = \left({NS_{p} \mathord{\left/ {\vphantom {NS_{p} \Delta t}} \right.} \Delta t}
\right) * biofuel\_harvfrac
.. math::
- :label: 25.13
+ :label: harv_n_to_removed_residue
- NF_{livestem,biofuel} = \left({NS_{livestem} \mathord{\left/ {\vphantom {NS_{livestem} \Delta t}} \right.} \Delta t}
- \right) * biofuel\_harvfrac
+ NF_{p,removed\_residue} = \left({NS_{p} \mathord{\left/ {\vphantom {NS_{p} \Delta t}} \right.} \Delta t}
+ \right) * \left( 1 - biofuel\_harvfrac \right) * crop\_residue\_removal\_frac
.. math::
:label: 25.14
- NF_{livestem,litter} = \left({NS_{livestem} \mathord{\left/ {\vphantom {NS_{livestem} \Delta t}} \right.} \Delta t}
- \right) * \left( 1-biofuel\_harvfrac \right)
+ NF_{p,litter} = \left({NS_{p} \mathord{\left/ {\vphantom {NS_{p} \Delta t}} \right.} \Delta t}
+ \right) * \left( 1-biofuel\_harvfrac \right) * \left( 1-crop\_residue\_removal\_frac \right)
where CF is the carbon flux, CS is stored carbon, NF is the nitrogen flux, NS is stored nitrogen, and :math:`biofuel\_harvfrac` is the harvested fraction of leaf/livestem for biofuel feedstocks.
@@ -606,7 +608,7 @@ where CF is the carbon flux, CS is stored carbon, NF is the nitrogen flux, NS is
| Switchgrass | 0.70 |
+----------------------------------+----------------------------+
-Whereas food C and N was formerly transferred to the litter pool, CLM5 routes food C and N to a grain product pool where the C and N decay to the atmosphere over one year, similar in structure to the wood product pools. The biofuel C and N is also routed to the grain product pool and decays to the atmosphere over one year. Additionally, CLM5 accounts for the C and N required for crop seeding by removing the seed C and N from the grain product pool during harvest. The crop seed pool is then used to seed crops in the subsequent year.
+Whereas food C and N was formerly transferred to the litter pool, CLM5 routes food C and N to a grain product pool where the C and N decay to the atmosphere over one year, similar in structure to the wood product pools. Biofuel and removed-residue C and N is also routed to the grain product pool and decays to the atmosphere over one year. Additionally, CLM5 accounts for the C and N required for crop seeding by removing the seed C and N from the grain product pool during harvest. The crop seed pool is then used to seed crops in the subsequent year.
Annual food crop yields (g dry matter m\ :sup:`-2`) can be calculated by saving the GRAINC_TO_FOOD_ANN variable once per year, then postprocessing with Equation :eq:`25.15`. This calculation assumes that grain C is 45% of the total dry weight. Additionally, harvest is not typically 100% efficient, so analysis needs to assume that harvest efficiency is less---we use 85%.
diff --git a/src/biogeochem/CNCIsoFluxMod.F90 b/src/biogeochem/CNCIsoFluxMod.F90
index 608966d213..fbe4cd927f 100644
--- a/src/biogeochem/CNCIsoFluxMod.F90
+++ b/src/biogeochem/CNCIsoFluxMod.F90
@@ -427,6 +427,16 @@ subroutine CIsoFlux1(num_soilc, filter_soilc, num_soilp, filter_soilp, &
iso_cnveg_cs%livestemc_patch , cnveg_cs%livestemc_patch, &
num_soilp , filter_soilp, 1._r8, 0, isotope)
+ call CIsoFluxCalc(&
+ iso_cnveg_cf%leafc_to_removedresiduec_patch , cnveg_cf%leafc_to_removedresiduec_patch, &
+ iso_cnveg_cs%leafc_patch , cnveg_cs%leafc_patch, &
+ num_soilp , filter_soilp, 1._r8, 0, isotope)
+
+ call CIsoFluxCalc(&
+ iso_cnveg_cf%livestemc_to_removedresiduec_patch, cnveg_cf%livestemc_to_removedresiduec_patch, &
+ iso_cnveg_cs%livestemc_patch , cnveg_cs%livestemc_patch, &
+ num_soilp , filter_soilp, 1._r8, 0, isotope)
+
call CIsoFluxCalc(&
iso_cnveg_cf%repr_grainc_to_seed_patch , cnveg_cf%repr_grainc_to_seed_patch, &
iso_cnveg_cs%reproductivec_patch , cnveg_cs%reproductivec_patch, &
@@ -496,7 +506,9 @@ subroutine CIsoFlux1(num_soilc, filter_soilc, num_soilp, filter_soilp, &
p = filter_soilp(fp)
iso_cnveg_cf%crop_harvestc_to_cropprodc_patch(p) = &
iso_cnveg_cf%leafc_to_biofuelc_patch(p) + &
- iso_cnveg_cf%livestemc_to_biofuelc_patch(p)
+ iso_cnveg_cf%livestemc_to_biofuelc_patch(p) + &
+ iso_cnveg_cf%leafc_to_removedresiduec_patch(p) + &
+ iso_cnveg_cf%livestemc_to_removedresiduec_patch(p)
end do
if (use_grainproduct) then
diff --git a/src/biogeochem/CNCStateUpdate1Mod.F90 b/src/biogeochem/CNCStateUpdate1Mod.F90
index 41051d0c39..5e38de2676 100644
--- a/src/biogeochem/CNCStateUpdate1Mod.F90
+++ b/src/biogeochem/CNCStateUpdate1Mod.F90
@@ -320,8 +320,10 @@ subroutine CStateUpdate1( num_soilc, filter_soilc, num_soilp, filter_soilp, &
end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
cs_veg%livestemc_patch(p) = cs_veg%livestemc_patch(p) - cf_veg%livestemc_to_litter_patch(p)*dt
- cs_veg%livestemc_patch(p) = cs_veg%livestemc_patch(p) - cf_veg%livestemc_to_biofuelc_patch(p)*dt
- cs_veg%leafc_patch(p) = cs_veg%leafc_patch(p) - cf_veg%leafc_to_biofuelc_patch(p)*dt
+ cs_veg%livestemc_patch(p) = cs_veg%livestemc_patch(p) - &
+ (cf_veg%livestemc_to_biofuelc_patch(p) + cf_veg%livestemc_to_removedresiduec_patch(p))*dt
+ cs_veg%leafc_patch(p) = cs_veg%leafc_patch(p) - &
+ (cf_veg%leafc_to_biofuelc_patch(p) + cf_veg%leafc_to_removedresiduec_patch(p))*dt
cs_veg%cropseedc_deficit_patch(p) = cs_veg%cropseedc_deficit_patch(p) &
- cf_veg%crop_seedc_to_leaf_patch(p) * dt
do k = repr_grain_min, repr_grain_max
diff --git a/src/biogeochem/CNNStateUpdate1Mod.F90 b/src/biogeochem/CNNStateUpdate1Mod.F90
index 5358c46de1..833a65cbc3 100644
--- a/src/biogeochem/CNNStateUpdate1Mod.F90
+++ b/src/biogeochem/CNNStateUpdate1Mod.F90
@@ -280,8 +280,10 @@ subroutine NStateUpdate1(num_soilc, filter_soilc, num_soilp, filter_soilp, &
ns_veg%frootn_patch(p) = ns_veg%frootn_patch(p) - nf_veg%frootn_to_retransn_patch(p)*dt
ns_veg%retransn_patch(p) = ns_veg%retransn_patch(p) + nf_veg%frootn_to_retransn_patch(p)*dt
ns_veg%livestemn_patch(p) = ns_veg%livestemn_patch(p) - nf_veg%livestemn_to_litter_patch(p)*dt
- ns_veg%livestemn_patch(p) = ns_veg%livestemn_patch(p) - nf_veg%livestemn_to_biofueln_patch(p)*dt
- ns_veg%leafn_patch(p) = ns_veg%leafn_patch(p) - nf_veg%leafn_to_biofueln_patch(p)*dt
+ ns_veg%livestemn_patch(p) = ns_veg%livestemn_patch(p) - &
+ (nf_veg%livestemn_to_biofueln_patch(p) + nf_veg%livestemn_to_removedresiduen_patch(p))*dt
+ ns_veg%leafn_patch(p) = ns_veg%leafn_patch(p) - &
+ (nf_veg%leafn_to_biofueln_patch(p) + nf_veg%leafn_to_removedresiduen_patch(p))*dt
ns_veg%livestemn_patch(p) = ns_veg%livestemn_patch(p) - nf_veg%livestemn_to_retransn_patch(p)*dt
ns_veg%retransn_patch(p) = ns_veg%retransn_patch(p) + nf_veg%livestemn_to_retransn_patch(p)*dt
!
diff --git a/src/biogeochem/CNPhenologyMod.F90 b/src/biogeochem/CNPhenologyMod.F90
index 5533c5f869..38a6e84c8c 100644
--- a/src/biogeochem/CNPhenologyMod.F90
+++ b/src/biogeochem/CNPhenologyMod.F90
@@ -3013,7 +3013,7 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, &
use pftconMod , only : nmiscanthus, nirrig_miscanthus, nswitchgrass, nirrig_switchgrass
use CNSharedParamsMod, only : use_fun
- use clm_varctl , only : CNratio_floating
+ use clm_varctl , only : CNratio_floating, crop_residue_removal_frac
!
! !ARGUMENTS:
integer , intent(in) :: num_soilp ! number of soil patches in filter
@@ -3041,6 +3041,7 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, &
real(r8) :: repr_grainn_to_food_thispool ! amount added to / subtracted from repr_grainn_to_food for the pool in question (gN/m2/s)
real(r8) :: leafc_remaining, livestemc_remaining
real(r8) :: leafn_remaining, livestemn_remaining
+ real(r8) :: removedresidue_fraction
!-----------------------------------------------------------------------
associate( &
@@ -3087,6 +3088,8 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, &
repr_structurec_to_litter => cnveg_carbonflux_inst%repr_structurec_to_litter_patch, & ! Output: [real(r8) (:,:) ] reproductive structure C to litter (gC/m2/s)
leafc_to_biofuelc => cnveg_carbonflux_inst%leafc_to_biofuelc_patch , & ! Output: [real(r8) (:) ] leaf C to biofuel C (gC/m2/s)
livestemc_to_biofuelc => cnveg_carbonflux_inst%livestemc_to_biofuelc_patch , & ! Output: [real(r8) (:) ] livestem C to biofuel C (gC/m2/s)
+ leafc_to_removedresiduec => cnveg_carbonflux_inst%leafc_to_removedresiduec_patch , & ! Output: [real(r8) (:) ] leaf C to removed residue C (gC/m2/s)
+ livestemc_to_removedresiduec => cnveg_carbonflux_inst%livestemc_to_removedresiduec_patch , & ! Output: [real(r8) (:) ] livestem C to removed residue C (gC/m2/s)
leafn => cnveg_nitrogenstate_inst%leafn_patch , & ! Input: [real(r8) (:) ] (gN/m2) leaf N
frootn => cnveg_nitrogenstate_inst%frootn_patch , & ! Input: [real(r8) (:) ] (gN/m2) fine root N
@@ -3101,6 +3104,8 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, &
repr_structuren_to_litter => cnveg_nitrogenflux_inst%repr_structuren_to_litter_patch, & ! Output: [real(r8) (:,:) ] reproductive structure N to litter (gN/m2/s)
leafn_to_biofueln => cnveg_nitrogenflux_inst%leafn_to_biofueln_patch , & ! Output: [real(r8) (:) ] leaf N to biofuel N (gN/m2/s)
livestemn_to_biofueln => cnveg_nitrogenflux_inst%livestemn_to_biofueln_patch, & ! Output: [real(r8) (:) ] livestem N to biofuel N (gN/m2/s)
+ leafn_to_removedresiduen => cnveg_nitrogenflux_inst%leafn_to_removedresiduen_patch , & ! Output: [real(r8) (:) ] leaf N to removed residue N (gN/m2/s)
+ livestemn_to_removedresiduen => cnveg_nitrogenflux_inst%livestemn_to_removedresiduen_patch, & ! Output: [real(r8) (:) ] livestem N to removed residue N (gN/m2/s)
leafn_to_litter => cnveg_nitrogenflux_inst%leafn_to_litter_patch , & ! Output: [real(r8) (:) ] leaf N litterfall (gN/m2/s)
leafn_to_retransn => cnveg_nitrogenflux_inst%leafn_to_retransn_patch , & ! Input: [real(r8) (:) ] leaf N to retranslocated N pool (gN/m2/s)
free_retransn_to_npool=> cnveg_nitrogenflux_inst%free_retransn_to_npool_patch , & ! Input: [real(r8) (:) ] free leaf N to retranslocated N pool (gN/m2/s)
@@ -3113,7 +3118,7 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, &
! The litterfall transfer rate starts at 0.0 and increases linearly
! over time, with displayed growth going to 0.0 on the last day of litterfall
-
+
do fp = 1,num_soilp
p = filter_soilp(fp)
@@ -3215,6 +3220,16 @@ subroutine CNOffsetLitterfall (num_soilp, filter_soilp, &
livestemc_remaining = livestemc(p)*(1._r8-biofuel_harvfrac(ivt(p)))
livestemn_remaining = livestemn(p)*(1._r8-biofuel_harvfrac(ivt(p)))
+ ! Remove residues
+ leafc_to_removedresiduec(p) = t1 * leafc_remaining * crop_residue_removal_frac
+ leafn_to_removedresiduen(p) = t1 * leafn_remaining * crop_residue_removal_frac
+ livestemc_to_removedresiduec(p) = t1 * livestemc_remaining * crop_residue_removal_frac
+ livestemn_to_removedresiduen(p) = t1 * livestemn_remaining * crop_residue_removal_frac
+ leafc_remaining = leafc_remaining * (1._r8 - crop_residue_removal_frac)
+ leafn_remaining = leafn_remaining * (1._r8 - crop_residue_removal_frac)
+ livestemc_remaining = livestemc_remaining * (1._r8 - crop_residue_removal_frac)
+ livestemn_remaining = livestemn_remaining * (1._r8 - crop_residue_removal_frac)
+
leafc_to_litter(p) = t1 * leafc_remaining + cpool_to_leafc(p)
livestemc_to_litter(p) = t1 * livestemc_remaining + cpool_to_livestemc(p)
livestemn_to_litter(p) = t1 * livestemn_remaining
@@ -3701,10 +3716,14 @@ subroutine CNCropHarvestToProductPools(bounds, num_soilp, filter_soilp, num_soil
p = filter_soilp(fp)
cnveg_carbonflux_inst%crop_harvestc_to_cropprodc_patch(p) = &
cnveg_carbonflux_inst%leafc_to_biofuelc_patch(p) + &
- cnveg_carbonflux_inst%livestemc_to_biofuelc_patch(p)
+ cnveg_carbonflux_inst%livestemc_to_biofuelc_patch(p) + &
+ cnveg_carbonflux_inst%leafc_to_removedresiduec_patch(p) + &
+ cnveg_carbonflux_inst%livestemc_to_removedresiduec_patch(p)
cnveg_nitrogenflux_inst%crop_harvestn_to_cropprodn_patch(p) = &
cnveg_nitrogenflux_inst%leafn_to_biofueln_patch(p) + &
- cnveg_nitrogenflux_inst%livestemn_to_biofueln_patch(p)
+ cnveg_nitrogenflux_inst%livestemn_to_biofueln_patch(p) + &
+ cnveg_nitrogenflux_inst%leafn_to_removedresiduen_patch(p) + &
+ cnveg_nitrogenflux_inst%livestemn_to_removedresiduen_patch(p)
end do
if (use_grainproduct) then
diff --git a/src/biogeochem/CNVegCarbonFluxType.F90 b/src/biogeochem/CNVegCarbonFluxType.F90
index 298e7b3053..8210bafc97 100644
--- a/src/biogeochem/CNVegCarbonFluxType.F90
+++ b/src/biogeochem/CNVegCarbonFluxType.F90
@@ -147,6 +147,8 @@ module CNVegCarbonFluxType
real(r8), pointer :: leafc_to_biofuelc_patch (:) ! leaf C to biofuel C (gC/m2/s)
real(r8), pointer :: livestemc_to_biofuelc_patch (:) ! livestem C to biofuel C (gC/m2/s)
+ real(r8), pointer :: leafc_to_removedresiduec_patch (:) ! leaf C to removed residues C (gC/m2/s)
+ real(r8), pointer :: livestemc_to_removedresiduec_patch (:) ! livestem C to removed residues C (gC/m2/s)
real(r8), pointer :: repr_grainc_to_seed_patch (:,:) ! grain C to seed for prognostic crop(gC/m2/s) [patch, repr_grain_min:repr_grain_max]
real(r8), pointer :: repr_grainc_to_seed_perharv_patch (:,:,:) ! grain C to seed for prognostic crop accumulated by harvest (gC/m2) [patch, harvest, repr_grain_min:repr_grain_max]. Not per-second because this variable represents an accumulation over each growing season, to be instantaneously at the end of each calendar year, to provide output that's easier to work with.
real(r8), pointer :: repr_grainc_to_seed_thisyr_patch (:,:) ! grain C to seed for prognostic crop accumulated this calendar year (gC/m2) [patch, repr_grain_min:repr_grain_max]. Not per-second because this variable represents an accumulation over an entire calendar year, to be saved instantaneously at the end of each calendar year, to provide output that's easier to work with.
@@ -673,6 +675,8 @@ subroutine InitAllocate(this, bounds, carbon_type, alloc_full_veg)
this%repr_structurec_to_litter_patch(:,:) = nan
allocate(this%leafc_to_biofuelc_patch (begp:endp)) ; this%leafc_to_biofuelc_patch (:) = nan
allocate(this%livestemc_to_biofuelc_patch (begp:endp)) ; this%livestemc_to_biofuelc_patch (:) = nan
+ allocate(this%leafc_to_removedresiduec_patch (begp:endp)) ; this%leafc_to_removedresiduec_patch (:) = nan
+ allocate(this%livestemc_to_removedresiduec_patch (begp:endp)) ; this%livestemc_to_removedresiduec_patch (:) = nan
allocate(this%repr_grainc_to_seed_patch(begp:endp, repr_grain_min:repr_grain_max)) ; this%repr_grainc_to_seed_patch (:,:) = nan
allocate(this%repr_grainc_to_seed_perharv_patch(begp:endp, 1:mxharvests, repr_grain_min:repr_grain_max)) ; this%repr_grainc_to_seed_perharv_patch (:,:,:) = nan
allocate(this%repr_grainc_to_seed_thisyr_patch(begp:endp, repr_grain_min:repr_grain_max)) ; this%repr_grainc_to_seed_thisyr_patch (:,:) = nan
@@ -980,6 +984,18 @@ subroutine InitHistory(this, bounds, carbon_type)
avgflag='A', long_name='livestem C to biofuel C', &
ptr_patch=this%livestemc_to_biofuelc_patch)
+ this%leafc_to_removedresiduec_patch(begp:endp) = spval
+ call hist_addfld1d (fname='LEAFC_TO_REMOVEDRESIDUEC', units='gC/m^2/s', &
+ avgflag='A', long_name='leaf C to removed residue C', &
+ ptr_patch=this%leafc_to_removedresiduec_patch, &
+ default='inactive')
+
+ this%livestemc_to_removedresiduec_patch(begp:endp) = spval
+ call hist_addfld1d (fname='LIVESTEMC_TO_REMOVEDRESIDUEC', units='gC/m^2/s', &
+ avgflag='A', long_name='livestem C to removed residue C', &
+ ptr_patch=this%livestemc_to_removedresiduec_patch, &
+ default='inactive')
+
this%repr_grainc_to_seed_patch(begp:endp,:) = spval
this%repr_grainc_to_seed_perharv_patch(begp:endp,:,:) = spval
this%repr_grainc_to_seed_thisyr_patch(begp:endp,:) = spval
@@ -4201,6 +4217,8 @@ subroutine SetValues ( this, nvegcpool, &
this%livestemc_to_litter_patch(i) = value_patch
this%leafc_to_biofuelc_patch(i) = value_patch
this%livestemc_to_biofuelc_patch(i) = value_patch
+ this%leafc_to_removedresiduec_patch(i) = value_patch
+ this%livestemc_to_removedresiduec_patch(i) = value_patch
end do
do k = 1, nrepr
diff --git a/src/biogeochem/CNVegNitrogenFluxType.F90 b/src/biogeochem/CNVegNitrogenFluxType.F90
index cdfab748f3..3806de9838 100644
--- a/src/biogeochem/CNVegNitrogenFluxType.F90
+++ b/src/biogeochem/CNVegNitrogenFluxType.F90
@@ -139,6 +139,8 @@ module CNVegNitrogenFluxType
real(r8), pointer :: repr_structuren_to_litter_patch (:,:) ! patch reproductive structure N to litter for prognostic crop (gN/m2/s) [patch, repr_structure_min:repr_structure_max]
real(r8), pointer :: leafn_to_biofueln_patch (:) ! patch leaf N to biofuel N (gN/m2/s)
real(r8), pointer :: livestemn_to_biofueln_patch (:) ! patch livestem N to biofuel N (gN/m2/s)
+ real(r8), pointer :: leafn_to_removedresiduen_patch (:) ! patch leaf N to removed residue N (gN/m2/s)
+ real(r8), pointer :: livestemn_to_removedresiduen_patch (:) ! patch livestem N to removed residue N (gN/m2/s)
real(r8), pointer :: repr_grainn_to_seed_patch (:,:) ! patch grain N to seed for prognostic crop (gN/m2/s) [patch, repr_grain_min:repr_grain_max]
real(r8), pointer :: repr_grainn_to_seed_perharv_patch (:,:,:) ! grain N to seed for prognostic crop accumulated by harvest (gN/m2) [patch, harvest, repr_grain_min:repr_grain_max]. Not per-second because this variable represents an accumulation over each growing season, to be instantaneously at the end of each calendar year, to provide output that's easier to work with.
real(r8), pointer :: repr_grainn_to_seed_thisyr_patch (:,:) ! grain N to seed for prognostic crop accumulated this calendar year (gN/m2) [patch, repr_grain_min:repr_grain_max]. Not per-second because this variable represents an accumulation over an entire calendar year, to be saved instantaneously at the end of each calendar year, to provide output that's easier to work with.
@@ -488,6 +490,8 @@ subroutine InitAllocate(this, bounds, alloc_full_veg)
this%repr_structuren_to_litter_patch(:,:) = nan
allocate(this%leafn_to_biofueln_patch (begp:endp)) ; this%leafn_to_biofueln_patch (:) = nan
allocate(this%livestemn_to_biofueln_patch (begp:endp)) ; this%livestemn_to_biofueln_patch (:) = nan
+ allocate(this%leafn_to_removedresiduen_patch (begp:endp)) ; this%leafn_to_removedresiduen_patch (:) = nan
+ allocate(this%livestemn_to_removedresiduen_patch (begp:endp)) ; this%livestemn_to_removedresiduen_patch (:) = nan
allocate(this%repr_grainn_to_seed_patch(begp:endp, repr_grain_min:repr_grain_max)) ; this%repr_grainn_to_seed_patch (:,:) = nan
allocate(this%repr_grainn_to_seed_perharv_patch(begp:endp, 1:mxharvests, repr_grain_min:repr_grain_max)) ; this%repr_grainn_to_seed_perharv_patch (:,:,:) = nan
allocate(this%repr_grainn_to_seed_thisyr_patch(begp:endp, repr_grain_min:repr_grain_max)) ; this%repr_grainn_to_seed_thisyr_patch (:,:) = nan
@@ -1964,6 +1968,8 @@ subroutine SetValues ( this, nvegnpool, &
this%livestemn_to_litter_patch(i) = value_patch
this%leafn_to_biofueln_patch(i) = value_patch
this%livestemn_to_biofueln_patch(i) = value_patch
+ this%leafn_to_removedresiduen_patch(i) = value_patch
+ this%livestemn_to_removedresiduen_patch(i) = value_patch
this%soyfixn_patch(i) = value_patch
this%frootn_to_retransn_patch(i) = value_patch
end do
diff --git a/src/main/clm_varctl.F90 b/src/main/clm_varctl.F90
index e0d142bffd..615f3b2606 100644
--- a/src/main/clm_varctl.F90
+++ b/src/main/clm_varctl.F90
@@ -157,6 +157,9 @@ module clm_varctl
! set saturated excess runoff to zero for crops
logical, public :: crop_fsat_equals_zero = .false.
+
+ ! remove this fraction of crop residues to a 1-year product pool (instead of going to litter)
+ real(r8), public :: crop_residue_removal_frac = 0.0
!----------------------------------------------------------
! Other subgrid logic
diff --git a/src/main/controlMod.F90 b/src/main/controlMod.F90
index 44efec4eeb..0355307a3a 100644
--- a/src/main/controlMod.F90
+++ b/src/main/controlMod.F90
@@ -288,7 +288,7 @@ subroutine control_init(dtime)
use_lch4, use_nitrif_denitrif, use_extralakelayers, &
use_vichydro, use_cn, use_cndv, use_crop, use_fertilizer, &
use_grainproduct, use_snicar_frc, use_vancouver, use_mexicocity, use_noio, &
- use_nguardrail
+ use_nguardrail, crop_residue_removal_frac
! SNICAR
namelist /clm_inparm/ &
@@ -697,6 +697,7 @@ subroutine control_spmd()
call mpi_bcast (use_crop, 1, MPI_LOGICAL, 0, mpicom, ier)
call mpi_bcast (use_fertilizer, 1, MPI_LOGICAL, 0, mpicom, ier)
call mpi_bcast (use_grainproduct, 1, MPI_LOGICAL, 0, mpicom, ier)
+ call mpi_bcast (crop_residue_removal_frac, 1, MPI_REAL8, 0, mpicom, ier)
call mpi_bcast (o3_veg_stress_method, len(o3_veg_stress_method), MPI_CHARACTER, 0, mpicom, ier)
call mpi_bcast (use_snicar_frc, 1, MPI_LOGICAL, 0, mpicom, ier)
call mpi_bcast (use_vancouver, 1, MPI_LOGICAL, 0, mpicom, ier)
@@ -961,6 +962,7 @@ subroutine control_print ()
write(iulog,*) ' use_crop = ', use_crop
write(iulog,*) ' use_fertilizer = ', use_fertilizer
write(iulog,*) ' use_grainproduct = ', use_grainproduct
+ write(iulog,*) ' crop_residue_removal_frac = ', crop_residue_removal_frac
write(iulog,*) ' o3_veg_stress_method = ', o3_veg_stress_method
write(iulog,*) ' use_snicar_frc = ', use_snicar_frc
write(iulog,*) ' snicar_use_aerosol = ',snicar_use_aerosol