dlantp function

double dlantp(
  1. String NORM,
  2. String UPLO,
  3. String DIAG,
  4. int N,
  5. Array<double> AP_,
  6. Array<double> WORK_,
)

Implementation

double dlantp(
  final String NORM,
  final String UPLO,
  final String DIAG,
  final int N,
  final Array<double> AP_,
  final Array<double> WORK_,
) {
  final AP = AP_.having();
  final WORK = WORK_.having();
  const ONE = 1.0, ZERO = 0.0;
  bool UDIAG;
  int I, J, K;
  double VALUE = 0;
  final SCALE = Box(0.0), SUM = Box(0.0);

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

    K = 1;
    if (lsame(DIAG, 'U')) {
      VALUE = ONE;
      if (lsame(UPLO, 'U')) {
        for (J = 1; J <= N; J++) {
          for (I = K; I <= K + J - 2; I++) {
            SUM.value = AP[I].abs();
            if (VALUE < SUM.value || disnan(SUM.value)) VALUE = SUM.value;
          }
          K += J;
        }
      } else {
        for (J = 1; J <= N; J++) {
          for (I = K + 1; I <= K + N - J; I++) {
            SUM.value = AP[I].abs();
            if (VALUE < SUM.value || disnan(SUM.value)) VALUE = SUM.value;
          }
          K += N - J + 1;
        }
      }
    } else {
      VALUE = ZERO;
      if (lsame(UPLO, 'U')) {
        for (J = 1; J <= N; J++) {
          for (I = K; I <= K + J - 1; I++) {
            SUM.value = AP[I].abs();
            if (VALUE < SUM.value || disnan(SUM.value)) VALUE = SUM.value;
          }
          K += J;
        }
      } else {
        for (J = 1; J <= N; J++) {
          for (I = K; I <= K + N - J; I++) {
            SUM.value = AP[I].abs();
            if (VALUE < SUM.value || disnan(SUM.value)) VALUE = SUM.value;
          }
          K += N - J + 1;
        }
      }
    }
  } else if ((lsame(NORM, 'O')) || (NORM == '1')) {
    // Find norm1(A).

    VALUE = ZERO;
    K = 1;
    UDIAG = lsame(DIAG, 'U');
    if (lsame(UPLO, 'U')) {
      for (J = 1; J <= N; J++) {
        if (UDIAG) {
          SUM.value = ONE;
          for (I = K; I <= K + J - 2; I++) {
            SUM.value += AP[I].abs();
          }
        } else {
          SUM.value = ZERO;
          for (I = K; I <= K + J - 1; I++) {
            SUM.value += AP[I].abs();
          }
        }
        K += J;
        if (VALUE < SUM.value || disnan(SUM.value)) VALUE = SUM.value;
      }
    } else {
      for (J = 1; J <= N; J++) {
        if (UDIAG) {
          SUM.value = ONE;
          for (I = K + 1; I <= K + N - J; I++) {
            SUM.value += AP[I].abs();
          }
        } else {
          SUM.value = ZERO;
          for (I = K; I <= K + N - J; I++) {
            SUM.value += AP[I].abs();
          }
        }
        K += N - J + 1;
        if (VALUE < SUM.value || disnan(SUM.value)) VALUE = SUM.value;
      }
    }
  } else if (lsame(NORM, 'I')) {
    // Find normI(A).

    K = 1;
    if (lsame(UPLO, 'U')) {
      if (lsame(DIAG, 'U')) {
        for (I = 1; I <= N; I++) {
          WORK[I] = ONE;
        }
        for (J = 1; J <= N; J++) {
          for (I = 1; I <= J - 1; I++) {
            WORK[I] += AP[K].abs();
            K++;
          }
          K++;
        }
      } else {
        for (I = 1; I <= N; I++) {
          WORK[I] = ZERO;
        }
        for (J = 1; J <= N; J++) {
          for (I = 1; I <= J; I++) {
            WORK[I] += AP[K].abs();
            K++;
          }
        }
      }
    } else {
      if (lsame(DIAG, 'U')) {
        for (I = 1; I <= N; I++) {
          WORK[I] = ONE;
        }
        for (J = 1; J <= N; J++) {
          K++;
          for (I = J + 1; I <= N; I++) {
            WORK[I] += AP[K].abs();
            K++;
          }
        }
      } else {
        for (I = 1; I <= N; I++) {
          WORK[I] = ZERO;
        }
        for (J = 1; J <= N; J++) {
          for (I = J; I <= N; I++) {
            WORK[I] += AP[K].abs();
            K++;
          }
        }
      }
    }
    VALUE = ZERO;
    for (I = 1; I <= N; I++) {
      SUM.value = WORK[I];
      if (VALUE < SUM.value || disnan(SUM.value)) VALUE = SUM.value;
    }
  } else if ((lsame(NORM, 'F')) || (lsame(NORM, 'E'))) {
    // Find normF(A).

    if (lsame(UPLO, 'U')) {
      if (lsame(DIAG, 'U')) {
        SCALE.value = ONE;
        SUM.value = N.toDouble();
        K = 2;
        for (J = 2; J <= N; J++) {
          dlassq(J - 1, AP(K), 1, SCALE, SUM);
          K += J;
        }
      } else {
        SCALE.value = ZERO;
        SUM.value = ONE;
        K = 1;
        for (J = 1; J <= N; J++) {
          dlassq(J, AP(K), 1, SCALE, SUM);
          K += J;
        }
      }
    } else {
      if (lsame(DIAG, 'U')) {
        SCALE.value = ONE;
        SUM.value = N.toDouble();
        K = 2;
        for (J = 1; J <= N - 1; J++) {
          dlassq(N - J, AP(K), 1, SCALE, SUM);
          K += N - J + 1;
        }
      } else {
        SCALE.value = ZERO;
        SUM.value = ONE;
        K = 1;
        for (J = 1; J <= N; J++) {
          dlassq(N - J + 1, AP(K), 1, SCALE, SUM);
          K += N - J + 1;
        }
      }
    }
    VALUE = SCALE.value * sqrt(SUM.value);
  }

  return VALUE;
}