0% found this document useful (0 votes)
277 views8 pages

1D Navier Stokes Solver

This program uses the finite difference time domain method and Euler equations to simulate steady state 1D subsonic flow through a duct of varying cross-sectional area. It discretizes the duct into grid points, applies boundary conditions at the inlet and exit, initializes the flow variables, and iteratively solves the governing equations until convergence is reached. Flow properties like pressure, velocity and density are then displayed at each grid point.

Uploaded by

siva_ksr
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as EHTML, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
277 views8 pages

1D Navier Stokes Solver

This program uses the finite difference time domain method and Euler equations to simulate steady state 1D subsonic flow through a duct of varying cross-sectional area. It discretizes the duct into grid points, applies boundary conditions at the inlet and exit, initializes the flow variables, and iteratively solves the governing equations until convergence is reached. Flow properties like pressure, velocity and density are then displayed at each grid point.

Uploaded by

siva_ksr
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as EHTML, PDF, TXT or read online on Scribd
You are on page 1/ 8

/*

This program computes the steady state flow parameters in a constant area
duct with a reservoir pressure = 1 atm and temperature = 300K. There are
12 grid points (ten internal nodes and two boundary nodes). FTCS scheme
is applied to the conservative form of 1-D Euler Equations for conservation
of mass, momentum and energy. Shift boundary conditions are applied at the
inlet and the exit. Artificial Viscosity is added to eliminate oscillations.
*/
#include <iostream.h>
#include <math.h>
class GridPoints
{
public:
void CreateNodes();
void Initialize();
void InputData();
void ConvCriterion();
void Solve();
void DisplayResult();

private:
int dimension, internal, iterations;
double *Area;
double *q1,*q2,*q3;
double *e1,*e2,*e3;
double *rho,*Et,*p,*u,*t;
double cfl,viscosity,a,M,U,inlet,throat,exit,L_conv,L_div,deltat,deltax,deltaA;
double ti,te;
double Q1,Q2,Q3,error,error1,error2,error3;

double gamma,cp,R;
int Pi,Ti;
double Pe,Te;
double criterion;
};
// Creates the Grid
void GridPoints::CreateNodes()
{
// cout << "\nEnter the number of internal nodes: ";
// cin >> internal;
internal = 15;
dimension = internal + 2;
q1 = new double[dimension];
q2 = new double[dimension];
q3 = new double[dimension];
e1 = new double[dimension];
e2 = new double[dimension];
e3 = new double[dimension];
rho = new double[dimension];
u = new double[dimension];
Et = new double[dimension];
p = new double[dimension];
t = new double[dimension];
Area = new double[dimension];
}
// Input Data
void GridPoints :: InputData()
{
int i;

gamma = 1.4, cp = 1006,R = 287.5;


M = 0.5, U = 169.548;
Pi = 101325;
Ti = 300;
// Pe = 90000;
// Te = 275;
inlet = 0.057; throat = 0.055; exit = 0.06; L_conv = 0.0065; L_div = 0.0175;
/*cout << "\nEnter the Inlet Radius: ";
cin >> inlet;
cout << "\nEnter the Throat Radius: ";
cin >> throat;
cout << "\nEnter the Exit Radius: ";
cin >> exit;
cout << "\nEnter the length of the Converging Part: ";
cin >> L_conv;
cout << "\nEnter the length of the Diverging Part: ";
cin >> L_div;*/
cout << "\nEnter the viscosity co-efficient: ";
cin >> viscosity;
cout << "\nEnter the CFL Number: ";
cin >> cfl;
Area[0] = 3.1415926535897932384626433832795*inlet*inlet;
inlet = Area[0];
Area[(dimension-1)/2] = 3.1415926535897932384626433832795*throat*throat;
throat = Area[(dimension-1)/2];
Area[dimension-1] = 3.1415926535897932384626433832795*exit*exit;
exit = Area[dimension-1];
// cout << dimension << "\n";

for(i = 1;i <(dimension-1)*0.5;i++)


Area[i] = Area[i-1] - 2*(inlet - throat)/(dimension-1);
for(i = (dimension+1)*0.5; i < dimension; i++)
Area[i] = Area[i-1] + 2*(exit - throat)/(dimension-1);
//a = U + sqrt(gamma*R*Te);
deltax = (L_conv+L_div)/(dimension-1);
deltat = 1e-6;
//deltat = (cfl*deltax)/a;
//cout << "\nEnter the convergence criterion: ";
//cin >> criterion;
//for(i=0;i<dimension;i++)
//cout << "\n" << Area[i];
}
// Initialization
void GridPoints :: Initialize()
{
int i; double A;
for(i=1;i<dimension;i++)
{
p[i] = 90000;
u[i] = 0;
rho[i] = 1;
t[i] = p[i]/(rho[i]*R);
q1[i] = rho[i];
q2[i] = rho[i]*u[i];
Et[i] = p[i]/(rho[i]*(gamma-1)) + 0.5*u[i]*u[i];
q3[i] = rho[i]*Et[i];
A = (Area[i]-Area[i-1])/(deltax*Area[i]);
e1[i] = q2[i]*A;

e2[i] = ( (q2[i]*q2[i]*A*A)/q1[i]) + (gamma-1)*( q3[i] - (q2[i]*q2[i]*0.5)/q1[i] );


e3[i] = (q2[i]/q1[i]) * A * ( q3[i] + (gamma-1)*( q3[i] - (q2[i]*q2[i]*0.5)/q1[i] ) );
}
}
// Iterations
void GridPoints :: Solve()
{
int i; double A,relax;
relax = 0.1;
iterations = 0;
do
{
iterations++;
error = 0;
// Inlet BC -> Copy the velocity
u[0] = u[1];
ti = Ti - (0.5*u[0]*u[0])/cp;
p[0] = Pi*pow(ti/Ti,3.5);
rho[0] = p[0]/(R*ti);
t[0] = ti;
q1[0] = relax*rho[0];
q2[0] = relax*rho[0]*u[0];
Et[0] = p[0]/(rho[0]*(gamma-1)) + 0.5*u[0]*u[0];
q3[0] = relax*rho[0]*Et[0];
e1[0] = q2[0];
e2[0] = (q2[0]*q2[0])/q1[0] + (gamma-1)*( q3[0] - (q2[0]*q2[0]*0.5)/q1[0] );
e3[0] = (q2[0]/q1[0]) * ( q3[0] + (gamma-1)*( q3[0] - (q2[0]*q2[0]*0.5)/q1[0] ) );
for(i=1;i<dimension-1;i++)
{
Q1 = q1[i] - 0.5*deltat*(e1[i] - e1[i-1])/deltax + (viscosity*(q1[i+1] - 2*q1[i] + q1[i1])/(deltax*deltax))*deltat;

Q2 = q2[i] - 0.5*deltat*(e2[i] - e2[i-1])/deltax + (viscosity*(q2[i+1] - 2*q2[i] + q2[i1])/(deltax*deltax))*deltat;


Q3 = q3[i] - 0.5*deltat*(e3[i] - e3[i-1])/deltax + (viscosity*(q3[i+1] - 2*q3[i] + q3[i1])/(deltax*deltax))*deltat;
error1 = fabs(Q1 - q1[i]);
error2 = fabs(Q2 - q2[i]);
error3 = fabs(Q3 - q3[i]);
if(error3 > error)
error = error3;
//cout << error << "\n";
q1[i] = relax*Q1;
q2[i] = relax*Q2;
q3[i] = relax*Q3;
A = (Area[i]-Area[i-1])/(deltax*Area[i]);
e1[i] = q2[i]*A;
e2[i] = ( (q2[i]*q2[i]*A*A)/q1[i]) + (gamma-1)*( q3[i] - (q2[i]*q2[i]*0.5)/q1[i] );
e3[i] = (q2[i]/q1[i]) * A * ( q3[i] + (gamma-1)*( q3[i] - (q2[i]*q2[i]*0.5)/q1[i] ) );
rho[i] = q1[i];
u[i] = q2[i]/q1[i];
p[i] = e2[i] - rho[i]*u[i]*u[i];
t[i] = p[i]/(rho[i]*R);
}
// Exit BC -> Copy velocity, pressure and temperature
u[dimension-1] = u[dimension-2];
p[dimension-1] = p[dimension-2];
t[dimension-1] = t[dimension-2]; te = t[dimension-1];
rho[dimension-1] = p[dimension-1]/(R*t[dimension-1]);
q1[dimension-1] = relax*rho[dimension-1];
q2[dimension-1] = relax*rho[dimension-1]*u[dimension-1];
Et[dimension-1] = p[dimension-1]/(rho[dimension-1]*(gamma-1)) + 0.5*u[dimension-

1]*u[dimension-1];
q3[dimension-1] = relax*rho[dimension-1]*Et[dimension-1];
A = (Area[dimension-1]-Area[dimension-1])/(deltax*Area[dimension-1]);
e1[dimension-1] = q2[dimension-1]*A;
e2[dimension-1] = (q2[dimension-1]*q2[dimension-1]*A*A)/q1[dimension-1] + (gamma-1)*(
q3[dimension-1] - (q2[dimension-1]*q2[dimension-1]*0.5)/q1[dimension-1] );
e3[dimension-1] = (q2[dimension-1]/q1[dimension-1]) * A * ( q3[dimension-1] + (gamma-1)*(
q3[dimension-1] - (q2[dimension-1]*q2[dimension-1]*0.5)/q1[dimension-1] ) );
}while(iterations < 500);
}
void GridPoints::DisplayResult()
{
int i;
cout << "\n\tNumber of iterations = " << iterations << "\n\n";
cout << "

Node

Pressure

Velocity

Density" << "\n\n";

for(i=0;i<dimension;i++)
cout << "\t" << i+1 << "\t" << p[i] << "\t\t" << u[i] << "\t\t" << rho[i] <<"\n\n";
}
void main()
{
char TryAgain;
do
{
GridPoints newgrid;
newgrid.CreateNodes();
newgrid.InputData();
newgrid.Initialize();
newgrid.Solve();
newgrid.DisplayResult();
cout << "Try another case?(y/n): ";
cin >> TryAgain;
}while(TryAgain!='n');

You might also like