All pastes #49899 Raw Edit

Anonymous

public text v1 · immutable
#49899 ·published 2006-04-19 10:12 UTC
rendered paste body
#include <stdio.h>
#include <math.h>
#include "PitchBlkOut.h"

void OneRun(int stages, double Weight[]); /* Precondition: values have been read in from a file. Postcondition: computes traject-
ory of 2-stage missile in increments. */

void RK4_System1(int n, double h, double t, double X[], int nsteps); /* Precondition: increment value and number of steps have been entered by the user 
and initial values and time have been initialized. Postcondition: computes a series of x values based on time and functions. */

void XP_System(int Neq, double T, double X[], double DY[]); /* Precondition: X and time values have been computed. Postcondition: computes 
derivatives of X values. */

double Celerity08(double temperature, double altitude); /* Precondition: temperature has been computed. Postcondition: returns speed of sound
for given temperature. */

double Temperature08(double altitude); /* Precondition: user has entered altitude at the console. Postcondition: returns temperature using 
interpolation. */

double Lagrangian(double x[], double y[], int K, double to_find, int n_pairs); /* Precondition: tables of x and y values,order of interpola-
tion K, and x value to be found have been entered from the console. Postcondition: returns y value using Lagrangian interpolation */

double Pressure08(double altitude, double A[]); /* Precondition: user has entered altitude at the console and curve has been 
fitted to atmospheric pressure data. Postcondition: returns atmospheric pressure at given altitude. */

void output(int j, double T, double Y[]); /* Precondition: dependent variables for each of the first-order equations have been computed. 
Postcondition: outputs the iteration, time value, and dependent variables for the first-order equations. */

double Gravity08(double altitude); /* Precondition: user has entered altitude in meters at the console. Postcondition: returns acceleration
due to gravity in meters/second^2 for given altitude. */

int print_control, n_stage;		// global variables

double Vrt, Pang, Pend, Az, time, Pressure, Temperature, Mach, Celerity, Q, Fa, start_lat, start_long, start_ht, velocity, acceleration;

double Thrust[5], FlowRate[5], XSect[5], CD[5], COT[5], TI[5], F[3], G[3];

int main()
{
	int closed, i, stages;
	double Weight[5];
	FILE *Fp;
	
	Fp = fopen("Binput.txt", "r");		// read input data from file
	fscanf(Fp, "%d %d %lf %lf %lf", &stages, &print_control, &start_lat, &start_long, &start_ht);
	
	for (i = 0; i < stages; i++)
		fscanf(Fp, "%lf %lf %lf %lf %lf %lf %lf", &Thrust[i], &Weight[i], &FlowRate[i], &XSect[i], &CD[i], &COT[i], &TI[i]);
	fscanf(Fp, "%lf %lf %lf %lf", &Vrt, &Pang, &Pend, &Az);
	closed = fclose(Fp);

	for (i = 0; i < stages; i++)
	{
		Thrust[i] *= 0.4535924;
		Weight[i] *= 0.04625455;
		FlowRate[i] *= 0.04625455;
		XSect[i] *= pow(0.3048, 2.0);
	}
	Az *= 0.01745329;
	Pang *= 0.01745329;

	OneRun(stages, Weight);		// run simulation
	return 0;
}

void OneRun(int stages, double Weight[])
{
	int nsteps, i;
	double X[7];

	time = 0.0;
	for (i = 0; i < 6; i++)				// initialize position and velocity
		X[i] = 0.0;
	X[2] = start_ht;				// initialize altitude
	for (i = 0; i < stages; i++)			// run one simulation for each stage
	{
		nsteps = (int) COT[i] / TI[i];		// compute number of subintervals for integration
		n_stage = i;				// set n_stage equal to the number of the current stage
		X[6] = Weight[i];			// initialize weight of missile for this stage
		RK4_System1(7, TI[i], time, X, nsteps);		
	}	
}

