/* LIB Peter Rauch */
/* eine Weiterentwicklung und Anpassung der Berechnung der Luftfeuchtigkeit von Ernst Schmidt MTEC Technology Software */

var PMIN = 0.01;
var PMAX = 20;
var TMIN = -20;
var TMAX = 100;

function Clear(form)
 {
  form.x.value = '';
  form.tTau.value = '';
  form.h.value = '';
  form.pS.value = '';
  return;
 }

function BerechneForm(form)
 {
  if (form.t.value.length == 0 || form.p.value.length == 0)
   {
    return;
   }
  var t = parseFloat(form.t.value);
  var p = parseFloat(form.p.value);
  if(t < TMIN)
   {
    alert('t < ' + TMIN + ' °C');
    return;
   }
  if(p < PMIN)
   {
    alert('t < ' + PMIN + ' bar');
    return;
   }
  if(t > TMAX)
   {
    alert('t > ' + TMAX + ' °C');
    return;
   }
  if(p > PMAX)
   {
    alert('t > ' + PMAX + ' bar');
    return;
   }
  Clear(form);
  var pS = SattdampfDruckWasser(t);
  form.pS.value = Aufrunden(pS, 5);
  form.x.value = Aufrunden(AbsFeuchte(form, pS), 5);
  form.h.value = Aufrunden(EnthalpieLuft(t, AbsFeuchte(form, pS)), 1);

  var tTau = '';
  var x = AbsFeuchte(form, pS);
  if(x > 0)
   tTau = Sattdampftemperatur(SattdampfFunktion(x,p));
  if(x > 0 && tTau > 0)
   form.tTau.value = Aufrunden(tTau, 1);
  else
   tTau = '';
  if(pS == 0)
   form.pS.value = '';
 }

function Sattdampftemperatur(pS)
 {
  var t = 100;
  var dt = 0.001;
  do
   {
    var t0 = t - dt / 2;
    var t1 = t + dt / 2;
    var f0 = SattdampfDruckWasser(t0) - pS;
    var f1 = SattdampfDruckWasser(t1) - pS;
    var fS = (f1 - f0) / dt;
    var t0 = t;
    var t = t - f0 / fS;
   }
  while(Math.abs(t - t0) > dt);
  return(t);
 }
function EnthalpieLuft(t, x)
 {
  var h = 1.005 * t + x * (1.86 * t + 2500);
  return(h);
 }

 function SattdampfFunktion(x,p)
 {
  return(x * p / (0.622 + x));
 }

function AbsFeuchte(form, pS)
 {
  var phi = parseFloat(form.phi.value);
  phi = phi / 100;
  var p = parseFloat(form.p.value);
  var x = 0.622 * phi * pS / (p - phi * pS);
  return(x);
 }

function SattdampfDruckWasser(t)
 {
  var aq = 5.426651;
  var bq = -2005.1;
  var cq = 0.00013869;
  var dq = 0.000000000011965;
  var eq = -0.0044;
  var fq = -0.0057148;
  var kq = 293700;
  var ta = (t + 273.15) / 647.3;
  if(t >= -20 && t <= 374)
   {
    var te = t + 273.16;
    var x = te * te - kq;
    var y = 374.11 - t;
    var h1 = dq * x * x;
    var al = aq + bq / te + cq * x / te * (Math.pow(10, h1) - 1)
             + eq * Math.pow(10, (fq * Math.pow(y, 1.25)));
    h1 = Math.exp(-12 * Math.pow(ta, 4));
    var pS = 1.01325 * Math.pow(10, al) + (ta - 0.422) * (0.577 - ta)
             * Math.exp(h1) * 0.00980665;
    return(pS);
   }
  else
   return(0);
 }

function EnthalpieDampf(t, p)
 {
  var ah = Array();
  ah[0] = 2003.3277;
  ah[1] = 1169.8648;
  ah[2] = -8.05536;
  ah[3] = 73.76581;
  ah[4] = -13.02668;
  var ga = 0.0047331;
  var gb = 0.00293945;
  var gc = 0.00000435507;
  var gd = 0.000670126;
  var ge = 0.0000317362;
  var kc = 1.55108;
  var kd = 1.26591;
  var ih = 22128.7;
  var si = p / 221.287;
  var ta = (t + 273.15) / 647.3;
  var h0 = 0;
  for(var i = 0; i <= 4; i++)
   h0 = h0 + ah[i] * Math.pow(ta, i);
  var h = h0 - ih * ((3.82 * ga / Math.pow(ta, 2.82)
          + 1.82 * ge * (kc - si / 2) * Math.pow(ta, 2.82)) * si
          + ((5 * gb - 3 * (kd * si - Math.pow(ta, 3)) * gd * si)
          / Math.pow(ta, 14) + 11 * gc / Math.pow(ta, 32))
          * Math.pow(si, 3));
  return(h);
 }

function Aufrunden(Wert, Stellen)
 {
  Stellen = parseInt(Stellen);
  var x = Math.pow(10, Stellen);
  var str = "" + Math.round(Wert * x) / x;
  return str;
 }
