Advertisement
Guest User

Untitled

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