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.

156 lines
6.0 KiB

  1. /* Liquid rocket design */
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include "libcpropep/include/print.h"
  6. #include "libcpropep/include/type.h"
  7. #include "libthermo/include/thermo.h"
  8. #include "libcpropep/include/conversion.h"
  9. #include "liblrd/include/lrd.h"
  10. #ifndef M_PI
  11. #define M_PI 3.14159265358979323846
  12. #endif
  13. int LRD_compute_caracteristics(equilibrium_t *e, design_param_t *d, motor_t *m,
  14. liquid_propellant_t *p)
  15. {
  16. equilibrium_t *throat, *exit;
  17. throat = e + 1;
  18. exit = e + 2;
  19. m->mass_flow_rate = d->thrust / exit->performance.Isp;
  20. m->fu_flow_rate = m->mass_flow_rate / (p->o_f_ratio + 1);
  21. m->ox_flow_rate = m->mass_flow_rate - m->fu_flow_rate;
  22. m->throat_area = m->mass_flow_rate * throat->performance.a_dotm
  23. / ATM_TO_PA;
  24. m->throat_diameter = 2 * sqrt(m->throat_area / M_PI);
  25. m->throat_radius = m->throat_diameter/2;
  26. m->exit_area = m->throat_area * exit->performance.ae_at;
  27. m->exit_diameter = 2 * sqrt(m->exit_area / M_PI);
  28. m->exit_radius = m->exit_diameter/2;
  29. m->Ac_At = pow(d->Dc_Dt, 2);
  30. m->chamber_volume = d->Lstar * m->throat_area;
  31. m->chamber_diameter = d->Dc_Dt * m->throat_diameter;
  32. m->chamber_radius = m->chamber_diameter/2;
  33. m->chamber_area = M_PI * pow(m->chamber_radius, 2);
  34. m->convergent_length = (m->throat_radius*(sqrt(m->Ac_At) - 1) +
  35. d->R_Rt*m->throat_radius*
  36. (pow(cos(d->theta*M_PI/180),-1) -1))
  37. /tan(d->theta*M_PI/180);
  38. /* m->convergent_volume = (M_PI/3)*m->convergent_length*
  39. (pow(m->chamber_radius, 2)+pow(m->throat_radius, 2)+
  40. m->chamber_radius*m->throat_radius); */
  41. m->convergent_volume = (1/3) * m->throat_area *sqrt(m->throat_area/M_PI) *
  42. pow(tan(d->theta*M_PI/180), -1)*(pow(m->Ac_At, 1/3) - 1);
  43. /*
  44. m->convergent_length = d->R_Rt*m->throat_radius*sin(d->theta*M_PI/180) +
  45. (m->chamber_radius - d->R_Rt*m->throat_radius*(cos(d->theta*M_PI/180)-1)
  46. - m->throat_radius)/tan(d->theta*M_PI/180);
  47. */
  48. m->cylinder_volume = m->chamber_volume - m->convergent_volume;
  49. m->cylinder_length = m->cylinder_volume / m->chamber_area;
  50. m->chamber_length = m->cylinder_length + m->convergent_length;
  51. m->walls_area = 2*m->chamber_length*sqrt(M_PI*m->Ac_At*m->throat_area)
  52. + pow(sin(d->theta), -1)*(m->Ac_At - 1)*m->throat_area;
  53. return 0;
  54. }
  55. int LRD_print_propellant_info(liquid_propellant_t *p)
  56. {
  57. printf("Propellant\n");
  58. printf("----------\n");
  59. printf("Fuel : %s\n", PROPELLANT_NAME(p->fuel));
  60. printf("Oxidant : %s\n", PROPELLANT_NAME(p->oxidant));
  61. printf("O/F ratio : %.2f\n\n", p->o_f_ratio);
  62. return 0;
  63. }
  64. int LRD_print_design_criteria(design_param_t *c)
  65. {
  66. printf("Design criteria\n");
  67. printf("---------------\n");
  68. printf("Chamber pressure (atm) (psi) : % 11.4f % 11.4f\n",
  69. c->chamber_pressure, c->chamber_pressure * ATM_TO_PSI);
  70. printf("Thrust (N) (lbf) : % 11.4e % 11.4e\n",
  71. c->thrust, c->thrust * N_TO_LBF);
  72. printf("L* (m) (in) : % 11.4f % 11.4f\n",
  73. c->Lstar, c->Lstar * M_TO_IN);
  74. printf("Chamber to throat diameter : % 11.4f\n",
  75. c->Dc_Dt);
  76. printf("R/Rt : % 11.4f\n",
  77. c->R_Rt);
  78. printf("Convergent half angle (deg) : % 11.4f\n", c->theta);
  79. printf("\n");
  80. return 0;
  81. }
  82. int LRD_print_design_information(motor_t *mf, motor_t *ms)
  83. {
  84. printf("\n");
  85. printf(" "
  86. "frozen | shifting\n");
  87. printf("Mass flow rate (kg/s) (lb/s) : %8.4e %8.4e | %8.4e %8.4e\n",
  88. mf->mass_flow_rate, mf->mass_flow_rate * KG_S_TO_LB_S,
  89. ms->mass_flow_rate, ms->mass_flow_rate * KG_S_TO_LB_S);
  90. printf("Fuel flow rate (kg/s) (lb/s) : %8.4e %8.4e | %8.4e %8.4e\n",
  91. mf->fu_flow_rate, mf->fu_flow_rate * KG_S_TO_LB_S,
  92. ms->fu_flow_rate, ms->fu_flow_rate * KG_S_TO_LB_S);
  93. printf("Oxidant flow rate (kg/s) (lb/s) : %8.4e %8.4e | %8.4e %8.4e\n",
  94. mf->ox_flow_rate, mf->ox_flow_rate * KG_S_TO_LB_S,
  95. ms->ox_flow_rate, ms->ox_flow_rate * KG_S_TO_LB_S);
  96. printf("Throat area (m^2) (in^2) : %8.4e %8.4e | %8.4e %8.4e\n",
  97. mf->throat_area, mf->throat_area * M2_TO_IN2,
  98. ms->throat_area, ms->throat_area * M2_TO_IN2);
  99. printf("Throat diameter (m) (in) : %8.4e %8.4e | %8.4e %8.4e\n",
  100. mf->throat_diameter, mf->throat_diameter * M_TO_IN,
  101. ms->throat_diameter, ms->throat_diameter * M_TO_IN);
  102. printf("Exit area (m^2) (in^2) : %8.4e %8.4e | %8.4e %8.4e\n",
  103. mf->exit_area, mf->exit_area * M2_TO_IN2,
  104. ms->exit_area, ms->exit_area * M2_TO_IN2);
  105. printf("Exit diameter (m) (in) : %8.4e %8.4e | %8.4e %8.4e\n",
  106. mf->exit_diameter, mf->exit_diameter * M_TO_IN,
  107. ms->exit_diameter, ms->exit_diameter * M_TO_IN);
  108. printf("Chamber volume (m^3) (in^3) : %8.4e %8.4e | %8.4e %8.4e\n",
  109. mf->chamber_volume, mf->chamber_volume * M3_TO_IN3,
  110. ms->chamber_volume, ms->chamber_volume * M3_TO_IN3);
  111. printf("Chamber diameter (m) (in) : %8.4e %8.4e | %8.4e %8.4e\n",
  112. mf->chamber_diameter, mf->chamber_diameter * M_TO_IN,
  113. ms->chamber_diameter, ms->chamber_diameter * M_TO_IN);
  114. printf("Chamber length (m) (in) : %8.4e %8.4e | %8.4e %8.4e\n",
  115. mf->chamber_length, mf->chamber_length * M_TO_IN,
  116. ms->chamber_length, ms->chamber_length * M_TO_IN);
  117. printf("Convergent length (m) (in) : %8.4e %8.4e | %8.4e %8.4e\n",
  118. mf->convergent_length, mf->convergent_length * M_TO_IN,
  119. ms->convergent_length, ms->convergent_length * M_TO_IN);
  120. printf("Cylinder length (m) (in) : %8.4e %8.4e | %8.4e %8.4e\n",
  121. mf->cylinder_length, mf->cylinder_length * M_TO_IN,
  122. ms->cylinder_length, ms->cylinder_length * M_TO_IN);
  123. printf("Chamber walls area (m^2) (in^2) : %8.4e %8.4e | %8.4e %8.4e\n",
  124. mf->walls_area, mf->walls_area * M2_TO_IN2,
  125. ms->walls_area, ms->walls_area * M2_TO_IN2);
  126. return 0;
  127. }