zunghr function

void zunghr(
  1. int N,
  2. int ILO,
  3. int IHI,
  4. Matrix<Complex> A_,
  5. int LDA,
  6. Array<Complex> TAU_,
  7. Array<Complex> WORK_,
  8. int LWORK,
  9. Box<int> INFO,
)

Implementation

void zunghr(
  final int N,
  final int ILO,
  final int IHI,
  final Matrix<Complex> A_,
  final int LDA,
  final Array<Complex> TAU_,
  final Array<Complex> WORK_,
  final int LWORK,
  final Box<int> INFO,
) {
  final A = A_.having(ld: LDA);
  final TAU = TAU_.having();
  final WORK = WORK_.having();
  bool LQUERY;
  int I, J, LWKOPT = 0, NB, NH;
  final IINFO = Box(0);

  // Test the input arguments

  INFO.value = 0;
  NH = IHI - ILO;
  LQUERY = (LWORK == -1);
  if (N < 0) {
    INFO.value = -1;
  } else if (ILO < 1 || ILO > max(1, N)) {
    INFO.value = -2;
  } else if (IHI < min(ILO, N) || IHI > N) {
    INFO.value = -3;
  } else if (LDA < max(1, N)) {
    INFO.value = -5;
  } else if (LWORK < max(1, NH) && !LQUERY) {
    INFO.value = -8;
  }

  if (INFO.value == 0) {
    NB = ilaenv(1, 'ZUNGQR', ' ', NH, NH, NH, -1);
    LWKOPT = max(1, NH) * NB;
    WORK[1] = LWKOPT.toComplex();
  }

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

  // Quick return if possible

  if (N == 0) {
    WORK[1] = Complex.one;
    return;
  }

  // Shift the vectors which define the elementary reflectors one
  // column to the right, and set the first ilo and the last n-ihi
  // rows and columns to those of the unit matrix

  for (J = IHI; J >= ILO + 1; J--) {
    for (I = 1; I <= J - 1; I++) {
      A[I][J] = Complex.zero;
    }
    for (I = J + 1; I <= IHI; I++) {
      A[I][J] = A[I][J - 1];
    }
    for (I = IHI + 1; I <= N; I++) {
      A[I][J] = Complex.zero;
    }
  }
  for (J = 1; J <= ILO; J++) {
    for (I = 1; I <= N; I++) {
      A[I][J] = Complex.zero;
    }
    A[J][J] = Complex.one;
  }
  for (J = IHI + 1; J <= N; J++) {
    for (I = 1; I <= N; I++) {
      A[I][J] = Complex.zero;
    }
    A[J][J] = Complex.one;
  }

  if (NH > 0) {
    // Generate Q(ilo+1:ihi,ilo+1:ihi)

    zungqr(NH, NH, NH, A(ILO + 1, ILO + 1), LDA, TAU(ILO), WORK, LWORK, IINFO);
  }
  WORK[1] = LWKOPT.toComplex();
}