Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.30 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  Kolejna_proba
  4. //
  5. //  Created by Syn Kury on 13/10/2019.
  6. //  Copyright © 2019 Syn Kury. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include<cmath>
  11.  
  12.    //************************************
  13. bool czyZgodne(double tab1[], double tab2[], const int n)
  14. {
  15.     for (int i = 2; i < n - 2; i += 2)
  16.     {
  17.         if (tab1[i] - tab2[i] < 0.000000000000001 and tab1[4] - tab2[4] < 0.000000000000001) return true;
  18.         else return false;
  19.     }
  20.     return false;
  21. }
  22.  
  23.  
  24. //************************************
  25.  
  26. int main(int argc, const char* argv[]) {
  27.  
  28.     double ro = 1.225;
  29.     double ni = 23.13 * 1e-6;
  30.     double g = 10;
  31.     double dd = 0.1;
  32.     const int n = 41; //ilość węzłów
  33.     double h = dd / n;
  34.     double dt = 0.0001;
  35.  
  36.     double a = -(dt / (2 * h));
  37.     double b = dt / (h);
  38.  
  39.     double u[n]{};  //wektor prędkości w kroku f
  40.     double u1[n]{}; //wektor prędkości w kroku f+1
  41.  
  42.     double p[n]{};  //wektor ciśnienia w kroku f
  43.     double p1[n]{}; //wektor ciśnienia w kroku f+1
  44.     double deltp[n]{};
  45.  
  46.     double D[n]{};
  47.     double S[n]{};
  48.  
  49.     long iteracja = 0;
  50.     long iterp = 0;
  51.  
  52.     double maxPressureIteration = 5000;
  53.     double maxVelocityIteration = 5000;
  54.  
  55.     //************************************
  56.     // zadanie warunków brzegowych
  57.  
  58.     u[0] = 10;
  59.     u[n - 1] = 10;
  60.  
  61.     u1[0] = 10;
  62.     u1[n - 1] = 10;
  63.  
  64.     //************************************
  65.     // zadanie prędkości początkowych
  66.  
  67.  
  68.     for (int i = 2; i < n - 2; i += 2)
  69.     {
  70.         u[i] = 0;
  71.     }
  72.  
  73.  
  74.     //************************************
  75.     // rozpoczęcie algorytmu iteracyjnego
  76.  
  77.     do
  78.     {
  79.         //************************************
  80.         // obliczenie prędkości w węzłach k=2,4...,n-2
  81.  
  82.         for (int i = 2; i < n - 2; i += 2)
  83.         {
  84.             u1[i] = u[i] + ni * dt * (u[i - 2] - 2 * u[i] + u[i + 2]) / (4 * h * h) - dt * ((u[i] + u[i + 2]) * (u[i] + u[i + 2]) - (u[i - 2] + u[i]) * (u[i - 2] + u[i])) / (8 * h) - dt / ro * (p[i + 1] - p[i - 1]) / (2 * h) + dt * g;
  85.         }
  86.  
  87.         //************************************
  88.         // obliczenie wektora D oraz S w węzłach k=3,5,...n-3
  89.         for (int i = 3; i < n - 3; i += 2)
  90.         {
  91.             D[i] = u[i + 1] - u[i - 1];
  92.             S[i] = (-((u[i + 1] + u[i + 3]) * (u[i + 1] + u[i + 3])) + 2 * (u[i - 1] + u[i + 1]) * (u[i - 1] + u[i + 1]) - ((u[i - 3] + u[i - 1]) * (u[i - 3] + u[i - 1]))) / (8 * h);
  93.  
  94.         }
  95.  
  96.         D[1] = D[3];
  97.         S[1] = S[3];
  98.         D[n - 2] = D[n - 4];
  99.         S[n - 2] = D[n - 4];
  100.  
  101.         //************************************
  102.         // obliczenie wektora p w węzłach k=3,5,...,n-3
  103.         iterp = 0;
  104.         do
  105.         {
  106.            
  107.             p[1] = p[3];
  108.             p[n - 2] = p[n - 4];
  109.  
  110.  
  111.             /* for(int i=3;i<n-3;i+=2)
  112.              {
  113.                  p1[i]=0.5*(p[i+2]+p[i-2])-h*ro/dt*D[i]-ni*ro/(4*h)*(D[i-2]-2*D[i]+D[i+2]);
  114.              }*/
  115.             for (int i = 3; i < n - 3; i += 2)
  116.             {
  117.                 deltp[i] = (-a * (deltp[i - 2] + deltp[i + 2]) - (u1[i + 1] - u1[i - 1])) / b;
  118.             }
  119.  
  120.  
  121.             for (int i = 3; i < n - 3; i += 2)
  122.             {
  123.                 p1[i] = p[i] + deltp[i];
  124.             }
  125.  
  126.             for (int i = 3; i < n - 3; i += 2) {
  127.  
  128.                 if (u1[i + 1] - u1[i - 1] < 0.00000001)
  129.                 {
  130.                     break;
  131.                 }
  132.                 else {
  133.  
  134.                     for (int i = 3; i < n - 3; i += 2) {
  135.                         p[i] = p1[i];
  136.                     }
  137.                 }
  138.             }
  139.            
  140.  
  141.             ++iterp;
  142.         } while (iterp != maxPressureIteration);//max->2
  143.         //p[1]=p[3];
  144.         //p[n-2]=p[n-4];
  145.  
  146.  
  147.               //p[i]=p1[i];
  148.  
  149.         //************************************
  150.         // korekcja prędkości
  151.  
  152.         for (int i = 2; i < n - 2; i += 2)
  153.         {
  154.             u1[i] = u[i] + ni * dt * (u[i - 2] - 2 * u[i] + u[i + 2]) / (4 * h * h) - dt * ((u[i] + u[i + 2]) * (u[i] + u[i + 2]) - (u[i - 2] + u[i]) * (u[i - 2] + u[i])) / (8 * h) - dt / ro * (p1[i + 1] - p1[i - 1]) / (2 * h) + dt * g;
  155.         }
  156.  
  157.         //************************************
  158.         // sprawdzenie warunku zaczymania algorytmu
  159.         /*
  160.         if (czyZgodne(u1, u, n))
  161.         {
  162.             break;      //wyjście z pętli
  163.         }
  164.         else
  165.         {
  166.             for (int i = 0; i < n; i++)
  167.             {
  168.                 u[i] = u1[i];     //przypisanie wartości z kolejnego kroku (f+1) do tablicy (f)
  169.  
  170.             }
  171.         }
  172.         */
  173.         iteracja++;
  174.         std::cout << "Licze dalej " << iteracja << "/" << maxVelocityIteration << std::endl;
  175.     } while (iteracja != maxVelocityIteration);
  176.  
  177.  
  178.     //************************************
  179.     // wyświetlenie wyników
  180.  
  181.     std::cout << "Po osiągnięciu " << iteracja << " iteracji uzyskano następujące wyniki prędkości: " << std::endl;
  182.  
  183.     for (int i = 0; i < n; i += 2)
  184.     {
  185.         //std::cout << round(u1[i]) << std::endl;
  186.         std::cout << u1[i] << std::endl;
  187.     }
  188.  
  189.  
  190.  
  191.     return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement