Example #1
0
        public static void Initialize()
        {
            soiltype          = (Landis.Library.Parameters.Ecoregions.AuxParm <string>)(Parameter <string>) PlugIn.GetParameter("SoilType");
            climateFileName   = (Landis.Library.Parameters.Ecoregions.AuxParm <string>)(Parameter <string>) PlugIn.GetParameter("ClimateFileName");
            rootingdepth      = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("RootingDepth", 0, 1000);
            precintconst      = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("PrecIntConst", 0, 1);
            preclossfrac      = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("PrecLossFrac", 0, 1);
            snowsublimfrac    = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("SnowSublimFrac", 0, 1);
            latitude          = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("Latitude", -90, 90);
            leakageFrostDepth = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("LeakageFrostDepth", 0, 999999);
            precipEvents      = (Landis.Library.Parameters.Ecoregions.AuxParm <int>)(Parameter <int>) PlugIn.GetParameter("PrecipEvents", 1, 100);
            winterSTD         = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("WinterSTD", 0, 100);
            mossDepth         = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("MossDepth", 0, 1000);

            wythers = ((Parameter <bool>)PlugIn.GetParameter("Wythers")).Value;
            dtemp   = ((Parameter <bool>)PlugIn.GetParameter("DTemp")).Value;

            leakagefrac   = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("LeakageFrac", 0, 1);
            runoffcapture = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter(Names.RunoffCapture, 0, 999999);
            AllEcoregions = new Dictionary <IEcoregion, IEcoregionPnET>();
            foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions)
            {
                AllEcoregions.Add(ecoregion, new EcoregionPnET(ecoregion));
            }

            all_values = new Dictionary <IEcoregionPnET, Dictionary <DateTime, IEcoregionPnETVariables> >();
            foreach (IEcoregionPnET ecoregion in EcoregionPnET.AllEcoregions.Values)
            {
                all_values[ecoregion] = new Dictionary <DateTime, IEcoregionPnETVariables>();
            }
        }
Example #2
0
        public SiteConditions(ActiveSite site, ICommunity initialCommunity)
        {
            cohorts = new SiteCohorts();

            canopy = new Canopy();
            if (PlugIn.HasSiteOutput[site] == true)
            {
                siteoutput = new SiteOutput(site);
                estoutput  = new EstablishmentOutput(site);
            }

            this.site = site;


            foreach (ISpecies spc in PlugIn.modelCore.Species)
            {
                deadcohortages[spc] = new List <int>();
            }

            uint key = ComputeKey(initialCommunity.MapCode, PlugIn.ModelCore.Ecoregion[site].MapCode);

            SiteConditions s = GetFromKey(key);

            if (s != null)
            {
                return;
            }

            //  If we don't have a sorted list of age cohorts for the initial
            //  community, make the list

            List <Landis.Library.AgeOnlyCohorts.ICohort> sortedAgeCohorts;

            if (!sortedCohorts.TryGetValue(initialCommunity.MapCode, out sortedAgeCohorts))
            {
                sortedAgeCohorts = PlugIn.RankCohortAgesOldToYoung(initialCommunity.Cohorts);
                sortedCohorts[initialCommunity.MapCode] = sortedAgeCohorts;
            }
            hydrology     = new Hydrology(PlugIn.modelCore.Ecoregion[site]);
            forestfloor   = new ForestFloor();
            cohorts       = new SiteCohorts();
            establishment = new EstablishmentProbability(site);


            if (sortedAgeCohorts.Count == 0)
            {
                return;
            }

            //PlugIn.ModelCore.UI.WriteLine("Making Biomass Cohorts "+ site);
            BiomassSpinUp(sortedAgeCohorts, site);

            initialSites[key] = this;
            return;
        }
        //---------------------------------------------------------------------

        /// <summary>
        /// Computes the initial biomass at a site.
        /// </summary>
        /// <param name="site">
        /// The selected site.
        /// </param>
        /// <param name="initialCommunity">
        /// The initial community of age cohorts at the site.
        /// </param>

        public static InitialBiomass ComputeInitialBiomass(ActiveSite site,
                                                           ICommunity initialCommunity)
        {
            InitialBiomass initialBiomass;

            IEcoregion ecoregion = PlugIn.ModelCore.Ecoregion[site];
            uint       key       = ComputeKey(initialCommunity.MapCode, ecoregion.MapCode);

            if (initialSites.TryGetValue(key, out initialBiomass) && HasSiteOutput[site] == false)
            {
                CanopyBiomass.CanopyLAImax[site]    = initialBiomass.canopylaimax;
                CanopyBiomass.CanopyLAI[site]       = initialBiomass.canopylai;
                Hydrology.Water[site]               = initialBiomass.water;
                Hydrology.AnnualTranspiration[site] = initialBiomass.annualtrans;
                CanopyBiomass.SubCanopyPAR[site]    = initialBiomass.subcanopypar;
                return(initialBiomass);
            }


            //  If we don't have a sorted list of age cohorts for the initial
            //  community, make the list

            List <Landis.Library.AgeOnlyCohorts.ICohort> sortedAgeCohorts;

            if (!sortedCohorts.TryGetValue(initialCommunity.MapCode, out sortedAgeCohorts))
            {
                sortedAgeCohorts = PlugIn.RankCohortAgesOldToYoung(initialCommunity.Cohorts);
                sortedCohorts[initialCommunity.MapCode] = sortedAgeCohorts;
            }

            if (sortedAgeCohorts.Count == 0)
            {
                return(null);
            }

            ISiteCohorts cohorts = MakeBiomassCohorts(sortedAgeCohorts, site);



            initialBiomass = new InitialBiomass(cohorts,
                                                ForestFloor.WoodyDebris[site],
                                                ForestFloor.Litter[site],
                                                Hydrology.Water[site],
                                                Hydrology.AnnualTranspiration[site],
                                                CanopyBiomass.CanopyLAI[site],
                                                CanopyBiomass.CanopyLAImax[site],
                                                CanopyBiomass.SubCanopyPAR[site]);


            initialSites[key] = initialBiomass;
            return(initialBiomass);
        }
