Advertisement
phystota

AE510_HW1_SI

Feb 13th, 2025
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4. #include <iomanip>
  5. using namespace std;
  6.  
  7. // Define parameters
  8. const double gamma_air = 1.4;   // Adiabatic coefficient for air
  9. const double f = 0.02;      // Friction coefficient
  10. const double Rspec = 286.9; // Air specific gas constant in J/kg*K
  11. // Hydraulic diameter: Dh = 4 inches.
  12.  
  13. const double Dh = 4.0 * 0.0254;  // 4 inch in meters
  14.  
  15. // Total pipe length in feet
  16. const double L = 70.0 * 0.3048;  // 70 ft in meters
  17.  
  18. // Function that returns dM/dx given M.
  19. double dMdx(double M) {
  20.     // Avoid division by zero (when 1 - gamma*M^2 is too close to zero).
  21.     double denom = 1.0 - gamma_air * M * M;
  22.     if (fabs(denom) < 1e-8) {
  23.         cerr << "Denominator approaching zero. M = " << M << endl;
  24.         return 0.0;
  25.     }
  26.     return (gamma_air * f / (2.0 * Dh)) * (M * M * M) / denom;
  27. }
  28.  
  29. // Function that returns dP/dx given M and P.
  30. double dPdx(double M, double P) {
  31.  
  32.     double denom = 1.0 - gamma_air * M * M;
  33.     if (fabs(denom) < 1e-8) {
  34.         cerr << "Denominator approaching zero. M = " << M << endl;
  35.         return 0.0;
  36.     }    
  37.     return (-1.0 * P * f / (2.0 * Dh) ) * ( ( gamma_air * M * M) / denom );
  38. }
  39.  
  40. double dP0dx(double M, double P0) {
  41.  
  42.     double denom1 = gamma_air * M * M - 1.0;
  43.     double denom2 = 1 + (gamma_air - 1.0) * M * M /2.0;
  44.     double numer1 = gamma_air * M * M / 2.0;
  45.     double numer2 = 1 - (gamma_air + 1.0) * M * M /2.0;
  46.  
  47.     if (fabs(denom1) < 1e-8) {
  48.         cerr << "Denominator approaching zero. M = " << M << endl;
  49.         return 0.0;
  50.     }
  51.     return (P0 * f / Dh) * numer1 * numer2 / (denom1 * denom2);
  52. }
  53.  
  54. double dVdx(double M, double V) {
  55.  
  56.     double numer = gamma_air * M * M / 2.0;
  57.     double denom = 1.0 - gamma_air * M * M;
  58.    
  59.     if (fabs(denom) < 1e-8) {
  60.         cerr << "Denominator approaching zero. M = " << M << endl;
  61.         return 0.0;
  62.     }  
  63.     return (f/Dh) * (numer/denom) * V;
  64. }
  65.  
  66. double dT0dx(double M, double T0) {
  67.  
  68.     double numer1 = gamma_air * M * M / 2.0;
  69.     double numer2 = (gamma_air - 1) * M * M;
  70.     double denom1 = 1.0 - gamma_air * M * M;
  71.     double denom2 = 1 + (gamma_air - 1.0) * M * M /2.0;  
  72.    
  73.     if (fabs(denom1) < 1e-8) {
  74.         cerr << "Denominator approaching zero. M = " << M << endl;
  75.         return 0.0;
  76.     }  
  77.     return (f/Dh) * ((numer1 * numer2) / (denom1 * denom2)) * T0;
  78. }
  79.  
  80. int main() {
  81.  
  82.    
  83.     // Initial condition: M(0) = 0.3 P(0) = 25 Psia
  84.     double M = 0.3;
  85.     double P = 25 * 6894.75728; // psia -> Pa
  86.     double P0 = P * pow((1 + (gamma_air - 1) * M * M / 2.0), gamma_air/(gamma_air - 1));
  87.     double T = 600 * 1.25; // Reaumur -> Celcius
  88.     double T0 = T * (1 + ((gamma_air - 1)/2) * M * M);
  89.     double V = M * sqrt(gamma_air*Rspec*T); // velocity of gas using Mach number and speed of sound;
  90.     double x = 0.0;
  91.  
  92.    
  93.     // Number of integration steps (adjust for accuracy)
  94.     const int nSteps = 1000;
  95.     double dx = L / nSteps;
  96.    
  97.     // Open a file to save results
  98.     ofstream outFile("mach_data.txt");
  99.     if (!outFile) {
  100.         cerr << "Error opening output file." << endl;
  101.         return 1;
  102.     }
  103.     outFile << "#\tx(m)\tM(x)\tP(x)\tP0(x)\tV(x)\tT0(x)\n";
  104.     outFile << fixed << setprecision(6);
  105.    
  106.     // Output the initial condition.
  107.     outFile << x << "\t" << M << "\t" << P << "\t" << P0 << "\t" << V << "\t" << T0 << "\n";
  108.    
  109.     // RK4 Integration Loop
  110.     for (int i = 0; i < nSteps; i++) {
  111.        
  112.         double k1_M = dMdx(M);
  113.         double k1_P = dPdx(M, P);
  114.         double k1_P0 = dP0dx(M, P0);
  115.         double k1_V = dVdx(M, V);
  116.         double k1_T0 = dT0dx(M, T0);
  117.  
  118.         double M_temp = M + 0.5 * dx * k1_M;
  119.         double P_temp = P + 0.5 * dx * k1_P;
  120.         double P0_temp = P0 + 0.5 * dx * k1_P0;
  121.         double V_temp = V + 0.5 * dx * k1_V;
  122.         double T0_temp = T0 + 0.5 * dx * k1_T0;
  123.  
  124.         double k2_M = dMdx(M_temp);
  125.         double k2_P = dPdx(M_temp, P_temp);
  126.         double k2_P0 = dP0dx(M_temp, P_temp);
  127.         double k2_V = dVdx(M_temp, V_temp);
  128.         double k2_T0 = dT0dx(M_temp, T0_temp);
  129.  
  130.         M_temp = M + 0.5 * dx * k2_M;
  131.         P_temp = P + 0.5 * dx * k2_P;
  132.         P0_temp = P0 + 0.5 * dx * k2_P0;
  133.         V_temp = V + 0.5 * dx * k2_V;
  134.         T0_temp = T0 + 0.5 * dx * k2_T0;
  135.         double k3_M = dMdx(M_temp);
  136.         double k3_P = dPdx(M_temp, P_temp);
  137.         double k3_P0 = dP0dx(M_temp, P0_temp);
  138.         double k3_V = dVdx(M_temp, V_temp);
  139.         double k3_T0 = dT0dx(M_temp, T0_temp);
  140.  
  141.         M_temp = M + 0.5 * dx * k3_M;
  142.         P_temp = P + 0.5 * dx * k3_P;
  143.         P0_temp = P0 + 0.5 * dx * k3_P0;
  144.         V_temp = V + 0.5 * dx * k3_V;
  145.         T0_temp = T0 + 0.5 * dx * k3_T0;
  146.         double k4_M = dMdx(M_temp);
  147.         double k4_P = dPdx(M_temp, P_temp);
  148.         double k4_P0 = dP0dx(M_temp, P0_temp);
  149.         double k4_V = dVdx(M_temp, V_temp);
  150.         double k4_T0 = dT0dx(M_temp, T0_temp);
  151.  
  152.         // Update M and P using RK4 formula
  153.         M += (dx / 6.0) * (k1_M + 2 * k2_M + 2 * k3_M + k4_M);
  154.         P += (dx / 6.0) * (k1_P + 2 * k2_P + 2 * k3_P + k4_P);
  155.         P0 += (dx / 6.0) * (k1_P0 + 2 * k2_P0 + 2 * k3_P0 + k4_P0);
  156.         V += (dx / 6.0) * (k1_V + 2 * k2_V + 2 * k3_V + k4_V);
  157.         T0 += (dx / 6.0) * (k1_T0 + 2 * k2_T0 + 2 * k3_T0 + k4_T0);
  158.         x += dx;
  159.        
  160.         // Save the result
  161.         outFile << x << "\t" << M << "\t" << P << "\t" << P0 << "\t" << V << "\t" << T0 << "\n";
  162.     }
  163.    
  164.     outFile.close();
  165.     cout << "RK4 integration completed. Data saved in 'mach_data.txt'." << endl;
  166.    
  167.     return 0;
  168. }
  169.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement