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