Exemplo n.º 1
0
        private void CalculateEnvironmentalLapseRate()
        {
            var midLevelHeight = SimConstants.LevelHeights[LevelType.MidLevel];

            var ADJ_LR = Earth.SFC.ADJ_LR;
            var ALBEDO = Earth.SFC.ALBEDO;
            var WL     = Earth.SFC.WL;
            var ELV    = Earth.SFC.Height;

            ELR.Assign((r, c) =>
            {
                var elv = ELV[r, c];

                if (elv > midLevelHeight)
                {
                    // Assume dry air above the mid level boundary
                    return(SimulationParameters.Instance.DryLapseRate);
                }

                var wl     = WL[r, c];
                var albedo = ALBEDO[r, c];
                var adj_lr = ADJ_LR[r, c];

                AirMassType amt = (AirMassType)AirMass[r, c];
                var mr          = MR[r, c];

                var tMid = MidLevel.T[r, c];
                var tSea = SeaLevel.T[r, c];
                var t    = 0.5f * (tMid + tSea);

                float lr = LapseRate.EnvironmentalLapseRate(amt, t, mr);

                if (adj_lr != 0)
                {
                    lr += adj_lr;
                }

                if (elv > 900)
                {
                    lr -= (int)(elv / 900);
                }

                lr -= 0.05f * albedo;

                // We verify lapse rate remains in atmospheric physical limnits
                lr = Math.Max(-SimulationParameters.Instance.DryLapseRate, Math.Min(SimulationParameters.Instance.DryLapseRate, lr));

                return(lr);
            });
        }
Exemplo n.º 2
0
        public void CalculateAirMassType()
        {
            AirMass.Assign((r, c) =>
            {
                var t01         = MidLevel.T[r, c];
                AirMassType amt = AirMassType.WarmMaritimePolar;

                // Arctic air mass: <= -11.5C
                if (t01 <= SimulationParameters.Instance.ArcticAirMassTemp)
                {
                    amt = AirMassType.Arctic;
                }

                // Continental Polar air mass: -11.5C .. -5C
                else if (SimulationParameters.Instance.ArcticAirMassTemp < t01 && t01 <= SimulationParameters.Instance.ContinentalPolarAirMassTemp)
                {
                    amt = AirMassType.ContinentalPolar;
                }

                // Cold Maritime Polar air mass: -5C .. 5C
                else if (SimulationParameters.Instance.ContinentalPolarAirMassTemp < t01 && t01 <= SimulationParameters.Instance.MaritimePolarAirMassTemp)
                {
                    amt = AirMassType.ColdMaritimePolar;
                }

                // Warm Maritime Polar air mass: 5C .. 11.5C
                else if (SimulationParameters.Instance.MaritimePolarAirMassTemp < t01 && t01 <= SimulationParameters.Instance.MaritimeTropicalAirMassTemp)
                {
                    amt = AirMassType.WarmMaritimePolar;
                }

                // Maritime Tropical air mass: 11.5 .. 16.5C
                else if (SimulationParameters.Instance.MaritimeTropicalAirMassTemp < t01 && t01 <= SimulationParameters.Instance.TropicalContinentalAirMassTemp)
                {
                    amt = AirMassType.MaritimeTropical;
                }

                // Continental Tropical air mass: >= 16.5C
                else if (t01 > SimulationParameters.Instance.TropicalContinentalAirMassTemp)
                {
                    amt = AirMassType.ContinentalTropical;
                }

                return((float)amt);
            });
        }
Exemplo n.º 3
0
        public static float EnvironmentalLapseRate(AirMassType amt, float t, float mr)
        {
            var tk = t + AbsoluteConstants.WaterFreezePoint;

            float qd = AbsoluteConstants.Rsd * tk * tk +
                       AbsoluteConstants.Hv * mr * tk;

            float qn = AbsoluteConstants.Cpd * AbsoluteConstants.Rsd * tk * tk +
                       AbsoluteConstants.Hv * AbsoluteConstants.Hv * mr * AbsoluteConstants.eps;

            float elr = 1000 * AbsoluteConstants.g * qd / qn;

            switch (amt)
            {
            case AirMassType.ContinentalTropical:
                elr += 2.0f;
                break;

            case AirMassType.MaritimeTropical:
                elr += 1.0f;
                break;

            case AirMassType.WarmMaritimePolar:
                elr += 0.5f;
                break;

            case AirMassType.ColdMaritimePolar:
                elr -= 0.5f;
                break;

            case AirMassType.ContinentalPolar:
                elr -= 1.0f;
                break;

            case AirMassType.Arctic:
                elr -= 2.0f;
                break;

            default:
                break;
            }

            return(elr);
        }