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

Release clm5.0 fruit tree #1966

Draft
wants to merge 18 commits into
base: release-clm5.0
Choose a base branch
from

Conversation

odombro
Copy link

@odombro odombro commented Mar 10, 2023

Description of changes

This model branch “CLM5-FruitTree” implements a new submodel that allows the modelling of deciduous fruit trees within CLM. So far the model was developed and tested on the point scale and showed good results in representing the growth and partitioning of biomass between different plant organs as well as observed carbon, water and energy fluxes in a commercial apple orchard.

CLM5-FruitTree combines elements of the existing broadleaf deciduous tree subroutine such as growth and C turnover of woody components, with distinctive phenological stages and a harvestable organ similar to the annual crop subroutine. Additionally, new processes specific to fruit orchards are described.

Major developments include:

  1. A new phenology subroutine that describes the orchard lifecycle and the phenological development of fruit trees including triggers for seasonal orchard management practices.
  2. Adaptation of the CN allocation scheme to reproduce the growth dynamics of fruit trees, considering both storage and photosynthetic growth of annual and perennial plant organs.
  3. Parameterization of an apple plant functional type (for now using ncitrus (35) and nirrig_citrus (36))

Modifications of the following files were made:

  • src/biogeochem/CNCIsoFluxMod.F90
  • src/biogeochem/CNCStateUpdate1Mod.F90
  • src/biogeochem/CNDriverMod.F90
  • src/biogeochem/CNFUNMod.F90
  • src/biogeochem/CNGapMortalityMod.F90
  • src/biogeochem/CNGRespMod.F90
  • src/biogeochem/CNMRespMod.F90
  • src/biogeochem/CNNStateUpdate1Mod.F90
  • src/biogeochem/CNPhenologyMod.F90
  • src/biogeochem/CNVegCarbonFluxType.F90
  • src/biogeochem/CNVegCarbonStateType.F90
  • src/biogeochem/CNVegNitrogenFluxType.F90
  • src/biogeochem/CNVegNitrogenStateType.F90
  • src/biogeochem/CNVegStateType.F90
  • src/biogeochem/CNVegStructUpdateMod.F90
  • src/biogeochem/CropType.F90
  • src/biogeochem/dynHarvestMod.F90
  • src/biogeochem/NutrientCompetitionFlexibleCNMod.F90
  • src/main/pftconMod.F90
  • src/biogeophys/TemperatureType.F90

The new parameter file to be used with the development is:
clm5_params.c171117__FruitTree.nc

Specific notes

Detailed information on the technical development and modelling results were published in Dombrowski et al. (2022)

Are answers expected to change (and if so in what way)?

Answers are expected to change only when CFT 35 or 36 is used in a simulation as this CFT is now active and uses the new phenology subroutine (perennial and woody flags set to 1 in parameter file).

Any User Interface Changes (namelist or namelist defaults changes)?

New parameters:

  • aleafstor: Leaf allocation coefficient to storage post harvest used in CNAllocation (unitless)
  • arootf2: Late root Allocation coefficient parameter used in CNAllocation (unitless)
  • crequ: Chilling requirements for bud burst of fruit tree crops (days)
  • crit_temp: Critical temperature to initiate leaf offset for fruit tree crops (K)
  • grnrp: Growing Degree Days for fruit expansion used in CNPhenology (unitless)
  • lfmat: Growing Degree Days for canopy maturity used in CNPhenology (unitless)
  • max_NH_harvest_date: Maximum apple harvest date for the Northern Hemisphere (YYYYMMDD)
  • max_SH_harvest_date: Maximum apple harvest date for the Southern Hemisphere (YYYYMMDD)
  • mulch_pruning: Binary flag for exporting or mulching of pruning material (logical flag)
  • ndays_stor: Length of period for storage growth of fruit tree crops (days)
  • perennial: Binary flag for perennial crop phenology (logical flag)
  • prune_fr: Fraction of deadstem biomass that is pruned (unitless)
  • transplant: Initial carbon for crops transplanted from nursery (gC/m2)

