|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- *> \brief \b ZGBTRS
- *
- * =========== DOCUMENTATION ===========
- *
- * Online html documentation available at
- * http://www.netlib.org/lapack/explore-html/
- *
- *> \htmlonly
- *> Download ZGBTRS + dependencies
- *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zgbtrs.f">
- *> [TGZ]</a>
- *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zgbtrs.f">
- *> [ZIP]</a>
- *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zgbtrs.f">
- *> [TXT]</a>
- *> \endhtmlonly
- *
- * Definition:
- * ===========
- *
- * SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
- * INFO )
- *
- * .. Scalar Arguments ..
- * CHARACTER TRANS
- * INTEGER INFO, KL, KU, LDAB, LDB, N, NRHS
- * ..
- * .. Array Arguments ..
- * INTEGER IPIV( * )
- * COMPLEX*16 AB( LDAB, * ), B( LDB, * )
- * ..
- *
- *
- *> \par Purpose:
- * =============
- *>
- *> \verbatim
- *>
- *> ZGBTRS solves a system of linear equations
- *> A * X = B, A**T * X = B, or A**H * X = B
- *> with a general band matrix A using the LU factorization computed
- *> by ZGBTRF.
- *> \endverbatim
- *
- * Arguments:
- * ==========
- *
- *> \param[in] TRANS
- *> \verbatim
- *> TRANS is CHARACTER*1
- *> Specifies the form of the system of equations.
- *> = 'N': A * X = B (No transpose)
- *> = 'T': A**T * X = B (Transpose)
- *> = 'C': A**H * X = B (Conjugate transpose)
- *> \endverbatim
- *>
- *> \param[in] N
- *> \verbatim
- *> N is INTEGER
- *> The order of the matrix A. N >= 0.
- *> \endverbatim
- *>
- *> \param[in] KL
- *> \verbatim
- *> KL is INTEGER
- *> The number of subdiagonals within the band of A. KL >= 0.
- *> \endverbatim
- *>
- *> \param[in] KU
- *> \verbatim
- *> KU is INTEGER
- *> The number of superdiagonals within the band of A. KU >= 0.
- *> \endverbatim
- *>
- *> \param[in] NRHS
- *> \verbatim
- *> NRHS is INTEGER
- *> The number of right hand sides, i.e., the number of columns
- *> of the matrix B. NRHS >= 0.
- *> \endverbatim
- *>
- *> \param[in] AB
- *> \verbatim
- *> AB is COMPLEX*16 array, dimension (LDAB,N)
- *> Details of the LU factorization of the band matrix A, as
- *> computed by ZGBTRF. U is stored as an upper triangular band
- *> matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
- *> the multipliers used during the factorization are stored in
- *> rows KL+KU+2 to 2*KL+KU+1.
- *> \endverbatim
- *>
- *> \param[in] LDAB
- *> \verbatim
- *> LDAB is INTEGER
- *> The leading dimension of the array AB. LDAB >= 2*KL+KU+1.
- *> \endverbatim
- *>
- *> \param[in] IPIV
- *> \verbatim
- *> IPIV is INTEGER array, dimension (N)
- *> The pivot indices; for 1 <= i <= N, row i of the matrix was
- *> interchanged with row IPIV(i).
- *> \endverbatim
- *>
- *> \param[in,out] B
- *> \verbatim
- *> B is COMPLEX*16 array, dimension (LDB,NRHS)
- *> On entry, the right hand side matrix B.
- *> On exit, the solution matrix X.
- *> \endverbatim
- *>
- *> \param[in] LDB
- *> \verbatim
- *> LDB is INTEGER
- *> The leading dimension of the array B. LDB >= max(1,N).
- *> \endverbatim
- *>
- *> \param[out] INFO
- *> \verbatim
- *> INFO is INTEGER
- *> = 0: successful exit
- *> < 0: if INFO = -i, the i-th argument had an illegal value
- *> \endverbatim
- *
- * Authors:
- * ========
- *
- *> \author Univ. of Tennessee
- *> \author Univ. of California Berkeley
- *> \author Univ. of Colorado Denver
- *> \author NAG Ltd.
- *
- *> \date December 2016
- *
- *> \ingroup complex16GBcomputational
- *
- * =====================================================================
- SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
- $ INFO )
- *
- * -- LAPACK computational routine (version 3.7.0) --
- * -- LAPACK is a software package provided by Univ. of Tennessee, --
- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
- * December 2016
- *
- * .. Scalar Arguments ..
- CHARACTER TRANS
- INTEGER INFO, KL, KU, LDAB, LDB, N, NRHS
- * ..
- * .. Array Arguments ..
- INTEGER IPIV( * )
- COMPLEX*16 AB( LDAB, * ), B( LDB, * )
- * ..
- *
- * =====================================================================
- *
- * .. Parameters ..
- COMPLEX*16 ONE
- PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) )
- * ..
- * .. Local Scalars ..
- LOGICAL LNOTI, NOTRAN
- INTEGER I, J, KD, L, LM
- * ..
- * .. External Functions ..
- LOGICAL LSAME
- EXTERNAL LSAME
- * ..
- * .. External Subroutines ..
- EXTERNAL XERBLA, ZGEMV, ZGERU, ZLACGV, ZSWAP, ZTBSV
- * ..
- * .. Intrinsic Functions ..
- INTRINSIC MAX, MIN
- * ..
- * .. Executable Statements ..
- *
- * Test the input parameters.
- *
- INFO = 0
- NOTRAN = LSAME( TRANS, 'N' )
- IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
- $ LSAME( TRANS, 'C' ) ) THEN
- INFO = -1
- ELSE IF( N.LT.0 ) THEN
- INFO = -2
- ELSE IF( KL.LT.0 ) THEN
- INFO = -3
- ELSE IF( KU.LT.0 ) THEN
- INFO = -4
- ELSE IF( NRHS.LT.0 ) THEN
- INFO = -5
- ELSE IF( LDAB.LT.( 2*KL+KU+1 ) ) THEN
- INFO = -7
- ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
- INFO = -10
- END IF
- IF( INFO.NE.0 ) THEN
- CALL XERBLA( 'ZGBTRS', -INFO )
- RETURN
- END IF
- *
- * Quick return if possible
- *
- IF( N.EQ.0 .OR. NRHS.EQ.0 )
- $ RETURN
- *
- KD = KU + KL + 1
- LNOTI = KL.GT.0
- *
- IF( NOTRAN ) THEN
- *
- * Solve A*X = B.
- *
- * Solve L*X = B, overwriting B with X.
- *
- * L is represented as a product of permutations and unit lower
- * triangular matrices L = P(1) * L(1) * ... * P(n-1) * L(n-1),
- * where each transformation L(i) is a rank-one modification of
- * the identity matrix.
- *
- IF( LNOTI ) THEN
- DO 10 J = 1, N - 1
- LM = MIN( KL, N-J )
- L = IPIV( J )
- IF( L.NE.J )
- $ CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
- CALL ZGERU( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J, 1 ),
- $ LDB, B( J+1, 1 ), LDB )
- 10 CONTINUE
- END IF
- *
- DO 20 I = 1, NRHS
- *
- * Solve U*X = B, overwriting B with X.
- *
- CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N, KL+KU,
- $ AB, LDAB, B( 1, I ), 1 )
- 20 CONTINUE
- *
- ELSE IF( LSAME( TRANS, 'T' ) ) THEN
- *
- * Solve A**T * X = B.
- *
- DO 30 I = 1, NRHS
- *
- * Solve U**T * X = B, overwriting B with X.
- *
- CALL ZTBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU, AB,
- $ LDAB, B( 1, I ), 1 )
- 30 CONTINUE
- *
- * Solve L**T * X = B, overwriting B with X.
- *
- IF( LNOTI ) THEN
- DO 40 J = N - 1, 1, -1
- LM = MIN( KL, N-J )
- CALL ZGEMV( 'Transpose', LM, NRHS, -ONE, B( J+1, 1 ),
- $ LDB, AB( KD+1, J ), 1, ONE, B( J, 1 ), LDB )
- L = IPIV( J )
- IF( L.NE.J )
- $ CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
- 40 CONTINUE
- END IF
- *
- ELSE
- *
- * Solve A**H * X = B.
- *
- DO 50 I = 1, NRHS
- *
- * Solve U**H * X = B, overwriting B with X.
- *
- CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N,
- $ KL+KU, AB, LDAB, B( 1, I ), 1 )
- 50 CONTINUE
- *
- * Solve L**H * X = B, overwriting B with X.
- *
- IF( LNOTI ) THEN
- DO 60 J = N - 1, 1, -1
- LM = MIN( KL, N-J )
- CALL ZLACGV( NRHS, B( J, 1 ), LDB )
- CALL ZGEMV( 'Conjugate transpose', LM, NRHS, -ONE,
- $ B( J+1, 1 ), LDB, AB( KD+1, J ), 1, ONE,
- $ B( J, 1 ), LDB )
- CALL ZLACGV( NRHS, B( J, 1 ), LDB )
- L = IPIV( J )
- IF( L.NE.J )
- $ CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
- 60 CONTINUE
- END IF
- END IF
- RETURN
- *
- * End of ZGBTRS
- *
- END
|