Routine: PCLAUU2()  File: SRC\pclauu2.f

 
 
# lines: 214
  # code: 214
  # comment: 0
  # blank:0
# Variables:33
# Callers:1
# Callings:0
# Words:68
# Keywords:41
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PCLAUU2 computes the product U * U' or L' * L, where the triangular
  factor U or L is stored in the upper or lower triangular part of
  the matrix sub( A ) = A(IA:IA+N-1,JA:JA+N-1).
  If UPLO = 'U' or 'u' then the upper triangle of the result is stored,
  overwriting the factor U in sub( A ).
  If UPLO = 'L' or 'l' then the lower triangle of the result is stored,
  overwriting the factor L in sub( A ).
  This is the unblocked form of the algorithm, calling Level 2 BLAS.
  No communication is performed by this routine, the matrix to operate
  on should be strictly local to one process.
  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
  Arguments
  =========
  UPLO    (global input) CHARACTER*1
          Specifies whether the triangular factor stored in the matrix
          sub( A ) is upper or lower triangular:
          = 'U':  Upper triangular,
          = 'L':  Lower triangular.
  N       (global input) INTEGER
          The number of rows and columns to be operated on, i.e. the
          order of the order of the triangular factor U or L.  N >= 0.
  A       (local input/local output) COMPLEX pointer into the
          local memory to an array of dimension (LLD_A, LOCc(JA+N-1)).
          On entry, the local pieces of the triangular factor L or U.
          On exit, if UPLO = 'U', the upper triangle of the distributed
          matrix sub( A ) is overwritten with the upper triangle of the
          product U * U'; if UPLO = 'L', the lower triangle of sub( A )
          is overwritten with the lower triangle of the product L' * L.
  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.
  =====================================================================
     .. Parameters ..

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

 
001        SUBROUTINE PCLAUU2( UPLO , N , A , IA , JA , DESCA )
002  
003  *     -- ScaLAPACK auxiliary 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        CHARACTER UPLO
010        INTEGER IA , JA , N
011        INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
012       $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
013        PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
014       $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
015       $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
016        COMPLEX ONE
017        PARAMETER( ONE =( 1.0E + 0 , 0.0E + 0 ) )
018  *     ..
019  *     .. Local Scalars ..
020        INTEGER IACOL , IAROW , ICURR , IDIAG , IIA , IOFFA , JJA ,
021       $LDA , MYCOL , MYROW , NA , NPCOL , NPROW
022        REAL AII
023  *     ..
024  *     .. External Subroutines ..
025        EXTERNAL BLACS_GRIDINFO , CGEMV , CLACGV ,
026       $CSSCAL , INFOG2L
027  *     ..
028  *     .. External Functions ..
029        LOGICAL LSAME
030        COMPLEX CDOTC
031        EXTERNAL CDOTC , LSAME
032  *     ..
033  *     .. Intrinsic Functions ..
034        INTRINSIC CMPLX , REAL
035  *     ..
036  *     .. Executable Statements ..
037  
038  *     Quick return if possible
039  
040        IF( N.EQ.0 )
041       $    RETURN
042  
043  *         Get grid parameters and compute local indexes
044  
045            CALL BLACS_GRIDINFO( DESCA( CTXT_ ) , NPROW , NPCOL , MYROW , MYCOL )
046            CALL INFOG2L( IA , JA , DESCA , NPROW , NPCOL , MYROW , MYCOL , IIA , JJA ,
047       $    IAROW , IACOL )
048  
049            IF( MYROW.EQ.IAROW .AND. MYCOL.EQ.IACOL ) THEN
050  
051                LDA = DESCA( LLD_ )
052                IDIAG = IIA + ( JJA - 1 ) * LDA
053                IOFFA = IDIAG
054  
055                IF( LSAME( UPLO , 'U' ) ) THEN
056  
057  *                 Compute the product U * U'.
058  
059                    DO 10 NA = N - 1 , 1 , - 1
060                        AII = A( IDIAG )
061                        ICURR = IDIAG + LDA
062                        A( IDIAG ) = AII*AII + REAL( CDOTC( NA , A( ICURR ) , LDA ,
063       $                A( ICURR ) , LDA ) )
064                        CALL CLACGV( NA , A( ICURR ) , LDA )
065                        CALL CGEMV( 'No transpose' , N - NA - 1 , NA , ONE ,
066       $                A( IOFFA + LDA ) , LDA , A( ICURR ) , LDA ,
067       $                CMPLX( AII ) , A( IOFFA ) , 1 )
068                        CALL CLACGV( NA , A( ICURR ) , LDA )
069                        IDIAG = IDIAG + LDA + 1
070                        IOFFA = IOFFA + LDA
071     10             CONTINUE
072                    AII = A( IDIAG )
073                    CALL CSSCAL( N , AII , A( IOFFA ) , 1 )
074  
075                ELSE
076  
077  *                 Compute the product L' * L.
078  
079                    DO 20 NA = 1 , N - 1
080                        AII = A( IDIAG )
081                        ICURR = IDIAG + 1
082                        A(IDIAG) = AII*AII + REAL( CDOTC( N - NA , A( ICURR ) , 1 ,
083       $                A( ICURR ) , 1 ) )
084                        CALL CLACGV( NA - 1 , A( IOFFA ) , LDA )
085                        CALL CGEMV( 'Conjugate transpose' , N - NA , NA - 1 , ONE ,
086       $                A( IOFFA + 1 ) , LDA , A( ICURR ) , 1 ,
087       $                CMPLX( AII ) , A( IOFFA ) , LDA )
088                        CALL CLACGV( NA - 1 , A( IOFFA ) , LDA )
089                        IDIAG = IDIAG + LDA + 1
090                        IOFFA = IOFFA + 1
091     20             CONTINUE
092                    AII = A( IDIAG )
093                    CALL CSSCAL( N , AII , A( IOFFA ) , LDA )
094  
095                END IF
096  
097            END IF
098  
099            RETURN
100  
101  *         End of PCLAUU2
102  
103        END