void RK4_System1(int n, double h, double t, double X[], int nsteps)
{
	
	double Y[n];
	double K[4][n];
	int i, j;
	
	output(0, 0.0, X);

	for (j = 0; j < nsteps; j++)
	{
		XP_System(n, t, X, K[0]);
		for (i = 0; i < n; i++)
			Y[i] = X[i] + 0.5 * h * K[0][i];
		XP_System(n, t + h/2, Y, K[1]);
		for (i = 0; i < n; i++)
			Y[i] = X[i] + 0.5 * h * K[1][i];
		XP_System(n, t + h/2, Y, K[2]);
		for (i = 0; i < n; i++)
			Y[i] = X[i] + h * K[2][i];
		XP_System(n, t + h, Y, K[3]);
		for (i = 0; i < n; i++)
			X[i] = X[i] + (1.0/6.0) * h * (K[0][i] + (2 *  K[1][i]) + (2 * K[2][i]) + K[3][i]);
		t = t + h;
		time = time + h;			// increment time
		output(j + 1, t, X);
	}
}

void XP_System(int Neq, double T, double X[], double DY[])
{
	int i;
	double drag[3] = {0.0, 0.0, 0.0};						// initialize drag force to zero for starting condition
	double C[3];
	double A0[6] = {-9.8572566e-18, 7.9877769e-13, -2.4260748e-08, 3.4967768e-04, -2.5611872e+00, 1.0197162e+04}; // coefficients for pressure curve
	double A1[6] = {-2.1244088e-20, 5.3110219e-15, -5.2048015e-10, 2.5216732e-05, -6.2330153e-01, 6.7811128e+03};
	
	/*for (i = 0; i < 3; i++)								// set C vector equal to current velocity
		C[i] = X[i + 3]; */
	PITCH(T, Az, Pang, Vrt, Pend, F, C);
	Temperature = Temperature08(X[2]);						// compute temperature based on current altitude	
	Celerity = Celerity08(Temperature, X[2]);					// compute celerity based on temperature
	velocity = sqrt(pow(X[3], 2.0) + pow(X[4], 2.0) + pow(X[5], 2.0));		// compute velocity
	Mach =  velocity / Celerity;							// compute Mach number
	if(X[2] < 25000)								// compute pressure given altitude
		Pressure = Pressure08(X[2], A0);
	else
		Pressure = Pressure08(X[2], A1);
	Q = 0.7 * Pressure * pow(Mach, 2.0);						// compute dynamic pressure
	Fa = CD[n_stage] * Q * XSect[n_stage];						// compute drag force
	G[0] = 0.0;									// compute acceleration due to gravity
	G[1] = 0.0;
	G[2] = Gravity08(X[2]);	
	// printf("Pressure = %lf, Temperature = %lf, Celerity = %lf, Gravity = %lf\n", Pressure, Temperature, Celerity, G[2]);
	if (velocity != 0.0)								// test if linear velocity is equal to zero as at initial condition
	{							
		drag[0] = C[0] / velocity;						// compute drag force in the i unit vector
		drag[1] = C[1] / velocity;						// compute drag force in the j unit vector
		drag[2] = C[2] / velocity;						// compute drag force in the k unit vector
	}							
	DY[0] = C[0];									// velocity in the i unit vector
	DY[1] = C[1];									// velocity in the j unit vector
	DY[2] = C[2];									// velocity in the k unit vector
	DY[3] = ((Thrust[n_stage] * F[0]) - (Fa * drag[0])) / X[6];			// compute acceleration in the i unit vector
	DY[4] = ((Thrust[n_stage] * F[1]) - (Fa * drag[1])) / X[6];			// compute acceleration in the j unit vector
	DY[5] = ((Thrust[n_stage] * F[2]) - G[2] - (Fa * drag[2])) / X[6];		// compute acceleration in the k unit vector
	DY[6] = -FlowRate[n_stage];							// compute flow rate
	acceleration = sqrt(pow(DY[3], 2.0) + pow(DY[4], 2.0) + pow(DY[5], 2.0));	// compute straight-line acceleration	
}

double Celerity08(double temperature, double altitude)
{
	double speed;
	
	if (altitude >= 65000.0)
		speed = 1000.0;
	speed = sqrt(((1.4 * 8314.32) / 28.9644) * temperature);
	return speed;
}

double Temperature08(double altitude)
{
	double temperature;
	double height[15] = {0.0, 5000.0, 10000.0, 15000.0, 20000.0, 25000.0, 30000.0, 35000.0, 40000.0, 45000.0, 50000.0, 
		55000.0, 60000.0, 65000.0, 70000.0};
	double degrees[15] = {290.0, 240.0, 220.0, 225.0, 230.0, 245.0, 255.0, 265.0, 270.0, 275.0, 270.0, 255.0, 235.0, 
		215.0, 200.0};
	if (altitude >= 65000.0)
		return 180.0;
	temperature = Lagrangian(height, degrees, 4, altitude, 15);
	return temperature;
}

