Thursday, August 09, 2012

multistage.c

#define AA 49.05 // aceleración soportada por los astronautas 5*g (letal en pocos segundos)
#define SPECIFIC_IMPULSE_F1 265.4
#define SPECIFIC_IMPULSE_J2 426.0
#define SPECIFIC_IMPULSE_SPACECRAFT 452.0 // inventado por el momento (se ha buscado el valor más alto posible)
#define EV_F1 SPECIFIC_IMPULSE_F1*9.81
#define EV_J2 SPECIFIC_IMPULSE_J2*9.81
#define EV_XX SPECIFIC_IMPULSE_SPACECRAFT*9.81
#define THRUST_F1 6.7725E6
#define THRUST_J2 1033.5E3
#define MC 2941.12E3 // masa del cohete Saturn V (misión Apollo 11) 2941.12 toneladas
#define S_IC_STAGE_EXPENDABLES 2149.72E3
#define FIRST_STAGE_INERT_WEIGHT 130975.0+5200.44
#define S_II_STAGE_EXPENDABLES 444752.0
#define SECOND_STAGE_INERT_WEIGHT 36251.1+3665.03
#define S_IVB_STAGE_EXPENDABLES 107572.0
#define THIRD_STAGE_INERT_WEIGHT 11339.8+1952.72
#define SPACECRAFT_INERT_WEIGHT 20538.7
#define DT 0.1 // incremento de tiempo por iteración de cálculo 0.1 segundos

#define MT 5.97E24 // masa de la Tierra
#define RT 6.379E6 // radio de la Tierra
#define ML 7.35E22 // masa de la Luna
#define RL 1.739E6 // radio de la Luna
#define DTL 356400E3 // distancia Tierra-Luna (entre los centros de masas)
#define GG 6.67259E-11 // constante de gravitación universal



#include <math.h>
#include <stdio.h>
#include <stdlib.h>



