zptts2 function

void zptts2(
  1. int IUPLO,
  2. int N,
  3. int NRHS,
  4. Array<double> D_,
  5. Array<Complex> E_,
  6. Matrix<Complex> B_,
  7. int LDB,
)

Implementation

void zptts2(
  final int IUPLO,
  final int N,
  final int NRHS,
  final Array<double> D_,
  final Array<Complex> E_,
  final Matrix<Complex> B_,
  final int LDB,
) {
  final B = B_.having(ld: LDB);
  final E = E_.having();
  final D = D_.having();
  int I, J;

  // Quick return if possible

  if (N <= 1) {
    if (N == 1) zdscal(NRHS, 1.0 / D[1], B.asArray(), LDB);
    return;
  }

  if (IUPLO == 1) {
    // Solve A * X = B using the factorization A = U**H *D*U,
    // overwriting each right hand side vector with its solution.

    if (NRHS <= 2) {
      J = 1;
      while (true) {
        // Solve U**H * x = b.

        for (I = 2; I <= N; I++) {
          B[I][J] -= B[I - 1][J] * E[I - 1].conjugate();
        }

        // Solve D * U * x = b.

        for (I = 1; I <= N; I++) {
          B[I][J] /= D[I].toComplex();
        }
        for (I = N - 1; I >= 1; I--) {
          B[I][J] -= B[I + 1][J] * E[I];
        }
        if (J < NRHS) {
          J++;
          continue;
        }
        break;
      }
    } else {
      for (J = 1; J <= NRHS; J++) {
        // Solve U**H * x = b.

        for (I = 2; I <= N; I++) {
          B[I][J] -= B[I - 1][J] * E[I - 1].conjugate();
        }

        // Solve D * U * x = b.

        B[N][J] /= D[N].toComplex();
        for (I = N - 1; I >= 1; I--) {
          B[I][J] = B[I][J] / D[I].toComplex() - B[I + 1][J] * E[I];
        }
      }
    }
  } else {
    // Solve A * X = B using the factorization A = L*D*L**H,
    // overwriting each right hand side vector with its solution.

    if (NRHS <= 2) {
      J = 1;
      while (true) {
        // Solve L * x = b.

        for (I = 2; I <= N; I++) {
          B[I][J] -= B[I - 1][J] * E[I - 1];
        }

        // Solve D * L**H * x = b.

        for (I = 1; I <= N; I++) {
          B[I][J] /= D[I].toComplex();
        }
        for (I = N - 1; I >= 1; I--) {
          B[I][J] -= B[I + 1][J] * E[I].conjugate();
        }
        if (J < NRHS) {
          J++;
          continue;
        }
        break;
      }
    } else {
      for (J = 1; J <= NRHS; J++) {
        // Solve L * x = b.

        for (I = 2; I <= N; I++) {
          B[I][J] -= B[I - 1][J] * E[I - 1];
        }

        // Solve D * L**H * x = b.

        B[N][J] /= D[N].toComplex();
        for (I = N - 1; I >= 1; I--) {
          B[I][J] = B[I][J] / D[I].toComplex() - B[I + 1][J] * E[I].conjugate();
        }
      }
    }
  }
}