zsysvx function
void
zsysvx(
- String FACT,
- String UPLO,
- int N,
- int NRHS,
- Matrix<
Complex> A_, - int LDA,
- Matrix<
Complex> AF_, - int LDAF,
- Array<
int> IPIV_, - Matrix<
Complex> B_, - int LDB,
- Matrix<
Complex> X_, - int LDX,
- Box<
double> RCOND, - Array<
double> FERR_, - Array<
double> BERR_, - Array<
Complex> WORK_, - int LWORK,
- Array<
double> RWORK_, - Box<
int> INFO,
Implementation
void zsysvx(
final String FACT,
final String UPLO,
final int N,
final int NRHS,
final Matrix<Complex> A_,
final int LDA,
final Matrix<Complex> AF_,
final int LDAF,
final Array<int> IPIV_,
final Matrix<Complex> B_,
final int LDB,
final Matrix<Complex> X_,
final int LDX,
final Box<double> RCOND,
final Array<double> FERR_,
final Array<double> BERR_,
final Array<Complex> WORK_,
final int LWORK,
final Array<double> RWORK_,
final Box<int> INFO,
) {
final A = A_.having(ld: LDA);
final AF = AF_.having(ld: LDAF);
final IPIV = IPIV_.having();
final B = B_.having(ld: LDB);
final X = X_.having(ld: LDX);
final WORK = WORK_.having();
final RWORK = RWORK_.having();
final FERR = FERR_.having();
final BERR = BERR_.having();
const ZERO = 0.0;
bool LQUERY, NOFACT;
int LWKOPT = 0, NB;
double ANORM;
// Test the input parameters.
INFO.value = 0;
NOFACT = lsame(FACT, 'N');
LQUERY = (LWORK == -1);
if (!NOFACT && !lsame(FACT, 'F')) {
INFO.value = -1;
} else if (!lsame(UPLO, 'U') && !lsame(UPLO, 'L')) {
INFO.value = -2;
} else if (N < 0) {
INFO.value = -3;
} else if (NRHS < 0) {
INFO.value = -4;
} else if (LDA < max(1, N)) {
INFO.value = -6;
} else if (LDAF < max(1, N)) {
INFO.value = -8;
} else if (LDB < max(1, N)) {
INFO.value = -11;
} else if (LDX < max(1, N)) {
INFO.value = -13;
} else if (LWORK < max(1, 2 * N) && !LQUERY) {
INFO.value = -18;
}
if (INFO.value == 0) {
LWKOPT = max(1, 2 * N);
if (NOFACT) {
NB = ilaenv(1, 'ZSYTRF', UPLO, N, -1, -1, -1);
LWKOPT = max(LWKOPT, N * NB);
}
WORK[1] = LWKOPT.toComplex();
}
if (INFO.value != 0) {
xerbla('ZSYSVX', -INFO.value);
return;
} else if (LQUERY) {
return;
}
if (NOFACT) {
// Compute the factorization A = U*D*U**T or A = L*D*L**T.
zlacpy(UPLO, N, N, A, LDA, AF, LDAF);
zsytrf(UPLO, N, AF, LDAF, IPIV, WORK, LWORK, INFO);
// Return if INFO is non-zero.
if (INFO.value > 0) {
RCOND.value = ZERO;
return;
}
}
// Compute the norm of the matrix A.
ANORM = zlansy('I', UPLO, N, A, LDA, RWORK);
// Compute the reciprocal of the condition number of A.
zsycon(UPLO, N, AF, LDAF, IPIV, ANORM, RCOND, WORK, INFO);
// Compute the solution vectors X.
zlacpy('Full', N, NRHS, B, LDB, X, LDX);
zsytrs(UPLO, N, NRHS, AF, LDAF, IPIV, X, LDX, INFO);
// Use iterative refinement to improve the computed solutions and
// compute error bounds and backward error estimates for them.
zsyrfs(UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B, LDB, X, LDX, FERR, BERR,
WORK, RWORK, INFO);
// Set INFO = N+1 if the matrix is singular to working precision.
if (RCOND.value < dlamch('Epsilon')) INFO.value = N + 1;
WORK[1] = LWKOPT.toComplex();
}