diff options
Diffstat (limited to 'ao-tools/ao-fakeflight/ao-rocket.c')
-rw-r--r-- | ao-tools/ao-fakeflight/ao-rocket.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/ao-tools/ao-fakeflight/ao-rocket.c b/ao-tools/ao-fakeflight/ao-rocket.c new file mode 100644 index 00000000..18808c65 --- /dev/null +++ b/ao-tools/ao-fakeflight/ao-rocket.c @@ -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); +} |