Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.73 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <math.h>
  3. #include <iostream>
  4. #include <iomanip>
  5. #include <fstream>
  6.  
  7. const int nx=29;
  8. const int ny=29;
  9. const int nz=21;
  10.  
  11. float lx=9.9, ly=4.9, lz=2.0;
  12. double dx=0.1, dy=0.1, dz=0.1, dt=0.001;
  13. double cx=7.0, cy=4.0, h=0.8, r1=0.5, r2=0.2;
  14. double potx[nz][ny][nx], poty[nz][ny][nx], potz[nz][ny][nx];
  15. double u[nz][ny][nx], v[nz][ny][nx], w[nz][ny][nx];
  16. double curlx[nz][ny][nx], curly[nz][ny][nx], curlz[nz][ny][nx];
  17. double tempx[nz][ny][nx], tempy[nz][ny][nx], tempz[nz][ny][nx];
  18. double nu=0.2, err=0.001;
  19. int op=40;      //replace by adequate checking of differences!!!
  20.  
  21. using namespace std;
  22.  
  23. int main()
  24. {
  25.     int nx= int(lx/dx+1);
  26.     int ny= int(ly/dy+1);
  27.     int nz= int(lz/dz+1);
  28.    
  29.     for(int k=0;k<nz;k++)
  30.         for(int j=0;j<ny;j++)
  31.             for(int i=0;i<nx;i++) {
  32.                 double x= i * dx;
  33.                 double y= j * dy;
  34.                 double z= k *dz;
  35.                 u[k][j][i]=0.0;
  36.                 v[k][j][i]=0.0;
  37.                 w[k][j][i]=0.0;
  38.                 potx[k][j][i]=0.0;
  39.                 poty[k][j][i]=0.0;
  40.                 potz[k][j][i]=0.0;
  41.                 if(y==0)
  42.                     v[k][j][i]=20.0*z*z;
  43.  
  44.                 curlx[k][j][i]=0.0;
  45.                 curly[k][j][i]=0.0;
  46.                 curlz[k][j][i]=0.0;
  47.                 if((y==0)&&(k<nz-1)) {
  48.                     curlx[k][j][i]=-(v[k+1][j][i]-v[k][j][i])/dz;
  49.                     curlz[k][j][i]=-v[k][j][i]/dx;
  50.                 }
  51.             }
  52.            
  53.     int p=0;
  54.     while(p<op) {
  55.  
  56.         for(int k=1;k<nz-1;k++)
  57.             for(int j=1;j<ny-1;j++)
  58.                 for(int i=1;i<nx-1;i++) {
  59.                     tempx[k][j][i]=curlx[k][j][i]-u[k][j][i]*dt*(curlx[k][j][i+1]-curlx[k][j][i])/dx-v[k][j][i]*dt*(curlx[k][j+1][i]-curlx[k][j][i])/dy-w[k][j][i]*dt*(curlx[k+1][j][i]-curlx[k][j][i])/dz+
  60.                         curlx[k][j][i]*dt*(u[k][j][i+1]-u[k][j][i])/dx+curly[k][j][i]*dt*(u[k][j+1][i]-u[k][j][i])/dy+curlz[k][j][i]*dt*(u[k+1][j][i]-u[k][j][i])/dz+
  61.                         nu*dt*((curlx[k][j][i+1]-2*curlx[k][j][i]+curlx[k][j][i-1])/(dx*dx)+(curlx[k][j+1][i]-2*curlx[k][j][i]+curlx[k][j-1][i])/(dy*dy)+(curlx[k+1][j][i]-2*curlx[k][j][i]+curlx[k-1][j][i])/(dy*dy));
  62.                
  63.                     tempy[k][j][i]=curly[k][j][i]-u[k][j][i]*dt*(curly[k][j][i+1]-curly[k][j][i])/dx-v[k][j][i]*dt*(curly[k][j+1][i]-curly[k][j][i])/dy-w[k][j][i]*dt*(curly[k+1][j][i]-curly[k][j][i])/dz+
  64.                         curlx[k][j][i]*dt*(v[k][j][i+1]-v[k][j][i])/dx+curly[k][j][i]*dt*(v[k][j+1][i]-v[k][j][i])/dy+curlz[k][j][i]*dt*(v[k+1][j][i]-v[k][j][i])/dz+
  65.                         nu*dt*((curly[k][j][i+1]-2*curly[k][j][i]+curly[k][j][i-1])/(dx*dx)+(curly[k][j+1][i]-2*curly[k][j][i]+curly[k][j-1][i])/(dy*dy)+(curly[k+1][j][i]-2*curly[k][j][i]+curly[k-1][j][i])/(dy*dy));
  66.                
  67.                     tempz[k][j][i]=curlz[k][j][i]-u[k][j][i]*dt*(curlz[k][j][i+1]-curlz[k][j][i])/dx-v[k][j][i]*dt*(curlz[k][j+1][i]-curlz[k][j][i])/dy-w[k][j][i]*dt*(curlz[k+1][j][i]-curlz[k][j][i])/dz+
  68.                         curlx[k][j][i]*dt*(w[k][j][i+1]-w[k][j][i])/dx+curly[k][j][i]*dt*(w[k][j+1][i]-w[k][j][i])/dy+curlz[k][j][i]*dt*(w[k+1][j][i]-w[k][j][i])/dz+
  69.                         nu*dt*((curlz[k][j][i+1]-2*curlz[k][j][i]+curlz[k][j][i-1])/(dx*dx)+(curlz[k][j+1][i]-2*curlz[k][j][i]+curlz[k][j-1][i])/(dy*dy)+(curlz[k+1][j][i]-2*curlz[k][j][i]+curlz[k-1][j][i])/(dy*dy));
  70.                 }
  71.  
  72.         for(int k=1;k<nz-1;k++)
  73.             for(int j=1;j<ny-1;j++)
  74.                 for(int i=1;i<nx-1;i++) {
  75.                     curlx[k][j][i]=tempx[k][j][i];
  76.                     curly[k][j][i]=tempy[k][j][i];
  77.                     curlz[k][j][i]=tempz[k][j][i];
  78.                    
  79.                     potx[k][j][i]=0.5/(1/(dx*dx)+1/(dy*dy)+1/(dz*dz))*curlx[k][j][i];
  80.                     poty[k][j][i]=0.5/(1/(dx*dx)+1/(dy*dy)+1/(dz*dz))*curly[k][j][i];
  81.                     potz[k][j][i]=0.5/(1/(dx*dx)+1/(dy*dy)+1/(dz*dz))*curlz[k][j][i];
  82.                 }
  83.  
  84.         double diff=err+1.0;
  85.         while( diff > err ) {
  86.             diff=0.0;
  87.            
  88.             for(int k=1;k<nz-1;k++)
  89.                 for(int j=1;j<ny-1;j++)
  90.                     for(int i=1;i<nx-1;i++) {
  91.                         tempx[k][j][i]=0.5/(1/(dx*dx)+1/(dy*dy)+1/(dz*dz))*((potx[k][j][i+1]+potx[k][j][i-1])/(dx*dx)+(potx[k][j+1][i]+potx[k][j-1][i])/(dy*dy)+(potx[k+1][j][i]+potx[k-1][j][i])/(dz*dz)+curlx[k][j][i]);
  92.                         if ( fabs(tempx[k][j][i]-potx[k][j][i]) > diff )
  93.                             diff=fabs(tempx[k][j][i]-potx[k][j][i]);
  94.                     }
  95.  
  96.             for(int k=1;k<nz-1;k++)
  97.                 for(int j=1;j<ny-1;j++)
  98.                     for(int i=1;i<nx-1;i++)
  99.                         potx[k][j][i]=tempx[k][j][i];
  100.  
  101.         }
  102.  
  103.         diff=err+1.0;
  104.         while( diff > err ) {
  105.             diff=0.0;
  106.             for(int k=1;k<nz-1;k++) {
  107.                 for(int j=1;j<ny-1;j++) {
  108.                     for(int i=1;i<nx-1;i++) {
  109.                         tempy[k][j][i]=0.5/(1/(dx*dx)+1/(dy*dy)+1/(dz*dz))*((poty[k][j][i+1]+poty[k][j][i-1])/(dx*dx)+(poty[k][j+1][i]+poty[k][j-1][i])/(dy*dy)+(poty[k+1][j][i]+poty[k-1][j][i])/(dz*dz)+curly[k][j][i]);
  110.                         if( fabs(tempy[k][j][i]-poty[k][j][i]) > diff )
  111.                             diff = fabs(tempy[k][j][i]-poty[k][j][i]);
  112.                     }
  113.                 }
  114.             }
  115.  
  116.             for(int k=1;k<nz-1;k++)
  117.                 for(int j=1;j<ny-1;j++)
  118.                     for(int i=1;i<nx-1;i++)
  119.                         poty[k][j][i] = tempy[k][j][i];
  120.         }
  121.  
  122.         diff=err+1.0;
  123.         while( diff > err ) {
  124.             diff=0.0;
  125.             for(int k=1;k<nz-1;k++)
  126.                 for(int j=1;j<ny-1;j++)
  127.                     for(int i=1;i<nx-1;i++){
  128.                         tempz[k][j][i]=0.5/(1/(dx*dx)+1/(dy*dy)+1/(dz*dz))*((potz[k][j][i+1]+potz[k][j][i-1])/(dx*dx)+(potz[k][j+1][i]+potz[k][j-1][i])/(dy*dy)+(potz[k+1][j][i]+potz[k-1][j][i])/(dz*dz)+curlz[k][j][i]);
  129.                         if( fabs(tempz[k][j][i]-potz[k][j][i]) > diff )
  130.                             diff = fabs(tempz[k][j][i]-potz[k][j][i]);
  131.                     }
  132.  
  133.             for(int k=1;k<nz-1;k++)
  134.                 for(int j=1;j<ny-1;j++)
  135.                     for(int i=1;i<nx-1;i++)
  136.                         potz[k][j][i] = tempz[k][j][i];
  137.         }
  138.  
  139.         for(int k=1;k<nz-1;k++)
  140.             for(int j=1;j<ny-1;j++)
  141.                 for(int i=1;i<nx-1;i++) {
  142.                     u[k][j][i]=(potz[k][j+1][i]-potz[k][j][i])/dy-(poty[k+1][j][i]-poty[k][j][i])/dz;
  143.                     v[k][j][i]=(potx[k+1][j][i]-potx[k][j][i])/dz-(potz[k][j][i+1]-potz[k][j][i])/dx;
  144.                     w[k][j][i]=(poty[k][j][i+1]-poty[k][j][i])/dx-(potx[k][j+1][i]-potx[k][j][i])/dy;
  145.                 }
  146.  
  147.         for(int k=0;k<nz;k++)
  148.             for(int j=0;j<ny;j++)
  149.                 for(int i=0;i<nx;i++) {
  150.                     double x= i * dx;
  151.                     double y= j * dy;
  152.                     double z= k *dz;
  153.                     if(z>h)
  154.                         continue;
  155.                     double r=r2+(r1-r2)*(h-z)/h;
  156.                     if((x<cx-r)||(x>cx+r))
  157.                         continue;
  158.                     if((y<cx-sqrt(r*r-(x-cx)*(x-cx)))||(y>cx+sqrt(r*r-(x-cx)*(x-cx))))
  159.                         continue;
  160.                     u[k][j][i]=0.0;
  161.                     v[k][j][i]=0.0;
  162.                     w[k][j][i]=0.0;
  163.                     potx[k][j][i]=0.0;
  164.                     poty[k][j][i]=0.0;
  165.                     potz[k][j][i]=0.0;
  166.                 }
  167.  
  168.         p++;
  169.     }  
  170.  
  171.     ofstream XZ("XZ.txt");
  172.     XZ << nx << "\t" << nz << "\t" << endl;
  173.     for (int i=0; i<nx; i++){
  174.         for (int j=0;j<nz;j++) {
  175.           XZ << fixed << u[j][10][i] << "\t";
  176.           XZ << fixed << w[j][10][i] << "\t";
  177.         }
  178.         XZ<<endl;
  179.     }
  180.    
  181.     ofstream YZ("YZ.txt");
  182.     YZ << ny << "\t" << nz << "\t" << endl;
  183.     for (int i=0;i<ny;i++) {
  184.         for (int j=0;j<nz;j++) {
  185.             YZ << fixed << v[j][i][10] << "\t";
  186.             YZ << fixed << w[j][i][10] << "\t";
  187.         }
  188.         YZ<<endl;
  189.     }
  190.  
  191.     ofstream YX("YX.txt");
  192.     YX << ny << "\t" << nx << "\t" << endl;
  193.     for (int i=0;i<ny;i++) {
  194.         for (int j=0;j<nx;j++) {
  195.             YX << fixed << u[5][i][j] << "\t";
  196.             YX << fixed << v[5][i][j] << "\t";
  197.         }
  198.         YX<<endl;
  199.     }
  200.    
  201.     return 0;
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement