Esempio n. 1
0
        private void OnDoPhenology(object sender, EventArgs e)
        {
            if (PlantIsAlive)
            {
                if (thermalTime.Value() < 0)
                {
                    throw new Exception("Negative Thermal Time, check the set up of the ThermalTime Function in" + this);
                }

                // Calculate progression through current phase
                double propOfDayToUse = 1;
                bool   incrementPhase = CurrentPhase.DoTimeStep(ref propOfDayToUse);

                //sorghum resets the stage variable to 0 on the day the phase changes
                //it will resume again normally the day after
                double resetSorghumStage = SorghumFlag != null && incrementPhase ? 0.0 : 1.0;

                while (incrementPhase)
                {
                    if ((CurrentPhase is EmergingPhase) || (CurrentPhase.End == structure?.LeafInitialisationStage))
                    {
                        Emerged = true;
                    }

                    stagesPassedToday.Add(CurrentPhase.End);
                    if (currentPhaseIndex + 1 >= phases.Count)
                    {
                        throw new Exception("Cannot transition to the next phase. No more phases exist");
                    }

                    currentPhaseIndex = currentPhaseIndex + 1;

                    PhaseChangedType PhaseChangedData = new PhaseChangedType();
                    PhaseChangedData.StageName = CurrentPhase.Start;
                    PhaseChanged?.Invoke(plant, PhaseChangedData);

                    if (SorghumFlag != null && CurrentPhase is EmergingPhase)
                    {
                        propOfDayToUse = 0.0;
                    }
                    incrementPhase = CurrentPhase.DoTimeStep(ref propOfDayToUse);
                }

                AccumulatedTT += thermalTime.Value();
                if (Emerged)
                {
                    AccumulatedEmergedTT += thermalTime.Value();
                }

                Stage = (currentPhaseIndex + 1) + resetSorghumStage * CurrentPhase.FractionComplete;

                if (plant != null)
                {
                    if (plant.IsAlive && PostPhenology != null)
                    {
                        PostPhenology.Invoke(this, new EventArgs());
                    }
                }
            }
        }
Esempio n. 2
0
 private void OnPhaseChanged(object sender, PhaseChangedType phaseChange)
 {
     if (phaseChange.StageName == SetEvent)
     {
         CropVernalised = true;
     }
 }
Esempio n. 3
0
 private void OnPhaseChanged(PhaseChangedType PhaseChange)
 {
     string message = Phenology.CurrentPhase.Start + "\r\n";
     if (Leaf != null)
     {
         message += "  LAI = " + Leaf.LAI.ToString("f2") + " (m^2/m^2)" + "\r\n";
         message += "  Above Ground Biomass = " + AboveGround.Wt.ToString("f2") + " (g/m^2)" + "\r\n";
     }
     Summary.WriteMessage(this, message);
 }
Esempio n. 4
0
        private void OnPhaseChanged(object sender, PhaseChangedType phaseChange)
        {
            if (phaseChange.StageName == EndStage)
            {
                TodaysVernalisation = 0.0;
            }

            if (phaseChange.StageName == ResetStage)
            {
                DaysVernalised  = 0.0;
                DaysVernalising = 0.0;
            }
        }
Esempio n. 5
0
        private void OnPhaseChanged(object sender, PhaseChangedType phaseChange)
        {
            if (phaseChange.EventStageName == EndStage)
            {
                vernalisedToday = 0.0;
            }

            if (phaseChange.EventStageName == ResetStage)
            {
                permanentVernalisedDays  = 0.0;
                temporaryVernalisingDays = 0.0;
            }
        }
Esempio n. 6
0
        private void OnHarvesting(object sender, EventArgs e)
        {
            if (sender == Plant)
            {
                //Jump phenology to the end

                string           OldPhaseName     = CurrentPhase.Name;
                int              EndPhase         = Phases.Count;
                PhaseChangedType PhaseChangedData = new PhaseChangedType();
                PhaseChangedData.OldPhaseName = OldPhaseName;
                PhaseChangedData.NewPhaseName = Phases[EndPhase - 1].Name;
                PhaseChanged.Invoke(PhaseChangedData);
                CurrentPhaseName = Phases[EndPhase - 1].Name;
            }
        }
