Program: 37795
Project: 37795
Buggy source:
public Cell getNigliReducedCell(){
  if (niggliReducedCell != null)   return niggliReducedCell;
  double TOL=1e-8;
  double[][] m1=new double[3][3];
  m1[0][1]=1.0;
  m1[1][0]=1.0;
  m1[2][2]=-1.0;
  double[][] m2=new double[3][3];
  m2[0][0]=-1.0;
  m2[1][2]=1.0;
  m2[2][1]=1.0;
  double[][] m3=new double[3][3];
  double[][] m4=new double[3][3];
  double[][] m5=Matrix.identity(3,3).getArrayCopy();
  double[][] m6=Matrix.identity(3,3).getArrayCopy();
  double[][] m7=Matrix.identity(3,3).getArrayCopy();
  double[][] m8=Matrix.identity(3,3).getArrayCopy();
  m8[0][2]=1.0;
  m8[1][2]=1.0;
  double[] indat=new double[6];
  indat[0]=this.getCellLengths()[0];
  indat[1]=this.getCellLengths()[1];
  indat[2]=this.getCellLengths()[2];
  indat[3]=latticeVectors.get(1).angleToInRadians(latticeVectors.get(2));
  indat[4]=latticeVectors.get(0).angleToInRadians(latticeVectors.get(2));
  indat[5]=latticeVectors.get(0).angleToInRadians(latticeVectors.get(1));
  double a=indat[0] * indat[0];
  double b=indat[1] * indat[1];
  double c=indat[2] * indat[2];
  double ksi=2.0 * indat[1] * indat[2]* Math.cos(indat[3]);
  double eta=2.0 * indat[0] * indat[2]* Math.cos(indat[4]);
  double zeta=2.0 * indat[0] * indat[1]* Math.cos(indat[5]);
  double temp, temp1, temp2, temp3;
  double[][] P=Matrix.identity(3,3).getArrayCopy();
  while (true) {
    if (((a - b) > TOL) || ((Math.abs(a - b) < TOL) && (Math.abs(ksi) > Math.abs(eta)))) {
      temp=a;
      a=b;
      b=temp;
      temp=-ksi;
      ksi=-eta;
      eta=temp;
      P=(new Matrix(P)).times(new Matrix(m1)).getArray();
    }
    if (((b - c) > TOL) || ((Math.abs(b - c) < TOL) && (Math.abs(eta) > Math.abs(zeta)))) {
      temp=b;
      b=c;
      c=temp;
      temp=-eta;
      eta=-zeta;
      zeta=temp;
      P=(new Matrix(P)).times(new Matrix(m2)).getArray();
      continue;
    }
    if ((ksi * eta * zeta) > 0.0) {
      m3[0][0]=SignNoZero(ksi);
      m3[1][1]=SignNoZero(eta);
      m3[2][2]=SignNoZero(zeta);
      P=(new Matrix(P)).times(new Matrix(m3)).getArray();
      ksi=Math.abs(ksi);
      eta=Math.abs(eta);
      zeta=Math.abs(zeta);
    }
    if (ksi * eta * zeta <= 0) {
      m4[0][0]=-(SignNoZero(ksi));
      m4[1][1]=-(SignNoZero(eta));
      m4[2][2]=-(SignNoZero(zeta));
      if (Math.abs(ksi) < TOL)       m4[0][0]=m4[1][1] * m4[2][2];
      if (Math.abs(eta) < TOL)       m4[1][1]=m4[0][0] * m4[2][2];
      if (Math.abs(zeta) < TOL)       m4[2][2]=m4[0][0] * m4[1][1];
      P=(new Matrix(P)).times(new Matrix(m4)).getArray();
      ksi=-Math.abs(ksi);
      eta=-Math.abs(eta);
      zeta=-Math.abs(zeta);
    }
    if (((Math.abs(ksi) - b) >= TOL) || ((Math.abs(ksi - b) < TOL) && (2.0 * eta < zeta)) || ((Math.abs(ksi + b) < TOL) && (zeta < 0))) {
      m5[1][2]=-(SignNoZero(ksi));
      P=(new Matrix(P)).times(new Matrix(m5)).getArray();
      temp1=b + c - ksi * SignNoZero(ksi);
      temp2=eta - zeta * SignNoZero(ksi);
      temp3=ksi - 2.0 * b * SignNoZero(ksi);
      c=temp1;
      eta=temp2;
      ksi=temp3;
      continue;
    }
    if (((Math.abs(eta) - a) > TOL) || ((Math.abs(eta - a) < TOL) && (2.0 * ksi < zeta)) || ((Math.abs(eta + a) < TOL) && (zeta < 0))) {
      m6[0][2]=-SignNoZero(eta);
      P=(new Matrix(P)).times(new Matrix(m6)).getArray();
      temp1=a + c - eta * SignNoZero(eta);
      temp2=ksi - zeta * SignNoZero(eta);
      temp3=eta - 2.0 * a * SignNoZero(eta);
      c=temp1;
      ksi=temp2;
      eta=temp3;
    }
    if (((Math.abs(zeta) - a) > TOL) || ((Math.abs(zeta - a) < TOL) && (2.0 * ksi < eta)) || ((Math.abs(zeta + a) < TOL) && (eta < 0))) {
      m7[0][1]=-SignNoZero(zeta);
      P=(new Matrix(P)).times(new Matrix(m7)).getArray();
      temp1=a + b - zeta * SignNoZero(zeta);
      temp2=ksi - eta * SignNoZero(zeta);
      temp3=zeta - 2.0 * a * SignNoZero(zeta);
      b=temp1;
      ksi=temp2;
      zeta=temp3;
      continue;
    }
    if ((ksi + eta + zeta+ a+ b < 0) || ((ksi + eta + zeta+ a+ b < 0) && (2.0 * (a + eta) + zeta > 0))) {
      P=(new Matrix(P)).times(new Matrix(m8)).getArray();
      temp1=a + b + c+ ksi+ eta+ zeta;
      temp2=2.0 * b + ksi + zeta;
      temp3=2.0 * a + eta + zeta;
      c=temp1;
      ksi=temp2;
      eta=temp3;
      continue;
    }
    break;
  }
  double[] outdat=new double[6];
  outdat[0]=Math.sqrt(a);
  outdat[1]=Math.sqrt(b);
  outdat[2]=Math.sqrt(c);
  outdat[3]=Math.acos(ksi / 2.0 / outdat[1]/ outdat[2]);
  outdat[4]=Math.acos(eta / 2.0 / outdat[0]/ outdat[2]);
  outdat[5]=Math.acos(zeta / 2.0 / outdat[0]/ outdat[1]);
  List<List<Integer>> coefficients=new LinkedList<List<Integer>>();
  for (int i=0; i < Constants.numDimensions; i++) {
    List<Integer> col=new LinkedList<Integer>();
    for (int j=0; j < Constants.numDimensions; j++) {
      int entry=Math.round(Math.round((P[j][i])));
      if (entry != P[j][i])       System.out.println("String_Node_Str");
      col.add(entry);
    }
    coefficients.add(col);
  }
  Cell result=getSupercell(this,coefficients);
  double[] poutdat=new double[6];
  poutdat[0]=result.getCellLengths()[0];
  poutdat[1]=result.getCellLengths()[1];
  poutdat[2]=result.getCellLengths()[2];
  poutdat[3]=result.getCellAngles()[0];
  poutdat[4]=result.getCellAngles()[1];
  poutdat[5]=result.getCellAngles()[2];
  int flag=0;
  for (int i=0; i < 6; i++) {
    if (Math.abs(poutdat[i] - outdat[i]) > 2 * TOL) {
      flag=1;
    }
  }
  if (flag == 1) {
    System.out.println("String_Node_Str");
    System.out.println("String_Node_Str");
    System.out.println("String_Node_Str");
    System.out.println("String_Node_Str");
    for (int j=0; j < 6; j++)     System.out.println(outdat[j]);
    System.out.println("String_Node_Str");
    for (int j=0; j < 6; j++)     System.out.println(poutdat[j]);
  }
  if (this.getBasisSize() != result.getBasisSize()) {
    System.out.println("String_Node_Str");
    System.out.println(this);
    System.out.println(result);
  }
  niggliReducedCell=result;
  return result;
}