Example #4
0
        public static void Allocate(object sitecohorts, Cohort cohort, ExtensionType disturbanceType, double fraction)
        {
            if (sitecohorts == null)
            {
                throw new System.Exception("sitecohorts should not be null");
            }

            //ReduceDeadPools(sitecohorts, disturbanceType); // moved to RemoveCohort and ReduceBiomass to avoid multiple calls

            // By default, all material is allocated to the woody debris or the litter pool
            float pwoodlost = 0;
            float prootlost = 0;
            float pfollost  = 0;

            Parameter <string> parameter;

            if (disturbanceType != null && PlugIn.TryGetParameter(disturbanceType.Name, out parameter))
            {
                // If parameters are available, then set the loss fractions here.
                if (parameter.ContainsKey("WoodReduction"))
                {
                    pwoodlost = float.Parse(parameter["WoodReduction"]);
                }
                if (parameter.ContainsKey("RootReduction"))
                {
                    prootlost = float.Parse(parameter["RootReduction"]);
                }
                if (parameter.ContainsKey("FolReduction"))
                {
                    pfollost = float.Parse(parameter["FolReduction"]);
                }
            }

            // Add new dead wood and litter
            float woodAdded = (float)((1 - pwoodlost) * cohort.Wood * fraction);
            float rootAdded = (float)((1 - prootlost) * cohort.Root * fraction);
            float folAdded  = (float)((1 - pfollost) * cohort.Fol * fraction);

            ((SiteCohorts)sitecohorts).AddWoodyDebris(woodAdded, cohort.SpeciesPNET.KWdLit);
            ((SiteCohorts)sitecohorts).AddWoodyDebris(rootAdded, cohort.SpeciesPNET.KWdLit);
            ((SiteCohorts)sitecohorts).AddLitter(folAdded, cohort.SpeciesPNET);

            cohort.AccumulateWoodySenescence((int)(woodAdded + rootAdded));
            cohort.AccumulateFoliageSenescence((int)(folAdded));
        }
        //---------------------------------------------------------------------

        /// <summary>
        /// Makes the set of biomass cohorts at a site based on the age cohorts
        /// at the site, using a specified method for computing a cohort's
        /// initial biomass.
        /// </summary>
        /// <param name="ageCohorts">
        /// A sorted list of age cohorts, from oldest to youngest.
        /// </param>
        /// <param name="site">
        /// Site where cohorts are located.
        /// </param>
        /// <param name="initialBiomassMethod">
        /// The method for computing the initial biomass for a new cohort.
        /// </param>

        public static ISiteCohorts MakeBiomassCohorts(List <Landis.Library.AgeOnlyCohorts.ICohort> ageCohorts, ActiveSite site)

        {
            PlugIn.Cohorts[site] = new Library.BiomassCohortsPnET.SiteCohorts();

            Hydrology.Initialize(site);

            Hydrology.AnnualTranspiration[site] = 0;
            CanopyBiomass.CanopyLAI[site]       = 0;

            if (ageCohorts.Count == 0)
            {
                return(PlugIn.Cohorts[site]);
            }

            System.DateTime SpinUpDate = PlugIn.StartDate.AddYears(-(ageCohorts[0].Age) + ((successionTimestep == 1) ? -1 : 0));

            while (SpinUpDate.CompareTo(PlugIn.StartDate) < 0)
            {
                CanopyBiomass.SubCanopyPAR[site] = Static.PAR0[SpinUpDate];

                //  Add those cohorts that were born at the current year
                foreach (Library.AgeOnlyCohorts.ICohort ageonlycohort in ageCohorts)
                {
                    if (PlugIn.StartDate.Year - SpinUpDate.Year == ageonlycohort.Age)
                    {
                        Cohort cohort = new Cohort(ageonlycohort.Species, 1, ConstantParameters.InitialFol, 0, 0, 0, 0, SpinUpDate.Year, true);
                        PlugIn.Cohorts[site].AddNewCohort(cohort);
                        CohortOutput.WriteHeader(site, cohort);
                        SiteOutput.WriteHeader(site);
                    }
                }

                PlugIn.GrowCohorts(site, SpinUpDate, SpinUpDate.AddYears(1), false);

                SpinUpDate = SpinUpDate.AddYears(1);
            }


            return(PlugIn.Cohorts[site]);
        }
        public static void Initialize()
        {
            Parameter <string> PressureHeadCalculationMethod = null;

            if (PlugIn.TryGetParameter(Names.PressureHeadCalculationMethod, out PressureHeadCalculationMethod))
            {
                Parameter <string> p = PlugIn.GetParameter(Names.PressureHeadCalculationMethod);

                pressureheadtable = new PressureHeadSaxton_Rawls();
            }
            else
            {
                string msg = "Missing presciption for calculating pressurehead, expected keyword " + Names.PressureHeadCalculationMethod + " in " + PlugIn.GetParameter(Names.PnETGenericParameters).Value + " or in " + PlugIn.GetParameter(Names.ExtensionName).Value;
                throw new System.Exception(msg);
            }

            PlugIn.ModelCore.UI.WriteLine("Eco\tSoilt\tWiltPnt\tFieldCap(mm)\tFC-WP\tPorosity");
            foreach (IEcoregionPnET eco in EcoregionPnET.Ecoregions)
            {
                if (eco.Active)
                {
                    // Volumetric water content (mm/m) at field capacity
                    //  −33 kPa (or −0.33 bar)
                    // Convert kPA to mH2o (/9.804139432) = 3.37
                    eco.FieldCap = (float)pressureheadtable.CalculateWaterContent(33, eco.SoilType);

                    // Volumetric water content (mm/m) at wilting point
                    //  −1500 kPa (or −15 bar)
                    // Convert kPA to mH2o (/9.804139432) = 153.00
                    eco.WiltPnt = (float)pressureheadtable.CalculateWaterContent(1500, eco.SoilType);

                    // Volumetric water content (mm/m) at porosity
                    eco.Porosity = (float)pressureheadtable.Porosity(eco.SoilType);

                    float f = eco.FieldCap - eco.WiltPnt;
                    PlugIn.ModelCore.UI.WriteLine(eco.Name + "\t" + eco.SoilType + "\t" + eco.WiltPnt + "\t" + eco.FieldCap + "\t" + f + "\t" + eco.Porosity);
                }
            }
        }
