Routine: PDLAWIL()  File: SRC\pdlawil.f

 
 
# lines: 262
  # code: 262
  # comment: 0
  # blank:0
# Variables:46
# Callers:0
# Callings:0
# Words:177
# Keywords:113
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PDLAWIL 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) DOUBLE PRECISION 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) DOUBLE PRECISION
          These three values are for the double shift QR iteration.
          Unchanged on exit.
  V       (global output) DOUBLE PRECISION array of size 3.
          Contains the transform on ouput.
  Implemented by:  G. Henry, November 17, 1996
  =====================================================================
     .. Parameters ..

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

 
001        SUBROUTINE PDLAWIL( 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  *     May 1 , 1997
007  
008  *     .. Scalar Arguments ..
009        INTEGER II , JJ , M
010        DOUBLE PRECISION 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        DOUBLE PRECISION H11 , H12 , H21 , H22 , H33S , H44S , S , V1 , V2 , V3
022  *     ..
023  *     .. Local Arrays ..
024        DOUBLE PRECISION BUF( 4 )
025  *     ..
026  *     .. External Subroutines ..
027        EXTERNAL BLACS_GRIDINFO , DGERV2D , DGESD2D , INFOG2L
028  *     ..
029  *     .. Intrinsic Functions ..
030        INTRINSIC ABS , MOD
031  *     ..
032  *     .. Executable Statements ..
033  
034        HBL = DESCA( MB_ )
035        CONTXT = DESCA( CTXT_ )
036        LDA = DESCA( LLD_ )
037        CALL BLACS_GRIDINFO( CONTXT , NPROW , NPCOL , MYROW , MYCOL )
038        LEFT = MOD( MYCOL + NPCOL - 1 , NPCOL )
039        RIGHT = MOD( MYCOL + 1 , NPCOL )
040        UP = MOD( MYROW + NPROW - 1 , NPROW )
041        DOWN = MOD( MYROW + 1 , NPROW )
042        NUM = NPROW*NPCOL
043  
044  *     On node(II , JJ) collect all DIA , SUP , SUB info from M , M + 1
045  
046        MODKM1 = MOD( M + 1 , HBL )
047        IF( MODKM1.EQ.0 ) THEN
048            IF(( MYROW.EQ.II ) .AND.( RIGHT.EQ.JJ ) .AND.
049       $( NPCOL.GT.1 ) ) THEN
050            CALL INFOG2L( M + 2 , M + 1 , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
051       $    IROW , ICOL , RSRC , JSRC )
052            BUF( 1 ) = A(( ICOL - 1 )*LDA + IROW )
053            CALL DGESD2D( CONTXT , 1 , 1 , BUF , 1 , II , JJ )
054        END IF
055        IF(( DOWN.EQ.II ) .AND.( RIGHT.EQ.JJ ) .AND.( NUM.GT.1 ) )
056       $    THEN
057            CALL INFOG2L( M , M , DESCA , NPROW , NPCOL , MYROW , MYCOL , IROW ,
058       $    ICOL , RSRC , JSRC )
059            BUF( 1 ) = A(( ICOL - 1 )*LDA + IROW )
060            BUF( 2 ) = A(( ICOL - 1 )*LDA + IROW + 1 )
061            BUF( 3 ) = A( ICOL*LDA + IROW )
062            BUF( 4 ) = A( ICOL*LDA + IROW + 1 )
063            CALL DGESD2D( CONTXT , 4 , 1 , BUF , 4 , II , JJ )
064        END IF
065        IF(( MYROW.EQ.II ) .AND.( MYCOL.EQ.JJ ) ) THEN
066            CALL INFOG2L( M + 2 , M + 2 , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
067       $    IROW , ICOL , RSRC , JSRC )
068            IF( NPCOL.GT.1 ) THEN
069                CALL DGERV2D( CONTXT , 1 , 1 , V3 , 1 , MYROW , LEFT )
070            ELSE
071                V3 = A(( ICOL - 2 )*LDA + IROW )
072            END IF
073            IF( NUM.GT.1 ) THEN
074                CALL DGERV2D( CONTXT , 4 , 1 , BUF , 4 , UP , LEFT )
075                H11 = BUF( 1 )
076                H21 = BUF( 2 )
077                H12 = BUF( 3 )
078                H22 = BUF( 4 )
079            ELSE
080                H11 = A(( ICOL - 3 )*LDA + IROW - 2 )
081                H21 = A(( ICOL - 3 )*LDA + IROW - 1 )
082                H12 = A(( ICOL - 2 )*LDA + IROW - 2 )
083                H22 = A(( ICOL - 2 )*LDA + IROW - 1 )
084            END IF
085        END IF
086        END IF
087        IF( MODKM1.EQ.1 ) THEN
088            IF(( DOWN.EQ.II ) .AND.( RIGHT.EQ.JJ ) .AND.( NUM.GT.1 ) )
089       $        THEN
090                CALL INFOG2L( M , M , DESCA , NPROW , NPCOL , MYROW , MYCOL , IROW ,
091       $        ICOL , RSRC , JSRC )
092                CALL DGESD2D( CONTXT , 1 , 1 , A(( ICOL - 1 )*LDA + IROW ) , 1 , II ,
093       $        JJ )
094            END IF
095            IF(( DOWN.EQ.II ) .AND.( MYCOL.EQ.JJ ) .AND.( NPROW.GT.1 ) )
096       $        THEN
097                CALL INFOG2L( M , M + 1 , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
098       $        IROW , ICOL , RSRC , JSRC )
099                CALL DGESD2D( CONTXT , 1 , 1 , A(( ICOL - 1 )*LDA + IROW ) , 1 , II ,
100       $        JJ )
101            END IF
102            IF(( MYROW.EQ.II ) .AND.( RIGHT.EQ.JJ ) .AND.
103       $( NPCOL.GT.1 ) ) THEN
104            CALL INFOG2L( M + 1 , M , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
105       $    IROW , ICOL , RSRC , JSRC )
106            CALL DGESD2D( CONTXT , 1 , 1 , A(( ICOL - 1 )*LDA + IROW ) , 1 , II ,
107       $    JJ )
108        END IF
109        IF(( MYROW.EQ.II ) .AND.( MYCOL.EQ.JJ ) ) THEN
110            CALL INFOG2L( M + 2 , M + 2 , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
111       $    IROW , ICOL , RSRC , JSRC )
112            IF( NUM.GT.1 ) THEN
113                CALL DGERV2D( CONTXT , 1 , 1 , H11 , 1 , UP , LEFT )
114            ELSE
115                H11 = A(( ICOL - 3 )*LDA + IROW - 2 )
116            END IF
117            IF( NPROW.GT.1 ) THEN
118                CALL DGERV2D( CONTXT , 1 , 1 , H12 , 1 , UP , MYCOL )
119            ELSE
120                H12 = A(( ICOL - 2 )*LDA + IROW - 2 )
121            END IF
122            IF( NPCOL.GT.1 ) THEN
123                CALL DGERV2D( CONTXT , 1 , 1 , H21 , 1 , MYROW , LEFT )
124            ELSE
125                H21 = A(( ICOL - 3 )*LDA + IROW - 1 )
126            END IF
127            H22 = A(( ICOL - 2 )*LDA + IROW - 1 )
128            V3 = A(( ICOL - 2 )*LDA + IROW )
129        END IF
130        END IF
131        IF(( MYROW.NE.II ) .OR.( MYCOL.NE.JJ ) )
132       $    RETURN
133  
134            IF( MODKM1.GT.1 ) THEN
135                CALL INFOG2L( M + 2 , M + 2 , DESCA , NPROW , NPCOL , MYROW , MYCOL ,
136       $        IROW , ICOL , RSRC , JSRC )
137                H11 = A(( ICOL - 3 )*LDA + IROW - 2 )
138                H21 = A(( ICOL - 3 )*LDA + IROW - 1 )
139                H12 = A(( ICOL - 2 )*LDA + IROW - 2 )
140                H22 = A(( ICOL - 2 )*LDA + IROW - 1 )
141                V3 = A(( ICOL - 2 )*LDA + IROW )
142            END IF
143  
144            H44S = H44 - H11
145            H33S = H33 - H11
146            V1 =( H33S*H44S - H43H34 ) / H21 + H12
147            V2 = H22 - H11 - H33S - H44S
148            S = ABS( V1 ) + ABS( V2 ) + ABS( V3 )
149            V1 = V1 / S
150            V2 = V2 / S
151            V3 = V3 / S
152            V( 1 ) = V1
153            V( 2 ) = V2
154            V( 3 ) = V3
155  
156            RETURN
157  
158  *         End of PDLAWIL
159  
160        END