double Lagrangian(double x[], double y[], int K, double to_find, int n_pairs)
{
	int i, j, m, stop;
	double result = 0.0;
	double partial_product;

	for (i=0; i < n_pairs; i++)
	{
		if (to_find <= x[i])
		{
			i--;
			break;
		}
	}
	if (K==4 && i !=0)
		i--;
	if (K==4 && i == n_pairs - 2)
		i -= 2;
	if (K==3 && i == n_pairs - 1)
		i -= 2;
	if (K == 3 && i == n_pairs - 2)
		i--;
	stop = i + K;
	for (j=i; j < stop; j++)
	{
		partial_product = 1.0;
		for (m=i; m < stop; m++)
		{
			if (m != j)
				partial_product *= ((to_find - x[m]) / (x[j] - x[m]));
		}
		partial_product = partial_product * y[j];
		result += partial_product;
	}
	return result;
}

double Pressure08(double altitude, double A[])
{
	int i;
	double pressure = 0.0;
	double j = 5.0;

	if (altitude > 70000)
		return 0;
	for (i = 0; i <= 5; i++)
	{
		pressure += (A[i] * pow(altitude, j));
		j -= 1.0;
	}
	return pressure;
}		  

void output(int j, double T, double Y[])
{
	int i;
	double met_long, met_lat;
	double y[3];
	double C[3];

	met_lat = start_lat * 1852.0 * 60.0;			// convert starting latitude to meters
	met_long = start_long * 1852.0 * 60.0;			// convert starting longitude to meters
	for (i = 0; i < 3; i++)
	{
		y[i] = Y[i];					// initialize position 
		C[i] = Y[i + 3];				// initialize velocity vector
	}	
	BLKOUT(1, print_control, time, y, C, F, G, Pang, Vrt, Pend, Az, FlowRate[n_stage], XSect[n_stage], Thrust[n_stage], G[2], Pressure, 
		Temperature, Mach, Celerity, Q, CD[n_stage], Fa, (met_lat + Y[0]) / (1852.0 * 60.0), (met_long + Y[1]) / (1852.0 * 60.0),
		sqrt(pow(Y[0], 2.0) + pow(Y[1], 2.0)), velocity, acceleration, COT[n_stage], TI[n_stage]);
}
 
double Gravity08(double altitude)
{
	double GM = 3.98622e14;
	double radius, acceleration;
	
	radius = 6378178 + altitude;
	acceleration = GM / pow(radius, 2.0);
	return acceleration;
}	




/********************CODE 2**************************************/
#include <stdio.h>
#include <math.h>
#include "PitchBlkOut.h"

double Pressure07(double alt);
double Temperature07(double alt);
double Celerity07(double temp);
double Gravity07(double alt);
double do_lagrange(double pairs[][2], double x, int k, int num_pairs);
void RK4_System(int n, double h, double t, double x[], int nsteps);
void XP_System(int Neq, double T, double Y[], double DY[]);
void output(int j, double T, double Y[]);
void OneRun07();

int NumStages;
int CONTROL;
int stage;

double Time,
                         COT[2],Thrust[2],Weight[2],Flow[2],CrossSection[2],CD[2],
                         TI[2],AZ,PANG,VEND,PEND;
double PLAT,PLONG,HEIGHT;

double Velocity,C[3],F[3],Gravity,G[3],Pressure,Temperature,Celerity,
                         Mach,Q,AF,Latitude,Longitude,Altitude,Acceleration,Range;

