#include <iostream>
#include <stdio.h>
using namespace std;
// Uneti velikim slovima BFR, SOYUZ ili FALCON_9
// Moguce je napraviti i svoju konfiguraciju
#define SOYUZ // FALCON_9 BFR
#ifdef BFR
// Potisak motora 1 u Njutnima
// Ako raketa ima vise tipova motora ovo su busteri npr kod Sojuza (RD-107A) ako ne ovde upisati potisak motora
double dEngine1Thrust = 1971429;
// Broj motora 1 (bustera) na prvom stepenu
int nNumOfEngines1 = 35;
// Potisak motora 2 u Njutnima
// Ako raketa ima vise tipova motora ovo je prvi (ili drugi kako ko zove) stepen npr kod Sojuza (RD-108A) ako ne, ne koristiti
double dEngine2Thrust = 0;
// Broj motora 2 na prvom stepenu
int nNumOfEngines2 = 0;
// Ukupan potisak u Njutnima
double dTotalThrust;
// Specifican impuls motora 1 u sekundama
double dIsp1 = 330;
// Specifican impuls motora 2 u sekundama (ako nema motora 2 upisati istu cifru kao za motor 1)
double dIsp2 = 330;
// Masa kompletne rakete u kg
double dStartMass = 4655000;
#endif // BFR
#ifdef SOYUZ
// Potisak motora 1 u Njutnima
// Ako raketa ima vise tipova motora ovo su busteri npr kod Sojuza (RD-107A) ako ne ovde upisati potisak motora
double dEngine1Thrust = 839480;
// Broj motora 1 (bustera) na prvom stepenu
int nNumOfEngines1 = 4;
// Potisak motora 2 u Njutnima
// Ako raketa ima vise tipova motora ovo je prvi (ili drugi kako ko zove) stepen npr kod Sojuza (RD-108A) ako ne, ne koristiti
double dEngine2Thrust = 792410;
// Broj motora 2 na prvom stepenu
int nNumOfEngines2 = 1;
// Ukupan potisak u Njutnima
double dTotalThrust;
// Specifican impuls motora 1 u sekundama
double dIsp1 = 263.3;
// Specifican impuls motora 2 u sekundama (ako nema motora 2 upisati istu cifru kao za motor 1)
double dIsp2 = 257.7;
// Masa kompletne rakete u kg
double dStartMass = 307500;
#endif // SOYUZ
#ifdef FALCON_9
// Potisak motora 1 u Njutnima
// Ako raketa ima vise tipova motora ovo su busteri npr kod Sojuza (RD-107A) ako ne ovde upisati potisak motora
double dEngine1Thrust = 800000;//845222;
// Broj motora 1 (bustera) na prvom stepenu
int nNumOfEngines1 = 9;
// Potisak motora 2 u Njutnima
// Ako raketa ima vise tipova motora ovo je prvi (ili drugi kako ko zove) stepen npr kod Sojuza (RD-108A) ako ne, ne koristiti
double dEngine2Thrust = 0;
// Broj motora 2 na prvom stepenu
int nNumOfEngines2 = 0;
// Ukupan potisak u Njutnima
double dTotalThrust;
// Specifican impuls motora 1 u sekundama
double dIsp1 = 282;
// Specifican impuls motora 2 u sekundama (ako nema motora 2 upisati istu cifru kao za motor 1)
double dIsp2 = 330;
// Masa kompletne rakete u kg
double dStartMass = 549054;
#endif // FALCON_9
// Gravitaciona konstanta 9.81 N/kg
const double cdg = 9.81;
// Inkrement vremena u sekundama
const double dt = 0.01;
// Trenunta masa rakete
double dCurrentMass;
// Protok goriva svih motora 1 u kg/sec
double dFuelFlow1;
// Protok goriva svih motora 1 u kg/sec
double dFuelFlow2;
// Brzina rakete u m/sec
double dVelocity = 0;
// Prethodna brzina
double dOldVelocity;
// Finalna brzina u m/sec
const double cdFinalVelocity = 100;
// Visina rakete u m
double dHeight = 0;
// Simulacija u odsustvu gravitacije Da/Ne (true/false)
bool bSimNoGravity = false;
// Potroseno goriva motora 1 u tonama
double dFuelSpent1 = 0;
// Potroseno goriva motora 2 u tonama
double dFuelSpent2 = 0;
int main()
{
int dIt = 0;
dCurrentMass = dStartMass;
dTotalThrust = dEngine1Thrust*nNumOfEngines1 + dEngine2Thrust*nNumOfEngines2;
dFuelFlow1 = dEngine1Thrust*nNumOfEngines1/(dIsp1*cdg);
dFuelFlow2 = dEngine2Thrust*nNumOfEngines2/(dIsp2*cdg);
while(dVelocity < cdFinalVelocity)
{
dIt++;
dOldVelocity = dVelocity;
dCurrentMass = dCurrentMass - dt * (dFuelFlow1 + dFuelFlow2);
dFuelSpent1 = dFuelSpent1 + dt*dFuelFlow1;
dFuelSpent2 = dFuelSpent2 + dt*dFuelFlow2;
if (bSimNoGravity)
{
dVelocity = dVelocity + dTotalThrust/dCurrentMass*dt;
}
else
{
dVelocity = dVelocity + (dTotalThrust/dCurrentMass - cdg)*dt;
}
dHeight = dHeight + (dOldVelocity + dVelocity)*dt/2;
}
double dCurrentMassT = dCurrentMass/1000.0;
double dTime = dIt*dt;
dFuelSpent1 = dFuelSpent1/1000;
dFuelSpent2 = dFuelSpent2/1000;
printf("Krajnja masa : %10.2f t\n", dCurrentMassT);
printf("Potroseno gorivo 1 : %10.2f t\n", dFuelSpent1);
printf("Potroseno gorivo 2 : %10.2f t\n", dFuelSpent2);
printf("Visina : %10.2f m\n", dHeight);
printf("Vreme : %10.2f sec\n", dTime);
return 0;
}