LAPACK  3.8.0
LAPACK: Linear Algebra PACKage

◆ zhesv()

subroutine zhesv ( character  UPLO,
integer  N,
integer  NRHS,
complex*16, dimension( lda, * )  A,
integer  LDA,
integer, dimension( * )  IPIV,
complex*16, dimension( ldb, * )  B,
integer  LDB,
complex*16, dimension( * )  WORK,
integer  LWORK,
integer  INFO 
)

ZHESV computes the solution to system of linear equations A * X = B for HE matrices

Download ZHESV + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 ZHESV computes the solution to a complex system of linear equations
    A * X = B,
 where A is an N-by-N Hermitian matrix and X and B are N-by-NRHS
 matrices.

 The diagonal pivoting method is used to factor A as
    A = U * D * U**H,  if UPLO = 'U', or
    A = L * D * L**H,  if UPLO = 'L',
 where U (or L) is a product of permutation and unit upper (lower)
 triangular matrices, and D is Hermitian and block diagonal with
 1-by-1 and 2-by-2 diagonal blocks.  The factored form of A is then
 used to solve the system of equations A * X = B.
Parameters
[in]UPLO
          UPLO is CHARACTER*1
          = 'U':  Upper triangle of A is stored;
          = 'L':  Lower triangle of A is stored.
[in]N
          N is INTEGER
          The number of linear equations, i.e., the order of the
          matrix A.  N >= 0.
[in]NRHS
          NRHS is INTEGER
          The number of right hand sides, i.e., the number of columns
          of the matrix B.  NRHS >= 0.
[in,out]A
          A is COMPLEX*16 array, dimension (LDA,N)
          On entry, the Hermitian matrix A.  If UPLO = 'U', the leading
          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', the
          leading 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.

          On exit, if INFO = 0, the block diagonal matrix D and the
          multipliers used to obtain the factor U or L from the
          factorization A = U*D*U**H or A = L*D*L**H as computed by
          ZHETRF.
[in]LDA
          LDA is INTEGER
          The leading dimension of the array A.  LDA >= max(1,N).
[out]IPIV
          IPIV is INTEGER array, dimension (N)
          Details of the interchanges and the block structure of D, as
          determined by ZHETRF.  If IPIV(k) > 0, then rows and columns
          k and IPIV(k) were interchanged, and D(k,k) is a 1-by-1
          diagonal block.  If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0,
          then rows and columns k-1 and -IPIV(k) were interchanged and
          D(k-1:k,k-1:k) is a 2-by-2 diagonal block.  If UPLO = 'L' and
          IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and
          -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2
          diagonal block.
[in,out]B
          B is COMPLEX*16 array, dimension (LDB,NRHS)
          On entry, the N-by-NRHS right hand side matrix B.
          On exit, if INFO = 0, the N-by-NRHS solution matrix X.
[in]LDB
          LDB is INTEGER
          The leading dimension of the array B.  LDB >= max(1,N).
[out]WORK
          WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
[in]LWORK
          LWORK is INTEGER
          The length of WORK.  LWORK >= 1, and for best performance
          LWORK >= max(1,N*NB), where NB is the optimal blocksize for
          ZHETRF.
          for LWORK < N, TRS will be done with Level BLAS 2
          for LWORK >= N, TRS will be done with Level BLAS 3

          If LWORK = -1, then a workspace query is assumed; the routine
          only calculates the optimal size of the WORK array, returns
          this value as the first entry of the WORK array, and no error
          message related to LWORK is issued by XERBLA.
[out]INFO
          INFO is INTEGER
          = 0: successful exit
          < 0: if INFO = -i, the i-th argument had an illegal value
          > 0: if INFO = i, D(i,i) is exactly zero.  The factorization
               has been completed, but the block diagonal matrix D is
               exactly singular, so the solution could not be computed.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Date
December 2016

Definition at line 173 of file zhesv.f.

173 *
174 * -- LAPACK driver routine (version 3.7.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 * December 2016
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 *
subroutine zhetrs(UPLO, N, NRHS, A, LDA, IPIV, B, LDB, INFO)
ZHETRS
Definition: zhetrs.f:122
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV
Definition: tstiee.f:83
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:55
subroutine zhetrf(UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
ZHETRF
Definition: zhetrf.f:179
subroutine zhetrs2(UPLO, N, NRHS, A, LDA, IPIV, B, LDB, WORK, INFO)
ZHETRS2
Definition: zhetrs2.f:129
Here is the call graph for this function:
Here is the caller graph for this function: