zhesvxx function
void
zhesvxx(
- String FACT,
- String UPLO,
- int N,
- int NRHS,
- Matrix<
Complex> A_, - int LDA,
- Matrix<
Complex> AF_, - int LDAF,
- Array<
int> IPIV_, - Box<
String> EQUED, - Array<
double> S_, - Matrix<
Complex> B_, - int LDB,
- Matrix<
Complex> X_, - int LDX,
- Box<
double> RCOND, - Box<
double> RPVGRW, - Array<
double> BERR_, - int N_ERR_BNDS,
- Matrix<
double> ERR_BNDS_NORM_, - Matrix<
double> ERR_BNDS_COMP_, - int NPARAMS,
- Array<
double> PARAMS_, - Array<
Complex> WORK_, - Array<
double> RWORK_, - Box<
int> INFO,
Implementation
void zhesvxx(
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 Box<String> EQUED,
final Array<double> S_,
final Matrix<Complex> B_,
final int LDB,
final Matrix<Complex> X_,
final int LDX,
final Box<double> RCOND,
final Box<double> RPVGRW,
final Array<double> BERR_,
final int N_ERR_BNDS,
final Matrix<double> ERR_BNDS_NORM_,
final Matrix<double> ERR_BNDS_COMP_,
final int NPARAMS,
final Array<double> PARAMS_,
final Array<Complex> WORK_,
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 S = S_.having();
final BERR = BERR_.having();
final PARAMS = PARAMS_.having();
final ERR_BNDS_NORM = ERR_BNDS_NORM_.having(ld: NRHS);
final ERR_BNDS_COMP = ERR_BNDS_COMP_.having(ld: NRHS);
const ZERO = 0.0, ONE = 1.0;
bool EQUIL, NOFACT, RCEQU;
int J;
double BIGNUM, SMIN, SMAX, SMLNUM;
final INFEQU = Box(0);
final AMAX = Box(0.0), SCOND = Box(0.0);
INFO.value = 0;
NOFACT = lsame(FACT, 'N');
EQUIL = lsame(FACT, 'E');
SMLNUM = dlamch('Safe minimum');
BIGNUM = ONE / SMLNUM;
if (NOFACT || EQUIL) {
EQUED.value = 'N';
RCEQU = false;
} else {
RCEQU = lsame(EQUED.value, 'Y');
}
// Default is failure. If an input parameter is wrong or
// factorization fails, make everything look horrible. Only the
// pivot growth is set here, the rest is initialized in ZHERFSX.
RPVGRW.value = ZERO;
// Test the input parameters. PARAMS is not tested until ZHERFSX.
if (!NOFACT && !EQUIL && !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 (lsame(FACT, 'F') && !(RCEQU || lsame(EQUED.value, 'N'))) {
INFO.value = -9;
} else {
if (RCEQU) {
SMIN = BIGNUM;
SMAX = ZERO;
for (J = 1; J <= N; J++) {
SMIN = min(SMIN, S[J]);
SMAX = max(SMAX, S[J]);
}
if (SMIN <= ZERO) {
INFO.value = -10;
} else if (N > 0) {
SCOND.value = max(SMIN, SMLNUM) / min(SMAX, BIGNUM);
} else {
SCOND.value = ONE;
}
}
if (INFO.value == 0) {
if (LDB < max(1, N)) {
INFO.value = -12;
} else if (LDX < max(1, N)) {
INFO.value = -14;
}
}
}
if (INFO.value != 0) {
xerbla('ZHESVXX', -INFO.value);
return;
}
if (EQUIL) {
// Compute row and column scalings to equilibrate the matrix A.
zheequb(UPLO, N, A, LDA, S, SCOND, AMAX, WORK, INFEQU);
if (INFEQU.value == 0) {
// Equilibrate the matrix.
zlaqhe(UPLO, N, A, LDA, S, SCOND.value, AMAX.value, EQUED);
RCEQU = lsame(EQUED.value, 'Y');
}
}
// Scale the right-hand side.
if (RCEQU) zlascl2(N, NRHS, S, B, LDB);
if (NOFACT || EQUIL) {
// Compute the LDL^H or UDU^H factorization of A.
zlacpy(UPLO, N, N, A, LDA, AF, LDAF);
zhetrf(UPLO, N, AF, LDAF, IPIV, WORK, 5 * max(1, N), INFO);
// Return if INFO is non-zero.
if (INFO.value > 0) {
// Pivot in column INFO is exactly 0
// Compute the reciprocal pivot growth factor of the
// leading rank-deficient INFO columns of A.
if (N > 0) {
RPVGRW.value =
zla_herpvgrw(UPLO, N, INFO.value, A, LDA, AF, LDAF, IPIV, RWORK);
}
return;
}
}
// Compute the reciprocal pivot growth factor RPVGRW.
if (N > 0) {
RPVGRW.value =
zla_herpvgrw(UPLO, N, INFO.value, A, LDA, AF, LDAF, IPIV, RWORK);
}
// Compute the solution matrix X.
zlacpy('Full', N, NRHS, B, LDB, X, LDX);
zhetrs(UPLO, N, NRHS, AF, LDAF, IPIV, X, LDX, INFO);
// Use iterative refinement to improve the computed solution and
// compute error bounds and backward error estimates for it.
zherfsx(
UPLO,
EQUED.value,
N,
NRHS,
A,
LDA,
AF,
LDAF,
IPIV,
S,
B,
LDB,
X,
LDX,
RCOND,
BERR,
N_ERR_BNDS,
ERR_BNDS_NORM,
ERR_BNDS_COMP,
NPARAMS,
PARAMS,
WORK,
RWORK,
INFO);
// Scale solutions.
if (RCEQU) {
zlascl2(N, NRHS, S, X, LDX);
}
}