//--------------------------------------------------------------------- public void WriteLogEntry(ManagementArea mgmtArea, Stand stand) { int damagedSites = 0; int cohortsDamaged = 0; int standPrescriptionNumber = 0; foreach (ActiveSite site in stand) { //set the prescription name for this site if (SiteVars.Prescription[site] != null) { standPrescriptionNumber = SiteVars.Prescription[site].Number; SiteVars.PrescriptionName[site] = SiteVars.Prescription[site].Name; SiteVars.TimeOfLastEvent[site] = PlugIn.ModelCore.CurrentTime; } int cohortsDamagedAtSite = SiteVars.CohortsDamaged[site]; cohortsDamaged += cohortsDamagedAtSite; if (cohortsDamagedAtSite > 0) { damagedSites++; } } totalSites[standPrescriptionNumber] += stand.SiteCount; totalDamagedSites[standPrescriptionNumber] += damagedSites; //csv string for log file, contains species kill count string species_count = ""; //if this is the right species match, add it's count to the csv string foreach (ISpecies species in PlugIn.ModelCore.Species) { bool assigned = false; //loop through dictionary of species kill count foreach (KeyValuePair<string, int> kvp in stand.DamageTable) { if (species.Name == kvp.Key) { assigned = true; species_count += kvp.Value + ","; totalSpeciesCohorts[standPrescriptionNumber, species.Index] += kvp.Value; } } if (!assigned) { //put a 0 there if it's not assigned (because none were found in the dictionary) species_count += "0,"; } } //now that the damage table for this stand has been recorded, clear it!! stand.ClearDamageTable(); //write to log file: //current time //management area's map code //the prescription that caused this harvest //stand's map code //stand's age //stand's current rank //total sites in the stand //damaged sites from this stand //cohorts killed in this stand, by this harvest //and only record stands where a site has been damaged log.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", PlugIn.ModelCore.CurrentTime, mgmtArea.MapCode, stand.PrescriptionName, stand.MapCode, stand.EventId, stand.Age, stand.HarvestedRank, stand.SiteCount, damagedSites, cohortsDamaged, species_count); }
//--------------------------------------------------------------------- /// <summary> /// Harvests a stand (and possibly its neighbors) according to the /// prescription's site-selection method. /// </summary> /// <returns> /// The area that was harvested (units: hectares). /// </returns> // This is called by AppliedPrescription public virtual void Harvest(Stand stand) { if (isDebugEnabled) log.DebugFormat(" Harvesting stand {0} by {1} ...", stand.MapCode, Name); //set prescription name for stand stand.PrescriptionName = this.Name; stand.HarvestedRank = AppliedPrescription.CurrentRank; stand.LastPrescription = this; stand.MinTimeSinceDamage = this.minTimeSinceDamage; //set current stand currentStand = stand; currentStand.ClearDamageTable(); // SelectSites(stand) is where either complete, complete stand spreading, or partial stand // spreading are activated. // tjs - This is what gets the sites that will be harvested foreach (ActiveSite site in siteSelector.SelectSites(stand)) { // Site selection may have spread to other stands beyond the // original stand. Stand standForCurrentSite = SiteVars.Stand[site]; if (isDebugEnabled) log.DebugFormat(" Cutting cohorts at {0} in stand {1}{2}", site, SiteVars.Stand[site].MapCode, (standForCurrentSite == stand) ? "" : string.Format(" (initial stand {0})", stand.MapCode)); cohortCutter.Cut(site, cohortCounts); if (cohortCounts.AllSpecies > 0) { SiteVars.CohortsDamaged[site] = cohortCounts.AllSpecies; standForCurrentSite.DamageTable.IncrementCounts(cohortCounts); stand.LastAreaHarvested += Model.Core.CellArea; SiteVars.Prescription[site] = this; if (isDebugEnabled) log.DebugFormat(" # of cohorts damaged = {0}; stand.LastAreaHarvested = {1}", SiteVars.CohortsDamaged[site], stand.LastAreaHarvested); } if (speciesToPlant != null) Reproduction.ScheduleForPlanting(speciesToPlant, site); } return; }
//--------------------------------------------------------------------- public void WriteLogEntry(ManagementArea mgmtArea, Stand stand) { int damagedSites = 0; int cohortsDamaged = 0; int cohortsKilled = 0; int standPrescriptionNumber = 0; double biomassRemoved = 0.0; double biomassRemovedPerHa = 0.0; //ModelCore.UI.WriteLine("BiomassHarvest: PlugIn.cs: WriteLogEntry: mgmtArea {0}, Stand {1} ", mgmtArea.Prescriptions.Count, stand.MapCode); foreach (ActiveSite site in stand) { //set the prescription name for this site if (BaseHarvest.SiteVars.Prescription[site] != null) { standPrescriptionNumber = BaseHarvest.SiteVars.Prescription[site].Number; BaseHarvest.SiteVars.PrescriptionName[site] = BaseHarvest.SiteVars.Prescription[site].Name; BaseHarvest.SiteVars.TimeOfLastEvent[site] = modelCore.CurrentTime; } cohortsDamaged += SiteVars.CohortsPartiallyDamaged[site]; cohortsKilled += BaseHarvest.SiteVars.CohortsDamaged[site]; if (SiteVars.CohortsPartiallyDamaged[site] > 0 || BaseHarvest.SiteVars.CohortsDamaged[site] > 0) { damagedSites++; //Conversion from [g m-2] to [Mg ha-1] to [Mg] biomassRemoved += SiteVars.BiomassRemoved[site] / 100.0 * modelCore.CellArea; } } totalSites[standPrescriptionNumber] += stand.SiteCount; totalDamagedSites[standPrescriptionNumber] += damagedSites; totalCohortsDamaged[standPrescriptionNumber] += cohortsDamaged; totalCohortsKilled[standPrescriptionNumber] += cohortsKilled; //csv string for log file, contains species kill count string species_count = ""; //if this is the right species match, add it's count to the csv string foreach (ISpecies species in modelCore.Species) { bool assigned = false; //loop through dictionary of species kill count foreach (KeyValuePair<string, int> kvp in stand.DamageTable) { if (species.Name == kvp.Key) { assigned = true; species_count += "," + kvp.Value; totalSpeciesCohorts[standPrescriptionNumber, species.Index] += kvp.Value; } } if (!assigned) { //put a 0 there if it's not assigned (because none were found in the dictionary) species_count += ",0"; totalSpeciesCohorts[standPrescriptionNumber, species.Index] += 0; } } //now that the damage table for this stand has been recorded, clear it!! stand.ClearDamageTable(); //write to log file: biomassRemovedPerHa = biomassRemoved / (double) damagedSites / modelCore.CellArea; if(biomassRemoved <= 0.0) return; log.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9:0.000},{10:0.000},{11},{12}{13}", modelCore.CurrentTime, mgmtArea.MapCode, stand.PrescriptionName, stand.MapCode, stand.EventId, stand.Age, stand.HarvestedRank, stand.SiteCount, damagedSites, biomassRemoved, // Mg biomassRemovedPerHa, // Mg/ha cohortsDamaged, cohortsKilled, species_count); }
//--------------------------------------------------------------------- /// <summary> /// Harvests a stand (and possibly its neighbors) according to the /// prescription's site-selection method. /// </summary> /// <returns> /// The area that was harvested (units: hectares). /// </returns> public virtual double Harvest(Stand stand) { //UI.WriteLine("{0} HARVESTING STAND {1}, set-aside = {2}", this.Name, stand.MapCode, stand.IsSetAside); //set prescription name for stand stand.PrescriptionName = this.Name; stand.HarvestedRank = PlugIn.CurrentRank; //set current stand currentStand = stand; currentStand.ClearDamageTable(); foreach (ActiveSite site in siteSelector.SelectSites(stand)) { currentSite = site; ISiteCohorts cohorts = Model.LandscapeCohorts[site]; cohorts.DamageBy(this); SiteVars.Prescription[site] = this; if (speciesToPlant != null) Succession.Reproduction.ScheduleForPlanting(speciesToPlant, site); } return siteSelector.AreaSelected; }
//--------------------------------------------------------------------- /// <summary> /// Harvests a stand (and possibly its neighbors) according to the /// prescription's site-selection method. /// </summary> /// <returns> /// The area that was harvested (units: hectares). /// </returns> // This is called by AppliedPrescription public virtual void Harvest(Stand stand) { //set prescription name for stand stand.PrescriptionName = this.Name; stand.HarvestedRank = PlugIn.CurrentRank; stand.LastPrescription = this; stand.MinTimeSinceDamage = this.minTimeSinceDamage; //set current stand currentStand = stand; currentStand.ClearDamageTable(); // SelectSites(stand) is where either complete, complete stand spreading, or partial stand // spreading are activated. // tjs - This is what gets the sites that will be harvested foreach (ActiveSite site in siteSelector.SelectSites(stand)) { currentSite = site; SiteVars.Cohorts[site].RemoveMarkedCohorts(this); // In order for easement prescriptions to properly "spread", we need to count // each site in its area harvested even if no cohorts are damaged. //if (SiteVars.CohortsDamaged[site] > 0) { stand.LastAreaHarvested += PlugIn.ModelCore.CellArea; } // With land-use, a prescription doesn't necessarily damage a site's cohorts // (for example, an easement prescription). So, always assign the current // prescription to the site, regardless if any cohorts were damaged. This // will cause the prescription to appear on the timestep's prescription map. SiteVars.Prescription[site] = this; if (speciesToPlant != null) Reproduction.ScheduleForPlanting(speciesToPlant, site); if (landUseAfterHarvest != null) LandUse.SiteVar[site] = landUseAfterHarvest; } return; }
//--------------------------------------------------------------------- public void WriteLogEntry(ManagementArea mgmtArea, Stand stand) { int damagedSites = 0; int cohortsDamaged = 0; int cohortsKilled = 0; int standPrescriptionNumber = 0; double biomassRemoved = 0.0; double biomassRemovedPerHa = 0.0; IDictionary <ISpecies, double> totalBiomassBySpecies = new Dictionary <ISpecies, double>(); //ModelCore.UI.WriteLine("BiomassHarvest: PlugIn.cs: WriteLogEntry: mgmtArea {0}, Stand {1} ", mgmtArea.Prescriptions.Count, stand.MapCode); foreach (ActiveSite site in stand) { //set the prescription name for this site if (HarvestMgmtLib.SiteVars.Prescription[site] != null) { standPrescriptionNumber = HarvestMgmtLib.SiteVars.Prescription[site].Number; HarvestMgmtLib.SiteVars.PrescriptionName[site] = HarvestMgmtLib.SiteVars.Prescription[site].Name; HarvestMgmtLib.SiteVars.TimeOfLastEvent[site] = modelCore.CurrentTime; } cohortsDamaged += Landis.Library.BiomassHarvest.SiteVars.CohortsPartiallyDamaged[site]; cohortsKilled += (HarvestMgmtLib.SiteVars.CohortsDamaged[site] - Landis.Library.BiomassHarvest.SiteVars.CohortsPartiallyDamaged[site]); if (Landis.Library.BiomassHarvest.SiteVars.CohortsPartiallyDamaged[site] > 0 || HarvestMgmtLib.SiteVars.CohortsDamaged[site] > 0) { damagedSites++; //Conversion from [g m-2] to [Mg ha-1] to [Mg] biomassRemoved += SiteVars.BiomassRemoved[site] / 100.0 * modelCore.CellArea; IDictionary <ISpecies, int> siteBiomassBySpecies = SiteVars.BiomassBySpecies[site]; if (siteBiomassBySpecies != null) { // Sum up total biomass for each species foreach (ISpecies species in modelCore.Species) { int addValue = 0; siteBiomassBySpecies.TryGetValue(species, out addValue); double oldValue; if (totalBiomassBySpecies.TryGetValue(species, out oldValue)) { totalBiomassBySpecies[species] += addValue / 100.0 * modelCore.CellArea; } else { totalBiomassBySpecies.Add(species, addValue / 100.0 * modelCore.CellArea); } } } } } totalSites[standPrescriptionNumber] += stand.SiteCount; totalDamagedSites[standPrescriptionNumber] += damagedSites; totalCohortsDamaged[standPrescriptionNumber] += cohortsDamaged; totalCohortsKilled[standPrescriptionNumber] += cohortsKilled; totalBiomassRemoved[standPrescriptionNumber] += biomassRemoved; double[] species_cohorts = new double[modelCore.Species.Count]; double[] species_biomass = new double[modelCore.Species.Count]; double biomass_value; foreach (ISpecies species in modelCore.Species) { int cohortCount = stand.DamageTable[species]; species_cohorts[species.Index] = cohortCount; totalSpeciesCohorts[standPrescriptionNumber, species.Index] += cohortCount; totalBiomassBySpecies.TryGetValue(species, out biomass_value); species_biomass[species.Index] = biomass_value; totalSpeciesBiomass[standPrescriptionNumber, species.Index] += biomass_value; } //now that the damage table for this stand has been recorded, clear it!! stand.ClearDamageTable(); //write to log file: if (biomassRemoved > 0.0) { biomassRemovedPerHa = biomassRemoved / (double)damagedSites / modelCore.CellArea; } eventLog.Clear(); EventsLog el = new EventsLog(); el.Time = modelCore.CurrentTime; el.ManagementArea = mgmtArea.MapCode; el.Prescription = stand.PrescriptionName; el.Stand = stand.MapCode; el.EventID = stand.EventId; el.StandAge = stand.Age; el.StandRank = Convert.ToInt32(stand.HarvestedRank); el.NumberOfSites = stand.SiteCount; el.HarvestedSites = damagedSites; el.MgBiomassRemoved = biomassRemoved; el.MgBioRemovedPerDamagedHa = biomassRemovedPerHa; el.TotalCohortsPartialHarvest = cohortsDamaged; el.TotalCohortsCompleteHarvest = cohortsKilled; el.CohortsHarvested_ = species_cohorts; el.BiomassHarvestedMg_ = species_biomass; eventLog.AddObject(el); eventLog.WriteToFile(); }
//--------------------------------------------------------------------- public void WriteLogEntry(ManagementArea mgmtArea, Stand stand) { int damagedSites = 0; int cohortsDamaged = 0; int cohortsKilled = 0; int standPrescriptionNumber = 0; double biomassRemoved = 0.0; double biomassRemovedPerHa = 0.0; //ModelCore.UI.WriteLine("BiomassHarvest: PlugIn.cs: WriteLogEntry: mgmtArea {0}, Stand {1} ", mgmtArea.Prescriptions.Count, stand.MapCode); foreach (ActiveSite site in stand) { //set the prescription name for this site if (HarvestMgmtLib.SiteVars.Prescription[site] != null) { standPrescriptionNumber = HarvestMgmtLib.SiteVars.Prescription[site].Number; HarvestMgmtLib.SiteVars.PrescriptionName[site] = HarvestMgmtLib.SiteVars.Prescription[site].Name; HarvestMgmtLib.SiteVars.TimeOfLastEvent[site] = modelCore.CurrentTime; } cohortsDamaged += SiteVars.CohortsPartiallyDamaged[site]; cohortsKilled += HarvestMgmtLib.SiteVars.CohortsDamaged[site]; if (SiteVars.CohortsPartiallyDamaged[site] > 0 || HarvestMgmtLib.SiteVars.CohortsDamaged[site] > 0) { damagedSites++; //Conversion from [g m-2] to [Mg ha-1] to [Mg] biomassRemoved += SiteVars.BiomassRemoved[site] / 100.0 * modelCore.CellArea; } } totalSites[standPrescriptionNumber] += stand.SiteCount; totalDamagedSites[standPrescriptionNumber] += damagedSites; totalCohortsDamaged[standPrescriptionNumber] += cohortsDamaged; totalCohortsKilled[standPrescriptionNumber] += cohortsKilled; //csv string for log file, contains species kill count string species_count = ""; foreach (ISpecies species in modelCore.Species) { int cohortCount = stand.DamageTable[species]; species_count += string.Format("{0},", cohortCount); totalSpeciesCohorts[standPrescriptionNumber, species.Index] += cohortCount; } //now that the damage table for this stand has been recorded, clear it!! stand.ClearDamageTable(); //write to log file: biomassRemovedPerHa = biomassRemoved / (double) damagedSites / modelCore.CellArea; if(biomassRemoved <= 0.0) return; log.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9:0.000},{10:0.000},{11},{12}{13}", modelCore.CurrentTime, mgmtArea.MapCode, stand.PrescriptionName, stand.MapCode, stand.EventId, stand.Age, stand.HarvestedRank, stand.SiteCount, damagedSites, biomassRemoved, // Mg biomassRemovedPerHa, // Mg/ha cohortsDamaged, cohortsKilled, species_count); }
//--------------------------------------------------------------------- /// <summary> /// Harvests a stand (and possibly its neighbors) according to the /// prescription's site-selection method. /// </summary> /// <returns> /// The area that was harvested (units: hectares). /// </returns> // This is called by AppliedPrescription public virtual void Harvest(Stand stand) { //set prescription name for stand stand.PrescriptionName = this.Name; stand.HarvestedRank = PlugIn.CurrentRank; stand.LastPrescription = this; stand.MinTimeSinceDamage = this.minTimeSinceDamage; //set current stand currentStand = stand; currentStand.ClearDamageTable(); // SelectSites(stand) is where either complete, complete stand spreading, or partial stand // spreading are activated. // tjs - This is what gets the sites that will be harvested foreach (ActiveSite site in siteSelector.SelectSites(stand)) { currentSite = site; SiteVars.Cohorts[site].RemoveMarkedCohorts(this); if (SiteVars.CohortsDamaged[site] > 0) { stand.LastAreaHarvested += PlugIn.ModelCore.CellArea; SiteVars.Prescription[site] = this; } if (speciesToPlant != null) Reproduction.ScheduleForPlanting(speciesToPlant, site); } return; }
//--------------------------------------------------------------------- public void WriteLogEntry(ManagementArea mgmtArea, Stand stand) { int damagedSites = 0; int cohortsDamaged = 0; int standPrescriptionNumber = 0; foreach (ActiveSite site in stand) { //set the prescription name for this site if (SiteVars.Prescription[site] != null) { standPrescriptionNumber = SiteVars.Prescription[site].Number; SiteVars.PrescriptionName[site] = SiteVars.Prescription[site].Name; SiteVars.TimeOfLastEvent[site] = PlugIn.ModelCore.CurrentTime; } int cohortsDamagedAtSite = SiteVars.CohortsDamaged[site]; cohortsDamaged += cohortsDamagedAtSite; if (cohortsDamagedAtSite > 0) { damagedSites++; } } totalSites[standPrescriptionNumber] += stand.SiteCount; totalDamagedSites[standPrescriptionNumber] += damagedSites; //csv string for log file, contains species kill count string species_count = ""; foreach (ISpecies species in PlugIn.ModelCore.Species) { int cohortCount = stand.DamageTable[species]; species_count += string.Format("{0},", cohortCount); totalSpeciesCohorts[standPrescriptionNumber, species.Index] += cohortCount; } //now that the damage table for this stand has been recorded, clear it!! stand.ClearDamageTable(); //write to log file: //current time //management area's map code //the prescription that caused this harvest //stand's map code //stand's age //stand's current rank //total sites in the stand //damaged sites from this stand //cohorts killed in this stand, by this harvest //and only record stands where a site has been damaged log.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", PlugIn.ModelCore.CurrentTime, mgmtArea.MapCode, stand.PrescriptionName, stand.MapCode, stand.EventId, stand.Age, stand.HarvestedRank, stand.SiteCount, damagedSites, cohortsDamaged, species_count); }
//--------------------------------------------------------------------- public void WriteLogEntry(ManagementArea mgmtArea, Stand stand) { int damagedSites = 0; int cohortsDamaged = 0; int cohortsKilled = 0; int standPrescriptionNumber = 0; double biomassRemoved = 0.0; double biomassRemovedPerHa = 0.0; foreach (ActiveSite site in stand) { //set the prescription name for this site if (BaseHarvest.SiteVars.Prescription[site] != null) { standPrescriptionNumber = BaseHarvest.SiteVars.Prescription[site].Number; BaseHarvest.SiteVars.PrescriptionName[site] = BaseHarvest.SiteVars.Prescription[site].Name; BaseHarvest.SiteVars.TimeOfLastEvent[site] = modelCore.CurrentTime; } cohortsDamaged += SiteVars.CohortsPartiallyDamaged[site]; cohortsKilled += BaseHarvest.SiteVars.CohortsDamaged[site]; if (SiteVars.CohortsPartiallyDamaged[site] > 0 || BaseHarvest.SiteVars.CohortsDamaged[site] > 0) { damagedSites++; //Conversion from [g m-2] to [Mg] biomassRemoved += SiteVars.BiomassRemoved[site] / 100.0 * modelCore.CellArea; } } totalSites[standPrescriptionNumber] += stand.SiteCount; totalDamagedSites[standPrescriptionNumber] += damagedSites; totalCohortsDamaged[standPrescriptionNumber] += cohortsDamaged; totalCohortsKilled[standPrescriptionNumber] += cohortsKilled; //string for log file, contains species harvest count double[] species_count = new double[modelCore.Species.Count]; //if this is the right species match, add it's count to the csv string foreach (ISpecies species in modelCore.Species) { bool assigned = false; //loop through dictionary of species kill count foreach (KeyValuePair<string, int> kvp in stand.DamageTable) { if (species.Name == kvp.Key) { assigned = true; species_count[species.Index] += kvp.Value; } } if (!assigned) { //put a 0 there if it's not assigned (because none were found in the dictionary) species_count[species.Index] = 0.0; } totalSpeciesCohorts[standPrescriptionNumber, species.Index] += (double) species_count[species.Index]; } //now that the damage table for this stand has been recorded, clear it!! stand.ClearDamageTable(); //write to log file: biomassRemovedPerHa = biomassRemoved / (double)damagedSites / modelCore.CellArea; if (biomassRemoved <= 0.0) return; eventLog.Clear(); EventsLog el = new EventsLog(); el.Time = modelCore.CurrentTime; el.ManagementArea = mgmtArea.MapCode; el.Prescription = stand.PrescriptionName; el.StandMapCode = stand.MapCode; el.EventID = stand.EventId; el.StandAge = stand.Age; el.StandRank = stand.HarvestedRank; el.StandSiteCount = stand.SiteCount; el.HarvestedSites = damagedSites; el.MgBiomassRemoved = biomassRemoved; // Mg el.MgBioRemovedPerDamagedHa = biomassRemovedPerHa; // Mg/ha el.CohortsHarvestedPartial = cohortsDamaged; el.CohortsHarvestedComplete = cohortsKilled; el.CohortsHarvested_ = species_count; eventLog.AddObject(el); eventLog.WriteToFile(); }
//--------------------------------------------------------------------- public void WriteLogEntry(ManagementArea mgmtArea, Stand stand) { int damagedSites = 0; int cohortsDamaged = 0; int standPrescriptionNumber = 0; foreach (ActiveSite site in stand) { //set the prescription name for this site if (SiteVars.Prescription[site] != null) { standPrescriptionNumber = SiteVars.Prescription[site].Number; SiteVars.PrescriptionName[site] = SiteVars.Prescription[site].Name; SiteVars.TimeOfLastEvent[site] = PlugIn.ModelCore.CurrentTime; } int cohortsDamagedAtSite = SiteVars.CohortsDamaged[site]; cohortsDamaged += cohortsDamagedAtSite; if (cohortsDamagedAtSite > 0) { damagedSites++; } } totalSites[standPrescriptionNumber] += stand.SiteCount; totalDamagedSites[standPrescriptionNumber] += damagedSites; //csv string for log file, contains species kill count //string species_count = ""; double[] species_count = new double[modelCore.Species.Count]; foreach (ISpecies species in PlugIn.ModelCore.Species) { int cohortCount = stand.DamageTable[species]; species_count[species.Index] += cohortCount; totalSpeciesCohorts[standPrescriptionNumber, species.Index] += cohortCount; } //Trim trailing comma so we don't add an extra column //species_count = species_count.TrimEnd(','); //now that the damage table for this stand has been recorded, clear it!! stand.ClearDamageTable(); //write to log file: //current time //management area's map code //the prescription that caused this harvest //stand's map code //stand's age //stand's current rank //total sites in the stand //damaged sites from this stand //cohorts killed in this stand, by this harvest //and only record stands where a site has been damaged //log.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", // PlugIn.ModelCore.CurrentTime, mgmtArea.MapCode, stand.PrescriptionName, stand.MapCode, stand.EventId, // stand.Age, stand.HarvestedRank, stand.SiteCount, damagedSites, cohortsDamaged, species_count); eventLog.Clear(); EventsLog el = new EventsLog(); el.Time = modelCore.CurrentTime; el.ManagementArea = mgmtArea.MapCode; el.Prescription = stand.PrescriptionName; el.Stand = stand.MapCode; el.EventID = stand.EventId; el.StandAge = stand.Age; el.StandRank = Convert.ToInt32(stand.HarvestedRank); el.NumberOfSites = stand.SiteCount; el.HarvestedSites = damagedSites; el.TotalCohortsHarvested = cohortsDamaged; el.CohortsHarvested_ = species_count; eventLog.AddObject(el); eventLog.WriteToFile(); }
//--------------------------------------------------------------------- /// <summary> /// Harvests a stand (and possibly its neighbors) according to the /// prescription's site-selection method. /// </summary> /// <returns> /// The area that was harvested (units: hectares). /// </returns> // This is called by AppliedPrescription public virtual void Harvest(Stand stand) { if (isDebugEnabled) log.DebugFormat(" Prescription {0} is harvesting stand {1}", this.Name, stand.MapCode); //set prescription name for stand stand.PrescriptionName = this.Name; stand.HarvestedRank = PlugIn.CurrentRank; stand.LastPrescription = this; stand.MinTimeSinceDamage = this.minTimeSinceDamage; //set current stand currentStand = stand; currentStand.ClearDamageTable(); // SelectSites(stand) is where either complete, complete stand spreading, or partial stand // spreading are activated. // tjs - This is what gets the sites that will be harvested foreach (ActiveSite site in siteSelector.SelectSites(stand)) { currentSite = site; SiteVars.Cohorts[site].RemoveMarkedCohorts(this); // In order for easement prescriptions to properly "spread", we need to count // each site in its area harvested even if no cohorts are damaged. //if (SiteVars.CohortsDamaged[site] > 0) { stand.LastAreaHarvested += PlugIn.ModelCore.CellArea; } // With land-use, a prescription doesn't necessarily damage a site's cohorts // (for example, an easement prescription). So, always assign the current // prescription to the site, regardless if any cohorts were damaged. This // will cause the prescription to appear on the timestep's prescription map. SiteVars.Prescription[site] = this; if (speciesToPlant != null) Reproduction.ScheduleForPlanting(speciesToPlant, site); if (landUseAfterHarvest != null) { if (isDebugEnabled) { string landUseBefore = (LandUse.SiteVar[site] == null) ? "(null)" : LandUse.SiteVar[site].Name; log.DebugFormat(" site {0}, land use: {1} --> {2}", site, landUseBefore, landUseAfterHarvest.Name); if (landUseBefore != "forest") log.DebugFormat(" stand rank = {0}", stand.Rank); } LandUse.SiteVar[site] = landUseAfterHarvest; // Now that the site's land-use has changed, set its stand aside for the rest // of the scenario. Note: because of stand-spreading algorithm, the site may // not belong to the stand that this method was called with. SiteVars.Stand[site].SetAsideUntil(PlugIn.ModelCore.EndTime + 1); } } return; }
//--------------------------------------------------------------------- public void WriteLogEntry(ManagementArea mgmtArea, Stand stand) { int damagedSites = 0; int cohortsDamaged = 0; int cohortsKilled = 0; int standPrescriptionNumber = 0; double biomassRemoved = 0.0; double biomassRemovedPerHa = 0.0; IDictionary<ISpecies, double> totalBiomassBySpecies = new Dictionary<ISpecies, double>(); //ModelCore.UI.WriteLine("BiomassHarvest: PlugIn.cs: WriteLogEntry: mgmtArea {0}, Stand {1} ", mgmtArea.Prescriptions.Count, stand.MapCode); foreach (ActiveSite site in stand) { //set the prescription name for this site if (HarvestMgmtLib.SiteVars.Prescription[site] != null) { standPrescriptionNumber = HarvestMgmtLib.SiteVars.Prescription[site].Number; HarvestMgmtLib.SiteVars.PrescriptionName[site] = HarvestMgmtLib.SiteVars.Prescription[site].Name; HarvestMgmtLib.SiteVars.TimeOfLastEvent[site] = modelCore.CurrentTime; } cohortsDamaged += Landis.Library.BiomassHarvest.SiteVars.CohortsPartiallyDamaged[site]; cohortsKilled += (HarvestMgmtLib.SiteVars.CohortsDamaged[site] - Landis.Library.BiomassHarvest.SiteVars.CohortsPartiallyDamaged[site]); if (Landis.Library.BiomassHarvest.SiteVars.CohortsPartiallyDamaged[site] > 0 || HarvestMgmtLib.SiteVars.CohortsDamaged[site] > 0) { damagedSites++; //Conversion from [g m-2] to [Mg ha-1] to [Mg] biomassRemoved += SiteVars.BiomassRemoved[site] / 100.0 * modelCore.CellArea; IDictionary<ISpecies, int> siteBiomassBySpecies = SiteVars.BiomassBySpecies[site]; if (siteBiomassBySpecies != null) { // Sum up total biomass for each species foreach (ISpecies species in modelCore.Species) { int addValue = 0; siteBiomassBySpecies.TryGetValue(species, out addValue); double oldValue; if (totalBiomassBySpecies.TryGetValue(species, out oldValue)) { totalBiomassBySpecies[species] += addValue / 100.0 * modelCore.CellArea; } else { totalBiomassBySpecies.Add(species, addValue / 100.0 * modelCore.CellArea); } } } } } totalSites[standPrescriptionNumber] += stand.SiteCount; totalDamagedSites[standPrescriptionNumber] += damagedSites; totalCohortsDamaged[standPrescriptionNumber] += cohortsDamaged; totalCohortsKilled[standPrescriptionNumber] += cohortsKilled; totalBiomassRemoved[standPrescriptionNumber] += biomassRemoved; //csv string for log file, contains species affected count //string species_count = ""; //csv string for log file, contains biomass by species //string species_biomass = ""; double[] species_cohorts = new double[modelCore.Species.Count]; double[] species_biomass = new double[modelCore.Species.Count]; double biomass_value; foreach (ISpecies species in modelCore.Species) { int cohortCount = stand.DamageTable[species]; //species_count += string.Format("{0},", cohortCount); species_cohorts[species.Index] = cohortCount; totalSpeciesCohorts[standPrescriptionNumber, species.Index] += cohortCount; totalBiomassBySpecies.TryGetValue(species, out biomass_value); //species_biomass += string.Format("{0},", biomass_value); species_biomass[species.Index] = biomass_value; totalSpeciesBiomass[standPrescriptionNumber, species.Index] += biomass_value; } //Trim trailing comma so we don't add an extra column //species_biomass = species_biomass.TrimEnd(','); //now that the damage table for this stand has been recorded, clear it!! stand.ClearDamageTable(); //write to log file: if (biomassRemoved > 0.0) biomassRemovedPerHa = biomassRemoved / (double) damagedSites / modelCore.CellArea; //log.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9:0.000},{10:0.000},{11},{12},{13}{14}", // modelCore.CurrentTime, // mgmtArea.MapCode, // stand.PrescriptionName, // stand.MapCode, // stand.EventId, // stand.Age,* // stand.HarvestedRank,* // stand.SiteCount,* // damagedSites,* // biomassRemoved, // Mg * // biomassRemovedPerHa, // Mg/ha * // cohortsDamaged, // cohortsKilled, // species_count, // species_biomass); eventLog.Clear(); EventsLog el = new EventsLog(); el.Time = modelCore.CurrentTime; el.ManagementArea = mgmtArea.MapCode; el.Prescription = stand.PrescriptionName; el.Stand = stand.MapCode; el.EventID = stand.EventId; el.StandAge = stand.Age; el.StandRank = Convert.ToInt32(stand.HarvestedRank); el.NumberOfSites = stand.SiteCount; el.HarvestedSites = damagedSites; el.MgBiomassRemoved = biomassRemoved; el.MgBioRemovedPerDamagedHa = biomassRemovedPerHa; el.TotalCohortsPartialHarvest = cohortsDamaged; el.TotalCohortsCompleteHarvest = cohortsKilled; el.CohortsHarvested_ = species_cohorts; el.BiomassHarvestedMg_ = species_biomass; eventLog.AddObject(el); eventLog.WriteToFile(); }
//--------------------------------------------------------------------- public void WriteLogEntry(ManagementArea mgmtArea, Stand stand) { int damagedSites = 0; int cohortsDamaged = 0; int standPrescriptionNumber = 0; foreach (ActiveSite site in stand) { //set the prescription name for this site if (SiteVars.Prescription[site] != null) { standPrescriptionNumber = SiteVars.Prescription[site].Number; SiteVars.PrescriptionName[site] = SiteVars.Prescription[site].Name; SiteVars.TimeOfLastEvent[site] = PlugIn.ModelCore.CurrentTime; } int cohortsDamagedAtSite = SiteVars.CohortsDamaged[site]; cohortsDamaged += cohortsDamagedAtSite; if (cohortsDamagedAtSite > 0) { damagedSites++; } } totalSites[standPrescriptionNumber] += stand.SiteCount; totalDamagedSites[standPrescriptionNumber] += damagedSites; //csv string for log file, contains species kill count //string species_count = ""; double[] species_count = new double[modelCore.Species.Count]; foreach (ISpecies species in PlugIn.ModelCore.Species) { int cohortCount = stand.DamageTable[species]; species_count[species.Index] += cohortCount; totalSpeciesCohorts[standPrescriptionNumber, species.Index] += cohortCount; } //Trim trailing comma so we don't add an extra column //species_count = species_count.TrimEnd(','); //now that the damage table for this stand has been recorded, clear it!! stand.ClearDamageTable(); //write to log file: //current time //management area's map code //the prescription that caused this harvest //stand's map code //stand's age //stand's current rank //total sites in the stand //damaged sites from this stand //cohorts killed in this stand, by this harvest //and only record stands where a site has been damaged //log.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", // PlugIn.ModelCore.CurrentTime, mgmtArea.MapCode, stand.PrescriptionName, stand.MapCode, stand.EventId, // stand.Age, stand.HarvestedRank, stand.SiteCount, damagedSites, cohortsDamaged, species_count); eventLog.Clear(); EventsLog el = new EventsLog(); el.Time = modelCore.CurrentTime; el.ManagementArea = mgmtArea.MapCode; el.Prescription = stand.PrescriptionName; el.Stand = stand.MapCode; el.EventID = stand.EventId; el.StandAge = stand.Age; el.StandRank = Convert.ToInt32(stand.HarvestedRank); el.NumberOfSites = stand.SiteCount; el.HarvestedSites = damagedSites; el.TotalCohortsHarvested = cohortsDamaged; el.CohortsHarvested_ = species_count; eventLog.AddObject(el); eventLog.WriteToFile(); }