コード例 #1
0
ファイル: stock_padd.cs プロジェクト: hol353/ApsimX
        /// <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);
        }
コード例 #2
0
ファイル: stock_padd.cs プロジェクト: hol353/ApsimX
        /// <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);
        }
コード例 #3
0
ファイル: stock_padd.cs プロジェクト: hol353/ApsimX
        /// <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);
        }
コード例 #4
0
ファイル: stock_padd.cs プロジェクト: hol353/ApsimX
        /// <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;
        }
コード例 #5
0
ファイル: stock_intf.cs プロジェクト: hol353/ApsimX
        /// <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
                }
        }
コード例 #6
0
ファイル: stock_intf.cs プロジェクト: hol353/ApsimX
        /// <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;
        }
コード例 #7
0
ファイル: stock_intf.cs プロジェクト: hol353/ApsimX
        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;
        }
コード例 #8
0
ファイル: stock_intf.cs プロジェクト: hol353/ApsimX
        /// <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;
        }
コード例 #9
0
ファイル: stock_intf.cs プロジェクト: hol353/ApsimX
        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 _
        }