// javascript NX19 
var rgas = 1545.35616;  //lbf-ft/lbmol-R
var airmw = 28.97;
var pb = 14.73;
var tb = 60.;

function NX19RHOB(TF, PF, SG, N2, CO2)
{
var zb;
    zb = nx19zb(TF, PF - 14.7, SG, N2 / 100., CO2 / 100.);
    return (pb * 144.) / (rgas / (SG * airmw) * zb * (tb + 459.67));
}
    
function NX19RHOF(TF, PF, SG, N2, CO2)
{
    zf=nx19(TF, PF - 14.7, SG, N2 / 100., CO2 / 100.);
    return (PF * 144.) / (rgas / (SG * airmw) * zf * (TF + 459.67));
}

function nx19(TF, PF, SG, xn2, xco2)
{
// coding for the NX19 gas density stuff
// per Flow Measurement Engineering Handbook
// pf = flowing gage pressure psig
// tf = flowing temperature (F)
// sg = real specific gravity (rho_gas/rho_air)
// xn2 = mole fraction of nitrogen
// xco2= mole fraction of CO2
// zf = flowing compressibility
// zb = base compressibility
var padj,tadj,p,t,coefm,coefn,bb,coefe,b,d,zf,zb;

      padj = 156.47 * PF / (160.8 - 7.22 * SG + 100. * xco2 - 39.2 * xn2);
      tadj = (226.29 * (TF + 460)) / (99.15 + 211.9 * SG - 100 * xco2 - 168.1 * xn2);
      p = (padj + 14.7) / 1000.;
      t = tadj / 500.;
      coefm = 0.0330378/(t*t)-0.0221323/(t*t*t)+0.0161353/Math.pow(t,5);
      coefn = (0.265827 / (t*t) + 0.0457697 / Math.pow(t,4) - 0.133185 / t) / coefm;
      bb = (3. - coefm * coefn*coefn) / (9. * coefm * p * p);
      coefe = ec_nx19(t, p);
      b =(9.*coefn-2.*coefm*Math.pow(coefn,3))/(54.*coefm*p*p*p)-coefe/(2.*coefm*p*p);     
      d = Math.pow(b + Math.pow(b * b + bb*bb*bb,0.5),1./3.);
      zf = 1. / ((bb / d) - d + coefn / (3. * p));
//      zb = Math.pow(1. + 0.00132 / Math.pow(t,3.25),-2.);
      return zf;
}

function nx19zb(TF, PF, SG, xn2, xco2)
{
var tadj,t;
      tadj = (226.29 * (TF + 460)) / (99.15 + 211.9 * SG - 100 * xco2 - 168.1 * xn2);
      t = tadj / 500.;
      return Math.pow(1. + 0.00132 / Math.pow(t,3.25),-2.);
}


function ec_nx19(t, p)
{
//Rem c * * * p and t are the pressure and temperature correlation parameters
//Rem c * * *
//Rem c * * * assign appropriate coefficient
var e;
      e = 1.;
      if (p < 2.) {
        if (t >= 1.09 && t < 1.4) e = ec1_nx19(t, p);
        if (p < 1.3) {
          if (t >= 0.84 && t < 1.09) e = ec2_nx19(t, p);
          }
        else {
          if (t >= 0.88 && t < 1.09) e = ec3_nx19(t, p);
          if (t >= 0.84 && t < 0.88) e = ec4_nx19(t, p);
          }
      } 
      else {
        if (t >= 0.84 && t < 0.88) e = ec5_nx19(t, p);
        if (t >= 0.88 && t < 1.09) e = ec6_nx19(t, p);
        if (t >= 1.09 && t < 1.32) e = ec7_nx19(t, p);
        if (t >= 1.32 && t < 1.40) e = ec8_nx19(t, p);
      }
      return e;
}


function ec1_nx19(t, p)
{
var p23,p2,ta,tb,ta5;
      p23 = Math.pow(p,2.3);
      p2 = p * p;
      ta = t - 1.09;
      tb = 1.09 - t;
      ta5 = Math.pow(ta,0.5);
      return 1.-0.00075*p23*Math.exp(-20.*ta)-0.0011*ta5*p2*Math.pow(2.17+1.4*ta5-p,2.);
}

function ec2_nx19(t, p)
{
var p23,p2,tb,rval;
      p23 = Math.pow(p,2.3);
      p2 = p * p;
      tb = 1.09 - t;
      rval=1.0-0.00075*p23*(2.-Math.exp(-20.*tb))-1.317*Math.pow(tb,4)*p*(1.69-p2);
      return rval;
}
      
function ec3_nx19(t, p)
{
var p23,p2,tb,eterm,rval;
      p23 = Math.pow(p,2.3);
      p2 = p * p;
      tb = 1.09 - t;
      eterm=0.455*(200.*Math.pow(tb,6)-0.03249*tb+2.0167*tb*tb-18.028*Math.pow(tb,3)+42.844*Math.pow(tb,4))*(p-1.3);
      rval=1.-0.00075*p23*(2.-Math.exp(-20*tb))+eterm*(1.69*Math.pow(2.,1.25)-p2);
      return rval;
}

function ec4_nx19(t, p)
{
var p23,p2,tb,eterm,rval;

      p23 = Math.pow(p,2.3);
      p2 = p * p;
      tb = 1.09 - t;
      eterm=0.455*(200.*Math.pow(tb,6)-0.03249*tb+2.0167*tb*tb-18.028*Math.pow(tb,3)+42.844*Math.pow(tb,4))*(p-1.3);
      rval=1.-0.00075*p23*(2.-Math.exp(-20*tb))+eterm*(1.69*(Math.pow(2.,1.25+80*Math.pow(0.88-t,2)))-p2);
      return rval;
}     
 

function ec5_nx19(t, p)
{
      return ec4_nx19(t, p) - xc_nx19(t, p);
}

function ec6_nx19(t, p)
{
      return ec3_nx19(t, p) - xc_nx19(t, p);
}

function ec7_nx19(t, p)
{
      return ec1_nx19(t, p) - xc_nx19(t, p);
}

function ec8_nx19(t, p)
{
      return ec7_nx19(t, p) - x1c_nx19(t, p);
}

function xc_nx19(t, p)
{
var a,a1,a2,a3,pm2,rval;
      a = 1.7172 + (-2.33123 + (-1.56796 + (3.47644 - 1.28603 * t) * t) * t) * t
      a1 =0.016299+(-0.028094+(0.48782+(-0.78221+0.27839*t)*t)*t)*t;
      a2 =-0.35978+(0.51419+(0.16453+(-0.52216+0.19687*t)*t)*t)*t;
      a3 =0.075255+(-0.10573+(-0.058598+(0.14416-0.054533*t)*t)*t)*t;
      pm2 = p - 2;
      rval=(a + (a1 + (a2 + a3 * pm2) * pm2) * pm2) * pm2;
      return rval;
}

function x1c_nx19(t, p)
{
var pm2,rval;
      pm2 = p - 2.;
      rval=Math.pow(p-1.32,2)*pm2*(3.-1.483*pm2-0.1*pm2*pm2+0.0833*pm2*pm2*pm2);
      return rval; 
}


