Based on the original Rocket Workbench on SourceForge in CVS at: https://sourceforge.net/projects/rocketworkbench
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

314 lines
6.6 KiB

/* cpropep.c - Calculation of Complex Chemical Equilibrium */
/* Copyright (C) 2000 */
/* Antoine Lefebvre <antoine.lefebvre@polymtl.ca> */
/* This program is free software; you can redistribute it and/or modify*/
/* it under the terms of the GNU General Public License as published by*/
/* the Free Software Foundation; either version 2 of the License, or */
/* (at your option) any later version. */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* You should have received a copy of the GNU General Public License */
/* along with this program; if not, write to the Free Software */
/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <iostream>
#include <stdio.h>
#include <cmath>
#include "c++rocket.h"
#include "rocket.h"
extern FILE* yyin; // file pointer for the file parser
// function generate by the flex lexer generator (motor.l)
extern int motorscan(char *name, double *diameter,
double *length, double *masse_totale,
double *masse_poudre, double **thrust,
int *ndata);
simulation *simptr; // this is the pointer to the active simulation
const double G = 6.67259e-11; // universal gaz constant
const double R = 8.3145; // perfect gaz constant
const double g = 9.80665; // Earth gravitational constant
// default value for the initialisation
static double rocket_default[PARA_ROCKET_LAST] = { 0.204,
2,
2.33,
20.4,
6.32,
31.6,
0,
0,
0.1143,
16,
1,
1.1,
0.229,
0 };
static double planete_default[PLANETE_DATA_LAST] = { 5.98e24,
6370000 };
static double atmosphere_default[ATM_DATA_LAST] = { 1.013e5,
0.0289644,
273.15 };
propulseur::~propulseur()
{
cout << "Destroying propulseur\n";
if (!(ndata == 0))
{
delete [] thrust[0];
delete [] thrust[1];
delete [] thrust;
}
}
int propulseur::print_data(void)
{
if (!(check()))
return -1;
cout << "Motor:\t\t\t" << name << endl;
cout << "Diameter:\t\t" << diameter << " m" << endl;
cout << "Length:\t\t" << length << " m" << endl;
cout << "Mass de propergol:\t" << masse_poudre << " Kg" << endl;
cout << "Total mass:\t\t" << masse_totale << " Kg" << endl;
//cout << ndata << endl;
cout << endl;
cout << "Time (s)\t" << "Thrust (N)" << endl;
for (int k = 0; k < ndata; k++)
cout << thrust[0][k] << "\t\t" << thrust[1][k] << endl;
return 0;
}
int propulseur::load_data(char file[32])
{
FILE *file_in = NULL;
if ((file_in = fopen(file, "r")) == NULL)
{
cout << "No such file or directory " << file << endl;
return -1;
}
yyin = file_in;
thrust = new double*[2];
motorscan(name, &diameter, &length, &masse_totale,
&masse_poudre, thrust, &ndata);
fclose(file_in);
burntime = thrust[0][ndata-1];
return 0;
}
//#ifdef WITH_GTK
//int propulseur::plot_data(void) {
// cout << "I plot the data...\n";
// return 0;
//}
//#endif
int propulseur::check(void)
{
if (ndata == 0)
{
cout << "No data loaded\n";
return -1;
}
return 1;
}
double propulseur::T(double time)
{
if (!(check()))
return 0; // no thrust
double pousse;
// there is file with no data at time 0
if (time < thrust[0][0])
return (thrust[1][0]/thrust[0][0])*time;
// after the last data, the thrust is 0
if (time > thrust[0][ndata-1])
return 0;
// linear interpolation ( should be interesting
// to add quadratic interpolation
for (int i = 1; i < ndata; i++)
if ((thrust[0][i] > time) && (thrust[0][i-1] <= time))
{
pousse = (thrust[1][i]-thrust[1][i-1])/
(thrust[0][i]-thrust[0][i-1])*(time-thrust[0][i-1]) +
thrust[1][i-1];
}
return pousse;
}
double propulseur::M(double time)
{
if (!(check()))
return 0;
if (time > burntime)
return (masse_totale - masse_poudre);
else
return (masse_totale - time*(masse_totale-masse_poudre)/burntime);
return 0;
}
double propulseur::impulse(void)
{
if (!(check()))
return -1;
double I = 0;
for (int i = 0; i < (ndata - 1); i++)
I += (thrust[1][i]+thrust[1][i+1])*(thrust[0][i+1]-thrust[0][i])/2;
return I;
}
double propulseur::favg(void)
{
if (check())
return (impulse()/burntime);
return -1;
}
double propulseur::vg(void)
{
if (check())
return impulse()/masse_poudre;
return -1;
}
double propulseur::isp(void)
{
if (check())
return vg()/g;
return -1;
}
double propulseur::propellant_mass_fraction(void)
{
if (check())
return masse_poudre/masse_totale;
return -1;
}
double propulseur::impulse_to_weight(void)
{
if (check())
return impulse()/(masse_totale*g);
return -1;
}
rocket::rocket(void)
{
nprop = 0;
r_data = rocket_default;
}
rocket::rocket(double *r)
{
nprop = 0;
for (int i = 0; i < PARA_ROCKET_LAST; i++)
r_data[i] = r[i];
}
int rocket::set_propulseurs(int stage, char file[128])
{
if (stage > MAXPROP)
return -1;
if (!(stage == 1))
if (prop[stage-2].ndata == 0) {
cout << "Stage " << stage-1 << " not loaded.\n";
return -1;
}
prop[stage-1].load_data(file);
nprop = stage;
return 0;
}
planete::planete(void)
{
p_data = planete_default;
}
planete::planete(double *p)
{
for (int i = 0; i < PLANETE_DATA_LAST; i++)
p_data[i] = p[i];
}
planete::planete(double *p, double *a) : atmosphere(a)
{
for (int i = 0; i < PLANETE_DATA_LAST; i++)
p_data[i] = p[i];
}
double planete::densiteatm(double altitude)
{
double d = (((a_data[pression_sol] * a_data[masse_molaire]) / (R*a_data[temperature]))* exp(( (a_data[masse_molaire]*G*p_data[masse])/(R*a_data[temperature]) ) * ( (1/(p_data[rayon] + altitude)) - (1/p_data[rayon]) ) ));
return d;
}
atmosphere::atmosphere(void)
{
a_data = atmosphere_default;
}
atmosphere::atmosphere(double* a)
{
for (int i = 0; i < ATM_DATA_LAST; i++)
a_data[i] = a[i];
}
flight_program::flight_program(void)
{
for (int i = 0; i < MAXPROP; i++)
{
ta[i] = 0;
tl[i] = 0;
}
}
int flight_program::set_prog(int stage, double allumage, double largage)
{
if ( (stage < 1) || (stage > MAXPROP) )
return -1;
ta[stage - 1] = allumage;
tl[stage - 1] = largage;
return 0;
}