zlangt function

double zlangt(
  1. String NORM,
  2. int N,
  3. Array<Complex> DL_,
  4. Array<Complex> D_,
  5. Array<Complex> DU_,
)

Implementation

double zlangt(
  final String NORM,
  final int N,
  final Array<Complex> DL_,
  final Array<Complex> D_,
  final Array<Complex> DU_,
) {
  final DL = DL_.having();
  final D = D_.having();
  final DU = DU_.having();
  const ONE = 1.0, ZERO = 0.0;
  int I;
  double ANORM = 0, TEMP;
  final SCALE = Box(0.0), SUM = Box(0.0);

  if (N <= 0) {
    ANORM = ZERO;
  } else if (lsame(NORM, 'M')) {
    // Find max(abs(A(i,j))).

    ANORM = D[N].abs();
    for (I = 1; I <= N - 1; I++) {
      if (ANORM < DL[I].abs() || disnan(DL[I].abs())) ANORM = DL[I].abs();
      if (ANORM < D[I].abs() || disnan(D[I].abs())) ANORM = D[I].abs();
      if (ANORM < DU[I].abs() || disnan(DU[I].abs())) ANORM = DU[I].abs();
    }
  } else if (lsame(NORM, 'O') || NORM == '1') {
    // Find norm1(A).

    if (N == 1) {
      ANORM = D[1].abs();
    } else {
      ANORM = D[1].abs() + DL[1].abs();
      TEMP = D[N].abs() + DU[N - 1].abs();
      if (ANORM < TEMP || disnan(TEMP)) ANORM = TEMP;
      for (I = 2; I <= N - 1; I++) {
        TEMP = D[I].abs() + DL[I].abs() + DU[I - 1].abs();
        if (ANORM < TEMP || disnan(TEMP)) ANORM = TEMP;
      }
    }
  } else if (lsame(NORM, 'I')) {
    // Find normI(A).

    if (N == 1) {
      ANORM = D[1].abs();
    } else {
      ANORM = D[1].abs() + DU[1].abs();
      TEMP = D[N].abs() + DL[N - 1].abs();
      if (ANORM < TEMP || disnan(TEMP)) ANORM = TEMP;
      for (I = 2; I <= N - 1; I++) {
        TEMP = D[I].abs() + DU[I].abs() + DL[I - 1].abs();
        if (ANORM < TEMP || disnan(TEMP)) ANORM = TEMP;
      }
    }
  } else if ((lsame(NORM, 'F')) || (lsame(NORM, 'E'))) {
    // Find normF(A).

    SCALE.value = ZERO;
    SUM.value = ONE;
    zlassq(N, D, 1, SCALE, SUM);
    if (N > 1) {
      zlassq(N - 1, DL, 1, SCALE, SUM);
      zlassq(N - 1, DU, 1, SCALE, SUM);
    }
    ANORM = SCALE.value * sqrt(SUM.value);
  }

  return ANORM;
}