Skip to content

Instantly share code, notes, and snippets.

@panchishin
Created May 2, 2019 20:07
Show Gist options
  • Save panchishin/1305209504b7646e05c5f2949e4f4f6d to your computer and use it in GitHub Desktop.
Save panchishin/1305209504b7646e05c5f2949e4f4f6d to your computer and use it in GitHub Desktop.
Aircraft dynamics calculator
<html>
<head><title>Basic Flight Calculator</title>
<body onload="javascript:calculateTopSpeed()">
<h1>FAA Flight Calculator</h1>
<p>Adapted from U.S. Department of Transportation Advisory Circular (AC No. 103-7)<br>
Adapted from Canadian C.A.R.S. #549 Subsection B</p>
<style>
a {
text-decoration: none;
font-weight: bold;
font-variant: small-caps;
}
indent {
margin-left: 2em;
}
table {
margin-left: 0em;
border-width: 3px;
border-color: #a0a0b0;
border-spacing: 0px;
border-style: solid;
font-size: 12;
}
tr:hover {
background-color: #f0f0ff;
}
td input:hover {
background-color: #f0f0ff;
}
td select:hover {
background-color: #f0f0ff;
}
th {
font-weight: bold;
vertical-align: top;
padding: 0.1em;
border-width: 2px;
border-color: #e0e0f0;
border-style: solid;
background-color: #f0fff0;
text-align: left;
}
th input {
background: #f0fff0;
font-size: 12;
}
td input {
font-size: 12;
}
td select {
font-size: 12;
}
td {
vertical-align: top;
padding: 0.1em;
border-width: 2px;
border-color: #e0e0f0;
border-style: solid;
}
.dummy {
padding: 0.5em;
margin-left: 10px;
border-width: 3px;
border-style: solid;
border-color: #e0e0e0;
}
p {
margin-left: 2em;
}
</style>
<form name="topspeed">
<table>
<tr><th colspan="2"><h2>Drag Factor</h2></th><th><a href="javascript:calculateTopSpeed()">Calculate</a></th></tr>
<tr><td>Front Seats (side by side)</td><td>
<select name="pilot" onchange="javascript:calculateTopSpeed()">
<option value="1.2">Not Enclosed - Prone</option>
<option value="4.5">Not Enclosed - Supine</option>
<option value="5.5">Not Enclosed - Seated Upright</option>
<option value="3.5">Partially Enclosed - lower half of body</option>
<option value="2.5">Partially Enclosed - all but head</option>
<option value="2.0">Partially Enclosed - all</option>
<option value="1.5" selected>Totally Enclosed - Streamlined Fuselage</option>
<option value="2.0">Totally Enclosed - Boxy Fuselage</option>
</select>
</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="numpilot" value="1">(#)</td></tr>
<tr><td colspan="2">Wing size</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="wing" value="177">(sq. ft.)</td></tr>
<tr><td colspan="2">Stabilizing & Control Surface</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="stabilizing" value="40">(sq. ft.)</td></tr>
<tr><td colspan="2">Exposed Wire (45 to 90 deg to airflow)</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="wire">(ft.)</td></tr>
<tr><td>Exposed Struts, not landing gear (45 to 90 deg to airflow)</td><td>number over 4 ft.long x 0.4</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="struts" value="4">(#)</td></tr>
<tr><td>Landing Gear</td><td>
<select name="landingGearType" onchange="javascript:calculateTopSpeed()">
<option value="0.5" selected>Unfaired (Exposed)</option>
<option value="0.3">Faired (Covered)</option>
<option value="0.0">Retractable</option>
</select>
</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="landingGear" value="3">(#)</td></tr>
<tr><td>Engine Drag Factor</td><td>
<select name="engine" onchange="javascript:calculateTopSpeed()">
<option value="2.5">Completely Exposed</option>
<option value="1.5" selected>Partially Exposed</option>
<option value="0.5">Minimally Exposed</option>
<option value="0.0">No Engine (Glider)</option>
</select>
</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="numengine" value="1">(#)</td></tr>
<tr><th colspan="2">Subtotal Drag</th><th><span id="subtotal"> undef </span></th></tr>
<tr><th>Induced Drag</th><th>(20% of subtotal)</th><th><span id="induced"> undef </span></th></tr>
<tr><th colspan="2">Total Drag</th><th><span id="total"> undef </span></th></tr>
<tr><th colspan="2"><h2>Weight and Power</h2></th><th><a href="javascript:calculateTopSpeed()">Calculate</a></th></tr>
<tr><td>Engine(s)</td><td>Total Horsepower</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name=power value="49">(hp)</td></tr>
<tr><td>Passengers</td><td>(170 lbs each)</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="passengers" value="1">(#)</td></tr>
<tr><td colspan="2">Maximum Empty Mass (see CARS 549.107)</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="maxemptyweight" value="300">(lbs.)</td></tr>
<tr><td colspan="2">Cargo</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="cargo" value="50">(lbs.)</td></tr>
<tr><th>Gross Weight (see CARS 549.103 b)</th><th>maximum of 3,968 lbs</th><th><span id="weight"> undef </span> (lbs.)</th></tr>
<tr><th>Wing Loading (see CARS 549.103 b)</th><th>maximum of 13.3 lbs / sq. ft.</th><th><span id="wingload"> undef </span> (lbs. / sq ft.)</th></tr>
<tr><td colspan=2>Wing Span</td><td><input type=text size=5 onchange="javascript:calculateTopSpeed()" align=right name="wingspan" value="31">(ft.)</td></tr>
<tr><th colspan="2">Span Load</th><th><span id="spanload"> undef </span> (lbs. / ft.)</th></tr>
<tr><th colspan="2">Mean Aerodynamic Cord (MAC)</th><th><span id="mac"> undef </span> (ft.)</th></tr>
<tr><th colspan="2">Aspect Ratio</th><th><span id="aspect"> undef </span></th></tr>
<tr><th colspan="2">Minimum Engine Power (see CARS 549.109)</th><th><span id="minimumHP"> undef </span> (hp)</th></tr>
<tr><th colspan="2"><h2>Performance</h2></th><th><a href="javascript:calculateTopSpeed()">Calculate</a></th></tr>
<tr><td>Wing Profile</td><td colspan=2>
<select name="wingprofile" onchange="javascript:calculateTopSpeed()">
<option value="1.4">Less than 7 degrees Camber and no flaps</option>
<option value="1.6" selected>Double surface or flaps</option>
<option value="1.8">Double surface with more than 7 degrees Camber or flap</option>
<option value="2.0">Double surface with more than 50% extra flap surface</option>
</select>
</td></tr>
<tr><th colspan="2">Maximum Cruise vs Stall Speed</th><th><span id="maxknots"> undef </span> vs. <span id="stallknots"> undef </span> (Knots)</th></tr>
<tr><th colspan="2">Maximum Cruise vs Stall Speed</th><th><span id="maxmph"> undef </span> vs. <span id="stallmph"> undef </span> (Mph)</th></tr>
<tr><th colspan="2">Maximum Cruise vs Stall Speed</th><th><span id="maxkmph"> undef </span> vs. <span id="stallkmph"> undef </span> (Km/h)</th></tr>
<tr><th><h2>Some Prefetched Configurations</h2></th><th colspan="2">
<a href="javascript:restore('pilot,2.0,numpilot,1,wing,177,stabilizing,40,wire,,struts,4,landingGearType,0.5,landingGear,3,engine,1.5,numengine,1,power,49,passengers,1,maxemptyweight,300,cargo,50,wingspan,31,wingprofile,1.6,')">Challenger</a> ---
<a href="javascript:restore('pilot,1.2,numpilot,1,wing,70,stabilizing,25,wire,,struts,,landingGearType,0.5,landingGear,3,engine,0.0,numengine,0,power,0,passengers,0,maxemptyweight,155,cargo,0,wingspan,36,wingprofile,1.6,')">SparrowHawk</a> ---
<a href="javascript:restore('pilot,1.2,numpilot,1,wing,80,stabilizing,25,wire,,struts,,landingGearType,0.5,landingGear,3,engine,0.5,numengine,1,power,49,passengers,0,maxemptyweight,250,cargo,25,wingspan,26,wingprofile,1.8,')">One Seaterr</a> ---
<a href="javascript:restore('pilot,1.5,numpilot,2,wing,200,stabilizing,40,wire,,struts,4,landingGearType,0.5,landingGear,3,engine,0.5,numengine,1,power,49,passengers,3,maxemptyweight,350,cargo,150,wingspan,35,wingprofile,1.8,')">4 Seaterr</a>
</th></tr>
<tr><th colspan="3"><h2>Save Settings</h2>Copy the following input field and paste it in at a later time to restore your input values, or put in in the query line of the URL</th></tr>
<tr><th colspan="2"><input type=text size=100 onchange="javascript:restore(document.topspeed.savestring.value)" align=right name="savestring"></th><th><a href="javascript:restore(document.topspeed.savestring.value)">Load Info</a></th></tr>
</table>
</form>
<script>
restore( location.search.substring(1) );
function restore( string ) {
var olditems = document.topspeed.elements;
var newitems = string.split(",");
var index;
for( index = 0 ; index < newitems.length - 1; index += 2 ) {
if ( olditems[ newitems[index] ] != null ) {
olditems[ newitems[index] ].value = newitems[index + 1];
}
}
calculateTopSpeed();
}
function save() {
var items = document.topspeed.elements;
var result = "";
for( index in items ) {
if ( items[index] != null && items[index].name != null && items[index].value != null ) {
if ( typeof items[index].value != "undefined" && items[index].name != "savestring" ) {
result += items[index].name + "," + items[index].value + "," ;
}
}
}
document.topspeed.savestring.value = result;
}
function calculateTopSpeed() {
var myform = document.topspeed;
var subtotal = 0.0;
subtotal += 1.0 * myform.pilot.value * myform.numpilot.value;
subtotal += 0.01 * myform.wing.value;
subtotal += 0.014 * myform.stabilizing.value;
subtotal += 0.05 * myform.wire.value;
subtotal += 0.4 * myform.struts.value;
subtotal += 1.0 * myform.landingGearType.value * myform.landingGear.value;
subtotal += 1.0 * myform.engine.value * myform.numengine.value;
set("subtotal",myround(subtotal));
set("induced",myround(subtotal * 0.2));
var total = subtotal * 1.2;
set("total",myround(total));
var weight = 1.0 * myform.maxemptyweight.value + 1.0 * myform.cargo.value + ( 175 + 175 * myform.passengers.value + 0.5 * myform.power.value );
set("weight",Math.round(weight));
var wingload = weight / myform.wing.value;
set("wingload",myround(wingload));
set("spanload",myround(( 1.0 * weight ) / ( 1.0 * myform.wingspan.value )));
var mac = ( 1.0 * myform.wing.value ) / ( 1.0 * myform.wingspan.value );
set("mac",myround(mac));
set("aspect",myround(( 1.0 * myform.wingspan.value ) / ( 1.0 * mac )));
set("minimumHP",myround( 0.016 * weight + Math.pow( weight , 3/2 ) * 0.018 / myform.wingspan.value));
var knots;
knots = Math.sqrt( 1000.0 * myform.power.value / ( total * 1.2 ) );
set("maxknots",Math.round( knots ));
set("maxmph",Math.round( knots / 0.868976242));
set("maxkmph",Math.round( knots / 0.868976242 * 1.609344));
knots = Math.pow( wingload / myform.wingprofile.value , 0.5 ) * 17.25;
set("stallknots",Math.round( knots ));
set("stallmph",Math.round( knots / 0.868976242));
set("stallkmph",Math.round( knots / 0.868976242 * 1.609344));
save();
refresh();
}
function myround( value ) {
return Math.round( value * 100 ) / 100;
}
function set( name , value ) {
document.getElementById(name).firstChild.nodeValue = value;
}
</script>
</body>
</table>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment