Ejemplo n.º 1
0
        //---------------------------------------------------------------------

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

        }