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()); } } } }
private void OnPhaseChanged(object sender, PhaseChangedType phaseChange) { if (phaseChange.StageName == SetEvent) { CropVernalised = true; } }
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); }
private void OnPhaseChanged(object sender, PhaseChangedType phaseChange) { if (phaseChange.StageName == EndStage) { TodaysVernalisation = 0.0; } if (phaseChange.StageName == ResetStage) { DaysVernalised = 0.0; DaysVernalising = 0.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; } }
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; } }
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()); } } } }
private void OnPhaseChanged(object sender, PhaseChangedType phaseChange) { if (phaseChange.EventStageName == ResetStageName) AccumulatedValue = 0.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; }
/// <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); } } }
/// <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()); }
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)); } }
/// <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()); } }
private void OnPhaseChanged(object sender, PhaseChangedType phaseChange) { if (phaseChange.EventStageName == SetEvent) OnSetEvent(); if (phaseChange.EventStageName == ReSetEvent) OnReSetEvent(); }
/// <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); } } }
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); } }
private void OnPhaseChanged(object sender, PhaseChangedType phaseChange) { if (phaseChange.EventStageName == EndStage) vernalisedToday = 0.0; if (phaseChange.EventStageName == ResetStage) { permanentVernalisedDays = 0.0; temporaryVernalisingDays = 0.0; } }
private void OnPhaseChanged(object sender, PhaseChangedType phaseChange) { if (phaseChange.NewPhaseName == "EmergenceToEndOfJuvenile") { Live.StructuralWt = InitialWt * Population.Density; Live.StructuralN = InitialNConcentration * Live.StructuralWt; InitialiseAreas(); } }
private void OnPhaseChanged(PhaseChangedType PhaseChange) { if (PhaseChange.EventStageName == SetEvent) OnSetEvent(); if (PhaseChange.EventStageName == ReSetEvent) OnReSetEvent(); }
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; } }
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()); } } }