Example #7
0
        public void GrowCohorts(DateTime date,
                                DateTime ToTime,
                                bool issuccessionTimestep)
        {
            if (Cohorts == null)
            {
                return;
            }


            while (date.CompareTo(ToTime) < 0)
            {
                PlugIn.SetYear(date.Year);

                if (date.Month == (int)Months.January || canopy == null)
                {
                    canopylaimax = 0;

                    if (cohorts == null)
                    {
                        return;
                    }
                }
                if (date.Month == (int)Months.June)
                {
                    Defoliate(site);
                }

                hydrology.UpdateSiteHydrology(date);

                canopy.Grow(date, site, hydrology, forestfloor, cohorts, siteoutput);

                canopylaimax = canopy.CanopyLAImax;

                foreach (Cohort cohort in canopy.DeadCohorts)
                {
                    DeadCohortAges[cohort.Species].Add(cohort.Age);
                    deadcohorts[cohort.Species]++;
                    Cohorts[cohort.Species].RemoveCohort(cohort, site, null);

                    canopy.ResetDeadCohorts();
                }

                if (issuccessionTimestep)
                {
                    Establishment.ComputeEstablishment(date, this);

                    if (HasSiteOutput)
                    {
                        estoutput.UpdateEstData(date, this);
                    }
                }

                if (HasSiteOutput)
                {
                    siteoutput.UpdateSiteData(date, this);
                    siteoutput.WriteSiteData();
                }
                if (date.Month == (int)Months.December)
                {
                    Cohorts.IncrementCohortsAge();

                    forestfloor.Decompose();
                    forestfloor.Decompose();
                }
                date = date.AddMonths(1);
            }
            if (CohortBiomass.HasDeadCohorts)
            {
                CohortBiomass.HasDeadCohorts = false;
            }
        }
