ao-tools: Add ao-fakeflight
[fw/altos] / ao-tools / ao-fakeflight / ao-rocket.c
diff --git a/ao-tools/ao-fakeflight/ao-rocket.c b/ao-tools/ao-fakeflight/ao-rocket.c
new file mode 100644 (file)
index 0000000..18808c6
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright © 2014 Keith Packard <keithp@keithp.com>
+ *
+ * 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; version 2 of the License.
+ *
+ * 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.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "ao-fakeflight.h"
+
+/* Mass (kg) of the airframe */
+double
+rocket_mass(struct flight *f, struct rocket *r)
+{
+       double  time = f->time;
+       double  m = r->empty_mass;
+       int     n;
+
+       for (n = 0; n < MAX_MOTORS; n++) {
+               struct motor *motor = &r->motors[n];
+               if (motor->burn_time) {
+                       double fuel_time_remain = fmin (motor->burn_time, fmax(motor->burn_time - (time - motor->delay), 0.0));
+                       double fuel_fraction = fuel_time_remain / motor->burn_time;
+                       m += fuel_fraction * motor->fuel_mass;
+               }
+       }
+       return m;
+}
+
+/* Force (N) due to thrust */
+double
+rocket_thrust(struct flight *f, struct rocket *r)
+{
+       double  time = f->time;
+       double  thrust = 0.0;
+       int     n;
+
+       for (n = 0; n < MAX_MOTORS; n++) {
+               struct motor *motor = &r->motors[n];
+               if (motor->burn_time) {
+                       if (motor->delay <= time && time < motor->delay + motor->burn_time)
+                               thrust += motor->average_thrust;
+               }
+       }
+       return thrust;
+}
+
+/* Drag (N) due to air resistance */
+double
+rocket_drag(struct flight *f, struct rocket *r)
+{
+       double  pressure = cc_altitude_to_pressure(f->altitude);
+       double  temperature = cc_altitude_to_temperature(f->altitude);
+       double  drag = force_drag(f->speed, density_air(pressure, temperature),
+                         r->models[f->state].cd,
+                         area_circle(r->models[f->state].diameter));
+
+       /* drag operates in opposition to motion through air */
+       if (f->speed >= 0)
+               drag = -drag;
+
+       return drag;
+}
+
+/* Force (N) due to gravity */
+double
+rocket_gravity(struct flight *f, struct rocket *r)
+{
+       double  gravity = force_gravity(rocket_mass (f, r), f->altitude);
+}