Sie sind auf Seite 1von 10

#include<iostream>

#include<cmath>
#include<fstream>
using namespace std;
int main()
{
double lx=1,ly=1;
int nx=102,ny=102;
double dx=lx/(nx-2),dy=ly/(ny-2);
double dt=0.001;
double fe[nx*ny],fw[nx*ny],fn[nx*ny],fs[nx*ny],pressure[nx*ny];
double unew[nx*ny],ustar[nx*ny],vnew[nx*ny],vstar[nx*ny],uold[nx*ny],vold[nx
*ny];
double urms=0,vrms=0,pressurerms=0,residual=0,rmsresidual=0;
double velocityrmslimit =.001,coefficientii=0;
double Re=100;
int i,j,stepno=0;
double convvelu=0,convvelv=0;
double df=0;
ofstream fout_u,fout_v,fout_clv,fout_clu,fout_p,fout_fe,fout_fw,fout_fn,fout
_fs;
//initialization
for(j=0;j<ny;j++)
{
for(i=0;i<nx;i++)
{
fe[i+j*nx]=0;
fw[i+j*nx]=0;
fn[i+j*nx]=0;
fs[i+j*nx]=0;
pressure[i+j*nx]=0;
unew[i+j*nx]=0;
ustar[i+j*nx]=0;
vnew[i+j*nx]=0;
vstar[i+j*nx]=0;
}
}
do
{
for(j=0;j<ny;j++)
{
for(i=0;i<nx;i++)
{
uold[i+j*nx]=unew[i+j*nx];
vold[i+j*nx]=vnew[i+j*nx];
}
}
urms=0;
vrms=0;
stepno++;
cout<<"\n\t\t\t\t time in seconds****"<<stepno*dt<<endl;

//start of predictor step


//for ustar
int r=0;
do
{
r++;
rmsresidual=0;
for(j=1;j<ny-1;j++)//For interior cells
{
for(i=1;i<nx-1;i++)
{
convvelu=0;
coefficientii=dx*dy/dt;
//diffusion term
df = (-1/Re)*(4*ustar[i+nx*j] - ustar[i+nx*j+1] -
ustar[i+nx*j-1] - ustar[i+nx*(j+1)] - ustar[i+nx*(j-1)]);
//Convective term
coefficientii +=(1/Re)*4;
//First Order upwind scheme
//cout<<df<<"\n";
if( fe[i+nx*j] >= 0 )
{
convvelu += fe[i+j*nx]*ustar[i+j*nx];
coefficientii+=fe[i+j*nx] ;
}
else
{
convvelu += fe[i+j*nx]*ustar[i+j*nx+1];
}
if( fw[i+nx*j] >= 0 )
{
convvelu += fw[i+j*nx]*ustar[i+j*nx];
coefficientii+= fw[i+j*nx] ;
}
else
{
convvelu += fw[i+j*nx]*ustar[i+j*nx-1];
}
if( fn[i+nx*j] >= 0 )
{
convvelu += fn[i+j*nx]*ustar[i+j*nx];
coefficientii+=fn[i+j*nx] ;
}
else
{
convvelu += fn[i+j*nx]*ustar[i+(j+1)*
nx];
}
if( fs[i+nx*j] >= 0 )
{
convvelu += fs[i+j*nx]*ustar[i+j*nx];
coefficientii+=fs[i+j*nx] ;
}
else
{
convvelu += fs[i+j*nx]*ustar[i+(j-1)*nx];
}
residual=-(dx*dy*(ustar[i+j*nx]-uold[i+j*nx])/dt+
convvelu-df);
ustar[i+j*nx] +=residual/coefficientii;
rmsresidual +=pow(residual,2);

}
}//end of ustar for loops
//Bottom Boundary conditions
for(i=1;i<nx-1;i++)
{
residual=0-(ustar[i+nx]+ustar[i])/2;
ustar[i] += residual*2;
rmsresidual +=pow(residual,2);
}

//Top boundary conditions


for(i=1;i<nx-1;i++)
{
residual=1- (ustar[i+(ny-2)*nx]+ustar[i+(ny-1)*n
x])/2 ;
ustar[i+(ny-1)*nx] +=residual*2;
rmsresidual +=pow(residual,2);
}
//Left boundary conditions
for(j=1;j<ny-1;j++)
{
residual= 0-(ustar[j*nx+1]+ ustar[j*nx])/2;
ustar[j*nx] += residual*2;
rmsresidual +=pow(residual,2);
}
//Right boundary conditions
for(j=1;j<ny-1;j++)
{
residual=0-(ustar[nx-2+j*nx]+ustar[nx-1+j*nx])/2;
ustar[nx-1+j*nx] +=residual*2;
rmsresidual +=pow(residual,2);
}
//end of ustar calculation
rmsresidual=pow(rmsresidual/(nx*ny),0.5);
//cout<<"\n r "<<r<<" "<<rmsresidual<<endl;
}while(rmsresidual>=.001);//end of do loop for ustar
//cout<<"\nurmsresidual "<<rmsresidual <<endl;
//cout<<"\n r "<<r<<endl;
do//start of loop for v- gauss sidel for v
{
rmsresidual=0;
for(j=1;j<ny-1;j++)//For interior cells
{
for(i=1;i<nx-1;i++)
{
convvelv=0;
coefficientii=dx*dy/dt;
//diffusion term
df = (-1/Re)*(4*vstar[i+nx*j] - vstar[i+nx*j+1] -
vstar[i+nx*j-1] - vstar[i+nx*(j+1)] - vstar[i+nx*(j-1)]);
//Convective term
coefficientii +=(1/Re)*4;
//First Order upwind scheme
//cout<<df<<"\n";
if( fe[i+nx*j] >= 0 )
{
convvelv += fe[i+j*nx]*vstar[i+j*nx];
coefficientii+=fe[i+j*nx] ;
}
else
{
convvelv += fe[i+j*nx]*vstar[i+j*nx+1];
}
if( fw[i+nx*j] >= 0 )
{
convvelv += fw[i+j*nx]*vstar[i+j*nx];
coefficientii+=fw[i+j*nx] ;
}
else
{
convvelv += fw[i+j*nx]*vstar[i+j*nx-1];
}
if( fn[i+nx*j] >= 0 )
{
convvelv += fn[i+j*nx]*vstar[i+j*nx];
coefficientii+=fn[i+j*nx] ;
}
else
{
convvelv += fn[i+j*nx]*vstar[i+(j+1)*
nx];
}
if( fs[i+nx*j] >= 0 )
{
convvelv += fs[i+j*nx]*vstar[i+j*nx];
coefficientii+=fs[i+j*nx] ;
}
else
{
convvelv += fs[i+j*nx]*vstar[i+(j-1)*nx];
}

residual=-(dx*dy*(vstar[i+j*nx]-vold[i+j*nx])/dt+
convvelv-df);
vstar[i+j*nx] +=residual/coefficientii;
rmsresidual +=pow(residual,2);
}
}//end of vstar for loops
//Bottom Boundary conditions
for(i=1;i<nx-1;i++)
{
residual=0-(vstar[i+nx]+vstar[i])/2;
vstar[i] += residual*2;
rmsresidual +=pow(residual,2);
}

//Top boundary conditions


for(i=1;i<nx-1;i++)
{
residual=0- (vstar[i+(ny-1)*nx]+vstar[i+(ny-2)*n
x])/2 ;
vstar[i+(ny-1)*nx] +=residual*2;
rmsresidual +=pow(residual,2);
}
//Left boundary conditions
for(j=1;j<ny-1;j++)
{
residual= 0-(vstar[j*nx+1]+ vstar[j*nx])/2;
vstar[j*nx] += residual*2;
rmsresidual +=pow(residual,2);
}
//Right boundary conditions
for(j=1;j<ny-1;j++)
{
residual=0-(vstar[nx-1+j*nx]+vstar[nx-2+j*nx])/2 ;
vstar[nx-1+j*nx] +=residual*2;
rmsresidual +=pow(residual,2);
}

rmsresidual=pow(rmsresidual/(nx*ny),0.5);
}while(rmsresidual>=.001);//end of do loop for vstar
// cout<<"\tvrmsresidual "<<rmsresidual <<endl;
//end of predictor step
int q=0;
do//pressure poison equation
{
q++;
rmsresidual=0;
residual=0;
//For interior cells
for(j=1;j<ny-1;j++)
{
for(i=1;i<nx-1;i++)
{
residual = 0.5*((ustar[i+j*nx+1] - ustar[i+j*nx-1]) + (
vstar[i+(j+1)*nx] - vstar[i+(j-1)*nx]))/dx
- dt*(pressure[i+j*nx+1] -4*pressure[i+j*nx]
+pressure[i+j*nx-1]+pressure[i+(j+1)*nx] +pressure[i+(j-1)*nx])/(dx*dy);
//cout<<residual<<endl;
pressure[i+j*nx] += -(residual*0.25*dx*dx)/dt;
rmsresidual += pow(residual,2);
}
}
//For fictitious cells
//Bottom Boundary condition
for(i=1;i<nx-1;i++)
{
residual = 0 - (pressure[i+nx] - pressure[i])/dy;
pressure[i] += -1*residual*dy;
rmsresidual += pow(residual,2);

}
//Top Boundary condition
for(i=1;i<nx-1;i++)
{
residual = 0 - (pressure[i+(ny-1)*nx] - pressure[i+(ny-2
)*nx])/dy;
pressure[i+(ny-1)*nx] += 1*residual*dy;
rmsresidual += pow(residual,2);
}
//Left Boundary condition
for(j=1;j<ny-1;j++)
{
residual = 0 - (pressure[j*nx+1] - pressure[j*nx])/
dx;
pressure[j*nx] += -1*residual*dx;
rmsresidual += pow(residual,2);

}
//Right Boundary condition
for(j=1;j<ny-1;j++)
{
residual = 0 - (pressure[nx-1+j*nx] - pressure[nx-2+
j*nx])/dx;
pressure[nx-1+j*nx] += 1*residual*dx;
rmsresidual += pow(residual,2);
}
rmsresidual=pow(rmsresidual/(nx*ny),0.5);
// cout<<"\npressurerms "<<rmsresidual<<endl;
// cout<<"\n q "<<q<<endl;
}while(rmsresidual>0.000001); //Convergence criteria end of pressure
poison equation

for(j=1;j<ny-1;j++)
{
for(i=1;i<nx-1;i++)
{
fe[i+nx*j]= (ustar[i+nx*j]+ ustar[i+j*nx +1])*dy*0.5
- dt*(pressure[i+j*nx+1]-pressure[i+j*nx]);
fw[i+nx*j]= -(ustar[i+nx*j]+ ustar[i+j*nx-1])*dy*0.5
+ dt*(pressure[i+j*nx]-pressure[i+j*nx-1]);
fn[i+nx*j]= (vstar[i+nx*j]+ vstar[i+(j+1)*nx])*dx*0.5
- dt*(pressure[i+(j+1)*nx]-pressure[i+j*nx]);
fs[i+nx*j]= -(vstar[i+nx*j]+ vstar[i+(j-1)*nx])*dx*0.
5 + dt*(pressure[i+j*nx]-pressure[i+(j-1)*nx]);
}
}

//corrector step starts

{
// X-velocity and Y-velocity update
for(j=1;j<ny-1;j++)
{
for(i=1;i<nx-1;i++)
{
vnew[i+nx*j]= vstar[i+nx*j] - dt*(pressure[i+(j+1)*nx]-
pressure[i+(j-1)*nx])/(2*dy);
unew[i+nx*j]= ustar[i+nx*j] - dt*(pressure[i+j*nx+1]-pr
essure[i+j*nx-1])/(2*dx);

}
}

//For fictitious cells


//Bottom Boundary condition
for(i=1;i<nx-1;i++)
{
unew[i] = 0-unew[i+nx];
vnew[i] = 0-vnew[i*nx];
}
//Top Boundary condition
for(i=1;i<nx-1;i++)
{
unew[i+(ny-1)*nx] = 2 -unew[i+(ny-2)*nx];
vnew[i+(ny-1)*nx] = 0-vnew[i+(ny-2)*nx];
}
//Left Boundary condition
for(j=1;j<ny-1;j++)
{
unew[j*nx] = 0-unew[j*nx+1];
vnew[j*nx] = 0-vnew[j*nx+1];
}
//Right Boundary condition
for(j=1;j<ny-1;j++)
{
unew[nx-1+j*nx] = 0- unew[nx-2+j*nx];
vnew[nx-1+j*nx] = 0- vnew[nx-2+j*nx];
}
}

for(j=1;j<ny-1;j++)
{
for(i=1;i<nx-1;i++)
{
urms+= pow((unew[i+j*nx]-uold[i+j*nx])/dt,2);
vrms+= pow((vnew[i+j*nx]-vold[i+j*nx])/dt,2);

}
}
urms = sqrt((urms/(nx*ny))) ;
vrms = sqrt((vrms/(nx*ny))) ;

cout<<"U_rms_residual = "<<urms<<"\t\t"<<"V_rms_residual = "<<vrms;


//Updates the Velocity required for the next time step
if ((urms < velocityrmslimit||vrms < velocityrmslimit) && stepno > 1)
{
cout<<"\nsteady state is reached "<<endl;
break;
}

}while( (stepno < 10000) );


//The above loop breaks after steady state is reached
// File output Procedure
fout_u.open("X_velocity.xls");
fout_v.open("Y_velocity.xls");
fout_clv.open("C_Line_Y_velocityupwind102.xls");
fout_clu.open("C_Line_X_velocityupwind102.xls");
fout_p.open("Pressure.txt");
//fout_fe.open("Fe.txt");
//fout_fw.open("Fw.txt");
//fout_fn.open("Fn.txt");
//fout_fs.open("Fs.txt");

for(j=0;j<ny;j++)
{
for(i=0;i<nx;i++)
{
fout_p<<pressure[i+nx*j]<<"\t";
}
}

for(j=1;j<ny;j++)
{
for(i=1;i<nx;i++)
{

fout_u<<unew[i+nx*j]<<"\t";
fout_v<<vnew[i+nx*j]<<"\t";
//fout_p<<pressure[i+nx*j]<<"\t";
//fout_fe<<fe[i+j*nx]<<"\t";
//fout_fw<<fw[i+j*nx]<<"\t";
//fout_fn<<fn[i+j*nx]<<"\t";
//fout_fs<<fs[i+j*nx]<<"\t";
if(j==int(ny/2))
{
fout_clv<<(i-1)*dx<<"\t\t"<<(vnew[i+nx*j-1]+vnew[i+nx*j])*0.
5<<endl;
}
if(i==int(nx/2))
{
fout_clu<<(j-1)*dy<<"\t\t"<<(unew[i+nx*j]+unew[i+nx*(j-1)])*
0.5<<endl;
}
}
}
fout_u<<endl;
fout_v<<endl;
fout_p<<endl;
//fout_fe<<endl;
// fout_fw<<endl;
//fout_fs<<endl;
//fout_fn<<endl;

Das könnte Ihnen auch gefallen