dsysvxx function
void
dsysvxx(
- String FACT,
- String UPLO,
- int N,
- int NRHS,
- Matrix<
double> A_, - int LDA,
- Matrix<
double> AF_, - int LDAF,
- Array<
int> IPIV_, - Box<
String> EQUED, - Array<
double> S_, - Matrix<
double> B_, - int LDB,
- Matrix<
double> 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<
double> WORK_, - Array<
int> IWORK_, - Box<
int> INFO,
Implementation
void dsysvxx(
final String FACT,
final String UPLO,
final int N,
final int NRHS,
final Matrix<double> A_,
final int LDA,
final Matrix<double> AF_,
final int LDAF,
final Array<int> IPIV_,
final Box<String> EQUED,
final Array<double> S_,
final Matrix<double> B_,
final int LDB,
final Matrix<double> 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<double> WORK_,
final Array<int> IWORK_,
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 S = S_.having();
final BERR = BERR_.having();
final ERR_BNDS_NORM = ERR_BNDS_NORM_.having(ld: NRHS);
final ERR_BNDS_COMP = ERR_BNDS_COMP_.having(ld: NRHS);
final PARAMS = PARAMS_.having();
final WORK = WORK_.having();
final IWORK = IWORK_.having();
const ZERO = 0.0, ONE = 1.0;
// const FINAL_NRM_ERR_I = 1, FINAL_CMP_ERR_I = 2, BERR_I = 3;
// const RCOND_I = 4, NRM_RCOND_I = 5, NRM_ERR_I = 6;
// const CMP_RCOND_I = 7, CMP_ERR_I = 8, PIV_GROWTH_I = 9;
bool EQUIL, NOFACT, RCEQU;
int J;
double BIGNUM, SMIN, SMAX, SMLNUM;
final SCOND = Box(0.0), AMAX = Box(0.0);
final INFEQU = Box(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 DSYRFSX.
RPVGRW.value = ZERO;
// Test the input parameters. PARAMS is not tested until DSYRFSX.
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 = -10;
} 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 = -11;
} 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 = -13;
} else if (LDX < max(1, N)) {
INFO.value = -15;
}
}
}
if (INFO.value != 0) {
xerbla('DSYSVXX', -INFO.value);
return;
}
if (EQUIL) {
// Compute row and column scalings to equilibrate the matrix A.
dsyequb(UPLO, N, A, LDA, S, SCOND, AMAX, WORK, INFEQU);
if (INFEQU.value == 0) {
// Equilibrate the matrix.
dlaqsy(UPLO, N, A, LDA, S, SCOND.value, AMAX.value, EQUED);
RCEQU = lsame(EQUED.value, 'Y');
}
}
// Scale the right-hand side.
if (RCEQU) dlascl2(N, NRHS, S, B, LDB);
if (NOFACT || EQUIL) {
// Compute the LDL^T or UDU^T factorization of A.
dlacpy(UPLO, N, N, A, LDA, AF, LDAF);
dsytrf(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 =
dla_syrpvgrw(UPLO, N, INFO.value, A, LDA, AF, LDAF, IPIV, WORK);
}
return;
}
}
// Compute the reciprocal pivot growth factor RPVGRW.
if (N > 0) {
RPVGRW.value =
dla_syrpvgrw(UPLO, N, INFO.value, A, LDA, AF, LDAF, IPIV, WORK);
}
// Compute the solution matrix X.
dlacpy('Full', N, NRHS, B, LDB, X, LDX);
dsytrs(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.
dsyrfsx(
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,
IWORK,
INFO);
// Scale solutions.
if (RCEQU) {
dlascl2(N, NRHS, S, X, LDX);
}
}