private void DoEnergyArbitration(object sender, EventArgs e) { dayLengthEvap = MathUtilities.DayLength(Clock.Today.DayOfYear, SunAngleNetPositiveRadiation, weather.Latitude); dayLengthLight = MathUtilities.DayLength(Clock.Today.DayOfYear, SunSetAngle, weather.Latitude); if (zoneMicroClimates.Count == 2 && zoneMicroClimates[0].zone is Zones.RectangularZone && zoneMicroClimates[1].zone is Zones.RectangularZone) { // We are in a strip crop simulation zoneMicroClimates[0].DoCanopyCompartments(); zoneMicroClimates[1].DoCanopyCompartments(); CalculateStripCropShortWaveRadiation(); } else // Normal 1D zones are to be used { foreach (ZoneMicroClimate ZoneMC in zoneMicroClimates) { ZoneMC.DoCanopyCompartments(); CalculateLayeredShortWaveRadiation(ZoneMC); } } // Light distribution is now complete so calculate remaining micromet equations foreach (ZoneMicroClimate ZoneMC in zoneMicroClimates) { CalculateEnergyTerms(ZoneMC); CalculateLongWaveRadiation(ZoneMC); CalculateSoilHeatRadiation(ZoneMC); CalculateGc(ZoneMC); CalculateGa(ZoneMC); CalculateInterception(ZoneMC); CalculatePM(ZoneMC); CalculateOmega(ZoneMC); SetCanopyEnergyTerms(ZoneMC); } }
private void DoEnergyArbitration(object sender, EventArgs e) { microClimatesZones.ForEach(zone => zone.DailyInitialise(weather)); dayLengthLight = MathUtilities.DayLength(clock.Today.DayOfYear, sunSetAngle, weather.Latitude); dayLengthEvap = MathUtilities.DayLength(clock.Today.DayOfYear, sunAngleNetPositiveRadiation, weather.Latitude); // VOS - a temporary kludge to get this running for high latitudes. MicroMet is due for a clean up soon so reconsider then. dayLengthEvap = Math.Max(dayLengthEvap, (dayLengthLight * 2.0 / 3.0)); if (microClimatesZones.Count == 2 && microClimatesZones[0].Zone is Zones.RectangularZone && microClimatesZones[1].Zone is Zones.RectangularZone && microClimatesZones[0].Canopies.Count > 0 && microClimatesZones[1].Canopies.Count > 0) { // We are in a strip crop simulation microClimatesZones[0].DoCanopyCompartments(); microClimatesZones[1].DoCanopyCompartments(); CalculateStripZoneShortWaveRadiation(); } else // Normal 1D zones are to be used { foreach (MicroClimateZone ZoneMC in microClimatesZones) { ZoneMC.DoCanopyCompartments(); CalculateLayeredShortWaveRadiation(ZoneMC, weather.Radn); } } // Light distribution is now complete so calculate remaining micromet equations foreach (var ZoneMC in microClimatesZones) { ZoneMC.CalculateEnergyTerms(soil_albedo); ZoneMC.CalculateLongWaveRadiation(dayLengthLight, dayLengthEvap); ZoneMC.CalculateSoilHeatRadiation(SoilHeatFluxFraction); ZoneMC.CalculateGc(dayLengthEvap); ZoneMC.CalculateGa(ReferenceHeight); ZoneMC.CalculateInterception(a_interception, b_interception, c_interception, d_interception); ZoneMC.CalculatePM(dayLengthEvap, NightInterceptionFraction); ZoneMC.CalculateOmega(); ZoneMC.SetCanopyEnergyTerms(); ZoneMC.CalculateEo(); } }