harvest - PIK-LPJmL/LPJmL GitHub Wiki

Harvest

[[TOC]]

Description

Harvest is the annual carbon removed from managed land either as yields or as residuals. Harvested carbon leaves the LPJmL carbon cycle and is assumed to respire to the atmosphere.

Details

Daily assimilation is allocated to harvestable storage organs (e.g. cereal grain) and three other pools (roots, leafs, stems). Heat units (hsum) are accumulated daily for each CFT until maturity is reached, i.e. when hsum equals the CFT-specific prescribed Phenologocal Heat Units PHU or if the maximum length of growing period hlimit is reached (winter crops are allowed to grow 90 days more) (see CFT-Phenology). Harvest occurs at maturity, the storage organs are removed and their carbon content is assumed to respire within the same year. The carbon of the roots is added to the belowground litter pool. The actual date is fixed as harvest date (hdate), the harvested CFT is deleted from the pftlist and stored irrigation water is returned to the river system.

Residue management:
At harvest, 10% of leaf and stem litter are directly assigned to above ground litter pool. Remaining residue carbon pools can be told to be removed (bool parameter in param.par), but by default they remain on the field as aboveground biomass.

Related Outputs

CFTFRAC (code variable: cftfrac): CFT cell fraction, is written to output in harvest.c
PFT_HARVEST (code variable: pft_harvest.harvest): CFT-specific harvested carbon from storage organs [gC/m²/yr], 16 rainfed, 16 irrigated bands
PFT_RHARVEST (code variable: pft_harvest.residual): CFT-specific harvested residual carbon [gC/m²/yr]

HARVEST (code variable: flux_harvest): total harvested carbon [gC/m²/yr], including storage organs, harvested residuals, residuals_burnt and residuals_burntinfield
RHARVEST_BURNT (code variable: flux_rharvest_burnt): residuals burnt carbon [gC/m²/yr]
RHARVEST_BURNT_IN_FIELD (code variable: flux_rharvest_burnt_in_field): residuals field burnt carbon[gC/m²/yr]

Technical Note

Residue Management:
RESIDUES_FIRE is a bool macro defined in crop.h, # TO DO # should be extracted from the code and redirected to lpjml.conf or param.par if this is actually still in use by anyone.
If RESIDUALS_FIRE is FALSE (current default), residuals_burnt and residuals_burntinfield are set to 0. Otherwise, a fraction (code comment: “Yevich’s data”) of leaf and stem carbon pool is assigned.

Code Snippet

src/crop/harvest_crop.c:

    void harvest_crop(Output *output,        /* Output data */
                      Stand *stand,          /* pointer to crop stand */
                      Pft *pft,              /* PFT variables */
                      int npft,              /* number of natural PFTs */
                      int ncft,              /* number of crop PFTs */
                      Bool pft_output_scaled /* pft-specific output scaled with
                                                stand->frac (TRUE/FALSE) */
                     )
    {
      Pftcroppar *croppar;
      Harvest harvest;
      Pftcrop *crop;
      Irrigation *data;
      Real fuelratio,bifratio,factor;
      data=stand->data;
      crop=pft->data;
      stand->soil.litter.ag[pft->litter].trait.leaf+=(crop->ind.leaf+crop->ind.pool)*RESIDUES_IN_SOIL;
      if(!RESIDUES_FIRE)
      {
        harvest.residuals_burnt=harvest.residuals_burntinfield=0;
        factor=(1-RESIDUES_IN_SOIL);
      }
      else
      {
        fuelratio=stand->cell->ml.manage.regpar->fuelratio; /* burn outside of field */
        bifratio=stand->cell->ml.manage.regpar->bifratio; /* burn in field */
        if(bifratio+fuelratio>(1-RESIDUES_IN_SOIL))
        {
          bifratio*=(1-RESIDUES_IN_SOIL);
          fuelratio*=(1-RESIDUES_IN_SOIL);
        }
        factor=1-RESIDUES_IN_SOIL-fuelratio-bifratio;
        harvest.residuals_burnt=(crop->ind.leaf+crop->ind.pool)*fuelratio;
        harvest.residuals_burntinfield=(crop->ind.leaf+crop->ind.pool)*bifratio;
      }
      if(param.remove_residuals)
        harvest.residual=(crop->ind.leaf+crop->ind.pool)*factor;
      else
      {
        stand->soil.litter.ag[pft->litter].trait.leaf+=(crop->ind.leaf+crop->ind.pool)*factor;
        harvest.residual=0;
      }
      harvest.harvest=crop->ind.so;
      stand->soil.litter.bg[pft->litter]+=crop->ind.root;
      if(pft_output_scaled)
      {
        output->pft_harvest[pft->par->id-npft+data->irrigation*(ncft+NGRASS+NBIOMASSTYPE)].harvest+=harvest.harvest*stand->frac;
        output->pft_harvest[pft->par->id-npft+data->irrigation*(ncft+NGRASS+NBIOMASSTYPE)].residual+=(harvest.residual+harvest.residuals_burnt+harvest.residuals_burntinfield)*stand->frac;
      }
      else
      {
        output->pft_harvest[pft->par->id-npft+data->irrigation*(ncft+NGRASS+NBIOMASSTYPE)].harvest+=harvest.harvest;
        output->pft_harvest[pft->par->id-npft+data->irrigation*(ncft+NGRASS+NBIOMASSTYPE)].residual+=(harvest.residual+harvest.residuals_burnt+harvest.residuals_burntinfield);
      }
      /* harvested area */
    
      output->cftfrac[pft->par->id-npft+data->irrigation*(ncft+NGRASS+NBIOMASSTYPE)]+=stand->frac;
    
      output->flux_harvest+=(harvest.harvest+harvest.residual+harvest.residuals_burnt+harvest.residuals_burntinfield)*stand->frac;
      output->flux_rharvest_burnt+=harvest.residuals_burnt*stand->frac;
      output->flux_rharvest_burnt_in_field+=harvest.residuals_burntinfield*stand->frac;
      croppar=pft->par->data;
      if(data->irrigation)
        stand->cell->ml.cropdates[pft->par->id-npft].fallow_irrig=croppar->fallow_days;
      else
        stand->cell->ml.cropdates[pft->par->id-npft].fallow=croppar->fallow_days;
    } /* of 'harvest_crop' */
    

Developers

Werner von Bloh, Sibyll Schaphoff

See Also

allocation and phenology, residue management, carbon pools, bioenergy, harvest index

⚠️ **GitHub.com Fallback** ⚠️