dlaswlq function

void dlaswlq(
  1. int M,
  2. int N,
  3. int MB,
  4. int NB,
  5. Matrix<double> A_,
  6. int LDA,
  7. Matrix<double> T_,
  8. int LDT,
  9. Array<double> WORK_,
  10. int LWORK,
  11. Box<int> INFO,
)

Implementation

void dlaswlq(
  final int M,
  final int N,
  final int MB,
  final int NB,
  final Matrix<double> A_,
  final int LDA,
  final Matrix<double> T_,
  final int LDT,
  final Array<double> WORK_,
  final int LWORK,
  final Box<int> INFO,
) {
  final A = A_.having(ld: LDA);
  final T = T_.having(ld: LDT);
  final WORK = WORK_.having();
  bool LQUERY;
  int I, II, KK, CTR, MINMN, LWMIN;

  // TEST THE INPUT ARGUMENTS

  INFO.value = 0;

  LQUERY = (LWORK == -1);

  MINMN = min(M, N);
  if (MINMN == 0) {
    LWMIN = 1;
  } else {
    LWMIN = M * MB;
  }

  if (M < 0) {
    INFO.value = -1;
  } else if (N < 0 || N < M) {
    INFO.value = -2;
  } else if (MB < 1 || (MB > M && M > 0)) {
    INFO.value = -3;
  } else if (NB < 0) {
    INFO.value = -4;
  } else if (LDA < max(1, M)) {
    INFO.value = -6;
  } else if (LDT < MB) {
    INFO.value = -8;
  } else if (LWORK < LWMIN && !LQUERY) {
    INFO.value = -10;
  }

  if (INFO.value == 0) {
    WORK[1] = LWMIN.toDouble();
  }

  if (INFO.value != 0) {
    xerbla('DLASWLQ', -INFO.value);
    return;
  } else if (LQUERY) {
    return;
  }

  // Quick return if possible

  if (MINMN == 0) {
    return;
  }

  // The LQ Decomposition

  if ((M >= N) || (NB <= M) || (NB >= N)) {
    dgelqt(M, N, MB, A, LDA, T, LDT, WORK, INFO);
    return;
  }

  KK = ((N - M) % (NB - M));
  II = N - KK + 1;

  // Compute the LQ factorization of the first block A(1:M,1:NB)

  dgelqt(M, NB, MB, A(1, 1), LDA, T, LDT, WORK, INFO);
  CTR = 1;

  for (I = NB + 1;
      (NB - M) < 0 ? I >= II - NB + M : I <= II - NB + M;
      I += (NB - M)) {
    // Compute the QR factorization of the current block A(1:M,I:I+NB-M)

    dtplqt(M, NB - M, 0, MB, A(1, 1), LDA, A(1, I), LDA, T(1, CTR * M + 1), LDT,
        WORK, INFO);
    CTR++;
  }

  // Compute the QR factorization of the last block A(1:M,II:N)

  if (II <= N) {
    dtplqt(M, KK, 0, MB, A(1, 1), LDA, A(1, II), LDA, T(1, CTR * M + 1), LDT,
        WORK, INFO);
  }

  WORK[1] = LWMIN.toDouble();
}