// Original Author: Ilan Kroo <kroo@leland.stanford.edu> December 31st, 1995.
// <http://aero.stanford.edu/adg.html> Aircraft Aerodynamics and Design Group.
//
// Slightly Modified by Sebastien Dartevelle <sebastien@volcanoes.com> June 13th, 2001.
// <http://www.granular-volcano-group.org> Granular Volcano Group.
//
//Please, email-me, if you wanna copy this code <sebastien@granular-volcano-group.org>
//I have no problem to share but simply ask before!
//
//
<!--Standard Atmosphere Calculator
function setEUnits() {
   var str = document.forms[1].hunits.value;
   if ( str== "ft") {
            alert("Already in English Units.");
            return;
   }
   document.forms[1].hunits.value = "ft"
   document.forms[1].vunits.value = "ft/s"
   document.forms[1].lunits.value = "ft"
   document.forms[2].tunits.value = "deg R"
   document.forms[2].runits.value = "sl/ft^3"
   document.forms[2].punits.value = "lb/ft^2"
   document.forms[2].sunits.value = "ft/s"
   document.forms[2].muunits.value = "lb s/ft^2"
   document.forms[2].qunits.value = "lb/ft^2"

   var h = eval(document.forms[1].alt.value);
   var v = eval(document.forms[1].speed.value);
   var rl = eval(document.forms[1].rlength.value);
   var tempVal = eval(document.forms[2].temp.value);
   var rhoVal =  eval(document.forms[2].rho.value);
   var pVal  = eval(document.forms[2].press.value);
   var soundVal  = eval(document.forms[2].ssound.value);
   var viscVal =  eval(document.forms[2].visc.value);
   var machVal = eval(document.forms[2].mach.value);
   var  qVal  = eval(document.forms[2].q.value);
   var cpstarVal  = eval(document.forms[2].cpstar.value);
   var  cpminVal  = eval(document.forms[2].cpmin.value);
   var reynolds =  eval(document.forms[2].reno.value);
   var  cflam  = eval(document.forms[2].cfl.value);
   var cfturb  =  eval(document.forms[2].cft.value);

   document.forms[1].alt.value = h*3.2808
   document.forms[1].speed.value = v*3.2808
   document.forms[1].rlength.value = rl*3.2808

   document.forms[2].temp.value =tempVal*1.8
   document.forms[2].rho.value = rhoVal * .068521  * .028317
   document.forms[2].press.value = pVal * .020885

   document.forms[2].ssound.value = soundVal*3.2808
   document.forms[2].visc.value = viscVal*.22481*.092903
   document.forms[2].mach.value = machVal
   document.forms[2].q.value = qVal * .020885
   document.forms[2].cpstar.value = cpstarVal
   document.forms[2].cpmin.value = cpminVal

   document.forms[2].reno.value = reynolds
   document.forms[2].cfl.value = cflam
   document.forms[2].cft.value = cfturb

   roundAll();
}

function setMUnits() {
   var str = document.forms[1].hunits.value;
   if ( str== "m") {
       alert("Already in metric units.");
       return;
   }

   Compute();

   document.forms[1].hunits.value = "m"
   document.forms[1].vunits.value = "m/s"
   document.forms[1].lunits.value = "m"
   document.forms[2].tunits.value = "deg K"
   document.forms[2].runits.value = "kg/m^3"
   document.forms[2].punits.value = "N/m^2"
   document.forms[2].sunits.value = "m/s"
   document.forms[2].muunits.value = "N s/m^2"
   document.forms[2].qunits.value = "N/m^2"

   var h = eval(document.forms[1].alt.value);
   var v = eval(document.forms[1].speed.value);
   var rl = eval(document.forms[1].rlength.value);
   var tempVal = eval(document.forms[2].temp.value);
   var rhoVal = eval(document.forms[2].rho.value);
   var pVal  = eval(document.forms[2].press.value);
   var soundVal  = eval(document.forms[2].ssound.value);
   var viscVal = eval(document.forms[2].visc.value);
   var machVal = eval(document.forms[2].mach.value);
   var  qVal  = eval(document.forms[2].q.value);
   var cpstarVal  = eval(document.forms[2].cpstar.value);
   var  cpminVal  = eval(document.forms[2].cpmin.value);
   var reynolds = eval(document.forms[2].reno.value);
   var  cflam  = eval(document.forms[2].cfl.value);
   var cfturb  = eval(document.forms[2].cft.value);

   document.forms[1].alt.value = h/3.2808
   document.forms[1].speed.value = v/3.2808
   document.forms[1].rlength.value = rl/3.2808

   document.forms[2].temp.value =tempVal/1.8
   document.forms[2].rho.value = rhoVal / .068521  / .028317
   document.forms[2].press.value = pVal / .020885

   document.forms[2].ssound.value = soundVal/3.2808
   document.forms[2].visc.value = viscVal/.22481/.092903
   document.forms[2].mach.value = machVal
   document.forms[2].q.value = qVal / .020885
   document.forms[2].cpstar.value = cpstarVal
   document.forms[2].cpmin.value = cpminVal

   document.forms[2].reno.value = reynolds
   document.forms[2].cfl.value = cflam
   document.forms[2].cft.value = cfturb

   roundAll();
}

function ResetForm() {
   document.forms[1].alt.value = "0.0"
   document.forms[1].speed.value = "1.0"
   document.forms[1].rlength.value = "1.0"
}

