Annotation of rpl/lapack/lapack/zsysv_aa_2stage.f, revision 1.1
1.1 ! bertrand 1: *> \brief <b> ZSYSV_AA_2STAGE 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_2STAGE + dependencies
! 10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zsysv_aasen_2stage.f">
! 11: *> [TGZ]</a>
! 12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zsysv_aasen_2stage.f">
! 13: *> [ZIP]</a>
! 14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zsysv_aasen_2stage.f">
! 15: *> [TXT]</a>
! 16: *> \endhtmlonly
! 17: *
! 18: * Definition:
! 19: * ===========
! 20: *
! 21: * SUBROUTINE ZSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
! 22: * IPIV, IPIV2, B, LDB, WORK, LWORK,
! 23: * INFO )
! 24: *
! 25: * .. Scalar Arguments ..
! 26: * CHARACTER UPLO
! 27: * INTEGER N, NRHS, LDA, LTB, LDB, LWORK, INFO
! 28: * ..
! 29: * .. Array Arguments ..
! 30: * INTEGER IPIV( * ), IPIV2( * )
! 31: * COMPLEX*16 A( LDA, * ), TB( * ), B( LDB, *), WORK( * )
! 32: * ..
! 33: *
! 34: *> \par Purpose:
! 35: * =============
! 36: *>
! 37: *> \verbatim
! 38: *>
! 39: *> ZSYSV_AA_2STAGE computes the solution to a complex system of
! 40: *> linear equations
! 41: *> A * X = B,
! 42: *> where A is an N-by-N symmetric matrix and X and B are N-by-NRHS
! 43: *> matrices.
! 44: *>
! 45: *> Aasen's 2-stage algorithm is used to factor A as
! 46: *> A = U * T * U**H, if UPLO = 'U', or
! 47: *> A = L * T * L**H, if UPLO = 'L',
! 48: *> where U (or L) is a product of permutation and unit upper (lower)
! 49: *> triangular matrices, and T is symmetric and band. The matrix T is
! 50: *> then LU-factored with partial pivoting. The factored form of A
! 51: *> is then used to solve the system of equations A * X = B.
! 52: *>
! 53: *> This is the blocked version of the algorithm, calling Level 3 BLAS.
! 54: *> \endverbatim
! 55: *
! 56: * Arguments:
! 57: * ==========
! 58: *
! 59: *> \param[in] UPLO
! 60: *> \verbatim
! 61: *> UPLO is CHARACTER*1
! 62: *> = 'U': Upper triangle of A is stored;
! 63: *> = 'L': Lower triangle of A is stored.
! 64: *> \endverbatim
! 65: *>
! 66: *> \param[in] N
! 67: *> \verbatim
! 68: *> N is INTEGER
! 69: *> The order of the matrix A. N >= 0.
! 70: *> \endverbatim
! 71: *>
! 72: *> \param[in] NRHS
! 73: *> \verbatim
! 74: *> NRHS is INTEGER
! 75: *> The number of right hand sides, i.e., the number of columns
! 76: *> of the matrix B. NRHS >= 0.
! 77: *> \endverbatim
! 78: *>
! 79: *> \param[in,out] A
! 80: *> \verbatim
! 81: *> A is COMPLEX*16 array, dimension (LDA,N)
! 82: *> On entry, the symmetric matrix A. If UPLO = 'U', the leading
! 83: *> N-by-N upper triangular part of A contains the upper
! 84: *> triangular part of the matrix A, and the strictly lower
! 85: *> triangular part of A is not referenced. If UPLO = 'L', the
! 86: *> leading N-by-N lower triangular part of A contains the lower
! 87: *> triangular part of the matrix A, and the strictly upper
! 88: *> triangular part of A is not referenced.
! 89: *>
! 90: *> On exit, L is stored below (or above) the subdiaonal blocks,
! 91: *> when UPLO is 'L' (or 'U').
! 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] TB
! 101: *> \verbatim
! 102: *> TB is COMPLEX*16 array, dimension (LTB)
! 103: *> On exit, details of the LU factorization of the band matrix.
! 104: *> \endverbatim
! 105: *>
! 106: *> \param[in] LTB
! 107: *> \verbatim
! 108: *> The size of the array TB. LTB >= 4*N, internally
! 109: *> used to select NB such that LTB >= (3*NB+1)*N.
! 110: *>
! 111: *> If LTB = -1, then a workspace query is assumed; the
! 112: *> routine only calculates the optimal size of LTB,
! 113: *> returns this value as the first entry of TB, and
! 114: *> no error message related to LTB is issued by XERBLA.
! 115: *> \endverbatim
! 116: *>
! 117: *> \param[out] IPIV
! 118: *> \verbatim
! 119: *> IPIV is INTEGER array, dimension (N)
! 120: *> On exit, it contains the details of the interchanges, i.e.,
! 121: *> the row and column k of A were interchanged with the
! 122: *> row and column IPIV(k).
! 123: *> \endverbatim
! 124: *>
! 125: *> \param[out] IPIV2
! 126: *> \verbatim
! 127: *> IPIV is INTEGER array, dimension (N)
! 128: *> On exit, it contains the details of the interchanges, i.e.,
! 129: *> the row and column k of T were interchanged with the
! 130: *> row and column IPIV(k).
! 131: *> \endverbatim
! 132: *>
! 133: *> \param[in,out] B
! 134: *> \verbatim
! 135: *> B is COMPLEX*16 array, dimension (LDB,NRHS)
! 136: *> On entry, the right hand side matrix B.
! 137: *> On exit, the solution matrix X.
! 138: *> \endverbatim
! 139: *>
! 140: *> \param[in] LDB
! 141: *> \verbatim
! 142: *> LDB is INTEGER
! 143: *> The leading dimension of the array B. LDB >= max(1,N).
! 144: *> \endverbatim
! 145: *>
! 146: *> \param[out] WORK
! 147: *> \verbatim
! 148: *> WORK is COMPLEX*16 workspace of size LWORK
! 149: *> \endverbatim
! 150: *>
! 151: *> \param[in] LWORK
! 152: *> \verbatim
! 153: *> The size of WORK. LWORK >= N, internally used to select NB
! 154: *> such that LWORK >= N*NB.
! 155: *>
! 156: *> If LWORK = -1, then a workspace query is assumed; the
! 157: *> routine only calculates the optimal size of the WORK array,
! 158: *> returns this value as the first entry of the WORK array, and
! 159: *> no error message related to LWORK is issued by XERBLA.
! 160: *> \endverbatim
! 161: *>
! 162: *> \param[out] INFO
! 163: *> \verbatim
! 164: *> INFO is INTEGER
! 165: *> = 0: successful exit
! 166: *> < 0: if INFO = -i, the i-th argument had an illegal value.
! 167: *> > 0: if INFO = i, band LU factorization failed on i-th column
! 168: *> \endverbatim
! 169: *
! 170: * Authors:
! 171: * ========
! 172: *
! 173: *> \author Univ. of Tennessee
! 174: *> \author Univ. of California Berkeley
! 175: *> \author Univ. of Colorado Denver
! 176: *> \author NAG Ltd.
! 177: *
! 178: *> \date November 2017
! 179: *
! 180: *> \ingroup complex16SYcomputational
! 181: *
! 182: * =====================================================================
! 183: SUBROUTINE ZSYSV_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB,
! 184: $ IPIV, IPIV2, B, LDB, WORK, LWORK,
! 185: $ INFO )
! 186: *
! 187: * -- LAPACK computational routine (version 3.8.0) --
! 188: * -- LAPACK is a software package provided by Univ. of Tennessee, --
! 189: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
! 190: * November 2017
! 191: *
! 192: IMPLICIT NONE
! 193: *
! 194: * .. Scalar Arguments ..
! 195: CHARACTER UPLO
! 196: INTEGER N, NRHS, LDA, LDB, LTB, LWORK, INFO
! 197: * ..
! 198: * .. Array Arguments ..
! 199: INTEGER IPIV( * ), IPIV2( * )
! 200: COMPLEX*16 A( LDA, * ), B( LDB, * ), TB( * ), WORK( * )
! 201: * ..
! 202: *
! 203: * =====================================================================
! 204: *
! 205: * .. Local Scalars ..
! 206: LOGICAL UPPER, TQUERY, WQUERY
! 207: INTEGER LWKOPT
! 208: * ..
! 209: * .. External Functions ..
! 210: LOGICAL LSAME
! 211: EXTERNAL LSAME
! 212: * ..
! 213: * .. External Subroutines ..
! 214: EXTERNAL XERBLA, ZSYTRF_AA_2STAGE,
! 215: $ ZSYTRS_AA_2STAGE
! 216: * ..
! 217: * .. Intrinsic Functions ..
! 218: INTRINSIC MAX
! 219: * ..
! 220: * .. Executable Statements ..
! 221: *
! 222: * Test the input parameters.
! 223: *
! 224: INFO = 0
! 225: UPPER = LSAME( UPLO, 'U' )
! 226: WQUERY = ( LWORK.EQ.-1 )
! 227: TQUERY = ( LTB.EQ.-1 )
! 228: IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
! 229: INFO = -1
! 230: ELSE IF( N.LT.0 ) THEN
! 231: INFO = -2
! 232: ELSE IF( NRHS.LT.0 ) THEN
! 233: INFO = -3
! 234: ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
! 235: INFO = -5
! 236: ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
! 237: INFO = -11
! 238: END IF
! 239: *
! 240: IF( INFO.EQ.0 ) THEN
! 241: CALL ZSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, -1, IPIV,
! 242: $ IPIV2, WORK, -1, INFO )
! 243: LWKOPT = INT( WORK(1) )
! 244: IF( LTB.LT.INT( TB(1) ) .AND. .NOT.TQUERY ) THEN
! 245: INFO = -7
! 246: ELSE IF( LWORK.LT.LWKOPT .AND. .NOT.WQUERY ) THEN
! 247: INFO = -13
! 248: END IF
! 249: END IF
! 250: *
! 251: IF( INFO.NE.0 ) THEN
! 252: CALL XERBLA( 'ZSYSV_AA_2STAGE', -INFO )
! 253: RETURN
! 254: ELSE IF( WQUERY .OR. TQUERY ) THEN
! 255: RETURN
! 256: END IF
! 257: *
! 258: *
! 259: * Compute the factorization A = U*T*U**H or A = L*T*L**H.
! 260: *
! 261: CALL ZSYTRF_AA_2STAGE( UPLO, N, A, LDA, TB, LTB, IPIV, IPIV2,
! 262: $ WORK, LWORK, INFO )
! 263: IF( INFO.EQ.0 ) THEN
! 264: *
! 265: * Solve the system A*X = B, overwriting B with X.
! 266: *
! 267: CALL ZSYTRS_AA_2STAGE( UPLO, N, NRHS, A, LDA, TB, LTB, IPIV,
! 268: $ IPIV2, B, LDB, INFO )
! 269: *
! 270: END IF
! 271: *
! 272: WORK( 1 ) = LWKOPT
! 273: *
! 274: * End of ZSYSV_AA_2STAGE
! 275: *
! 276: END
CVSweb interface <joel.bertrand@systella.fr>