Routine: PZLARZT()  File: SRC\pzlarzt.f

 
 
# lines: 301
  # code: 301
  # comment: 0
  # blank:0
# Variables:38
# Callers:2
# Callings:0
# Words:88
# Keywords:53
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PZLARZT forms the triangular factor T of a complex block reflector
  H of order > n, which is defined as a product of k elementary
  reflectors as returned by PZTZRZF.
  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular;
  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular.
  If STOREV = 'C', the vector which defines the elementary reflector
  H(i) is stored in the i-th column of the array V, and
     H  =  I - V * T * V'
  If STOREV = 'R', the vector which defines the elementary reflector
  H(i) is stored in the i-th row of the array V, and
     H  =  I - V' * T * V
  Currently, only STOREV = 'R' and DIRECT = 'B' are supported.
  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
  =========
  DIRECT  (global input) CHARACTER
          Specifies the order in which the elementary reflectors are
          multiplied to form the block reflector:
          = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet)
          = 'B': H = H(k) . . . H(2) H(1) (Backward)
  STOREV  (global input) CHARACTER
          Specifies how the vectors which define the elementary
          reflectors are stored (see also Further Details):
          = 'C': columnwise                        (not supported yet)
          = 'R': rowwise
  N       (global input) INTEGER
          The number of meaningful entries of the block reflector H.
          N >= 0.
  K       (global input) INTEGER
          The order of the triangular factor T (= the number of
          elementary reflectors). 1 <= K <= MB_V (= NB_V).
  V       (input/output) COMPLEX*16 pointer into the local memory
          to an array of local dimension (LOCr(IV+K-1),LOCc(JV+N-1)).
          The distributed matrix V contains the Householder vectors.
          See further details.
  IV      (global input) INTEGER
          The row index in the global array V indicating the first
          row of sub( V ).
  JV      (global input) INTEGER
          The column index in the global array V indicating the
          first column of sub( V ).
  DESCV   (global and local input) INTEGER array of dimension DLEN_.
          The array descriptor for the distributed matrix V.
  TAU     (local input) COMPLEX*16, array, dimension LOCr(IV+K-1)
          if INCV = M_V, and LOCc(JV+K-1) otherwise. This array
          contains the Householder scalars related to the Householder
          vectors.  TAU is tied to the distributed matrix V.
  T       (local output) COMPLEX*16 array, dimension (MB_V,MB_V)
          It contains the k-by-k triangular factor of the block
          reflector associated with V. T is lower triangular.
  WORK    (local workspace) COMPLEX*16 array,
                                           dimension (K*(K-1)/2)
  Further Details
  ===============
  The shape of the matrix V and the storage of the vectors which define
  the H(i) is best illustrated by the following example with n = 5 and
  k = 3. The elements equal to 1 are not stored; the corresponding
  array elements are modified but restored on exit. The rest of the
  array is not used.
  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
                                              ______V_____
         ( v1 v2 v3 )                        /            \
         ( v1 v2 v3 )                      ( v1 v1 v1 v1 v1 . . . . 1 )
     V = ( v1 v2 v3 )                      ( v2 v2 v2 v2 v2 . . . 1   )
         ( v1 v2 v3 )                      ( v3 v3 v3 v3 v3 . . 1     )
         ( v1 v2 v3 )
            .  .  .
            .  .  .
            1  .  .
               1  .
                  1
  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R':
                                                        ______V_____
            1                                          /            \
            .  1                           ( 1 . . . . v1 v1 v1 v1 v1 )
            .  .  1                        ( . 1 . . . v2 v2 v2 v2 v2 )
            .  .  .                        ( . . 1 . . v3 v3 v3 v3 v3 )
            .  .  .
         ( v1 v2 v3 )
         ( v1 v2 v3 )
     V = ( v1 v2 v3 )
         ( v1 v2 v3 )
         ( v1 v2 v3 )
  =====================================================================
     .. Parameters ..

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

 
001        SUBROUTINE PZLARZT( DIRECT , STOREV , N , K , V , IV , JV , DESCV , TAU ,
002       $T , WORK )
003  
004  *     -- ScaLAPACK auxiliary routine(version 1.7) --
005  *     University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
006  *     and University of California , Berkeley.
007  *     May 1 , 1997
008  
009  *     .. Scalar Arguments ..
010        CHARACTER DIRECT , STOREV
011        INTEGER IV , JV , K , N
012        INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
013       $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
014        PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
015       $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
016       $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
017        COMPLEX*16 ZERO
018        PARAMETER( ZERO =( 0.0D + 0 , 0.0D + 0 ) )
019  *     ..
020  *     .. Local Scalars ..
021        INTEGER ICOFF , ICTXT , II , IIV , INFO , IVCOL , IVROW ,
022       $ITMP0 , ITMP1 , IW , JJV , LDV , MYCOL , MYROW ,
023       $NPCOL , NPROW , NQ
024  *     ..
025  *     .. External Subroutines ..
026        EXTERNAL BLACS_ABORT , BLACS_GRIDINFO , INFOG2L , PXERBLA ,
027       $ZCOPY , ZGEMV , ZGSUM2D , ZLACGV ,
028       $ZLASET , ZTRMV
029  *     ..
030  *     .. External Functions ..
031        LOGICAL LSAME
032        INTEGER NUMROC
033        EXTERNAL LSAME , NUMROC
034  *     ..
035  *     .. Intrinsic Functions ..
036        INTRINSIC MOD
037  *     ..
038  *     .. Executable Statements ..
039  
040  *     Get grid parameters
041  
042        ICTXT = DESCV( CTXT_ )
043        CALL BLACS_GRIDINFO( ICTXT , NPROW , NPCOL , MYROW , MYCOL )
044  
045  *     Check for currently supported options
046  
047        INFO = 0
048        IF( .NOT.LSAME( DIRECT , 'B' ) ) THEN
049            INFO = - 1
050        ELSE IF( .NOT.LSAME( STOREV , 'R' ) ) THEN
051            INFO = - 2
052        END IF
053        IF( INFO.NE.0 ) THEN
054            CALL PXERBLA( ICTXT , 'PZLARZT' , - INFO )
055            CALL BLACS_ABORT( ICTXT , 1 )
056            RETURN
057        END IF
058  
059        CALL INFOG2L( IV , JV , DESCV , NPROW , NPCOL , MYROW , MYCOL ,
060       $IIV , JJV , IVROW , IVCOL )
061  
062        IF( MYROW.EQ.IVROW ) THEN
063            IW = 1
064            ITMP0 = 0
065            LDV = DESCV( LLD_ )
066            ICOFF = MOD( JV - 1 , DESCV( NB_ ) )
067            NQ = NUMROC( N + ICOFF , DESCV( NB_ ) , MYCOL , IVCOL , NPCOL )
068            IF( MYCOL.EQ.IVCOL )
069       $        NQ = NQ - ICOFF
070  
071                DO 10 II = IIV + K - 2 , IIV , - 1
072  
073  *                 T(i + 1 : k , i) = - tau( iv + i - 1 ) *
074  *                 V(iv + i : iv + k - 1 , jv : jv + n - 1) * V(iv + i - 1 , jv : jv + n - 1)'
075  
076                    ITMP0 = ITMP0 + 1
077                    IF( NQ.GT.0 ) THEN
078                        CALL ZLACGV( NQ , V( II + (JJV - 1)*LDV ) , LDV )
079                        CALL ZGEMV( 'No transpose' , ITMP0 , NQ , - TAU( II ) ,
080       $                V( II + 1 + (JJV - 1)*LDV ) , LDV ,
081       $                V( II + (JJV - 1)*LDV ) , LDV , ZERO , WORK( IW ) ,
082       $                1 )
083                        CALL ZLACGV( NQ , V( II + (JJV - 1)*LDV ) , LDV )
084                    ELSE
085                        CALL ZLASET( 'All' , ITMP0 , 1 , ZERO , ZERO , WORK( IW ) ,
086       $                ITMP0 )
087                    END IF
088                    IW = IW + ITMP0
089  
090     10         CONTINUE
091  
092                CALL ZGSUM2D( ICTXT , 'Rowwise' , ' ' , IW - 1 , 1 , WORK , IW - 1 ,
093       $        MYROW , IVCOL )
094  
095                IF( MYCOL.EQ.IVCOL ) THEN
096  
097                    IW = 1
098                    ITMP0 = 0
099                    ITMP1 = K + 1 + (K - 1) * DESCV( MB_ )
100  
101                    T( ITMP1 - 1 ) = TAU( IIV + K - 1 )
102  
103                    DO 20 II = IIV + K - 2 , IIV , - 1
104  
105  *                     T(i + 1 : k , i) = T(i + 1 : k , i + 1 : k) * T(i + 1 : k , i)
106  
107                        ITMP0 = ITMP0 + 1
108                        ITMP1 = ITMP1 - DESCV( MB_ ) - 1
109                        CALL ZCOPY( ITMP0 , WORK( IW ) , 1 , T( ITMP1 ) , 1 )
110                        IW = IW + ITMP0
111  
112                        CALL ZTRMV( 'Lower' , 'No transpose' , 'Non - unit' , ITMP0 ,
113       $                T( ITMP1 + DESCV( MB_ ) ) , DESCV( MB_ ) ,
114       $                T( ITMP1 ) , 1 )
115                        T( ITMP1 - 1 ) = TAU( II )
116  
117     20             CONTINUE
118  
119                END IF
120  
121            END IF
122  
123            RETURN
124  
125  *         End of PZLARZT
126  
127        END