SUBROUTINE CDBTF2( M, N, KL, KU, AB, LDAB, INFO ) * * Modified by Andrew J. Cleary in November, 96 from: * -- LAPACK auxiliary routine (preliminary version) -- * Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., * Courant Institute, Argonne National Lab, and Rice University * August 6, 1991 * * * .. Scalar Arguments .. INTEGER INFO, KL, KU, LDAB, M, N * .. * .. Array Arguments .. COMPLEX AB( LDAB, * ) * .. * * Purpose * ======= * * Cdbtrf computes an LU factorization of a real m-by-n band matrix A * without using partial pivoting with row interchanges. * * This is the unblocked version of the algorithm, calling Level 2 BLAS. * * Arguments * ========= * * M (input) INTEGER * The number of rows of the matrix A. M >= 0. * * N (input) INTEGER * The number of columns of the matrix A. N >= 0. * * KL (input) INTEGER * The number of subdiagonals within the band of A. KL >= 0. * * KU (input) INTEGER * The number of superdiagonals within the band of A. KU >= 0. * * AB (input/output) COMPLEX array, dimension (LDAB,N) * On entry, the matrix A in band storage, in rows KL+1 to * 2*KL+KU+1; rows 1 to KL of the array need not be set. * The j-th column of A is stored in the j-th column of the * array AB as follows: * AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl) * * On exit, details of the factorization: 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. * See below for further details. * * LDAB (input) INTEGER * The leading dimension of the array AB. LDAB >= 2*KL+KU+1. * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value * > 0: if INFO = +i, U(i,i) is exactly zero. The factorization * has been completed, but the factor U is exactly * singular, and division by zero will occur if it is used * to solve a system of equations. * * Further Details * =============== * * The band storage scheme is illustrated by the following example, when * M = N = 6, KL = 2, KU = 1: * * On entry: On exit: * * * a12 a23 a34 a45 a56 * u12 u23 u34 u45 u56 * a11 a22 a33 a44 a55 a66 u11 u22 u33 u44 u55 u66 * a21 a32 a43 a54 a65 * m21 m32 m43 m54 m65 * * a31 a42 a53 a64 * * m31 m42 m53 m64 * * * * Array elements marked * are not used by the routine; elements marked * + need not be set on entry, but are required by the routine to store * elements of U, because of fill-in resulting from the row * interchanges. * * ===================================================================== * * .. Parameters .. REAL ONE, ZERO PARAMETER ( ONE = 1.0E+0 ) PARAMETER ( ZERO = 0.0E+0 ) COMPLEX CONE, CZERO PARAMETER ( CONE = ( 1.0E+0, 0.0E+0 ) ) PARAMETER ( CZERO = ( 0.0E+0, 0.0E+0 ) ) * .. * .. Local Scalars .. INTEGER J, JP, JU, KM, KV * .. * .. External Functions .. INTEGER ISAMAX EXTERNAL ISAMAX * .. * .. External Subroutines .. EXTERNAL CGERU, CSCAL, CSWAP * .. * .. Intrinsic Functions .. INTRINSIC MAX, MIN * .. * .. Executable Statements .. * * KV is the number of superdiagonals in the factor U, allowing for * fill-in. * KV = KU * * Test the input parameters. * INFO = 0 *ECA IF( M.LT.0 ) THEN *ECA INFO = -1 *ECA ELSE IF( N.LT.0 ) THEN *ECA INFO = -2 *ECA ELSE IF( KL.LT.0 ) THEN *ECA INFO = -3 *ECA ELSE IF( KU.LT.0 ) THEN *ECA INFO = -4 *ECA ELSE IF( LDAB.LT.KL+KV+1 ) THEN *ECA INFO = -6 *ECA END IF *ECA IF( INFO.NE.0 ) THEN *ECA CALL XERBLA( 'CDBTF2', -INFO ) *ECA RETURN *ECA END IF * * Quick return if possible * IF( M.EQ.0 .OR. N.EQ.0 ) $ RETURN * * Gaussian elimination without partial pivoting * * JU is the index of the last column affected by the current stage * of the factorization. * JU = 1 * DO 40 J = 1, MIN( M, N ) * * Test for singularity. KM is the number of * subdiagonal elements in the current column. * KM = MIN( KL, M-J ) JP = 1 IF( AB( KV+1, J ).NE.ZERO ) THEN JU = MAX( JU, MIN( J+KU, N ) ) * IF( KM.GT.0 ) THEN * * Compute multipliers. * CALL CSCAL( KM, ONE / AB( KU+1, J ), AB( KU+2, J ), 1 ) * * Update trailing submatrix within the band. * IF( JU.GT.J ) THEN CALL CGERU( KM, JU-J, -CONE, AB( KU+2, J ), 1, $ AB( KU, J+1 ), LDAB-1, AB( KU+1, J+1 ), $ LDAB-1 ) END IF END IF ELSE * IF( INFO.EQ.0 ) $ INFO = J END IF 40 CONTINUE RETURN * * End of CDBTF2 * END