//---------------------------------------------------------------------
 private InitialBiomass(SiteCohorts cohorts,
                        List<PoolD> litterPool,
                        PoolD woodyDebrisPool,
                        List<PoolD> deadFRootsPool,
                        Pool fineRootsPool,
                        Pool coarseRootsPool,
                        Charcoal charcoalPool)
 {
     this.cohorts = cohorts;
     this.litterPool = litterPool;
     this.woodyDebrisPool = woodyDebrisPool;
     this.deadFRootsPool = deadFRootsPool;
     this.fineRootsPool = fineRootsPool;
     this.coarseRootsPool = coarseRootsPool;
     this.charcoalPool = charcoalPool;
 }
        //---------------------------------------------------------------------
        /// <summary>
        /// Adds biomass for a species to the annual litter pool at a site.
        /// </summary>
        public static void AddLitter(double leafBiomass,
                                     ISpecies species,
                                     ActiveSite site,
                                     List<PoolD> litterAdd)
        {
            IEcoregion ecoregion = Model.Core.Ecoregion[site];
            double siteAET = (double)(EcoregionData.AET[ecoregion]);

            PoolD litterAddition = new PoolD();
            litterAddition.Mass = leafBiomass;
            litterAddition.InitialMass = leafBiomass;
            litterAddition.ContentC = SpeciesData.LitterFractionC[species] *
                litterAddition.Mass;
            litterAddition.ContentN = SpeciesData.LitterFractionN[species] *
                litterAddition.Mass;
            litterAddition.ContentP = SpeciesData.LitterFractionP[species] *
                litterAddition.Mass;

            //Calculate decomposition rate (Fan et al. 1998)
            double leafKReg = ((0.10015 * siteAET - 3.44618) - (0.01341 + 0.00147 * siteAET) *
                SpeciesData.LeafLignin[species]) / 100;
            double leafKStd = ((0.10015 * 551 - 3.44618) - (0.01341 + 0.00147 * 551) *
                SpeciesData.LeafLignin[species]) / 100;
            double leafKAdj = 8.35 * Math.Pow((SpeciesData.LeafLignin[species] /
                SpeciesData.LitterFractionN[species]), -0.784) * (leafKReg / leafKStd);
            litterAddition.DecayValue = leafKAdj;

            //Calculate mass loss limit (Berg et al. 1996). Average is 7% to
            //  soil organic matter (Verburg and Johnson 2001, other models).
            //  Use ceiling of 95% to ensure litter is removed.
            double limitValue = 0.01 * (91.241 - (1.744 *
                (SpeciesData.LitterFractionN[species] * 1000)));
            litterAddition.LimitValue = Math.Min(limitValue, 0.95);

            litterAdd.Add(litterAddition);
        }
        //---------------------------------------------------------------------
        /// <summary>
        /// Initializes the module.
        /// </summary>
        public static void Initialize()
        {
            cohorts             = Model.Core.Landscape.NewSiteVar<SiteCohorts>();
            availableN          = Model.Core.Landscape.NewSiteVar<double>();
            unavailable         = Model.Core.Landscape.NewSiteVar<Pool>();
            fineRoots           = Model.Core.Landscape.NewSiteVar<Pool>();
            coarseRoots         = Model.Core.Landscape.NewSiteVar<Pool>();
            woodyDebris         = Model.Core.Landscape.NewSiteVar<PoolD>();
            litter              = Model.Core.Landscape.NewSiteVar<List<PoolD>>();
            deadFineRoots       = Model.Core.Landscape.NewSiteVar<List<PoolD>>();
            litterAdd           = Model.Core.Landscape.NewSiteVar<List<PoolD>>();
            deadFineRootsAdd    = Model.Core.Landscape.NewSiteVar<List<PoolD>>();
            removeLitter        = Model.Core.Landscape.NewSiteVar<List<PoolD>>();
            removeDeadFineRoots = Model.Core.Landscape.NewSiteVar<List<PoolD>>();
            soilOrganicMatter   = Model.Core.Landscape.NewSiteVar<SoilOrganicMatter>();
            mineralSoil         = Model.Core.Landscape.NewSiteVar<MineralSoil>();
            charcoal            = Model.Core.Landscape.NewSiteVar<Charcoal>();
            rock                = Model.Core.Landscape.NewSiteVar<Rock>();
            //fireSeverity        = Model.Core.Landscape.NewSiteVar<int>();

            TotalWoodBiomass    = Model.Core.Landscape.NewSiteVar<double>();
            CurrentYearMortality = Model.Core.Landscape.NewSiteVar<double>();
            PrevYearMortality = Model.Core.Landscape.NewSiteVar<double>();
            //fireSeverity = Model.Core.GetSiteVar<byte>("Fire.Severity");

            // Enable interactions with (almost) any fire extension:
            /*if (Model.Core.GetSiteVar<int>("Fire.Severity") == null)
            {
                Console.Write("Fire Severity not cu");
            }
            else
            {
                Console.Write("Real value");
                fireSeverity = Model.Core.GetSiteVar<int>("Fire.SeverityX");
            }*/

            foreach (ActiveSite site in Model.Core.Landscape)
            {
                //  site cohorts are initialized by the PlugIn.InitializeSite method
                availableN[site]            = new double();
                unavailable[site]           = new Pool();
                fineRoots[site]             = new Pool();
                coarseRoots[site]           = new Pool();
                woodyDebris[site]           = new PoolD();
                litter[site]                = new List<PoolD>();
                deadFineRoots[site]         = new List<PoolD>();
                litterAdd[site]             = new List<PoolD>();
                deadFineRootsAdd[site]      = new List<PoolD>();
                removeLitter[site]          = new List<PoolD>();
                removeDeadFineRoots[site]   = new List<PoolD>();
                soilOrganicMatter[site]     = new SoilOrganicMatter();
                mineralSoil[site]           = new MineralSoil();
                charcoal[site]              = new Charcoal();
                rock[site]                  = new Rock();
            }
        }
        //---------------------------------------------------------------------
        protected override void InitializeSite(ActiveSite site,
            ICommunity initialCommunity)
        {
            InitialBiomass initialBiomass = InitialBiomass.Compute(site, initialCommunity);

            //Clone initial cohorts
            SiteVars.Cohorts[site] = initialBiomass.InitialCohorts.Clone();

            //Clone initial coarse roots to all sites
            SiteVars.CoarseRoots[site].Mass = initialBiomass.CoarseRootsPool.Mass;
            SiteVars.CoarseRoots[site].ContentC = initialBiomass.CoarseRootsPool.ContentC;
            SiteVars.CoarseRoots[site].ContentN = initialBiomass.CoarseRootsPool.ContentN;
            SiteVars.CoarseRoots[site].ContentP = initialBiomass.CoarseRootsPool.ContentP;

            //Clone initial fine roots to all sites
            SiteVars.FineRoots[site].Mass = initialBiomass.FineRootsPool.Mass;
            SiteVars.FineRoots[site].ContentC = initialBiomass.FineRootsPool.ContentC;
            SiteVars.FineRoots[site].ContentN = initialBiomass.FineRootsPool.ContentN;
            SiteVars.FineRoots[site].ContentP = initialBiomass.FineRootsPool.ContentP;

            //Clone initial woody debris to all sites
            SiteVars.WoodyDebris[site].Mass = initialBiomass.WoodyDebrisPool.Mass;
            SiteVars.WoodyDebris[site].ContentC = initialBiomass.WoodyDebrisPool.ContentC;
            SiteVars.WoodyDebris[site].ContentN = initialBiomass.WoodyDebrisPool.ContentN;
            SiteVars.WoodyDebris[site].ContentP = initialBiomass.WoodyDebrisPool.ContentP;
            SiteVars.WoodyDebris[site].DecayValue = initialBiomass.WoodyDebrisPool.DecayValue;

            //Clone initial litter to all sites
            if (SiteVars.Litter[site].Count == 0)
            {
                foreach (PoolD litter in initialBiomass.LitterPool)
                {
                    PoolD litterAdd = new PoolD();
                    litterAdd.Mass = litter.Mass;
                    litterAdd.ContentC = litter.ContentC;
                    litterAdd.ContentN = litter.ContentN;
                    litterAdd.ContentP = litter.ContentP;
                    litterAdd.DecayValue = litter.DecayValue;
                    litterAdd.InitialMass = litter.InitialMass;
                    litterAdd.LimitValue = litter.LimitValue;
                    SiteVars.Litter[site].Add(litterAdd);
                }
            }

            //Clone initial dead fine roots to all sites
            if (SiteVars.DeadFineRoots[site].Count == 0)
            {
                foreach (PoolD litter in initialBiomass.DeadFRootsPool)
                {
                    PoolD litterAdd = new PoolD();
                    litterAdd.Mass = litter.Mass;
                    litterAdd.ContentC = litter.ContentC;
                    litterAdd.ContentN = litter.ContentN;
                    litterAdd.ContentP = litter.ContentP;
                    litterAdd.DecayValue = litter.DecayValue;
                    litterAdd.InitialMass = litter.InitialMass;
                    litterAdd.LimitValue = litter.LimitValue;
                    SiteVars.DeadFineRoots[site].Add(litterAdd);
                }
            }

            //Clone initial charcoal to all sites
            SiteVars.Charcoal[site].ContentC = initialBiomass.CharcoalPool.ContentC;
            SiteVars.Charcoal[site].ContentN = initialBiomass.CharcoalPool.ContentN;
            SiteVars.Charcoal[site].ContentP = initialBiomass.CharcoalPool.ContentP;
        }
        //---------------------------------------------------------------------
        /// <summary>
        /// Adds yearly biomass addition to dead fine roots at a site.
        ///   Sums all species-cohort additions and adds as a single cohort.
        /// </summary>
        public static void AddYearDeadFineRoots(ActiveSite site)
        {
            double addMass = 0.0;
            double addC = 0.0;
            double addN = 0.0;
            double addP = 0.0;
            double addDecay = 0.0;
            double addLimit = 0.0;

            foreach (PoolD litter in SiteVars.DeadFineRootsAdd[site])
            {
                addMass += litter.Mass;
                addC += litter.ContentC;
                addN += litter.ContentN;
                addP += litter.ContentP;
                addDecay += (litter.DecayValue * litter.Mass);  //weighted avg
                addLimit += (litter.LimitValue * litter.Mass);  //weighted avg
            }

            PoolD LitterAddition = new PoolD();
            LitterAddition.Mass = addMass;
            LitterAddition.ContentC = addC;
            LitterAddition.ContentN = addN;
            LitterAddition.ContentP = addP;
            LitterAddition.DecayValue = addDecay / addMass;
            LitterAddition.LimitValue = addLimit / addMass;
            LitterAddition.InitialMass = addMass;

            SiteVars.DeadFineRoots[site].Add(LitterAddition);
            SiteVars.DeadFineRootsAdd[site].Clear();
            SiteVars.DeadFineRootsAdd[site].TrimExcess();
        }
        //---------------------------------------------------------------------
        /// <summary>
        /// Kills fine roots and add the biomass to the Dead Fine Roots pool.
        /// </summary>
        public static void KillFineRoots(double litterMass,
            ISpecies species,
            List<PoolD> deadFRootsAdd)
        {
            PoolD deadFRootsAddition = new PoolD();
            deadFRootsAddition.Mass = litterMass;   //litterMass is result of CalculateFineRoots
            deadFRootsAddition.ContentC = SpeciesData.FRootFractionC[species] *
                deadFRootsAddition.Mass;
            deadFRootsAddition.ContentN = SpeciesData.FRootFractionN[species] *
                deadFRootsAddition.Mass;
            deadFRootsAddition.ContentP = SpeciesData.FRootFractionP[species] *
                deadFRootsAddition.Mass;

            //Calculate decomposition rate (Silver and Miya 2001, Fig. 3,
            //  with substituted (-) for (+) to match figure).
            deadFRootsAddition.DecayValue = Math.Exp(3.92 - (1.12 *
                (Math.Log(SpeciesData.FRootFractionC[species] /
                SpeciesData.FRootFractionN[species]))));

            //Calculate mass loss limit (Berg et al. 1996). Lower limit
            //  than for litter (Verburg and Johnson 2001 and others).
            //  Use ceiling of 0.95 to ensure litter is removed.
            double limitValue = 0.01 * (91.241 - (1.744 *
                (SpeciesData.FRootFractionN[species] * 1000)));
            deadFRootsAddition.LimitValue = Math.Min(limitValue, 0.95);

            deadFRootsAdd.Add(deadFRootsAddition);
        }
        //---------------------------------------------------------------------
        /// <summary>
        /// Phase 3 of decomposition: Matter is transferred to soil organic
        ///   matter. If C:P > 450, additional P is released prior to
        ///   humification (Moore et al. 2006).
        /// </summary>
        public static void DecompPhase3(PoolD litter,
            ActiveSite site)
        {
            double CPratio = litter.ContentC / litter.ContentP;

            if (CPratio > 450)
            {
                double mineralizedP = litter.ContentC / 450;
                litter.ContentP -= mineralizedP;
                SiteVars.MineralSoil[site].ContentP += mineralizedP;
            }

            SiteVars.SoilOrganicMatter[site].Mass += litter.Mass;
            SiteVars.SoilOrganicMatter[site].ContentC += litter.ContentC;
            SiteVars.SoilOrganicMatter[site].ContentN += litter.ContentN;
            SiteVars.SoilOrganicMatter[site].ContentP += litter.ContentP;

            SiteVars.RemoveDeadFineRoots[site].Add(litter);
        }
        //---------------------------------------------------------------------
        /// <summary>
        /// Phase 2 of decomposition: Nitrogen and phosphorus mineralized
        ///   proportionally to decomposition rate (Berg and Staaf 1981,
        ///   Moore et al. 2006).
        /// </summary>
        public static void DecompPhase2(PoolD litter,
            ActiveSite site)
        {
            litter.Mass = litter.Mass * Math.Exp(-1 * litter.DecayValue);
            litter.ContentC = litter.ContentC * Math.Exp(-1 * litter.DecayValue);

            //Net N mineralization proportional to mass loss.
            double mineralizedN = litter.ContentN - (litter.ContentN *
                Math.Exp(-1 * litter.DecayValue));
            litter.ContentN -= mineralizedN;
            SiteVars.MineralSoil[site].ContentN += mineralizedN;

            //Net P mineralization proportional to mass loss.
            double mineralizedP = litter.ContentP - (litter.ContentP *
                Math.Exp(-1 * litter.DecayValue));
            litter.ContentP -= mineralizedP;
            SiteVars.MineralSoil[site].ContentP += mineralizedP;
        }
        //---------------------------------------------------------------------
        /// <summary>
        /// Phase 1 of decomposition: Rapid decomposition with net nitrogen
        ///   immobilization and either no change or mineralization in
        ///   phosphorus.
        /// </summary>
        public static void DecompPhase1(PoolD litter,
            ActiveSite site)
        {
            litter.Mass = litter.Mass * Math.Exp(-1 * litter.DecayValue);
            litter.ContentC = litter.ContentC * Math.Exp(-1 * litter.DecayValue);

            //Net immobilization of nitrogen (Jannsen 1996 with application
            //  described in Noij et al. 1996).
            //Microbe CUE and C:N ratios set to default values.
            double microbeCUE = 0.5;
            double microbeCN = 20;

            double mineralizedN = litter.ContentC * (litter.DecayValue /
                (litter.ContentC / litter.ContentN)) - microbeCUE *
                litter.ContentC * (litter.DecayValue / microbeCN);
            litter.ContentN -= mineralizedN;
            SiteVars.MineralSoil[site].ContentN += mineralizedN;

            //Critical C:P < 900 used as cut-off of net P mineralization
            //  (Prescott et al. 2000 upperbound). If C:P > 900, conserve
            //  P; else, mineralization occurs at decomposition rate.
            double CPratio = litter.ContentC / litter.ContentP;
            if (CPratio < 900)
            {
                double mineralizedP = litter.ContentP - (litter.ContentP *
                    Math.Exp(-1 * litter.DecayValue));
                litter.ContentP -= mineralizedP;
                SiteVars.MineralSoil[site].ContentP += mineralizedP;
            }
        }
