zpotf2 function
Implementation
void zpotf2(
final String UPLO,
final int N,
final Matrix<Complex> A_,
final int LDA,
final Box<int> INFO,
) {
final A = A_.having(ld: LDA);
const ONE = 1.0, ZERO = 0.0;
bool UPPER;
int J;
double AJJ;
// Test the input parameters.
INFO.value = 0;
UPPER = lsame(UPLO, 'U');
if (!UPPER && !lsame(UPLO, 'L')) {
INFO.value = -1;
} else if (N < 0) {
INFO.value = -2;
} else if (LDA < max(1, N)) {
INFO.value = -4;
}
if (INFO.value != 0) {
xerbla('ZPOTF2', -INFO.value);
return;
}
// Quick return if possible
if (N == 0) return;
if (UPPER) {
// Compute the Cholesky factorization A = U**H *U.
for (J = 1; J <= N; J++) {
// Compute U(J,J) and test for non-positive-definiteness.
AJJ = A[J][J].real -
zdotc(J - 1, A(1, J).asArray(), 1, A(1, J).asArray(), 1).real;
if (AJJ <= ZERO || disnan(AJJ)) {
A[J][J] = AJJ.toComplex();
INFO.value = J;
return;
}
AJJ = sqrt(AJJ);
A[J][J] = AJJ.toComplex();
// Compute elements J+1:N of row J.
if (J < N) {
zlacgv(J - 1, A(1, J).asArray(), 1);
zgemv('Transpose', J - 1, N - J, -Complex.one, A(1, J + 1), LDA,
A(1, J).asArray(), 1, Complex.one, A(J, J + 1).asArray(), LDA);
zlacgv(J - 1, A(1, J).asArray(), 1);
zdscal(N - J, ONE / AJJ, A(J, J + 1).asArray(), LDA);
}
}
} else {
// Compute the Cholesky factorization A = L*L**H.
for (J = 1; J <= N; J++) {
// Compute L(J,J) and test for non-positive-definiteness.
AJJ = A[J][J].real -
zdotc(J - 1, A(J, 1).asArray(), LDA, A(J, 1).asArray(), LDA).real;
if (AJJ <= ZERO || disnan(AJJ)) {
A[J][J] = AJJ.toComplex();
INFO.value = J;
return;
}
AJJ = sqrt(AJJ);
A[J][J] = AJJ.toComplex();
// Compute elements J+1:N of column J.
if (J < N) {
zlacgv(J - 1, A(J, 1).asArray(), LDA);
zgemv('No transpose', N - J, J - 1, -Complex.one, A(J + 1, 1), LDA,
A(J, 1).asArray(), LDA, Complex.one, A(J + 1, J).asArray(), 1);
zlacgv(J - 1, A(J, 1).asArray(), LDA);
zdscal(N - J, ONE / AJJ, A(J + 1, J).asArray(), 1);
}
}
}
}