New output variables:

  • GRAIN_MR: grain maintenance respiration. Patch level output.
  • CROP_SEEDC_TO_FROOT: crop seed source to fine root. Patch level output.
  • CROP_SEEDC_TO_DEADSTEM: crop seed source to deadstem. Patch level output.
  • C13_CROP_SEEDC_TO_FROOT: C13 crop seed source to fine root. Patch level output.
  • C13_CROP_SEEDC_TO_DEADSTEM: C13 crop seed source to deadstem. Patch level output.
  • C14_CROP_SEEDC_TO_FROOT: crop C14 seed source to fine root. Patch level output.
  • C14_CROP_SEEDC_TO_DEADSTEM: C14 crop seed source to deadstem. Patch level output.
  • CROP_SEEDN_TO_FROOT: crop seed source to fine root. Patch level output.
  • CROP_SEEDN_TO_DEADSTEM: crop seed source to deadstem. Patch level output.
  • DEADSTEMC_SOY: dead stem C at start of year. Patch level output.
  • DEADSTEMC_STORAGE_SOY: dead stem storage C at start of year. Patch level output.
  • DEADSTEMN_SOY: dead stem N at start of year. Patch level output.
  • DEADSTEMN_STORAGE_SOY: dead stem storage N at start of year. Patch level output.
  • CHILL_DAY: Chill days needed for bud break of fruit tree crops. Patch level output.
  • ANTI_CHILL_DAY: Anti-chill days needed for bud break of fruit tree crops. Patch level output.
  • CHILL_FLAG: Chill requirements flag for bud break of fruit tree crops. Patch level output.
  • HARVEST_FLAG: Harvest flag (perennial crops). Patch level output.
  • STORAGE_FLAG: Storage growth flag (perennial crops). Patch level output.
  • A_LEAF: Leaf allocation coefficient. Patch level output.
  • A_STEM: Stem allocation coefficient. Patch level output.
  • T_REF24: 24hr average of 2 m air temperature. Patch level output.

New restart variables:

  • prunec_to_litter: pruning C added to litterfall flux. PFT level dimension.
  • prunec_storage_to_litter: pruning storage C added to litterfall flux. PFT level dimension.
  • prunen_to_litter: pruning N added to litterfall flux. PFT level dimension.
  • prunen_storage_to_litter: pruning storage N added to litterfall flux. PFT level dimension.
  • deadstemc_soy: dead stem C at start of year. PFT level dimension.
  • deadstemc_storage_soy: dead stem storage C at start of year. PFT level dimension.
  • deadstemn_soy: dead stem N at start of year. PFT level dimension.
  • deadstemn_storage_soy: dead stem storage N at start of year. PFT level dimension.
  • offset2_flag: orchard rotation flag. PFT level dimension.
  • arooti2: Saved root allocation coefficient from phase 2. PFT level dimension.
  • arooti3: Saved root allocation coefficient from phase 3. PFT level dimension.
  • aleafi3: Saved leaf allocation coefficient from phase 3. PFT level dimension.
  • huilfmat: Heat unit index needed to reach canopy maturity. PFT level dimension.
  • huiripe: Heat unit index needed to reach fruit cell expansion. PFT level dimension.
  • chill_day: Chill days needed for bud break of fruit tree crops. PFT level dimension.
  • anti_chill_day: Anti-chill days needed for bud break of fruit tree crops. PFT level dimension.
  • chill_flag: Chill requirements flag for bud break of fruit tree crops. PFT level dimension.
  • harvest_flag: Harvest flag (perennial crops). PFT level dimension.
  • prune_flag: Pruning flag (perennial crops). PFT level dimension.
  • storage_flag: S torage growth flag for perenneial crops. PFT level dimension.
  • yrop: year of planting for perennial crops. PFT level dimension.
  • t_ref24: 24hr average of 2 m air temperature. PFT level dimension.

Testing performed

Thus far, testing was performed only for a single point case. For the testing I ran the default CLM5 model and the CLM5-FruitTree development for PFT 7: Broadleaf deciduous tree (BDT) and PFT 19: Spring wheat (SW) for 14 years at a daily timestep. I then compared the last 6 years of simulations to test if the development had any unintended effects on other PFTs. For the two PFTs tested here, there is no difference between the CLM5 and CLM5-FruitTree for the examined variables.
Scatter_ALL
TOTECOSYSC (total ecosystem carbon), TOTECOSYSN (total ecosystem nitrogen), TOTSOMC (total soil organic matter carbon), GPP (gross primary production), TLAI (total leaf area index) and TWS (total water storage).

Additionally, I ran CLM5-FruitTree with the newly parameterized crop type PFT 36: Apple (APPLE) and compared against BDT and SW to showcase the differences between the three PFTs. Here I am showing simulation results for one year (2015) at a daily timestep.
C_fluxes
GPP (gross primary productivity), NEE (net ecosystem exchange), ER (ecosystem respiration), AR (autotrophic respiration) and HR (heterotrophic respiration).
Biomass
GRAINC (grain or fruit carbon), LEAFC (leaf carbon), LIVESTEMC (livestem carbon), FROOTC (fine root carbon) and GRAINC_TO_FOOD (harvest flux).
H2O_fluxes
QSOIL (soil evaporation), QVEGE (canopy evaporation), QVEGT (canopy transpiration), QSOIL (runoff) and QIRRIG (irrigation).
Energy_fluxes
LH (latent heat flux), FSH (sensible heat flux) and Rnet (net radiation).

