Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add crop residue removal #2297

Merged
merged 20 commits into from
Jan 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
2183e0a
Placeholders in CN[CN]StateUpdate1Mod, CNPhenologyMod, CNCIsoFluxMod.
samsrabin Jul 19, 2023
8aaa7f3
Add new CNVeg*FluxType members for removed residues. Unused.
samsrabin Jul 19, 2023
d32a49e
Filled to_removedresidue placeholders in CIsoFlux1().
samsrabin Jul 19, 2023
26775c3
Added CIsoFluxCalc() calls for to_removedresiduec pools in CIsoFlux1().
samsrabin Jul 19, 2023
3cb6549
Filled to_removedresidue placeholders in CNCStateUpdate1Mod.
samsrabin Jul 19, 2023
0ba8bed
Filled to_removedresidue placeholders in CNNStateUpdate1Mod.
samsrabin Jul 19, 2023
cc32593
Filled _to_removedresidue placeholders in CNCropHarvestToProductPools()
samsrabin Jul 19, 2023
9621190
Added associate statements for to_removedresidue pools to CNOffsetLit…
samsrabin Jul 19, 2023
74b11d8
Add residue removal code, but removedresidue_fraction 0.
samsrabin Sep 11, 2023
1ec3f62
Add namelist parameter crop_residue_removal_frac.
samsrabin Sep 11, 2023
6b324ec
Merge tag 'ctsm5.1.dev159' into cropresidues3-dev
samsrabin Dec 18, 2023
554a6ec
Crop tech note: Biofuel stems are also routed to biofuel pools.
samsrabin Dec 23, 2023
3d23110
Crop tech note: Add info about residue removal.
samsrabin Dec 23, 2023
a4c3741
Crop tech note: Don't show separate eqs for livestem and leaf removal.
samsrabin Dec 23, 2023
c05f728
Crop tech note: Refer to residue removal equations.
samsrabin Dec 23, 2023
6d78b7f
Crop tech note: Remove "leaf" from residue removal eq labels.
samsrabin Dec 23, 2023
1740a97
Crop tech note: Remove "wholly or partially."
samsrabin Dec 23, 2023
701c00f
Merge branch 'cropresidues3-dev' into cropresidues3
samsrabin Dec 23, 2023
3ff0b72
Merge tag 'ctsm5.1.dev162' into cropresidues3
samsrabin Jan 5, 2024
336f848
*_TO_REMOVEDRESIDUEC outputs now off by default.
samsrabin Jan 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion bld/CLMBuildNamelist.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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' );
}
}
Expand Down
2 changes: 2 additions & 0 deletions bld/namelist_files/namelist_defaults_ctsm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,8 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
<use_grainproduct use_crop=".true." phys="clm5_0" >.true.</use_grainproduct> <!-- 1-year grain product pool default to on for clm50 if crop is turned on -->
<use_grainproduct use_crop=".true." phys="clm5_1" >.true.</use_grainproduct> <!-- 1-year grain product pool default to on for clm50 if crop is turned on -->

<crop_residue_removal_frac>0.d+0</crop_residue_removal_frac>

<!-- Crop model options -->
<baset_mapping use_crop=".true." phys="clm4_5" >constant</baset_mapping>
<baset_mapping use_crop=".true." phys="clm5_0" >varytropicsbylat</baset_mapping>
Expand Down
7 changes: 7 additions & 0 deletions bld/namelist_files/namelist_definition_ctsm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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
</entry>

<entry id="crop_residue_removal_frac" type="real" category="physics"
group="clm_inparm" valid_values="" value="0.0d00">
Fraction of post-harvest crop residues (leaf and stem) to move to
1-year product pool instead of letting them fall as litter.
<default>Default: 0.0</default>
</entry>

<entry id="baset_mapping" type="char*20" category="physics"
group="crop_inparm" valid_values="constant,varytropicsbylat" value="constant">
Type of mapping to use for base temperature for prognostic crop model
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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%.

Expand Down
14 changes: 13 additions & 1 deletion src/biogeochem/CNCIsoFluxMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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, &
Expand Down Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions src/biogeochem/CNCStateUpdate1Mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions src/biogeochem/CNNStateUpdate1Mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
!
Expand Down
27 changes: 23 additions & 4 deletions src/biogeochem/CNPhenologyMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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( &
Expand Down Expand Up @@ -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

Expand All @@ -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)
Expand All @@ -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)

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Loading