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>(); } }
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); }
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); } } }
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; } }
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(); } } }