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