Guest User

Untitled

a guest
Nov 24th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.56 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6.  
  7. namespace blahgeopotpressuretest
  8. {
  9.     class Program
  10.     {
  11.         protected static double VaporPressLiquid(double T)
  12.         {
  13.             //convert the input temperature from deg C to kelvin
  14.             T += 273.15;
  15.  
  16.             double Psat = Math.Exp(-0.58002206E4 / T + 0.13914993E1 - 0.48640239E-1 * T + 0.41764768E-4 * Math.Pow(T, 2.0)
  17.                 - 0.14452093E-7 * Math.Pow(T, 3.0) + 0.65459673E1 * Math.Log(T)) / 100.0;
  18.  
  19.             return Psat;
  20.         }
  21.  
  22.         protected static double VirtualTemp(double p, double t, double u)
  23.         {
  24.             double Es,         // saturated vapor pressure (mb)
  25.                    Tv;         // calculated virtual temperature (K)
  26.  
  27.             if ((u > 0.0) && (u < 100.0) && (p > 0.0))
  28.             {                            // validate P & U data
  29.                 Es = VaporPressLiquid(t); //use the Hyland and Wexler vapor pressure equation (previously used the Buck 1981 equation)
  30.                 Tv = (t + 273.15) * (1 + 0.37821 * ((u * Es) / (100.0 * p)));
  31.             }
  32.             else
  33.             {
  34.                 Tv = t + 273.15;
  35.             }
  36.             return Tv;
  37.         }
  38.  
  39.         protected static double CalculateGeoPotPressure(double currentTemperature, double currentHumidity, double currentAltitude, double previousTemperature, double previousHumidity, double previousAltitude, double previousGeoPotPressure)
  40.         {
  41.             //virtual temperature (K)
  42.             double virtualTemperature;
  43.             //calculated pressure (mb)
  44.             double currentGeoPotPressure;
  45.  
  46.             currentGeoPotPressure = previousGeoPotPressure;
  47.             if (previousGeoPotPressure > 0.0)
  48.             {
  49.                 if (previousAltitude != currentAltitude)
  50.                 {
  51.                     //average virtual temperature using known pressure
  52.                     virtualTemperature = (VirtualTemp(previousGeoPotPressure, previousTemperature, previousHumidity) + VirtualTemp(previousGeoPotPressure, currentTemperature, currentHumidity)) / 2.0;
  53.                     currentGeoPotPressure = previousGeoPotPressure * Math.Exp((-9.80665 * (currentAltitude - previousAltitude)) / (287.04 * virtualTemperature));
  54.                 }
  55.                 else
  56.                 {
  57.                     currentGeoPotPressure = previousGeoPotPressure;
  58.                 }
  59.             }
  60.  
  61.             return currentGeoPotPressure;
  62.         }
  63.  
  64.         static void Main(string[] args)
  65.         {
  66.             char[] splitter = new char[] { ' ', '\t' };
  67.             StreamReader reader = new StreamReader(new FileStream("GeoPotPressTest.txt", FileMode.Open));  
  68.             StreamWriter writer = new StreamWriter(new FileStream("output.csv", FileMode.Create));
  69.             writer.WriteLine("RH [%], Temperature [deg C], Altitude [km], Geopot Pressure [mb]");
  70.  
  71.             double previousTemperature = double.NaN;
  72.             double previousHumidity = double.NaN;
  73.             double previousAltitude = double.NaN;
  74.             double previousGeopotPressure = double.NaN;
  75.  
  76.             reader.ReadLine();
  77.             while (!reader.EndOfStream)
  78.             {
  79.                 string[] lineArr = reader.ReadLine().Split(splitter, StringSplitOptions.RemoveEmptyEntries);
  80.                 if (lineArr.Length == 3)
  81.                 {
  82.                     double temperature = double.Parse(lineArr[1]);
  83.                     double humidity = double.Parse(lineArr[0]);
  84.                     double altitude = double.Parse(lineArr[2]) * 1000;
  85.  
  86.                     if (double.IsNaN(previousTemperature))
  87.                     {
  88.                         previousTemperature = temperature;
  89.                         previousHumidity = humidity;
  90.                         previousAltitude = altitude;
  91.                         previousGeopotPressure = 973.72;
  92.                     }
  93.                    
  94.                     double geopotPressure = CalculateGeoPotPressure(temperature, humidity, altitude, previousTemperature, previousHumidity, previousAltitude, previousGeopotPressure);
  95.  
  96.                     writer.WriteLine("{0:0.0}, {1:0.00}, {2:0.000}, {3:0.000}", humidity, temperature, altitude/1000, geopotPressure);
  97.  
  98.                     previousTemperature = temperature;
  99.                     previousHumidity = humidity;
  100.                     previousAltitude = altitude;
  101.                     previousGeopotPressure = geopotPressure;
  102.                 }
  103.             }
  104.  
  105.             reader.Close();
  106.             writer.Close();
  107.         }
  108.     }
  109. }
Add Comment
Please, Sign In to add comment