<!--Define JavaScript functions.-->

function calcdetAr(MATRIXDIM, A, ipvt, detVar, iFlag){			
// Routine for calculating the determinant and/or inverse
// of the A matrix, assumed to already be in LU form.
// iFlag indicates if determinant, or inverse, or both, to
// be computed.

var i = 0, j = 0, k = 0;
var det1 = 1.0;				// Determinant quantity
var tol = 0.0, det2 = 0.0;		// Determinant quantity
var dumVec = new Array(MATRIXDIM);	// Dummy vector

if (iFlag >= 0){
// Compute the determinant
  for (i = 0; i < MATRIXDIM; i++) {
    if (ipvt[i] != i) det1 = -det1;
    det1 *= A[i][i];
    if (det1 == 0.0) break;
    while (Math.abs(det1) < 1.0){
      det1 *= 10.0;
      det2 -= 1.0;
    } // End while 
    while (Math.abs(det1) >= 10.0){
      det1 /= 10.0;
      det2 += 1.0;
    } // End while
  } // End for i
  detVar.det1 = det1;
  detVar.det2 = det2;
} // End if (iFlag >= 0)

if (iFlag <= 0){
  // Compute the inverse
  // Form Inverse(U)
  for (i = 0; i < MATRIXDIM; i++) {
    A[i][i] = 1.0/A[i][i];
    tol = -A[i][i];
    for (j = 0; j < i; j++)  A[j][i] *=tol;
    for (j = (i + 1); j < MATRIXDIM; j++){
      tol = A[i][j];
      A[i][j] = 0.0;
      if (tol != 0){
        for (k = 0; k <= i; k++)  A[k][j] += tol*A[k][i];
      } // End if (tol != 0)
    }// End for j
  } // End for i loop

   // Form Inverse(U)*Inverse(L)
  for (k = (MATRIXDIM - 2); k >= 0; k--){
	for (j = (k + 1); j < MATRIXDIM; j++){
          dumVec[j] = A[j][k];
	  A[j][k] = 0.0;
	} // End for j
	for (j = (k + 1); j < MATRIXDIM; j++){
          tol = dumVec[j];
	  if (tol != 0){
            for (i = 0; i < MATRIXDIM; i++)  A[i][k] += tol*A[i][j];
	  } // End if (tol != 0)
	} // End for j
	j = ipvt[k];
	if (j != k){
          for (i = 0; i < MATRIXDIM; i++){
	    tol = A[i][k];
	    A[i][k] = A[i][j];
	    A[i][j] = tol;
	  } // End for i
	} // End if (j != k)
  } // End for k
} // End if (iFlag <= 0)

return;
}  //End of calcdetAr

// end of JavaScript-->