//---------------------------------------------------------------------

        public void OldestOfSelectedSpecies(ISpeciesCohorts         cohorts,
                                            ISpeciesCohortBoolArray isDamaged)
        {
            if (cohorts.Species == SelectedSpecies)
                //  Oldest is first cohort
                isDamaged[0] = true;
        }
        //---------------------------------------------------------------------

        #region ISpeciesCohortsDisturbance members

        /// <summary>
        /// Mark which cohorts for a species are to be cut (harvested).
        /// </summary>
        public void MarkCohortsForDeath(ISpeciesCohorts cohorts,
                                        ISpeciesCohortBoolArray isKilled)
        {
            CohortSelector.Harvest(cohorts, isKilled);

            int numKilled = 0;
            for (int i = 0; i < isKilled.Count; i++)
            {
                if (isKilled[i])
                {
                    cohortCounts.IncrementCount(cohorts.Species);
                    numKilled++;
                }
            }

            if (isDebugEnabled)
            {
                if (numKilled > 0)
                {
                    string ageList = "";
                    int i = 0;
                    foreach (ICohort cohort in cohorts)
                    {
                        if (isKilled[i])
                            ageList += string.Format(" {0}", cohort.Age);
                        i++;
                    }
                    log.DebugFormat("      Cut {0} :{1}", cohorts.Species.Name, ageList);
                }
            }
        }
        //---------------------------------------------------------------------

        public void AllExceptYoungest(ISpeciesCohorts         cohorts,
                                      ISpeciesCohortBoolArray isDamaged)
        {
            //  Youngest is the last cohort (at index Count - 1)
            for (int i = 0; i < (isDamaged.Count - 1); i++)
                isDamaged[i] = true;
        }
        //---------------------------------------------------------------------

    	/// <summary>
    	/// Selects which of a species' cohorts are harvested.
    	/// </summary>
    	public void Harvest(ISpeciesCohorts         cohorts,
                            ISpeciesCohortBoolArray isHarvested)
    	{
    	    SelectCohorts.Method selectionMethod;
    	    if (selectionMethods.TryGetValue(cohorts.Species, out selectionMethod))
    	        selectionMethod(cohorts, isHarvested);
    	}
        //---------------------------------------------------------------------

        /// <summary>
        /// Selects all of a species' cohorts for harvesting.
        /// </summary>
        public static void All(ISpeciesCohorts         cohorts,
                               ISpeciesCohortBoolArray isHarvested)
        {
            //loop through all cohorts and mark as harvested
            for (int i = 0; i < isHarvested.Count; i++)
                isHarvested[i] = true;
        }
        //---------------------------------------------------------------------

        /// <summary>
        /// Selects all of a species' cohorts for harvesting except the oldest.
        /// </summary>
        public static void AllExceptOldest(ISpeciesCohorts         cohorts,
                                           ISpeciesCohortBoolArray isHarvested)
        {
            //  Oldest is first (so start at i = 1 instead of i = 0)
            for (int i = 1; i < isHarvested.Count; i++)
                isHarvested[i] = true;
        }
        //---------------------------------------------------------------------

        public void AllOfSelectedSpecies(ISpeciesCohorts         cohorts,
                                         ISpeciesCohortBoolArray isDamaged)
        {
            if (cohorts.Species == SelectedSpecies) {
                for (int i = 0; i < isDamaged.Count; i++)
                    isDamaged[i] = true;
            }
        }
        //---------------------------------------------------------------------

        /// <summary>
        /// Selects all of a species' cohorts for harvesting except the
        /// youngest.
        /// </summary>
        public static void AllExceptYoungest(ISpeciesCohorts         cohorts,
                                             ISpeciesCohortBoolArray isHarvested)
        {
            //  Youngest is last.
            int youngestIndex = isHarvested.Count - 1;
            for (int i = 0; i < youngestIndex; i++)
                isHarvested[i] = true;
        }
 //---------------------------------------------------------------------
 /// <summary>
 /// Selects which of a species' cohorts are harvested.
 /// </summary>
 public void SelectCohorts(ISpeciesCohorts         cohorts,
     ISpeciesCohortBoolArray isHarvested)
 {
     int i = 0;
     foreach (ICohort cohort in cohorts) {
         AgeRange? notUsed;
         if (agesAndRanges.Contains(cohort.Age, out notUsed))
             isHarvested[i] = true;
         i++;
     }
 }
        //---------------------------------------------------------------------

        /// <summary>
        /// Selects which of a species' cohorts are harvested.
        /// </summary>
        public void SelectCohorts(ISpeciesCohorts         cohorts,
                                  ISpeciesCohortBoolArray isHarvested)
        {
            int i = 0;
            foreach (ICohort cohort in cohorts) {
                if (ages.Contains(cohort.Age))
                    isHarvested[i] = true;
                else {
                    foreach (AgeRange range in ranges) {
                        if (range.Contains(cohort.Age)) {
                            isHarvested[i] = true;
                            break;
                        }
                    }
                }
                i++;
            }
        }
        //---------------------------------------------------------------------

        public void Every2ndCohort(ISpeciesCohorts         cohorts,
                                   ISpeciesCohortBoolArray isDamaged)
        {
            int N = 2;
            //  Every Nth cohort, working from youngest to oldest
            int youngestIndex = isDamaged.Count - 1;
            for (int i = youngestIndex - (N - 1); i >= 0; i -= N)
                isDamaged[i] = true;
        }
        //---------------------------------------------------------------------

        void ISpeciesCohortsDisturbance.Damage(ISpeciesCohorts cohorts,
                                               ISpeciesCohortBoolArray isDamaged)
        {
            Damage(cohorts, isDamaged);
        }
        //---------------------------------------------------------------------

        /// <summary>
        /// Selects the youngest of a species' cohorts for harvesting.
        /// </summary>
        public static void Youngest(ISpeciesCohorts         cohorts,
                                    ISpeciesCohortBoolArray isHarvested)
        {
            //  Youngest is last.
            isHarvested[isHarvested.Count - 1] = true;
        }
        //---------------------------------------------------------------------

        /// <summary>
        /// Selects the oldest of a species' cohorts for harvesting.
        /// </summary>
        public static void Oldest(ISpeciesCohorts         cohorts,
                                  ISpeciesCohortBoolArray isHarvested)
        {
            //  Oldest is first.
            isHarvested[0] = true;
        }
        //---------------------------------------------------------------------

    	/// <summary>
    	/// Selects which of a species' cohorts are harvested.
    	/// </summary>
    	public void SelectCohorts(ISpeciesCohorts         cohorts,
                                  ISpeciesCohortBoolArray isHarvested)
    	{
    	    // TODO
    	    throw new System.NotImplementedException();
    	}
        //---------------------------------------------------------------------

        void ISpeciesCohortsDisturbance.MarkCohortsForDeath(ISpeciesCohorts cohorts,
                                                            ISpeciesCohortBoolArray isKilled)
        {
            cohortSelector.Harvest(cohorts, isKilled);
        }
        //---------------------------------------------------------------------

        void ISpeciesCohortsDisturbance.Damage(ISpeciesCohorts         cohorts,
                                               ISpeciesCohortBoolArray isDamaged)
        {
            cohortSelector.Harvest(cohorts, isDamaged);
        }
        //---------------------------------------------------------------------

        /// <summary>
        /// Selects the youngest of a species' cohorts for harvesting.
        /// </summary>
        public static void Youngest(ISpeciesCohorts cohorts,
                                    ISpeciesCohortBoolArray isHarvested)
        {
            //  Youngest is last.
            isHarvested[isHarvested.Count - 1] = true;
        }
        //---------------------------------------------------------------------

        /// <summary>
        /// Selects the oldest of a species' cohorts for harvesting.
        /// </summary>
        public static void Oldest(ISpeciesCohorts cohorts,
                                  ISpeciesCohortBoolArray isHarvested)
        {
            //  Oldest is first.
            isHarvested[0] = true;
        }
        //---------------------------------------------------------------------

    	/// <summary>
    	/// Selects which of a species' cohorts are harvested.
    	/// </summary>
    	public void Harvest(ISpeciesCohorts         cohorts,
                            ISpeciesCohortBoolArray isHarvested)
    	{
    	    for (int i = 0; i < isHarvested.Count; i++)
    	        isHarvested[i] = true;
    	}
        //---------------------------------------------------------------------

    	/// <summary>
    	/// Selects which of a species' cohorts are harvested.
    	/// </summary>
    	public void SelectCohorts(ISpeciesCohorts         cohorts,
                                  ISpeciesCohortBoolArray isHarvested)
    	{
    	    for (int i = isHarvested.Count - N; i >= 0; i -= N)
    	        isHarvested[i] = true;
    	}
        //---------------------------------------------------------------------

        void ISpeciesCohortsDisturbance.Damage(ISpeciesCohorts         cohorts,
                                               ISpeciesCohortBoolArray isDamaged)
        {
            Damage(cohorts, isDamaged);
        }
        //---------------------------------------------------------------------

        public void ClearCut(ISpeciesCohorts         cohorts,
                             ISpeciesCohortBoolArray isDamaged)
        {
            for (int i = 0; i < isDamaged.Count; i++)
                isDamaged[i] = true;
        }
        //---------------------------------------------------------------------

        void ISpeciesCohortsDisturbance.Damage(ISpeciesCohorts         cohorts,
                                               ISpeciesCohortBoolArray isDamaged)
        {
            cohortSelector.Harvest(cohorts, isDamaged);

            int cohortsKilled = 0;
            for (int i = 0; i < isDamaged.Count; i++)
                if (isDamaged[i])
                    cohortsKilled++;
            SiteVars.CohortsKilled[currentSite] = cohortsKilled;
        }
        //---------------------------------------------------------------------
        void ISpeciesCohortsDisturbance.MarkCohortsForDeath(ISpeciesCohorts cohorts,
                                                         ISpeciesCohortBoolArray isDamaged)
        {
            cohortSelector.Harvest(cohorts, isDamaged);

            int cohortsDamaged = 0;
            for (int i = 0; i < isDamaged.Count; i++) {
                if (isDamaged[i]) {
                    
                    //if this cohort is killed, update the damage table (for the stand of this site) with this species name
                    SiteVars.Stand[currentSite].UpdateDamageTable(cohorts.Species.Name);
                    //PlugIn.ModelCore.UI.WriteLine("Damaged:  {0}.", cohorts.Species.Name);
                    
                    //and increment the cohortsDamaged
                    cohortsDamaged++;
                }
            }
            SiteVars.CohortsDamaged[currentSite] += cohortsDamaged;
        }
 //---------------------------------------------------------------------
 void ISpeciesCohortsDisturbance.MarkCohortsForDeath(ISpeciesCohorts cohorts,
     ISpeciesCohortBoolArray isKilled)
 {
     cohortSelector.Harvest(cohorts, isKilled);
 }
        //---------------------------------------------------------------------

    	/// <summary>
    	/// Selects which of a species' cohorts are harvested.
    	/// </summary>
    	public void Harvest(ISpeciesCohorts         cohorts,
                            ISpeciesCohortBoolArray isHarvested)
    	{
    	    SelectionMethod(cohorts, isHarvested);
    	}