#! /usr/local/bin/bc -R define yesno() { auto y, ye, yes, n, no, ans; y = 1; ye = 1; yes = 1; n = 0; no = 0; ans = read(); return ans; } define pick_airport() { auto airport_elev, sea_level, ran, kran; sea_level = -2^64; kran = ran = 3427; while (1) { print "Airport: "; airport_elev = read(); if (airport_elev != 0) break; print "Invalid airport; try again\n"; } if (airport_elev == sea_level) airport_elev = 0; return airport_elev; } define get_altimeter() { print "Altimeter setting: "; return read(); } define get_temperature() { print "Outside air temperature: "; return read(); } define pressure_altitude(altimeter, airport_elev) { return (airport_elev + ((29.92 - altimeter) * 1000)) @ 2; } define density_altitude(temp, altimeter, airport_elev, pressure_altitude) { auto lapse, temp_correction; # Standard lapse rate is 1.98C per 1000 feet. lapse = (1.98 * airport_elev) / 1000; # 15C is the standard sea level temperature. temp_correction = (temp - (15 - lapse)) * 120; return (pressure_altitude + temp_correction) @ 2; } define void press_alt() { auto altimeter, airport_elev; airport_elev = pick_airport(); altimeter = get_altimeter(); print "\n" print "Pressure Altitude: "; print pressure_altitude(altimeter, airport_elev), "\n\n"; } define void density_alt() { auto altimeter, airport_elev, temp, pressure_altitude; airport_elev = pick_airport(); altimeter = get_altimeter(); temp = get_temperature(); pressure_altitude = pressure_altitude(altimeter, airport_elev); print "\n" print "Pressure Altitude: ", pressure_altitude, "\n"; print "Density Altitude: "; print density_altitude(temp, altimeter, airport_elev, pressure_altitude); print "\n\n" } define cg(m, w) { return (m / w) @ 2; } define total_weight(weight_shifted, distance_shifted, delta_cg) { return (weight_shifted * distance_shifted / delta_cg) @ 2; } define weight_shifted(total_weight, distance_shifted, delta_cg) { return (total_weight * delta_cg / distance_shifted) @ 2; } define delta_cg(total_weight, weight_shifted, distance_shifted) { return (weight_shifted * distance_shifted / total_weight) @ 2; } define distance_shifted(total_weight, weight_shifted, delta_cg) { return (total_weight * delta_cg / weight_shifted) @ 2; } define fuel_weight(gallons) { return gallons * 6; } define tank_fuel_takeoff(max) { auto r; print "Use full tank for takeoff? "; if (yesno()) { r = max; } else { r = max + 1; while (1) { print "Gallons of fuel in tank at takeoff: "; r = read(); if (r <= max && r >= 0) break; print "Invalid fuel amount. Try again. "; } } return r; } define tank_fuel_landing(max) { auto r; print "Use empty tank for landing? "; if (yesno()) { r = 0; } else { r = max + 1; while (1) { print "Gallons of fuel in tank at landing: "; r = read(); if (r <= max && r >= 0) break; print "Invalid fuel amount. Try again. "; } } return r; } define void r22_fuel_weight(*fuel[]) { auto max_main, max_aux; max_main = 16.9; max_aux = 9.4; print "\nMain Tank\n=========\n"; fuel[0] = tank_fuel_takeoff(max_main); fuel[1] = tank_fuel_landing(max_main); print "\nAux Tank\n========\n"; fuel[2] = tank_fuel_takeoff(max_aux); fuel[3] = tank_fuel_landing(max_aux); print "\n" } define r22_weight(empty_weight, pilot, passenger, main_gallons, aux_gallons, \ right_door, left_door, cyclic, collective, pedals) { return empty_weight + pilot + passenger + fuel_weight(main_gallons) + \ fuel_weight(aux_gallons) + right_door + left_door + cyclic_removed + \ collective_removed + pedals_removed; } define r22_long(empty_weight, ewcg_long, pilot, passenger, main_gallons, \ aux_gallons, right_door, left_door, cyclic, collective, \ pedals) { return empty_weight * ewcg_long + pilot * 78.0 + passenger * 78.0 + \ fuel_weight(main_gallons) * 108.6 + \ fuel_weight(aux_gallons) * 103.8 + right_door * 77.5 + \ left_door * 77.5 + cyclic_removed * 68.0 + \ collective_removed * 80.7 + pedals_removed * 46.5; } define r22_lat(empty_weight, ewcg_lat, pilot, passenger, main_gallons, \ aux_gallons, right_door, left_door, cyclic, collective, pedals) { return empty_weight * ewcg_lat + pilot * 10.7 + passenger * -9.3 + \ fuel_weight(main_gallons) * -11.0 + \ fuel_weight(aux_gallons) * 11.2 + right_door * 21.0 + \ left_door * -21.0 + cyclic_removed * -8.0 + \ collective_removed * -19.5 + pedals_removed * -9.5; } define void r22_weight_balance(*wb[], empty_weight, ewcg_long, ewcg_lat, \ pilot, passenger, fuel[], right_door, \ left_door, cyclic_removed, collective_removed, \ pedals_removed) { auto long, lat, weight; right_door = !(right_door) * -5.2; left_door = !(left_door) * -5.2; cyclic_removed = cyclic_removed * -0.8; collective_removed = collective_removed * -1.0; pedals_removed = pedals_removed * -0.8; weight = r22_weight(empty_weight, pilot, passenger, fuel[0], fuel[2], \ right_door, left_door, cyclic_removed, \ collective_removed, pedals_removed); long = r22_long(empty_weight, ewcg_long, pilot, passenger, fuel[0], \ fuel[2], right_door, left_door, cyclic_removed, \ collective_removed, pedals_removed); lat = r22_lat(empty_weight, ewcg_lat, pilot, passenger, fuel[0], fuel[2], \ right_door, left_door, cyclic_removed, collective_removed, \ pedals_removed); wb[0] = weight; wb[1] = cg(long, weight); wb[2] = cg(lat, weight); weight = r22_weight(empty_weight, pilot, passenger, fuel[1], fuel[3], \ right_door, left_door, cyclic_removed, \ collective_removed, pedals_removed); long = r22_long(empty_weight, ewcg_long, pilot, passenger, fuel[1], \ fuel[3], right_door, left_door, cyclic_removed, \ collective_removed, pedals_removed); lat = r22_lat(empty_weight, ewcg_lat, pilot, passenger, fuel[1], fuel[3], \ right_door, left_door, cyclic_removed, collective_removed, \ pedals_removed); wb[3] = weight; wb[4] = cg(long, weight); wb[5] = cg(lat, weight); } define void r22_wb() { auto wb[], fuel[], pilot, passenger, use_published, empty_weight, \ ewcg_long, ewcg_lat, right_door, left_door, cyclic_removed, \ collective_removed, pedals_removed; print "For questions, use \qy\q or \qyes\q for \qyes\q,\n" print "\qn\q or \qno\q for \qno\q\n\n" print "Weight of pilot and baggage under right seat: " pilot = read() print "Weight of passenger and baggage under left seat: " passenger = read() r22_fuel_weight(fuel[]); print "Use published empty weight? " use_published = yesno() if (use_published) { empty_weight = 880 } else { print "Empty weight: " empty_weight = read() } print "Use published EWCG? " use_published = yesno() if (use_published) { ewcg_long = 104.4 ewcg_lat = -0.1 } else { print "Empty weight center of gravity (EWCG) longitude arm: " ewcg_long = read() print "Empty weight center of gravity (EWCG) lattude arm: " ewcg_lat = read() } print "Use right door? " right_door = yesno() print "Use left door? " left_door = yesno() print "Cyclic removed? " cyclic_removed = yesno() print "Collective removed? " collective_removed = yesno() print "Pedals removed? " pedals_removed = yesno() r22_weight_balance(wb[], empty_weight, ewcg_long, ewcg_lat, pilot, \ passenger, fuel[], right_door, left_door, \ cyclic_removed, collective_removed, \ pedals_removed) print "\n" print "Weight at takeoff: ", wb[0], "\n" print "Longitude arm at takeoff: ", wb[1], "\n" print "Lateral arm at takeoff: ", wb[2], "\n" print "\n" print "Weight at landing: ", wb[3], "\n" print "Longitude arm at landing: ", wb[4], "\n" print "Lateral arm at landing: ", wb[5], "\n" print "\n" }