int main()
{
        double iLat,iLong,iHeight;
        double iThrust[2],iWeight[2],iFlow[2],iCrossSection[2],iDrag[2],
                                 iCutOff[2],iStepSize[2];
        double iVertRise,iPitchAngle,iPitchEnd,iLaunchAzimuth;

        int i;

        printf("Michael Eads NN:07 Numerical Analysis\n");

        printf("Control values:\n");
        printf("  Number of stages:\n");
        scanf("%d",&NumStages);
        printf("  Print control:\n");
        scanf("%d",&CONTROL);
        printf("Launch Point\n");
        printf("  Latitude:\n");
        scanf("%lf",&iLat);
        printf("  Longitude:\n");
        scanf("%lf",&iLong);
        printf("  Height:\n");
        scanf("%lf",&iHeight);
        for(i = 0; i < NumStages; i++) {
                printf("The vehicle (%d stage):\n",i);
                printf("  Thrust(lbs):\n");
                scanf("%lf",&iThrust[i]);
                printf("  Weight(lbs):\n");
                scanf("%lf",&iWeight[i]);
 printf("  Flow(lbs/sec):\n");
                scanf("%lf",&iFlow[i]);
                printf("  Cross-sectional area(ft^2):\n");
                scanf("%lf",&iCrossSection[i]);
                printf("  Drag coefficient:\n");
                scanf("%lf",&iDrag[i]);
                printf("  Cut-off time(secs):\n");
                scanf("%lf",&iCutOff[i]);
                printf("  Step size(secs):\n");
                scanf("%lf",&iStepSize[i]);

        }
        printf("Pitch program:\n");
        printf("  Vertical rise time(secs):\n");
        scanf("%lf",&iVertRise);
        printf("  Pitch angle(degrees from vert):\n");
        scanf("%lf",&iPitchAngle);
        printf("  Pitch Program end time(secs):\n");
        scanf("%lf",&iPitchEnd);
        printf("  Launch azimuth(degrees from north):\n");
        scanf("%lf",&iLaunchAzimuth);

        // Echo input
        printf("Control values:\n");
        printf("  Number of stages:%d\n",NumStages);
        printf("  Print control:%d\n",&CONTROL);
        printf("Launch Point\n");
        printf("  Latitude:%lf\n",iLat);
        printf("  Longitude:%lf\n",iLong);
        printf("  Height:%lf\n",iHeight);
        for(i = 0; i < NumStages; i++) {
                printf("The vehicle (%d stage):\n",i);
                printf("  Thrust(lbs):%lf\n",iThrust[i]);
                printf("  Weight(lbs):%lf\n",iWeight[i]);
                printf("  Flow(lbs/sec):%lf\n",iFlow[i]);
                printf("  Cross-sectional area(ft^2):%lf\n",iCrossSection[i]);
                printf("  Drag coefficient:%lf\n",iDrag[i]);
                printf("  Cut-off time(secs):%lf\n",iCutOff[i]);
                printf("  Step size(secs):%lf\n",iStepSize[i]);

        }
        printf("Pitch program:\n");
        printf("  Vertical rise time(secs):%lf\n",iVertRise);
        printf("  Pitch angle(degrees from vert):%lf\n",iPitchAngle);
        printf("  Pitch Program end time(secs):%lf\n",iPitchEnd);
        printf("  Launch azimuth(degrees from north):%lf\n",iLaunchAzimuth);

        // Input translation
        PLAT = iLat;
        PLONG = iLong;
        HEIGHT = iHeight;
        for(i = 0; i < NumStages; i++) {
           COT[i] = iCutOff[i];
                Thrust[i] = iThrust[i] * 0.4535924;
                Flow[i] = -iFlow[i] * 0.04625455;
                Weight[i] = iWeight[i] * 0.04625455;
                CrossSection[i] = iCrossSection[i] * pow(0.3048,2.0);
                CD[i] = iDrag[i];
                TI[i] = iStepSize[i];
        }
        AZ = iLaunchAzimuth;
        PANG = iPitchAngle;
        VEND = iVertRise;
        PEND = iPitchEnd;

        Latitude = PLAT;
        Longitude = PLONG;

        OneRun07();

}

