private void OnCLEMInitialiseActivity(object sender, EventArgs e) { // activity is performed in CLEMDoCutAndCarry not CLEMGetResources this.AllocationStyle = ResourceAllocationStyle.Manual; // get pasture pasture = Resources.GetResourceItem(this, PaddockName, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop) as GrazeFoodStoreType; // get food store foodstore = Resources.GetResourceItem(this, AnimalFoodStoreName, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop) as AnimalFoodStoreType; // locate a cut and carry limiter associarted with this event. limiter = LocateCutAndCarryLimiter(this); switch (CutStyle) { case RuminantFeedActivityTypes.ProportionOfPotentialIntake: case RuminantFeedActivityTypes.ProportionOfRemainingIntakeRequired: case RuminantFeedActivityTypes.ProportionOfWeight: case RuminantFeedActivityTypes.SpecifiedDailyAmountPerIndividual: InitialiseHerd(true, true); break; default: break; } }
private void OnCLEMInitialiseActivity(object sender, EventArgs e) { InsideMultiHarvestSequence = false; // activity is performed in CLEMDoCutAndCarry not CLEMGetResources this.AllocationStyle = ResourceAllocationStyle.Manual; fileCrop = simulation.FindAllDescendants().Where(a => a.Name == ModelNameFileCrop).FirstOrDefault() as IFileCrop; if (fileCrop == null) { throw new ApsimXException(this, String.Format("Unable to locate crop data reader [x={0}] requested by [a={1}]", this.ModelNameFileCrop ?? "Unknown", this.Name)); } LinkedResourceItem = Resources.FindResourceType <ResourceBaseWithTransactions, IResourceType>(this, StoreItemName, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop); if ((LinkedResourceItem as Model).Parent is GrazeFoodStore) { // set manager of graze food store if linked (LinkedResourceItem as GrazeFoodStoreType).Manager = (Parent as IPastureManager); addReason = "Growth"; } // look up tree until we find a parent to allow nested crop products for rotate vs mixed cropping/products parentManagementActivity = FindAncestor <CropActivityManageCrop>(); // Retrieve harvest data from the forage file for the entire run. // only get entries where a harvest happened (Amtkg > 0) HarvestData = fileCrop.GetCropDataForEntireRun(parentManagementActivity.LinkedLandItem.SoilType, CropName, clock.StartDate, clock.EndDate).Where(a => a.AmtKg > 0).OrderBy(a => a.Year * 100 + a.Month).ToList <CropDataType>(); if ((HarvestData == null) || (HarvestData.Count == 0)) { Summary.WriteWarning(this, $"Unable to locate any harvest data in [x={fileCrop.Name}] using [x={fileCrop.FileName}] for soil type [{parentManagementActivity.LinkedLandItem.SoilType}] and crop name [{CropName}] between the dates [{clock.StartDate.ToShortDateString()}] and [{clock.EndDate.ToShortDateString()}]"); } IsTreeCrop = (TreesPerHa == 0) ? false : true; //using this boolean just makes things more readable. UnitsToHaConverter = (parentManagementActivity.LinkedLandItem.Parent as Land).UnitsOfAreaToHaConversion; // locate a cut and carry limiter associated with this event. limiter = LocateCutAndCarryLimiter(this); // check if harvest type tags have been provided HarvestTagsUsed = HarvestData.Where(a => a.HarvestType != "").Count() > 0; if (LinkedResourceItem is GrazeFoodStoreType) { double firstMonthsGrowth = 0; CropDataType cropData = HarvestData.Where(a => a.Year == clock.StartDate.Year && a.Month == clock.StartDate.Month).FirstOrDefault(); if (cropData != null) { firstMonthsGrowth = cropData.AmtKg; } (LinkedResourceItem as GrazeFoodStoreType).SetupStartingPasturePools(UnitsToHaConverter * (Parent as CropActivityManageCrop).Area * UnitsToHaConverter, firstMonthsGrowth); addReason = "Growth"; } }
/// <summary> /// Method to locate a ActivityCutAndCarryLimiter /// </summary> /// <param name="model"></param> /// <returns></returns> private ActivityCutAndCarryLimiter LocateCutAndCarryLimiter(IModel model) { // search children ActivityCutAndCarryLimiter limiterFound = Apsim.Children(model, typeof(ActivityCutAndCarryLimiter)).Cast <ActivityCutAndCarryLimiter>().FirstOrDefault(); if (limiterFound == null) { if (model.Parent.GetType().IsSubclassOf(typeof(CLEMActivityBase)) || model.Parent.GetType() == typeof(ActivitiesHolder)) { limiterFound = LocateCutAndCarryLimiter(model.Parent); } } return(limiterFound); }
private void OnCLEMInitialiseActivity(object sender, EventArgs e) { // activity is performed in CLEMDoCutAndCarry not CLEMGetResources this.AllocationStyle = ResourceAllocationStyle.Manual; // get pasture pasture = Resources.GetResourceItem(this, PaddockName, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop) as GrazeFoodStoreType; // get food store foodstore = Resources.GetResourceItem(this, AnimalFoodStoreName, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop) as AnimalFoodStoreType; // locate a cut and carry limiter associarted with this event. limiter = LocateCutAndCarryLimiter(this); }
private void OnCLEMInitialiseActivity(object sender, EventArgs e) { // activity is performed in CLEMDoCutAndCarry not CLEMGetResources this.AllocationStyle = ResourceAllocationStyle.Manual; fileCrop = Apsim.ChildrenRecursively(Simulation).Where(a => a.Name == ModelNameFileCrop).FirstOrDefault() as IFileCrop; if (fileCrop == null) { throw new ApsimXException(this, String.Format("Unable to locate model for crop input file [x={0}] referred to in [a={1}]", this.ModelNameFileCrop ?? "Unknown", this.Name)); } LinkedResourceItem = Resources.GetResourceItem(this, StoreItemName, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop) as IResourceType; if ((LinkedResourceItem as Model).Parent.GetType() == typeof(GrazeFoodStore)) { (LinkedResourceItem as GrazeFoodStoreType).Manager = (Parent as IPastureManager); addReason = "Growth"; } // look up tree until we find a parent to allow nested crop products for rotate vs mixed cropping/products parentManagementActivity = Apsim.Parent(this, typeof(CropActivityManageCrop)) as CropActivityManageCrop; // Retrieve harvest data from the forage file for the entire run. // only get entries where a harvest happened (Amtkg > 0) HarvestData = fileCrop.GetCropDataForEntireRun(parentManagementActivity.LinkedLandItem.SoilType, CropName, Clock.StartDate, Clock.EndDate).Where(a => a.AmtKg > 0).OrderBy(a => a.Year * 100 + a.Month).ToList <CropDataType>(); if ((HarvestData == null) || (HarvestData.Count == 0)) { Summary.WriteWarning(this, String.Format("Unable to locate any harvest data in [x={0}] using [x={1}] for soil type [{2}] and crop name [{3}] between the dates [{4}] and [{5}]", fileCrop.Name, fileCrop.FileName, parentManagementActivity.LinkedLandItem.SoilType, CropName, Clock.StartDate.ToShortDateString(), Clock.EndDate.ToShortDateString())); } IsTreeCrop = (TreesPerHa == 0) ? false : true; //using this boolean just makes things more readable. UnitsToHaConverter = (parentManagementActivity.LinkedLandItem.Parent as Land).UnitsOfAreaToHaConversion; // locate a cut and carry limiter associated with this event. limiter = LocateCutAndCarryLimiter(this); // set manager of graze food store if linked }