dlatrd function

void dlatrd(
  1. String UPLO,
  2. int N,
  3. int NB,
  4. Matrix<double> A_,
  5. int LDA,
  6. Array<double> E_,
  7. Array<double> TAU_,
  8. Matrix<double> W_,
  9. int LDW,
)

Implementation

void dlatrd(
  final String UPLO,
  final int N,
  final int NB,
  final Matrix<double> A_,
  final int LDA,
  final Array<double> E_,
  final Array<double> TAU_,
  final Matrix<double> W_,
  final int LDW,
) {
  final A = A_.having(ld: LDA);
  final E = E_.having();
  final TAU = TAU_.having();
  final W = W_.having(ld: LDW);
  const ZERO = 0.0, ONE = 1.0, HALF = 0.5;
  int I, IW;
  double ALPHA;

  // Quick return if possible

  if (N <= 0) return;

  if (lsame(UPLO, 'U')) {
    // Reduce last NB columns of upper triangle

    for (I = N; I >= N - NB + 1; I--) {
      IW = I - N + NB;
      if (I < N) {
        // Update A[1:i][i]

        dgemv('No transpose', I, N - I, -ONE, A(1, I + 1), LDA,
            W(I, IW + 1).asArray(), LDW, ONE, A(1, I).asArray(), 1);
        dgemv('No transpose', I, N - I, -ONE, W(1, IW + 1), LDW,
            A(I, I + 1).asArray(), LDA, ONE, A(1, I).asArray(), 1);
      }
      if (I > 1) {
        // Generate elementary reflector H(i) to annihilate
        // A[1:i-2][i]

        dlarfg(I - 1, A.box(I - 1, I), A(1, I).asArray(), 1, TAU.box(I - 1));
        E[I - 1] = A[I - 1][I];
        A[I - 1][I] = ONE;

        // Compute W[1:i-1][i]

        dsymv('Upper', I - 1, ONE, A, LDA, A(1, I).asArray(), 1, ZERO,
            W(1, IW).asArray(), 1);
        if (I < N) {
          dgemv('Transpose', I - 1, N - I, ONE, W(1, IW + 1), LDW,
              A(1, I).asArray(), 1, ZERO, W(I + 1, IW).asArray(), 1);
          dgemv('No transpose', I - 1, N - I, -ONE, A(1, I + 1), LDA,
              W(I + 1, IW).asArray(), 1, ONE, W(1, IW).asArray(), 1);
          dgemv('Transpose', I - 1, N - I, ONE, A(1, I + 1), LDA,
              A(1, I).asArray(), 1, ZERO, W(I + 1, IW).asArray(), 1);
          dgemv('No transpose', I - 1, N - I, -ONE, W(1, IW + 1), LDW,
              W(I + 1, IW).asArray(), 1, ONE, W(1, IW).asArray(), 1);
        }
        dscal(I - 1, TAU[I - 1], W(1, IW).asArray(), 1);
        ALPHA = -HALF *
            TAU[I - 1] *
            ddot(I - 1, W(1, IW).asArray(), 1, A(1, I).asArray(), 1);
        daxpy(I - 1, ALPHA, A(1, I).asArray(), 1, W(1, IW).asArray(), 1);
      }
    }
  } else {
    // Reduce first NB columns of lower triangle

    for (I = 1; I <= NB; I++) {
      // Update A[i:n][i]

      dgemv('No transpose', N - I + 1, I - 1, -ONE, A(I, 1), LDA,
          W(I, 1).asArray(), LDW, ONE, A(I, I).asArray(), 1);
      dgemv('No transpose', N - I + 1, I - 1, -ONE, W(I, 1), LDW,
          A(I, 1).asArray(), LDA, ONE, A(I, I).asArray(), 1);
      if (I < N) {
        // Generate elementary reflector H(i) to annihilate
        // A[i+2:n][i]

        dlarfg(N - I, A.box(I + 1, I), A(min(I + 2, N), I).asArray(), 1,
            TAU.box(I));
        E[I] = A[I + 1][I];
        A[I + 1][I] = ONE;

        // Compute W[i+1:n][i]

        dsymv('Lower', N - I, ONE, A(I + 1, I + 1), LDA, A(I + 1, I).asArray(),
            1, ZERO, W(I + 1, I).asArray(), 1);
        dgemv('Transpose', N - I, I - 1, ONE, W(I + 1, 1), LDW,
            A(I + 1, I).asArray(), 1, ZERO, W(1, I).asArray(), 1);
        dgemv('No transpose', N - I, I - 1, -ONE, A(I + 1, 1), LDA,
            W(1, I).asArray(), 1, ONE, W(I + 1, I).asArray(), 1);
        dgemv('Transpose', N - I, I - 1, ONE, A(I + 1, 1), LDA,
            A(I + 1, I).asArray(), 1, ZERO, W(1, I).asArray(), 1);
        dgemv('No transpose', N - I, I - 1, -ONE, W(I + 1, 1), LDW,
            W(1, I).asArray(), 1, ONE, W(I + 1, I).asArray(), 1);
        dscal(N - I, TAU[I], W(I + 1, I).asArray(), 1);
        ALPHA = -HALF *
            TAU[I] *
            ddot(N - I, W(I + 1, I).asArray(), 1, A(I + 1, I).asArray(), 1);
        daxpy(N - I, ALPHA, A(I + 1, I).asArray(), 1, W(I + 1, I).asArray(), 1);
      }
    }
  }
}