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

        /// <summary>
        /// Creates a cohort selection method for a specific set of ages and
        /// age ranges.
        /// </summary>
        /// <remarks>
        /// This overrides the base method so it can use the PartialThinning
        /// class to handle cohort selections with percentages. Added support
        /// for InsectDefoliation via LandCover cohort selections
        /// </remarks>
        protected override void CreateCohortSelectionMethodFor(ISpecies species,
                                                               IList <ushort> ages,
                                                               IList <AgeRange> ranges)
        {
            if (LandCover.LandCover.DontParseTrees)
            {
                if (!DensityThinning.CreateCohortSelectorFor(species, ages, ranges))
                {
                    base.CreateCohortSelectionMethodFor(species, ages, ranges);
                }
                //else if (!PartialThinning.CreateCohortSelectorFor(species, ages, ranges))
                //{
                //    base.CreateCohortSelectionMethodFor(species, ages, ranges);
                //}
            }
            else if (!LandCover.LandCover.CreateCohortSelectorFor(species, ages, ranges))
            {
                base.CreateCohortSelectionMethodFor(species, ages, ranges);
            }
        }
        //---------------------------------------------------------------------

        protected void ReadLandUses()
        {
            InputVar <string> name                = new InputVar <string>("LandUse");
            InputVar <ushort> mapCode             = new InputVar <ushort>("MapCode");
            InputVar <bool>   allowHarvest        = new InputVar <bool>("AllowHarvest?");
            InputVar <string> landCoverChangeType = new InputVar <string>("LandCoverChange");

            Dictionary <string, int> nameLineNumbers    = new Dictionary <string, int>();
            Dictionary <ushort, int> mapCodeLineNumbers = new Dictionary <ushort, int>();

            PartialThinning.InitializeClass();
            DensityThinning.InitializeClass();
            while (!AtEndOfInput)
            {
                int nameLineNum = LineNumber;
                ReadVar(name);
                int lineNumber;
                if (nameLineNumbers.TryGetValue(name.Value.Actual, out lineNumber))
                {
                    throw new InputValueException(name.Value.String,
                                                  "The land use \"{0}\" was previously used on line {1}",
                                                  name.Value.Actual, lineNumber);
                }
                else
                {
                    nameLineNumbers[name.Value.Actual] = nameLineNum;
                }

                int mapCodeLineNum = LineNumber;
                ReadVar(mapCode);
                if (mapCodeLineNumbers.TryGetValue(mapCode.Value.Actual, out lineNumber))
                {
                    throw new InputValueException(mapCode.Value.String,
                                                  "The map code \"{0}\" was previously used on line {1}",
                                                  mapCode.Value.Actual, lineNumber);
                }
                else
                {
                    mapCodeLineNumbers[mapCode.Value.Actual] = mapCodeLineNum;
                }

                ReadVar(allowHarvest);

                // By default, a land use allows trees to establish.
                bool allowEstablishment = true;
                if (ReadPreventEstablishment())
                {
                    allowEstablishment = false;
                }

                Dictionary <string, LandCover.IChange> landCoverChanges =
                    new Dictionary <string, LandCover.IChange>();
                List <LandCover.IChange> landCoverList = new List <LandCover.IChange>();
                ReadVar(landCoverChangeType);
                LandCover.IChange landCoverChange = ProcessLandCoverChange(landCoverChangeType);
                landCoverChanges[landCoverChange.Type] = landCoverChange;
                landCoverList.Add(landCoverChange);
                while (ReadOptionalVar(landCoverChangeType)) //Get extra LandCoverChanges
                {
                    if (landCoverChanges.TryGetValue(landCoverChangeType.Value.Actual, out landCoverChange))
                    {
                        throw new InputValueException(landCoverChangeType.Value.String,
                                                      "The land cover change \"{0}\" has already been defined for land use: {1}",
                                                      landCoverChangeType.Value.Actual, name.Value.Actual);
                    }
                    else
                    {
                        landCoverChange = ProcessLandCoverChange(landCoverChangeType);
                        landCoverChanges[landCoverChange.Type] = landCoverChange;
                        landCoverList.Add(landCoverChange);
                    }
                }

                LandCover.IChange[] changes = new LandCover.IChange[landCoverList.Count];
                for (int i = 0; i < landCoverList.Count; i++)
                {
                    changes[i] = landCoverList[i];
                }

                LandUse landUse = new LandUse(name.Value.Actual,
                                              mapCode.Value.Actual,
                                              allowHarvest.Value.Actual,
                                              allowEstablishment,
                                              changes);
                LandUseRegistry.Register(landUse);
            }
        }