コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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();
            }
        }