Contents

# ?hesvxx

Uses extra precise iterative refinement to compute the solution to the system of linear equations with a Hermitian indefinite coefficient matrix A applying the diagonal pivoting factorization.

## Syntax

Include Files
• mkl.h
Description
The routine uses the diagonal pivoting factorization to compute the solution to a complex/double complex system of linear equations
A*X
=
B
, where
A
is an
n
-by-
n
Hermitian matrix, the columns of matrix
B
are individual right-hand sides, and the columns of
X
are the corresponding solutions.
Both normwise and maximum componentwise error bounds are also provided on request. The routine returns a solution with a small guaranteed error (
O(eps)
, where
eps
is the working machine precision) unless the matrix is very ill-conditioned, in which case a warning is returned. Relevant condition numbers are also calculated and returned.
The routine accepts user-provided factorizations and equilibration factors; see definitions of the
fact
and
equed
options. Solving with refinement and using a factorization from a previous call of the routine also produces a solution with
O(eps)
errors or warnings but that may not be true for general user-provided factorizations and equilibration factors if they differ from what the routine would itself produce.
The routine
?hesvxx
performs the following steps:
1. If
fact
=
'E'
, scaling factors are computed to equilibrate the system:
diag
(
s
)*
A
*
diag
(
s
) *inv(
diag
(
s
))*
X
=
diag
(
s
)*
B
Whether or not the system will be equilibrated depends on the scaling of the matrix
A
, but if equilibration is used,
A
is overwritten by
diag
(
s
)*
A
*
diag
(
s
)
and
B
by
diag
(
s
)*
B
.
2. If
fact
=
'N'
or
'E'
, the LU decomposition is used to factor the matrix
A
(after equilibration if
fact
=
'E'
) as
A
=
U
*
D
*
U
T
, if
uplo
=
'U'
,
or
A
=
L
*
D
*
L
T
, if
uplo
=
'L'
,
where
U
or
L
is a product of permutation and unit upper (lower) triangular matrices, and
D
is a symmetric and block diagonal with 1-by-1 and 2-by-2 diagonal blocks.
3. If some
D
(
i
,
i
)=0
, so that
D
is exactly singular, the routine returns with
info
=
i
. Otherwise, the factored form of
A
is used to estimate the condition number of the matrix
A
(see the
rcond
parameter). If the reciprocal of the condition number is less than machine precision, the routine still goes on to solve for
X
and compute error bounds.
4. The system of equations is solved for
X
using the factored form of
A
.
5. By default, unless
params[0]
is set to zero, the routine applies iterative refinement to get a small error and error bounds. Refinement calculates the residual to at least twice the working precision.
6. If equilibration was used, the matrix
X
is premultiplied by
diag
(
r
)
so that it solves the original system before equilibration.
Input Parameters
matrix_layout
Specifies whether matrix storage layout is row major (
LAPACK_ROW_MAJOR
) or column major (
LAPACK_COL_MAJOR
).
fact
Must be
'F'
,
'N'
, or
'E'
.
Specifies whether or not the factored form of the matrix
A
is supplied on entry, and if not, whether the matrix
A
should be equilibrated before it is factored.
If
fact
=
'F'
, on entry,
af
and
ipiv
contain the factored form of
A
. If
equed
is not
'N'
, the matrix
A
has been equilibrated with scaling factors given by
s
. Parameters
a
,
af
, and
ipiv
are not modified.
If
fact
=
'N'
, the matrix
A
will be copied to
af
and factored.
If
fact
=
'E'
, the matrix
A
will be equilibrated, if necessary, copied to
af
and factored.
uplo
Must be
'U'
or
'L'
.
Indicates whether the upper or lower triangular part of
A
is stored:
If
uplo
=
'U'
, the upper triangle of
A
is stored.
If
uplo
=
'L'
, the lower triangle of
A
is stored.
n
The number of linear equations; the order of the matrix
A
;
n
0.
nrhs
The number of right-hand sides; the number of columns of the matrices
B
and
X
;
nrhs
0.
a
,
af
,
b
Arrays:
a
(size max(
lda
*
n
))
,
af
(size max(
ldaf
*
n
))
,
b
, (size max(
ldb
*
nrhs
) for column major layout and max(
ldb
*
n
) for row major layout),
.
The array
a
contains the Hermitian matrix
A
as specified by
uplo
. If
uplo
=
'U'
n
-by-
n
upper triangular part of
a
contains the upper triangular part of the matrix
A
and the strictly lower triangular part of
a
is not referenced. If
uplo
=
'L'
n
-by-
n
lower triangular part of
a
contains the lower triangular part of the matrix
A
and the strictly upper triangular part of
a
is not referenced.
The array
af
is an input argument if
fact
=
'F'
. It contains the block diagonal matrix
D
and the multipliers used to obtain the factor
U
and
L
from the factorization
A
=
U
*
D
*
U
T
or
A
=
L
*
D
*
L
T
as computed by
?hetrf
.
The array
b
contains the matrix
B
whose columns are the right-hand sides for the systems of equations.
lda
The leading dimension of the array
a
;
lda
max(1,
n
)
.
ldaf
The leading dimension of the array
af
;
ldaf
max(1,
n
)
.
ipiv
Array, size at least
max(1,
n
)
. The array
ipiv
is an input argument if
fact
=
'F'
. It contains details of the interchanges and the block structure of
D
as determined by
?sytrf
.
If
ipiv
[
k
-1]
> 0, rows and columns
k
and
ipiv
[
k
-1]
were interchanged and
D
k
,
k
) is a 1-by-1 diagonal block.
If
uplo
=
'U'
and
ipiv
[
i
] =
ipiv
[
i
- 1] =
m
< 0
,
D
has a 2-by-2 diagonal block in rows and columns
i
and
i
+ 1, and the
i
-th row and column of
A
were interchanged with the
m
-th row and column.
If
uplo
=
'L'
and
ipiv
[
i
] =
ipiv
[
i
- 1] =
m
< 0
,
D
has a 2-by-2 diagonal block in rows and columns
i
and
i
+ 1, and the (
i
+ 1)-st row and column of
A
were interchanged with the
m
-th row and column.
equed
Must be
'N'
or
'Y'
.
equed
is an input argument if
fact
=
'F'
. It specifies the form of equilibration that was done:
If
equed
=
'N'
, no equilibration was done (always true if
fact
=
'N'
).
if
equed
=
'Y'
, both row and column equilibration was done, that is,
A
has been replaced by
diag
(
s
)*
A
*
diag
(
s
)
.
s
Array, size (
n
). The array
s
contains the scale factors for
A
. If
equed
=
'Y'
,
A
is multiplied on the left and right by
diag(
s
)
.
This array is an input argument if
fact
=
'F'
only; otherwise it is an output argument.
If
fact
=
'F'
and
equed
=
'Y'
, each element of
s
must be positive.
Each element of
s
should be a power of the radix to ensure a reliable solution and error estimates. Scaling by powers of the radix does not cause rounding errors unless the result underflows or overflows. Rounding errors during scaling lead to refining with a matrix that is not equivalent to the input matrix, producing error estimates that may not be reliable.
ldb
The leading dimension of the array
b
;
ldb
max(1,
n
) for column major layout and
ldb
nrhs
for row major layout
.
ldx
The leading dimension of the output array
x
;
ldx
max(1,
n
) for column major layout and
ldx
nrhs
for row major layout
.
n_err_bnds
Number of error bounds to return for each right hand side and each type (normwise or componentwise). See
err_bnds_norm
and
err_bnds_comp
descriptions in the
Output Arguments
section below.
nparams
Specifies the number of parameters set in
params
. If
0, the
params
array is never referenced and default values are used.
params
Array, size
max(1,
nparams
)
. Specifies algorithm parameters. If an entry is less than 0.0, that entry is filled with the default value used for that parameter. Only positions up to
nparams
are accessed; defaults are used for higher-numbered parameters. If defaults are acceptable, you can pass
nparams
= 0, which prevents the source code from accessing the
params
argument.
params
[0]
: Whether to perform iterative refinement or not. Default: 1.0 (for single precision flavors), 1.0D+0 (for double precision flavors).
=0.0
No refinement is performed and no error bounds are computed.
=1.0
Use the extra-precise refinement algorithm.
(Other values are reserved for future use.)
params
[1]
: Maximum number of residual computations allowed for refinement.
Default
10
Aggressive
Set to 100 to permit convergence using approximate factorizations or factorizations other than
LU
. If the factorization uses a technique other than Gaussian elimination, the guarantees in
err_bnds_norm
and
err_bnds_comp
may no longer be trustworthy.
params
[2]
: Flag determining if the code will attempt to find a solution with a small componentwise relative error in the double-precision algorithm. Positive is true, 0.0 is false. Default: 1.0 (attempt componentwise convergence).
Output Parameters
x
Array, size
max(1,
ldx
*
nrhs
) for column major layout and max(1,
ldx
*
n
) for row major layout
.
If
info
= 0
, the array
x
contains the solution
n
-by-
nrhs
matrix
X
to the original system of equations. Note that
A
and
B
are modified on exit if
equed
'N'
, and the solution to the equilibrated system is:
inv(
diag
(
s
))*
X
.
a
If
fact
=
'E'
and
equed
=
'Y'
, overwritten by
diag
(
s
)*
A
*
diag
(
s
)
.
af
If
fact
=
'N'
,
af
is an output argument and on exit returns the block diagonal matrix
D
and the multipliers used to obtain the factor
U
or
L
from the factorization
A
=
U
*
D
*
U
T
or
A
=
L
*
D
*
L
T
.
b
If
equed
=
'N'
,
B
is not modified.
If
equed
=
'Y'
,
B
is overwritten by
diag
(
s
)*
B
.
s
This array is an output argument if
fact
'F'
. Each element of this array is a power of the radix. See the description of
s
in
Input Arguments
section.
r