using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindStressPRM { /// <summary> /// Cell obj for regular prognostic wind field /// Объект ячейки для поля прогностического ветра на высоте 10м на регулярной сетке /// </summary> public class PrognosticCell { /// <summary> /// U - component of wind velocity, m/s /// U - компонента скорости ветра, м/с /// </summary> public double VelocityX { get; private set; } /// <summary> /// V - component of wind velocity, m/s /// V - компонента скорости ветра, м/с /// </summary> public double VelocityY { get; private set; } /// <summary> /// designated constructor /// </summary> /// <param name="coord"> Coordinate pair, координаты ячейки </param> /// <param name="vX"> U component m/s, скорость ветра по X м/с, NaN если значение отсутствует </param> /// <param name="vY"> V component m/s, скорость ветра по Y м/с, NaN если значение отсутствует</param> public PrognosticCell(double vX, double vY) { this.VelocityX = vX; this.VelocityY = vY; this.CheckValue(); } /// <summary> /// Проверка полей на валидность /// </summary> /// <returns></returns> private void CheckValue() { bool res1 = Double.IsNaN(VelocityX); bool res2 = Double.IsNaN(VelocityY); if (res1 != res2) { throw new System.ArgumentException("Prognostic wind velocities are incorrect: one projection is Nan, and other has value."); } else if (res2 == true) { // пустые данные (Nan, Nan) return; } ///Скорость ветра на высоте 10м от поверхности на Земле не может превышать 70м/c double module = Math.Sqrt(Math.Abs(Math.Pow(VelocityX, 2) + Math.Pow(VelocityY, 2))); if (module > 70) { throw new System.ArgumentOutOfRangeException("Module of wind speed", module, "Expected 0<Module<=70"); } } } }