1*> \brief <b> ZHESV computes the solution to system of linear equations A * X = B for HE matrices</b> 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download ZHESV + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zhesv.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zhesv.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zhesv.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE ZHESV( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK, 22* LWORK, INFO ) 23* 24* .. Scalar Arguments .. 25* CHARACTER UPLO 26* INTEGER INFO, LDA, LDB, LWORK, N, NRHS 27* .. 28* .. Array Arguments .. 29* INTEGER IPIV( * ) 30* COMPLEX*16 A( LDA, * ), B( LDB, * ), WORK( * ) 31* .. 32* 33* 34*> \par Purpose: 35* ============= 36*> 37*> \verbatim 38*> 39*> ZHESV computes the solution to a complex system of linear equations 40*> A * X = B, 41*> where A is an N-by-N Hermitian matrix and X and B are N-by-NRHS 42*> matrices. 43*> 44*> The diagonal pivoting method is used to factor A as 45*> A = U * D * U**H, if UPLO = 'U', or 46*> A = L * D * L**H, if UPLO = 'L', 47*> where U (or L) is a product of permutation and unit upper (lower) 48*> triangular matrices, and D is Hermitian and block diagonal with 49*> 1-by-1 and 2-by-2 diagonal blocks. The factored form of A is then 50*> used to solve the system of equations A * X = B. 51*> \endverbatim 52* 53* Arguments: 54* ========== 55* 56*> \param[in] UPLO 57*> \verbatim 58*> UPLO is CHARACTER*1 59*> = 'U': Upper triangle of A is stored; 60*> = 'L': Lower triangle of A is stored. 61*> \endverbatim 62*> 63*> \param[in] N 64*> \verbatim 65*> N is INTEGER 66*> The number of linear equations, i.e., the order of the 67*> matrix A. N >= 0. 68*> \endverbatim 69*> 70*> \param[in] NRHS 71*> \verbatim 72*> NRHS is INTEGER 73*> The number of right hand sides, i.e., the number of columns 74*> of the matrix B. NRHS >= 0. 75*> \endverbatim 76*> 77*> \param[in,out] A 78*> \verbatim 79*> A is COMPLEX*16 array, dimension (LDA,N) 80*> On entry, the Hermitian matrix A. If UPLO = 'U', the leading 81*> N-by-N upper triangular part of A contains the upper 82*> triangular part of the matrix A, and the strictly lower 83*> triangular part of A is not referenced. If UPLO = 'L', the 84*> leading N-by-N lower triangular part of A contains the lower 85*> triangular part of the matrix A, and the strictly upper 86*> triangular part of A is not referenced. 87*> 88*> On exit, if INFO = 0, the block diagonal matrix D and the 89*> multipliers used to obtain the factor U or L from the 90*> factorization A = U*D*U**H or A = L*D*L**H as computed by 91*> ZHETRF. 92*> \endverbatim 93*> 94*> \param[in] LDA 95*> \verbatim 96*> LDA is INTEGER 97*> The leading dimension of the array A. LDA >= max(1,N). 98*> \endverbatim 99*> 100*> \param[out] IPIV 101*> \verbatim 102*> IPIV is INTEGER array, dimension (N) 103*> Details of the interchanges and the block structure of D, as 104*> determined by ZHETRF. If IPIV(k) > 0, then rows and columns 105*> k and IPIV(k) were interchanged, and D(k,k) is a 1-by-1 106*> diagonal block. If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, 107*> then rows and columns k-1 and -IPIV(k) were interchanged and 108*> D(k-1:k,k-1:k) is a 2-by-2 diagonal block. If UPLO = 'L' and 109*> IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and 110*> -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 111*> diagonal block. 112*> \endverbatim 113*> 114*> \param[in,out] B 115*> \verbatim 116*> B is COMPLEX*16 array, dimension (LDB,NRHS) 117*> On entry, the N-by-NRHS right hand side matrix B. 118*> On exit, if INFO = 0, the N-by-NRHS solution matrix X. 119*> \endverbatim 120*> 121*> \param[in] LDB 122*> \verbatim 123*> LDB is INTEGER 124*> The leading dimension of the array B. LDB >= max(1,N). 125*> \endverbatim 126*> 127*> \param[out] WORK 128*> \verbatim 129*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) 130*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. 131*> \endverbatim 132*> 133*> \param[in] LWORK 134*> \verbatim 135*> LWORK is INTEGER 136*> The length of WORK. LWORK >= 1, and for best performance 137*> LWORK >= max(1,N*NB), where NB is the optimal blocksize for 138*> ZHETRF. 139*> for LWORK < N, TRS will be done with Level BLAS 2 140*> for LWORK >= N, TRS will be done with Level BLAS 3 141*> 142*> If LWORK = -1, then a workspace query is assumed; the routine 143*> only calculates the optimal size of the WORK array, returns 144*> this value as the first entry of the WORK array, and no error 145*> message related to LWORK is issued by XERBLA. 146*> \endverbatim 147*> 148*> \param[out] INFO 149*> \verbatim 150*> INFO is INTEGER 151*> = 0: successful exit 152*> < 0: if INFO = -i, the i-th argument had an illegal value 153*> > 0: if INFO = i, D(i,i) is exactly zero. The factorization 154*> has been completed, but the block diagonal matrix D is 155*> exactly singular, so the solution could not be computed. 156*> \endverbatim 157* 158* Authors: 159* ======== 160* 161*> \author Univ. of Tennessee 162*> \author Univ. of California Berkeley 163*> \author Univ. of Colorado Denver 164*> \author NAG Ltd. 165* 166*> \date November 2011 167* 168*> \ingroup complex16HEsolve 169* 170* ===================================================================== 171 SUBROUTINE ZHESV( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK, 172 $ LWORK, INFO ) 173* 174* -- LAPACK driver routine (version 3.4.0) -- 175* -- LAPACK is a software package provided by Univ. of Tennessee, -- 176* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 177* November 2011 178* 179* .. Scalar Arguments .. 180 CHARACTER UPLO 181 INTEGER INFO, LDA, LDB, LWORK, N, NRHS 182* .. 183* .. Array Arguments .. 184 INTEGER IPIV( * ) 185 COMPLEX*16 A( LDA, * ), B( LDB, * ), WORK( * ) 186* .. 187* 188* ===================================================================== 189* 190* .. Local Scalars .. 191 LOGICAL LQUERY 192 INTEGER LWKOPT, NB 193* .. 194* .. External Functions .. 195 LOGICAL LSAME 196 INTEGER ILAENV 197 EXTERNAL LSAME, ILAENV 198* .. 199* .. External Subroutines .. 200 EXTERNAL XERBLA, ZHETRF, ZHETRS, ZHETRS2 201* .. 202* .. Intrinsic Functions .. 203 INTRINSIC MAX 204* .. 205* .. Executable Statements .. 206* 207* Test the input parameters. 208* 209 INFO = 0 210 LQUERY = ( LWORK.EQ.-1 ) 211 IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN 212 INFO = -1 213 ELSE IF( N.LT.0 ) THEN 214 INFO = -2 215 ELSE IF( NRHS.LT.0 ) THEN 216 INFO = -3 217 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN 218 INFO = -5 219 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN 220 INFO = -8 221 ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN 222 INFO = -10 223 END IF 224* 225 IF( INFO.EQ.0 ) THEN 226 IF( N.EQ.0 ) THEN 227 LWKOPT = 1 228 ELSE 229 NB = ILAENV( 1, 'ZHETRF', UPLO, N, -1, -1, -1 ) 230 LWKOPT = N*NB 231 END IF 232 WORK( 1 ) = LWKOPT 233 END IF 234* 235 IF( INFO.NE.0 ) THEN 236 CALL XERBLA( 'ZHESV ', -INFO ) 237 RETURN 238 ELSE IF( LQUERY ) THEN 239 RETURN 240 END IF 241* 242* Compute the factorization A = U*D*U**H or A = L*D*L**H. 243* 244 CALL ZHETRF( UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO ) 245 IF( INFO.EQ.0 ) THEN 246* 247* Solve the system A*X = B, overwriting B with X. 248* 249 IF ( LWORK.LT.N ) THEN 250* 251* Solve with TRS ( Use Level BLAS 2) 252* 253 CALL ZHETRS( UPLO, N, NRHS, A, LDA, IPIV, B, LDB, INFO ) 254* 255 ELSE 256* 257* Solve with TRS2 ( Use Level BLAS 3) 258* 259 CALL ZHETRS2( UPLO,N,NRHS,A,LDA,IPIV,B,LDB,WORK,INFO ) 260* 261 END IF 262* 263 END IF 264* 265 WORK( 1 ) = LWKOPT 266* 267 RETURN 268* 269* End of ZHESV 270* 271 END 272