Esempio n. 7
0
        private void OnDoPhenology(object sender, EventArgs e)
        {
            if (PlantIsAlive)
            {
                if (thermalTime.Value() < 0)
                {
                    throw new Exception("Negative Thermal Time, check the set up of the ThermalTime Function in" + this);
                }

                // Calculate progression through current phase
                double propOfDayToUse = 1;
                bool   incrementPhase = CurrentPhase.DoTimeStep(ref propOfDayToUse);
                AccumulateTT(CurrentPhase.TTForTimeStep);

                while (incrementPhase)
                {
                    if ((CurrentPhase is EmergingPhase) || (CurrentPhase is BuddingPhase))
                    {
                        Emerged = true;
                    }

                    stagesPassedToday.Add(CurrentPhase.End);
                    if (currentPhaseIndex + 1 >= phases.Count)
                    {
                        throw new Exception("Cannot transition to the next phase. No more phases exist");
                    }

                    currentPhaseIndex = currentPhaseIndex + 1;

                    PhaseChangedType PhaseChangedData = new PhaseChangedType();
                    PhaseChangedData.StageName = CurrentPhase.Start;
                    PhaseChanged?.Invoke(plant, PhaseChangedData);

                    incrementPhase = CurrentPhase.DoTimeStep(ref propOfDayToUse);
                    AccumulateTT(CurrentPhase.TTForTimeStep);
                }

                Stage = (currentPhaseIndex + 1) + CurrentPhase.FractionComplete;

                if (plant != null)
                {
                    if (plant.IsAlive && PostPhenology != null)
                    {
                        PostPhenology.Invoke(this, new EventArgs());
                    }
                }
            }
        }
Esempio n. 8
0
 private void OnPhaseChanged(object sender, PhaseChangedType phaseChange)
 {
     if (phaseChange.EventStageName == ResetStageName)
         AccumulatedValue = 0.0;
 }
Esempio n. 9
0
        private void OnPhaseChanged(object sender, PhaseChangedType phaseChange)
        {
            if (SWStress != null && NStress != null)
            {
                PhenologyEventToday = true;
                AverageStressMessage += String.Format("{0,36}{1,13:F3}{2,13:F3}{3,13:F3}{4,13:F3}\r\n",
                                                      phaseChange.OldPhaseName,
                                                      1 - SWStress.PhotoAverage, 1 - SWStress.ExpansionAverage,
                                                      1 - NStress.PhotoAverage, 1 - NStress.GrainAverage);
                SWStress.ResetAverage();
                NStress.ResetAverage();
            }

            if (phaseChange.NewPhaseName.Contains("FloweringTo"))
                FloweringDate = Clock.Today;
            else if (phaseChange.NewPhaseName.Contains("MaturityTo"))
                MaturityDate = Clock.Today;
        }
Esempio n. 10
0
        /// <summary>Respond to a remove biomass event.</summary>
        /// <param name="removeBiomPheno">The remove biom pheno.</param>
        internal void OnRemoveBiomass(double removeBiomPheno)
        {
            string existingStage = CurrentStageName;
            if (RewindDueToBiomassRemoved != null)
            {
                FractionBiomassRemoved = removeBiomPheno; // The RewindDueToBiomassRemoved function will use this.

                double ttCritical = TTInAboveGroundPhase;
                double removeFractPheno = RewindDueToBiomassRemoved.Value;
                double removeTTPheno = ttCritical * removeFractPheno;

                string msg;
                msg = "Phenology change:-\r\n";
                msg += "    Fraction DM removed  = " + removeBiomPheno.ToString() + "\r\n";
                msg += "    Fraction TT removed  = " + removeFractPheno.ToString() + "\r\n";
                msg += "    Critical TT          = " + ttCritical.ToString() + "\r\n";
                msg += "    Remove TT            = " + removeTTPheno.ToString() + "\r\n";

                double ttRemaining = removeTTPheno;
                for (int i = Phases.Count - 1; i >= 0; i--)
                {
                    Phase Phase = Phases[i];
                    if (Phase.TTinPhase > 0)
                    {
                        double ttCurrentPhase = Phase.TTinPhase;
                        if (ttRemaining > ttCurrentPhase)
                        {
                            Phase.ResetPhase();
                            ttRemaining -= ttCurrentPhase;
                            CurrentPhaseIndex -= 1;
                            if (CurrentPhaseIndex < 4)  //FIXME - hack to stop onEmergence being fired which initialises biomass parts
                            {
                                CurrentPhaseIndex = 4;
                                break;
                            }
                        }
                        else
                        {
                            Phase.Add(-ttRemaining);
                            // Return fraction of thermal time we are through the current
                            // phenological phase (0-1)
                            //double frac = Phase.FractionComplete;
                            //if (frac > 0.0 && frac < 1.0)  // Don't skip out of this stage - some have very low targets, eg 1.0 in "maturity"
                            //    currentStage = frac + floor(currentStage);

                            break;
                        }
                    }
                    else
                    { // phase is empty - not interested in it
                    }
                }
                Stage = (CurrentPhaseIndex + 1) + CurrentPhase.FractionComplete - PhaseIndexOffset;

                if (existingStage != CurrentStageName)
                {
                    PhaseChangedType PhaseChangedData = new PhaseChangedType();
                    PhaseChangedData.OldPhaseName = existingStage;
                    PhaseChangedData.NewPhaseName = CurrentPhase.Name;
                    PhaseChanged.Invoke(PhaseChangedData);
                    //Fixme MyPaddock.Publish(CurrentPhase.Start);
                }
            }
        }
