Beispiel #1
0
        /// <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;
                }
            }
        }
Beispiel #2
0
 /// <summary>
 /// Construct a forage info
 /// </summary>
 public TForageInfo()
 {
     FChemistryType = TForageChemistry.fcUnknown;
 }