public static void GrowCohorts(ActiveSite site, DateTime Time, DateTime ToTime, bool issuccessionTimestep) { if (PlugIn.Cohorts[site] == null) { return; } while (Time.CompareTo(ToTime) < 0) { if (Time.Month == 1) { if (issuccessionTimestep && tstep > 1)//&& ClimateDependentData.Data[PlugIn.Date[site]] != null { PlugIn.Cohorts[site].CombineCohorts(site, tstep, Time.Year); } CanopyBiomass.SubCanopyPARmax[site] = float.MinValue; Hydrology.AnnualTranspiration[site] = 0; //CanopyBiomass.DefineAgeLayers(site); CanopyBiomass.DefineBiomassLayers(site); CanopyBiomass.CanopyLAI[site] = 0; PlugIn.Cohorts[site].IncrementCohortsAge(); } Hydrology.UpdateSiteHydrology(Time, site); CanopyBiomass.SimulateCanopy(Time, site); if (issuccessionTimestep) { EstablishmentProbability.Compute(Time, site); } ForestFloor.Decomposition(site); SiteOutput.UpdateSiteData(Time, site); CanopyBiomass.GrossPsn[site] = 0; CanopyBiomass.NetPsn[site] = 0; CanopyBiomass.AutotrophicRespiration[site] = 0; ForestFloor.HeterotrophicRespiration[site] = 0; Hydrology.Transpiration[site] = 0; Time = Time.AddMonths(1); } CanopyBiomass.RemoveDeadCohorts(site); PlugIn.Cohorts[site].UpdateMaturePresent(); SiteOutput.WriteSiteData(site); DisturbanceDefoliation.Defoliate(site); }
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; }
public void SimulateCanopyLayers(DateTime date, int canopylayer, float radiation) { netpsn = 0; grosspsn = 0; lai = 0; if (Cohorts.Count() == 0) { belowcanopyradiation = radiation; } else { belowcanopyradiation = 0; } Shuffle(ref Cohorts); float SumLAI = 0; foreach (CohortBiomass cohortbiomass in Cohorts) { CohortBiomass.GrowTree(date, canopylayer, cohortbiomass, radiation); SumLAI += cohortbiomass.LAI; belowcanopyradiation += cohortbiomass.BelowCanopyRadiation / Cohorts.Count(); netpsn += cohortbiomass.NetPsn; grosspsn += cohortbiomass.GrossPsn; folresp += cohortbiomass.FolResp; Hydrology.SubstractTranspiration(date, cohortbiomass.Site, cohortbiomass.Transpiration); } if (Cohorts.Count() > 0) { lai = SumLAI / (float)Cohorts.Count(); } else { lai = 0; } }
//--------------------------------------------------------------------- /// <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 SiteConditions GetFromKey(uint key) { SiteConditions s = null; if (initialSites.TryGetValue(key, out s) && siteoutput == null) { hydrology = s.hydrology; establishment = s.Establishment; cohorts = new SiteCohorts(); foreach (ISpeciesCohorts speciesCohorts in s.cohorts) { foreach (Cohort cohort in speciesCohorts) { Cohort newcohort = new Cohort(cohort); cohorts.AddNewCohort(newcohort, PlugIn.TStep); } } forestfloor = s.forestfloor; canopylaimax = s.CanopyLAImax; } return(s); }
//--------------------------------------------------------------------- public override void Initialize() { cohorts = PlugIn.ModelCore.Landscape.NewSiteVar <ISiteCohorts>(); BiomassCohorts = new BiomassCohortsSiteVar(cohorts); baseCohorts = new Landis.Library.Biomass.BaseCohortsSiteVar(BiomassCohorts); // Counts added cohorts per site and per species newcohorts = PlugIn.ModelCore.Landscape.NewSiteVar <Landis.Library.Biomass.Species.AuxParm <int> >(); foreach (ActiveSite site in PlugIn.ModelCore.Landscape) { newcohorts[site] = new Landis.Library.Biomass.Species.AuxParm <int>(PlugIn.ModelCore.Species); } PlugIn.ModelCore.RegisterSiteVar(NewCohorts, "Succession.NewCohorts"); PlugIn.ModelCore.RegisterSiteVar(cohorts, "Succession.BiomassCohortsPnET"); PlugIn.ModelCore.RegisterSiteVar(BiomassCohorts, "Succession.BiomassCohorts"); PlugIn.ModelCore.RegisterSiteVar(baseCohorts, "Succession.AgeCohorts"); Edu.Wisc.Forest.Flel.Util.Directory.EnsureExists("output"); CohortOutput.Initialize(parameters); SiteOutput.Initialize(parameters); CohortBiomass.Initialize(parameters); EstablishmentProbability.Initialize(parameters); CanopyBiomass.Initialize(parameters); Static.Initialize(parameters); Hydrology.Initialize(parameters); Timestep = parameters.Timestep; tstep = parameters.Timestep; // Initialize Reproduction routines: // Reproduction.SufficientResources = SufficientLight; Reproduction.Establish = Establish; Reproduction.AddNewCohort = AddNewCohort; Reproduction.MaturePresent = MaturePresent; Reproduction.PlantingEstablish = PlantingEstablish; base.Initialize(modelCore, parameters.SeedAlgorithm); InitialBiomass.Initialize(parameters); Cohort.DeathEvent += CohortDied; // TODO ARJAN !! //Landis.Extension.Succession.Biomass.AgeOnlyDisturbances.Module.Initialize(parameters.AgeOnlyDisturbanceParms); ForestFloor.Initialize(parameters); SiteOutput.Initialize(parameters); StartDate = new System.DateTime(parameters.StartYear, 1, 15); year = StartDate.Year; month = StartDate.Month; InitializeSites(parameters.InitialCommunities, parameters.InitialCommunitiesMap, modelCore); }
public void CalculatePhotosynthesis(DateTime date, ActiveSite site, Hydrology hydrology, ForestFloor forestfloor, SiteOutput siteoutput) { autotrophicrespiration = 0; grosspsn = 0; netpsn = 0; totalnsc = 0; totalroot = 0; totalfoliage=0; totalbiomass = 0; maxbiom = 0; maxage = 0; for (int canopylayer = canopy.Length - 1; canopylayer >= 0; canopylayer--) { for (int ix = 0; ix < IMAX; ix++) { if (canopy[canopylayer] == null) continue; for (int coh = canopy[canopylayer].Count - 1; coh >= 0; coh--) { CohortBiomass CB = canopy[canopylayer][coh]; if (ix == 0) { forestfloor.WoodyDebris.AddMass(CB.WoodSenescence(), KWdLit[CB.Cohort.Species]); forestfloor.Litter.AddMass(CB.FoliageSenescence(date, PlugIn.modelCore.Ecoregion[site], CB.Cohort.Species), ForestFloor.KNwdLitter[PlugIn.modelCore.Ecoregion[site], CB.Cohort.Species]); } float transpiration_lyr = 0; bool cohortisalive = CB.ComputePhotosynthesis(date, PlugIn.modelCore.Ecoregion[site], ix, (int)IMAX, hydrology, ref transpiration_lyr); if (CB.Cohort.Age > MaxAge) maxage = CB.Cohort.Age; if (MaxBiom < CB.Cohort.Biomass) maxbiom = CB.Cohort.Biomass; autotrophicrespiration += CB.Autotrophicrespiration; netpsn += CB.NetPsn; grosspsn += CB.GrossPsn; if (cohortisalive == false) { deadcohorts.Add(CB.Cohort); forestfloor.WoodyDebris.AddMass(CB.Cohort.Biomass, KWdLit[CB.Cohort.Species]); forestfloor.Litter.AddMass(CB.Cohort.Fol, ForestFloor.KNwdLitter[PlugIn.modelCore.Ecoregion[site], CB.Cohort.Species]); } transpiration += transpiration_lyr; if (transpiration_lyr > hydrology.Water) { IncrementIMAX(site, date); return; } else hydrology.SubtractTranspiration(date, transpiration_lyr); if (ix == 0) { totalbiomass += CB.Cohort.Biomass; totalfoliage += CB.Cohort.Fol; totalnsc += CB.Cohort.NSC; totalroot += CB.Cohort.Root; CB.MaintenanceRespiration(PlugIn.modelCore.Ecoregion[site], date); if (siteoutput != null) { //System.Console.WriteLine("WriteCohortData\t" + site.ToString() + "\t" + date.ToString()); CohortOutput.WriteCohortData(date, site, canopy[canopylayer][coh], hydrology.Water); } } } } }//IMAX }
public void Grow(DateTime date, ActiveSite site, Hydrology hydrology, ForestFloor forestfloor, SiteCohorts Cohorts, SiteOutput siteoutput) { SetCanopyLayers(Cohorts, MaxAge, MaxBiom); CalculateRadiationProfile(site, date); CalculatePhotosynthesis(date, site, hydrology, forestfloor, siteoutput); }
public SiteConditions GetFromKey(uint key) { SiteConditions s=null; if (initialSites.TryGetValue(key, out s) && siteoutput == null) { hydrology = s.hydrology; establishment = s.Establishment; cohorts = new SiteCohorts(); foreach (ISpeciesCohorts speciesCohorts in s.cohorts) { foreach (Cohort cohort in speciesCohorts) { Cohort newcohort = new Cohort(cohort); cohorts.AddNewCohort(newcohort, PlugIn.TStep); } } forestfloor = s.forestfloor; canopylaimax = s.CanopyLAImax; } return s; }
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; }
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 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 bool ComputePhotosynthesis(DateTime Date, IEcoregion ecoregion, int ix, int IMAX, Hydrology hydrology, ref float transpiration) { rootalloc = 0; folalloc = 0; woodalloc = 0; releasednsc = 0; netpsn = 0; folresp = 0; grosspsn = 0; if (StaticVariables.Leaf_On[ecoregion, Cohort.Species, Date] == false) { return(true); } fWater = (float)Math.Pow(Math.Max(0, ((hydrology.Water - StaticVariables.WiltingPoint_mm[ecoregion, Cohort.Species]) / (Porosity[ecoregion] - StaticVariables.WiltingPoint_mm[ecoregion, Cohort.Species]))), GrMstSens[Cohort.Species]); if (cohort.Fol > 0) { netpsn = fWater * frad[ix] * fage * StaticVariables.FTempPSN[ecoregion, Cohort.Species, Date] * StaticVariables.RefNetPsn[ecoregion, Cohort.Species, Date] * (cohort.Fol / IMAX); folresp = fWater * StaticVariables.DTempRespDay[ecoregion, Cohort.Species, Date] * StaticVariables.RefResp[ecoregion, Cohort.Species, Date] * (cohort.Fol / IMAX); grosspsn = netpsn + folresp; } //mm // Constants.MCO2 / Constants.MC: gCO2/gC transpiration = (grosspsn * (Constants.MCO2 / Constants.MC)) / StaticVariables.WUE_CO2_corr[ecoregion, Cohort.Species, Date]; if (transpiration > 0) { wue = netpsn / transpiration; } else { wue = 0; } cohort.NSC += netpsn; if (cohort.NSC > (MaxNscFrac * cohort.Biomass)) { releasednsc = cohort.NSC - (MaxNscFrac * cohort.Biomass); } else { releasednsc = Math.Min((DNSC[Cohort.Species] * (1 - frad[0])) / (float)IMAX * cohort.NSC, cohort.NSC); } if (cohort.NSC < 0.01F * cohort.Wood) { hasdeadcohorts = true; return(false); } cohort.NSC -= releasednsc; folalloc = frad[frad.Length - 1] * releasednsc; cohort.Fol += folalloc / ConstantParameters.CFracBiomass; if ((cohort.Root / cohort.Wood) < RtStRatio[Cohort.Species]) { rootalloc = (releasednsc - folalloc) / ConstantParameters.CFracBiomass; cohort.Root += rootalloc; } else { woodalloc = (releasednsc - folalloc) / ConstantParameters.CFracBiomass; //System.Console.WriteLine(cohort.Root / cohort.Wood +"\t" + cohort.Root + "\t" + cohort.Wood + "\t" + RtStRatio[spc] + "\twoodalloc " + woodalloc); cohort.Wood += woodalloc; } return(true); }
public bool ComputePhotosynthesis(DateTime Date, IEcoregion ecoregion, int ix, int IMAX, Hydrology hydrology, ref float transpiration) { rootalloc = 0; folalloc = 0; woodalloc = 0; releasednsc = 0; netpsn = 0; folresp = 0; grosspsn = 0; if (StaticVariables.Leaf_On[ecoregion, Cohort.Species, Date] == false) return true; fWater = (float)Math.Pow(Math.Max(0, ((hydrology.Water - StaticVariables.WiltingPoint_mm[ecoregion, Cohort.Species]) / (Porosity[ecoregion] - StaticVariables.WiltingPoint_mm[ecoregion, Cohort.Species]))), GrMstSens[Cohort.Species]); if (cohort.Fol > 0) { netpsn = fWater * frad[ix] * fage * StaticVariables.FTempPSN[ecoregion, Cohort.Species, Date] * StaticVariables.RefNetPsn[ecoregion, Cohort.Species, Date] * (cohort.Fol / IMAX); folresp = fWater * StaticVariables.DTempRespDay[ecoregion, Cohort.Species, Date] * StaticVariables.RefResp[ecoregion, Cohort.Species, Date] * (cohort.Fol / IMAX); grosspsn = netpsn + folresp; } //mm // Constants.MCO2 / Constants.MC: gCO2/gC transpiration = (grosspsn * (Constants.MCO2 / Constants.MC)) / StaticVariables.WUE_CO2_corr[ecoregion, Cohort.Species, Date]; if (transpiration > 0) wue = netpsn / transpiration; else wue = 0; cohort.NSC += netpsn; if (cohort.NSC > (MaxNscFrac * cohort.Biomass)) releasednsc = cohort.NSC - (MaxNscFrac * cohort.Biomass); else releasednsc = Math.Min((DNSC[Cohort.Species] * (1 - frad[0])) / (float)IMAX * cohort.NSC, cohort.NSC); if (cohort.NSC < 0.01F * cohort.Wood) { hasdeadcohorts = true; return false; } cohort.NSC -= releasednsc; folalloc = frad[frad.Length - 1] * releasednsc; cohort.Fol += folalloc / ConstantParameters.CFracBiomass; if ((cohort.Root / cohort.Wood) < RtStRatio[Cohort.Species]) { rootalloc = (releasednsc - folalloc) / ConstantParameters.CFracBiomass; cohort.Root += rootalloc; } else { woodalloc = (releasednsc - folalloc) / ConstantParameters.CFracBiomass; //System.Console.WriteLine(cohort.Root / cohort.Wood +"\t" + cohort.Root + "\t" + cohort.Wood + "\t" + RtStRatio[spc] + "\twoodalloc " + woodalloc); cohort.Wood += woodalloc; } return true; }
//--------------------------------------------------------------------- public override void Initialize() { PlugIn.ModelCore.UI.WriteLine("Initializing " + ExtensionName + " version " + typeof(PlugIn).Assembly.GetName().Version); /*Testing * Landis.Library.BiomassCohorts.Cohort C; * Cohort D; * * C = (Landis.Library.BiomassCohorts.Cohort)D; */ hassiteoutput = parameters.HasSiteOutput; siteconditions = PlugIn.ModelCore.Landscape.NewSiteVar <SiteConditions>(); Edu.Wisc.Forest.Flel.Util.Directory.EnsureExists("output"); //CohortOutput.Initialize(parameters); Hydrology.Initialize(parameters); StaticVariables.InitializeStatic(parameters); ForestFloor.Initialize(parameters); SiteConditions.Initialize(parameters); CohortBiomass.Initialize(parameters); Timestep = parameters.Timestep; tstep = parameters.Timestep; // Initialize Reproduction routines: Reproduction.SufficientResources = SufficientResources; Reproduction.Establish = Establish; Reproduction.AddNewCohort = AddNewCohort; Reproduction.MaturePresent = MaturePresent; Reproduction.PlantingEstablish = PlantingEstablish; base.Initialize(modelCore, parameters.SeedAlgorithm); Cohort.DeathEvent += CohortDied; StartDate = new System.DateTime(parameters.StartYear, 1, 15); year = StartDate.Year; month = StartDate.Month; InitializeSites(parameters.InitialCommunities, parameters.InitialCommunitiesMap, modelCore); EstablishmentProbability.Initialize(parameters); ISiteVar <ISiteCohorts> cohorts = PlugIn.ModelCore.Landscape.NewSiteVar <ISiteCohorts>(); foreach (ActiveSite site in PlugIn.modelCore.Landscape) { cohorts[site] = siteconditions[site].Cohorts; } BiomassCohorts = new BiomassCohortsSiteVar(cohorts); baseCohorts = new Landis.Library.Biomass.BaseCohortsSiteVar(BiomassCohorts); PlugIn.ModelCore.RegisterSiteVar(BiomassCohorts, "Succession.BiomassCohorts"); PlugIn.ModelCore.RegisterSiteVar(siteconditions, "Succession.SiteConditionsPnET"); PlugIn.ModelCore.RegisterSiteVar(baseCohorts, "Succession.AgeCohorts"); ISiteVar <Pool> WoodyDebris = PlugIn.ModelCore.Landscape.NewSiteVar <Pool>(); foreach (ActiveSite site in PlugIn.modelCore.Landscape) { WoodyDebris[site] = siteconditions[site].WoodyDebris; } PlugIn.ModelCore.RegisterSiteVar(WoodyDebris, "Succession.WoodyDebris"); ISiteVar <Pool> Litter = PlugIn.ModelCore.Landscape.NewSiteVar <Pool>(); foreach (ActiveSite site in PlugIn.modelCore.Landscape) { Litter[site] = siteconditions[site].WoodyDebris; } PlugIn.ModelCore.RegisterSiteVar(Litter, "Succession.Litter"); }
public void CalculatePhotosynthesis(DateTime date, ActiveSite site, Hydrology hydrology, ForestFloor forestfloor, SiteOutput siteoutput) { autotrophicrespiration = 0; grosspsn = 0; netpsn = 0; totalnsc = 0; totalroot = 0; totalfoliage = 0; totalbiomass = 0; maxbiom = 0; maxage = 0; for (int canopylayer = canopy.Length - 1; canopylayer >= 0; canopylayer--) { for (int ix = 0; ix < IMAX; ix++) { if (canopy[canopylayer] == null) { continue; } for (int coh = canopy[canopylayer].Count - 1; coh >= 0; coh--) { CohortBiomass CB = canopy[canopylayer][coh]; if (ix == 0) { forestfloor.WoodyDebris.AddMass(CB.WoodSenescence(), KWdLit[CB.Cohort.Species]); forestfloor.Litter.AddMass(CB.FoliageSenescence(date, PlugIn.modelCore.Ecoregion[site], CB.Cohort.Species), ForestFloor.KNwdLitter[PlugIn.modelCore.Ecoregion[site], CB.Cohort.Species]); } float transpiration_lyr = 0; bool cohortisalive = CB.ComputePhotosynthesis(date, PlugIn.modelCore.Ecoregion[site], ix, (int)IMAX, hydrology, ref transpiration_lyr); if (CB.Cohort.Age > MaxAge) { maxage = CB.Cohort.Age; } if (MaxBiom < CB.Cohort.Biomass) { maxbiom = CB.Cohort.Biomass; } autotrophicrespiration += CB.Autotrophicrespiration; netpsn += CB.NetPsn; grosspsn += CB.GrossPsn; if (cohortisalive == false) { deadcohorts.Add(CB.Cohort); forestfloor.WoodyDebris.AddMass(CB.Cohort.Biomass, KWdLit[CB.Cohort.Species]); forestfloor.Litter.AddMass(CB.Cohort.Fol, ForestFloor.KNwdLitter[PlugIn.modelCore.Ecoregion[site], CB.Cohort.Species]); } transpiration += transpiration_lyr; if (transpiration_lyr > hydrology.Water) { IncrementIMAX(site, date); return; } else { hydrology.SubtractTranspiration(date, transpiration_lyr); } if (ix == 0) { totalbiomass += CB.Cohort.Biomass; totalfoliage += CB.Cohort.Fol; totalnsc += CB.Cohort.NSC; totalroot += CB.Cohort.Root; CB.MaintenanceRespiration(PlugIn.modelCore.Ecoregion[site], date); if (siteoutput != null) { //System.Console.WriteLine("WriteCohortData\t" + site.ToString() + "\t" + date.ToString()); CohortOutput.WriteCohortData(date, site, canopy[canopylayer][coh], hydrology.Water); } } } } }//IMAX }
public void Grow(DateTime date, ActiveSite site, Hydrology hydrology, ForestFloor forestfloor, SiteCohorts Cohorts, SiteOutput siteoutput) { SetCanopyLayers(Cohorts, MaxAge, MaxBiom); CalculateRadiationProfile(site, date); CalculatePhotosynthesis(date, site, hydrology, forestfloor, siteoutput); }