/// <summary> /// Adds an amount of a supplement to a store. /// * If the store name already exists in the FStores array, the method adds /// the supplement to that store. Otherwise a new store is created. /// * The DMP, DMD, MEDM, CP, DG, EE and ADIP2CP parameters may be set to zero, /// in which case the default values for the supplement name are used. /// Defaults are taken from the current store if the name is already defined, /// and from grazSUPP.PAS otherwise. If defaults cannot be found for a name, /// wheat is used as the default composition. /// </summary> /// <param name="suppKg">Amount (kg fresh weight) of the supplement to be included in the store.</param> /// <param name="suppName">Name of the supplement.</param> /// <param name="roughage">The roughage.</param> /// <param name="DMP">Proportion of the fresh weight which is dry matter kg/kg FW</param> /// <param name="DMD">Dry matter digestibility of the supplement kg/kg DM</param> /// <param name="MEDM">Metabolisable energy content of dry matter MJ/kg DM</param> /// <param name="CP">Crude protein content kg/kg DM</param> /// <param name="DG">Degradability of the crude protein kg/kg CP</param> /// <param name="EE">Ether-extractable content kg/kg DM</param> /// <param name="ADIP2CP">Ratio of acid detergent insoluble protein to CP kg/kg CP</param> /// <param name="phos">Phosphorus content kg/kg DM</param> /// <param name="sulf">Sulphur content kg/kg DM</param> /// <param name="ashAlk">Ash alkalinity mol/kg DM</param> /// <param name="maxPass">Maximum passage rate 0-1</param> /// <returns> /// Index of the supplement in the store /// </returns> public int AddToStore(double suppKg, string suppName, int roughage = DEFAULT, double DMP = 0.0, double DMD = 0.0, double MEDM = 0.0, double CP = 0.0, double DG = 0.0, double EE = 0.0, double ADIP2CP = 0.0, double phos = 0.0, double sulf = 0.0, double ashAlk = 0.0, double maxPass = 0.0) { int idx = IndexOf(suppName); TSupplement addSupp = new TSupplement(suppName); if (idx >= 0) // Work out the composition of the supplement being added addSupp.Assign(this[idx]); else addSupp.DefaultFromName(); addSupp.sName = suppName.ToLower(); if (roughage == ROUGHAGE) // Override the default composition as required addSupp.IsRoughage = true; else if (roughage != DEFAULT) addSupp.IsRoughage = false; if (DMP > 0.0) addSupp.DM_Propn = DMP; if (DMD > 0.0) addSupp.DM_Digestibility = DMD; if (MEDM > 0.0) addSupp.ME_2_DM = MEDM; if (CP > 0.0) addSupp.CrudeProt = CP; if (DG > 0.0) addSupp.DgProt = DG; if (EE > 0.0) addSupp.EtherExtract = EE; if (ADIP2CP > 0.0) addSupp.ADIP_2_CP = ADIP2CP; if (phos > 0.0) addSupp.Phosphorus = phos; if (sulf > 0.0) addSupp.Sulphur = sulf; if (ashAlk > 0.0) addSupp.AshAlkalinity = ashAlk; if (maxPass > 0.0) addSupp.MaxPassage = maxPass; if (DMD > 0.0 && MEDM == 0.0) addSupp.ME_2_DM = addSupp.DefaultME2DM(); else if (DMD == 0.0 && MEDM > 0.0) addSupp.DM_Digestibility = addSupp.DefaultDMD(); return AddToStore(suppKg, addSupp); }
/// <summary> /// Blends the specified source store. /// </summary> /// <param name="srcStore">The source store.</param> /// <param name="transferKg">The transfer kg.</param> /// <param name="destStore">The dest store.</param> /// <exception cref="System.Exception">Supplement \ + srcStore + \ not recognised</exception> public void Blend(string srcStore, double transferKg, string destStore) { int iSrc = IndexOf(srcStore); if (iSrc < 0) throw new Exception("Supplement \"" + srcStore + "\" not recognised"); transferKg = System.Math.Min(transferKg, this[iSrc].Amount); if (transferKg > 0.0) { int iDest = IndexOf(destStore); if (iDest < 0) { TSupplement newSupp = new TSupplement(); newSupp.Assign(this[iSrc]); newSupp.sName = destStore; iDest = AddToStore(0.0, newSupp); } Transfer(this, iSrc, this, iDest, transferKg); } }
/// <summary> /// Transfers the specified source. /// </summary> /// <param name="src">The source.</param> /// <param name="srcIdx">Index of the source.</param> /// <param name="dest">The dest.</param> /// <param name="destIdx">Index of the dest.</param> /// <param name="amount">The amount.</param> /// <exception cref="System.Exception">Invalid transfer of feed</exception> private void Transfer(TSupplementRation src, int srcIdx, TSupplementRation dest, int destIdx, double amount) { if (srcIdx < 0 || srcIdx >= src.Count || destIdx < 0 || destIdx > dest.Count) throw new Exception("Invalid transfer of feed"); if (src[srcIdx].Amount > 0) { if (amount > 0.0) { if (destIdx < dest.Count) SuppIntoRation(dest, destIdx, src[srcIdx], amount); else { TSupplement copy = new TSupplement(); copy.Assign(src[srcIdx]); dest.Add(copy, amount); } src[srcIdx].Amount -= amount; } } else dest[destIdx].Amount = 0; }
/// <summary> /// Feed the supplement /// </summary> /// <param name="fNewAmount"></param> /// <param name="NewSupp"></param> public void FeedSupplement(double fNewAmount, TSupplement NewSupp) { TSupplement aSupp; bool bFound; int Idx; if (fNewAmount > 0.0) { Idx = 0; bFound = false; while (!bFound && (Idx < SuppInPadd.Count)) { bFound = NewSupp.isSameAs(SuppInPadd[Idx]); if (!bFound) Idx++; } if (bFound) SuppInPadd[Idx].Amount = SuppInPadd[Idx].Amount + fNewAmount; else { aSupp = new TSupplement(); aSupp.Assign(NewSupp); SuppInPadd.Add(aSupp, fNewAmount); } } }