function Compute() {

   // First set to English Units
   var origUnits = "english";
   var str = document.forms[1].hunits.value;
   if ( str== "m") {
            origUnits = "metric";
            setEUnits();
   }
   var h = eval(document.forms[1].alt.value);
   var v = eval(document.forms[1].speed.value);
   var rl = eval(document.forms[1].rlength.value);


//values on the ground, altitude zero meter, sea level
//Temperature = 288.15K
//air density = 1.225 kg/m^3
//atmospheric Pressure = 101327.27 Pa = 1.01E+5 Pa


   var TEMPSL = 518.67;
   var RHOSL = 0.00237689;
   var PRESSSL = 2116.22;
   var saTheta = 1.0;
   var saSigma = 1.0;
   var saDelta = 1.0;

//altitude in feet, way above stratosphere, 51000<h<71000
   if ( h<232940 ){
      saTheta = 1.434843 - h/337634;
      saSigma = Math.pow( 0.79899-h/606330, 11.20114 );
      saDelta = Math.pow( 0.838263-h/577922, 12.20114 );
   }
//altitude in feet, way above stratosphere, 47000<h<51000
   if ( h<167323 ){
      saTheta = 0.939268;
      saSigma = 0.00116533 * Math.exp( (h-154200)/-25992 );
      saDelta = 0.00109456 * Math.exp( (h-154200)/-25992 );
   }
//altitude in feet, stratosphere continuing, 32000m<h<46999m
   if ( h<154199 ){
      saTheta = 0.482561 + h/337634;
      saSigma = Math.pow( 0.857003+h/190115, -13.20114 );
      saDelta = Math.pow( 0.898309+h/181373, -12.20114 );
   }
//atltidue in feet, end tropopause, start of stratosphere, 20000m<h<32000m
   if ( h<104987 ){
      saTheta = 0.682457 + h/945374;
      saSigma = Math.pow( 0.978261+h/659515, -35.16319 );
      saDelta = Math.pow( 0.988626+h/652600, -34.16319 );
   }
//altitude in feet, tropopause, 11000m<h<20000m
   if ( h<65617 ){
      saTheta = 0.751865;
      saSigma = 0.297076 * Math.exp( (36089-h)/20806 );
      saDelta = 0.223361 * Math.exp( (36089-h)/20806 );
   }
//altitude in feet, troposphere < 11000m
   if ( h<36089 ){
      saTheta = 1.0 - h/145442;
      saSigma = Math.pow( 1.0-h/145442, 4.255876 );
      saDelta = Math.pow( 1.0-h/145442, 5.255876 );
   }

   var tempVal = TEMPSL * saTheta;
   var rhoVal = RHOSL * saSigma;
   var pVal = PRESSSL * saDelta;
   var viscVal = 0.0226968*Math.pow( tempVal, 1.5 ) / ((tempVal)+198.72) / 1000000.0;
   var soundVal = Math.sqrt( 1.4*1716.56*(tempVal) );

   var machVal = v/soundVal
   var qVal = 0.7*pVal*machVal*machVal
   var reynolds = v*rl*rhoVal/viscVal
   var cfturb = 0.455/Math.pow((Math.log(reynolds)/Math.log(10)),2.58)
   var cflam = 1.328/Math.sqrt(reynolds)

   document.forms[2].temp.value = tempVal
   document.forms[2].rho.value =  rhoVal
   document.forms[2].press.value =  pVal

   document.forms[2].ssound.value =  soundVal
   document.forms[2].visc.value =  viscVal
   document.forms[2].mach.value =  machVal
   document.forms[2].q.value =  qVal
   document.forms[2].cpstar.value =  (Math.pow((1/1.2 + machVal*machVal/6.0),3.5)-1)/(0.7*machVal*machVal)
   document.forms[2].cpmin.value =  -1.0/(0.7*machVal*machVal)

   document.forms[2].reno.value = reynolds
   document.forms[2].cfl.value = cflam
   document.forms[2].cft.value = cfturb

   if (origUnits == "metric") {
       setMUnits();          
   }

   roundAll();

}

// Rounding

function roundAll(){

   document.forms[1].alt.value = truncNum(document.forms[1].alt.value,9)
   document.forms[1].speed.value = truncNum(document.forms[1].speed.value,7)
   document.forms[1].rlength.value = truncNum(document.forms[1].rlength.value,7)

   document.forms[2].temp.value =truncNum(document.forms[2].temp.value,10)
   document.forms[2].rho.value = truncNum(document.forms[2].rho.value,10)
   document.forms[2].press.value = truncNum(document.forms[2].press.value,10)

   document.forms[2].ssound.value = truncNum(document.forms[2].ssound.value ,8)
   document.forms[2].visc.value = truncNum(document.forms[2].visc.value,10)
   document.forms[2].mach.value = truncNum(document.forms[2].mach.value,6)
   document.forms[2].q.value = truncNum(document.forms[2].q.value,7)
   document.forms[2].cpstar.value = truncNum(document.forms[2].cpstar.value,6)
   document.forms[2].cpmin.value = truncNum(document.forms[2].cpmin.value,6)

   document.forms[2].reno.value = truncNum(document.forms[2].reno.value,9)
   document.forms[2].cfl.value = truncNum(document.forms[2].cfl.value,7)
   document.forms[2].cft.value = truncNum(document.forms[2].cft.value,7)
   return;
}

function truncNum(inputVal, rsize) {
   var instr = " " + inputVal
   var inputlength = instr.length
   if (inputlength<=rsize+1) return instr.substring(1, inputlength);
   var epos = strpos(instr, "e")
   if ( epos > rsize+1) {
     var instr1 = instr.substring(1,rsize+1) + instr.substring(epos,inputlength);
     return instr1;
   }
   var rounded = instr.substring(1, rsize+1);
   return rounded;
}

function strpos(str, ch) {
   for (var i = 0; i < str.length; i++)
      if (str.substring(i, i+1) == ch) return i;
   return -1;
}
// end Computational Atmosphere -->
