You are on page 1of 9

#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;
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
for(j=1;j<ny-1;j++)//For interior cells
{
for(i=1;i<nx-1;i++)
{
convvelu=0;
//diffusion term
df = (-1/Re)*(4*unew[i+nx*j] - unew[i+nx*j+1] - un
ew[i+nx*j-1] - unew[i+nx*(j+1)] - unew[i+nx*(j-1)]);
//Convective term
//First Order upwind scheme
//cout<<df<<"\n";
if( fe[i+nx*j] >= 0 )
{
convvelu += fe[i+j*nx]*unew[i+j*nx];
}
else
{
convvelu += fe[i+j*nx]*unew[i+j*nx+1];
}
if( fw[i+nx*j] >= 0 )
{
convvelu += fw[i+j*nx]*unew[i+j*nx];
}
else
{
convvelu += fw[i+j*nx]*unew[i+j*nx-1];
}
if( fn[i+nx*j] >= 0 )
{
convvelu += fn[i+j*nx]*unew[i+j*nx];
}
else
{
convvelu += fn[i+j*nx]*unew[i+(j+1)*n
x];
}
if( fs[i+nx*j] >= 0 )
{
convvelu += fs[i+j*nx]*unew[i+j*nx];
}
else
{
convvelu += fs[i+j*nx]*unew[i+(j-1)*nx];
}

// cout<<"convvel"<<convvel<<"\n";
ustar[i+j*nx]=unew[i+j*nx]-dt*(convvelu-df)/(dx*d
y);
// cout<<ustar[i+(ny-1)*nx]<<"ustar \n";
// cout<<"ustar"<<ustar[i+j*nx]<<"\n";
}
}//end of ustar for loops
//Bottom Boundary conditions
for(i=1;i<nx-1;i++)
{
ustar[i] = -ustar[i+nx];
}

//Top boundary conditions


for(i=1;i<nx-1;i++)
{
ustar[i+(ny-1)*nx] = 2-ustar[i+(ny-2)*nx] ;
}
//Left boundary conditions
for(j=1;j<ny-1;j++)
{
ustar[j*nx] =- ustar[j*nx+1];
}
//Right boundary conditions
for(j=1;j<ny-1;j++)
{
ustar[nx-1+j*nx] = -ustar[nx-2+j*nx] ;
}
//end of ustar calculation

for(j=1;j<ny-1;j++)//For interior cells


{
for(i=1;i<nx-1;i++)
{
convvelv=0;
//diffusion term
df = (-1/Re)*(4*vnew[i+nx*j] - vnew[i+nx*j+1] - v
new[i+nx*j-1] - vnew[i+nx*(j+1)] - vnew[i+nx*(j-1)]);
//Convective term
//First Order upwind scheme
if( fe[i+nx*j] >= 0 )
{
convvelv += fe[i+j*nx]*vnew[i+j*nx];
}
else
{
convvelv += fe[i+j*nx]*vnew[i+j*nx+1];
}
if( fw[i+nx*j] >= 0 )
{
convvelv += fw[i+j*nx]*vnew[i+j*nx];
}
else
{
convvelv += fw[i+j*nx]*vnew[i+j*nx-1];
}
if( fn[i+nx*j] >= 0 )
{
convvelv += fn[i+j*nx]*vnew[i+j*nx];
}
else
{
convvelv += fn[i+j*nx]*vnew[i+(j+1)*nx];
}
if( fs[i+nx*j] >= 0 )
{
convvelv += fs[i+j*nx]*vnew[i+j*nx];
}
else
{
convvelv += fs[i+j*nx]*vnew[i+(j-1)*nx];
}
vstar[i+j*nx]= vnew[i+j*nx]-dt*(convvelv-df)/(dx*d
y);
}
}//end of vstar for loops
//Bottom Boundary conditions
for(i=1;i<nx-1;i++)
{
vstar[i] = - vstar[i+nx];
}

//Top boundary conditions


for(i=1;i<nx-1;i++)
{
vstar[i+(ny-1)*nx] = - vstar[i+(ny-2)*nx];
}
//Left boundary conditions
for(j=1;j<ny-1;j++)
{
vstar[j*nx] = - vstar[j*nx+1];
}
//Right boundary conditions
for(j=1;j<ny-1;j++)
{
vstar[nx-1+j*nx] = - vstar[nx-2+j*nx];
}
//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*1.2*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.2*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.2*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.2*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.2*residual*dx;
rmsresidual += pow(residual,2);

}
rmsresidual=pow(rmsresidual/(nx*ny),0.5);
//cout<<rmsresidual<<endl;
}while(rmsresidual>0.000001); //Convergence criteria end of pressure
poison equation
cout<<"\n q "<<q<<endl;

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] = -unew[i+nx];
vnew[i] = -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] = -vnew[i+(ny-2)*nx];
}
//Left Boundary condition
for(j=1;j<ny-1;j++)
{
unew[j*nx] = -unew[j*nx+1];
vnew[j*nx] = -vnew[j*nx+1];
}
//Right Boundary condition
for(j=1;j<ny-1;j++)
{
unew[nx-1+j*nx] = - unew[nx-2+j*nx];
vnew[nx-1+j*nx] = - 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_velocityupwind25.xls");
fout_clu.open("C_Line_X_velocityupwind25.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;

You might also like