public static List <IEcoregionPnETVariables> GetData(IEcoregionPnET ecoregion, DateTime start, DateTime end) { // Monthly simulation data untill but not including end List <IEcoregionPnETVariables> data = new List <IEcoregionPnETVariables>(); // Date: the last date in the collection of running data DateTime date = new DateTime(start.Ticks); while (end.Ticks > date.Ticks) { if (all_values[ecoregion].ContainsKey(date) == false) { IObservedClimate observedClimate = ObservedClimate.GetData(ecoregion, date); List <ISpeciesPNET> species = PlugIn.SpeciesPnET.AllSpecies.ToList(); IEcoregionPnETVariables ecoregion_variables = new EcoregionPnETVariables(observedClimate, date, wythers, dtemp, species, ecoregion.Latitude); all_values[ecoregion].Add(date, ecoregion_variables); } data.Add(all_values[ecoregion][date]); date = date.AddMonths(1); } return(data); }
public static List <IEcoregionPnETVariables> GetClimateRegionData(IEcoregionPnET ecoregion, DateTime start, DateTime end, Climate.Phase spinupOrfuture) { // Monthly simulation data untill but not including end List <IEcoregionPnETVariables> data = new List <IEcoregionPnETVariables>(); // Date: the last date in the collection of running data DateTime date = new DateTime(start.Ticks); var oldYear = -1; while (end.Ticks > date.Ticks) { if (!all_values[ecoregion].ContainsKey(date)) { if (date.Year != oldYear) { //PlugIn.ModelCore.UI.WriteLine($"Retrieving Climate Library for year {date.Year}."); if (spinupOrfuture == Climate.Phase.Future_Climate) { if (Climate.Future_MonthlyData.ContainsKey(date.Year)) { ClimateRegionData.AnnualWeather[ecoregion] = Climate.Future_MonthlyData[date.Year][ecoregion.Index]; } } else { if (Climate.Spinup_MonthlyData.ContainsKey(date.Year)) { ClimateRegionData.AnnualWeather[ecoregion] = Climate.Spinup_MonthlyData[date.Year][ecoregion.Index]; } } oldYear = date.Year; } var monthlyData = new MonthlyClimateRecord(ecoregion, date); List <ISpeciesPNET> species = PlugIn.SpeciesPnET.AllSpecies.ToList(); IEcoregionPnETVariables ecoregion_variables = new ClimateRegionPnETVariables(monthlyData, date, wythers, dtemp, species, ecoregion.Latitude); all_values[ecoregion].Add(date, ecoregion_variables); } data.Add(all_values[ecoregion][date]); date = date.AddMonths(1); } return(data); }
protected override void AgeCohorts(ActiveSite site, ushort years, int?successionTimestep ) { DateTime date = new DateTime(PlugIn.StartDate.Year + PlugIn.ModelCore.CurrentTime - Timestep, 1, 15); DateTime EndDate = date.AddYears(years); IEcoregionPnET ecoregion_pnet = EcoregionPnET.GetPnETEcoregion(PlugIn.ModelCore.Ecoregion[site]); List <IEcoregionPnETVariables> climate_vars = UsingClimateLibrary ? EcoregionPnET.GetClimateRegionData(ecoregion_pnet, date, EndDate, Climate.Phase.Future_Climate) : EcoregionPnET.GetData(ecoregion_pnet, date, EndDate); sitecohorts[site].Grow(climate_vars); Date = EndDate; }
public void Calculate_Establishment(IEcoregionPnETVariables pnetvars, IEcoregionPnET ecoregion, float PAR, IHydrology hydrology) { foreach (ISpeciesPNET spc in PlugIn.SpeciesPnET.AllSpecies) { if (pnetvars.Tmin > spc.PsnTMin) { float frad = (float)Math.Pow(Cohort.ComputeFrad(PAR, spc.HalfSat), spc.EstRad); float PressureHead = hydrology.GetPressureHead(ecoregion); float fwater = (float)Math.Pow(Cohort.ComputeFWater(spc.H2, spc.H3, spc.H4, PressureHead), spc.EstMoist); float pest = 1 - (float)Math.Pow(1.0 - (frad * fwater), Timestep); if (!spc.PreventEstablishment) { if (pest > _pest[spc]) { _pest[spc] = pest; _fwater[spc] = fwater; _frad[spc] = frad; if (pest > (float)PlugIn.ContinuousUniformRandom()) { if (HasEstablished(spc) == false) { _hasEstablished.Add(spc); } } } } if (establishment_siteoutput != null) { establishment_siteoutput.Add(((int)pnetvars.Year).ToString() + "," + spc.Name + "," + pest + "," + fwater + "," + frad + "," + HasEstablished(spc)); // TODO: win time by reducing calls to write establishment_siteoutput.Write(); } } } }
public static SortedList <float, float> CalculateMonthlySoilTemps(SortedList <float, float> depthTempDict, IEcoregionPnET Ecoregion, int daysOfWinter, float snowPack, IHydrology hydrology, float lastTempBelowSnow) { //SortedList<float, float> depthTempDict = new SortedList<float, float>(); //for permafrost //float lambAir = 0.023f; //float lambIce = 2.29f; //float omega = (float)(2 * Math.PI / 12.0); float[] snowResults = CalculateSnowDepth(daysOfWinter, snowPack); float sno_dep = snowResults[0]; float Psno_kg_m3 = snowResults[1]; if (Ecoregion.Variables.Tave >= 0) { float fracAbove0 = Ecoregion.Variables.Tmax / (Ecoregion.Variables.Tmax - Ecoregion.Variables.Tmin); sno_dep = sno_dep * fracAbove0; } // from CLM model - https://escomp.github.io/ctsm-docs/doc/build/html/tech_note/Soil_Snow_Temperatures/CLM50_Tech_Note_Soil_Snow_Temperatures.html#soil-and-snow-thermal-properties // Eq. 85 - Jordan (1991) //float lambda_Snow = (float)(lambAir + ((0.0000775 * Psno_kg_m3) + (0.000001105 * Math.Pow(Psno_kg_m3, 2))) * (lambIce - lambAir)) * 3.6F * 24F; //(kJ/m/d/K) includes unit conversion from W to kJ //float damping = (float)Math.Sqrt(omega / (2.0F * lambda_Snow)); float damping = CalculateSnowDamping(Psno_kg_m3); float DRz_snow = (float)Math.Exp(-1.0F * sno_dep * damping); // Damping ratio for snow - adapted from Kang et al. (2000) and Liang et al. (2014) // Permafrost calculations - from "Soil thawing worksheet.xlsx" // //if (Ecoregion.Variables.Tave < minMonthlyAvgTemp) // minMonthlyAvgTemp = Ecoregion.Variables.Tave; float porosity = Ecoregion.Porosity / Ecoregion.RootingDepth; //m3/m3 float waterContent = hydrology.Water / Ecoregion.RootingDepth; //m3/m3 float ga = 0.035F + 0.298F * (waterContent / porosity); float Fa = ((2.0F / 3.0F) / (1.0F + ga * ((Constants.lambda_a / Constants.lambda_w) - 1.0F))) + ((1.0F / 3.0F) / (1.0F + (1.0F - 2.0F * ga) * ((Constants.lambda_a / Constants.lambda_w) - 1.0F))); // ratio of air temp gradient float Fs = PressureHeadSaxton_Rawls.GetFs(Ecoregion.SoilType); float lambda_s = PressureHeadSaxton_Rawls.GetLambda_s(Ecoregion.SoilType); float lambda_theta = (Fs * (1.0F - porosity) * lambda_s + Fa * (porosity - waterContent) * Constants.lambda_a + waterContent * Constants.lambda_w) / (Fs * (1.0F - porosity) + Fa * (porosity - waterContent) + waterContent); //soil thermal conductivity (kJ/m/d/K) float D = lambda_theta / PressureHeadSaxton_Rawls.GetCTheta(Ecoregion.SoilType); //m2/day float Dmonth = D * Ecoregion.Variables.DaySpan; // m2/month float ks = Dmonth * 1000000F / (Ecoregion.Variables.DaySpan * (Constants.SecondsPerHour * 24)); // mm2/s float d = (float)Math.Pow((Constants.omega / (2.0F * Dmonth)), (0.5)); float maxDepth = Ecoregion.RootingDepth + Ecoregion.LeakageFrostDepth; float freezeDepth = maxDepth; float testDepth = 0; //if (lastTempBelowSnow == float.MaxValue) //{ // //int mCount = Math.Min(12, data.Count()); // //float tSum = 0; // //foreach (int z in Enumerable.Range(0, mCount)) // //{ // // tSum += data[z].Tave; // //} // //float annualTavg = tSum / mCount; // float tempBelowSnow = Ecoregion.Variables.Tave; // if (sno_dep > 0) // { // tempBelowSnow = annualTavg + (Ecoregion.Variables.Tave - annualTavg) * DRz_snow; // } // lastTempBelowSnow = tempBelowSnow; // while (testDepth <= (maxDepth / 1000.0)) // { // float DRz = (float)Math.Exp(-1.0F * testDepth * d); // adapted from Kang et al. (2000) and Liang et al. (2014) // float zTemp = annualTavg + (tempBelowSnow - annualTavg) * DRz; // depthTempDict[testDepth] = zTemp; // if ((zTemp <= 0) && (testDepth < freezeDepth)) // freezeDepth = testDepth; // testDepth += 0.25F; // } //} //else //{ float tempBelowSnow = Ecoregion.Variables.Tave; if (sno_dep > 0) { tempBelowSnow = lastTempBelowSnow + (Ecoregion.Variables.Tave - lastTempBelowSnow) * DRz_snow; } lastTempBelowSnow = tempBelowSnow; while (testDepth <= (maxDepth / 1000.0)) { float DRz = (float)Math.Exp(-1.0F * testDepth * d); // adapted from Kang et al. (2000) and Liang et al. (2014) float zTemp = depthTempDict[testDepth] + (tempBelowSnow - depthTempDict[testDepth]) * DRz; depthTempDict[testDepth] = zTemp; //if ((zTemp <= 0) && (testDepth < freezeDepth)) // freezeDepth = testDepth; if (testDepth == 0f) { testDepth = 0.10f; } else if (testDepth == 0.10f) { testDepth = 0.25f; } else { testDepth += 0.25F; } } //} return(depthTempDict); }
public float GetPressureHead(IEcoregionPnET ecoregion) { return pressureheadtable[ecoregion, (int)water]; }
// Makes sure that litters are allocated to the appropriate site public static void SetSiteAccessFunctions(SiteCohorts sitecohorts) { Cohort.addlitter = sitecohorts.AddLitter; Cohort.addwoodydebris = sitecohorts.AddWoodyDebris; Cohort.ecoregion = sitecohorts.Ecoregion; }
//--------------------------------------------------------------------- public override void Initialize() { PlugIn.ModelCore.UI.WriteLine("Initializing " + Names.ExtensionName + " version " + typeof(PlugIn).Assembly.GetName().Version); Cohort.DeathEvent += DeathEvent; Globals.InitializeCore(ModelCore, ((Parameter <ushort>)Names.GetParameter(Names.IMAX)).Value); EcoregionData.Initialize(); SiteVars.Initialize(); Landis.Utilities.Directory.EnsureExists("output"); Timestep = ((Parameter <int>)Names.GetParameter(Names.Timestep)).Value; Parameter <string> CohortBinSizeParm = null; if (Names.TryGetParameter(Names.CohortBinSize, out CohortBinSizeParm)) { if (Int32.TryParse(CohortBinSizeParm.Value, out CohortBinSize)) { if (CohortBinSize < Timestep) { throw new System.Exception("CohortBinSize cannot be smaller than Timestep."); } else { PlugIn.ModelCore.UI.WriteLine("Succession timestep = " + Timestep + "; CohortBinSize = " + CohortBinSize + "."); } } else { throw new System.Exception("CohortBinSize is not an integer value."); } } else { CohortBinSize = Timestep; } string Parallel = ((Parameter <string>)Names.GetParameter(Names.Parallel)).Value; if (Parallel == "false") { ParallelThreads = 1; PlugIn.ModelCore.UI.WriteLine(" MaxParallelThreads = " + ParallelThreads.ToString() + "."); } else if (Parallel == "true") { ParallelThreads = -1; PlugIn.ModelCore.UI.WriteLine(" MaxParallelThreads determined by system."); } else { if (Int32.TryParse(Parallel, out ParallelThreads)) { if (ParallelThreads < 1) { throw new System.Exception("Parallel cannot be < 1."); } else { PlugIn.ModelCore.UI.WriteLine(" MaxParallelThreads = " + ParallelThreads.ToString() + "."); } } else { throw new System.Exception("Parallel must be 'true', 'false' or an integer >= 1."); } } this.ThreadCount = ParallelThreads; FTimeStep = 1.0F / Timestep; //Latitude = ((Parameter<float>)PlugIn.GetParameter(Names.Latitude, 0, 90)).Value; // Now an ecoregion parameter ObservedClimate.Initialize(); SpeciesPnET = new SpeciesPnET(); Landis.Library.PnETCohorts.SpeciesParameters.LoadParameters(SpeciesPnET); Hydrology.Initialize(); SiteCohorts.Initialize(); string PARunits = ((Parameter <string>)Names.GetParameter(Names.PARunits)).Value; if (PARunits != "umol" && PARunits != "W/m2") { throw new System.Exception("PARunits are not 'umol' or 'W/m2'."); } InitializeClimateLibrary(); // John McNabb: initialize climate library after EcoregionPnET has been initialized //EstablishmentProbability.Initialize(Timestep); // Not used // Initialize Reproduction routines: Reproduction.SufficientResources = SufficientResources; Reproduction.Establish = Establish; Reproduction.AddNewCohort = AddNewCohort; Reproduction.MaturePresent = MaturePresent; Reproduction.PlantingEstablish = PlantingEstablish; SeedingAlgorithms SeedAlgorithm = (SeedingAlgorithms)Enum.Parse(typeof(SeedingAlgorithms), Names.parameters["SeedingAlgorithm"].Value); base.Initialize(ModelCore, SeedAlgorithm); StartDate = new DateTime(((Parameter <int>)Names.GetParameter(Names.StartYear)).Value, 1, 15); PlugIn.ModelCore.UI.WriteLine("Spinning up biomass or reading from maps..."); string InitialCommunitiesTXTFile = Names.GetParameter(Names.InitialCommunities).Value; string InitialCommunitiesMapFile = Names.GetParameter(Names.InitialCommunitiesMap).Value; InitialCommunitiesSpinup = Names.GetParameter(Names.InitialCommunitiesSpinup).Value; Parameter <string> LitterMapFile; bool litterMapFile = Names.TryGetParameter(Names.LitterMap, out LitterMapFile); Parameter <string> WoodyDebrisMapFile; bool woodyDebrisMapFile = Names.TryGetParameter(Names.WoodyDebrisMap, out WoodyDebrisMapFile); InitializeSites(InitialCommunitiesTXTFile, InitialCommunitiesMapFile, ModelCore); if (litterMapFile) { MapReader.ReadLitterFromMap(LitterMapFile.Value); } if (woodyDebrisMapFile) { MapReader.ReadWoodyDebrisFromMap(WoodyDebrisMapFile.Value); } // Convert PnET cohorts to biomasscohorts ISiteVar <Landis.Library.BiomassCohorts.ISiteCohorts> biomassCohorts = PlugIn.ModelCore.Landscape.NewSiteVar <Landis.Library.BiomassCohorts.ISiteCohorts>(); foreach (ActiveSite site in PlugIn.ModelCore.Landscape) { biomassCohorts[site] = SiteVars.SiteCohorts[site]; if (SiteVars.SiteCohorts[site] != null && biomassCohorts[site] == null) { throw new System.Exception("Cannot convert PnET SiteCohorts to biomass site cohorts"); } } ModelCore.RegisterSiteVar(biomassCohorts, "Succession.BiomassCohorts"); ISiteVar <Landis.Library.AgeOnlyCohorts.ISiteCohorts> AgeCohortSiteVar = PlugIn.ModelCore.Landscape.NewSiteVar <Landis.Library.AgeOnlyCohorts.ISiteCohorts>(); ISiteVar <ISiteCohorts> PnETCohorts = PlugIn.ModelCore.Landscape.NewSiteVar <ISiteCohorts>(); foreach (ActiveSite site in PlugIn.ModelCore.Landscape) { AgeCohortSiteVar[site] = SiteVars.SiteCohorts[site]; PnETCohorts[site] = SiteVars.SiteCohorts[site]; SiteVars.FineFuels[site] = SiteVars.Litter[site].Mass; IEcoregionPnET ecoregion = EcoregionData.GetPnETEcoregion(PlugIn.ModelCore.Ecoregion[site]); IHydrology hydrology = new Hydrology(ecoregion.FieldCap); SiteVars.PressureHead[site] = hydrology.GetPressureHead(ecoregion); if (UsingClimateLibrary) { SiteVars.ExtremeMinTemp[site] = ((float)Enumerable.Min(Climate.Future_MonthlyData[Climate.Future_MonthlyData.Keys.Min()][ecoregion.Index].MonthlyTemp) - (float)(3.0 * ecoregion.WinterSTD)); } else { SiteVars.ExtremeMinTemp[site] = 999; } } ModelCore.RegisterSiteVar(AgeCohortSiteVar, "Succession.AgeCohorts"); ModelCore.RegisterSiteVar(PnETCohorts, "Succession.CohortsPnET"); }
public override void Initialize() { PlugIn.ModelCore.UI.WriteLine("Initializing " + Names.ExtensionName + " version " + typeof(PlugIn).Assembly.GetName().Version); Cohort.DeathEvent += DeathEvent; Litter = PlugIn.ModelCore.Landscape.NewSiteVar <Landis.Library.Biomass.Pool>(); WoodyDebris = PlugIn.ModelCore.Landscape.NewSiteVar <Landis.Library.Biomass.Pool>(); sitecohorts = PlugIn.ModelCore.Landscape.NewSiteVar <SiteCohorts>(); FineFuels = ModelCore.Landscape.NewSiteVar <Double>(); PressureHead = ModelCore.Landscape.NewSiteVar <float>(); ExtremeMinTemp = ModelCore.Landscape.NewSiteVar <float>(); Landis.Utilities.Directory.EnsureExists("output"); Timestep = ((Parameter <int>)GetParameter(Names.Timestep)).Value; Parameter <string> CohortBinSizeParm = null; if (TryGetParameter(Names.CohortBinSize, out CohortBinSizeParm)) { if (Int32.TryParse(CohortBinSizeParm.Value, out CohortBinSize)) { if (CohortBinSize < Timestep) { throw new System.Exception("CohortBinSize cannot be smaller than Timestep."); } else { PlugIn.ModelCore.UI.WriteLine("Succession timestep = " + Timestep + "; CohortBinSize = " + CohortBinSize + "."); } } else { throw new System.Exception("CohortBinSize is not an integer value."); } } else { CohortBinSize = Timestep; } FTimeStep = 1.0F / Timestep; //Latitude = ((Parameter<float>)PlugIn.GetParameter(Names.Latitude, 0, 90)).Value; // Now an ecoregion parameter ObservedClimate.Initialize(); SpeciesPnET = new SpeciesPnET(); EcoregionPnET.Initialize(); Hydrology.Initialize(); SiteCohorts.Initialize(); // John McNabb: initialize climate library after EcoregionPnET has been initialized InitializeClimateLibrary(); EstablishmentProbability.Initialize(Timestep); IMAX = ((Parameter <ushort>)GetParameter(Names.IMAX)).Value; //LeakageFrostDepth = ((Parameter<float>)GetParameter(Names.LeakageFrostDepth)).Value; //Now an ecoregion parameter //PrecipEvents = ((Parameter<float>)GetParameter(Names.PrecipEvents)).Value;// Now an ecoregion parameter // Initialize Reproduction routines: Reproduction.SufficientResources = SufficientResources; Reproduction.Establish = Establish; Reproduction.AddNewCohort = AddNewCohort; Reproduction.MaturePresent = MaturePresent; Reproduction.PlantingEstablish = PlantingEstablish; SeedingAlgorithms SeedAlgorithm = (SeedingAlgorithms)Enum.Parse(typeof(SeedingAlgorithms), parameters["SeedingAlgorithm"].Value); base.Initialize(ModelCore, SeedAlgorithm); StartDate = new DateTime(((Parameter <int>)GetParameter(Names.StartYear)).Value, 1, 15); PlugIn.ModelCore.UI.WriteLine("Spinning up biomass or reading from maps..."); string InitialCommunitiesTXTFile = GetParameter(Names.InitialCommunities).Value; string InitialCommunitiesMapFile = GetParameter(Names.InitialCommunitiesMap).Value; Parameter <string> LitterMapFile; bool litterMapFile = TryGetParameter(Names.LitterMap, out LitterMapFile); Parameter <string> WoodyDebrisMapFile; bool woodyDebrisMapFile = TryGetParameter(Names.WoodyDebrisMap, out WoodyDebrisMapFile); //Console.ReadLine(); InitializeSites(InitialCommunitiesTXTFile, InitialCommunitiesMapFile, ModelCore); if (litterMapFile) { MapReader.ReadLitterFromMap(LitterMapFile.Value); } if (woodyDebrisMapFile) { MapReader.ReadWoodyDebrisFromMap(WoodyDebrisMapFile.Value); } // Convert PnET cohorts to biomasscohorts ISiteVar <Landis.Library.BiomassCohorts.ISiteCohorts> biomassCohorts = PlugIn.ModelCore.Landscape.NewSiteVar <Landis.Library.BiomassCohorts.ISiteCohorts>(); foreach (ActiveSite site in PlugIn.ModelCore.Landscape) { biomassCohorts[site] = sitecohorts[site]; if (sitecohorts[site] != null && biomassCohorts[site] == null) { throw new System.Exception("Cannot convert PnET SiteCohorts to biomass site cohorts"); } } ModelCore.RegisterSiteVar(biomassCohorts, "Succession.BiomassCohorts"); ModelCore.RegisterSiteVar(WoodyDebris, "Succession.WoodyDebris"); ModelCore.RegisterSiteVar(Litter, "Succession.Litter"); ISiteVar <Landis.Library.AgeOnlyCohorts.ISiteCohorts> AgeCohortSiteVar = PlugIn.ModelCore.Landscape.NewSiteVar <Landis.Library.AgeOnlyCohorts.ISiteCohorts>(); ISiteVar <ISiteCohorts> PnETCohorts = PlugIn.ModelCore.Landscape.NewSiteVar <ISiteCohorts>(); foreach (ActiveSite site in PlugIn.ModelCore.Landscape) { AgeCohortSiteVar[site] = sitecohorts[site]; PnETCohorts[site] = sitecohorts[site]; FineFuels[site] = Litter[site].Mass; IEcoregionPnET ecoregion = EcoregionPnET.GetPnETEcoregion(PlugIn.ModelCore.Ecoregion[site]); IHydrology hydrology = new Hydrology(ecoregion.FieldCap); PressureHead[site] = hydrology.GetPressureHead(ecoregion); if (UsingClimateLibrary) { ExtremeMinTemp[site] = ((float)Enumerable.Min(Climate.Future_MonthlyData[Climate.Future_MonthlyData.Keys.Min()][ecoregion.Index].MonthlyTemp) - (float)(3.0 * ecoregion.WinterSTD)); } else { ExtremeMinTemp[site] = 999; } } ModelCore.RegisterSiteVar(AgeCohortSiteVar, "Succession.AgeCohorts"); ModelCore.RegisterSiteVar(PnETCohorts, "Succession.CohortsPnET"); ModelCore.RegisterSiteVar(FineFuels, "Succession.FineFuels"); ModelCore.RegisterSiteVar(PressureHead, "Succession.PressureHead"); ModelCore.RegisterSiteVar(ExtremeMinTemp, "Succession.ExtremeMinTemp"); }
public Dictionary<ISpeciesPNET, float> Calculate_Establishment_Month(IEcoregionPnETVariables pnetvars, IEcoregionPnET ecoregion, float PAR, IHydrology hydrology) { Dictionary<ISpeciesPNET, float> estabDict = new Dictionary<ISpeciesPNET, float>(); foreach (ISpeciesPNET spc in PlugIn.SpeciesPnET.AllSpecies) { if (pnetvars.Tmin > spc.PsnTMin) { float frad = (float)Math.Pow(Cohort.ComputeFrad(PAR, spc.HalfSat), spc.EstRad); float PressureHead = hydrology.GetPressureHead(ecoregion); float fwater = (float)Math.Pow(Cohort.ComputeFWater(spc.H2, spc.H3, spc.H4, PressureHead), spc.EstMoist); float pest = 1 - (float)Math.Pow(1.0 - (frad * fwater), Timestep); estabDict[spc] = pest; if (fwater < _fwater[spc]) { _fwater[spc] = fwater; } if (frad < _frad[spc]) { _frad[spc] = frad; } /*if (establishment_siteoutput != null) { establishment_siteoutput.Add(((int)pnetvars.Year).ToString() + "," + spc.Name + "," + pest + "," + fwater + "," + frad + "," + HasEstablished(spc)); // TODO: win time by reducing calls to write establishment_siteoutput.Write(); } * */ } } return estabDict; }
//--------------------------------------------------------------------- // Get the pressurehead (mmH2O) for the current water content (converted from proportion to percent) public float GetPressureHead(IEcoregionPnET ecoregion) { return(pressureheadtable[ecoregion, (int)Math.Round(water * 100.0)]); }
/*public static void Initialize(int timestep) * { * Timestep = timestep; * * * }*/ public Dictionary <ISpeciesPNET, float> Calculate_Establishment_Month(IEcoregionPnETVariables pnetvars, IEcoregionPnET ecoregion, float PAR, IHydrology hydrology, float minHalfSat, float maxHalfSat, bool invertPest) { Dictionary <ISpeciesPNET, float> estabDict = new Dictionary <ISpeciesPNET, float>(); float halfSatRange = maxHalfSat - minHalfSat; foreach (ISpeciesPNET spc in PlugIn.SpeciesPnET.AllSpecies) { if (pnetvars.Tmin > spc.PsnTMin && pnetvars.Tmax < spc.PsnTMax) { // Adjust HalfSat for CO2 effect float halfSatIntercept = spc.HalfSat - 350 * spc.CO2HalfSatEff; float adjHalfSat = spc.CO2HalfSatEff * pnetvars.CO2 + halfSatIntercept; float frad = (float)(Math.Min(1.0, (Math.Pow(Cohort.ComputeFrad(PAR, adjHalfSat), 2) * (1 / (Math.Pow(spc.EstRad, 2)))))); float adjFrad = frad; // Optional adjustment to invert Pest based on relative halfSat if (invertPest && halfSatRange > 0) { float frad_adj_int = (spc.HalfSat - minHalfSat) / halfSatRange; float frad_slope = (frad_adj_int * 2) - 1; adjFrad = 1 - frad_adj_int + frad * frad_slope; } float PressureHead = hydrology.GetPressureHead(ecoregion); float fwater = (float)(Math.Min(1.0, (Math.Pow(Cohort.ComputeFWater(spc.H1, spc.H2, spc.H3, spc.H4, PressureHead), 2) * (1 / (Math.Pow(spc.EstMoist, 2)))))); float pest = (float)Math.Min(1.0, adjFrad * fwater); estabDict[spc] = pest; _fwater[spc] = fwater; _frad[spc] = adjFrad; } } return(estabDict); }
/*public void Calculate_Establishment(IEcoregionPnETVariables pnetvars, IEcoregionPnET ecoregion, float PAR, IHydrology hydrology) * { * foreach (ISpeciesPNET spc in PlugIn.SpeciesPnET.AllSpecies) * { * * * if (pnetvars.Tmin > spc.PsnTMin) * { * // Adjust HalfSat for CO2 effect * float halfSatIntercept = spc.HalfSat - 350 * spc.CO2HalfSatEff; * float adjHalfSat = spc.CO2HalfSatEff * pnetvars.CO2 + halfSatIntercept; * float frad = (float)Math.Pow(Cohort.ComputeFrad(PAR, adjHalfSat), spc.EstRad); * * * float PressureHead = hydrology.GetPressureHead(ecoregion); * * float fwater = (float)Math.Pow(Cohort.ComputeFWater(spc.H1,spc.H2, spc.H3, spc.H4, PressureHead), spc.EstMoist); * * float pest = 1 - (float)Math.Pow(1.0 - (frad * fwater), Timestep); * if (!spc.PreventEstablishment) * { * if (pest > _pest[spc]) * { * _pest[spc] = pest; * _fwater[spc] = fwater; * _frad[spc] = frad; * * if (pest > (float)PlugIn.ContinuousUniformRandom()) * { * if (HasEstablished(spc) == false) * { * _hasEstablished.Add(spc); * } * * } * * } * } * if (establishment_siteoutput != null) * { * * establishment_siteoutput.Add(((int)pnetvars.Year).ToString() + "," + spc.Name + "," + pest + "," + fwater + "," + frad + "," + HasEstablished(spc)); * * // TODO: win time by reducing calls to write * establishment_siteoutput.Write(); * } * } * } * } */ public Dictionary <ISpeciesPNET, float> Calculate_Establishment_Month(IEcoregionPnETVariables pnetvars, IEcoregionPnET ecoregion, float PAR, IHydrology hydrology, float minHalfSat, float maxHalfSat, bool invertPest) { Dictionary <ISpeciesPNET, float> estabDict = new Dictionary <ISpeciesPNET, float>(); //_fwater = new Dictionary<ISpeciesPNET, float>(); //_pest = new Dictionary<ISpeciesPNET, float>(); //_frad = new Dictionary<ISpeciesPNET, float>(); float halfSatRange = maxHalfSat - minHalfSat; foreach (ISpeciesPNET spc in PlugIn.SpeciesPnET.AllSpecies) { if (pnetvars.Tmin > spc.PsnTMin && pnetvars.Tmax < spc.PsnTMax) { // Adjust HalfSat for CO2 effect float halfSatIntercept = spc.HalfSat - 350 * spc.CO2HalfSatEff; float adjHalfSat = spc.CO2HalfSatEff * pnetvars.CO2 + halfSatIntercept; float frad = (float)(Math.Min(1.0, (Math.Pow(Cohort.ComputeFrad(PAR, adjHalfSat), 2) * (1 / (Math.Pow(spc.EstRad, 2)))))); float adjFrad = frad; // Optional adjustment to invert Pest based on relative halfSat if (invertPest && halfSatRange > 0) { float frad_adj_int = (spc.HalfSat - minHalfSat) / halfSatRange; float frad_slope = (frad_adj_int * 2) - 1; adjFrad = 1 - frad_adj_int + frad * frad_slope; } float PressureHead = hydrology.GetPressureHead(ecoregion); float fwater = (float)(Math.Min(1.0, (Math.Pow(Cohort.ComputeFWater(spc.H1, spc.H2, spc.H3, spc.H4, PressureHead), 2) * (1 / (Math.Pow(spc.EstMoist, 2)))))); //float pest = 1 - (float)Math.Pow(1.0 - (frad * fwater * spc.MaxPest), Timestep); float pest = (float)Math.Min(1.0, adjFrad * fwater); estabDict[spc] = pest; _pest[spc] = pest; _fwater[spc] = fwater; _frad[spc] = adjFrad; /*if (fwater < _fwater[spc]) * { * _fwater[spc] = fwater; * } * if (frad < _frad[spc]) * { * _frad[spc] = frad; * } */ /*if (establishment_siteoutput != null) * { * * establishment_siteoutput.Add(((int)pnetvars.Year).ToString() + "," + spc.Name + "," + pest + "," + fwater + "," + frad + "," + HasEstablished(spc)); * * // TODO: win time by reducing calls to write * establishment_siteoutput.Write(); * } * */ } } return(estabDict); }
public static List<IEcoregionPnETVariables> GetData(IEcoregionPnET ecoregion, DateTime start, DateTime end) { // Monthly simulation data untill but not including end List<IEcoregionPnETVariables> data = new List<IEcoregionPnETVariables>(); // Date: the last date in the collection of running data DateTime date = new DateTime(start.Ticks); while (end.Ticks > date.Ticks) { if (all_values[ecoregion].ContainsKey(date) == false) { IObservedClimate observedClimate = ObservedClimate.GetData(ecoregion, date); List<ISpeciesPNET> species = PlugIn.SpeciesPnET.AllSpecies.ToList(); IEcoregionPnETVariables ecoregion_variables = new EcoregionPnETVariables(observedClimate, date, wythers, dtemp, species); all_values[ecoregion].Add(date, ecoregion_variables); } data.Add(all_values[ecoregion][date]); date = date.AddMonths(1); } return data; }