Routine: PCLAWIL()  File: SRC\pclawil.f

 
 
# lines: 273
  # code: 273
  # comment: 0
  # blank:0
# Variables:48
# Callers:0
# Callings:0
# Words:179
# Keywords:116
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PCLAWIL gets the transform given by H44,H33, & H43H34 into V
     starting at row M.
  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
  =========
  II      (global input) INTEGER
          Row owner of H(M+2,M+2)
  JJ      (global input) INTEGER
          Column owner of H(M+2,M+2)
  M       (global input) INTEGER
          On entry, this is where the transform starts (row M.)
          Unchanged on exit.
  A       (global input) COMPLEX array, dimension
          (DESCA(LLD_),*)
          On entry, the Hessenberg matrix.
          Unchanged on exit.
  DESCA   (global and local input) INTEGER array of dimension DLEN_.
          The array descriptor for the distributed matrix A.
          Unchanged on exit.
  H44
  H33
  H43H34  (global input) COMPLEX
          These three values are for the double shift QR iteration.
          Unchanged on exit.
  V       (global output) COMPLEX array of size 3.
          Contains the transform on ouput.
  Further Details
  ===============
  Implemented by:  M. Fahey, May 28, 1999
  =====================================================================
     .. Parameters ..

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

 
001        SUBROUTINE PCLAWIL( II , JJ , M , A , DESCA , H44 , H33 , H43H34 , V )
002  
003  *     -- ScaLAPACK routine(version 1.7) --
004  *     University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
005  *     and University of California , Berkeley.
006  *     July 31 , 2001
007  
008  *     .. Scalar Arguments ..
009        INTEGER II , JJ , M
010        COMPLEX H33 , H43H34 , H44
011        INTEGER BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ ,
012       $LLD_ , MB_ , M_ , NB_ , N_ , RSRC_
013        PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
014       $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
015       $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
016  *     ..
017  *     .. Local Scalars ..
018        INTEGER CONTXT , DOWN , HBL , ICOL , IROW , JSRC , LDA , LEFT ,
019       $MODKM1 , MYCOL , MYROW , NPCOL , NPROW , NUM , RIGHT ,
020       $RSRC , UP
021        REAL S
022        COMPLEX CDUM , H11 , H12 , H21 , H22 , H33S , H44S , V1 , V2 ,
023       $V3
024  *     ..
025  *     .. Local Arrays ..
026        COMPLEX BUF( 4 )
027  *     ..
028  *     .. External Subroutines ..
029        EXTERNAL BLACS_GRIDINFO , INFOG2L , CGERV2D , CGESD2D
030  *     ..
031  *     .. Intrinsic Functions ..
032        INTRINSIC ABS , REAL , AIMAG , MOD
033  *     ..
034  *     .. Statement Functions ..
035        REAL CABS1
036  *     ..
037  *     .. Statement Function definitions ..
038        CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
039  *     ..
040  *     .. Executable Statements ..
041  
042        HBL = DESCA( MB_ )
043        CONTXT = DESCA( CTXT_ )
044        LDA = DESCA( LLD_ )
045        CALL BLACS_GRIDINFO( CONTXT , NPROW , NPCOL , MYROW , MYCOL )
046        LEFT = MOD( MYCOL + NPCOL - 1 , NPCOL )
047        RIGHT = MOD( MYCOL + 1 , NPCOL )
048        UP = MOD( MYROW + NPROW - 1 , NPROW )
049        DOWN = MOD( MYROW + 1 , NPROW )
050        NUM = NPROW*NPCOL
051  
052  *     On node(II , JJ) collect all DIA , SUP , SUB info from M , M + 1
053  
054        MODKM1 = MOD( M + 1 , HBL )
055        IF( MODKM1.EQ.0 ) THEN
056            IF(( MYROW.EQ.II ) .AND.( RIGHT.EQ.JJ ) .AND.
057       $( NPCOL.GT.1 ) ) THEN
058            CALL INFOG2L( M + 2 , M + 1 , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
059       $    IROW , ICOL , RSRC , JSRC )
060            BUF( 1 ) = A(( ICOL - 1 )*LDA + IROW )
061            CALL CGESD2D( CONTXT , 1 , 1 , BUF , 1 , II , JJ )
062        END IF
063        IF(( DOWN.EQ.II ) .AND.( RIGHT.EQ.JJ ) .AND.( NUM.GT.1 ) )
064       $    THEN
065            CALL INFOG2L( M , M , DESCA , NPROW , NPCOL , MYROW , MYCOL , IROW ,
066       $    ICOL , RSRC , JSRC )
067            BUF( 1 ) = A(( ICOL - 1 )*LDA + IROW )
068            BUF( 2 ) = A(( ICOL - 1 )*LDA + IROW + 1 )
069            BUF( 3 ) = A( ICOL*LDA + IROW )
070            BUF( 4 ) = A( ICOL*LDA + IROW + 1 )
071            CALL CGESD2D( CONTXT , 4 , 1 , BUF , 4 , II , JJ )
072        END IF
073        IF(( MYROW.EQ.II ) .AND.( MYCOL.EQ.JJ ) ) THEN
074            CALL INFOG2L( M + 2 , M + 2 , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
075       $    IROW , ICOL , RSRC , JSRC )
076            IF( NPCOL.GT.1 ) THEN
077                CALL CGERV2D( CONTXT , 1 , 1 , V3 , 1 , MYROW , LEFT )
078            ELSE
079                V3 = A(( ICOL - 2 )*LDA + IROW )
080            END IF
081            IF( NUM.GT.1 ) THEN
082                CALL CGERV2D( CONTXT , 4 , 1 , BUF , 4 , UP , LEFT )
083                H11 = BUF( 1 )
084                H21 = BUF( 2 )
085                H12 = BUF( 3 )
086                H22 = BUF( 4 )
087            ELSE
088                H11 = A(( ICOL - 3 )*LDA + IROW - 2 )
089                H21 = A(( ICOL - 3 )*LDA + IROW - 1 )
090                H12 = A(( ICOL - 2 )*LDA + IROW - 2 )
091                H22 = A(( ICOL - 2 )*LDA + IROW - 1 )
092            END IF
093        END IF
094        END IF
095        IF( MODKM1.EQ.1 ) THEN
096            IF(( DOWN.EQ.II ) .AND.( RIGHT.EQ.JJ ) .AND.( NUM.GT.1 ) )
097       $        THEN
098                CALL INFOG2L( M , M , DESCA , NPROW , NPCOL , MYROW , MYCOL , IROW ,
099       $        ICOL , RSRC , JSRC )
100                CALL CGESD2D( CONTXT , 1 , 1 , A(( ICOL - 1 )*LDA + IROW ) , 1 , II ,
101       $        JJ )
102            END IF
103            IF(( DOWN.EQ.II ) .AND.( MYCOL.EQ.JJ ) .AND.( NPROW.GT.1 ) )
104       $        THEN
105                CALL INFOG2L( M , M + 1 , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
106       $        IROW , ICOL , RSRC , JSRC )
107                CALL CGESD2D( CONTXT , 1 , 1 , A(( ICOL - 1 )*LDA + IROW ) , 1 , II ,
108       $        JJ )
109            END IF
110            IF(( MYROW.EQ.II ) .AND.( RIGHT.EQ.JJ ) .AND.
111       $( NPCOL.GT.1 ) ) THEN
112            CALL INFOG2L( M + 1 , M , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
113       $    IROW , ICOL , RSRC , JSRC )
114            CALL CGESD2D( CONTXT , 1 , 1 , A(( ICOL - 1 )*LDA + IROW ) , 1 , II ,
115       $    JJ )
116        END IF
117        IF(( MYROW.EQ.II ) .AND.( MYCOL.EQ.JJ ) ) THEN
118            CALL INFOG2L( M + 2 , M + 2 , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
119       $    IROW , ICOL , RSRC , JSRC )
120            IF( NUM.GT.1 ) THEN
121                CALL CGERV2D( CONTXT , 1 , 1 , H11 , 1 , UP , LEFT )
122            ELSE
123                H11 = A(( ICOL - 3 )*LDA + IROW - 2 )
124            END IF
125            IF( NPROW.GT.1 ) THEN
126                CALL CGERV2D( CONTXT , 1 , 1 , H12 , 1 , UP , MYCOL )
127            ELSE
128                H12 = A(( ICOL - 2 )*LDA + IROW - 2 )
129            END IF
130            IF( NPCOL.GT.1 ) THEN
131                CALL CGERV2D( CONTXT , 1 , 1 , H21 , 1 , MYROW , LEFT )
132            ELSE
133                H21 = A(( ICOL - 3 )*LDA + IROW - 1 )
134            END IF
135            H22 = A(( ICOL - 2 )*LDA + IROW - 1 )
136            V3 = A(( ICOL - 2 )*LDA + IROW )
137        END IF
138        END IF
139        IF(( MYROW.NE.II ) .OR.( MYCOL.NE.JJ ) )
140       $    RETURN
141  
142            IF( MODKM1.GT.1 ) THEN
143                CALL INFOG2L( M + 2 , M + 2 , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
144       $        IROW , ICOL , RSRC , JSRC )
145                H11 = A(( ICOL - 3 )*LDA + IROW - 2 )
146                H21 = A(( ICOL - 3 )*LDA + IROW - 1 )
147                H12 = A(( ICOL - 2 )*LDA + IROW - 2 )
148                H22 = A(( ICOL - 2 )*LDA + IROW - 1 )
149                V3 = A(( ICOL - 2 )*LDA + IROW )
150            END IF
151  
152            H44S = H44 - H11
153            H33S = H33 - H11
154            V1 =( H33S*H44S - H43H34 ) / H21 + H12
155            V2 = H22 - H11 - H33S - H44S
156            S = CABS1( V1 ) + CABS1( V2 ) + CABS1( V3 )
157            V1 = V1 / S
158            V2 = V2 / S
159            V3 = V3 / S
160            V( 1 ) = V1
161            V( 2 ) = V2
162            V( 3 ) = V3
163  
164            RETURN
165  
166  *         End of PCLAWIL
167  
168        END