1*> \brief \b ZGBTRS 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download ZGBTRS + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zgbtrs.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zgbtrs.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zgbtrs.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, 22* INFO ) 23* 24* .. Scalar Arguments .. 25* CHARACTER TRANS 26* INTEGER INFO, KL, KU, LDAB, LDB, N, NRHS 27* .. 28* .. Array Arguments .. 29* INTEGER IPIV( * ) 30* COMPLEX*16 AB( LDAB, * ), B( LDB, * ) 31* .. 32* 33* 34*> \par Purpose: 35* ============= 36*> 37*> \verbatim 38*> 39*> ZGBTRS solves a system of linear equations 40*> A * X = B, A**T * X = B, or A**H * X = B 41*> with a general band matrix A using the LU factorization computed 42*> by ZGBTRF. 43*> \endverbatim 44* 45* Arguments: 46* ========== 47* 48*> \param[in] TRANS 49*> \verbatim 50*> TRANS is CHARACTER*1 51*> Specifies the form of the system of equations. 52*> = 'N': A * X = B (No transpose) 53*> = 'T': A**T * X = B (Transpose) 54*> = 'C': A**H * X = B (Conjugate transpose) 55*> \endverbatim 56*> 57*> \param[in] N 58*> \verbatim 59*> N is INTEGER 60*> The order of the matrix A. N >= 0. 61*> \endverbatim 62*> 63*> \param[in] KL 64*> \verbatim 65*> KL is INTEGER 66*> The number of subdiagonals within the band of A. KL >= 0. 67*> \endverbatim 68*> 69*> \param[in] KU 70*> \verbatim 71*> KU is INTEGER 72*> The number of superdiagonals within the band of A. KU >= 0. 73*> \endverbatim 74*> 75*> \param[in] NRHS 76*> \verbatim 77*> NRHS is INTEGER 78*> The number of right hand sides, i.e., the number of columns 79*> of the matrix B. NRHS >= 0. 80*> \endverbatim 81*> 82*> \param[in] AB 83*> \verbatim 84*> AB is COMPLEX*16 array, dimension (LDAB,N) 85*> Details of the LU factorization of the band matrix A, as 86*> computed by ZGBTRF. U is stored as an upper triangular band 87*> matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and 88*> the multipliers used during the factorization are stored in 89*> rows KL+KU+2 to 2*KL+KU+1. 90*> \endverbatim 91*> 92*> \param[in] LDAB 93*> \verbatim 94*> LDAB is INTEGER 95*> The leading dimension of the array AB. LDAB >= 2*KL+KU+1. 96*> \endverbatim 97*> 98*> \param[in] IPIV 99*> \verbatim 100*> IPIV is INTEGER array, dimension (N) 101*> The pivot indices; for 1 <= i <= N, row i of the matrix was 102*> interchanged with row IPIV(i). 103*> \endverbatim 104*> 105*> \param[in,out] B 106*> \verbatim 107*> B is COMPLEX*16 array, dimension (LDB,NRHS) 108*> On entry, the right hand side matrix B. 109*> On exit, the solution matrix X. 110*> \endverbatim 111*> 112*> \param[in] LDB 113*> \verbatim 114*> LDB is INTEGER 115*> The leading dimension of the array B. LDB >= max(1,N). 116*> \endverbatim 117*> 118*> \param[out] INFO 119*> \verbatim 120*> INFO is INTEGER 121*> = 0: successful exit 122*> < 0: if INFO = -i, the i-th argument had an illegal value 123*> \endverbatim 124* 125* Authors: 126* ======== 127* 128*> \author Univ. of Tennessee 129*> \author Univ. of California Berkeley 130*> \author Univ. of Colorado Denver 131*> \author NAG Ltd. 132* 133*> \ingroup complex16GBcomputational 134* 135* ===================================================================== 136 SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, 137 $ INFO ) 138* 139* -- LAPACK computational routine -- 140* -- LAPACK is a software package provided by Univ. of Tennessee, -- 141* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 142* 143* .. Scalar Arguments .. 144 CHARACTER TRANS 145 INTEGER INFO, KL, KU, LDAB, LDB, N, NRHS 146* .. 147* .. Array Arguments .. 148 INTEGER IPIV( * ) 149 COMPLEX*16 AB( LDAB, * ), B( LDB, * ) 150* .. 151* 152* ===================================================================== 153* 154* .. Parameters .. 155 COMPLEX*16 ONE 156 PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) ) 157* .. 158* .. Local Scalars .. 159 LOGICAL LNOTI, NOTRAN 160 INTEGER I, J, KD, L, LM 161* .. 162* .. External Functions .. 163 LOGICAL LSAME 164 EXTERNAL LSAME 165* .. 166* .. External Subroutines .. 167 EXTERNAL XERBLA, ZGEMV, ZGERU, ZLACGV, ZSWAP, ZTBSV 168* .. 169* .. Intrinsic Functions .. 170 INTRINSIC MAX, MIN 171* .. 172* .. Executable Statements .. 173* 174* Test the input parameters. 175* 176 INFO = 0 177 NOTRAN = LSAME( TRANS, 'N' ) 178 IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT. 179 $ LSAME( TRANS, 'C' ) ) THEN 180 INFO = -1 181 ELSE IF( N.LT.0 ) THEN 182 INFO = -2 183 ELSE IF( KL.LT.0 ) THEN 184 INFO = -3 185 ELSE IF( KU.LT.0 ) THEN 186 INFO = -4 187 ELSE IF( NRHS.LT.0 ) THEN 188 INFO = -5 189 ELSE IF( LDAB.LT.( 2*KL+KU+1 ) ) THEN 190 INFO = -7 191 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN 192 INFO = -10 193 END IF 194 IF( INFO.NE.0 ) THEN 195 CALL XERBLA( 'ZGBTRS', -INFO ) 196 RETURN 197 END IF 198* 199* Quick return if possible 200* 201 IF( N.EQ.0 .OR. NRHS.EQ.0 ) 202 $ RETURN 203* 204 KD = KU + KL + 1 205 LNOTI = KL.GT.0 206* 207 IF( NOTRAN ) THEN 208* 209* Solve A*X = B. 210* 211* Solve L*X = B, overwriting B with X. 212* 213* L is represented as a product of permutations and unit lower 214* triangular matrices L = P(1) * L(1) * ... * P(n-1) * L(n-1), 215* where each transformation L(i) is a rank-one modification of 216* the identity matrix. 217* 218 IF( LNOTI ) THEN 219 DO 10 J = 1, N - 1 220 LM = MIN( KL, N-J ) 221 L = IPIV( J ) 222 IF( L.NE.J ) 223 $ CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB ) 224 CALL ZGERU( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J, 1 ), 225 $ LDB, B( J+1, 1 ), LDB ) 226 10 CONTINUE 227 END IF 228* 229 DO 20 I = 1, NRHS 230* 231* Solve U*X = B, overwriting B with X. 232* 233 CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N, KL+KU, 234 $ AB, LDAB, B( 1, I ), 1 ) 235 20 CONTINUE 236* 237 ELSE IF( LSAME( TRANS, 'T' ) ) THEN 238* 239* Solve A**T * X = B. 240* 241 DO 30 I = 1, NRHS 242* 243* Solve U**T * X = B, overwriting B with X. 244* 245 CALL ZTBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU, AB, 246 $ LDAB, B( 1, I ), 1 ) 247 30 CONTINUE 248* 249* Solve L**T * X = B, overwriting B with X. 250* 251 IF( LNOTI ) THEN 252 DO 40 J = N - 1, 1, -1 253 LM = MIN( KL, N-J ) 254 CALL ZGEMV( 'Transpose', LM, NRHS, -ONE, B( J+1, 1 ), 255 $ LDB, AB( KD+1, J ), 1, ONE, B( J, 1 ), LDB ) 256 L = IPIV( J ) 257 IF( L.NE.J ) 258 $ CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB ) 259 40 CONTINUE 260 END IF 261* 262 ELSE 263* 264* Solve A**H * X = B. 265* 266 DO 50 I = 1, NRHS 267* 268* Solve U**H * X = B, overwriting B with X. 269* 270 CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N, 271 $ KL+KU, AB, LDAB, B( 1, I ), 1 ) 272 50 CONTINUE 273* 274* Solve L**H * X = B, overwriting B with X. 275* 276 IF( LNOTI ) THEN 277 DO 60 J = N - 1, 1, -1 278 LM = MIN( KL, N-J ) 279 CALL ZLACGV( NRHS, B( J, 1 ), LDB ) 280 CALL ZGEMV( 'Conjugate transpose', LM, NRHS, -ONE, 281 $ B( J+1, 1 ), LDB, AB( KD+1, J ), 1, ONE, 282 $ B( J, 1 ), LDB ) 283 CALL ZLACGV( NRHS, B( J, 1 ), LDB ) 284 L = IPIV( J ) 285 IF( L.NE.J ) 286 $ CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB ) 287 60 CONTINUE 288 END IF 289 END IF 290 RETURN 291* 292* End of ZGBTRS 293* 294 END 295