Esempio n. 11
0
        /// <summary>A function that resets phenology to a specified stage</summary>
        public void SetToStage(double newStage)
        {
            int oldPhaseIndex = IndexFromPhaseName(CurrentPhase.Name);

            stagesPassedToday.Clear();

            if (newStage <= 0)
            {
                throw new Exception(this + "Must pass positive stage to set to");
            }
            if (newStage > phases.Count() + 1)
            {
                throw new Exception(this + " Trying to set to non-existant stage");
            }

            currentPhaseIndex = Convert.ToInt32(Math.Floor(newStage), CultureInfo.InvariantCulture) - 1;

            if (newStage < Stage)
            {
                //Make a list of phases to rewind
                List <IPhase> phasesToRewind = new List <IPhase>();
                foreach (IPhase phase in phases)
                {
                    if ((IndexFromPhaseName(phase.Name) >= currentPhaseIndex) && (IndexFromPhaseName(phase.Name) <= oldPhaseIndex))
                    {
                        phasesToRewind.Add(phase);
                    }
                }

                foreach (IPhase phase in phasesToRewind)
                {
                    if (!(phase is IPhaseWithTarget) && !(phase is GotoPhase) && !(phase is EndPhase) && !(phase is PhotoperiodPhase) && !(phase is LeafDeathPhase) && !(phase is DAWSPhase))
                    {
                        throw new Exception("Can not rewind over phase of type " + phase.GetType());
                    }
                    if (phase is IPhaseWithTarget)
                    {
                        IPhaseWithTarget rewindingPhase = phase as IPhaseWithTarget;
                        AccumulatedTT        -= rewindingPhase.ProgressThroughPhase;
                        AccumulatedEmergedTT -= rewindingPhase.ProgressThroughPhase;
                        phase.ResetPhase();
                    }
                    else
                    {
                        phase.ResetPhase();
                    }
                }
                AccumulatedEmergedTT = Math.Max(0, AccumulatedEmergedTT);
            }
            else
            {
                //Make a list of phases to fast forward
                List <IPhase> phasesToFastForward = new List <IPhase>();
                foreach (IPhase phase in phases)
                {
                    if (IndexFromPhaseName(phase.Name) >= oldPhaseIndex)
                    {
                        phasesToFastForward.Add(phase);
                    }
                }
                foreach (IPhase phase in phasesToFastForward)
                {
                    if (phase is EndPhase)
                    {
                        stagesPassedToday.Add(phase.Start); //Fixme.  This is a pretty ordinary bit of programming to get around the fact we use a phenological stage to match observed values. We should change this so plant has a harvest tag to match on.
                    }
                    stagesPassedToday.Add(phase.End);
                    PhaseChangedType PhaseChangedData = new PhaseChangedType();
                    PhaseChangedData.StageName = phase.End;
                    PhaseChanged?.Invoke(plant, PhaseChangedData);
                }
            }

            if (phases[currentPhaseIndex] is IPhaseWithTarget)
            {
                IPhaseWithTarget currentPhase = (phases[currentPhaseIndex] as IPhaseWithTarget);
                currentPhase.ProgressThroughPhase = currentPhase.Target * (newStage - currentPhaseIndex - 1);

                if (currentPhase.ProgressThroughPhase == 0)
                {
                    stagesPassedToday.Add(currentPhase.Start);
                }
            }
            if ((phases[currentPhaseIndex] is PhotoperiodPhase) || (phases[currentPhaseIndex] is LeafDeathPhase))
            {
                stagesPassedToday.Add(phases[currentPhaseIndex].Start);
            }

            StageWasReset?.Invoke(this, new EventArgs());
        }
