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