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