int main(int argc, char **argv) {
  double mm; // masa restante del cohete
  double mg; // masa de gas expulsada en iteración
  double mc; // masa de combustible consumido en la etapa
  double mi; // masa inerte en la etapa
  double ee; // empuje del cohete
  double ff; // fuerza sobre el cohete
  double aa; // aceleración del cohete
  double vvi; // velocidad inicial del cohete
  double vvf; // velocidad final del cohete
  double rri; // posición inicial del cohete
  double rrf; // posición final del cohete
  double tt; // tiempo
  double rr2; // posición donde se anulan las fuerzas
  double vescape; // velocidad de escape
  double EV; // "exhaust velocity" de los gases
  int etapa;

  rr2 = (DTL*(MT-sqrt(MT*ML)))/(MT-ML);

  tt = 0.0;
  mm = MC;
  mc = 0.0;
  vvi = 0.0;
  rri = RT;
  etapa = 1;
  EV = EV_F1;
  mi = FIRST_STAGE_INERT_WEIGHT + SECOND_STAGE_INERT_WEIGHT + THIRD_STAGE_INERT_WEIGHT + SPACECRAFT_INERT_WEIGHT;
  do {
    mg = (DT*mm*AA)/(EV+DT*AA);

    mm = mm - mg;
    mc = mc + mg;

    ee = mg*EV/DT;
    ff = ee + GG*(mm*ML)/pow(DTL-rri,2.0) - GG*(mm*MT)/pow(rri,2.0);
    aa = ff/mm;
    vvf = aa*DT + vvi;
    rrf = aa*pow(DT,2.0)/2.0 + vvi*DT + rri;

    vescape = sqrt(2.0*GG*(MT*(1.0/rrf - 1.0/rr2) + ML*(1.0/(DTL-rrf) - 1.0/(DTL-rr2))));

    tt = tt + DT;

    printf("Etapa : %d\n", etapa);
    printf("Tiempo : %g [s]\n", tt);
    printf("Velocidad de salida de los gases respecto al cohete : %g [m/s]\n", EV);
    printf("Masa de gas expulsada por segundo : %g [kg/s]\n", mg/DT);
    printf("Masa restante del cohete : %g [kg]\n", mm);
    printf("Masa restante del cohete (porcentaje) : %g [%%]\n", mm/MC*100.0);
    printf("Masa inerte del cohete en esta etapa: %g [kg]\n", mi);
    if (etapa == 1) {
      printf("Empuje del cohete : %g [N] (%g motores F-1)\n", ee, ee/THRUST_F1);
    } else if ((etapa == 2) || (etapa == 3)) {
      printf("Empuje del cohete : %g [N] (%g motores J-2)\n", ee, ee/THRUST_J2);
    } else {
      printf("Empuje del cohete : %g [N]\n", ee);
    }
    printf("Fuerza total sobre el cohete : %g [N]\n", ff);
    printf("Aceleración sufrida por los astronautas : %g [m/(s^2)]\n", AA);
    printf("Aceleración del cohete : %g [m/(s^2)]\n", aa);
    printf("Velocidad del cohete : %g [m/s]\n", vvf);
    printf("Velocidad del cohete (km/h) : %g [km/h]\n", vvf/1000.0*3600.0);
    printf("Velocidad de escape : %g [m/s]\n", vescape);
    printf("Velocidad de escape (km/h) : %g [km/h]\n", vescape/1000.0*3600.0);
    printf("Posición del cohete : %g [m]\n", rrf);
    printf("Altura del cohete sobre la superficie de la Tierra : %g [m]\n", rrf-RT);
    printf("Altura del cohete sobre la superficie de la Tierra (km) : %g [km]\n", (rrf-RT)/1000.0);
    printf("Distancia del cohete a la superficie de la Luna : %g [m]\n", DTL-rrf-RL);
    printf("Distancia del cohete a la superficie de la Luna (km) : %g [km]\n\n", (DTL-rrf-RL)/1000.0);

    switch (etapa) {
      case 1:
        if (mc >= S_IC_STAGE_EXPENDABLES) {
          printf("AGOTADO COMBUSTIBLE DE LA PRIMERA ETAPA: %g [kg]\n", S_IC_STAGE_EXPENDABLES);
          printf("APAGADOS LOS 5 MOTORES F-1 DE LA PRIMERA ETAPA\n");
          mm = mm - FIRST_STAGE_INERT_WEIGHT;
          mi = SECOND_STAGE_INERT_WEIGHT + THIRD_STAGE_INERT_WEIGHT + SPACECRAFT_INERT_WEIGHT;
          printf("LIBERADO PESO INERTE DE LA PRIMERA ETAPA: %g [kg]\n", FIRST_STAGE_INERT_WEIGHT);
          printf("Masa restante del cohete : %g [kg]\n", mm);
          printf("Masa restante del cohete (porcentaje) : %g [%%]\n", mm/MC*100.0);
          EV = EV_J2;
          printf("ENCENDIDOS LOS 5 MOTORES J-2 DE LA SEGUNDA ETAPA\n\n");
          mc = 0.0;
          etapa = 2;
        }
        break;

      case 2:
        if (mc >= S_II_STAGE_EXPENDABLES) {
          printf("AGOTADO COMBUSTIBLE DE LA SEGUNDA ETAPA: %g [kg]\n", S_II_STAGE_EXPENDABLES);
          printf("APAGADOS LOS 5 MOTORES J-2 DE LA SEGUNDA ETAPA\n");
          mm = mm - SECOND_STAGE_INERT_WEIGHT;
          mi = THIRD_STAGE_INERT_WEIGHT + SPACECRAFT_INERT_WEIGHT;
          printf("LIBERADO PESO INERTE DE LA SEGUNDA ETAPA: %g [kg]\n", SECOND_STAGE_INERT_WEIGHT);
          printf("Masa restante del cohete : %g [kg]\n", mm);
          printf("Masa restante del cohete (porcentaje) : %g [%%]\n", mm/MC*100.0);
          printf("ENCENDIDO EL MOTOR J-2 DE LA TERCERA ETAPA\n\n");
          mc = 0.0;
          etapa = 3;
        }
        break;

      case 3:
        if (mc >= S_IVB_STAGE_EXPENDABLES) {
          printf("AGOTADO COMBUSTIBLE DE LA TERCERA ETAPA: %g [kg]\n", S_IVB_STAGE_EXPENDABLES);
return 0;
          printf("APAGADO MOTOR J-2 DE LA TERCERA ETAPA\n");
          mm = mm - THIRD_STAGE_INERT_WEIGHT;
          mi = SPACECRAFT_INERT_WEIGHT;
          printf("LIBERADO PESO INERTE DE LA TERCERA ETAPA: %g [kg]\n", THIRD_STAGE_INERT_WEIGHT);
          printf("Masa restante del cohete : %g [kg]\n", mm);
          printf("Masa restante del cohete (porcentaje) : %g [%%]\n", mm/MC*100.0);
          EV = EV_XX;
          printf("ENCENDIDO EL MOTOR DE LA CUARTA ETAPA (ASTRONAVE)\n");
          printf("¡¡¡USANDO COMBUSTIBLE NECESARIO PARA EL VIAJE DE RETORNO!!!\n\n");
          mc = 0.0;
          etapa = 4;
        }
    }

    vvi = vvf;
    rri = rrf;
  } while ((vvf < vescape) && (mm > mi));

  if (vvf >= vescape) {
    printf("ALCANZADA VELOCIDAD DE ESCAPE\n\n");
  } else if (mm <= mi) {
    printf("COMBUSTIBLE ACABADO ANTES DE ALCANZAR LA VELOCIDAD DE ESCAPE\n\n");
  }

  return 0;
}




 


Etapa : 3
Tiempo : 235.852 [s]
Velocidad de salida de los gases respecto al cohete : 4179.06 [m/s]
Masa de gas expulsada por segundo : 947.176 [kg/s]
Masa restante del cohete : 80699.4 [kg]
Masa restante del cohete (porcentaje) : 2.74383 [%]
Masa inerte del cohete en esta etapa: 33831.2 [kg]
Empuje del cohete : 3.95831e+006 [N] (3.83 motores J-2)
Fuerza total sobre el cohete : 3.38454e+006 [N]
Aceleración sufrida por los astronautas : 49.05 [m/(s^2)]
Aceleración del cohete : 41.94 [m/(s^2)]
Velocidad del cohete : 9489.73 [m/s]
Velocidad del cohete (km/h) : 34163 [km/h]
Velocidad de escape : 10183.7 [m/s]
Velocidad de escape (km/h) : 36661.3 [km/h]
Posición del cohete : 7.48513e+006 [m]
Altura del cohete sobre la superficie de la Tierra : 1.10613e+006 [m]
Altura del cohete sobre la superficie de la Tierra (km) : 1106.13 [km]
Distancia del cohete a la superficie de la Luna : 3.47176e+008 [m]
Distancia del cohete a la superficie de la Luna (km) : 347176 [km]

AGOTADO COMBUSTIBLE DE LA TERCERA ETAPA: 107572 [kg]


NOTA: He usado DT con valor 0.001 segundos en lugar de 0.1 segundos.

NOTA: He actualizado el impulso específico de los motores F-1 y J-2 con unos valores un poco más altos que he encontrado en un documento de la NASA. Pongo a continuación los enlaces a los parámetros del motor F-1 y del motor J-2 extraídos de ese documento.

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.