示例#1
0
        //---------------------------------------------------------------------

        public bool Seeds(ISpecies species,
                          ActiveSite site)
        {
            if (!Reproduction.SufficientLight(species, site) ||
                !Reproduction.Establish(species, site))
            {
                return(false);
            }

            double randomNum = Random.GenerateUniform();

            foreach (RelativeLocation relLoc in neighborhoods[species.Index])
            {
                ActiveSite neighbor = site.GetNeighbor(relLoc) as ActiveSite;
                if (neighbor != null)
                {
                    float probability = seedDispersalMethod(species, neighbor, site);
                    if (randomNum < probability)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
 public static bool Algorithm(ISpecies species,
                              ActiveSite site)
 {
     return(Reproduction.SufficientLight(species, site) &&
            Reproduction.Establish(species, site) &&
            Reproduction.MaturePresent(species, site));
 }
 public static void Algorithm(//ISpecies   species,
     ActiveSite site)
 {
     foreach (ISpecies species in Model.Core.Species)
     {
         if (Reproduction.SufficientLight(species, site) && Reproduction.Establish(species, site))
         {
             Reproduction.AddNewCohort(species, site);
         }
     }
     //return Reproduction.SufficientLight(species, site) &&
     //       Reproduction.Establish(species, site);
 }
示例#4
0
        //---------------------------------------------------------------------

        public static bool Algorithm(ISpecies species,
                                     ActiveSite site)
        {
            if (!Reproduction.SufficientLight(species, site) ||
                !Reproduction.Establish(species, site))
            {
                return(false);
            }

            foreach (NeighborInfo neighborInfo in neighborhoods[species.Index])
            {
                ActiveSite neighbor = site.GetNeighbor(neighborInfo.RelativeLocation) as ActiveSite;
                if (neighbor != null)
                {
                    if (Util.Random.GenerateUniform() < neighborInfo.DistanceProbability)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
        //---------------------------------------------------------------------

        public static bool Algorithm(ISpecies species,
                                     ActiveSite site)
        {
            if (!Reproduction.SufficientLight(species, site) ||
                !Reproduction.Establish(species, site))
            {
                return(false);
            }

            if (Reproduction.MaturePresent(species, site))
            {
                return(true);
            }

            int row = (int)site.Location.Row;
            int col = (int)site.Location.Column;

            int cellDiam = (int)Model.CellLength;
            int EffD     = species.EffectiveSeedDist;
            int MaxD     = species.MaxSeedDist;

            double ratio = 0.95;            //the portion of the probability in the effective distance
            //lambda1 parameterized for effective distance
            double lambda1 = Math.Log(1 - ratio) / EffD;
            //lambda2 parameterized for maximum distance
            double lambda2 = Math.Log(0.01) / MaxD;

            double lowBound = 0, upBound = 0;
            //bool suitableDist=false;//flag to trigger if seed (plural) can get to a site based on distance probability
            double distanceProb = 0.0;
            int    pixRange     = Math.Max((int)((float)MaxD / (float)cellDiam), 1);
            int    maxrow       = (int)Math.Min(row + pixRange, Model.Landscape.Rows);
            int    minrow       = Math.Max(row - pixRange, 1);

            for (int i = minrow; i <= maxrow; i++)
            {
                int x1, x2;
                //float b = 5.0;
                findX1X2(out x1, out x2, col, row, i, pixRange);
                for (int j = x1; j <= x2; j++)
                {
                    Location loc = new Location((uint)i, (uint)j);
                    if (Model.Landscape.GetSite(loc, ref neighbor) && neighbor.IsActive)
                    {
                        if (Reproduction.MaturePresent(species, neighbor))
                        {
                            float distance = (float)Math.Sqrt((float)((row - i) * (row - i) + (col - j) * (col - j))) * cellDiam;              //Pythag

                            //set lower boundary to the theoretical (straight-line) edge of parent cell
                            lowBound = distance - cellDiam;
                            if (lowBound < 0)
                            {
                                lowBound = 0;
                            }

                            //set upper boundary to the outer theoretical boundary of the cell
                            upBound = distance;

                            if (cellDiam <= EffD)
                            {                            //Draw probabilities from either EffD or MaxD curves
                                if (distance <= (float)EffD)
                                {                        //BCW May 04
                                    distanceProb = Math.Exp(lambda1 * lowBound) - Math.Exp(lambda1 * upBound);
                                }
                                else
                                {                                //BCW May 04
                                    distanceProb = (1 - ratio) * Math.Exp(lambda2 * (lowBound - EffD)) - (1 - ratio) * Math.Exp(lambda2 * (upBound - EffD));
                                }
                            }
                            else
                            {
                                if (distance <= cellDiam)
                                {                                //Draw probabilities from both EffD and MaxD curves
                                    distanceProb = Math.Exp(lambda1 * lowBound) - (1 - ratio) * Math.Exp(lambda2 * (upBound - EffD));
                                }
                                else
                                {
                                    distanceProb = (1 - ratio) * Math.Exp(lambda2 * (lowBound - EffD)) - (1 - ratio) * Math.Exp(lambda2 * (upBound - EffD));
                                }
                            }
                            if (distanceProb > Landis.Util.Random.GenerateUniform())                            // && frand() < l->probRepro(speciesNum))  Modified BCW May '04
                            {
                                //  success = sites(row,col)->addNewCohort(s, sa, 10);
                                return(true);
                            }
                        }
                    }     // if neighor is active
                }         // for each column, j, of current row in neighborhood
            }             // for each row, i, in the neighborhood

            //  Search failed.
            return(false);
        }
示例#6
0
 public bool Seeds(ISpecies species,
                   ActiveSite site)
 {
     return(Reproduction.SufficientLight(species, site) &&
            Reproduction.Establish(species, site));
 }
示例#7
0
        //---------------------------------------------------------------------

        public static bool Algorithm(ISpecies species,
                                     ActiveSite site)
        {
            if (species.EffectiveSeedDist == EffectiveSeedDist.Universal)
            {
                return(UniversalDispersal.Algorithm(species, site));
            }

            if (!Reproduction.SufficientLight(species, site))
            {
                if (isDebugEnabled)
                {
                    log.DebugFormat("site {0}: {1} not seeded: insufficient light",
                                    site.Location, species.Name);
                }
                return(false);
            }

            if (!Reproduction.Establish(species, site))
            {
                if (isDebugEnabled)
                {
                    log.DebugFormat("site {0}: {1} not seeded: cannot establish",
                                    site.Location, species.Name);
                }
                return(false);
            }

            if (Reproduction.MaturePresent(species, site))
            {
                if (isDebugEnabled)
                {
                    log.DebugFormat("site {0}: {1} seeded on site",
                                    site.Location, species.Name);
                }
                return(true);
            }

            if (isDebugEnabled)
            {
                log.DebugFormat("site {0}: search neighbors for {1}",
                                site.Location, species.Name);
            }

            //UI.WriteLine("   Ward seed disersal.  Spp={0}, site={1},{2}.", species.Name, site.Location.Row, site.Location.Column);
            foreach (RelativeLocationWeighted reloc in Seeding.MaxSeedQuarterNeighborhood)
            {
                double distance = reloc.Weight;
                int    rRow     = (int)reloc.Location.Row;
                int    rCol     = (int)reloc.Location.Column;

                double EffD = (double)species.EffectiveSeedDist;
                double MaxD = (double)species.MaxSeedDist;

                if (distance > MaxD + ((double)Model.Core.CellLength / 2.0 * 1.414))
                {
                    return(false);  //Check no further
                }
                double dispersalProb = GetDispersalProbability(EffD, MaxD, distance);
                //UI.WriteLine("      DispersalProb={0}, EffD={1}, MaxD={2}, distance={3}.", dispersalProb, EffD, MaxD, distance);

                //First check the Southeast quadrant:
                if (dispersalProb > Landis.Util.Random.GenerateUniform())
                {
                    Site neighbor = site.GetNeighbor(reloc.Location);
                    if (neighbor != null && neighbor.IsActive)
                    {
                        if (Reproduction.MaturePresent(species, neighbor))
                        {
                            return(true);
                        }
                    }
                }

                //Next, check all other quadrants:
                if (dispersalProb > Landis.Util.Random.GenerateUniform())
                {
                    Site neighbor = site.GetNeighbor(new RelativeLocation(rRow * -1, rCol));
                    if (rCol == 0)
                    {
                        neighbor = site.GetNeighbor(new RelativeLocation(0, rRow));
                    }
                    if (neighbor != null && neighbor.IsActive)
                    {
                        if (Reproduction.MaturePresent(species, neighbor))
                        {
                            return(true);
                        }
                    }
                }

                if (dispersalProb > Landis.Util.Random.GenerateUniform())
                {
                    Site neighbor = site.GetNeighbor(new RelativeLocation(rRow * -1, rCol * -1));
                    if (neighbor != null && neighbor.IsActive)
                    {
                        if (Reproduction.MaturePresent(species, neighbor))
                        {
                            return(true);
                        }
                    }
                }

                if (dispersalProb > Landis.Util.Random.GenerateUniform())
                {
                    Site neighbor = site.GetNeighbor(new RelativeLocation(rRow, rCol * -1));
                    if (rCol == 0)
                    {
                        neighbor = site.GetNeighbor(new RelativeLocation(0, rRow * -1));
                    }
                    if (neighbor != null && neighbor.IsActive)
                    {
                        if (Reproduction.MaturePresent(species, neighbor))
                        {
                            return(true);
                        }
                    }
                }
            }  // end foreach relativelocation

            return(false);
        }
        //---------------------------------------------------------------------

        public static void Algorithm(//ISpecies   species,
            ActiveSite site)
        {
            foreach (RelativeLocationWeighted reloc in Seeding.MaxSeedQuarterNeighborhood)
            {
                double distance = reloc.Weight;

                foreach (ISpecies species in Model.Core.Species)
                {
                    if (species.EffectiveSeedDist == EffectiveSeedDist.Universal)
                    {
                        if (Reproduction.SufficientLight(species, site) &&
                            Reproduction.Establish(species, site))
                        {
                            Reproduction.AddNewCohort(species, site);
                            break;
                        }
                    }


                    int EffD = species.EffectiveSeedDist;
                    int MaxD = species.MaxSeedDist;

                    if (distance > MaxD)
                    {
                        break;                  //Check no further
                    }
                    double dispersalProb = 0.0;
                    if (reloc.Location.Row == 0 && reloc.Location.Column == 0)  //Check seeds on site
                    {
                        if (Reproduction.SufficientLight(species, site) &&
                            Reproduction.Establish(species, site) &&
                            Reproduction.MaturePresent(species, site))
                        {
                            Reproduction.AddNewCohort(species, site);
                            break;
                        }
                    }
                    else
                    {
                        dispersalProb = GetDispersalProbability(EffD, MaxD, distance);

                        //First check the Southeast quadrant:
                        Site neighbor = site.GetNeighbor(reloc.Location);
                        if (neighbor != null && neighbor.IsActive)
                        {
                            if (Reproduction.MaturePresent(species, neighbor))
                            {
                                if (dispersalProb > Landis.Util.Random.GenerateUniform())
                                {
                                    Reproduction.AddNewCohort(species, site);
                                    break;
                                }
                            }
                        }

                        //Next, check all other quadrants:
                        neighbor = site.GetNeighbor(new RelativeLocation(reloc.Location.Row * -1, reloc.Location.Column));
                        if (neighbor != null && neighbor.IsActive)
                        {
                            if (Reproduction.MaturePresent(species, neighbor))
                            {
                                if (dispersalProb > Landis.Util.Random.GenerateUniform())
                                {
                                    Reproduction.AddNewCohort(species, site);
                                    break;
                                }
                            }
                        }

                        neighbor = site.GetNeighbor(new RelativeLocation(reloc.Location.Row, reloc.Location.Column * -1));
                        if (neighbor != null && neighbor.IsActive)
                        {
                            if (Reproduction.MaturePresent(species, neighbor))
                            {
                                if (dispersalProb > Landis.Util.Random.GenerateUniform())
                                {
                                    Reproduction.AddNewCohort(species, site);
                                    break;
                                }
                            }
                        }

                        neighbor = site.GetNeighbor(new RelativeLocation(reloc.Location.Row * -1, reloc.Location.Column * -1));
                        if (neighbor != null && neighbor.IsActive)
                        {
                            if (Reproduction.MaturePresent(species, neighbor))
                            {
                                if (dispersalProb > Landis.Util.Random.GenerateUniform())
                                {
                                    Reproduction.AddNewCohort(species, site);
                                    break;
                                }
                            }
                        }
                    }
                } //end species loop
            }     // end foreach relativelocation

            return;
        }