Sie sind auf Seite 1von 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');

Das könnte Ihnen auch gefallen