Routine: PZLAHQR()  File: SRC\pzlahqr.f

 
 
# lines: 2550
  # code: 2550
  # comment: 0
  # blank:0
# Variables:73
# Callers:0
# Callings:4
# Words:2886
# Keywords:1198
 

 

..
     .. Local Scalars ..
     ..
     .. Local Arrays ..
     ..
     .. External Functions ..
     ..
     .. External Subroutines ..
     ..
     .. Intrinsic Functions ..
     ..
     .. Statement Functions ..
     ..
     .. Statement Function definitions ..
     ..
     .. Executable Statements ..
     NODE (IAFIRST,JAFIRST) OWNS A(1,1)
     Determine the number of columns we have so we can check workspace
     Set work array indices
     Find a value for ROTN
     Set machine-dependent constants for the stopping criterion.
     If NORM(H) <= SQRT(OVFL), overflow should not occur.
     I1 and I2 are the indices of the first row and last column of H
     to which transformations must be applied. If eigenvalues only are
     being computed, I1 and I2 are set inside the main loop.
     ITN is the total number of QR iterations allowed.
     The main loop begins here. I is the loop index and decreases from
     IHI to ILO in steps of our schur block size (<=2*IBLK). Each
     iteration of the loop works  with the active submatrix in rows
     and columns L to I.   Eigenvalues I+1 to IHI have already
     converged. Either L = ILO or the global A(L,L-1) is negligible
     so that the matrix splits.
     Perform QR iterations on rows and columns ILO to I until a
     submatrix of order 1 or 2 splits off at the bottom because a
     subdiagonal element has become negligible.
        Look for a single small subdiagonal element.
           H(L,L-1) is negligible
        Exit from loop if a submatrix of order 1 or 2 has split off.
           For Schur form, use 2x2 blocks
           If we don't want the Schur form, use bigger blocks.
        Now the active submatrix is in rows and columns L to I. If
        eigenvalues only are being computed, only the active submatrix
        need be transformed.
        Copy submatrix of size 2*JBLK and prepare to do generalized
           Wilkinson shift or an exceptional shift
           Make sure it's divisible by LCM (we want even workloads!)
           Exceptional shift.
           Prepare to use Wilkinson's double shift
        Look for two consecutive small subdiagonal elements:
           PZLACONSB is the routine that does this.
        Double-shift QR step
        NBULGE is the number of bulges that will be attempted
        Do not exceed maximum determined.
           Make sure it's divisible by LCM (we want even workloads!)
        If we are starting in the middle because of consecutive small
           subdiagonal elements, we need to see how many bulges we
           can send through without breaking the consecutive small
           subdiagonal property.
           Copy a chunk of elements from global A(M-1:,M-1:)
              Find a new NBULGE based on the bulges we have.
              Everyone needs to receive the new NBULGE
        IBULGE is the number of bulges going so far
        "A" row defs : main row transforms from LOCALK to LOCALI2
        "A" col defs : main col transforms from LOCALI1 to LOCALM
        Which row & column will start the bulges
        Set all values for bulges.  All bulges are stored in
          intermediate steps as loops over KI.  Their current "task"
          over the global M to I-1 values is always K1(KI) to K2(KI).
          However, because there are many bulges, K1(KI) & K2(KI) might
          go past that range while later bulges (KI+1,KI+2,etc..) are
          finishing up.  Even if ROTN=1, in order to minimize border
          communication sometimes K1(KI)=HBL-2 & K2(KI)=HBL-1 so both
          border messages can be handled at once.
        Rules:
              If MOD(K1(KI)-1,HBL) < HBL-2 then MOD(K2(KI)-1,HBL)<HBL-2
              If MOD(K1(KI)-1,HBL) = HBL-1 then MOD(K2(KI)-1,HBL)=HBL-1
              K2(KI)-K1(KI) <= ROTN
        We first hit a border when MOD(K1(KI)-1,HBL)=HBL-2 and we hit
        it again when MOD(K1(KI)-1,HBL)=HBL-1.
        Get first transform on node who owns M+2,M+2
        The main implicit shift Francis loops over the bulges starts
           here!
        When we hit a border, there are row and column transforms that
          overlap over several processors and the code gets very
          "congested."  As a remedy, when we first hit a border, a 6x6
          *local* matrix is generated on one node (called SMALLA) and
          work is done on that.  At the end of the border, the data is
          passed back and everything stays a lot simpler.
                 Copy 6 elements from global A(K-1:K+4,K-1:K+4)
                 Copy 6 elements from global A(K-2:K+3,K-2:K+3)
           ZLAHQR used to have a single row application and a single
              column application to H.  Here we do something a little
              more clever.  We break each transformation down into 3
              parts:
                  1.) The minimum amount of work it takes to determine
                        a group of ROTN transformations (this is on
                        the critical path.) (Loops 50-120)
                  (the data is broadcast now: loops 180-240)
                  2.) The small work it takes so that each of the rows
                        and columns is at the same place.  For example,
                        all ROTN row transforms are all complete
                        through some column TMP.  (Loops 250-260)
                  3.) The majority of the row and column transforms
                        are then applied in a block fashion.
                        (row transforms are in loops 280-380)
                        (col transforms are in loops 400-540)
           Each of these three parts are further subdivided into 3
           parts:
               A.) Work at the start of a border when
                       MOD(ISTART-1,HBL) = HBL-2
               B.) Work at the end of a border when
                       MOD(ISTART-1,HBL) = HBL-1
               C.) Work in the middle of the block when
                       MOD(ISTART-1,HBL) < HBL-2
           Further optimization is met with the boolean SKIP.  A border
              communication can be broken into several parts for
              efficient parallelism:
                 Loop over all the bulges, just sending the data out
                 Loop over all the bulges, just doing the work
                 Loop over all the bulges, just sending the data back.
                 Following differs in comparison to pdlahqr.
                    Do some work so next step is ready...
                    Set a subdiagonal to zero now if it's possible
                 Following differs in comparison to pdlahqr.
                    Do some work so next step is ready...
              (IROW1,ICOL1) is (I,J)-coordinates of H(ISTART,ISTART)
                 The ELSE part of this IF needs updated VCOPY, this
                 was not necessary in PDLAHQR.

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

 
0001        SUBROUTINE PZLAHQR( WANTT , WANTZ , N , ILO , IHI , A , DESCA , W , ILOZ ,
0002       $IHIZ , Z , DESCZ , WORK , LWORK , IWORK , ILWORK ,
0003       $INFO )
0004  
0005  *     -- ScaLAPACK routine(version 1.7.3) --
0006  *     University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
0007  *     and University of California , Berkeley.
0008  *     1.7.3 : March 22 , 2006
0009  *     modification suggested by Mark Fahey and Greg Henry
0010  *     1.7.0 : July 31 , 2001
0011  
0012  *     .. Scalar Arguments ..
0013        LOGICAL WANTT , WANTZ
0014        INTEGER IHI , IHIZ , ILO , ILOZ , ILWORK , INFO , LWORK , N
0015  *     ..
0016  *     .. Array Arguments ..
0017        INTEGER DESCA( * ) , DESCZ( * ) , IWORK( * )
0018        COMPLEX*16 A( * ) , W( * ) , WORK( * ) , Z( * )
0019  *     ..
0020  
0021  *     Purpose
0022  *     === ====
0023  
0024  *     PZLAHQR is an auxiliary routine used to find the Schur decomposition
0025  *     and or eigenvalues of a matrix already in Hessenberg form from
0026  *     cols ILO to IHI.
0027  *     If Z = I , and WANTT = WANTZ = .TRUE. , H gets replaced with Z'HZ ,
0028  *     with Z'Z = I , and H in Schur form.
0029  
0030  *     Notes
0031  *     === ==
0032  
0033  *     Each global data object is described by an associated description
0034  *     vector. This vector stores the information required to establish
0035  *     the mapping between an object element and its corresponding process
0036  *     and memory location.
0037  
0038  *     Let A be a generic term for any 2D block cyclicly distributed array.
0039  *     Such a global array has an associated description vector DESCA.
0040  *     In the following comments , the character _ should be read as
0041  *     "of the global array".
0042  
0043  *     NOTATION STORED IN EXPLANATION
0044  *     --- ------------ -------------- --------------------------------------
0045  *     DTYPE_A(global) DESCA( DTYPE_ )The descriptor type. In this case ,
0046  *     DTYPE_A = 1.
0047  *     CTXT_A(global) DESCA( CTXT_ ) The BLACS context handle , indicating
0048  *     the BLACS process grid A is distribu -
0049  *     ted over. The context itself is glo -
0050  *     bal , but the handle(the integer
0051  *     value) may vary.
0052  *     M_A(global) DESCA( M_ ) The number of rows in the global
0053  *     array A.
0054  *     N_A(global) DESCA( N_ ) The number of columns in the global
0055  *     array A.
0056  *     MB_A(global) DESCA( MB_ ) The blocking factor used to distribute
0057  *     the rows of the array.
0058  *     NB_A(global) DESCA( NB_ ) The blocking factor used to distribute
0059  *     the columns of the array.
0060  *     RSRC_A(global) DESCA( RSRC_ ) The process row over which the first
0061  *     row of the array A is distributed.
0062  *     CSRC_A(global) DESCA( CSRC_ ) The process column over which the
0063  *     first column of the array A is
0064  *     distributed.
0065  *     LLD_A(local) DESCA( LLD_ ) The leading dimension of the local
0066  *     array. LLD_A >= MAX(1 , LOCp(M_A)).
0067  
0068  *     Let K be the number of rows or columns of a distributed matrix ,
0069  *     and assume that its process grid has dimension p x q.
0070  *     LOCp( K ) denotes the number of elements of K that a process
0071  *     would receive if K were distributed over the p processes of its
0072  *     process column.
0073  *     Similarly , LOCq( K ) denotes the number of elements of K that a
0074  *     process would receive if K were distributed over the q processes of
0075  *     its process row.
0076  *     The values of LOCp() and LOCq() may be determined via a call to the
0077  *     ScaLAPACK tool function , NUMROC :
0078  *     LOCp( M ) = NUMROC( M , MB_A , MYROW , RSRC_A , NPROW ) ,
0079  *     LOCq( N ) = NUMROC( N , NB_A , MYCOL , CSRC_A , NPCOL ).
0080  *     An upper bound for these quantities may be computed by :
0081  *     LOCp( M ) <= ceil( ceil(M / MB_A) / NPROW )*MB_A
0082  *     LOCq( N ) <= ceil( ceil(N / NB_A) / NPCOL )*NB_A
0083  
0084  *     Arguments
0085  *     === ======
0086  
0087  *     WANTT(global input) LOGICAL
0088  *     = .TRUE. : the full Schur form T is required ;
0089  *     = .FALSE. : only eigenvalues are required.
0090  
0091  *     WANTZ(global input) LOGICAL
0092  *     = .TRUE. : the matrix of Schur vectors Z is required ;
0093  *     = .FALSE. : Schur vectors are not required.
0094  
0095  *     N(global input) INTEGER
0096  *     The order of the Hessenberg matrix A(and Z if WANTZ).
0097  *     N >= 0.
0098  
0099  *     ILO(global input) INTEGER
0100  *     IHI(global input) INTEGER
0101  *     It is assumed that A is already upper quasi - triangular in
0102  *     rows and columns IHI + 1 : N , and that A(ILO , ILO - 1) = 0(unless
0103  *     ILO = 1). PZLAHQR works primarily with the Hessenberg
0104  *     submatrix in rows and columns ILO to IHI , but applies
0105  *     transformations to all of H if WANTT is .TRUE..
0106  *     1 <= ILO <= max(1 , IHI) ; IHI <= N.
0107  
0108  *     A(global input / output) COMPLEX*16 array , dimension
0109  *     (DESCA(LLD_) ,*)
0110  *     On entry , the upper Hessenberg matrix A.
0111  *     On exit , if WANTT is .TRUE. , A is upper triangular in rows
0112  *     and columns ILO : IHI. If WANTT is .FALSE. , the contents of
0113  *     A are unspecified on exit.
0114  
0115  *     DESCA(global and local input) INTEGER array of dimension DLEN_.
0116  *     The array descriptor for the distributed matrix A.
0117  
0118  *     W(global replicated output) COMPLEX*16 array , dimension(N)
0119  *     The computed eigenvalues ILO to IHI are stored in the
0120  *     corresponding elements of W. If WANTT is .TRUE. , the
0121  *     eigenvalues are stored in the same order as on the diagonal
0122  *     of the Schur form returned in A. A may be returned with
0123  *     larger diagonal blocks until the next release.
0124  
0125  *     ILOZ(global input) INTEGER
0126  *     IHIZ(global input) INTEGER
0127  *     Specify the rows of Z to which transformations must be
0128  *     applied if WANTZ is .TRUE..
0129  *     1 <= ILOZ <= ILO ; IHI <= IHIZ <= N.
0130  
0131  *     Z(global input / output) COMPLEX*16 array.
0132  *     If WANTZ is .TRUE. , on entry Z must contain the current
0133  *     matrix Z of transformations accumulated by PZHSEQR , and on
0134  *     exit Z has been updated ; transformations are applied only to
0135  *     the submatrix Z(ILOZ : IHIZ , ILO : IHI).
0136  *     If WANTZ is .FALSE. , Z is not referenced.
0137  
0138  *     DESCZ(global and local input) INTEGER array of dimension DLEN_.
0139  *     The array descriptor for the distributed matrix Z.
0140  
0141  *     WORK(local output) COMPLEX*16 array of size LWORK
0142  *     (Unless LWORK =- 1 , in which case WORK must be at least size 1)
0143  
0144  *     LWORK(local input) INTEGER
0145  *     WORK(LWORK) is a local array and LWORK is assumed big enough
0146  *     so that LWORK >= 3*N +
0147  *     MAX( 2*MAX(DESCZ(LLD_) , DESCA(LLD_)) + 2*LOCq(N) ,
0148  *     7*Ceil(N / HBL) / LCM(NPROW , NPCOL)) +
0149  *     MAX( 2*N ,(8*LCM(NPROW , NPCOL) + 2)**2 )
0150  *     If LWORK =- 1 , then WORK(1) gets set to the above number and
0151  *     the code returns immediately.
0152  
0153  *     IWORK(global and local input) INTEGER array of size ILWORK
0154  *     This will hold some of the IBLK integer arrays.
0155  *     This is held as a place holder for a future release.
0156  *     Currently unreferenced.
0157  
0158  *     ILWORK(local input) INTEGER
0159  *     This will hold the size of the IWORK array.
0160  *     This is held as a place holder for a future release.
0161  *     Currently unreferenced.
0162  
0163  *     INFO(global output) INTEGER
0164  *     < 0 : parameter number - INFO incorrect or inconsistent
0165  *     = 0 : successful exit
0166  *     > 0 : PZLAHQR failed to compute all the eigenvalues ILO to IHI
0167  *     in a total of 30*(IHI - ILO + 1) iterations ; if INFO = i ,
0168  *     elements i + 1 : ihi of W contains those eigenvalues
0169  *     which have been successfully computed.
0170  
0171  *     Logic :
0172  *     This algorithm is very similar to DLAHQR. Unlike DLAHQR ,
0173  *     instead of sending one double shift through the largest
0174  *     unreduced submatrix , this algorithm sends multiple double shifts
0175  *     and spaces them apart so that there can be parallelism across
0176  *     several processor row / columns. Another critical difference is
0177  *     that this algorithm aggregrates multiple transforms together in
0178  *     order to apply them in a block fashion.
0179  
0180  *     Important Local Variables :
0181  *     IBLK = The maximum number of bulges that can be computed.
0182  *     Currently fixed. Future releases this won't be fixed.
0183  *     HBL = The square block size(HBL = DESCA(MB_) = DESCA(NB_))
0184  *     ROTN = The number of transforms to block together
0185  *     NBULGE = The number of bulges that will be attempted on the
0186  *     current submatrix.
0187  *     IBULGE = The current number of bulges started.
0188  *     K1(*) , K2(*) = The current bulge loops from K1(*) to K2(*).
0189  
0190  *     Subroutines :
0191  *     From LAPACK , this routine calls :
0192  *     ZLAHQR -> Serial QR used to determine shifts and
0193  *     eigenvalues
0194  *     ZLARFG -> Determine the Householder transforms
0195  
0196  *     This ScaLAPACK , this routine calls :
0197  *     PZLACONSB -> To determine where to start each iteration
0198  *     ZLAMSH -> Sends multiple shifts through a small
0199  *     submatrix to see how the consecutive
0200  *     subdiagonals change(if PZLACONSB indicates
0201  *     we can start a run in the middle)
0202  *     PZLAWIL -> Given the shift , get the transformation
0203  *     PZLACP3 -> Parallel array to local replicated array copy
0204  *     & back.
0205  *     ZLAREF -> Row / column reflector applier. Core routine
0206  *     here.
0207  *     PZLASMSUB -> Finds negligible subdiagonal elements.
0208  
0209  *     Current Notes and / or Restrictions :
0210  *     1.) This code requires the distributed block size to be square
0211  *     and at least six(6) ; unlike simpler codes like LU , this
0212  *     algorithm is extremely sensitive to block size. Unwise
0213  *     choices of too small a block size can lead to bad
0214  *     performance.
0215  *     2.) This code requires A and Z to be distributed identically
0216  *     and have identical contxts. A future version may allow Z to
0217  *     have a different contxt to 1D row map it to all nodes(so no
0218  *     communication on Z is necessary.)
0219  *     3.) This code does not currently block the initial transforms
0220  *     so that none of the rows or columns for any bulge are
0221  *     completed until all are started. To offset pipeline
0222  *     start - up it is recommended that at least 2*LCM(NPROW , NPCOL)
0223  *     bulges are used(if possible)
0224  *     4.) The maximum number of bulges currently supported is fixed at
0225  *     32. In future versions this will be limited only by the
0226  *     incoming WORK and IWORK array.
0227  *     5.) The matrix A must be in upper Hessenberg form. If elements
0228  *     below the subdiagonal are nonzero , the resulting transforms
0229  *     may be nonsimilar. This is also true with the LAPACK
0230  *     routine ZLAHQR.
0231  *     6.) For this release , this code has only been tested for
0232  *     RSRC_ = CSRC_ = 0 , but it has been written for the general case.
0233  *     7.) Currently , all the eigenvalues are distributed to all the
0234  *     nodes. Future releases will probably distribute the
0235  *     eigenvalues by the column partitioning.
0236  *     8.) The internals of this routine are subject to change.
0237  *     9.) To optimize this for your architecture , try tuning ZLAREF.
0238  *     10.) This code has only been tested for WANTZ = .TRUE. and may
0239  *     behave unpredictably for WANTZ set to .FALSE.
0240  
0241  *     Further Details
0242  *     === ============
0243  
0244  *     Contributed by Mark Fahey , June , 2000.
0245  
0246  *     === ==================================================================
0247  
0248  *     .. Parameters ..
0249        INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DT_ ,
0250       $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
0251        PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DT_ = 1 ,
0252       $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
0253       $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
0254        DOUBLE PRECISION RONE
0255        PARAMETER( RONE = 1.0D + 0 )
0256        COMPLEX*16 ZERO , ONE
0257        PARAMETER( ZERO =( 0.0D + 0 , 0.0D + 0 ) ,
0258       $ONE =( 1.0D + 0 , 0.0D + 0 ) )
0259        DOUBLE PRECISION CONST
0260        PARAMETER( CONST = 1.50D + 0 )
0261        INTEGER IBLK
0262        PARAMETER( IBLK = 32 )
0263        IF( ISTART.GT.M ) THEN
0264            VCOPY( 1 ) = SMALLA( 4 , 3 , KI )
0265            VCOPY( 2 ) = SMALLA( 5 , 3 , KI )
0266            VCOPY( 3 ) = SMALLA( 6 , 3 , KI )
0267            NR = MIN( 3 , I - ISTART + 1 )
0268            CALL ZLARFG( NR , VCOPY( 1 ) , VCOPY( 2 ) , 1 ,
0269       $    T1COPY )
0270            A(( ICOL1 - 2 )*LDA + IROW1 ) = VCOPY( 1 )
0271            A(( ICOL1 - 2 )*LDA + IROW1 + 1 ) = ZERO
0272            IF( ISTART.LT.I - 1 ) THEN
0273                A(( ICOL1 - 2 )*LDA + IROW1 + 2 ) = ZERO
0274            END IF
0275        ELSE
0276  
0277  *         If NPCOL.NE.1 THEN we need updated VCOPY.
0278  
0279            NR = MIN( 3 , I - ISTART + 1 )
0280            IF( NPCOL.EQ.1 ) THEN
0281                VCOPY( 1 ) = V1SAVE
0282                VCOPY( 2 ) = V2SAVE
0283                VCOPY( 3 ) = V3SAVE
0284            ELSE
0285  
0286  *             Get updated VCOPY from RIGHT
0287  
0288                CALL ZGERV2D( CONTXT , 3 , 1 , VCOPY , 3 , MYROW ,
0289       $        RIGHT )
0290            END IF
0291            CALL ZLARFG( NR , VCOPY( 1 ) , VCOPY( 2 ) , 1 ,
0292       $    T1COPY )
0293            IF( M.GT.L ) THEN
0294  
0295  *             Following differs in comparison to pdlahqr.
0296  
0297                A(( ICOL1 - 2 )*LDA + IROW1 ) = A(( ICOL1 - 2 )*LDA +
0298       $        IROW1 )*DCONJG( ONE - T1COPY )
0299            END IF
0300        END IF
0301        END IF
0302  
0303        IF(( MYROW.EQ.ICURROW( KI ) ) .AND.
0304       $( MYCOL.EQ.ICURCOL( KI ) ) .AND.
0305       $((( MODKM1.EQ.HBL - 2 ) .AND.( ISTART.EQ.I -
0306       $1 ) ) .OR.(( MODKM1.LT.HBL - 2 ) .AND.( ISTART.LE.I -
0307       $1 ) ) ) ) THEN
0308  
0309  *     (IROW1 , ICOL1) is(I , J) - coordinates of H(ISTART , ISTART)
0310  
0311        IROW1 = KROW( KI )
0312        ICOL1 = KCOL( KI )
0313        DO 110 K = ISTART , ISTOP
0314  
0315  *         Create and do these transforms
0316  
0317            NR = MIN( 3 , I - K + 1 )
0318            IF( K.GT.M ) THEN
0319                IF( MOD( K - 1 , HBL ).EQ.0 ) THEN
0320                    VCOPY( 1 ) = SMALLA( 4 , 3 , KI )
0321                    VCOPY( 2 ) = SMALLA( 5 , 3 , KI )
0322                    VCOPY( 3 ) = SMALLA( 6 , 3 , KI )
0323                ELSE
0324                    VCOPY( 1 ) = A(( ICOL1 - 2 )*LDA + IROW1 )
0325                    VCOPY( 2 ) = A(( ICOL1 - 2 )*LDA + IROW1 + 1 )
0326                    IF( NR.EQ.3 ) THEN
0327                        VCOPY( 3 ) = A(( ICOL1 - 2 )*LDA + IROW1 + 2 )
0328                    END IF
0329                END IF
0330            ELSE
0331                VCOPY( 1 ) = V1SAVE
0332                VCOPY( 2 ) = V2SAVE
0333                VCOPY( 3 ) = V3SAVE
0334            END IF
0335  
0336  *         Must send uptodate copy of VCOPY to left.
0337  
0338            IF( NPCOL.GT.1 .AND. ISTART.LE.M .AND.
0339       $        MOD( K - 1 , HBL ).EQ.0 ) THEN
0340                CALL ZGESD2D( CONTXT , 3 , 1 , VCOPY , 3 , MYROW ,
0341       $        LEFT )
0342            END IF
0343            CALL ZLARFG( NR , VCOPY( 1 ) , VCOPY( 2 ) , 1 ,
0344       $    T1COPY )
0345            IF( K.GT.M ) THEN
0346                IF( MOD( K - 1 , HBL ).GT.0 ) THEN
0347                    A(( ICOL1 - 2 )*LDA + IROW1 ) = VCOPY( 1 )
0348                    A(( ICOL1 - 2 )*LDA + IROW1 + 1 ) = ZERO
0349                    IF( K.LT.I - 1 ) THEN
0350                        A(( ICOL1 - 2 )*LDA + IROW1 + 2 ) = ZERO
0351                    END IF
0352  
0353  *                 Set a subdiagonal to zero now if it's possible
0354  
0355                    IF(( IROW1.GT.2 ) .AND.( ICOL1.GT.2 ) .AND.
0356       $( K - 2.GT.M ) .AND.( MOD( K - 1 ,
0357       $            HBL ).GT.1 ) ) THEN
0358                    H11 = A(( ICOL1 - 3 )*LDA + IROW1 - 2 )
0359                    H10 = A(( ICOL1 - 3 )*LDA + IROW1 - 1 )
0360                    H22 = A(( ICOL1 - 2 )*LDA + IROW1 - 1 )
0361                    S = CABS1( H11 ) + CABS1( H22 )
0362                    IF( CABS1( H10 ).LE.MAX( ULP*S , SMLNUM ) )
0363       $                THEN
0364                        A(( ICOL1 - 3 )*LDA + IROW1 - 1 ) = ZERO
0365                    END IF
0366                END IF
0367            END IF
0368        ELSE IF( M.GT.L ) THEN
0369            IF( MOD( K - 1 , HBL ).GT.0 ) THEN
0370  
0371  *             Following differs in comparison to pdlahqr.
0372  
0373                A(( ICOL1 - 2 )*LDA + IROW1 ) = A(( ICOL1 - 2 )*
0374       $        LDA + IROW1 )*DCONJG( ONE - T1COPY )
0375            END IF
0376        END IF
0377        V2 = VCOPY( 2 )
0378        T2 = T1COPY*V2
0379        WORK( VECSIDX + ( K - 1 )*3 + 1 ) = VCOPY( 2 )
0380        WORK( VECSIDX + ( K - 1 )*3 + 2 ) = VCOPY( 3 )
0381        WORK( VECSIDX + ( K - 1 )*3 + 3 ) = T1COPY
0382        T1 = T1COPY
0383        IF( K.LT.ISTOP ) THEN
0384  
0385  *         Do some work so next step is ready...
0386  
0387            V3 = VCOPY( 3 )
0388            T3 = T1*V3
0389            DO 90 J =( ICOL1 - 1 )*LDA + IROW1 ,
0390       $( MIN( K2( KI ) + 1 , I - 1 ) + ICOL1 - K - 1 )*
0391       $        LDA + IROW1 , LDA
0392                SUM = DCONJG( T1 )*A( J ) +
0393       $        DCONJG( T2 )*A( J + 1 ) +
0394       $        DCONJG( T3 )*A( J + 2 )
0395                A( J ) = A( J ) - SUM
0396                A( J + 1 ) = A( J + 1 ) - SUM*V2
0397                A( J + 2 ) = A( J + 2 ) - SUM*V3
0398     90     CONTINUE
0399            DO 100 J = IROW1 + 1 , IROW1 + 3
0400                SUM = T1*A(( ICOL1 - 1 )*LDA + J ) +
0401       $        T2*A( ICOL1*LDA + J ) +
0402       $        T3*A(( ICOL1 + 1 )*LDA + J )
0403                A(( ICOL1 - 1 )*LDA + J ) = A(( ICOL1 - 1 )*LDA +
0404       $        J ) - SUM
0405                A( ICOL1*LDA + J ) = A( ICOL1*LDA + J ) -
0406       $        SUM*DCONJG( V2 )
0407                A(( ICOL1 + 1 )*LDA + J ) = A(( ICOL1 + 1 )*LDA +
0408       $        J ) - SUM*DCONJG( V3 )
0409    100     CONTINUE
0410        END IF
0411        IROW1 = IROW1 + 1
0412        ICOL1 = ICOL1 + 1
0413    110 CONTINUE
0414        END IF
0415    120 CONTINUE
0416  
0417  *     First part of applying the transforms is complete.
0418  *     Broadcasts of the Householder data is done here.
0419  
0420        DO 130 KI = 1 , IBULGE
0421  
0422            ISTART = MAX( K1( KI ) , M )
0423            ISTOP = MIN( K2( KI ) , I - 1 )
0424  
0425  *         Broadcast Householder information from the block
0426  
0427            IF(( MYROW.EQ.ICURROW( KI ) ) .AND.( NPCOL.GT.1 ) .AND.
0428       $( ISTART.LE.ISTOP ) ) THEN
0429            IF( MYCOL.NE.ICURCOL( KI ) ) THEN
0430                CALL ZGEBR2D( CONTXT , 'ROW' , ' ' ,
0431       $        3*( ISTOP - ISTART + 1 ) , 1 ,
0432       $        WORK( VECSIDX + ( ISTART - 1 )*3 + 1 ) ,
0433       $        3*( ISTOP - ISTART + 1 ) , MYROW ,
0434       $        ICURCOL( KI ) )
0435            ELSE
0436                CALL ZGEBS2D( CONTXT , 'ROW' , ' ' ,
0437       $        3*( ISTOP - ISTART + 1 ) , 1 ,
0438       $        WORK( VECSIDX + ( ISTART - 1 )*3 + 1 ) ,
0439       $        3*( ISTOP - ISTART + 1 ) )
0440            END IF
0441        END IF
0442    130 CONTINUE
0443  
0444  *     Now do column transforms and finish work
0445  
0446        DO 140 KI = 1 , IBULGE
0447  
0448            ISTART = MAX( K1( KI ) , M )
0449            ISTOP = MIN( K2( KI ) , I - 1 )
0450  
0451            IF(( MYCOL.EQ.ICURCOL( KI ) ) .AND.( NPROW.GT.1 ) .AND.
0452       $( ISTART.LE.ISTOP ) ) THEN
0453            IF( MYROW.NE.ICURROW( KI ) ) THEN
0454                CALL ZGEBR2D( CONTXT , 'COL' , ' ' ,
0455       $        3*( ISTOP - ISTART + 1 ) , 1 ,
0456       $        WORK( VECSIDX + ( ISTART - 1 )*3 + 1 ) ,
0457       $        3*( ISTOP - ISTART + 1 ) , ICURROW( KI ) ,
0458       $        MYCOL )
0459            ELSE
0460                CALL ZGEBS2D( CONTXT , 'COL' , ' ' ,
0461       $        3*( ISTOP - ISTART + 1 ) , 1 ,
0462       $        WORK( VECSIDX + ( ISTART - 1 )*3 + 1 ) ,
0463       $        3*( ISTOP - ISTART + 1 ) )
0464            END IF
0465        END IF
0466    140 CONTINUE
0467  
0468  *     Now do make up work to have things in block fashion
0469  
0470        DO 160 KI = 1 , IBULGE
0471            ISTART = MAX( K1( KI ) , M )
0472            ISTOP = MIN( K2( KI ) , I - 1 )
0473  
0474            MODKM1 = MOD( ISTART - 1 , HBL )
0475            IF(( MYROW.EQ.ICURROW( KI ) ) .AND.
0476       $( MYCOL.EQ.ICURCOL( KI ) ) .AND.
0477       $((( MODKM1.EQ.HBL - 2 ) .AND.( ISTART.EQ.I -
0478       $    1 ) ) .OR.(( MODKM1.LT.HBL - 2 ) .AND.( ISTART.LE.I -
0479       $    1 ) ) ) ) THEN
0480  
0481  *         (IROW1 , ICOL1) is(I , J) - coordinates of H(ISTART , ISTART)
0482  
0483            IROW1 = KROW( KI )
0484            ICOL1 = KCOL( KI )
0485            DO 150 K = ISTART , ISTOP
0486  
0487  *             Catch up on column & border work
0488  
0489                NR = MIN( 3 , I - K + 1 )
0490                V2 = WORK( VECSIDX + ( K - 1 )*3 + 1 )
0491                V3 = WORK( VECSIDX + ( K - 1 )*3 + 2 )
0492                T1 = WORK( VECSIDX + ( K - 1 )*3 + 3 )
0493                T2 = T1*V2
0494                IF( K.LT.ISTOP ) THEN
0495  
0496  *                 Do some work so next step is ready...
0497  
0498                    T3 = T1*V3
0499                    CALL ZLAREF ( 'Col' , A , LDA , .FALSE. , Z , LDZ ,
0500       $            .FALSE. , ICOL1 , ICOL1 , ISTART ,
0501       $            ISTOP , MIN( ISTART + 1 , I ) - K + IROW1 ,
0502       $            IROW1 , LILOZ , LIHIZ ,
0503       $            WORK( VECSIDX + 1 ) , V2 , V3 , T1 , T2 ,
0504       $            T3 )
0505                    IROW1 = IROW1 + 1
0506                    ICOL1 = ICOL1 + 1
0507                ELSE
0508                    IF(( NR.EQ.3 ) .AND.( MOD( K - 1 ,
0509       $            HBL ).LT.HBL - 2 ) ) THEN
0510                    T3 = T1*V3
0511                    CALL ZLAREF ( 'Row' , A , LDA , .FALSE. , Z , LDZ ,
0512       $            .FALSE. , IROW1 , IROW1 , ISTART ,
0513       $            ISTOP , ICOL1 , MIN( MIN( K2( KI )
0514       $            + 1 , I - 1 ) , I2 ) - K + ICOL1 , LILOZ ,
0515       $            LIHIZ , WORK( VECSIDX + 1 ) , V2 ,
0516       $            V3 , T1 , T2 , T3 )
0517                END IF
0518            END IF
0519    150     CONTINUE
0520        END IF
0521  
0522  *     Send SMALLA back again.
0523  
0524        K = ISTART
0525        MODKM1 = MOD( K - 1 , HBL )
0526        IF(( MODKM1.GE.HBL - 2 ) .AND.( K.LE.I - 1 ) ) THEN
0527            IF(( MODKM1.EQ.HBL - 2 ) .AND.( K.LT.I - 1 ) ) THEN
0528  
0529  *             Copy 6 elements from global A(K - 1 : K + 4 , K - 1 : K + 4)
0530  
0531                ITMP1 = ICURROW( KI )
0532                ITMP2 = ICURCOL( KI )
0533                CALL PZLACP3 ( MIN( 6 , N - K + 2 ) , K - 1 , A , DESCA ,
0534       $        SMALLA( 1 , 1 , KI ) , 6 , ITMP1 , ITMP2 ,
0535       $        1 )
0536  
0537            END IF
0538            IF( MODKM1.EQ.HBL - 1 ) THEN
0539  
0540  *             Copy 6 elements from global A(K - 2 : K + 3 , K - 2 : K + 3)
0541  
0542                ITMP1 = ICURROW( KI )
0543                ITMP2 = ICURCOL( KI )
0544                CALL PZLACP3 ( MIN( 6 , N - K + 3 ) , K - 2 , A , DESCA ,
0545       $        SMALLA( 1 , 1 , KI ) , 6 , ITMP1 , ITMP2 ,
0546       $        1 )
0547            END IF
0548        END IF
0549  
0550    160 CONTINUE
0551  
0552    170 CONTINUE
0553  
0554  *     Now start major set of block ROW reflections
0555  
0556        DO 180 KI = 1 , IBULGE
0557            IF(( MYROW.NE.ICURROW( KI ) ) .AND.
0558       $( DOWN.NE.ICURROW( KI ) ) )GO TO 180
0559            ISTART = MAX( K1( KI ) , M )
0560            ISTOP = MIN( K2( KI ) , I - 1 )
0561  
0562            IF(( ISTOP.GT.ISTART ) .AND.
0563       $( MOD( ISTART - 1 , HBL ).LT.HBL - 2 ) .AND.
0564       $( ICURROW( KI ).EQ.MYROW ) ) THEN
0565            IROW1 = MIN( K2( KI ) + 1 , I - 1 ) + 1
0566            CALL INFOG1L( IROW1 , HBL , NPCOL , MYCOL , JAFIRST ,
0567       $    ITMP1 , ITMP2 )
0568            ITMP2 = LOCALI2
0569            II = KROW( KI )
0570            CALL ZLAREF ( 'Row' , A , LDA , WANTZ , Z , LDZ , .TRUE. , II ,
0571       $    II , ISTART , ISTOP , ITMP1 , ITMP2 , LILOZ ,
0572       $    LIHIZ , WORK( VECSIDX + 1 ) , V2 , V3 , T1 , T2 ,
0573       $    T3 )
0574        END IF
0575    180 CONTINUE
0576  
0577        DO 220 KI = 1 , IBULGE
0578            IF( KROW( KI ).GT.KP2ROW( KI ) )
0579       $        GO TO 220
0580                IF(( MYROW.NE.ICURROW( KI ) ) .AND.
0581       $( DOWN.NE.ICURROW( KI ) ) )GO TO 220
0582                ISTART = MAX( K1( KI ) , M )
0583                ISTOP = MIN( K2( KI ) , I - 1 )
0584                IF(( ISTART.EQ.ISTOP ) .OR.
0585       $( MOD( ISTART - 1 , HBL ).GE.HBL - 2 ) .OR.
0586       $( ICURROW( KI ).NE.MYROW ) ) THEN
0587                DO 210 K = ISTART , ISTOP
0588                    V2 = WORK( VECSIDX + ( K - 1 )*3 + 1 )
0589                    V3 = WORK( VECSIDX + ( K - 1 )*3 + 2 )
0590                    T1 = WORK( VECSIDX + ( K - 1 )*3 + 3 )
0591                    NR = MIN( 3 , I - K + 1 )
0592                    IF(( NR.EQ.3 ) .AND.( KROW( KI ).LE.
0593       $            KP2ROW( KI ) ) ) THEN
0594                    IF(( K.LT.ISTOP ) .AND.
0595       $( MOD( K - 1 , HBL ).LT.HBL - 2 ) ) THEN
0596                    ITMP1 = MIN( K2( KI ) + 1 , I - 1 ) + 1
0597                ELSE
0598                    IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
0599                        ITMP1 = MIN( K2( KI ) + 1 , I - 1 ) + 1
0600                    END IF
0601                    IF( MOD( K - 1 , HBL ).EQ.HBL - 2 ) THEN
0602                        ITMP1 = MIN( K + 4 , I2 ) + 1
0603                    END IF
0604                    IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
0605                        ITMP1 = MIN( K + 3 , I2 ) + 1
0606                    END IF
0607                END IF
0608  
0609  *             Find local coor of rows K through K + 2
0610  
0611                IROW1 = KROW( KI )
0612                IROW2 = KP2ROW( KI )
0613                IF(( K.GT.ISTART ) .AND.
0614       $( MOD( K - 1 , HBL ).GE.HBL - 2 ) ) THEN
0615                IF( DOWN.EQ.ICURROW( KI ) ) THEN
0616                    IROW1 = IROW1 + 1
0617                END IF
0618                IF( MYROW.EQ.ICURROW( KI ) ) THEN
0619                    IROW2 = IROW2 + 1
0620                END IF
0621            END IF
0622            CALL INFOG1L( ITMP1 , HBL , NPCOL , MYCOL , JAFIRST ,
0623       $    ICOL1 , ICOL2 )
0624            ICOL2 = LOCALI2
0625            IF(( MOD( K - 1 , HBL ).LT.HBL - 2 ) .OR.
0626       $( NPROW.EQ.1 ) ) THEN
0627            T2 = T1*V2
0628            T3 = T1*V3
0629            CALL ZLAREF ( 'Row' , A , LDA , WANTZ , Z , LDZ ,
0630       $    .FALSE. , IROW1 , IROW1 , ISTART ,
0631       $    ISTOP , ICOL1 , ICOL2 , LILOZ ,
0632       $    LIHIZ , WORK( VECSIDX + 1 ) , V2 ,
0633       $    V3 , T1 , T2 , T3 )
0634        END IF
0635        IF(( MOD( K - 1 , HBL ).EQ.HBL - 2 ) .AND.
0636       $( NPROW.GT.1 ) ) THEN
0637        IF( IROW1.NE.IROW2 ) THEN
0638            CALL ZGESD2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0639       $    A(( ICOL1 - 1 )*LDA + IROW1 ) ,
0640       $    LDA , DOWN , MYCOL )
0641            IF( SKIP .AND.( ISTART.EQ.ISTOP ) ) THEN
0642                CALL ZGERV2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0643       $        A(( ICOL1 - 1 )*LDA +
0644       $        IROW1 ) , LDA , DOWN ,
0645       $        MYCOL )
0646            END IF
0647        ELSE IF( SKIP ) THEN
0648            CALL ZGERV2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0649       $    WORK( IRBUF + 1 ) , 2 , UP ,
0650       $    MYCOL )
0651            T2 = T1*V2
0652            T3 = T1*V3
0653            DO 190 J = ICOL1 , ICOL2
0654                SUM = DCONJG( T1 )*
0655       $        WORK( IRBUF + 2*( J - ICOL1 ) + 1 ) +
0656       $        DCONJG( T2 )*WORK( IRBUF + 2*
0657       $( J - ICOL1 ) + 2 ) +
0658       $        DCONJG( T3 )*A(( J - 1 )*LDA +
0659       $        IROW1 )
0660                WORK( IRBUF + 2*( J - ICOL1 ) + 1 )
0661       $        = WORK( IRBUF + 2*( J - ICOL1 ) + 1 ) -
0662       $        SUM
0663                WORK( IRBUF + 2*( J - ICOL1 ) + 2 )
0664       $        = WORK( IRBUF + 2*( J - ICOL1 ) + 2 ) -
0665       $        SUM*V2
0666                A(( J - 1 )*LDA + IROW1 ) = A(( J - 1 )*
0667       $        LDA + IROW1 ) - SUM*V3
0668    190     CONTINUE
0669            IF( ISTART.EQ.ISTOP ) THEN
0670                CALL ZGESD2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0671       $        WORK( IRBUF + 1 ) , 2 , UP ,
0672       $        MYCOL )
0673            END IF
0674        END IF
0675        END IF
0676        IF(( MOD( K - 1 , HBL ).EQ.HBL - 1 ) .AND.
0677       $( NPROW.GT.1 ) ) THEN
0678        IF( IROW1.EQ.IROW2 ) THEN
0679            IF( ISTART.EQ.ISTOP ) THEN
0680                CALL ZGESD2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0681       $        A(( ICOL1 - 1 )*LDA + IROW1 -
0682       $        1 ) , LDA , DOWN , MYCOL )
0683            END IF
0684            IF( SKIP ) THEN
0685                CALL ZGERV2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0686       $        A(( ICOL1 - 1 )*LDA + IROW1 -
0687       $        1 ) , LDA , DOWN , MYCOL )
0688            END IF
0689        ELSE IF( SKIP ) THEN
0690            IF( ISTART.EQ.ISTOP ) THEN
0691                CALL ZGERV2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0692       $        WORK( IRBUF + 1 ) , 2 , UP ,
0693       $        MYCOL )
0694            END IF
0695            T2 = T1*V2
0696            T3 = T1*V3
0697            DO 200 J = ICOL1 , ICOL2
0698                SUM = DCONJG( T1 )*
0699       $        WORK( IRBUF + 2*( J - ICOL1 ) + 2 ) +
0700       $        DCONJG( T2 )*A(( J - 1 )*LDA +
0701       $        IROW1 ) + DCONJG( T3 )*
0702       $        A(( J - 1 )*LDA + IROW1 + 1 )
0703                WORK( IRBUF + 2*( J - ICOL1 ) + 2 )
0704       $        = WORK( IRBUF + 2*( J - ICOL1 ) + 2 ) -
0705       $        SUM
0706                A(( J - 1 )*LDA + IROW1 ) = A(( J - 1 )*
0707       $        LDA + IROW1 ) - SUM*V2
0708                A(( J - 1 )*LDA + IROW1 + 1 ) = A(( J - 1 )*
0709       $        LDA + IROW1 + 1 ) - SUM*V3
0710    200     CONTINUE
0711            CALL ZGESD2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0712       $    WORK( IRBUF + 1 ) , 2 , UP ,
0713       $    MYCOL )
0714  
0715        END IF
0716        END IF
0717        END IF
0718    210 CONTINUE
0719        END IF
0720    220 CONTINUE
0721  
0722        IF( SKIP )
0723       $    GO TO 290
0724  
0725            DO 260 KI = 1 , IBULGE
0726                IF( KROW( KI ).GT.KP2ROW( KI ) )
0727       $            GO TO 260
0728                    IF(( MYROW.NE.ICURROW( KI ) ) .AND.
0729       $( DOWN.NE.ICURROW( KI ) ) )GO TO 260
0730                    ISTART = MAX( K1( KI ) , M )
0731                    ISTOP = MIN( K2( KI ) , I - 1 )
0732                    IF(( ISTART.EQ.ISTOP ) .OR.
0733       $( MOD( ISTART - 1 , HBL ).GE.HBL - 2 ) .OR.
0734       $( ICURROW( KI ).NE.MYROW ) ) THEN
0735                    DO 250 K = ISTART , ISTOP
0736                        V2 = WORK( VECSIDX + ( K - 1 )*3 + 1 )
0737                        V3 = WORK( VECSIDX + ( K - 1 )*3 + 2 )
0738                        T1 = WORK( VECSIDX + ( K - 1 )*3 + 3 )
0739                        NR = MIN( 3 , I - K + 1 )
0740                        IF(( NR.EQ.3 ) .AND.( KROW( KI ).LE.
0741       $                KP2ROW( KI ) ) ) THEN
0742                        IF(( K.LT.ISTOP ) .AND.
0743       $( MOD( K - 1 , HBL ).LT.HBL - 2 ) ) THEN
0744                        ITMP1 = MIN( K2( KI ) + 1 , I - 1 ) + 1
0745                    ELSE
0746                        IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
0747                            ITMP1 = MIN( K2( KI ) + 1 , I - 1 ) + 1
0748                        END IF
0749                        IF( MOD( K - 1 , HBL ).EQ.HBL - 2 ) THEN
0750                            ITMP1 = MIN( K + 4 , I2 ) + 1
0751                        END IF
0752                        IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
0753                            ITMP1 = MIN( K + 3 , I2 ) + 1
0754                        END IF
0755                    END IF
0756  
0757  *                 Find local coor of rows K through K + 2
0758  
0759                    IROW1 = KROW( KI )
0760                    IROW2 = KP2ROW( KI )
0761                    IF(( K.GT.ISTART ) .AND.
0762       $( MOD( K - 1 , HBL ).GE.HBL - 2 ) ) THEN
0763                    IF( DOWN.EQ.ICURROW( KI ) ) THEN
0764                        IROW1 = IROW1 + 1
0765                    END IF
0766                    IF( MYROW.EQ.ICURROW( KI ) ) THEN
0767                        IROW2 = IROW2 + 1
0768                    END IF
0769                END IF
0770                CALL INFOG1L( ITMP1 , HBL , NPCOL , MYCOL , JAFIRST ,
0771       $        ICOL1 , ICOL2 )
0772                ICOL2 = LOCALI2
0773                IF(( MOD( K - 1 , HBL ).EQ.HBL - 2 ) .AND.
0774       $( NPROW.GT.1 ) ) THEN
0775                IF( IROW1.EQ.IROW2 ) THEN
0776                    CALL ZGERV2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0777       $            WORK( IRBUF + 1 ) , 2 , UP ,
0778       $            MYCOL )
0779                    T2 = T1*V2
0780                    T3 = T1*V3
0781                    DO 230 J = ICOL1 , ICOL2
0782                        SUM = DCONJG( T1 )*
0783       $                WORK( IRBUF + 2*( J - ICOL1 ) + 1 ) +
0784       $                DCONJG( T2 )*WORK( IRBUF + 2*
0785       $( J - ICOL1 ) + 2 ) +
0786       $                DCONJG( T3 )*A(( J - 1 )*LDA +
0787       $                IROW1 )
0788                        WORK( IRBUF + 2*( J - ICOL1 ) + 1 )
0789       $                = WORK( IRBUF + 2*( J - ICOL1 ) + 1 ) -
0790       $                SUM
0791                        WORK( IRBUF + 2*( J - ICOL1 ) + 2 )
0792       $                = WORK( IRBUF + 2*( J - ICOL1 ) + 2 ) -
0793       $                SUM*V2
0794                        A(( J - 1 )*LDA + IROW1 ) = A(( J - 1 )*
0795       $                LDA + IROW1 ) - SUM*V3
0796    230             CONTINUE
0797                    IF( ISTART.EQ.ISTOP ) THEN
0798                        CALL ZGESD2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0799       $                WORK( IRBUF + 1 ) , 2 , UP ,
0800       $                MYCOL )
0801                    END IF
0802                END IF
0803            END IF
0804            IF(( MOD( K - 1 , HBL ).EQ.HBL - 1 ) .AND.
0805       $( NPROW.GT.1 ) ) THEN
0806            IF( IROW1.NE.IROW2 ) THEN
0807                IF( ISTART.EQ.ISTOP ) THEN
0808                    CALL ZGERV2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0809       $            WORK( IRBUF + 1 ) , 2 , UP ,
0810       $            MYCOL )
0811                END IF
0812                T2 = T1*V2
0813                T3 = T1*V3
0814                DO 240 J = ICOL1 , ICOL2
0815                    SUM = DCONJG( T1 )*
0816       $            WORK( IRBUF + 2*( J - ICOL1 ) + 2 ) +
0817       $            DCONJG( T2 )*A(( J - 1 )*LDA +
0818       $            IROW1 ) + DCONJG( T3 )*
0819       $            A(( J - 1 )*LDA + IROW1 + 1 )
0820                    WORK( IRBUF + 2*( J - ICOL1 ) + 2 )
0821       $            = WORK( IRBUF + 2*( J - ICOL1 ) + 2 ) -
0822       $            SUM
0823                    A(( J - 1 )*LDA + IROW1 ) = A(( J - 1 )*
0824       $            LDA + IROW1 ) - SUM*V2
0825                    A(( J - 1 )*LDA + IROW1 + 1 ) = A(( J - 1 )*
0826       $            LDA + IROW1 + 1 ) - SUM*V3
0827    240         CONTINUE
0828                CALL ZGESD2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0829       $        WORK( IRBUF + 1 ) , 2 , UP ,
0830       $        MYCOL )
0831            END IF
0832        END IF
0833        END IF
0834    250 CONTINUE
0835        END IF
0836    260 CONTINUE
0837  
0838        DO 280 KI = 1 , IBULGE
0839            IF( KROW( KI ).GT.KP2ROW( KI ) )
0840       $        GO TO 280
0841                IF(( MYROW.NE.ICURROW( KI ) ) .AND.
0842       $( DOWN.NE.ICURROW( KI ) ) )GO TO 280
0843                ISTART = MAX( K1( KI ) , M )
0844                ISTOP = MIN( K2( KI ) , I - 1 )
0845                IF(( ISTART.EQ.ISTOP ) .OR.
0846       $( MOD( ISTART - 1 , HBL ).GE.HBL - 2 ) .OR.
0847       $( ICURROW( KI ).NE.MYROW ) ) THEN
0848                DO 270 K = ISTART , ISTOP
0849                    V2 = WORK( VECSIDX + ( K - 1 )*3 + 1 )
0850                    V3 = WORK( VECSIDX + ( K - 1 )*3 + 2 )
0851                    T1 = WORK( VECSIDX + ( K - 1 )*3 + 3 )
0852                    NR = MIN( 3 , I - K + 1 )
0853                    IF(( NR.EQ.3 ) .AND.( KROW( KI ).LE.
0854       $            KP2ROW( KI ) ) ) THEN
0855                    IF(( K.LT.ISTOP ) .AND.
0856       $( MOD( K - 1 , HBL ).LT.HBL - 2 ) ) THEN
0857                    ITMP1 = MIN( K2( KI ) + 1 , I - 1 ) + 1
0858                ELSE
0859                    IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
0860                        ITMP1 = MIN( K2( KI ) + 1 , I - 1 ) + 1
0861                    END IF
0862                    IF( MOD( K - 1 , HBL ).EQ.HBL - 2 ) THEN
0863                        ITMP1 = MIN( K + 4 , I2 ) + 1
0864                    END IF
0865                    IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
0866                        ITMP1 = MIN( K + 3 , I2 ) + 1
0867                    END IF
0868                END IF
0869  
0870  *             Find local coor of rows K through K + 2
0871  
0872                IROW1 = KROW( KI )
0873                IROW2 = KP2ROW( KI )
0874                IF(( K.GT.ISTART ) .AND.
0875       $( MOD( K - 1 , HBL ).GE.HBL - 2 ) ) THEN
0876                IF( DOWN.EQ.ICURROW( KI ) ) THEN
0877                    IROW1 = IROW1 + 1
0878                END IF
0879                IF( MYROW.EQ.ICURROW( KI ) ) THEN
0880                    IROW2 = IROW2 + 1
0881                END IF
0882            END IF
0883            CALL INFOG1L( ITMP1 , HBL , NPCOL , MYCOL , JAFIRST ,
0884       $    ICOL1 , ICOL2 )
0885            ICOL2 = LOCALI2
0886            IF(( MOD( K - 1 , HBL ).EQ.HBL - 2 ) .AND.
0887       $( NPROW.GT.1 ) ) THEN
0888            IF( IROW1.NE.IROW2 ) THEN
0889                IF( ISTART.EQ.ISTOP ) THEN
0890                    CALL ZGERV2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0891       $            A(( ICOL1 - 1 )*LDA +
0892       $            IROW1 ) , LDA , DOWN ,
0893       $            MYCOL )
0894                END IF
0895            END IF
0896        END IF
0897        IF(( MOD( K - 1 , HBL ).EQ.HBL - 1 ) .AND.
0898       $( NPROW.GT.1 ) ) THEN
0899        IF( IROW1.EQ.IROW2 ) THEN
0900            CALL ZGERV2D( CONTXT , 2 , ICOL2 - ICOL1 + 1 ,
0901       $    A(( ICOL1 - 1 )*LDA + IROW1 -
0902       $    1 ) , LDA , DOWN , MYCOL )
0903        END IF
0904        END IF
0905        END IF
0906    270 CONTINUE
0907        END IF
0908    280 CONTINUE
0909  
0910    290 CONTINUE
0911  
0912  *     Now start major set of block COL reflections
0913  
0914        DO 300 KI = 1 , IBULGE
0915            IF(( MYCOL.NE.ICURCOL( KI ) ) .AND.
0916       $( RIGHT.NE.ICURCOL( KI ) ) )GO TO 300
0917            ISTART = MAX( K1( KI ) , M )
0918            ISTOP = MIN( K2( KI ) , I - 1 )
0919  
0920            IF((( MOD( ISTART - 1 , HBL ).LT.HBL - 2 ) .OR.( NPCOL.EQ.
0921       $    1 ) ) .AND.( ICURCOL( KI ).EQ.MYCOL ) .AND.
0922       $( I - ISTOP + 1.GE.3 ) ) THEN
0923            K = ISTART
0924            IF(( K.LT.ISTOP ) .AND.( MOD( K - 1 ,
0925       $    HBL ).LT.HBL - 2 ) ) THEN
0926            ITMP1 = MIN( ISTART + 1 , I ) - 1
0927        ELSE
0928            IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
0929                ITMP1 = MIN( K + 3 , I )
0930            END IF
0931            IF( MOD( K - 1 , HBL ).EQ.HBL - 2 ) THEN
0932                ITMP1 = MAX( I1 , K - 1 ) - 1
0933            END IF
0934            IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
0935                ITMP1 = MAX( I1 , K - 2 ) - 1
0936            END IF
0937        END IF
0938  
0939        ICOL1 = KCOL( KI )
0940        CALL INFOG1L( I1 , HBL , NPROW , MYROW , IAFIRST , IROW1 ,
0941       $IROW2 )
0942        IROW2 = NUMROC( ITMP1 , HBL , MYROW , IAFIRST , NPROW )
0943        IF( IROW1.LE.IROW2 ) THEN
0944            ITMP2 = IROW2
0945        ELSE
0946            ITMP2 = - 1
0947        END IF
0948        CALL ZLAREF ( 'Col' , A , LDA , WANTZ , Z , LDZ , .TRUE. ,
0949       $ICOL1 , ICOL1 , ISTART , ISTOP , IROW1 ,
0950       $IROW2 , LILOZ , LIHIZ , WORK( VECSIDX + 1 ) ,
0951       $V2 , V3 , T1 , T2 , T3 )
0952        K = ISTOP
0953        IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
0954  
0955  *         Do from ITMP1 + 1 to MIN(K + 3 , I)
0956  
0957            IF( MOD( K - 1 , HBL ).LT.HBL - 3 ) THEN
0958                IROW1 = ITMP2 + 1
0959                IF( MOD(( ITMP1 / HBL ) , NPROW ).EQ.MYROW )
0960       $            THEN
0961                    IF( ITMP2.GT.0 ) THEN
0962                        IROW2 = ITMP2 + MIN( K + 3 , I ) - ITMP1
0963                    ELSE
0964                        IROW2 = IROW1 - 1
0965                    END IF
0966                ELSE
0967                    IROW2 = IROW1 - 1
0968                END IF
0969            ELSE
0970                CALL INFOG1L( ITMP1 + 1 , HBL , NPROW , MYROW ,
0971       $        IAFIRST , IROW1 , IROW2 )
0972                IROW2 = NUMROC( MIN( K + 3 , I ) , HBL , MYROW ,
0973       $        IAFIRST , NPROW )
0974            END IF
0975            V2 = WORK( VECSIDX + ( K - 1 )*3 + 1 )
0976            V3 = WORK( VECSIDX + ( K - 1 )*3 + 2 )
0977            T1 = WORK( VECSIDX + ( K - 1 )*3 + 3 )
0978            T2 = T1*V2
0979            T3 = T1*V3
0980            ICOL1 = KCOL( KI ) + ISTOP - ISTART
0981            CALL ZLAREF ( 'Col' , A , LDA , .FALSE. , Z , LDZ ,
0982       $    .FALSE. , ICOL1 , ICOL1 , ISTART , ISTOP ,
0983       $    IROW1 , IROW2 , LILOZ , LIHIZ ,
0984       $    WORK( VECSIDX + 1 ) , V2 , V3 , T1 , T2 ,
0985       $    T3 )
0986        END IF
0987        END IF
0988    300 CONTINUE
0989  
0990        DO 360 KI = 1 , IBULGE
0991            IF( KCOL( KI ).GT.KP2COL( KI ) )
0992       $        GO TO 360
0993                IF(( MYCOL.NE.ICURCOL( KI ) ) .AND.
0994       $( RIGHT.NE.ICURCOL( KI ) ) )GO TO 360
0995                ISTART = MAX( K1( KI ) , M )
0996                ISTOP = MIN( K2( KI ) , I - 1 )
0997                IF( MOD( ISTART - 1 , HBL ).GE.HBL - 2 ) THEN
0998  
0999  *                 INFO is found in a buffer
1000  
1001                    ISPEC = 1
1002                ELSE
1003  
1004  *                 All INFO is local
1005  
1006                    ISPEC = 0
1007                END IF
1008                DO 350 K = ISTART , ISTOP
1009  
1010                    V2 = WORK( VECSIDX + ( K - 1 )*3 + 1 )
1011                    V3 = WORK( VECSIDX + ( K - 1 )*3 + 2 )
1012                    T1 = WORK( VECSIDX + ( K - 1 )*3 + 3 )
1013                    NR = MIN( 3 , I - K + 1 )
1014                    IF(( NR.EQ.3 ) .AND.( KCOL( KI ).LE.KP2COL( KI ) ) )
1015       $                THEN
1016  
1017                        IF(( K.LT.ISTOP ) .AND.
1018       $( MOD( K - 1 , HBL ).LT.HBL - 2 ) ) THEN
1019                        ITMP1 = MIN( ISTART + 1 , I ) - 1
1020                    ELSE
1021                        IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
1022                            ITMP1 = MIN( K + 3 , I )
1023                        END IF
1024                        IF( MOD( K - 1 , HBL ).EQ.HBL - 2 ) THEN
1025                            ITMP1 = MAX( I1 , K - 1 ) - 1
1026                        END IF
1027                        IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
1028                            ITMP1 = MAX( I1 , K - 2 ) - 1
1029                        END IF
1030                    END IF
1031                    IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
1032                        ICOL1 = KCOL( KI ) + K - ISTART
1033                        ICOL2 = KP2COL( KI ) + K - ISTART
1034                    ELSE
1035                        ICOL1 = KCOL( KI )
1036                        ICOL2 = KP2COL( KI )
1037                        IF( K.GT.ISTART ) THEN
1038                            IF( RIGHT.EQ.ICURCOL( KI ) ) THEN
1039                                ICOL1 = ICOL1 + 1
1040                            END IF
1041                            IF( MYCOL.EQ.ICURCOL( KI ) ) THEN
1042                                ICOL2 = ICOL2 + 1
1043                            END IF
1044                        END IF
1045                    END IF
1046                    CALL INFOG1L( I1 , HBL , NPROW , MYROW , IAFIRST ,
1047       $            IROW1 , IROW2 )
1048                    IROW2 = NUMROC( ITMP1 , HBL , MYROW , IAFIRST , NPROW )
1049                    IF(( MOD( K - 1 , HBL ).EQ.HBL - 2 ) .AND.
1050       $( NPCOL.GT.1 ) ) THEN
1051                    IF( ICOL1.NE.ICOL2 ) THEN
1052                        CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1053       $                A(( ICOL1 - 1 )*LDA + IROW1 ) ,
1054       $                LDA , MYROW , RIGHT )
1055                        IF(( ISTART.EQ.ISTOP ) .AND. SKIP ) THEN
1056                            CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1057       $                    A(( ICOL1 - 1 )*LDA + IROW1 ) ,
1058       $                    LDA , MYROW , RIGHT )
1059                        END IF
1060                    ELSE IF( SKIP ) THEN
1061                        T2 = T1*V2
1062                        T3 = T1*V3
1063                        CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1064       $                WORK( ICBUF + 1 ) , IROW2 - IROW1 + 1 ,
1065       $                MYROW , LEFT )
1066                        II = ICBUF - IROW1 + 1
1067                        JJ = ICBUF + IROW2 - 2*IROW1 + 2
1068                        DO 310 J = IROW1 , IROW2
1069                            SUM = T1*WORK( II + J ) + T2*WORK( JJ + J ) +
1070       $                    T3*A(( ICOL1 - 1 )*LDA + J )
1071                            WORK( II + J ) = WORK( II + J ) - SUM
1072                            WORK( JJ + J ) = WORK( JJ + J ) -
1073       $                    SUM*DCONJG( V2 )
1074                            A(( ICOL1 - 1 )*LDA + J ) = A(( ICOL1 - 1 )*
1075       $                    LDA + J ) - SUM*DCONJG( V3 )
1076    310                 CONTINUE
1077                        IF( ISTART.EQ.ISTOP ) THEN
1078                            CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1079       $                    WORK( ICBUF + 1 ) ,
1080       $                    IROW2 - IROW1 + 1 , MYROW , LEFT )
1081                        END IF
1082                    END IF
1083                END IF
1084                IF(( MOD( K - 1 , HBL ).EQ.HBL - 1 ) .AND.
1085       $( NPCOL.GT.1 ) ) THEN
1086                IF( ICOL1.EQ.ICOL2 ) THEN
1087                    IF( ISTART.EQ.ISTOP ) THEN
1088                        CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1089       $                A(( ICOL1 - 2 )*LDA + IROW1 ) ,
1090       $                LDA , MYROW , RIGHT )
1091                    END IF
1092                    IF( SKIP ) THEN
1093                        CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1094       $                A(( ICOL1 - 2 )*LDA + IROW1 ) ,
1095       $                LDA , MYROW , RIGHT )
1096                    END IF
1097                ELSE IF( SKIP ) THEN
1098                    IF( ISTART.EQ.ISTOP ) THEN
1099                        CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1100       $                WORK( ICBUF + 1 ) ,
1101       $                IROW2 - IROW1 + 1 , MYROW , LEFT )
1102                    END IF
1103                    T2 = T1*V2
1104                    T3 = T1*V3
1105                    II = ICBUF + IROW2 - 2*IROW1 + 2
1106                    DO 320 J = IROW1 , IROW2
1107                        SUM = T1*WORK( J + II ) +
1108       $                T2*A(( ICOL1 - 1 )*LDA + J ) +
1109       $                T3*A( ICOL1*LDA + J )
1110                        WORK( J + II ) = WORK( J + II ) - SUM
1111                        A(( ICOL1 - 1 )*LDA + J ) = A(( ICOL1 - 1 )*
1112       $                LDA + J ) - SUM*DCONJG( V2 )
1113                        A( ICOL1*LDA + J ) = A( ICOL1*LDA + J ) -
1114       $                SUM*DCONJG( V3 )
1115    320             CONTINUE
1116                    CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1117       $            WORK( ICBUF + 1 ) , IROW2 - IROW1 + 1 ,
1118       $            MYROW , LEFT )
1119                END IF
1120            END IF
1121  
1122  *         If we want Z and we haven't already done any Z
1123  
1124            IF(( WANTZ ) .AND.( MOD( K - 1 ,
1125       $    HBL ).GE.HBL - 2 ) .AND.( NPCOL.GT.1 ) ) THEN
1126  
1127  *         Accumulate transformations in the matrix Z
1128  
1129            IROW1 = LILOZ
1130            IROW2 = LIHIZ
1131            IF( MOD( K - 1 , HBL ).EQ.HBL - 2 ) THEN
1132                IF( ICOL1.NE.ICOL2 ) THEN
1133                    CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1134       $            Z(( ICOL1 - 1 )*LDZ + IROW1 ) ,
1135       $            LDZ , MYROW , RIGHT )
1136                    IF(( ISTART.EQ.ISTOP ) .AND. SKIP ) THEN
1137                        CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1138       $                Z(( ICOL1 - 1 )*LDZ +
1139       $                IROW1 ) , LDZ , MYROW ,
1140       $                RIGHT )
1141                    END IF
1142                ELSE IF( SKIP ) THEN
1143                    CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1144       $            WORK( IZBUF + 1 ) ,
1145       $            IROW2 - IROW1 + 1 , MYROW , LEFT )
1146                    T2 = T1*V2
1147                    T3 = T1*V3
1148                    ICOL1 =( ICOL1 - 1 )*LDZ
1149                    II = IZBUF - IROW1 + 1
1150                    JJ = IZBUF + IROW2 - 2*IROW1 + 2
1151                    DO 330 J = IROW1 , IROW2
1152                        SUM = T1*WORK( II + J ) +
1153       $                T2*WORK( JJ + J ) + T3*Z( ICOL1 + J )
1154                        WORK( II + J ) = WORK( II + J ) - SUM
1155                        WORK( JJ + J ) = WORK( JJ + J ) -
1156       $                SUM*DCONJG( V2 )
1157                        Z( ICOL1 + J ) = Z( ICOL1 + J ) -
1158       $                SUM*DCONJG( V3 )
1159    330             CONTINUE
1160                    IF( ISTART.EQ.ISTOP ) THEN
1161                        CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1162       $                WORK( IZBUF + 1 ) ,
1163       $                IROW2 - IROW1 + 1 , MYROW ,
1164       $                LEFT )
1165                    END IF
1166                END IF
1167            END IF
1168            IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
1169                IF( ICOL1.EQ.ICOL2 ) THEN
1170                    IF( ISTART.EQ.ISTOP ) THEN
1171                        CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1172       $                Z(( ICOL1 - 2 )*LDZ +
1173       $                IROW1 ) , LDZ , MYROW ,
1174       $                RIGHT )
1175                    END IF
1176                    IF( SKIP ) THEN
1177                        CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1178       $                Z(( ICOL1 - 2 )*LDZ +
1179       $                IROW1 ) , LDZ , MYROW ,
1180       $                RIGHT )
1181                    END IF
1182                ELSE IF( SKIP ) THEN
1183                    IF( ISTART.EQ.ISTOP ) THEN
1184                        CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1185       $                WORK( IZBUF + 1 ) ,
1186       $                IROW2 - IROW1 + 1 , MYROW ,
1187       $                LEFT )
1188                    END IF
1189                    T2 = T1*V2
1190                    T3 = T1*V3
1191                    ICOL1 =( ICOL1 - 1 )*LDZ
1192                    II = IZBUF + IROW2 - 2*IROW1 + 2
1193                    DO 340 J = IROW1 , IROW2
1194                        SUM = T1*WORK( II + J ) +
1195       $                T2*Z( J + ICOL1 ) +
1196       $                T3*Z( J + ICOL1 + LDZ )
1197                        WORK( II + J ) = WORK( II + J ) - SUM
1198                        Z( J + ICOL1 ) = Z( J + ICOL1 ) -
1199       $                SUM*DCONJG( V2 )
1200                        Z( J + ICOL1 + LDZ ) = Z( J + ICOL1 + LDZ ) -
1201       $                SUM*DCONJG( V3 )
1202    340             CONTINUE
1203                    CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1204       $            WORK( IZBUF + 1 ) ,
1205       $            IROW2 - IROW1 + 1 , MYROW , LEFT )
1206                END IF
1207            END IF
1208        END IF
1209        END IF
1210    350 CONTINUE
1211    360 CONTINUE
1212  
1213        IF( SKIP )
1214       $    GO TO 450
1215  
1216            DO 420 KI = 1 , IBULGE
1217                IF( KCOL( KI ).GT.KP2COL( KI ) )
1218       $            GO TO 420
1219                    IF(( MYCOL.NE.ICURCOL( KI ) ) .AND.
1220       $( RIGHT.NE.ICURCOL( KI ) ) )GO TO 420
1221                    ISTART = MAX( K1( KI ) , M )
1222                    ISTOP = MIN( K2( KI ) , I - 1 )
1223                    IF( MOD( ISTART - 1 , HBL ).GE.HBL - 2 ) THEN
1224  
1225  *                     INFO is found in a buffer
1226  
1227                        ISPEC = 1
1228                    ELSE
1229  
1230  *                     All INFO is local
1231  
1232                        ISPEC = 0
1233                    END IF
1234                    DO 410 K = ISTART , ISTOP
1235  
1236                        V2 = WORK( VECSIDX + ( K - 1 )*3 + 1 )
1237                        V3 = WORK( VECSIDX + ( K - 1 )*3 + 2 )
1238                        T1 = WORK( VECSIDX + ( K - 1 )*3 + 3 )
1239                        NR = MIN( 3 , I - K + 1 )
1240                        IF(( NR.EQ.3 ) .AND.( KCOL( KI ).LE.KP2COL( KI ) ) )
1241       $                    THEN
1242  
1243                            IF(( K.LT.ISTOP ) .AND.
1244       $( MOD( K - 1 , HBL ).LT.HBL - 2 ) ) THEN
1245                            ITMP1 = MIN( ISTART + 1 , I ) - 1
1246                        ELSE
1247                            IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
1248                                ITMP1 = MIN( K + 3 , I )
1249                            END IF
1250                            IF( MOD( K - 1 , HBL ).EQ.HBL - 2 ) THEN
1251                                ITMP1 = MAX( I1 , K - 1 ) - 1
1252                            END IF
1253                            IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
1254                                ITMP1 = MAX( I1 , K - 2 ) - 1
1255                            END IF
1256                        END IF
1257                        IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
1258                            ICOL1 = KCOL( KI ) + K - ISTART
1259                            ICOL2 = KP2COL( KI ) + K - ISTART
1260                        ELSE
1261                            ICOL1 = KCOL( KI )
1262                            ICOL2 = KP2COL( KI )
1263                            IF( K.GT.ISTART ) THEN
1264                                IF( RIGHT.EQ.ICURCOL( KI ) ) THEN
1265                                    ICOL1 = ICOL1 + 1
1266                                END IF
1267                                IF( MYCOL.EQ.ICURCOL( KI ) ) THEN
1268                                    ICOL2 = ICOL2 + 1
1269                                END IF
1270                            END IF
1271                        END IF
1272                        CALL INFOG1L( I1 , HBL , NPROW , MYROW , IAFIRST ,
1273       $                IROW1 , IROW2 )
1274                        IROW2 = NUMROC( ITMP1 , HBL , MYROW , IAFIRST , NPROW )
1275                        IF(( MOD( K - 1 , HBL ).EQ.HBL - 2 ) .AND.
1276       $( NPCOL.GT.1 ) ) THEN
1277                        IF( ICOL1.EQ.ICOL2 ) THEN
1278                            CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1279       $                    WORK( ICBUF + 1 ) , IROW2 - IROW1 + 1 ,
1280       $                    MYROW , LEFT )
1281                            T2 = T1*V2
1282                            T3 = T1*V3
1283                            II = ICBUF - IROW1 + 1
1284                            JJ = ICBUF + IROW2 - 2*IROW1 + 2
1285                            DO 370 J = IROW1 , IROW2
1286                                SUM = T1*WORK( II + J ) + T2*WORK( JJ + J ) +
1287       $                        T3*A(( ICOL1 - 1 )*LDA + J )
1288                                WORK( II + J ) = WORK( II + J ) - SUM
1289                                WORK( JJ + J ) = WORK( JJ + J ) -
1290       $                        SUM*DCONJG( V2 )
1291                                A(( ICOL1 - 1 )*LDA + J ) = A(( ICOL1 - 1 )*
1292       $                        LDA + J ) - SUM*DCONJG( V3 )
1293    370                     CONTINUE
1294                            IF( ISTART.EQ.ISTOP ) THEN
1295                                CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1296       $                        WORK( ICBUF + 1 ) ,
1297       $                        IROW2 - IROW1 + 1 , MYROW , LEFT )
1298                            END IF
1299                        END IF
1300                    END IF
1301                    IF(( MOD( K - 1 , HBL ).EQ.HBL - 1 ) .AND.
1302       $( NPCOL.GT.1 ) ) THEN
1303                    IF( ICOL1.NE.ICOL2 ) THEN
1304                        IF( ISTART.EQ.ISTOP ) THEN
1305                            CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1306       $                    WORK( ICBUF + 1 ) ,
1307       $                    IROW2 - IROW1 + 1 , MYROW , LEFT )
1308                        END IF
1309                        T2 = T1*V2
1310                        T3 = T1*V3
1311                        II = ICBUF + IROW2 - 2*IROW1 + 2
1312                        DO 380 J = IROW1 , IROW2
1313                            SUM = T1*WORK( J + II ) +
1314       $                    T2*A(( ICOL1 - 1 )*LDA + J ) +
1315       $                    T3*A( ICOL1*LDA + J )
1316                            WORK( J + II ) = WORK( J + II ) - SUM
1317                            A(( ICOL1 - 1 )*LDA + J ) = A(( ICOL1 - 1 )*
1318       $                    LDA + J ) - SUM*DCONJG( V2 )
1319                            A( ICOL1*LDA + J ) = A( ICOL1*LDA + J ) -
1320       $                    SUM*DCONJG( V3 )
1321    380                 CONTINUE
1322                        CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1323       $                WORK( ICBUF + 1 ) , IROW2 - IROW1 + 1 ,
1324       $                MYROW , LEFT )
1325                    END IF
1326                END IF
1327  
1328  *             If we want Z and we haven't already done any Z
1329                IF(( WANTZ ) .AND.( MOD( K - 1 ,
1330       $        HBL ).GE.HBL - 2 ) .AND.( NPCOL.GT.1 ) ) THEN
1331  
1332  *             Accumulate transformations in the matrix Z
1333  
1334                IROW1 = LILOZ
1335                IROW2 = LIHIZ
1336                IF( MOD( K - 1 , HBL ).EQ.HBL - 2 ) THEN
1337                    IF( ICOL1.EQ.ICOL2 ) THEN
1338                        CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1339       $                WORK( IZBUF + 1 ) ,
1340       $                IROW2 - IROW1 + 1 , MYROW , LEFT )
1341                        T2 = T1*V2
1342                        T3 = T1*V3
1343                        ICOL1 =( ICOL1 - 1 )*LDZ
1344                        II = IZBUF - IROW1 + 1
1345                        JJ = IZBUF + IROW2 - 2*IROW1 + 2
1346                        DO 390 J = IROW1 , IROW2
1347                            SUM = T1*WORK( II + J ) +
1348       $                    T2*WORK( JJ + J ) + T3*Z( ICOL1 + J )
1349                            WORK( II + J ) = WORK( II + J ) - SUM
1350                            WORK( JJ + J ) = WORK( JJ + J ) -
1351       $                    SUM*DCONJG( V2 )
1352                            Z( ICOL1 + J ) = Z( ICOL1 + J ) -
1353       $                    SUM*DCONJG( V3 )
1354    390                 CONTINUE
1355                        IF( ISTART.EQ.ISTOP ) THEN
1356                            CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1357       $                    WORK( IZBUF + 1 ) ,
1358       $                    IROW2 - IROW1 + 1 , MYROW ,
1359       $                    LEFT )
1360                        END IF
1361                    END IF
1362                END IF
1363                IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
1364                    IF( ICOL1.NE.ICOL2 ) THEN
1365                        IF( ISTART.EQ.ISTOP ) THEN
1366                            CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1367       $                    WORK( IZBUF + 1 ) ,
1368       $                    IROW2 - IROW1 + 1 , MYROW ,
1369       $                    LEFT )
1370                        END IF
1371                        T2 = T1*V2
1372                        T3 = T1*V3
1373                        ICOL1 =( ICOL1 - 1 )*LDZ
1374                        II = IZBUF + IROW2 - 2*IROW1 + 2
1375                        DO 400 J = IROW1 , IROW2
1376                            SUM = T1*WORK( II + J ) +
1377       $                    T2*Z( J + ICOL1 ) +
1378       $                    T3*Z( J + ICOL1 + LDZ )
1379                            WORK( II + J ) = WORK( II + J ) - SUM
1380                            Z( J + ICOL1 ) = Z( J + ICOL1 ) -
1381       $                    SUM*DCONJG( V2 )
1382                            Z( J + ICOL1 + LDZ ) = Z( J + ICOL1 + LDZ ) -
1383       $                    SUM*DCONJG( V3 )
1384    400                 CONTINUE
1385                        CALL ZGESD2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1386       $                WORK( IZBUF + 1 ) ,
1387       $                IROW2 - IROW1 + 1 , MYROW , LEFT )
1388                    END IF
1389                END IF
1390            END IF
1391        END IF
1392    410 CONTINUE
1393    420 CONTINUE
1394  
1395        DO 440 KI = 1 , IBULGE
1396            IF( KCOL( KI ).GT.KP2COL( KI ) )
1397       $        GO TO 440
1398                IF(( MYCOL.NE.ICURCOL( KI ) ) .AND.
1399       $( RIGHT.NE.ICURCOL( KI ) ) )GO TO 440
1400                ISTART = MAX( K1( KI ) , M )
1401                ISTOP = MIN( K2( KI ) , I - 1 )
1402                IF( MOD( ISTART - 1 , HBL ).GE.HBL - 2 ) THEN
1403  
1404  *                 INFO is found in a buffer
1405  
1406                    ISPEC = 1
1407                ELSE
1408  
1409  *                 All INFO is local
1410  
1411                    ISPEC = 0
1412                END IF
1413                DO 430 K = ISTART , ISTOP
1414  
1415                    V2 = WORK( VECSIDX + ( K - 1 )*3 + 1 )
1416                    V3 = WORK( VECSIDX + ( K - 1 )*3 + 2 )
1417                    T1 = WORK( VECSIDX + ( K - 1 )*3 + 3 )
1418                    NR = MIN( 3 , I - K + 1 )
1419                    IF(( NR.EQ.3 ) .AND.( KCOL( KI ).LE.KP2COL( KI ) ) )
1420       $                THEN
1421  
1422                        IF(( K.LT.ISTOP ) .AND.
1423       $( MOD( K - 1 , HBL ).LT.HBL - 2 ) ) THEN
1424                        ITMP1 = MIN( ISTART + 1 , I ) - 1
1425                    ELSE
1426                        IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
1427                            ITMP1 = MIN( K + 3 , I )
1428                        END IF
1429                        IF( MOD( K - 1 , HBL ).EQ.HBL - 2 ) THEN
1430                            ITMP1 = MAX( I1 , K - 1 ) - 1
1431                        END IF
1432                        IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
1433                            ITMP1 = MAX( I1 , K - 2 ) - 1
1434                        END IF
1435                    END IF
1436                    IF( MOD( K - 1 , HBL ).LT.HBL - 2 ) THEN
1437                        ICOL1 = KCOL( KI ) + K - ISTART
1438                        ICOL2 = KP2COL( KI ) + K - ISTART
1439                    ELSE
1440                        ICOL1 = KCOL( KI )
1441                        ICOL2 = KP2COL( KI )
1442                        IF( K.GT.ISTART ) THEN
1443                            IF( RIGHT.EQ.ICURCOL( KI ) ) THEN
1444                                ICOL1 = ICOL1 + 1
1445                            END IF
1446                            IF( MYCOL.EQ.ICURCOL( KI ) ) THEN
1447                                ICOL2 = ICOL2 + 1
1448                            END IF
1449                        END IF
1450                    END IF
1451                    CALL INFOG1L( I1 , HBL , NPROW , MYROW , IAFIRST ,
1452       $            IROW1 , IROW2 )
1453                    IROW2 = NUMROC( ITMP1 , HBL , MYROW , IAFIRST , NPROW )
1454                    IF(( MOD( K - 1 , HBL ).EQ.HBL - 2 ) .AND.
1455       $( NPCOL.GT.1 ) ) THEN
1456                    IF( ICOL1.NE.ICOL2 ) THEN
1457                        IF( ISTART.EQ.ISTOP ) THEN
1458                            CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1459       $                    A(( ICOL1 - 1 )*LDA + IROW1 ) ,
1460       $                    LDA , MYROW , RIGHT )
1461                        END IF
1462                    END IF
1463                END IF
1464                IF(( MOD( K - 1 , HBL ).EQ.HBL - 1 ) .AND.
1465       $( NPCOL.GT.1 ) ) THEN
1466                IF( ICOL1.EQ.ICOL2 ) THEN
1467                    CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1468       $            A(( ICOL1 - 2 )*LDA + IROW1 ) ,
1469       $            LDA , MYROW , RIGHT )
1470                END IF
1471            END IF
1472  
1473  *         If we want Z and we haven't already done any Z
1474  
1475            IF(( WANTZ ) .AND.( MOD( K - 1 ,
1476       $    HBL ).GE.HBL - 2 ) .AND.( NPCOL.GT.1 ) ) THEN
1477  
1478  *         Accumulate transformations in the matrix Z
1479  
1480            IROW1 = LILOZ
1481            IROW2 = LIHIZ
1482            IF( MOD( K - 1 , HBL ).EQ.HBL - 2 ) THEN
1483                IF( ICOL1.NE.ICOL2 ) THEN
1484                    IF( ISTART.EQ.ISTOP ) THEN
1485                        CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1486       $                Z(( ICOL1 - 1 )*LDZ +
1487       $                IROW1 ) , LDZ , MYROW ,
1488       $                RIGHT )
1489                    END IF
1490                END IF
1491            END IF
1492            IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
1493                IF( ICOL1.EQ.ICOL2 ) THEN
1494                    CALL ZGERV2D( CONTXT , IROW2 - IROW1 + 1 , 2 ,
1495       $            Z(( ICOL1 - 2 )*LDZ + IROW1 ) ,
1496       $            LDZ , MYROW , RIGHT )
1497                END IF
1498            END IF
1499        END IF
1500        END IF
1501    430 CONTINUE
1502    440 CONTINUE
1503  
1504  *     Column work done
1505  
1506    450 CONTINUE
1507  
1508  *     Now do NR = 2 work
1509  
1510        DO 530 KI = 1 , IBULGE
1511            ISTART = MAX( K1( KI ) , M )
1512            ISTOP = MIN( K2( KI ) , I - 1 )
1513            IF( MOD( ISTART - 1 , HBL ).GE.HBL - 2 ) THEN
1514  
1515  *             INFO is found in a buffer
1516  
1517                ISPEC = 1
1518            ELSE
1519  
1520  *             All INFO is local
1521  
1522                ISPEC = 0
1523            END IF
1524  
1525            DO 520 K = ISTART , ISTOP
1526  
1527                V2 = WORK( VECSIDX + ( K - 1 )*3 + 1 )
1528                V3 = WORK( VECSIDX + ( K - 1 )*3 + 2 )
1529                T1 = WORK( VECSIDX + ( K - 1 )*3 + 3 )
1530                NR = MIN( 3 , I - K + 1 )
1531                IF( NR.EQ.2 ) THEN
1532                    IF( ICURROW( KI ).EQ.MYROW ) THEN
1533                        T2 = T1*V2
1534                    END IF
1535                    IF( ICURCOL( KI ).EQ.MYCOL ) THEN
1536                        T2 = T1*V2
1537                    END IF
1538  
1539  *                 Apply G from the left to transform the rows of the matrix
1540  *                 in columns K to I2.
1541  
1542                    CALL INFOG1L( K , HBL , NPCOL , MYCOL , JAFIRST , LILOH ,
1543       $            LIHIH )
1544                    LIHIH = LOCALI2
1545                    CALL INFOG1L( 1 , HBL , NPROW , MYROW , IAFIRST , ITMP2 ,
1546       $            ITMP1 )
1547                    ITMP1 = NUMROC( K + 1 , HBL , MYROW , IAFIRST , NPROW )
1548                    IF( ICURROW( KI ).EQ.MYROW ) THEN
1549                        IF(( ISPEC.EQ.0 ) .OR.( NPROW.EQ.1 ) .OR.
1550       $( MOD( K - 1 , HBL ).EQ.HBL - 2 ) ) THEN
1551                        ITMP1 = ITMP1 - 1
1552                        DO 460 J =( LILOH - 1 )*LDA ,
1553       $( LIHIH - 1 )*LDA , LDA
1554                            SUM = DCONJG( T1 )*A( ITMP1 + J ) +
1555       $                    DCONJG( T2 )*A( ITMP1 + 1 + J )
1556                            A( ITMP1 + J ) = A( ITMP1 + J ) - SUM
1557                            A( ITMP1 + 1 + J ) = A( ITMP1 + 1 + J ) - SUM*V2
1558    460                 CONTINUE
1559                    ELSE
1560                        IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
1561                            CALL ZGERV2D( CONTXT , 1 , LIHIH - LILOH + 1 ,
1562       $                    WORK( IRBUF + 1 ) , 1 , UP ,
1563       $                    MYCOL )
1564                            DO 470 J = LILOH , LIHIH
1565                                SUM = DCONJG( T1 )*
1566       $                        WORK( IRBUF + J - LILOH + 1 ) +
1567       $                        DCONJG( T2 )*A(( J - 1 )*LDA +
1568       $                        ITMP1 )
1569                                WORK( IRBUF + J - LILOH + 1 ) = WORK( IRBUF +
1570       $                        J - LILOH + 1 ) - SUM
1571                                A(( J - 1 )*LDA + ITMP1 ) = A(( J - 1 )*
1572       $                        LDA + ITMP1 ) - SUM*V2
1573    470                     CONTINUE
1574                            CALL ZGESD2D( CONTXT , 1 , LIHIH - LILOH + 1 ,
1575       $                    WORK( IRBUF + 1 ) , 1 , UP ,
1576       $                    MYCOL )
1577                        END IF
1578                    END IF
1579                ELSE
1580                    IF(( MOD( K - 1 , HBL ).EQ.HBL - 1 ) .AND.
1581       $( ICURROW( KI ).EQ.DOWN ) ) THEN
1582                    CALL ZGESD2D( CONTXT , 1 , LIHIH - LILOH + 1 ,
1583       $            A(( LILOH - 1 )*LDA + ITMP1 ) ,
1584       $            LDA , DOWN , MYCOL )
1585                    CALL ZGERV2D( CONTXT , 1 , LIHIH - LILOH + 1 ,
1586       $            A(( LILOH - 1 )*LDA + ITMP1 ) ,
1587       $            LDA , DOWN , MYCOL )
1588                END IF
1589            END IF
1590  
1591  *         Apply G from the right to transform the columns of the
1592  *         matrix in rows I1 to MIN(K + 3 , I).
1593  
1594            CALL INFOG1L( I1 , HBL , NPROW , MYROW , IAFIRST ,
1595       $    LILOH , LIHIH )
1596            LIHIH = NUMROC( I , HBL , MYROW , IAFIRST , NPROW )
1597  
1598            IF( ICURCOL( KI ).EQ.MYCOL ) THEN
1599  *             LOCAL A(LILOZ : LIHIZ , KCOL : KCOL + 2)
1600                IF(( ISPEC.EQ.0 ) .OR.( NPCOL.EQ.1 ) .OR.
1601       $( MOD( K - 1 , HBL ).EQ.HBL - 2 ) ) THEN
1602                CALL INFOG1L( K , HBL , NPCOL , MYCOL , JAFIRST ,
1603       $        ITMP1 , ITMP2 )
1604                ITMP2 = NUMROC( K + 1 , HBL , MYCOL , JAFIRST ,
1605       $        NPCOL )
1606                DO 480 J = LILOH , LIHIH
1607                    SUM = T1*A(( ITMP1 - 1 )*LDA + J ) +
1608       $            T2*A( ITMP1*LDA + J )
1609                    A(( ITMP1 - 1 )*LDA + J ) = A(( ITMP1 - 1 )*
1610       $            LDA + J ) - SUM
1611                    A( ITMP1*LDA + J ) = A( ITMP1*LDA + J ) -
1612       $            SUM*DCONJG( V2 )
1613    480         CONTINUE
1614            ELSE
1615                ITMP1 = KCOL( KI )
1616                IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
1617                    CALL ZGERV2D( CONTXT , LIHIH - LILOH + 1 , 1 ,
1618       $            WORK( ICBUF + 1 ) ,
1619       $            LIHIH - LILOH + 1 , MYROW , LEFT )
1620                    DO 490 J = LILOH , LIHIH
1621                        SUM = T1*WORK( ICBUF + J ) +
1622       $                T2*A(( ITMP1 - 1 )*LDA + J )
1623                        WORK( ICBUF + J ) = WORK( ICBUF + J ) - SUM
1624                        A(( ITMP1 - 1 )*LDA + J )
1625       $                = A(( ITMP1 - 1 )*LDA + J ) -
1626       $                SUM*DCONJG( V2 )
1627    490             CONTINUE
1628                    CALL ZGESD2D( CONTXT , LIHIH - LILOH + 1 , 1 ,
1629       $            WORK( ICBUF + 1 ) ,
1630       $            LIHIH - LILOH + 1 , MYROW , LEFT )
1631                END IF
1632            END IF
1633        ELSE
1634            IF(( MOD( K - 1 , HBL ).EQ.HBL - 1 ) .AND.
1635       $( ICURCOL( KI ).EQ.RIGHT ) ) THEN
1636            ITMP1 = KCOL( KI )
1637            CALL ZGESD2D( CONTXT , LIHIH - LILOH + 1 , 1 ,
1638       $    A(( ITMP1 - 1 )*LDA + LILOH ) ,
1639       $    LDA , MYROW , RIGHT )
1640            CALL INFOG1L( K , HBL , NPCOL , MYCOL , JAFIRST ,
1641       $    ITMP1 , ITMP2 )
1642            ITMP2 = NUMROC( K + 1 , HBL , MYCOL , JAFIRST ,
1643       $    NPCOL )
1644            CALL ZGERV2D( CONTXT , LIHIH - LILOH + 1 , 1 ,
1645       $    A(( ITMP1 - 1 )*LDA + LILOH ) ,
1646       $    LDA , MYROW , RIGHT )
1647        END IF
1648        END IF
1649  
1650        IF( WANTZ ) THEN
1651  
1652  *         Accumulate transformations in the matrix Z
1653  
1654            IF( ICURCOL( KI ).EQ.MYCOL ) THEN
1655  *             LOCAL Z(LILOZ : LIHIZ , KCOL : KCOL + 2)
1656                IF(( ISPEC.EQ.0 ) .OR.( NPCOL.EQ.1 ) .OR.
1657       $( MOD( K - 1 , HBL ).EQ.HBL - 2 ) ) THEN
1658                ITMP1 = KCOL( KI ) + K - ISTART
1659                ITMP1 =( ITMP1 - 1 )*LDZ
1660                DO 500 J = LILOZ , LIHIZ
1661                    SUM = T1*Z( J + ITMP1 ) +
1662       $            T2*Z( J + ITMP1 + LDZ )
1663                    Z( J + ITMP1 ) = Z( J + ITMP1 ) - SUM
1664                    Z( J + ITMP1 + LDZ ) = Z( J + ITMP1 + LDZ ) -
1665       $            SUM*DCONJG( V2 )
1666    500         CONTINUE
1667            ELSE
1668                ITMP1 = KCOL( KI )
1669  *             IF WE ACTUALLY OWN COLUMN K
1670                IF( MOD( K - 1 , HBL ).EQ.HBL - 1 ) THEN
1671                    CALL ZGERV2D( CONTXT , LIHIZ - LILOZ + 1 , 1 ,
1672       $            WORK( IZBUF + 1 ) , LDZ ,
1673       $            MYROW , LEFT )
1674                    ITMP1 =( ITMP1 - 1 )*LDZ
1675                    DO 510 J = LILOZ , LIHIZ
1676                        SUM = T1*WORK( IZBUF + J ) +
1677       $                T2*Z( J + ITMP1 )
1678                        WORK( IZBUF + J ) = WORK( IZBUF + J ) -
1679       $                SUM
1680                        Z( J + ITMP1 ) = Z( J + ITMP1 ) -
1681       $                SUM*DCONJG( V2 )
1682    510             CONTINUE
1683                    CALL ZGESD2D( CONTXT , LIHIZ - LILOZ + 1 , 1 ,
1684       $            WORK( IZBUF + 1 ) , LDZ ,
1685       $            MYROW , LEFT )
1686                END IF
1687            END IF
1688        ELSE
1689  
1690  *         NO WORK BUT NEED TO UPDATE ANYWAY????
1691  
1692            IF(( MOD( K - 1 , HBL ).EQ.HBL - 1 ) .AND.
1693       $( ICURCOL( KI ).EQ.RIGHT ) ) THEN
1694            ITMP1 = KCOL( KI )
1695            ITMP1 =( ITMP1 - 1 )*LDZ
1696            CALL ZGESD2D( CONTXT , LIHIZ - LILOZ + 1 , 1 ,
1697       $    Z( LILOZ + ITMP1 ) , LDZ ,
1698       $    MYROW , RIGHT )
1699            CALL ZGERV2D( CONTXT , LIHIZ - LILOZ + 1 , 1 ,
1700       $    Z( LILOZ + ITMP1 ) , LDZ ,
1701       $    MYROW , RIGHT )
1702        END IF
1703        END IF
1704        END IF
1705        END IF
1706    520 CONTINUE
1707  
1708  *     Adjust local information for this bulge
1709  
1710        IF( NPROW.EQ.1 ) THEN
1711            KROW( KI ) = KROW( KI ) + K2( KI ) - K1( KI ) + 1
1712            KP2ROW( KI ) = KP2ROW( KI ) + K2( KI ) - K1( KI ) + 1
1713        END IF
1714        IF(( MOD( K1( KI ) - 1 , HBL ).LT.HBL - 2 ) .AND.
1715       $( ICURROW( KI ).EQ.MYROW ) .AND.( NPROW.GT.1 ) )
1716       $THEN
1717        KROW( KI ) = KROW( KI ) + K2( KI ) - K1( KI ) + 1
1718        END IF
1719        IF(( MOD( K2( KI ) , HBL ).LT.HBL - 2 ) .AND.
1720       $( ICURROW( KI ).EQ.MYROW ) .AND.( NPROW.GT.1 ) )
1721       $THEN
1722        KP2ROW( KI ) = KP2ROW( KI ) + K2( KI ) - K1( KI ) + 1
1723        END IF
1724        IF(( MOD( K1( KI ) - 1 , HBL ).GE.HBL - 2 ) .AND.
1725       $(( MYROW.EQ.ICURROW( KI ) ) .OR.( DOWN.EQ.
1726       $ICURROW( KI ) ) ) .AND.( NPROW.GT.1 ) ) THEN
1727        CALL INFOG1L( K2( KI ) + 1 , HBL , NPROW , MYROW , IAFIRST ,
1728       $KROW( KI ) , ITMP2 )
1729        END IF
1730        IF(( MOD( K2( KI ) , HBL ).GE.HBL - 2 ) .AND.
1731       $(( MYROW.EQ.ICURROW( KI ) ) .OR.( UP.EQ.
1732       $ICURROW( KI ) ) ) .AND.( NPROW.GT.1 ) ) THEN
1733        KP2ROW( KI ) = NUMROC( K2( KI ) + 3 , HBL , MYROW ,
1734       $IAFIRST , NPROW )
1735        END IF
1736        IF( NPCOL.EQ.1 ) THEN
1737            KCOL( KI ) = KCOL( KI ) + K2( KI ) - K1( KI ) + 1
1738            KP2COL( KI ) = KP2COL( KI ) + K2( KI ) - K1( KI ) + 1
1739        END IF
1740        IF(( MOD( K1( KI ) - 1 , HBL ).LT.HBL - 2 ) .AND.
1741       $( ICURCOL( KI ).EQ.MYCOL ) .AND.( NPCOL.GT.1 ) )
1742       $THEN
1743        KCOL( KI ) = KCOL( KI ) + K2( KI ) - K1( KI ) + 1
1744        END IF
1745        IF(( MOD( K2( KI ) , HBL ).LT.HBL - 2 ) .AND.
1746       $( ICURCOL( KI ).EQ.MYCOL ) .AND.( NPCOL.GT.1 ) )
1747       $THEN
1748        KP2COL( KI ) = KP2COL( KI ) + K2( KI ) - K1( KI ) + 1
1749        END IF
1750        IF(( MOD( K1( KI ) - 1 , HBL ).GE.HBL - 2 ) .AND.
1751       $(( MYCOL.EQ.ICURCOL( KI ) ) .OR.( RIGHT.EQ.
1752       $ICURCOL( KI ) ) ) .AND.( NPCOL.GT.1 ) ) THEN
1753        CALL INFOG1L( K2( KI ) + 1 , HBL , NPCOL , MYCOL , JAFIRST ,
1754       $KCOL( KI ) , ITMP2 )
1755        END IF
1756        IF(( MOD( K2( KI ) , HBL ).GE.HBL - 2 ) .AND.
1757       $(( MYCOL.EQ.ICURCOL( KI ) ) .OR.( LEFT.EQ.
1758       $ICURCOL( KI ) ) ) .AND.( NPCOL.GT.1 ) ) THEN
1759        KP2COL( KI ) = NUMROC( K2( KI ) + 3 , HBL , MYCOL ,
1760       $JAFIRST , NPCOL )
1761        END IF
1762        K1( KI ) = K2( KI ) + 1
1763        ISTOP = MIN( K1( KI ) + ROTN - MOD( K1( KI ) , ROTN ) , I - 2 )
1764        ISTOP = MIN( ISTOP , K1( KI ) + HBL - 3 -
1765       $MOD( K1( KI ) - 1 , HBL ) )
1766        ISTOP = MIN( ISTOP , I2 - 2 )
1767        ISTOP = MAX( ISTOP , K1( KI ) )
1768        IF(( MOD( K1( KI ) - 1 , HBL ).EQ.HBL - 2 ) .AND.
1769       $( ISTOP.LT.MIN( I - 2 , I2 - 2 ) ) ) THEN
1770        ISTOP = ISTOP + 1
1771        END IF
1772        K2( KI ) = ISTOP
1773        IF( K1( KI ).LE.ISTOP ) THEN
1774            IF(( MOD( K1( KI ) - 1 , HBL ).EQ.HBL - 2 ) .AND.
1775       $( I - K1( KI ).GT.1 ) ) THEN
1776  
1777  *         Next step switches rows & cols
1778  
1779            ICURROW( KI ) = MOD( ICURROW( KI ) + 1 , NPROW )
1780            ICURCOL( KI ) = MOD( ICURCOL( KI ) + 1 , NPCOL )
1781        END IF
1782        END IF
1783    530 CONTINUE
1784  
1785        IF( K2( IBULGE ).LE.I - 1 )
1786       $    GO TO 40
1787        END IF
1788  
1789    540 CONTINUE
1790  
1791  *     Failure to converge in remaining number of iterations
1792  
1793        INFO = I
1794        RETURN
1795  
1796    550 CONTINUE
1797  
1798        IF( L.EQ.I ) THEN
1799  
1800  *         H(I , I - 1) is negligible : one eigenvalue has converged.
1801  
1802            CALL INFOG2L( I , I , DESCA , NPROW , NPCOL , MYROW , MYCOL , IROW ,
1803       $    ICOL , ITMP1 , ITMP2 )
1804            IF(( MYROW.EQ.ITMP1 ) .AND.( MYCOL.EQ.ITMP2 ) ) THEN
1805                W( I ) = A(( ICOL - 1 )*LDA + IROW )
1806            ELSE
1807                W( I ) = ZERO
1808            END IF
1809        ELSE IF( L.EQ.I - 1 ) THEN
1810  
1811  *         H(I - 1 , I - 2) is negligible : a pair of eigenvalues have converged.
1812  
1813            CALL PZLACP3 ( 2 , I - 1 , A , DESCA , S1 , 2*IBLK , - 1 , - 1 , 0 )
1814            CALL ZLANV2 ( S1( 1 , 1 ) , S1( 1 , 2 ) , S1( 2 , 1 ) , S1( 2 , 2 ) ,
1815       $    W( I - 1 ) , W( I ) , CS , SN )
1816            CALL PZLACP3 ( 2 , I - 1 , A , DESCA , S1 , 2*IBLK , 0 , 0 , 1 )
1817  
1818            IF( NODE.NE.0 ) THEN
1819  *             Erase the eigenvalues other eigenvalues
1820                W( I - 1 ) = ZERO
1821                W( I ) = ZERO
1822            END IF
1823  
1824            IF( WANTT ) THEN
1825  
1826  *             Apply the transformation to A.
1827  
1828                IF( I2.GT.I ) THEN
1829                    CALL PZROT( I2 - I , A , I - 1 , I + 1 , DESCA , N , A , I , I + 1 ,
1830       $            DESCA , N , CS , SN )
1831                END IF
1832                CALL PZROT( I - I1 - 1 , A , I1 , I - 1 , DESCA , 1 , A , I1 , I , DESCA ,
1833       $        1 , CS , DCONJG( SN ) )
1834            END IF
1835            IF( WANTZ ) THEN
1836  
1837  *             Apply the transformation to Z.
1838  
1839                CALL PZROT( NZ , Z , ILOZ , I - 1 , DESCZ , 1 , Z , ILOZ , I , DESCZ ,
1840       $        1 , CS , DCONJG( SN ) )
1841            END IF
1842  
1843        ELSE
1844  
1845  *         Find the eigenvalues in H(L : I , L : I) , L < I - 1
1846  
1847            JBLK = I - L + 1
1848            IF( JBLK.LE.2*IBLK ) THEN
1849                CALL PZLACP3 ( I - L + 1 , L , A , DESCA , S1 , 2*IBLK , 0 , 0 , 0 )
1850                CALL ZLAHQR2 ( .FALSE. , .FALSE. , JBLK , 1 , JBLK , S1 , 2*IBLK ,
1851       $        W( L ) , 1 , JBLK , Z , LDZ , IERR )
1852                IF( NODE.NE.0 ) THEN
1853  
1854  *                 Erase the eigenvalues
1855  
1856                    DO 560 K = L , I
1857                        W( K ) = ZERO
1858    560             CONTINUE
1859                END IF
1860            END IF
1861        END IF
1862  
1863  *     Decrement number of remaining iterations , and return to start of
1864  *     the main loop with new value of I.
1865  
1866        ITN = ITN - ITS
1867        I = L - 1
1868        GO TO 10
1869  
1870    570 CONTINUE
1871        CALL ZGSUM2D( CONTXT , 'All' , ' ' , N , 1 , W , N , - 1 , - 1 )
1872        RETURN
1873  
1874  *     END OF PZLAHQR
1875  
1876        END