/// <summary> /// This method populates the TForageInfo with the data about the various herbage /// fractions that the animals can eat /// </summary> /// <param name="sCohort"></param> /// <param name="sOrgan"></param> /// <param name="sAgeClass"></param> /// <param name="sChem"></param> /// <param name="dBottom"></param> /// <param name="dTop"></param> /// <param name="dMass"></param> /// <param name="dNitrogen"></param> /// <param name="dPhosphorus"></param> /// <param name="dSulphur"></param> /// <param name="dAshAlk"></param> public void addForageData(string sCohort, string sOrgan, string sAgeClass, string sChem, double dBottom, double dTop, double dMass, double dNitrogen, double dPhosphorus, double dSulphur, double dAshAlk) { int iAddingSeedType; bool bAddingLegume; bool bAddingC4Grass; bool bAddingGreen = false; bool bMatched; int iChem; sCohort = sCohort.ToLower(); sOrgan = sOrgan.ToLower(); sAgeClass = sAgeClass.ToLower(); sChem = sChem.ToLower(); if ((sOrgan == "seed_unripe") || (sOrgan == "head_unripe") || (sOrgan == "ear_unripe")) iAddingSeedType = GrazType.UNRIPE; else if ((sOrgan == "seed_ripe") || (sOrgan == "head_ripe") || (sOrgan == "ear_ripe")) iAddingSeedType = GrazType.RIPE; else if ((sOrgan == "ripe") || (sOrgan == "head") || (sOrgan == "ear")) iAddingSeedType = GrazType.RIPE; else iAddingSeedType = NOT_SEED; if (iAddingSeedType == NOT_SEED) { bAddingLegume = FindPostFix(ref sChem, postfix_LEGUME); bAddingC4Grass = FindPostFix(ref sChem, postfix_C4GRASS); string[] ages = { "green", "live", "seedling", "established", "senescing" }; int i = 0; while ((i < ages.Length) && (!bAddingGreen)) { bAddingGreen = (sCohort == ages[i]); i++; } } else { bAddingLegume = false; bAddingC4Grass = false; bAddingGreen = false; } // The very first piece of forage information, so set the chemistry translation type if (FChemistryType == TForageChemistry.fcUnknown) { FChemistryType = TForageChemistry.fcVarDMDClasses; iChem = 0; bMatched = false; while (!bMatched && (FChemistryType != TForageChemistry.fcUnknown)) { bMatched = (sChem == this.CHEMISTRY_CLASSES[(int)FChemistryType, iChem]); if (!bMatched && (iChem < this.CHEM_COUNT[(int)FChemistryType] - 1)) iChem++; else if (!bMatched) { FChemistryType--; iChem = 0; } } } if (FChemistryType == TForageChemistry.fcUnknown) throw new Exception("Chemistry class \"" + sChem + "\" in AvailableToAnimal not recognised"); // Which chemistry class within the cohort does this piece of forage belong to? iChem = this.CHEM_COUNT[(int)FChemistryType] - 1; while ((iChem >= 0) && (sChem != this.CHEMISTRY_CLASSES[(int)FChemistryType, iChem])) iChem--; if (iChem < 0) throw new Exception("Chemistry class \"" + sChem + "\" in AvailableToAnimal incompatible with a previous chemistry class"); // Add the piece of forage into the data structure if (dMass > 0) { this.FBottom_MM = Math.Min(this.FBottom_MM, dBottom); FTop_MM = Math.Min(FTop_MM, dTop); if (FChemData[iChem].dMass_KgHa == 0.0) { FChemData[iChem].dMass_KgHa = dMass; FChemData[iChem].dNitrogen_KgHa = dNitrogen; FChemData[iChem].dPhosphorus_KgHa = dPhosphorus; FChemData[iChem].dSulphur_KgHa = dSulphur; FChemData[iChem].dAshAlk_MolHa = dAshAlk; FSeedType = iAddingSeedType; FIsGreen = bAddingGreen; if (bAddingLegume) FLegumeMass = dMass; else FLegumeMass = 0.0; if (bAddingC4Grass) this.FC4GrassMass = dMass; else this.FC4GrassMass = 0.0; } else if (FChemData[iChem].dMass_KgHa > 0.0) { FChemData[iChem].dMass_KgHa = FChemData[iChem].dMass_KgHa + dMass; FChemData[iChem].dNitrogen_KgHa = FChemData[iChem].dNitrogen_KgHa + dNitrogen; FChemData[iChem].dPhosphorus_KgHa = FChemData[iChem].dPhosphorus_KgHa + dPhosphorus; FChemData[iChem].dSulphur_KgHa = FChemData[iChem].dSulphur_KgHa + dSulphur; FChemData[iChem].dAshAlk_MolHa = FChemData[iChem].dAshAlk_MolHa + dAshAlk; if (iAddingSeedType != FSeedType) throw new Exception("Cannot mix seed and non-seed"); if (bAddingLegume != (FLegumeMass > 0)) throw new Exception("Cannot mix legume and non-legume forages"); else if (bAddingLegume) FLegumeMass = FLegumeMass + dMass; if (bAddingC4Grass != (this.FC4GrassMass > 0)) throw new Exception("Cannot mix legume and non-legume forages"); else if (bAddingC4Grass) this.FC4GrassMass = this.FC4GrassMass + dMass; } } }
/// <summary> /// Construct a forage info /// </summary> public TForageInfo() { FChemistryType = TForageChemistry.fcUnknown; }