zlacn2 function

void zlacn2(
  1. int N,
  2. Array<Complex> V_,
  3. Array<Complex> X_,
  4. Box<double> EST,
  5. Box<int> KASE,
  6. Array<int> ISAVE_,
)

Implementation

void zlacn2(
  final int N,
  final Array<Complex> V_,
  final Array<Complex> X_,
  final Box<double> EST,
  final Box<int> KASE,
  final Array<int> ISAVE_,
) {
  final V = V_.having();
  final X = X_.having();
  final ISAVE = ISAVE_.having();
  const ITMAX = 5;
  const ONE = 1.0, TWO = 2.0;
  int I, JLAST;
  double ABSXI, ALTSGN, ESTOLD, SAFMIN, TEMP;

  SAFMIN = dlamch('Safe minimum');
  if (KASE.value == 0) {
    for (I = 1; I <= N; I++) {
      X[I] = (ONE / N).toComplex();
    }
    KASE.value = 1;
    ISAVE[1] = 1;
    return;
  }

  switch (ISAVE[1]) {
    // FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
    case 1:
      if (N == 1) {
        V[1] = X[1];
        EST.value = V[1].abs();
        // QUIT
        KASE.value = 0;
        return;
      }
      EST.value = dzsum1(N, X, 1);

      for (I = 1; I <= N; I++) {
        ABSXI = X[I].abs();
        if (ABSXI > SAFMIN) {
          X[I] = Complex(X[I].real / ABSXI, X[I].imaginary / ABSXI);
        } else {
          X[I] = Complex.one;
        }
      }
      KASE.value = 2;
      ISAVE[1] = 2;
      return;

    // FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
    case 2:
      ISAVE[2] = izmax1(N, X, 1);
      ISAVE[3] = 2;

      continue L50;
    // MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
    L50:
    case 50:
      for (I = 1; I <= N; I++) {
        X[I] = Complex.zero;
      }
      X[ISAVE[2]] = Complex.one;
      KASE.value = 1;
      ISAVE[1] = 3;
      return;

    // X HAS BEEN OVERWRITTEN BY A*X.
    case 3:
      zcopy(N, X, 1, V, 1);
      ESTOLD = EST.value;
      EST.value = dzsum1(N, V, 1);

      // TEST FOR CYCLING.
      if (EST.value <= ESTOLD) continue L100;

      for (I = 1; I <= N; I++) {
        ABSXI = X[I].abs();
        if (ABSXI > SAFMIN) {
          X[I] = Complex(X[I].real / ABSXI, X[I].imaginary / ABSXI);
        } else {
          X[I] = Complex.one;
        }
      }
      KASE.value = 2;
      ISAVE[1] = 4;
      return;

    // X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
    case 4:
      JLAST = ISAVE[2];
      ISAVE[2] = izmax1(N, X, 1);
      if ((X[JLAST].abs() != X[ISAVE[2]].abs()) && (ISAVE[3] < ITMAX)) {
        ISAVE[3]++;
        continue L50;
      }

      continue L100;
    // ITERATION COMPLETE.  FINAL STAGE.
    L100:
    case 100:
      ALTSGN = ONE;
      for (I = 1; I <= N; I++) {
        X[I] = Complex(ALTSGN * (ONE + (I - 1) / (N - 1)));
        ALTSGN = -ALTSGN;
      }
      KASE.value = 1;
      ISAVE[1] = 5;
      return;

    // X HAS BEEN OVERWRITTEN BY A*X.
    case 5:
      TEMP = TWO * (dzsum1(N, X, 1) / (3 * N));
      if (TEMP > EST.value) {
        zcopy(N, X, 1, V, 1);
        EST.value = TEMP;
      }
  }
  KASE.value = 0;
}