Created
May 2, 2019 20:07
-
-
Save panchishin/1305209504b7646e05c5f2949e4f4f6d to your computer and use it in GitHub Desktop.
Aircraft dynamics calculator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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