//--------------------------------------------------------------------- ///<summary> /// Run the plug-in at a particular timestep. ///</summary> public override void Run() { UI.WriteLine("Processing landscape for Fire events ..."); SiteVars.Event.SiteValues = null; SiteVars.Severity.ActiveSiteValues = 0; SiteVars.Disturbed.ActiveSiteValues = false; // Update the FireRegions Map as necessary: foreach(IDynamicFireRegion dyneco in dynamicEcos) { if(dyneco.Year == Model.Core.CurrentTime) { UI.WriteLine(" Reading in new Fire Regions Map {0}.", dyneco.MapName); FireRegions.ReadMap(dyneco.MapName); } } foreach (IFireRegion fireregion in FireRegions.Dataset) { summaryFireRegionEventCount[fireregion.Index] = 0; } summaryTotalSites = 0; summaryEventCount = 0; foreach (ActiveSite site in Model.Core.Landscape) { Event FireEvent = Event.Initiate(site, Model.Core.CurrentTime, Timestep); if (FireEvent != null) { LogEvent(Model.Core.CurrentTime, FireEvent); summaryEventCount++; } } //UI.WriteLine(" Fire events: {0}", summaryEventCount); // Write Fire severity map string path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime); IOutputRaster<UShortPixel> map = CreateMap(path); using (map) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { if (SiteVars.Disturbed[site]) pixel.Band0 = (byte) (SiteVars.Severity[site] + 1); else pixel.Band0 = 1; } else { // Inactive site pixel.Band0 = 0; } map.WritePixel(pixel); } } WriteSummaryLog(Model.Core.CurrentTime); }
//--------------------------------------------------------------------- ///<summary> /// Run the Biomass Insects extension at a particular timestep. ///</summary> public override void Run() { running = true; UI.WriteLine(" Processing landscape for Biomass Insect events ..."); foreach(IInsect insect in manyInsect) { if(insect.MortalityYear == Model.Core.CurrentTime) Outbreak.Mortality(insect); // Copy the data from current to last foreach (ActiveSite site in Model.Core.Landscape) insect.LastYearDefoliation[site] = insect.ThisYearDefoliation[site]; insect.ThisYearDefoliation.ActiveSiteValues = 0.0; //SiteVars.BiomassRemoved.ActiveSiteValues = 0; insect.ActiveOutbreak = false; insect.SingleOutbreakYear = false; NormalDistribution randVar = new NormalDistribution(RandomNumberGenerator.Singleton); randVar.Mu = 0; // mean randVar.Sigma = 1; // std dev double randomNum = randVar.NextDouble(); ExponentialDistribution randVarE = new ExponentialDistribution(RandomNumberGenerator.Singleton); randVarE.Lambda = insect.MeanDuration; // rate double randomNumE = randVarE.NextDouble(); // First, has enough time passed since the last outbreak? double timeBetweenOutbreaks = insect.MeanTimeBetweenOutbreaks + (insect.StdDevTimeBetweenOutbreaks * randomNum); //double duration = insect.MeanDuration + (insect.StdDevDuration * randomNum); double duration = Math.Round(randomNumE + 1); if (duration > 5) // Limit maximum outbreak duration to 5 years for now. duration = duration - 3; double timeAfterDuration = timeBetweenOutbreaks - duration; //UI.WriteLine("Calculated time between = {0}. inputMeanTime={1}, inputStdTime={2}.", timeBetweenOutbreaks, insect.MeanTimeBetweenOutbreaks, insect.StdDevTimeBetweenOutbreaks); //UI.WriteLine("Calculated duration = {0}. inputMeanDura={1}, inputStdDura={2}.", duration, insect.MeanDuration, insect.StdDevDuration); //UI.WriteLine("Insect Start Time = {0}, Stop Time = {1}.", insect.OutbreakStartYear, insect.OutbreakStopYear); if(Model.Core.CurrentTime == 1) { //UI.WriteLine(" Year 1: Setting initial start and stop times."); insect.OutbreakStartYear = (int) (timeBetweenOutbreaks / 2.0) + 1; insect.OutbreakStopYear = insect.OutbreakStartYear + (int) duration - 1; UI.WriteLine(" {0} is not active. StartYear={1}, StopYear={2}, CurrentYear={3}.", insect.Name, insect.OutbreakStartYear, insect.OutbreakStopYear, Model.Core.CurrentTime); } else if(insect.OutbreakStartYear <= Model.Core.CurrentTime && insect.OutbreakStopYear > Model.Core.CurrentTime) { //UI.WriteLine(" An outbreak starts or continues. Start and stop time do not change."); insect.ActiveOutbreak = true; UI.WriteLine(" {0} is active. StartYear={1}, StopYear={2}, CurrentYear={3}.", insect.Name, insect.OutbreakStartYear, insect.OutbreakStopYear, Model.Core.CurrentTime); insect.MortalityYear = Model.Core.CurrentTime + 1; } //Special case for single year outbreak. else if(insect.OutbreakStartYear <= Model.Core.CurrentTime && insect.OutbreakStopYear <= Model.Core.CurrentTime) { insect.ActiveOutbreak = true; UI.WriteLine(" {0} is active. StartYear={1}, StopYear={2}, CurrentYear={3}.", insect.Name, insect.OutbreakStartYear, insect.OutbreakStopYear, Model.Core.CurrentTime); if (insect.OutbreakStartYear == insect.OutbreakStopYear) insect.SingleOutbreakYear = true; insect.MortalityYear = Model.Core.CurrentTime + 1; insect.OutbreakStartYear = Model.Core.CurrentTime + (int)timeBetweenOutbreaks; insect.OutbreakStopYear = insect.OutbreakStartYear + (int)duration - 1; } else if(insect.OutbreakStopYear <= Model.Core.CurrentTime && timeAfterDuration > Model.Core.CurrentTime - insect.OutbreakStopYear) { //UI.WriteLine(" In between outbreaks, reset start and stop times."); insect.ActiveOutbreak = true; UI.WriteLine(" {0} is active. StartYear={1}, StopYear={2}, CurrentYear={3}.", insect.Name, insect.OutbreakStartYear, insect.OutbreakStopYear, Model.Core.CurrentTime); insect.MortalityYear = Model.Core.CurrentTime + 1; insect.OutbreakStartYear = Model.Core.CurrentTime + (int) timeBetweenOutbreaks; insect.OutbreakStopYear = insect.OutbreakStartYear + (int) duration - 1; } //UI.WriteLine(" Insect Start Time = {0}, Stop Time = {1}.", insect.OutbreakStartYear, insect.OutbreakStopYear); if(insect.ActiveOutbreak) { //UI.WriteLine(" OutbreakStartYear={0}.", insect.OutbreakStartYear); if(insect.OutbreakStartYear == Model.Core.CurrentTime || insect.SingleOutbreakYear) // Initialize neighborhoodGrowthReduction with patches Outbreak.InitializeDefoliationPatches(insect); else insect.NeighborhoodDefoliation.ActiveSiteValues = 0; double sumDefoliation = 0.0; int numSites = 0; //foreach(ActiveSite site in Model.Core.Landscape) //{ // sumDefoliation += insect.ThisYearDefoliation[site]; // if(insect.ThisYearDefoliation[site] > 0.0) // numSites++; //} double meanDefoliation = sumDefoliation / (double) numSites; log.Write("{0},{1},{2},{3},{4},{5}", Model.Core.CurrentTime, insect.Name, insect.OutbreakStartYear, insect.OutbreakStopYear, sumDefoliation, numSites ); //foreach (IEcoregion ecoregion in Ecoregions.Dataset) // log.Write(",{0}", 1); log.WriteLine(""); } //Only write maps if an outbreak is active. //if (!insect.ActiveOutbreak) //if (insect.OutbreakStartYear <= Model.Core.CurrentTime // && insect.OutbreakStopYear + 1 >= Model.Core.CurrentTime) //if (insect.OutbreakStartYear <= Model.Core.CurrentTime) // | insect.MortalityYear = Model.Core.CurrentTime) // continue; //----- Write Insect GrowthReduction maps -------- IOutputRaster<UShortPixel> map = CreateMap((Model.Core.CurrentTime - 1), insect.Name); using (map) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) pixel.Band0 = (ushort) (insect.LastYearDefoliation[site] * 100.0); else // Inactive site pixel.Band0 = 0; map.WritePixel(pixel); } } //----- Write Initial Patch maps -------- //IOutputRaster<UShortPixel> map2 = CreateMap(Model.Core.CurrentTime, ("InitialPatchMap" + insect.Name)); //using (map2) { // UShortPixel pixel = new UShortPixel(); // foreach (Site site in Model.Core.Landscape.AllSites) { // if (site.IsActive) // { // if (insect.Disturbed[site]) // pixel.Band0 = (ushort) (SiteVars.InitialOutbreakProb[site] * 100); // else // pixel.Band0 = 0; // } // else // { // // Inactive site // pixel.Band0 = 0; // } // map2.WritePixel(pixel); // } //} //----- Write Biomass Reduction maps -------- IOutputRaster<UShortPixel> map3 = CreateMap(Model.Core.CurrentTime, ("BiomassRemoved" + insect.Name)); using (map3) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { // TESTING added by RMS if(SiteVars.BiomassRemoved[site] > 0) // UI.WriteLine(" Biomass revoved at {0}/{1}: {2}.", site.Location.Row, site.Location.Column, SiteVars.BiomassRemoved[site]); pixel.Band0 = (ushort) (SiteVars.BiomassRemoved[site] / 100); else pixel.Band0 = 0; } else { // Inactive site pixel.Band0 = 0; } map3.WritePixel(pixel); //Zero out the BiomassRemoved after the last insect mortality event in a given year. //if (SiteVars.BiomassRemoved[site] > 0 && SiteVars.TimeOfLastEvent[site] < Model.Core.CurrentTime) SiteVars.BiomassRemoved[site] = 0; } } } }
//--------------------------------------------------------------------- ///<summary> /// Run the plug-in at a particular timestep. ///</summary> public override void Run() { if (isDebugEnabled) UI.WriteLine("Running {0} at time = {1}", Name, Model.Core.CurrentTime); UI.WriteLine(" Processing landscape for Fire events ..."); SiteVars.Event.SiteValues = null; SiteVars.Severity.ActiveSiteValues = 0; SiteVars.Disturbed.ActiveSiteValues = false; SiteVars.TravelTime.ActiveSiteValues = Double.PositiveInfinity; SiteVars.MinNeighborTravelTime.ActiveSiteValues = Double.PositiveInfinity; SiteVars.RateOfSpread.ActiveSiteValues = 0.0; foreach (IFireRegion fire_region in FireRegions.Dataset) { summaryFireRegionEventCount[fire_region.Index] = 0; summaryFireRegionSeverity[fire_region.Index] = 0; } summaryTotalSites = 0; summaryEventCount = 0; // Update the FireRegions Map as necessary: //UI.WriteLine(" Dynamic Fire: Loading Dynamic Fire Regions..."); foreach(IDynamicFireRegion dyneco in dynamicEcos) { if(dyneco.Year == Model.Core.CurrentTime) { UI.WriteLine(" Reading in new Fire FireRegions Map {0}.", dyneco.MapName); foreach (IFireRegion fire_region in FireRegions.Dataset) { fire_region.FireRegionSites = new List<Location>(); } FireRegions.ReadMap(dyneco.MapName); //Sites added to their respective fire_region lists } } //Update the weather table as necessary: //UI.WriteLine(" Dynamic Fire: Loading Dynamic Weather ..."); foreach (IDynamicWeather dynweather in dynamicWeather) { if (dynweather.Year == Model.Core.CurrentTime) { UI.WriteLine(" Reading in new Weather Table {0}", dynweather.FileName); WeatherDataTable = Weather.ReadWeatherFile(dynweather.FileName, FireRegions.Dataset, seasonParameters); //Weather.ReadFileName(, seasonParameters, FireRegions.Dataset); } } // Fill in open types as needed: if (isDebugEnabled) UI.WriteLine("Filling open types as needed ..."); UI.WriteLine(" Dynamic Fire: Filling open types as needed ..."); foreach (ActiveSite site in Model.Core.Landscape) { IFireRegion fire_region = SiteVars.FireRegion[site]; if(fire_region == null) throw new System.ApplicationException("Error: SiteVars.FireRegion is empty."); //if(SiteVars.CFSFuelType[site] == 0) // throw new System.ApplicationException("Error: SiteVars.CFSFuelType is empty."); if(Event.FuelTypeParms[SiteVars.CFSFuelType[site]] == null) { UI.WriteLine("Error: SiteVars.CFSFuelType[site]={0}.", SiteVars.CFSFuelType[site]); throw new System.ApplicationException("Error: Event BaseFuel Empty."); } if(Event.FuelTypeParms[SiteVars.CFSFuelType[site]].BaseFuel == BaseFuelType.NoFuel) { if(SiteVars.PercentDeadFir[site] == 0) SiteVars.CFSFuelType[site] = fire_region.OpenFuelType; } } if (isDebugEnabled) UI.WriteLine("Done filling open types"); UI.WriteLine(" Dynamic Fire: Igniting Fires ..."); foreach (IFireRegion fire_region in FireRegions.Dataset) { if (fire_region.EcoIgnitionNum > 0) { PoissonDistribution randVar = new PoissonDistribution(RandomNumberGenerator.Singleton); double doubleLambda; int ignGenerated = 0; if (isDebugEnabled) UI.WriteLine("{0}: EcoIgnitionNum = {1}, computing ignGenerated ...", fire_region.Name, fire_region.EcoIgnitionNum); if (fire_region.EcoIgnitionNum < 1) { // Adjust ignition probability for multiple years // (The inverse of the probability of NOT having any ignition for the time period.) // P = 1 - (1-Pignition)^timestep //doubleLambda = 1 - System.Math.Pow(1.0 - fire_region.EcoIgnitionNum, Timestep); for (int i = 1; i <= Timestep; i++) { int annualFires = 0; if (Util.Random.GenerateUniform() <= fire_region.EcoIgnitionNum) { annualFires = 1; } ignGenerated += annualFires; } } else { doubleLambda = fire_region.EcoIgnitionNum; bool boolLarge = false; // 745 is the upper limit for valid Poisson lambdas. If greater than // 745, divide by 10 and readjust back up below. if (doubleLambda > 745) { doubleLambda = doubleLambda / 10; boolLarge = true; } //bool boolLambda = randVar.IsValidLambda(doubleLambda); randVar.Lambda = doubleLambda; for (int i = 1; i <= Timestep; i++) { int annualFires = randVar.Next(); if (boolLarge) annualFires = annualFires * 10; //readjust if necessary. ignGenerated += annualFires; } } if (isDebugEnabled) UI.WriteLine(" ignGenerated = {0}; Shuffling {0} cells ...", ignGenerated, fire_region.FireRegionSites.Count); List<Location> cellsPerFireRegion = fire_region.FireRegionSites; Landis.Util.Random.Shuffle(cellsPerFireRegion); int fireCount = 0; //Try to create poissonNumber of fires in each fire_region. //Fires should only initiate if a fire event has not previously occurred //at that site. if (isDebugEnabled) { UI.WriteLine(" Trying to create fires... "); UI.WriteLine(" there are {0} site locations in fire region {1}", cellsPerFireRegion.Count, fire_region.Name); } foreach (Location siteLocation in cellsPerFireRegion) { Site site = Model.Core.Landscape.GetSite(siteLocation); ActiveSite asite = site as ActiveSite; if (fireCount >= ignGenerated) continue; //exit loop if the required number of fires has occurred. if (SiteVars.Event[asite] == null) { fireCount++; if (isDebugEnabled) UI.WriteLine(" fireCount = {0}", fireCount); Event FireEvent = Event.Initiate(asite, Timestep, fireSizeType, bui, seasonParameters, severityCalibrate); if (isDebugEnabled) UI.WriteLine(" fire event {0}started at {1}", FireEvent == null ? "not ": "", asite.Location); if (FireEvent != null) { LogEvent(Model.Core.CurrentTime, FireEvent); summaryEventCount++; //fireCount++; //RMS test } } } } } // Track the time of last fire; registered in SiteVars.cs for other extensions to access. if (isDebugEnabled) UI.WriteLine("Assigning TimeOfLastFire site var ..."); foreach (Site site in Model.Core.Landscape.AllSites) if(SiteVars.Disturbed[site]) SiteVars.TimeOfLastFire[site] = Model.Core.CurrentTime; // Write Fire severity map UI.WriteLine(" Dynamic Fire: Write Severity Map ..."); string path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime); IOutputRaster<SeverityPixel> map = CreateMap(path); using (map) { SeverityPixel pixel = new SeverityPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { if (SiteVars.Disturbed[site]) { pixel.Band0 = (byte)(SiteVars.Severity[site] + 2); summaryFireRegionSeverity[SiteVars.FireRegion[site].Index] += SiteVars.Severity[site]; } else pixel.Band0 = 1; } else { // Inactive site pixel.Band0 = 0; } map.WritePixel(pixel); } } /* // Write travel time map path = MapNames.ReplaceTemplateVars("./DFFS-output/travel-time-{timestep}.gis", Model.Core.CurrentTime); IOutputRaster<UShortPixel> umap = CreateTravelTimeMap(path); using (umap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { if (!Double.IsPositiveInfinity(SiteVars.TravelTime[site])) //if (SiteVars.Event[site] != null) pixel.Band0 = (ushort) ((SiteVars.TravelTime[site]) + 2); else pixel.Band0 = 1; } else { // Inactive site pixel.Band0 = 0; } umap.WritePixel(pixel); } } */ /* // Write topo map path = MapNames.ReplaceTemplateVars("./DFFS-output/topo-{timestep}.gis", Model.Core.CurrentTime); IOutputRaster<TopoPixel> tmap = CreateTopoMap(path); using (tmap) { TopoPixel pixel = new TopoPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)(SiteVars.GroundSlope[site]); } else { // Inactive site pixel.Band0 = 0; } tmap.WritePixel(pixel); } } */ /* // Write wind speed map path = MapNames.ReplaceTemplateVars("./DFFS-output/WSV-{timestep}.gis", Model.Core.CurrentTime); IOutputRaster<UShortPixel> wsvmap = CreateTravelTimeMap(path); using (wsvmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)(SiteVars.SiteWindSpeed[site]); } else { // Inactive site pixel.Band0 = 0; } wsvmap.WritePixel(pixel); } } */ /* // Write wind direction map path = MapNames.ReplaceTemplateVars("./DFFS-output/WindDir-{timestep}.gis", Model.Core.CurrentTime); IOutputRaster<UShortPixel> winddirmap = CreateTravelTimeMap(path); using (winddirmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)(SiteVars.SiteWindDirection[site]); } else { // Inactive site pixel.Band0 = 0; } winddirmap.WritePixel(pixel); } } */ /* // Write ROS map /*path = MapNames.ReplaceTemplateVars("./DFFS-output/ROS-{timestep}.gis", Model.Core.CurrentTime); IOutputRaster<UShortPixel> rosmap = CreateTravelTimeMap(path); using (rosmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)((SiteVars.RateOfSpread[site]) + 1); } else { // Inactive site pixel.Band0 = 0; } rosmap.WritePixel(pixel); } }*/ /* // Write AdjROS map path = MapNames.ReplaceTemplateVars("./DFFS-output/AdjROS-{timestep}.gis", Model.Core.CurrentTime); IOutputRaster<UShortPixel> adjmap = CreateTravelTimeMap(path); using (adjmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)(((SiteVars.AdjROS[site]) * 100) + 1); } else { // Inactive site pixel.Band0 = 0; } adjmap.WritePixel(pixel); } } */ // Write TimeOfLastFire map path = MapNames.ReplaceTemplateVars("./DFFS-output/TimeOfLastFire-{timestep}.gis", Model.Core.CurrentTime); IOutputRaster<UShortPixel> tolfMap = CreateTravelTimeMap(path); using (tolfMap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)(SiteVars.TimeOfLastFire[site]); } else { // Inactive site pixel.Band0 = 0; } tolfMap.WritePixel(pixel); } } WriteSummaryLog(Model.Core.CurrentTime); if (isDebugEnabled) UI.WriteLine("Done running extension"); }
//--------------------------------------------------------------------- public override void Run() { DynamicChange.Module.CheckForUpdate(); if (Model.Core.CurrentTime > 0) SiteVars.InitializeDisturbances(); base.Run(); Outputs.WriteLogFile(Model.Core.CurrentTime); if ((Model.Core.CurrentTime % Timestep) == 0) { string path = MapNames.ReplaceTemplateVars(TotalCarbonMapNames, Model.Core.CurrentTime); IOutputRaster<UShortPixel> map = Model.Core.CreateRaster<UShortPixel>(path, Model.Core.Landscape.Dimensions, Model.Core.LandscapeMapMetadata); using (map) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort) (SiteVars.ComputeTotalC((ActiveSite) site, (int) SiteVars.ComputeTotalBiomass((ActiveSite) site)) / 1000.0); } else { // Inactive site pixel.Band0 = 0; } map.WritePixel(pixel); } } string path2 = MapNames.ReplaceTemplateVars(TotalLiveCarbonMapNames, Model.Core.CurrentTime); IOutputRaster<UShortPixel> map2 = Model.Core.CreateRaster<UShortPixel>(path2, Model.Core.Landscape.Dimensions, Model.Core.LandscapeMapMetadata); using (map2) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)(SiteVars.ComputeTotalLiveC((ActiveSite)site, (int)SiteVars.ComputeTotalBiomass((ActiveSite)site)) / 1000.0); } else { // Inactive site pixel.Band0 = 0; } map2.WritePixel(pixel); } } } }
//--------------------------------------------------------------------- public override void Run() { if(Model.Core.CurrentTime == Timestep) Outputs.WriteLogFile(0); if(Model.Core.CurrentTime > 0 && SiteVars.CapacityReduction == null) SiteVars.CapacityReduction = Model.Core.GetSiteVar<double>("Harvest.CapacityReduction"); //SpeciesData.ChangeDynamicParameters(Model.Core.CurrentTime); //DynamicChange.Module.CheckForUpdate(); base.Run(); Outputs.WriteLogFile(Model.Core.CurrentTime); /* // Write LAI map string path = MapNames.ReplaceTemplateVars("./biomass-succession/LAI-{timestep}.gis", Model.Core.CurrentTime); IOutputRaster<UShortPixel> map = Util.CreateMap(path); using (map) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort) (SiteVars.LAI[site]); } else { // Inactive site pixel.Band0 = 0; } map.WritePixel(pixel); } } */ // Write Percent Shade map string path2 = MapNames.ReplaceTemplateVars("./biomass-succession/Percent-Shade-{timestep}.gis", Model.Core.CurrentTime); IOutputRaster<UShortPixel> map2 = Util.CreateMap(path2); using (map2) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)Math.Max(SiteVars.PercentShade[site] * 100.0, 0.0); } else { // Inactive site pixel.Band0 = 0; } map2.WritePixel(pixel); } } }
//--------------------------------------------------------------------- ///<summary> /// Run the BDA extension at a particular timestep. ///</summary> public override void Run() { UI.WriteLine("Processing landscape for BDA events ..."); //SiteVars.Epidemic.SiteValues = null; int eventCount = 0; foreach(IAgent activeAgent in manyAgentParameters) { activeAgent.TimeSinceLastEpidemic += Timestep; //UI.WriteLine("TimeSince={0}, TimeToNext={1}", activeAgent.TimeSinceLastEpidemic, activeAgent.TimeToNextEpidemic); //(activeAgent.TimeSinceLastEpidemic+ activeAgent.TimeToNextEpidemic)); int ROS = RegionalOutbreakStatus(activeAgent, Timestep); if(ROS > 0) { Epidemic.Initialize(activeAgent); Epidemic currentEpic = Epidemic.Simulate(activeAgent, Model.Core.CurrentTime, Timestep, ROS); //activeAgent.TimeSinceLastEpidemic = activeAgent.TimeSinceLastEpidemic + Timestep; if (currentEpic != null) { LogEvent(Model.Core.CurrentTime, currentEpic, ROS); //----- Write BDA severity maps -------- IOutputRaster<SeverityPixel> map = CreateMap(Model.Core.CurrentTime, activeAgent.AgentName); using (map) { SeverityPixel pixel = new SeverityPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { if (SiteVars.Disturbed[site]) pixel.Band0 = (byte) (activeAgent.Severity[site] + 1); else pixel.Band0 = 1; } else { // Inactive site pixel.Band0 = 0; } map.WritePixel(pixel); } } if (!(srdMapNames == "")) { //----- Write BDA SRD maps -------- IOutputRaster<UShortPixel> srdmap = CreateSRDMap(Model.Core.CurrentTime, activeAgent.AgentName); using (srdmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)System.Math.Round(SiteVars.SiteResourceDom[site] * 100.00); } else { // Inactive site pixel.Band0 = 0; } srdmap.WritePixel(pixel); } } } if (!(nrdMapNames == "")) { //----- Write BDA NRD maps -------- IOutputRaster<UShortPixel> nrdmap = CreateNRDMap(Model.Core.CurrentTime, activeAgent.AgentName); using (nrdmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)System.Math.Round(SiteVars.NeighborResourceDom[site] * 100.00); } else { // Inactive site pixel.Band0 = 0; } nrdmap.WritePixel(pixel); } } } //----- Write Site Vulnerability or OutbreakZone maps -------- //----- USED FOR LANDSCAPE TESTING ----------- /*IOutputRaster<UShortPixel> dmap = CreateUShortMap(Model.Core.CurrentTimestep, activeAgent.AgentName); using (dmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { //pixel.Band0 = (ushort) (activeAgent.OutbreakZone[site]); pixel.Band0 = (ushort) (SiteVars.Vulnerability[site] * 100); } else { // Inactive site pixel.Band0 = 0; } dmap.WritePixel(pixel); } }*/ /*IOutputRaster<UShortPixel> nmap = CreateUShortMap2(Model.Core.CurrentTimestep, activeAgent.AgentName); using (nmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Landscape.AllSites) { if (site.IsActive) { //pixel.Band0 = (ushort) (activeAgent.OutbreakZone[site]); pixel.Band0 = (ushort) System.Math.Round(SiteVars.NeighborResourceDom[site] * 100.00); } else { // Inactive site pixel.Band0 = 0; } nmap.WritePixel(pixel); } }*/ eventCount++; } } } }
//--------------------------------------------------------------------- ///<summary> /// Run the plug-in at a particular timestep. ///</summary> public override void Run() { UI.WriteLine("Processing landscape for Fire events ..."); SiteVars.Event.SiteValues = null; SiteVars.Severity.ActiveSiteValues = 0; SiteVars.Disturbed.ActiveSiteValues = false; SiteVars.TravelTime.ActiveSiteValues = Double.PositiveInfinity; SiteVars.MinNeighborTravelTime.ActiveSiteValues = Double.PositiveInfinity; SiteVars.RateOfSpread.ActiveSiteValues = 0.0; // Fill in open types as needed: foreach (ActiveSite site in Model.Core.Landscape) { if((FuelTypeCode) SiteVars.CFSFuelType[site] == FuelTypeCode.NoFuel) { IEcoregion ecoregion = SiteVars.Ecoregion[site]; IMoreEcoregionParameters fireParms = ecoregion.MoreEcoregionParameters; SiteVars.CFSFuelType[site] = (int) fireParms.OpenFuelType; } } foreach (IEcoregion ecoregion in Ecoregions.Dataset) { summaryEcoregionEventCount[ecoregion.Index] = 0; } summaryTotalSites = 0; summaryEventCount = 0; //-----Edited by BRM to incorporate Poisson selection of ignition #----- /* //-----This section is original method foreach (ActiveSite site in Model.Core.Landscape) { IEcoregion ecoregion = SiteVars.Ecoregion[site]; IMoreEcoregionParameters fireParms = ecoregion.MoreEcoregionParameters; if(Util.Random.GenerateUniform() <= fireParms.EcoIgnitionProb) { Event FireEvent = Event.Initiate(site, Timestep, fireSizeType, bui, seasonParameters, windDirectionParameters); if (FireEvent != null) { LogEvent(Model.Core.CurrentTime, FireEvent); summaryEventCount++; } } } //---------- */ //-----This section replaces removed section above----- foreach (IEcoregion ecoregion in Ecoregions.Dataset) { IMoreEcoregionParameters fireParms = ecoregion.MoreEcoregionParameters; if (fireParms.EcoIgnitionProb > 0) { PoissonDistribution randVar = new PoissonDistribution(RandomNumberGenerator.Singleton); double doubleLambda; int ignGenerated = 0; if (fireParms.EcoIgnitionProb < 1) { doubleLambda = fireParms.EcoIgnitionProb * Timestep; if (doubleLambda < 1) { if (Util.Random.GenerateUniform() <= doubleLambda) { randVar.Lambda = 1; ignGenerated = randVar.Next(); } else { ignGenerated = 0; } } else { randVar.Lambda = doubleLambda; ignGenerated = randVar.Next(); } } else { doubleLambda = fireParms.EcoIgnitionProb; bool boolLarge = false; if (doubleLambda > 745) { doubleLambda = doubleLambda / 10; boolLarge = true; } bool boolLambda = randVar.IsValidLambda(doubleLambda); randVar.Lambda = doubleLambda; for (int i = 1; i <= Timestep; i++) { int annualFires = randVar.Next(); if (boolLarge) annualFires = annualFires * 10; ignGenerated += annualFires; } } List<Location> cellsPerEcoregion = ecoregion.MoreEcoregionParameters.EcoregionSites; Landis.Util.Random.Shuffle(cellsPerEcoregion); int fireCount = 0; //Try to create poissonNumber of fires in each ecoregion. //Fires should only initiate if a fire event has not previously occurred //at that site. foreach (Location siteLocation in cellsPerEcoregion) { Site site = Model.Core.Landscape.GetSite(siteLocation); ActiveSite asite = site as ActiveSite; if (fireCount >= ignGenerated) continue; //exit loop if the required number of fires has occurred. if (SiteVars.Event[asite] == null) { fireCount++; Event FireEvent = Event.Initiate(asite, Timestep, fireSizeType, bui, seasonParameters, windDirectionParameters); if (FireEvent != null) { LogEvent(Model.Core.CurrentTime, FireEvent); summaryEventCount++; } } } } } //---------- //UI.WriteLine(" Fire events: {0}", summaryEventCount); // Write Fire severity map string path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime); IOutputRaster<SeverityPixel> map = CreateMap(path); using (map) { SeverityPixel pixel = new SeverityPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { if (SiteVars.Disturbed[site]) pixel.Band0 = (byte) (SiteVars.Severity[site] + 2); else pixel.Band0 = 1; } else { // Inactive site pixel.Band0 = 0; } map.WritePixel(pixel); } } // Write travel time map path = MapNames.ReplaceTemplateVars("./tests/Fire-2006/travel-time-{timestep}.gis", Model.Core.CurrentTime); //path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime); IOutputRaster<UShortPixel> umap = CreateTravelTimeMap(path); using (umap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { if (!Double.IsPositiveInfinity(SiteVars.TravelTime[site])) //if (SiteVars.Event[site] != null) pixel.Band0 = (ushort) ((SiteVars.TravelTime[site]) + 2); else pixel.Band0 = 1; } else { // Inactive site pixel.Band0 = 0; } umap.WritePixel(pixel); } } // Write topo map path = MapNames.ReplaceTemplateVars("./tests/Fire-2006/topo-{timestep}.gis", Model.Core.CurrentTime); //path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime); IOutputRaster<TopoPixel> tmap = CreateTopoMap(path); using (tmap) { TopoPixel pixel = new TopoPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)(SiteVars.GroundSlope[site]); } else { // Inactive site pixel.Band0 = 0; } tmap.WritePixel(pixel); } } // Write wind speed map path = MapNames.ReplaceTemplateVars("./tests/Fire-2006/WSV-{timestep}.gis", Model.Core.CurrentTime); //path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime); IOutputRaster<UShortPixel> wsvmap = CreateTravelTimeMap(path); using (wsvmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)(SiteVars.SiteWindSpeed[site]); } else { // Inactive site pixel.Band0 = 0; } wsvmap.WritePixel(pixel); } } // Write ROS map path = MapNames.ReplaceTemplateVars("./tests/Fire-2006/ROS-{timestep}.gis", Model.Core.CurrentTime); //path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime); IOutputRaster<UShortPixel> rosmap = CreateTravelTimeMap(path); using (rosmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)(SiteVars.RateOfSpread[site]); } else { // Inactive site pixel.Band0 = 0; } rosmap.WritePixel(pixel); } } // Write AdjROS map path = MapNames.ReplaceTemplateVars("./tests/Fire-2006/AdjROS-{timestep}.gis", Model.Core.CurrentTime); //path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime); IOutputRaster<UShortPixel> adjmap = CreateTravelTimeMap(path); using (adjmap) { UShortPixel pixel = new UShortPixel(); foreach (Site site in Model.Core.Landscape.AllSites) { if (site.IsActive) { pixel.Band0 = (ushort)((SiteVars.AdjROS[site]) * 100); } else { // Inactive site pixel.Band0 = 0; } adjmap.WritePixel(pixel); } } WriteSummaryLog(Model.Core.CurrentTime); }