Routine: PZGETF2()  File: SRC\pzgetf2.f

 
 
# lines: 252
  # code: 252
  # comment: 0
  # blank:0
# Variables:34
# Callers:1
# Callings:0
# Words:119
# Keywords:70
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PZGETF2 computes an LU factorization of a general M-by-N
  distributed matrix sub( A ) = A(IA:IA+M-1,JA:JA+N-1) using
  partial pivoting with row interchanges.
  The factorization has the form sub( 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 right-looking Parallel Level 2 BLAS version of the
  algorithm.
  Notes
  =====
  Each global data object is described by an associated description
  vector.  This vector stores the information required to establish
  the mapping between an object element and its corresponding process
  and memory location.
  Let A be a generic term for any 2D block cyclicly distributed array.
  Such a global array has an associated description vector DESCA.
  In the following comments, the character _ should be read as
  "of the global array".
  NOTATION        STORED IN      EXPLANATION
  --------------- -------------- --------------------------------------
  DTYPE_A(global) DESCA( DTYPE_ )The descriptor type.  In this case,
                                 DTYPE_A = 1.
  CTXT_A (global) DESCA( CTXT_ ) The BLACS context handle, indicating
                                 the BLACS process grid A is distribu-
                                 ted over. The context itself is glo-
                                 bal, but the handle (the integer
                                 value) may vary.
  M_A    (global) DESCA( M_ )    The number of rows in the global
                                 array A.
  N_A    (global) DESCA( N_ )    The number of columns in the global
                                 array A.
  MB_A   (global) DESCA( MB_ )   The blocking factor used to distribute
                                 the rows of the array.
  NB_A   (global) DESCA( NB_ )   The blocking factor used to distribute
                                 the columns of the array.
  RSRC_A (global) DESCA( RSRC_ ) The process row over which the first
                                 row of the array A is distributed.
  CSRC_A (global) DESCA( CSRC_ ) The process column over which the
                                 first column of the array A is
                                 distributed.
  LLD_A  (local)  DESCA( LLD_ )  The leading dimension of the local
                                 array.  LLD_A >= MAX(1,LOCr(M_A)).
  Let K be the number of rows or columns of a distributed matrix,
  and assume that its process grid has dimension p x q.
  LOCr( K ) denotes the number of elements of K that a process
  would receive if K were distributed over the p processes of its
  process column.
  Similarly, LOCc( K ) denotes the number of elements of K that a
  process would receive if K were distributed over the q processes of
  its process row.
  The values of LOCr() and LOCc() may be determined via a call to the
  ScaLAPACK tool function, NUMROC:
          LOCr( M ) = NUMROC( M, MB_A, MYROW, RSRC_A, NPROW ),
          LOCc( N ) = NUMROC( N, NB_A, MYCOL, CSRC_A, NPCOL ).
  An upper bound for these quantities may be computed by:
          LOCr( M ) <= ceil( ceil(M/MB_A)/NPROW )*MB_A
          LOCc( N ) <= ceil( ceil(N/NB_A)/NPCOL )*NB_A
  This routine requires N <= NB_A-MOD(JA-1, NB_A) and square block
  decomposition ( MB_A = NB_A ).
  Arguments
  =========
  M       (global input) INTEGER
          The number of rows to be operated on, i.e. the number of rows
          of the distributed submatrix sub( A ). M >= 0.
  N       (global input) INTEGER
          The number of columns to be operated on, i.e. the number of
          columns of the distributed submatrix sub( A ).
          NB_A-MOD(JA-1, NB_A) >= N >= 0.
  A       (local input/local output) COMPLEX*16 pointer into the
          local memory to an array of dimension (LLD_A, LOCc(JA+N-1)).
          On entry, this array contains the local pieces of the M-by-N
          distributed matrix sub( A ). On exit, this array contains
          the local pieces of the factors L and U from the factoriza-
          tion sub( A ) = P*L*U; the unit diagonal elements of L are
          not stored.
  IA      (global input) INTEGER
          The row index in the global array A indicating the first
          row of sub( A ).
  JA      (global input) INTEGER
          The column index in the global array A indicating the
          first column of sub( A ).
  DESCA   (global and local input) INTEGER array of dimension DLEN_.
          The array descriptor for the distributed matrix A.
  IPIV    (local output) INTEGER array, dimension ( LOCr(M_A)+MB_A )
          This array contains the pivoting information.
          IPIV(i) -> The global row local row i was swapped with.
          This array is tied to the distributed matrix A.
  INFO    (local output) INTEGER
          = 0:  successful exit
          < 0:  If the i-th argument is an array and the j-entry had
                an illegal value, then INFO = -(i*100+j), if the i-th
                argument is a scalar and had an illegal value, then
                INFO = -i.
          > 0:  If INFO = K, U(IA+K-1,JA+K-1) 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.
  =====================================================================
     .. Parameters ..

 
Display dynamic version Find AutoScroll Reload FontSize: - + Hide Comments Hide Blanks Frame FullScreen MailPrint

 
001        SUBROUTINE PZGETF2( M , N , A , IA , JA , DESCA , IPIV , INFO )
002  
003  *     -- ScaLAPACK routine(version 1.7) --
004  *     University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
005  *     and University of California , Berkeley.
006  *     May 1 , 1997
007  
008  *     .. Scalar Arguments ..
009        INTEGER IA , INFO , JA , M , N
010        INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
011       $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
012        PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
013       $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
014       $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
015        COMPLEX*16 ONE , ZERO
016        PARAMETER( ONE = 1.0D + 0 , ZERO = 0.0D + 0 )
017  *     ..
018  *     .. Local Scalars ..
019        CHARACTER ROWBTOP
020        INTEGER I , IACOL , IAROW , ICOFF , ICTXT , IIA , IROFF , J ,
021       $JJA , MN , MYCOL , MYROW , NPCOL , NPROW
022        COMPLEX*16 GMAX
023  *     ..
024  *     .. External Subroutines ..
025        EXTERNAL BLACS_ABORT , BLACS_GRIDINFO , CHK1MAT , IGEBR2D ,
026       $IGEBS2D , INFOG2L , PB_TOPGET , PXERBLA , PZAMAX ,
027       $PZGERU , PZSCAL , PZSWAP
028  *     ..
029  *     .. Intrinsic Functions ..
030        INTRINSIC MIN , MOD
031  *     ..
032  *     .. Executable Statements ..
033  
034  *     Get grid parameters.
035  
036        ICTXT = DESCA( CTXT_ )
037        CALL BLACS_GRIDINFO( ICTXT , NPROW , NPCOL , MYROW , MYCOL )
038  
039  *     Test the input parameters.
040  
041        INFO = 0
042        IF( NPROW.EQ. - 1 ) THEN
043            INFO = - (600 + CTXT_)
044        ELSE
045            CALL CHK1MAT( M , 1 , N , 2 , IA , JA , DESCA , 6 , INFO )
046            IF( INFO.EQ.0 ) THEN
047                IROFF = MOD( IA - 1 , DESCA( MB_ ) )
048                ICOFF = MOD( JA - 1 , DESCA( NB_ ) )
049                IF( N + ICOFF.GT.DESCA( NB_ ) ) THEN
050                    INFO = - 2
051                ELSE IF( IROFF.NE.0 ) THEN
052                    INFO = - 4
053                ELSE IF( ICOFF.NE.0 ) THEN
054                    INFO = - 5
055                ELSE IF( DESCA( MB_ ).NE.DESCA( NB_ ) ) THEN
056                    INFO = - (600 + NB_)
057                END IF
058            END IF
059        END IF
060  
061        IF( INFO.NE.0 ) THEN
062            CALL PXERBLA( ICTXT , 'PZGETF2' , - INFO )
063            CALL BLACS_ABORT( ICTXT , 1 )
064            RETURN
065        END IF
066  
067  *     Quick return if possible
068  
069        IF( M.EQ.0 .OR. N.EQ.0 )
070       $    RETURN
071  
072            MN = MIN( M , N )
073            CALL INFOG2L( IA , JA , DESCA , NPROW , NPCOL , MYROW , MYCOL , IIA , JJA ,
074       $    IAROW , IACOL )
075            CALL PB_TOPGET( ICTXT , 'Broadcast' , 'Rowwise' , ROWBTOP )
076  
077            IF( MYCOL.EQ.IACOL ) THEN
078                DO 10 J = JA , JA + MN - 1
079                    I = IA + J - JA
080  
081  *                 Find pivot and test for singularity.
082  
083                    CALL PZAMAX( M - J + JA , GMAX , IPIV( IIA + J - JA ) , A , I , J ,
084       $            DESCA , 1 )
085                    IF( GMAX.NE.ZERO ) THEN
086  
087  *                     Apply the row interchanges to columns JA : JA + N - 1
088  
089                        CALL PZSWAP( N , A , I , JA , DESCA , DESCA( M_ ) , A ,
090       $                IPIV( IIA + J - JA ) , JA , DESCA , DESCA( M_ ) )
091  
092  *                     Compute elements I + 1 : IA + M - 1 of J - th column.
093  
094                        IF( J - JA + 1.LT.M )
095       $                    CALL PZSCAL( M - J + JA - 1 , ONE / GMAX , A , I + 1 , J ,
096       $                    DESCA , 1 )
097                        ELSE IF( INFO.EQ.0 ) THEN
098                            INFO = J - JA + 1
099                        END IF
100  
101  *                     Update trailing submatrix
102  
103                        IF( J - JA + 1.LT.MN ) THEN
104                            CALL PZGERU( M - J + JA - 1 , N - J + JA - 1 , - ONE , A , I + 1 , J , DESCA ,
105       $                    1 , A , I , J + 1 , DESCA , DESCA( M_ ) , A , I + 1 ,
106       $                    J + 1 , DESCA )
107                        END IF
108     10         CONTINUE
109  
110                CALL IGEBS2D( ICTXT , 'Rowwise' , ROWBTOP , MN , 1 , IPIV( IIA ) ,
111       $        MN )
112  
113            ELSE
114  
115                CALL IGEBR2D( ICTXT , 'Rowwise' , ROWBTOP , MN , 1 , IPIV( IIA ) ,
116       $        MN , MYROW , IACOL )
117  
118            END IF
119  
120            RETURN
121  
122  *         End of PZGETF2
123  
124        END