Beispiel #1
0
        /// <inheritdoc/>
        public override List <ResourceRequest> GetResourcesNeededForActivity()
        {
            feedRequired = 0;

            // get list from filters
            foreach (LabourFeedGroup child in FindAllChildren <LabourFeedGroup>())
            {
                double value = child.Value;

                foreach (LabourType ind in child.Filter(labour?.Items))
                {
                    // feed limited to the daily intake per ae set in HumanFoodStoreType
                    switch (FeedStyle)
                    {
                    case LabourFeedActivityTypes.SpecifiedDailyAmountPerIndividual:
                        feedRequired += value * 30.4;
                        break;

                    case LabourFeedActivityTypes.SpecifiedDailyAmountPerAE:
                        feedRequired += value * ind.AdultEquivalent * 30.4;
                        break;

                    default:
                        throw new Exception(String.Format("FeedStyle {0} is not supported in {1}", FeedStyle, this.Name));
                    }
                }
            }

            if (feedRequired > 0)
            {
                //FeedTypeName includes the ResourceGroup name eg. AnimalFoodStore.FeedItemName
                string feedItemName = FeedTypeName.Split('.').Last();
                return(new List <ResourceRequest>()
                {
                    new ResourceRequest()
                    {
                        AllowTransmutation = true,
                        Required = feedRequired,
                        Resource = FeedType,
                        ResourceType = typeof(HumanFoodStore),
                        ResourceTypeName = feedItemName,
                        ActivityModel = this,
                        Category = TransactionCategory
                    }
                });
            }
            else
            {
                return(null);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Method to determine resources required for this activity in the current month
        /// </summary>
        /// <returns>List of required resource requests</returns>
        public override List <ResourceRequest> GetResourcesNeededForActivity()
        {
            feedRequired = 0;

            // get list from filters
            foreach (Model child in Apsim.Children(this, typeof(LabourFeedGroup)))
            {
                double value = (child as LabourFeedGroup).Value;

                foreach (LabourType ind in Resources.Labour().Items.Filter(child))
                {
                    // feed limited to the daily intake per ae set in HumanFoodStoreType
                    switch (FeedStyle)
                    {
                    case LabourFeedActivityTypes.SpecifiedDailyAmountPerIndividual:
                        feedRequired += Math.Min(value * 30.4, FeedType.MaximumDailyIntakePerAE * ind.AdultEquivalent * 30.4);
                        break;

                    case LabourFeedActivityTypes.SpecifiedDailyAmountPerAE:
                        feedRequired += Math.Min(value, FeedType.MaximumDailyIntakePerAE) * ind.AdultEquivalent * 30.4;
                        break;

                    default:
                        throw new Exception(String.Format("FeedStyle {0} is not supported in {1}", FeedStyle, this.Name));
                    }
                }
            }

            if (feedRequired > 0)
            {
                //FeedTypeName includes the ResourceGroup name eg. AnimalFoodStore.FeedItemName
                string feedItemName = FeedTypeName.Split('.').Last();
                return(new List <ResourceRequest>()
                {
                    new ResourceRequest()
                    {
                        AllowTransmutation = true,
                        Required = feedRequired,
                        ResourceType = typeof(HumanFoodStore),
                        ResourceTypeName = feedItemName,
                        ActivityModel = this,
                        Reason = "Consumption"
                    }
                });
            }
            else
            {
                return(null);
            }
        }
Beispiel #3
0
        /// <summary>
        /// Method to determine resources required for this activity in the current month
        /// </summary>
        /// <returns>List of required resource requests</returns>
        public override List <ResourceRequest> GetResourcesNeededForActivity()
        {
            List <Ruminant> herd = CurrentHerd(false);

            // get zero limited month from clock
            int month = Clock.Today.Month - 1;

            feedRequired = 0;

            // get list from filters
            foreach (Model child in this.Children.Where(a => a.GetType().ToString().Contains("RuminantFeedGroup")))
            {
                double value = 0;
                if (child is RuminantFeedGroup)
                {
                    value = (child as RuminantFeedGroup).Value;
                }
                else
                {
                    value = (child as RuminantFeedGroupMonthly).MonthlyValues[month];
                }

                if (FeedStyle == RuminantFeedActivityTypes.SpecifiedDailyAmount)
                {
                    feedRequired += value * 30.4;
                }
                else
                {
                    foreach (Ruminant ind in herd.Filter(child))
                    {
                        switch (FeedStyle)
                        {
                        case RuminantFeedActivityTypes.SpecifiedDailyAmountPerIndividual:
                            feedRequired += value * 30.4;
                            break;

                        case RuminantFeedActivityTypes.ProportionOfWeight:
                            feedRequired += value * ind.Weight * 30.4;
                            break;

                        case RuminantFeedActivityTypes.ProportionOfPotentialIntake:
                            feedRequired += value * ind.PotentialIntake;
                            break;

                        case RuminantFeedActivityTypes.ProportionOfRemainingIntakeRequired:
                            feedRequired += value * (ind.PotentialIntake - ind.Intake);
                            break;

                        default:
                            throw new Exception(String.Format("FeedStyle {0} is not supported in {1}", FeedStyle, this.Name));
                        }
                    }
                }
            }

            if (feedRequired > 0)
            {
                //FeedTypeName includes the ResourceGroup name eg. AnimalFoodStore.FeedItemName
                string feedItemName = FeedTypeName.Split('.').Last();
                return(new List <ResourceRequest>()
                {
                    new ResourceRequest()
                    {
                        AllowTransmutation = true,
                        Required = feedRequired,
                        ResourceType = typeof(AnimalFoodStore),
                        ResourceTypeName = feedItemName,
                        ActivityModel = this
                    }
                });
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// Method to determine resources required for this activity in the current month
        /// </summary>
        /// <returns>List of required resource requests</returns>
        public override List <ResourceRequest> GetResourcesNeededForActivity()
        {
            var herd = CurrentHerd(false);

            feedEstimated     = 0;
            feedToSatisfy     = 0;
            feedToOverSatisfy = 0;

            // get list from filters
            foreach (IFilterGroup child in Children.Where(a => a.GetType().ToString().Contains("RuminantFeedGroup")))
            {
                var selectedIndividuals = herd.FilterRuminants(child);

                switch (FeedStyle)
                {
                case RuminantFeedActivityTypes.SpecifiedDailyAmountPerIndividual:
                case RuminantFeedActivityTypes.ProportionOfWeight:
                case RuminantFeedActivityTypes.ProportionOfFeedAvailable:
                case RuminantFeedActivityTypes.SpecifiedDailyAmount:
                    usingPotentialintakeMultiplier = true;
                    break;
                }

                // get the amount that can be eaten. Does not account for individuals in multiple filters
                // accounts for some feeding style allowing overeating to the user declared value in ruminant
                feedToSatisfy     += selectedIndividuals.Sum(a => a.PotentialIntake - a.Intake);
                feedToOverSatisfy += selectedIndividuals.Sum(a => a.PotentialIntake * (usingPotentialintakeMultiplier ? a.BreedParams.OverfeedPotentialIntakeModifier : 1) - a.Intake);

                double value = 0;
                if (child is RuminantFeedGroup)
                {
                    value = (child as RuminantFeedGroup).Value;
                }
                else
                {
                    value = (child as RuminantFeedGroupMonthly).MonthlyValues[Clock.Today.Month - 1];
                }

                if (FeedStyle == RuminantFeedActivityTypes.SpecifiedDailyAmount)
                {
                    feedEstimated += value * 30.4;
                }
                else if (FeedStyle == RuminantFeedActivityTypes.ProportionOfFeedAvailable)
                {
                    feedEstimated += value * FeedType.Amount;
                }
                else
                {
                    foreach (Ruminant ind in selectedIndividuals)
                    {
                        switch (FeedStyle)
                        {
                        case RuminantFeedActivityTypes.SpecifiedDailyAmountPerIndividual:
                            feedEstimated += value * 30.4;
                            break;

                        case RuminantFeedActivityTypes.ProportionOfWeight:
                            feedEstimated += value * ind.Weight * 30.4;
                            break;

                        case RuminantFeedActivityTypes.ProportionOfPotentialIntake:
                            feedEstimated += value * ind.PotentialIntake;
                            break;

                        case RuminantFeedActivityTypes.ProportionOfRemainingIntakeRequired:
                            feedEstimated += value * (ind.PotentialIntake - ind.Intake);
                            break;

                        default:
                            throw new Exception(String.Format("FeedStyle {0} is not supported in {1}", FeedStyle, this.Name));
                        }
                    }
                }
            }

            if (StopFeedingWhenSatisfied)
            {
                // restrict to max intake permitted by individuals and avoid overfeed wastage
                feedEstimated = Math.Min(feedEstimated, Math.Max(feedToOverSatisfy, feedToSatisfy));
            }

            if (feedEstimated > 0)
            {
                // FeedTypeName includes the ResourceGroup name eg. AnimalFoodStore.FeedItemName
                string feedItemName = FeedTypeName.Split('.').Last();
                return(new List <ResourceRequest>()
                {
                    new ResourceRequest()
                    {
                        AllowTransmutation = true,
                        Required = feedEstimated,
                        ResourceType = typeof(AnimalFoodStore),
                        ResourceTypeName = feedItemName,
                        ActivityModel = this,
                        Category = "Feed",
                        RelatesToResource = this.PredictedHerdName
                    }
                });
            }
            else
            {
                return(null);
            }
        }