Example #8
0
        public static void Initialize(string fn, SortedDictionary <string, Parameter <string> > parameters)
        {
            Dictionary <string, Parameter <string> > DisturbanceReductionParameters = PlugIn.LoadTable(Names.DisturbanceReductions, Reductions, Disturbances);

            foreach (KeyValuePair <string, Parameter <string> > parameter in DisturbanceReductionParameters)
            {
                if (parameters.ContainsKey(parameter.Key))
                {
                    throw new System.Exception("Parameter " + parameter.Key + " was provided twice");
                }

                foreach (string value in parameter.Value.Values)
                {
                    double v;
                    if (double.TryParse(value, out v) == false)
                    {
                        throw new System.Exception("Expecting digit value for " + parameter.Key);
                    }

                    if (v > 1 || v < 0)
                    {
                        throw new System.Exception("Expecting value for " + parameter.Key + " between 0.0 and 1.0. Found " + v);
                    }
                }
            }
            DisturbanceReductionParameters.ToList().ForEach(x => parameters.Add("disturbance:" + x.Key, x.Value));
        }
        //---------------------------------------------------------------------
        public PressureHeadSaxton_Rawls()
        {
            Landis.Library.Parameters.Ecoregions.AuxParm <string> SoilType     = (Landis.Library.Parameters.Ecoregions.AuxParm <string>)PlugIn.GetParameter(Names.SoilType);
            Landis.Library.Parameters.Ecoregions.AuxParm <float>  RootingDepth = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter(Names.RootingDepth, 0, float.MaxValue);

            table = new Library.Parameters.Ecoregions.AuxParm <float[]>(PlugIn.ModelCore.Ecoregions);

            Sand       = PlugIn.GetParameter("sand");
            Clay       = PlugIn.GetParameter("clay");
            PctOM      = PlugIn.GetParameter("pctOM");
            DensFactor = PlugIn.GetParameter("densFactor");
            Gravel     = PlugIn.GetParameter("gravel");

            foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions)
            {
                if (ecoregion.Active)
                {
                    List <float> PressureHead = new List <float>();

                    if (tensionB.ContainsKey(SoilType[ecoregion]) == false)
                    {
                        double sand       = double.Parse(Sand[SoilType[ecoregion]]);
                        double clay       = double.Parse(Clay[SoilType[ecoregion]]);
                        double pctOM      = double.Parse(PctOM[SoilType[ecoregion]]);
                        double densFactor = double.Parse(DensFactor[SoilType[ecoregion]]);
                        double gravel     = double.Parse(Gravel[SoilType[ecoregion]]);

                        // Moisture at wilting point
                        double predMoist1500    = -0.024 * sand + 0.487 * clay + 0.006 * pctOM + 0.005 * sand * pctOM - 0.013 * clay * pctOM + 0.068 * sand * clay + 0.031;
                        double predMoist1500adj = predMoist1500 + 0.14 * predMoist1500 - 0.02;

                        // Moisture at field capacity
                        double predMoist33     = -0.251 * sand + 0.195 * clay + 0.011 * pctOM + 0.006 * sand * pctOM - 0.027 * clay * pctOM + 0.452 * sand * clay + 0.299;
                        double predMoist33Adj  = predMoist33 + (1.283 * predMoist33 * predMoist33 - 0.374 * predMoist33 - 0.015);
                        double porosMoist33    = 0.278 * sand + 0.034 * clay + 0.022 * pctOM - 0.018 * sand * pctOM - 0.027 * clay * pctOM - 0.584 * sand * clay + 0.078;
                        double porosMoist33Adj = porosMoist33 + (0.636 * porosMoist33 - 0.107);
                        double satPor33        = porosMoist33Adj + predMoist33Adj;
                        double satSandAdj      = -0.097 * sand + 0.043;
                        double sandAdjSat      = satPor33 + satSandAdj;
                        double density_OM      = (1.0 - sandAdjSat) * 2.65;
                        double density_comp    = density_OM * (densFactor);
                        porosity_OM_comp.Add(SoilType[ecoregion], (float)(1.0 - (density_comp / 2.65)));
                        double porosity_change_comp  = (1.0 - density_comp / 2.65) - (1.0 - density_OM / 2.65);
                        double moist33_comp          = predMoist33Adj + 0.2 * porosity_change_comp;
                        double porosity_moist33_comp = porosity_OM_comp[SoilType[ecoregion]] - moist33_comp;
                        double lambda = (Math.Log(moist33_comp) - Math.Log(predMoist1500adj)) / (Math.Log(1500) - Math.Log(33));
                        double gravel_red_sat_cond = (1.0 - gravel) / (1.0 - gravel * (1.0 - 1.5 * (density_comp / 2.65)));
                        double satcond_mmhr        = 1930 * Math.Pow((porosity_moist33_comp), (3.0 - lambda)) * gravel_red_sat_cond;
                        double gravels_vol         = ((density_comp / 2.65) * gravel) / (1 - gravel * (1 - density_comp / 2.65));
                        double bulk_density        = gravels_vol * 2.65 + (1 - gravels_vol) * density_comp; // g/cm3

                        tensionB.Add(SoilType[ecoregion], (float)((Math.Log(1500) - Math.Log(33.0)) / (Math.Log(moist33_comp) - Math.Log(predMoist1500adj))));
                        tensionA.Add(SoilType[ecoregion], (float)Math.Exp(Math.Log(33.0) + (tensionB[SoilType[ecoregion]] * Math.Log(moist33_comp))));

                        // For Permafrost
                        clayProp.Add(SoilType[ecoregion], (float)clay);
                        double cTheta_temp = Constants.cs * (1.0 - porosity_OM_comp[SoilType[ecoregion]]) + Constants.cw * porosity_OM_comp[SoilType[ecoregion]];                                                                 //specific heat of soil	kJ/m3/K
                        cTheta.Add(SoilType[ecoregion], (float)cTheta_temp);
                        double lambda_s_temp = (1.0 - clay) * Constants.lambda_0 + clay * Constants.lambda_clay;                                                                                                                  //thermal conductivity soil	kJ/m/d/K
                        lambda_s.Add(SoilType[ecoregion], (float)lambda_s_temp);
                        double Fs_temp = ((2.0 / 3.0) / (1.0 + Constants.gs * ((lambda_s_temp / Constants.lambda_w) - 1.0))) + ((1.0 / 3.0) / (1.0 + (1.0 - 2.0 * Constants.gs) * ((lambda_s_temp / Constants.lambda_w) - 1.0))); //ratio of solid temp gradient
                        Fs.Add(SoilType[ecoregion], (float)Fs_temp);
                    }
                    double watercontent = 0.0;

                    float pressureHead = float.MaxValue;
                    while (pressureHead > 0.01)
                    {
                        pressureHead = CalculateWaterPressure(watercontent, SoilType[ecoregion]);

                        PressureHead.Add(pressureHead);
                        watercontent += 0.01;
                    }
                    table[ecoregion] = PressureHead.ToArray();
                }
            }
        }