home *** CD-ROM | disk | FTP | other *** search
- /* *****************************************************************************
- *
- * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- *
- ***************************************************************************** */
- SUBROUTINE DGETRF( M, N, A, LDA, IPIV, INFO )
- *
- * -- LAPACK routine (preliminary version) --
- * Univ. of Tennessee, Oak Ridge National Lab, Argonne National Lab,
- * Courant Institute, NAG Ltd., and Rice University
- * March 26, 1990
- *
- * .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N
- * ..
- * .. Array Arguments ..
- INTEGER IPIV( * )
- DOUBLE PRECISION A( LDA, * )
- * ..
- *
- * Purpose
- * =======
- *
- * DGETRF computes an LU factorization of a general m-by-n matrix A
- * using partial pivoting with row interchanges.
- *
- * The factorization has the form
- * A = P * L * U
- * where P is a permutation matrix, L is lower triangular with unit
- * diagonal elements (lower trapezoidal if m > n), and U is upper
- * triangular (upper trapezoidal if m < n).
- *
- * This is the Level 3 BLAS version of the Crout algorithm.
- *
- * 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.
- *
- * A (input/output) DOUBLE PRECISION array, dimension (LDA,N)
- * On entry, the m x n matrix to be factored.
- * On exit, the factors L and U; the unit diagonal elements of L
- * are not stored.
- *
- * LDA (input) INTEGER
- * The leading dimension of the array A. LDA >= max(1,M).
- *
- * IPIV (output) INTEGER array, dimension (min(M,N))
- * The pivot indices. Row i of the matrix was interchanged with
- * row IPIV(i).
- *
- * INFO (output) INTEGER
- * = 0: successful exit
- * < 0: if INFO = -k, the k-th argument had an illegal value
- * > 0: if INFO = k, U(k,k) 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 or to compute the inverse
- * of A.
- *
- * =====================================================================
- *
- * .. Parameters ..
- DOUBLE PRECISION ONE
- PARAMETER ( ONE = 1.0D+0 )
- * ..
- * .. Local Scalars ..
- INTEGER I, J, JB, NB
- * ..
- * .. External Subroutines ..
- c EXTERNAL DGEMM, DGETF2, DLASWP, DTRSM, ENVIR, XERBLA
- EXTERNAL DGEMM, DGETF2, DLASWP, DTRSM, XERBLA
- * ..
- * .. Intrinsic Functions ..
- INTRINSIC MAX, MIN
-
- c ..jpp -> Blocksize is fixed to 32 for demo
- nb = 32
- * ..
- * .. Executable Statements ..
- *
- * Test the input parameters.
- *
- INFO = 0
- IF( M.LT.0 ) THEN
- INFO = -1
- ELSE IF( N.LT.0 ) THEN
- INFO = -2
- ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
- INFO = -4
- END IF
- IF( INFO.NE.0 ) THEN
- CALL XERBLA( 'DGETRF', -INFO )
- RETURN
- END IF
- *
- * Quick return if possible.
- *
- IF( M.EQ.0 .OR. N.EQ.0 )
- $ RETURN
- *
- * Determine the block size for this environment.
- *
- c CALL ENVIR( 'Block', NB )
- IF( NB.EQ.1 ) THEN
- CALL DGETF2( M, N, A, LDA, IPIV, INFO )
- ELSE
- *
- DO 20 J = 1, MIN( M, N ), NB
- call update(j-1)
- JB = MIN( MIN( M, N )-J+1, NB )
- *
- * Update diagonal and subdiagonal blocks.
- *
- CALL DGEMM( 'No transpose', 'No transpose', M-J+1, JB, J-1,
- $ -ONE, A( J, 1 ), LDA, A( 1, J ), LDA, ONE,
- $ A( J, J ), LDA )
- *
- * Factorize diagonal and subdiagonal blocks and test for
- * singularity.
- *
- CALL DGETF2( M-J+1, JB, A( J, J ), LDA, IPIV( J ), INFO )
- *
- * Update pivot indices and apply the interchanges to the
- * columns on either side of the current block.
- *
- DO 10 I = J, MIN( M, J+JB-1 )
- IPIV( I ) = J - 1 + IPIV( I )
- 10 CONTINUE
- CALL DLASWP( J-1, A, LDA, J, J+JB-1, IPIV, 1 )
- CALL DLASWP( N-J-JB+1, A( 1, J+JB ), LDA, J, J+JB-1, IPIV,
- $ 1 )
- *
- IF( INFO.NE.0 )
- $ GO TO 30
- *
- IF( J+JB.LE.N ) THEN
- *
- * Compute block row of U.
- *
- CALL DGEMM( 'No transpose', 'No transpose', JB, N-J-JB+1,
- $ J-1, -ONE, A( J, 1 ), LDA, A( 1, J+JB ), LDA,
- $ ONE, A( J, J+JB ), LDA )
- CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Unit', JB,
- $ N-J-JB+1, ONE, A( J, J ), LDA, A( J, J+JB ),
- $ LDA )
- END IF
- 20 CONTINUE
- call update(m)
- END IF
- RETURN
- *
- 30 CONTINUE
- INFO = INFO + J - 1
- RETURN
- *
- * End of DGETRF
- *
- END
- SUBROUTINE DGETF2( M, N, A, LDA, IPIV, INFO )
- *
- * -- LAPACK routine (preliminary version) --
- * Univ. of Tennessee, Oak Ridge National Lab, Argonne National Lab,
- * Courant Institute, NAG Ltd., and Rice University
- * March 26, 1990
- *
- * .. Scalar Arguments ..
- INTEGER INFO, LDA, M, N
- * ..
- * .. Array Arguments ..
- INTEGER IPIV( * )
- DOUBLE PRECISION A( LDA, * )
- * ..
- *
- * Purpose
- * =======
- *
- * DGETF2 computes an LU factorization of a general m-by-n matrix A
- * using partial pivoting with row interchanges.
- *
- * The factorization has the form
- * A = P * L * U
- * where P is a permutation matrix, L is lower triangular with unit
- * diagonal elements (lower trapezoidal if m > n), and U is upper
- * triangular (upper trapezoidal if m < n).
- *
- * This is the Level 2 BLAS version of the Crout algorithm.
- *
- * 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.
- *
- * A (input/output) DOUBLE PRECISION array, dimension (LDA,N)
- * On entry, the m x n matrix to be factored.
- * On exit, the factors L and U; the unit diagonal elements of L
- * are not stored.
- *
- * LDA (input) INTEGER
- * The leading dimension of the array A. LDA >= max(1,M).
- *
- * IPIV (output) INTEGER array, dimension (min(M,N))
- * The pivot indices. Row i of the matrix was interchanged with
- * row IPIV(i).
- *
- * INFO (output) INTEGER
- * = 0: successful exit
- * < 0: if INFO = -k, the k-th argument had an illegal value
- * > 0: if INFO = k, U(k,k) 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 or to compute the inverse
- * of A.
- *
- * =====================================================================
- *
- * .. Parameters ..
- DOUBLE PRECISION ONE, ZERO
- PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
- * ..
- * .. Local Scalars ..
- INTEGER J, JP
- * ..
- * .. External Functions ..
- INTEGER IDAMAX
- EXTERNAL IDAMAX
- * ..
- * .. External Subroutines ..
- EXTERNAL DGEMV, DSCAL, DSWAP, XERBLA
- * ..
- * .. Intrinsic Functions ..
- INTRINSIC MAX, MIN
- * ..
- * .. Executable Statements ..
- *
- *
- * Test the input parameters.
- *
- INFO = 0
- IF( M.LT.0 ) THEN
- INFO = -1
- ELSE IF( N.LT.0 ) THEN
- INFO = -2
- ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
- INFO = -4
- END IF
- IF( INFO.NE.0 ) THEN
- CALL XERBLA( 'DGETF2', -INFO )
- RETURN
- END IF
- *
- * Quick return if possible.
- *
- IF( M.EQ.0 .OR. N.EQ.0 )
- $ RETURN
- *
- DO 10 J = 1, MIN( M, N )
- *
- * Update diagonal and subdiagonal elements in column J.
- *
- CALL DGEMV( 'No transpose', M-J+1, J-1, -ONE, A( J, 1 ), LDA,
- $ A( 1, J ), 1, ONE, A( J, J ), 1 )
- *
- * Find pivot and test for singularity.
- *
- JP = J - 1 + IDAMAX( M-J+1, A( J, J ), 1 )
- IPIV( J ) = JP
- IF( A( JP, J ).NE.ZERO ) THEN
- *
- * Apply interchange to columns 1:J.
- *
- IF( JP.NE.J )
- $ CALL DSWAP( N, A( J, 1 ), LDA, A( JP, 1 ), LDA )
- *
- * Compute elements J+1:M of J-th column.
- *
- IF( J.LT.M )
- $ CALL DSCAL( M-J, ONE/A( J, J ), A( J+1, J ), 1 )
- ELSE
- *
- * If A( JP, J ) is zero, set INFO to indicate that a zero
- * pivot has been found. INFO returns the index of the
- * last zero pivot to the calling routine if there is more
- * than one.
- *
- INFO = J
- END IF
- *
- IF( J+1.LE.N ) THEN
- *
- * Compute block row of U.
- *
- CALL DGEMV( 'Transpose', J-1, N-J, -ONE, A( 1, J+1 ), LDA,
- $ A( J, 1 ), LDA, ONE, A( J, J+1 ), LDA )
- END IF
- 10 CONTINUE
- RETURN
- *
- * End of DGETF2
- *
- END
- SUBROUTINE DLASWP( N, A, LDA, K1, K2, IPIV, INCX )
- *
- * -- LAPACK auxiliary routine (preliminary version) --
- * Univ. of Tennessee, Oak Ridge National Lab, Argonne National Lab,
- * Courant Institute, NAG Ltd., and Rice University
- * March 26, 1990
- *
- * .. Scalar Arguments ..
- INTEGER INCX, K1, K2, LDA, N
- * ..
- * .. Array Arguments ..
- INTEGER IPIV( * )
- DOUBLE PRECISION A( LDA, * )
- * ..
- *
- * Purpose
- * =======
- *
- * DLASWP performs a series of row interchanges on the M x N matrix A.
- * One row interchange is initiated for each of rows K1 through K2 of A.
- *
- * Arguments
- * =========
- *
- * N (input) INTEGER
- * The number of columns of the matrix A.
- *
- * A (input/output) DOUBLE PRECISION array, dimension( LDA, N )
- * On entry, the M x N matrix to which the row interchanges will
- * be applied.
- * On exit, the permuted matrix.
- *
- * LDA (input) INTEGER
- * The leading dimension of the array A.
- *
- * K1 (input) INTEGER
- * The first element of IPIV for which a row interchange will
- * be done.
- *
- * K2 (input) INTEGER
- * The last element of IPIV for which a row interchange will
- * be done.
- *
- * IPIV (input) INTEGER array, dimension( M*abs(INCX) )
- * The vector of pivot indices. Only the elements in positions
- * K1 through K2 of IPIV are accessed.
- * IPIV(K) = L implies rows K and L are to be interchanged.
- *
- * INCX (input) INTEGER
- * The increment between succesive values of IPIV. If IPIV
- * is negative, the pivots are applied in reverse order.
- *
- *
- * .. Local Scalars ..
- INTEGER I, IP, IX
- * ..
- * .. External Subroutines ..
- EXTERNAL DSWAP
- * ..
- * .. Executable Statements ..
- *
- * Interchange row I with row IPIV(I) for each of rows K1 through K2.
- *
- IF( INCX.EQ.0 )
- $ RETURN
- IF( INCX.GT.0 ) THEN
- IX = K1
- ELSE
- IX = 1 + ( 1-K2 )*INCX
- END IF
- IF( INCX.EQ.1 ) THEN
- DO 10 I = K1, K2
- IP = IPIV( I )
- IF( IP.NE.I )
- $ CALL DSWAP( N, A( I, 1 ), LDA, A( IP, 1 ), LDA )
- 10 CONTINUE
- ELSE IF( INCX.GT.1 ) THEN
- DO 20 I = K1, K2
- IP = IPIV( IX )
- IF( IP.NE.I )
- $ CALL DSWAP( N, A( I, 1 ), LDA, A( IP, 1 ), LDA )
- IX = IX + INCX
- 20 CONTINUE
- ELSE IF( INCX.LT.0 ) THEN
- DO 30 I = K2, K1, -1
- IP = IPIV( IX )
- IF( IP.NE.I )
- $ CALL DSWAP( N, A( I, 1 ), LDA, A( IP, 1 ), LDA )
- IX = IX + INCX
- 30 CONTINUE
- END IF
- *
- RETURN
- *
- * End of DLASWP
- *
- END
-