Fixed version (ground truth):
public Cell getNigliReducedCell(){
  if (niggliReducedCell != null)   return niggliReducedCell;
  double TOL=1e-8;
  double[][] m1=new double[3][3];
  m1[0][1]=1.0;
  m1[1][0]=1.0;
  m1[2][2]=-1.0;
  double[][] m2=new double[3][3];
  m2[0][0]=-1.0;
  m2[1][2]=1.0;
  m2[2][1]=1.0;
  double[][] m3=new double[3][3];
  double[][] m4=new double[3][3];
  double[][] m5=Matrix.identity(3,3).getArrayCopy();
  double[][] m6=Matrix.identity(3,3).getArrayCopy();
  double[][] m7=Matrix.identity(3,3).getArrayCopy();
  double[][] m8=Matrix.identity(3,3).getArrayCopy();
  m8[0][2]=1.0;
  m8[1][2]=1.0;
  double[] indat=new double[6];
  indat[0]=this.getCellLengths()[0];
  indat[1]=this.getCellLengths()[1];
  indat[2]=this.getCellLengths()[2];
  indat[3]=latticeVectors.get(1).angleToInRadians(latticeVectors.get(2));
  indat[4]=latticeVectors.get(0).angleToInRadians(latticeVectors.get(2));
  indat[5]=latticeVectors.get(0).angleToInRadians(latticeVectors.get(1));
  double a=indat[0] * indat[0];
  double b=indat[1] * indat[1];
  double c=indat[2] * indat[2];
  double ksi=2.0 * indat[1] * indat[2]* Math.cos(indat[3]);
  double eta=2.0 * indat[0] * indat[2]* Math.cos(indat[4]);
  double zeta=2.0 * indat[0] * indat[1]* Math.cos(indat[5]);
  double temp, temp1, temp2, temp3;
  double[][] P=Matrix.identity(3,3).getArrayCopy();
  while (true) {
    if (((a - b) > TOL) || ((Math.abs(a - b) < TOL) && (Math.abs(ksi) > Math.abs(eta)))) {
      temp=a;
      a=b;
      b=temp;
      temp=-ksi;
      ksi=-eta;
      eta=temp;
      P=(new Matrix(P)).times(new Matrix(m1)).getArray();
    }
    if (((b - c) > TOL) || ((Math.abs(b - c) < TOL) && (Math.abs(eta) > Math.abs(zeta)))) {
      temp=b;
      b=c;
      c=temp;
      temp=-eta;
      eta=-zeta;
      zeta=temp;
      P=(new Matrix(P)).times(new Matrix(m2)).getArray();
      continue;
    }
    if ((ksi * eta * zeta) > 0.0) {
      m3[0][0]=SignNoZero(ksi);
      m3[1][1]=SignNoZero(eta);
      m3[2][2]=SignNoZero(zeta);
      P=(new Matrix(P)).times(new Matrix(m3)).getArray();
      ksi=Math.abs(ksi);
      eta=Math.abs(eta);
      zeta=Math.abs(zeta);
    }
    if (ksi * eta * zeta <= 0) {
      m4[0][0]=-(SignNoZero(ksi));
      m4[1][1]=-(SignNoZero(eta));
      m4[2][2]=-(SignNoZero(zeta));
      if (Math.abs(ksi) < TOL)       m4[0][0]=m4[1][1] * m4[2][2];
      if (Math.abs(eta) < TOL)       m4[1][1]=m4[0][0] * m4[2][2];
      if (Math.abs(zeta) < TOL)       m4[2][2]=m4[0][0] * m4[1][1];
      P=(new Matrix(P)).times(new Matrix(m4)).getArray();
      ksi=-Math.abs(ksi);
      eta=-Math.abs(eta);
      zeta=-Math.abs(zeta);
    }
    if (((Math.abs(ksi) - b) >= TOL) || ((Math.abs(ksi - b) < TOL) && (2.0 * eta < zeta)) || ((Math.abs(ksi + b) < TOL) && (zeta < 0))) {
      m5[1][2]=-(SignNoZero(ksi));
      P=(new Matrix(P)).times(new Matrix(m5)).getArray();
      temp1=b + c - ksi * SignNoZero(ksi);
      temp2=eta - zeta * SignNoZero(ksi);
      temp3=ksi - 2.0 * b * SignNoZero(ksi);
      c=temp1;
      eta=temp2;
      ksi=temp3;
      continue;
    }
    if (((Math.abs(eta) - a) > TOL) || ((Math.abs(eta - a) < TOL) && (2.0 * ksi < zeta)) || ((Math.abs(eta + a) < TOL) && (zeta < 0))) {
      m6[0][2]=-SignNoZero(eta);
      P=(new Matrix(P)).times(new Matrix(m6)).getArray();
      temp1=a + c - eta * SignNoZero(eta);
      temp2=ksi - zeta * SignNoZero(eta);
      temp3=eta - 2.0 * a * SignNoZero(eta);
      c=temp1;
      ksi=temp2;
      eta=temp3;
    }
    if (((Math.abs(zeta) - a) > TOL) || ((Math.abs(zeta - a) < TOL) && (2.0 * ksi < eta)) || ((Math.abs(zeta + a) < TOL) && (eta < 0))) {
      m7[0][1]=-SignNoZero(zeta);
      P=(new Matrix(P)).times(new Matrix(m7)).getArray();
      temp1=a + b - zeta * SignNoZero(zeta);
      temp2=ksi - eta * SignNoZero(zeta);
      temp3=zeta - 2.0 * a * SignNoZero(zeta);
      b=temp1;
      ksi=temp2;
      zeta=temp3;
      continue;
    }
    if ((ksi + eta + zeta+ a+ b < 0) || ((ksi + eta + zeta+ a+ b < 0) && (2.0 * (a + eta) + zeta > 0))) {
      P=(new Matrix(P)).times(new Matrix(m8)).getArray();
      temp1=a + b + c+ ksi+ eta+ zeta;
      temp2=2.0 * b + ksi + zeta;
      temp3=2.0 * a + eta + zeta;
      c=temp1;
      ksi=temp2;
      eta=temp3;
      continue;
    }
    break;
  }
  double[] outdat=new double[6];
  outdat[0]=Math.sqrt(a);
  outdat[1]=Math.sqrt(b);
  outdat[2]=Math.sqrt(c);
  outdat[3]=Math.acos(ksi / 2.0 / outdat[1]/ outdat[2]);
  outdat[4]=Math.acos(eta / 2.0 / outdat[0]/ outdat[2]);
  outdat[5]=Math.acos(zeta / 2.0 / outdat[0]/ outdat[1]);
  List<List<Integer>> coefficients=new LinkedList<List<Integer>>();
  for (int i=0; i < Constants.numDimensions; i++) {
    List<Integer> col=new LinkedList<Integer>();
    for (int j=0; j < Constants.numDimensions; j++) {
      int entry=Math.round(Math.round((P[j][i])));
      if (entry != P[j][i])       System.out.println("String_Node_Str");
      col.add(entry);
    }
    coefficients.add(col);
  }
  Cell result=getSupercell(this,coefficients);
  double[] poutdat=new double[6];
  poutdat[0]=result.getCellLengths()[0];
  poutdat[1]=result.getCellLengths()[1];
  poutdat[2]=result.getCellLengths()[2];
  poutdat[3]=result.getCellAngles()[0];
  poutdat[4]=result.getCellAngles()[1];
  poutdat[5]=result.getCellAngles()[2];
  int flag=0;
  for (int i=0; i < 6; i++) {
    if (Math.abs(poutdat[i] - outdat[i]) > 2 * TOL) {
      flag=1;
    }
  }
  if (flag == 1) {
    System.out.println("String_Node_Str");
    System.out.println("String_Node_Str");
    System.out.println("String_Node_Str");
    System.out.println("String_Node_Str");
    for (int j=0; j < 6; j++)     System.out.println(outdat[j]);
    System.out.println("String_Node_Str");
    for (int j=0; j < 6; j++)     System.out.println(poutdat[j]);
  }
  if (this.getBasisSize() != result.getBasisSize()) {
    System.out.println("String_Node_Str");
    System.out.println(this);
    System.out.println(result);
    (new Exception()).printStackTrace();
  }
  niggliReducedCell=result;
  return result;
}