@samsrabin samsrabin self-assigned this Mar 10, 2023
@samsrabin samsrabin added the next this should get some attention in the next week or two. Normally each Thursday SE meeting. label Mar 10, 2023
@odombro odombro marked this pull request as ready for review March 14, 2023 15:08
@billsacks billsacks changed the base branch from master to release-clm5.0 March 20, 2023 16:06
@billsacks billsacks removed the next this should get some attention in the next week or two. Normally each Thursday SE meeting. label Mar 23, 2023
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file's changes are just whitespace and can be reverted.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A lot of the changes here are distinguishing behavior between woody-perennial PFTs and other PFTs, but many cases have the same thing happen in both. To simplify the changes, any shared lines should occur outside the "if woody perennial" conditional.

Copy link
Collaborator

@samsrabin samsrabin Mar 27, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To improve readability and minimize maintenance costs, perennial(ivt(p)) == 1._r8 .and. woody(ivt(p)) == 1.0_r8 should be replaced with a local boolean variable called is_perennial_woody or something.

@ekluzek ekluzek marked this pull request as draft April 3, 2023 21:52
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file's changes are just whitespace and can be reverted.

end if
if (ivt(p) >= npcropmin) then ! skip 2 generic crops
if (carbon_resp_opt == 1) then
if (carbon_resp_opt == 1 .and. perennial(ivt(p)) == 0._r8) then !(perennial flag added by O.Dombrowski)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of (in addition to?) checking for perennial, should it be checked for woody?

@@ -1194,7 +1195,7 @@ subroutine CNFUN(bounds,num_soilc, filter_soilc,num_soilp&
! Calculate appropriate degree of retranslocation
!-------------------------------------------------------------------------------

if(leafc(p).gt.0.0_r8.and.litterfall_n_step(p,istp)* fixerfrac>0.0_r8.and.ivt(p) <npcropmin)then
if(leafc(p).gt.0.0_r8.and.litterfall_n_step(p,istp)* fixerfrac>0.0_r8.and. (ivt(p) <npcropmin .or. perennial(ivt(p)) == 1.0_r8)) then ! include perennial woody crops (added by O.Dombrowski)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should woodiness also be checked here?

@@ -1229,6 +1230,7 @@ subroutine CNFUN(bounds,num_soilc, filter_soilc,num_soilp&
if(local_use_flexiblecn)then
if (leafn(p) == 0.0_r8) then ! to avoid division by zero
delta_CN = fun_cn_flex_c(ivt(p)) ! Max CN ratio over standard
write(iulog,*) 'fun_cn_flex_c is used no1'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Diagnostic messages here and at 1242, 1249 should be removed.

@@ -133,7 +133,7 @@ subroutine ComputeSeedAmounts(bounds, &
if (pft_type /= noveg) then
my_leaf_seed = leafc_seed * &
SpeciesTypeMultiplier(species, pft_type, COMPONENT_LEAF)
if (pftcon%woody(pft_type) == 1._r8) then
if (pftcon%woody(pft_type) == 1._r8 .and. patch%itype(p) < npcropmin) then
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add a comment explaining why this shouldn't happen for woody crops?

if (pi <= col%npatches(c)) then
p = col%patchi(c) + pi - 1

if (patch%active(p)) then
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this only happen for perennial woody crops?

@@ -321,17 +349,17 @@ subroutine InitHistory(this, bounds)
ptr_col=this%nfire_col)

this%farea_burned_col(begc:endc) = spval
call hist_addfld1d (fname='FAREA_BURNED', units='s-1', &
call hist_addfld1d (fname='FAREA_BURNED', units='proportion/sec', &
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This and the following same unit changes should probably be reverted.

avgflag='A', long_name='Leaf allocation coefficient', &
ptr_patch=this%aleaf_patch, default='inactive')

! this%arepr_patch(begp:endp) = spval
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This commented-out block can be removed.

avgflag='A', long_name='Stem allocation coefficient', &
ptr_patch=this%astem_patch, default='inactive')

! this%aroot_patch(begp:endp) = spval
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This commented-out block can be removed.

else if (storage_flag(p) == 1._r8) then
fcur = 0._r8
end if
cpool_to_leafc(p) = nlc * fcur
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Starting here, there's lots of duplication in this subroutine for perennial woody PFTs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants