1*> \brief \b DPOTRS 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download DPOTRS + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dpotrs.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dpotrs.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dpotrs.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE DPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) 22* 23* .. Scalar Arguments .. 24* CHARACTER UPLO 25* INTEGER INFO, LDA, LDB, N, NRHS 26* .. 27* .. Array Arguments .. 28* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) 29* .. 30* 31* 32*> \par Purpose: 33* ============= 34*> 35*> \verbatim 36*> 37*> DPOTRS solves a system of linear equations A*X = B with a symmetric 38*> positive definite matrix A using the Cholesky factorization 39*> A = U**T*U or A = L*L**T computed by DPOTRF. 40*> \endverbatim 41* 42* Arguments: 43* ========== 44* 45*> \param[in] UPLO 46*> \verbatim 47*> UPLO is CHARACTER*1 48*> = 'U': Upper triangle of A is stored; 49*> = 'L': Lower triangle of A is stored. 50*> \endverbatim 51*> 52*> \param[in] N 53*> \verbatim 54*> N is INTEGER 55*> The order of the matrix A. N >= 0. 56*> \endverbatim 57*> 58*> \param[in] NRHS 59*> \verbatim 60*> NRHS is INTEGER 61*> The number of right hand sides, i.e., the number of columns 62*> of the matrix B. NRHS >= 0. 63*> \endverbatim 64*> 65*> \param[in] A 66*> \verbatim 67*> A is DOUBLE PRECISION array, dimension (LDA,N) 68*> The triangular factor U or L from the Cholesky factorization 69*> A = U**T*U or A = L*L**T, as computed by DPOTRF. 70*> \endverbatim 71*> 72*> \param[in] LDA 73*> \verbatim 74*> LDA is INTEGER 75*> The leading dimension of the array A. LDA >= max(1,N). 76*> \endverbatim 77*> 78*> \param[in,out] B 79*> \verbatim 80*> B is DOUBLE PRECISION array, dimension (LDB,NRHS) 81*> On entry, the right hand side matrix B. 82*> On exit, the solution matrix X. 83*> \endverbatim 84*> 85*> \param[in] LDB 86*> \verbatim 87*> LDB is INTEGER 88*> The leading dimension of the array B. LDB >= max(1,N). 89*> \endverbatim 90*> 91*> \param[out] INFO 92*> \verbatim 93*> INFO is INTEGER 94*> = 0: successful exit 95*> < 0: if INFO = -i, the i-th argument had an illegal value 96*> \endverbatim 97* 98* Authors: 99* ======== 100* 101*> \author Univ. of Tennessee 102*> \author Univ. of California Berkeley 103*> \author Univ. of Colorado Denver 104*> \author NAG Ltd. 105* 106*> \ingroup doublePOcomputational 107* 108* ===================================================================== 109 SUBROUTINE DPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) 110* 111* -- LAPACK computational routine -- 112* -- LAPACK is a software package provided by Univ. of Tennessee, -- 113* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 114* 115* .. Scalar Arguments .. 116 CHARACTER UPLO 117 INTEGER INFO, LDA, LDB, N, NRHS 118* .. 119* .. Array Arguments .. 120 DOUBLE PRECISION A( LDA, * ), B( LDB, * ) 121* .. 122* 123* ===================================================================== 124* 125* .. Parameters .. 126 DOUBLE PRECISION ONE 127 PARAMETER ( ONE = 1.0D+0 ) 128* .. 129* .. Local Scalars .. 130 LOGICAL UPPER 131* .. 132* .. External Functions .. 133 LOGICAL LSAME 134 EXTERNAL LSAME 135* .. 136* .. External Subroutines .. 137 EXTERNAL DTRSM, XERBLA 138* .. 139* .. Intrinsic Functions .. 140 INTRINSIC MAX 141* .. 142* .. Executable Statements .. 143* 144* Test the input parameters. 145* 146 INFO = 0 147 UPPER = LSAME( UPLO, 'U' ) 148 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN 149 INFO = -1 150 ELSE IF( N.LT.0 ) THEN 151 INFO = -2 152 ELSE IF( NRHS.LT.0 ) THEN 153 INFO = -3 154 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN 155 INFO = -5 156 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN 157 INFO = -7 158 END IF 159 IF( INFO.NE.0 ) THEN 160 CALL XERBLA( 'DPOTRS', -INFO ) 161 RETURN 162 END IF 163* 164* Quick return if possible 165* 166 IF( N.EQ.0 .OR. NRHS.EQ.0 ) 167 $ RETURN 168* 169 IF( UPPER ) THEN 170* 171* Solve A*X = B where A = U**T *U. 172* 173* Solve U**T *X = B, overwriting B with X. 174* 175 CALL DTRSM( 'Left', 'Upper', 'Transpose', 'Non-unit', N, NRHS, 176 $ ONE, A, LDA, B, LDB ) 177* 178* Solve U*X = B, overwriting B with X. 179* 180 CALL DTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N, 181 $ NRHS, ONE, A, LDA, B, LDB ) 182 ELSE 183* 184* Solve A*X = B where A = L*L**T. 185* 186* Solve L*X = B, overwriting B with X. 187* 188 CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', N, 189 $ NRHS, ONE, A, LDA, B, LDB ) 190* 191* Solve L**T *X = B, overwriting B with X. 192* 193 CALL DTRSM( 'Left', 'Lower', 'Transpose', 'Non-unit', N, NRHS, 194 $ ONE, A, LDA, B, LDB ) 195 END IF 196* 197 RETURN 198* 199* End of DPOTRS 200* 201 END 202