void OneRun07()
{
        double X[7];
        double Ft,Fa,Fg;
        double alt = HEIGHT;
        G[0] = 0.0; G[1] = 0.0; G[2] = -1.0;
        F[0] = 0.0; F[1] = 0.0; F[2] = 1.0;
        C[0] = 0.0; C[1] = 0.0; C[2] = 0.0;

        stage = 0;

        X[0] = 0.0;
        X[1] = 0.0;
        X[2] = HEIGHT;
        X[3] = 0.0;
        X[4] = 0.0;
        X[5] = 0.0;
        X[6] = Weight[stage];

        // Initialize other values
        Pressure = Pressure07(alt);
        Temperature = Temperature07(alt);
        Celerity = Celerity07(Temperature);
        Gravity = Gravity07(alt);

        Velocity = 1.0;
        Mach =  Velocity / Celerity;
        Q = 0.7 * Pressure * pow(Mach,2.0);

        // Calculate forces
        Ft = Thrust[stage];
        Fg = alt * Gravity;
        Fa = CD[stage] * Q * CrossSection[stage];

        Acceleration = (Ft - Fa) / (9.80665 * Weight[stage]);


        RK4_System(7,TI[stage],0.0,X,2);
}

void RK4_System(int n, double h, double t, double x[], int nsteps)
{
        int i,j,not_k;
        double y[n],dy[n];
        double K[4][n];

        output(-1,t,x);
        for(j = 0; j < nsteps; j++) {
                // K1
                XP_System(n,t,x,K[0]);
                for(i = 0; i < n; i++) {
                        y[i] = x[i] + 0.5 *     h * K[0][i];
                }

                // K2
                XP_System(n,t+(h/2.0),y,K[1]);
                for(i = 0; i < n; i++) {
                        y[i] = x[i] + 0.5 *     h * K[1][i];
                }

                // K3
                XP_System(n,t+(h/2.0),y,K[2]);
                for(i = 0; i < n; i++) {
                        y[i] = x[i] + h * K[2][i];
                }

                // K4
                XP_System(n,t+h,y,K[3]);
                for(i = 0; i < n; i++) {
                        x[i] = x[i] + (h/6.0) * (K[0][i] + 2.0*K[1][i] + 2.0*K[2][i] + K[3][i]);
                }
                t = t+h;
                output(j,t,x);
        }
}

void XP_System(int Neq, double T, double Y[], double DY[])
{
        double alt;
        double Fg,Ft,Fa;

        alt = Y[2];


        // Caclulate constants
        Pressure = Pressure07(alt);
        Temperature = Temperature07(alt);
        Celerity = Celerity07(Temperature);
        Gravity = Gravity07(alt);

        Velocity = sqrt(pow(Y[3],2.0) + pow(Y[4],2.0) + pow(Y[5],2.0));
        Mach =  Velocity / Celerity;
        Q = 0.7 * Pressure * pow(Mach,2.0);

        // Calculate forces
        Ft = Thrust[stage];
        Fg = (Y[6]) * Gravity;
        Fa = CD[stage] * Q * CrossSection[stage];

        // Setup velocity vector (I think?)
        if(T != 0.0) {
        C[0] = Y[3] / Velocity;
        C[1] = Y[4] / Velocity;
        C[2] = Y[5] / Velocity;
        } else {C[0] = 0.0; C[1] = 0.0; C[2] = 0.0;}

        Acceleration = (Ft - Fa) / (9.80665 * (Y[6]));
        PITCH(T,AZ,PANG,VEND,PEND,F,C);

        //Calculate derivatives
        DY[0] = Y[3];
        DY[1] = Y[4];
        DY[2] = Y[5];
        DY[3] = (Ft * F[0] + Fg * G[0] - Fa * C[0]) / (Y[6]);
        DY[4] = (Ft * F[1] + Fg * G[1] - Fa * C[1]) / (Y[6]);
        DY[5] = (Ft * F[2] + Fg * G[2] - Fa * C[2]) / (Y[6]);
        DY[6] = Flow[stage] * T;

        //printf("DY[6] = %lf, Flow=%lf, T=%lf\n",DY[6],Flow[stage],T);
}

void output(int j, double T, double Y[])
{
        int i;
        for( i = 0; i < 7; i++)
                printf("Y[%d] = %lf\n",i,Y[i]);
        BLKOUT(1, CONTROL,
                        T, Y, C,
                        F, G,
                        PANG, VEND, PEND, AZ,
                        Flow[stage],CrossSection[stage],Thrust[stage],
                        Gravity,Pressure,Temperature,Mach,
                        Celerity,Q,CD[stage],AF,
                        Latitude,Longitude,Range, Velocity,
                        Acceleration,COT[stage],TI[stage]);

}