Esempio n. 12
0
        private void OnPhaseChanged(PhaseChangedType PhenologyChange)
        {
            if (PhenologyChange.NewPhaseName == "GerminationToEmergence")
                RootDepth = InitialRootDepth;
            else if (PhenologyChange.NewPhaseName == "EmergenceToEndOfJuvenile")
            {
                Live.StructuralWt = InitialWt * Population.Density;
                Live.StructuralN = InitialNConcentration * Live.StructuralWt;

                // initial root length (mm/mm^2)
                double initial_root_length = Live.Wt / Conversions.sm2smm * SpecificRootLength;

                // initial root length density (mm/mm^3)
                double rld = MathUtilities.Divide(initial_root_length, RootDepth, 0.0);

                int deepest_layer = FindLayerNo(RootDepth);

                for (int layer = 0; layer <= deepest_layer; layer++)
                    RootLength[layer] = rld * Soil.Thickness[layer] * RootProportion(layer, RootDepth);

                Util.Debug("Root.InitGreen.StructuralWt=%f", Live.StructuralWt);
                Util.Debug("Root.InitGreen.StructuralN=%f", Live.StructuralN);
                Util.Debug("Root.InitRootLength=%f", MathUtilities.Sum(RootLength));
            }
        }
Esempio n. 13
0
        /// <summary>A function that resets phenology to a specified stage</summary>
        public void SetToStage(double newStage)
        {
            string stageOnEvent  = CurrentPhase.End;
            double oldPhaseIndex = IndexFromPhaseName(CurrentPhase.Name);

            stagesPassedToday.Clear();

            if (newStage <= 0)
            {
                throw new Exception(this + "Must pass positive stage to set to");
            }
            if (newStage > phases.Count() + 1)
            {
                throw new Exception(this + " Trying to set to non-existant stage");
            }

            currentPhaseIndex = Convert.ToInt32(Math.Floor(newStage)) - 1;

            if (!(phases[currentPhaseIndex] is IPhaseWithTarget))
            {
                throw new Exception("Can not set phenology to phase of type " + phases[currentPhaseIndex].GetType());
            }

            if (currentPhaseIndex <= oldPhaseIndex)
            {
                //Make a list of phases to rewind
                List <IPhase> phasesToRewind = new List <IPhase>();
                foreach (IPhase phase in phases)
                {
                    if ((IndexFromPhaseName(phase.Name) >= currentPhaseIndex) && (IndexFromPhaseName(phase.Name) <= oldPhaseIndex))
                    {
                        phasesToRewind.Add(phase);
                    }
                }

                foreach (IPhase phase in phasesToRewind)
                {
                    AccumulatedTT        -= phase.TTinPhase;
                    AccumulatedEmergedTT -= phase.TTinPhase;
                    phase.ResetPhase();
                }
                AccumulatedEmergedTT = Math.Max(0, AccumulatedEmergedTT);
            }
            else
            {
                //Make a list of phases fast forward
                List <IPhase> phasesToFastForward = new List <IPhase>();
                foreach (IPhase phase in phases)
                {
                    if (IndexFromPhaseName(phase.Name) >= oldPhaseIndex)
                    {
                        phasesToFastForward.Add(phase);
                    }
                }
                foreach (IPhase phase in phasesToFastForward)
                {
                    stagesPassedToday.Add(phase.End);
                    if (PhaseChanged != null)
                    {
                        PhaseChangedType PhaseChangedData = new PhaseChangedType();
                        PhaseChangedData.StageName = phase.End;
                        PhaseChanged.Invoke(plant, PhaseChangedData);
                    }
                }
            }

            IPhaseWithTarget currentPhase = (phases[currentPhaseIndex] as IPhaseWithTarget);

            currentPhase.TTinPhase = currentPhase.Target * (newStage - currentPhaseIndex - 1);

            if (currentPhase.TTinPhase == 0)
            {
                stagesPassedToday.Add(currentPhase.Start);
            }

            if (StageWasReset != null)
            {
                StageWasReset.Invoke(this, new EventArgs());
            }
        }
