//--------------------------------------------------------------------- ///<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"); }
//--------------------------------------------------------------------- ///<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); }