dlarra function

void dlarra(
  1. int N,
  2. Array<double> D_,
  3. Array<double> E_,
  4. Array<double> E2_,
  5. double SPLTOL,
  6. double TNRM,
  7. Box<int> NSPLIT,
  8. Array<int> ISPLIT_,
  9. Box<int> INFO,
)

Implementation

void dlarra(
  final int N,
  final Array<double> D_,
  final Array<double> E_,
  final Array<double> E2_,
  final double SPLTOL,
  final double TNRM,
  final Box<int> NSPLIT,
  final Array<int> ISPLIT_,
  final Box<int> INFO,
) {
  final D = D_.having();
  final E = E_.having();
  final E2 = E2_.having();
  final ISPLIT = ISPLIT_.having();
  const ZERO = 0.0;
  int I;
  double EABS, TMP1;

  INFO.value = 0;
  NSPLIT.value = 1;

  // Quick return if possible

  if (N <= 0) {
    return;
  }

  // Compute splitting points
  if (SPLTOL < ZERO) {
    // Criterion based on absolute off-diagonal value
    TMP1 = SPLTOL.abs() * TNRM;
    for (I = 1; I <= N - 1; I++) {
      EABS = E[I].abs();
      if (EABS <= TMP1) {
        E[I] = ZERO;
        E2[I] = ZERO;
        ISPLIT[NSPLIT.value] = I;
        NSPLIT.value++;
      }
    }
  } else {
    // Criterion that guarantees relative accuracy
    for (I = 1; I <= N - 1; I++) {
      EABS = E[I].abs();
      if (EABS <= SPLTOL * sqrt(D[I].abs()) * sqrt(D[I + 1].abs())) {
        E[I] = ZERO;
        E2[I] = ZERO;
        ISPLIT[NSPLIT.value] = I;
        NSPLIT.value++;
      }
    }
  }
  ISPLIT[NSPLIT.value] = N;
}