Esempio n. 14
0
        private void OnPhaseChanged(object sender, PhaseChangedType phaseChange)
        {
            if (phaseChange.EventStageName == SetEvent)
                OnSetEvent();

            if (phaseChange.EventStageName == ReSetEvent)
                OnReSetEvent();
        }
Esempio n. 15
0
        /// <summary>Respond to a remove biomass event.</summary>
        /// <param name="removeBiomPheno">The remove biom pheno.</param>
        internal void OnRemoveBiomass(double removeBiomPheno)
        {
            string existingStage = CurrentStageName;

            if (RewindDueToBiomassRemoved != null)
            {
                FractionBiomassRemoved = removeBiomPheno; // The RewindDueToBiomassRemoved function will use this.

                double ttCritical       = TTInAboveGroundPhase;
                double removeFractPheno = RewindDueToBiomassRemoved.Value();
                double removeTTPheno    = ttCritical * removeFractPheno;

                string msg;
                msg  = "Phenology change:-\r\n";
                msg += "    Fraction DM removed  = " + removeBiomPheno.ToString() + "\r\n";
                msg += "    Fraction TT removed  = " + removeFractPheno.ToString() + "\r\n";
                msg += "    Critical TT          = " + ttCritical.ToString() + "\r\n";
                msg += "    Remove TT            = " + removeTTPheno.ToString() + "\r\n";

                double ttRemaining = removeTTPheno;
                for (int i = Phases.Count - 1; i >= 0; i--)
                {
                    Phase Phase = Phases[i];
                    if (Phase.TTinPhase > 0)
                    {
                        double ttCurrentPhase = Phase.TTinPhase;
                        if (ttRemaining > ttCurrentPhase)
                        {
                            Phase.ResetPhase();
                            ttRemaining       -= ttCurrentPhase;
                            CurrentPhaseIndex -= 1;
                            if (CurrentPhaseIndex < 4)  //FIXME - hack to stop onEmergence being fired which initialises biomass parts
                            {
                                CurrentPhaseIndex = 4;
                                break;
                            }
                        }
                        else
                        {
                            Phase.Add(-ttRemaining);
                            // Return fraction of thermal time we are through the current
                            // phenological phase (0-1)
                            //double frac = Phase.FractionComplete;
                            //if (frac > 0.0 && frac < 1.0)  // Don't skip out of this stage - some have very low targets, eg 1.0 in "maturity"
                            //    currentStage = frac + floor(currentStage);

                            break;
                        }
                    }
                    else
                    { // phase is empty - not interested in it
                    }
                }
                Stage = (CurrentPhaseIndex + 1) + CurrentPhase.FractionComplete - PhaseIndexOffset;

                if (existingStage != CurrentStageName)
                {
                    PhaseChangedType PhaseChangedData = new PhaseChangedType();
                    PhaseChangedData.OldPhaseName = existingStage;
                    PhaseChangedData.NewPhaseName = CurrentPhase.Name;
                    PhaseChanged.Invoke(Plant, PhaseChangedData);
                    //Fixme MyPaddock.Publish(CurrentPhase.Start);
                }
            }
        }
Esempio n. 16
0
 private void OnPhaseChanged(PhaseChangedType PhenologyChange)
 {
     if (PhenologyChange.NewPhaseName == "EmergenceToEndOfJuvenile")
     {
         Live.StructuralWt = InitialWt * Population.Density;
         Live.StructuralN = InitialNConcentration * Live.StructuralWt;
         Util.Debug("Stem.InitGreen.StructuralWt=%f", Live.StructuralWt);
         Util.Debug("Stem.InitGreen.StructuralN=%f", Live.StructuralN);
     }
 }
Esempio n. 17
0
        private void OnPhaseChanged(object sender, PhaseChangedType phaseChange)
        {
            if (phaseChange.EventStageName == EndStage)
                vernalisedToday = 0.0;

            if (phaseChange.EventStageName == ResetStage)
            {
                permanentVernalisedDays = 0.0;
                temporaryVernalisingDays = 0.0;
            }
        }
