dpttrf function

void dpttrf(
  1. int N,
  2. Array<double> D_,
  3. Array<double> E_,
  4. Box<int> INFO,
)

Implementation

void dpttrf(
  final int N,
  final Array<double> D_,
  final Array<double> E_,
  final Box<int> INFO,
) {
  final D = D_.having();
  final E = E_.having();
  const ZERO = 0.0;
  int I, I4;
  double EI;

  // Test the input parameters.

  INFO.value = 0;
  if (N < 0) {
    INFO.value = -1;
    xerbla('DPTTRF', -INFO.value);
    return;
  }

  // Quick return if possible

  if (N == 0) return;

  // Compute the L*D*L**T (or U**T*D*U) factorization of A.

  I4 = ((N - 1) % 4);
  for (I = 1; I <= I4; I++) {
    if (D[I] <= ZERO) {
      INFO.value = I;
      return;
    }
    EI = E[I];
    E[I] = EI / D[I];
    D[I + 1] -= E[I] * EI;
  }

  for (I = I4 + 1; I <= N - 4; I += 4) {
    // Drop out of the loop if d[i] <= 0: the matrix is not positive
    // definite.

    if (D[I] <= ZERO) {
      INFO.value = I;
      return;
    }

    // Solve for e[i] and d[i+1].

    EI = E[I];
    E[I] = EI / D[I];
    D[I + 1] -= E[I] * EI;

    if (D[I + 1] <= ZERO) {
      INFO.value = I + 1;
      return;
    }

    // Solve for e[i+1] and d[i+2].

    EI = E[I + 1];
    E[I + 1] = EI / D[I + 1];
    D[I + 2] -= E[I + 1] * EI;

    if (D[I + 2] <= ZERO) {
      INFO.value = I + 2;
      return;
    }

    // Solve for e[i+2] and d[i+3].

    EI = E[I + 2];
    E[I + 2] = EI / D[I + 2];
    D[I + 3] -= E[I + 2] * EI;

    if (D[I + 3] <= ZERO) {
      INFO.value = I + 3;
      return;
    }

    // Solve for e[i+3] and d[i+4].

    EI = E[I + 3];
    E[I + 3] = EI / D[I + 3];
    D[I + 4] -= E[I + 3] * EI;
  }

  // Check d[n] for positive definiteness.

  if (D[N] <= ZERO) INFO.value = N;
}