dlahr2 function

void dlahr2(
  1. int N,
  2. int K,
  3. int NB,
  4. Matrix<double> A_,
  5. int LDA,
  6. Array<double> TAU_,
  7. Matrix<double> T_,
  8. int LDT,
  9. Matrix<double> Y_,
  10. int LDY,
)

Implementation

void dlahr2(
  final int N,
  final int K,
  final int NB,
  final Matrix<double> A_,
  final int LDA,
  final Array<double> TAU_,
  final Matrix<double> T_,
  final int LDT,
  final Matrix<double> Y_,
  final int LDY,
) {
  final A = A_.having(ld: LDA);
  final TAU = TAU_.having();
  final T = T_.having(ld: LDT);
  final Y = Y_.having(ld: LDY);
  const ZERO = 0.0, ONE = 1.0;
  int I;
  double EI = 0;

  // Quick return if possible

  if (N <= 1) return;

  for (I = 1; I <= NB; I++) {
    if (I > 1) {
      // Update A(K+1:N,I)

      // Update I-th column of A - Y * V**T

      dgemv('NO TRANSPOSE', N - K, I - 1, -ONE, Y(K + 1, 1), LDY,
          A(K + I - 1, 1).asArray(), LDA, ONE, A(K + 1, I).asArray(), 1);

      // Apply I - V * T**T * V**T to this column (call it b) from the
      // left, using the last column of T as workspace
      //
      // Let  V = ( V1 )   and   b = ( b1 )   (first I-1 rows)
      //          ( V2 )             ( b2 )
      //
      // where V1 is unit lower triangular
      //
      // w := V1**T * b1

      dcopy(I - 1, A(K + 1, I).asArray(), 1, T(1, NB).asArray(), 1);
      dtrmv('Lower', 'Transpose', 'UNIT', I - 1, A(K + 1, 1), LDA,
          T(1, NB).asArray(), 1);

      // w := w + V2**T * b2

      dgemv('Transpose', N - K - I + 1, I - 1, ONE, A(K + I, 1), LDA,
          A(K + I, I).asArray(), 1, ONE, T(1, NB).asArray(), 1);

      // w := T**T * w

      dtrmv('Upper', 'Transpose', 'NON-UNIT', I - 1, T, LDT, T(1, NB).asArray(),
          1);

      // b2 := b2 - V2*w

      dgemv('NO TRANSPOSE', N - K - I + 1, I - 1, -ONE, A(K + I, 1), LDA,
          T(1, NB).asArray(), 1, ONE, A(K + I, I).asArray(), 1);

      // b1 := b1 - V1*w

      dtrmv('Lower', 'NO TRANSPOSE', 'UNIT', I - 1, A(K + 1, 1), LDA,
          T(1, NB).asArray(), 1);
      daxpy(I - 1, -ONE, T(1, NB).asArray(), 1, A(K + 1, I).asArray(), 1);

      A[K + I - 1][I - 1] = EI;
    }

    // Generate the elementary reflector H(I) to annihilate
    // A(K+I+1:N,I)

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

    // Compute  Y(K+1:N,I)

    dgemv('NO TRANSPOSE', N - K, N - K - I + 1, ONE, A(K + 1, I + 1), LDA,
        A(K + I, I).asArray(), 1, ZERO, Y(K + 1, I).asArray(), 1);
    dgemv('Transpose', N - K - I + 1, I - 1, ONE, A(K + I, 1), LDA,
        A(K + I, I).asArray(), 1, ZERO, T(1, I).asArray(), 1);
    dgemv('NO TRANSPOSE', N - K, I - 1, -ONE, Y(K + 1, 1), LDY,
        T(1, I).asArray(), 1, ONE, Y(K + 1, I).asArray(), 1);
    dscal(N - K, TAU[I], Y(K + 1, I).asArray(), 1);

    // Compute T(1:I,I)

    dscal(I - 1, -TAU[I], T(1, I).asArray(), 1);
    dtrmv('Upper', 'No Transpose', 'NON-UNIT', I - 1, T, LDT, T(1, I).asArray(),
        1);
    T[I][I] = TAU[I];
  }
  A[K + NB][NB] = EI;

  // Compute Y(1:K,1:NB)

  dlacpy('ALL', K, NB, A(1, 2), LDA, Y, LDY);
  dtrmm('RIGHT', 'Lower', 'NO TRANSPOSE', 'UNIT', K, NB, ONE, A(K + 1, 1), LDA,
      Y, LDY);
  if (N > K + NB) {
    dgemm('NO TRANSPOSE', 'NO TRANSPOSE', K, NB, N - K - NB, ONE, A(1, 2 + NB),
        LDA, A(K + 1 + NB, 1), LDA, ONE, Y, LDY);
  }
  dtrmm(
      'RIGHT', 'Upper', 'NO TRANSPOSE', 'NON-UNIT', K, NB, ONE, T, LDT, Y, LDY);
}