Esempio n. 18
0
        private void OnPhaseChanged(object sender, PhaseChangedType phaseChange)
        {
            if (phaseChange.NewPhaseName == "EmergenceToEndOfJuvenile")
            {
                Live.StructuralWt = InitialWt * Population.Density;
                Live.StructuralN = InitialNConcentration * Live.StructuralWt;

                InitialiseAreas();
            }
        }
Esempio n. 19
0
        private void OnPhaseChanged(PhaseChangedType PhaseChange)
        {
            if (PhaseChange.EventStageName == SetEvent)
                OnSetEvent();

            if (PhaseChange.EventStageName == ReSetEvent)
                OnReSetEvent();
        }
Esempio n. 20
0
        private void OnHarvesting(object sender, EventArgs e)
        {
            if (sender == Plant)
            {
                //Jump phenology to the end

                string OldPhaseName = CurrentPhase.Name;
                int EndPhase = Phases.Count;
                PhaseChangedType PhaseChangedData = new PhaseChangedType();
                PhaseChangedData.OldPhaseName = OldPhaseName;
                PhaseChangedData.NewPhaseName = Phases[EndPhase - 1].Name;
                PhaseChanged.Invoke(PhaseChangedData);
                CurrentPhaseName = Phases[EndPhase - 1].Name;
            }
        }
Esempio n. 21
0
        private void OnDoPhenology(object sender, EventArgs e)
        {
            if (PlantIsAlive)
            {
                if (thermalTime.Value() < 0)
                {
                    throw new Exception("Negative Thermal Time, check the set up of the ThermalTime Function in" + this);
                }

                // Calculate progression through current phase
                double propOfDayToUse = 1;
                bool   incrementPhase = CurrentPhase.DoTimeStep(ref propOfDayToUse);

                //sorghum resets the stage variable to 0 on the day the phase changes
                //it will resume again normally the day after
                double resetSorghumStage = SorghumFlag != null && incrementPhase ? 0.0 : 1.0;

                while (incrementPhase)
                {
                    if ((CurrentPhase is EmergingPhase) || (CurrentPhase.End == structure?.LeafInitialisationStage) || (CurrentPhase is DAWSPhase))
                    {
                        Emerged = true;
                    }

                    stagesPassedToday.Add(CurrentPhase.End);
                    if (currentPhaseIndex + 1 >= phases.Count)
                    {
                        throw new Exception("Cannot transition to the next phase. No more phases exist");
                    }

                    currentPhaseIndex = currentPhaseIndex + 1;

                    PhaseChangedType PhaseChangedData = new PhaseChangedType();
                    PhaseChangedData.StageName = CurrentPhase.Start;
                    PhaseChanged?.Invoke(plant, PhaseChangedData);

                    if (SorghumFlag != null && CurrentPhase is EmergingPhase)
                    {
                        // void accumulate(...)
                        double dltPhase     = 1.0 + Stage % 1.0;
                        double newStage     = Math.Floor(Stage) + dltPhase;
                        double dltStage     = newStage - Stage;
                        double pIndex       = Stage;
                        double dltIndex     = dltStage;
                        double indexDevel   = pIndex - Math.Floor(pIndex) + dltIndex;
                        double portionInOld = 1 - APSIM.Shared.Utilities.MathUtilities.Divide(indexDevel - 1, dltIndex, 0);
                        propOfDayToUse = 1 - portionInOld;
                    }
                    incrementPhase = CurrentPhase.DoTimeStep(ref propOfDayToUse);
                    if (SorghumFlag != null && CurrentStageName == "Emergence")
                    {
                        AccumulatedEmergedTT -= (1 - propOfDayToUse) * thermalTime.Value();
                    }
                }

                AccumulatedTT += thermalTime.Value();
                if (Emerged)
                {
                    AccumulatedEmergedTT += thermalTime.Value();
                }

                Stage = (currentPhaseIndex + 1) + resetSorghumStage * CurrentPhase.FractionComplete;

                if (plant != null && plant.IsAlive && PostPhenology != null)
                {
                    PostPhenology.Invoke(this, new EventArgs());
                }
            }
        }