double Pressure07(double alt)
{
        double a1[6] = {
                -9.666667e-04,
                 7.833333e-02,
    -2.379167e+00,
           3.429167e+01,
                -2.511667e+02,
                 1.000000e+03
        };

        double a2[6] = {
                -2.083333e-06,
                 5.208333e-04,
                -5.104167e-02,
                 2.472917e+00,
                -6.112500e+01,
                 6.650000e+02
        };

        double pressure;
        int i;

        alt /= 1000.0;
        pressure = 0.0;
        if(alt > 65.0) pressure = 0.0;
        else if(alt > 25.0) {
                for(i = 0; i < 6; i++) {
                        pressure += pow(alt,5-i) * a2[i];
                }
        } else {
                for(i = 0; i < 6; i++) {
                        pressure += pow(alt,5-i) * a1[i];
                }
        }

        return pressure * 1000.0 * 0.010197162;
}

double Temperature07(double alt)
{
        double pairs[15][2];
        double result;

        alt /= 1000.0;

        pairs[0][0] =  0.0;  pairs[0][1] = 290.0;
        pairs[1][0] =  5.0;  pairs[1][1] = 240.0;
        pairs[2][0] = 10.0;  pairs[2][1] = 220.0;
        pairs[3][0] = 15.0;  pairs[3][1] = 225.0;
        pairs[4][0] = 20.0;  pairs[4][1] = 230.0;
        pairs[5][0] = 25.0;  pairs[5][1] = 245.0;
        pairs[6][0] = 30.0;  pairs[6][1] = 255.0;
        pairs[7][0] = 35.0;  pairs[7][1] = 265.0;
        pairs[8][0] = 40.0;  pairs[8][1] = 270.0;
        pairs[9][0] = 45.0;  pairs[9][1] = 275.0;
        pairs[10][0] = 50.0; pairs[10][1] = 270.0;
        pairs[11][0] = 55.0; pairs[11][1] = 255.0;
        pairs[12][0] = 60.0; pairs[12][1] = 235.0;
        pairs[13][0] = 65.0; pairs[13][1] = 215.0;
        pairs[14][0] = 70.0; pairs[14][1] = 200.0;

        if(alt > 65.0) result = 180.0;
        else result = do_lagrange(pairs,alt,4,15);

        return result;
}

double Celerity07(double temp)
{
        double result;

        if(temp == 180.0) result = 1000.0;
        else result = pow((1.4 * (8314.32 / 28.9644)) * temp,0.5);
        return result;
}

double Gravity07(double alt)
{
        double GM = 3.98622 * pow(10.0,14.0);
        double r0 = 6.378178 * pow(10.0,6.0);

        return GM/pow(r0 + alt,2.0);
}

double do_lagrange(double pairs[][2], double x, int k, int num_pairs)
{
        int i,j,x_begin,x_end,x_middle;
        int x_half, k_count;
        double partial,result;

        partial = result = 0.0;

        x_half = k / 2;
        k_count = k;

        for(i = 0; i < num_pairs; i++)          /*Find the middle point*/
                if(pairs[i][0] >= x) break;

        x_middle = i;
        if(x_middle < 0) x_middle = 0;

        x_begin = x_end = 0;
        x_begin = x_middle - x_half;
        x_end = x_middle + x_half;
        if(x_begin < 0) {                                       /*Too close to the beginning*/
                x_begin = 0;
                k_count -= (x_end - x_middle);
                k_count -= (x_middle - x_begin);
                x_end+=k_count;
        }
        else if(x_end >= num_pairs) {           /*Too close to the end*/
                x_end = num_pairs - 1;
                k_count -= (x_end - x_middle);
                k_count -= (x_middle - x_begin);
                x_end+=k_count;
        } else {                                                        /*Middle case*/
                k_count -= (x_end - x_middle);
                k_count -= (x_middle - x_begin);
                x_end+=k_count;
                if(x_end >= num_pairs) {                /*This case can happen again*/
                        x_end -= k_count;
                        x_begin -= k_count;
                }
        }


        result = 0.0;
        for(i = x_begin; i < x_end; i++) {
                partial = pairs[i][1];
                for(j = x_begin; j < x_end; j++) {
                        if(i != j) {
                                partial *= (x - pairs[j][0]) / (pairs[i][0] - pairs[j][0]);
                        }
                }
                result += partial;
        }
        return result;
}