/// <summary> /// Add a new paddock using ID and name /// </summary> /// <param name="ID"></param> /// <param name="sName"></param> public void Add(int ID, string sName) { TPaddockInfo NewPadd; NewPadd = new TPaddockInfo(); NewPadd.iPaddID = ID; NewPadd.sName = sName.ToLower(); this.Add(NewPadd); }
/// <summary> /// Add a new paddock object using reference and name /// </summary> /// <param name="paddObj"></param> /// <param name="sName"></param> public void Add(Object paddObj, string sName) { TPaddockInfo NewPadd; NewPadd = new TPaddockInfo(); NewPadd.iPaddID = this.Count() + 1; //???????? ID is 1 based here NewPadd.paddObj = paddObj; NewPadd.sName = sName.ToLower(); this.Add(NewPadd); }
/// <summary> /// Add a forage provider component /// </summary> /// <param name="paddock"></param> /// <param name="paddName"></param> /// <param name="forageName"></param> /// <param name="hostID"></param> /// <param name="driverID"></param> /// <param name="forageObj"></param> /// <param name="usePlantCohorts"></param> public void AddProvider(TPaddockInfo paddock, string paddName, string forageName, int hostID, int driverID, Object forageObj, bool usePlantCohorts) { TForageProvider forageProvider; //this is a forage provider // this provider can host a number of forages/species forageProvider = new TForageProvider(); forageProvider.PaddockOwnerName = paddName; // owning paddock forageProvider.ForageHostName = forageName; // host pasture/plant component name forageProvider.HostID = hostID; // plant/pasture comp forageProvider.DriverID = driverID; // driving property ID forageProvider.ForageObj = forageObj; // setting property ID // keep a ptr to the paddock owned by the model so the forages can be assigned there as they become available forageProvider.OwningPaddock = paddock; forageProvider.UseCohorts = usePlantCohorts; // use cohorts array type FForageProviderList.Add(forageProvider); }
/// <summary> /// Add a paddock /// </summary> /// <param name="Info"></param> public void Add(TPaddockInfo Info) { int Idx; Idx = FList.Length; Array.Resize(ref FList, Idx + 1); FList[Idx] = Info; }
/// <summary> /// Add( TAnimalList, TPaddockInfo, integer, integer ) /// Private variant. Adds all members of a TAnimalList back into the stock list /// </summary> /// <param name="AnimList"></param> /// <param name="PaddInfo"></param> /// <param name="iTagVal"></param> /// <param name="iPriority"></param> public void Add(TAnimalList AnimList, TPaddockInfo PaddInfo, int iTagVal, int iPriority) { int Idx; if (AnimList != null) for (Idx = 0; Idx <= AnimList.Count - 1; Idx++) { Add(AnimList.At(Idx), PaddInfo, iTagVal, iPriority); AnimList.SetAt(Idx, null); // Detach the animal group from the TAnimalList } }
/// <summary> /// Add a group of animals to the list /// Returns the group index of the group that was added. 0->n /// </summary> /// <param name="aGroup"></param> /// <param name="PaddInfo"></param> /// <param name="iTagVal"></param> /// <param name="iPriority"></param> /// <returns></returns> public int Add(TAnimalGroup aGroup, TPaddockInfo PaddInfo, int iTagVal, int iPriority) { int Idx; aGroup.Calc_IntakeLimit(); Idx = FStock.Length; Array.Resize(ref FStock, Idx + 1); FStock[Idx] = new TStockContainer(); FStock[Idx].Animals = aGroup.Copy(); FStock[Idx].PaddOccupied = PaddInfo; FStock[Idx].iTag = iTagVal; FStock[Idx].iPriority = iPriority; setInitialStockInputs(Idx); return Idx; }
private double getPaddockRank(TPaddockInfo aPaddock, TAnimalGroup aGroup) { double Result; GrazType.TGrazingInputs forageInputs; GrazType.TGrazingInputs paddockInputs; double[] fHerbageRI = new double[GrazType.DigClassNo + 1]; double[,] fSeedRI = new double[GrazType.MaxPlantSpp + 1, GrazType.RIPE + 1]; double fDummy = 0.0; int Jdx; int iClass; aGroup.PaddSteep = aPaddock.Steepness; aGroup.WaterLogging = aPaddock.fWaterlog; aGroup.RationFed.Assign(aPaddock.SuppInPadd); aGroup.RationFed.TotalAmount = 0.0; // No supplementary feed here paddockInputs = new GrazType.TGrazingInputs(); for (Jdx = 0; Jdx <= aPaddock.Forages.Count() - 1; Jdx++) { forageInputs = aPaddock.Forages.byIndex(Jdx).availForage(aGroup.Genotype.GrazeC[17], aGroup.Genotype.GrazeC[18], aGroup.Genotype.GrazeC[19]); GrazType.addGrazingInputs(Jdx + 1, forageInputs, ref paddockInputs); } aGroup.Herbage = paddockInputs; aGroup.CalculateRelIntake(aGroup, 1.0, false, 1.0, ref fHerbageRI, ref fSeedRI, ref fDummy); Result = 0.0; for (iClass = 1; iClass <= GrazType.DigClassNo; iClass++) // Function result is DMDI/pot. intake Result = Result + fHerbageRI[iClass] * GrazType.ClassDig[iClass]; return Result; }
/// <summary> /// Limits the length of a grazing sub-step so that no more than MAX_CONSUMPTION /// of the herbage is consumed. /// </summary> /// <param name="aPaddock"></param> /// <returns></returns> private double computeStepLength(TPaddockInfo aPaddock) { double Result; const double MAX_CONSUMPTION = 0.20; int iPosn; double[] fHerbageRI = new double[GrazType.DigClassNo + 1]; double[,] fSeedRI = new double[GrazType.MaxPlantSpp + 1, 3]; double fSuppRelIntake = 0.0; double fRemovalRate; double fRemovalTime; int iClass; iPosn = 1; // Find the first animal group occupying while ((iPosn <= Count()) && (getPaddInfo(iPosn) != aPaddock)) // ths paddock iPosn++; if ((iPosn > Count()) || (aPaddock.fArea <= 0.0)) Result = 1.0; else { At(iPosn).CalculateRelIntake(At(iPosn), 1.0, false, 1.0, ref fHerbageRI, ref fSeedRI, ref fSuppRelIntake); fRemovalTime = 9999.9; for (iClass = 1; iClass <= GrazType.DigClassNo; iClass++) if (FStock[iPosn].paddockInputs.Herbage[iClass].Biomass > 0.0) { fRemovalRate = aPaddock.fSummedPotIntake * fHerbageRI[iClass] / aPaddock.fArea; if (fRemovalRate > 0.0) fRemovalTime = Math.Min(fRemovalTime, FStock[iPosn].paddockInputs.Herbage[iClass].Biomass / fRemovalRate); } Result = Math.Max( 0.01, Math.Min( 1.0, MAX_CONSUMPTION * fRemovalTime ) ); } return Result; }
private void computeRemoval(TPaddockInfo aPaddock, double dDeltaTime) { TAnimalGroup aGroup; TForageInfo aForage; double fPropn; int iPosn; int iForage; int iClass; int iRipe; if (aPaddock.fArea > 0.0) { for (iPosn = 1; iPosn <= Count(); iPosn++) { if (getPaddInfo(iPosn) == aPaddock) { aGroup = At(iPosn); for (iForage = 0; iForage <= aPaddock.Forages.Count() - 1; iForage++) { aForage = aPaddock.Forages.byIndex(iForage); for (iClass = 1; iClass <= GrazType.DigClassNo; iClass++) { if (FStock[iPosn].paddockInputs.Herbage[iClass].Biomass > 0.0) { fPropn = FStock[iPosn].stepForageInputs[iForage].Herbage[iClass].Biomass / FStock[iPosn].paddockInputs.Herbage[iClass].Biomass; aForage.RemovalKG.Herbage[iClass] = aForage.RemovalKG.Herbage[iClass] + fPropn * dDeltaTime * aGroup.NoAnimals * FStock[iPosn].pastIntakeRate[0].Herbage[iClass]; if (aGroup.Young != null) aForage.RemovalKG.Herbage[iClass] = aForage.RemovalKG.Herbage[iClass] + fPropn * dDeltaTime * aGroup.Young.NoAnimals * FStock[iPosn].pastIntakeRate[1].Herbage[iClass]; } } for (iRipe = GrazType.UNRIPE; iRipe <= GrazType.RIPE; iRipe++) aForage.RemovalKG.Seed[1, iRipe] = aForage.RemovalKG.Seed[1, iRipe] + dDeltaTime * aGroup.NoAnimals * FStock[iPosn].pastIntakeRate[0].Seed[iForage + 1, iRipe]; if (aGroup.Young != null) for (iRipe = GrazType.UNRIPE; iRipe <= GrazType.RIPE; iRipe++) aForage.RemovalKG.Seed[1, iRipe] = aForage.RemovalKG.Seed[1, iRipe] + dDeltaTime * aGroup.Young.NoAnimals * FStock[iPosn].pastIntakeRate[1].Seed[iForage + 1, iRipe]; } //_ loop over forages within paddock _ aPaddock.SuppRemovalKG = aPaddock.SuppRemovalKG + dDeltaTime * aGroup.NoAnimals * FStock[iPosn].fSuppIntakeRate[0]; if (aGroup.Young != null) aPaddock.SuppRemovalKG = aPaddock.SuppRemovalKG + dDeltaTime * aGroup.Young.NoAnimals * FStock[iPosn].fSuppIntakeRate[1]; } //_ loop over animal groups within paddock _ } for (iPosn = 1; iPosn <= Count(); iPosn++) { if (getPaddInfo(iPosn) == aPaddock) { for (iForage = 0; iForage <= aPaddock.Forages.Count() - 1; iForage++) { aForage = aPaddock.Forages.byIndex(iForage); for (iClass = 1; iClass <= GrazType.DigClassNo; iClass++) FStock[iPosn].stepForageInputs[iForage].Herbage[iClass].Biomass = StdMath.DIM(FStock[iPosn].initForageInputs[iForage].Herbage[iClass].Biomass, aForage.RemovalKG.Herbage[iClass] / aPaddock.fArea); for (iRipe = GrazType.UNRIPE; iRipe <= GrazType.RIPE; iRipe++) FStock[iPosn].stepForageInputs[iForage].Seeds[iForage + 1, iRipe].Biomass = StdMath.DIM(FStock[iPosn].initForageInputs[iForage].Seeds[iForage + 1, iRipe].Biomass, aForage.RemovalKG.Seed[1, iRipe] / aPaddock.fArea); } //_ loop over forages within paddock _ } } } //_ if aPaddock.fArea > 0.0 _ }