You are on page 1of 4

function 

ZValue(Tc,Pc,Wc,T,P,R,eos)
{
  var paramsab = new Array(3);
  var coeffs = new Array(5);
  var Z = new Array(4);
  
    paramsab = calcab(Tc,Pc,Wc,T,P,R,eos);
  coeffs = calccoeffs(paramsab[1],paramsab[2],T,P,R,eos);
  Z = solvecubic(coeffs[0],coeffs[1],coeffs[2]);    
    return Z[0];
}

function calcab(Tc,Pc,Wc,T,P,R,eos)
{
  var alpha, kappa;
  var a, b;
    var Tr = T/Tc;
    var Pr = P/Pc;
  
  switch (parseInt(eos))
  {
        case 1:
                a = 27*R*R*Tc*Tc/(64*Pc*1E5);
                b = R*Tc/(8*Pc*1E5);
                kappa = 0;
                break;
        case 2:
                a = 0.42748*R*R*Math.pow(Tc,2.5)/(Pc*1E5);
                b = 0.08664*R*Tc/(Pc*1E5);
                kappa = 0;
              break;
        case 3:
                kappa = 0.480 + 1.574*Wc - 0.176*Wc*Wc;
                alpha = Math.pow(1+kappa*(1-Math.sqrt(T/Tc)),2);
                a = 0.42748*R*R*Tc*Tc*alpha/(Pc*1E5);
                b = 0.08664*R*Tc/(Pc*1E5);
                break;
        case 4:
                kappa = 0.37464 + 1.54226*Wc - 0.26992*Wc*Wc;
                alpha = Math.pow(1+kappa*(1-Math.sqrt(Tr)),2);
                a = 0.45724*R*R*Tc*Tc*alpha/(Pc*1E5);
                b = 0.07780*R*Tc/(Pc*1E5);
                break;
      case 5:
            kappa = 0.134 + 0.508*Wc - 0.0467*Wc*Wc;
            alpha = Math.exp((2.00+0.836*Tr)*(1-Math.pow(Tr,kappa)));
                a = 0.45724*R*R*Tc*Tc*alpha/(Pc*1E5);
                b = 0.07780*R*Tc/(Pc*1E5);
              break;
        default:
                kappa = 0; a = 0; b = 0;
        }

  return Array(kappa,a,b);
}

// calculate coefficients in the cubic equation of state

function calccoeffs(a,b,T,P,R,eos)
{
    var A, B;
  var C0, C1, C2;
  switch (parseInt(eos))
        {
        case 1:
                A = a*P*1E5/Math.pow(R*T,2);
                B = b*P*1E5/(R*T);
                C2 = -1 - B;
                C1 = A;
                C0 = -A*B;
        break;
        case 2:
                A = a*P*1E5/(Math.sqrt(T)*Math.pow(R*T,2));
                B = b*P*1E5/(R*T);
                C2 = -1;
                C1 = A - B - B*B;
                C0 = -A*B;
        break;
        case 3:
                A = a*P*1E5/Math.pow(R*T,2);
                B = b*P*1E5/(R*T);
                C2 = -1;
                C1 = A - B - B*B;
                C0 = -A*B;
        break;
        case 4:
                A = a*P*1E5/Math.pow(R*T,2);
                B = b*P*1E5/(R*T);
                C2 = -1+B;
                C1 = A - 3*B*B - 2*B;
                C0 = -A*B + B*B + B*B*B;
        break;
        case 5:
                A = a*P*1E5/Math.pow(R*T,2);
                B = b*P*1E5/(R*T);
                C2 = -1+B;
                C1 = A - 3*B*B - 2*B;
                C0 = -A*B + B*B + B*B*B;
        break;
        default:
                C2 = 0; C1 = 0; C0 = 0;
        }

        return Array(C0,C1,C2,A,B);
}

// function for solving cubic equations

function solvecubic(C0,C1,C2)
{
        var Q1 = C2*C1/6 - C0/2 - C2*C2*C2/27;
        var P1 = C2*C2/9 - C1/3;
        var D = Q1*Q1 - P1*P1*P1;
        var temp, temp1, temp2;
      var Z0, Z1, Z2;
        if (D>=0)
        {
                temp1 = Math.pow(Math.abs(Q1+Math.sqrt(D)),0.3333333333);
                temp1 = temp1 * (Q1 + Math.sqrt(D)) / Math.abs(Q1 + Math.sqrt(D));
                temp2 = Math.pow(Math.abs(Q1-Math.sqrt(D)),0.3333333333);
                temp2 = temp2 * (Q1 - Math.sqrt(D))/Math.abs(Q1 - Math.sqrt(D));
                Z0 = temp1 + temp2 - C2/3;
                Z1 = "";
                Z2 = "";
        }
        else
        {
                temp1 = Q1*Q1/(P1*P1*P1);
                temp2 = Math.sqrt(1-temp1)/Math.sqrt(temp1);
                temp2 = temp2 * Q1/Math.abs(Q1);
                var Phi = Math.atan(temp2);
                if (Phi<0) {
                        Phi=Phi+Math.PI; }
                Z0 = 2*Math.sqrt(P1)*Math.cos(Phi/3) - C2/3;
                Z1 = 2*Math.sqrt(P1)*Math.cos((Phi+2*Math.PI)/3) - C2/3;
                Z2 = 2*Math.sqrt(P1)*Math.cos((Phi+4*Math.PI)/3) - C2/3;
                if (Z0<Z1) {
                        temp = Z0; Z0 = Z1; Z1 = temp; }
                if (Z1<Z2) {
                        temp = Z1; Z1 = Z2; Z2 = temp; }
                if (Z0<Z1) {
                        temp = Z0; Z0 = Z1; Z1 = temp; }
        }
        return Array(Z0,Z1,Z2,D);
}

You might also like