Example #10
0
        //---------------------------------------------------------------------
        /// <summary>
        /// Decomposition of fine roots. Follows Berg's 3-part model (generally
        ///   higher limit values, but same dynamics as ForestFloor.DecomposeLitter)
        ///   (McClaugherty et al. 1984).
        /// </summary>
        public static void DecomposeDeadFineRoots(PoolD litter,
            ActiveSite site)
        {
            double CNratio = litter.ContentC / litter.ContentN;
            double massLoss = (litter.InitialMass - litter.Mass) / litter.InitialMass;

            if (litter.Mass < 1.0)
            {
                SiteVars.RemoveDeadFineRoots[site].Add(litter);
                return;
            }

            //Limit to mass loss determines cut-off betweeen phases 2 and 3.
            //Phase 3.
            else if (massLoss > litter.LimitValue)
            {
                Roots.DecompPhase3(litter, site);

                return;
            }

            //Critical C:N < 40 used as cut-off between phases 1 and 2.
            //  (Upper bound in Prescott et al. 2000 and empirical finding
            //  in Janssen 1996).
            //Phase 1.
            else if (CNratio > 40)
            {
                Roots.DecompPhase1(litter, site);

                return;
            }

            //Phase 2.
            else
            {
                Roots.DecompPhase2(litter, site);

                return;
            }
        }
 /// <summary>
 /// Adds biomass for a species to the woody debris pool at a site.
 /// </summary>
 public static void AddWoodyDebris(double woodBiomass,
                                   ISpecies species,
                                   PoolD woodyDebris)
 {
     woodyDebris.AddMass(woodBiomass, SpeciesData.WoodFractionC[species],
         SpeciesData.WoodFractionN[species], SpeciesData.WoodFractionP[species],
         SpeciesData.WoodyDebrisDecay[species]);
 }