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); }); }
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); }); }
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); }