Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.48 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=1;
  50.     long iterp=1;
  51.    
  52.     //************************************
  53.     // zadanie warunków brzegowych
  54.    
  55.     u[0]=10;
  56.     u[n-1]=10;
  57.    
  58.     u1[0]=10;
  59.     u1[n-1]=10;
  60.    
  61.     //************************************
  62.     // zadanie prędkości początkowych
  63.    
  64.    
  65.     for(int i=2;i<n-2;i+=2)
  66.     {
  67.         u[i]=0;
  68.     }
  69.    
  70.    
  71.     //************************************
  72.     // rozpoczęcie algorytmu iteracyjnego
  73.    
  74.     do
  75.        {
  76.     //************************************
  77.     // obliczenie prędkości w węzłach k=2,4...,n-2
  78.    
  79.     for(int i=2;i<n-2;i+=2)
  80.     {
  81.         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;
  82.     }
  83.      
  84.     //************************************
  85.     // obliczenie wektora D oraz S w węzłach k=3,5,...n-3
  86.     for(int i=3;i<n-3;i+=2)
  87.     {
  88.         D[i]=u[i+1]-u[i-1];
  89.         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);
  90.        
  91.     }
  92.    
  93.     D[1]=D[3];
  94.     S[1]=S[3];
  95.     D[n-2]=D[n-4];
  96.     S[n-2]=D[n-4];
  97.    
  98.     //************************************
  99.     // obliczenie wektora p w węzłach k=3,5,...,n-3
  100.      
  101.            do
  102.            {
  103.     p[1]=p[3];
  104.     p[n-2]=p[n-4];
  105.    
  106.            
  107.    /* for(int i=3;i<n-3;i+=2)
  108.     {
  109.         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]);
  110.     }*/
  111.            for(int i=3;i<n-3;i+=2)
  112.            {
  113.                deltp[i]=(-a*(deltp[i-2] + deltp[i+2])-(u1[i+1]-u1[i-1]))/b;
  114.            }
  115.                
  116.                
  117.                    for(int i=3;i<n-3;i+=2)
  118.                    {
  119.                        p1[i]=p[i]+deltp[i];}
  120.                
  121.                for(int i=3;i<n-3;i+=2){
  122.                        
  123.                        if(u1[i+1]-u1[i-1]<0.00000001)
  124.                        {
  125.                            break;
  126.                        }
  127.                        else{
  128.                
  129.                    for(int i=3;i<n-3;i+=2){
  130.                        p[i]=p1[i];
  131.                    }
  132.                        }
  133.                }
  134.                
  135.            
  136.                iterp++;
  137.            }while(iterp!=10000);
  138.     //p[1]=p[3];
  139.     //p[n-2]=p[n-4];
  140.                
  141.    
  142.           //p[i]=p1[i];
  143.        
  144.     //************************************
  145.     // korekcja prędkości
  146.    
  147.     for(int i=2;i<n-2;i+=2)
  148.     {
  149.         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;
  150.     }
  151.    
  152.     //************************************
  153.     // sprawdzenie warunku zaczymania algorytmu
  154.    
  155.     if(czyZgodne(u1, u, n))
  156.     {
  157.         break;      //wyjście z pętli
  158.     }
  159.     else
  160.     {
  161.         for(int i=0;i<n;i++)
  162.         {            u[i]=u1[i];     //przypisanie wartości z kolejnego kroku (f+1) do tablicy (f)
  163.                    
  164.     }
  165.     }
  166.         iteracja++;
  167.            
  168.     } while (iteracja!=1000000);
  169.    
  170.          
  171.     //************************************
  172.     // wyświetlenie wyników
  173.    
  174.     std::cout<<"Po osiągnięciu "<<iteracja<<" iteracji uzyskano następujące wyniki prędkości: "<<std::endl;
  175.    
  176.     for(int i=0;i<n;i+=2)
  177.     {
  178.         std::cout<<round(u1[i])<<std::endl;
  179.     }
  180.  
  181.    
  182.    
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement