Routine: PDLAED3()  File: SRC\pdlaed3.f

 
 
# lines: 360
  # code: 360
  # comment: 0
  # blank:0
# Variables:47
# Callers:1
# Callings:0
# Words:218
# Keywords:152
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PDLAED3 finds the roots of the secular equation, as defined by the
  values in D, W, and RHO, between 1 and K.  It makes the
  appropriate calls to SLAED4
  This code makes very mild assumptions about floating point
  arithmetic. It will work on machines with a guard digit in
  add/subtract, or on those binary machines without guard digits
  which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2.
  It could conceivably fail on hexadecimal or decimal machines
  without guard digits, but we know of none.
  Arguments
  =========
  ICTXT  (global input) INTEGER
         The BLACS context handle, indicating the global context of
         the operation on the matrix. The context itself is global.
  K      (output) INTEGER
         The number of non-deflated eigenvalues, and the order of the
         related secular equation. 0 <= K <=N.
  N      (input) INTEGER
         The dimension of the symmetric tridiagonal matrix.  N >= 0.
  NB      (global input) INTEGER
          The blocking factor used to distribute the columns of the
          matrix. NB >= 1.
  D      (input/output) DOUBLE PRECISION array, dimension (N)
         On entry, D contains the eigenvalues of the two submatrices to
         be combined.
         On exit, D contains the trailing (N-K) updated eigenvalues
         (those which were deflated) sorted into increasing order.
  DROW   (global input) INTEGER
          The process row over which the first row of the matrix D is
          distributed. 0 <= DROW < NPROW.
  DCOL   (global input) INTEGER
          The process column over which the first column of the
          matrix D is distributed. 0 <= DCOL < NPCOL.
  Q      (input/output) DOUBLE PRECISION array, dimension (LDQ, N)
         On entry, Q contains the eigenvectors of two submatrices in
         the two square blocks with corners at (1,1), (N1,N1)
         and (N1+1, N1+1), (N,N).
         On exit, Q contains the trailing (N-K) updated eigenvectors
         (those which were deflated) in its last N-K columns.
  LDQ    (input) INTEGER
         The leading dimension of the array Q.  LDQ >= max(1,NQ).
  RHO    (global input/output) DOUBLE PRECISION
         On entry, the off-diagonal element associated with the rank-1
         cut which originally split the two submatrices which are now
         being recombined.
         On exit, RHO has been modified to the value required by
         PDLAED3.
  DLAMDA (global output) DOUBLE PRECISION array, dimension (N)
         A copy of the first K eigenvalues which will be used by
         SLAED3 to form the secular equation.
  W      (global output) DOUBLE PRECISION array, dimension (N)
         The first k values of the final deflation-altered z-vector
         which will be passed to SLAED3.
  Z      (global input) DOUBLE PRECISION array, dimension (N)
         On entry, Z contains the updating vector (the last
         row of the first sub-eigenvector matrix and the first row of
         the second sub-eigenvector matrix).
         On exit, the contents of Z have been destroyed by the updating
         process.
  U     (global output) DOUBLE PRECISION array
         global dimension (N, N), local dimension (LDU, NQ).
         Q  contains the orthonormal eigenvectors of the symmetric
         tridiagonal matrix.
  LDU    (input) INTEGER
         The leading dimension of the array U.
  QBUF   (workspace) DOUBLE PRECISION array, dimension 3*N
  INDX   (workspace) INTEGER array, dimension (N)
         The permutation used to sort the contents of DLAMDA into
         ascending order.
  INDCOL (workspace) INTEGER array, dimension (N)
  INDROW (workspace) INTEGER array, dimension (N)
  INDXR (workspace) INTEGER array, dimension (N)
  INDXC (workspace) INTEGER array, dimension (N)
  CTOT   (workspace) INTEGER array, dimension( NPCOL, 4)
  NPCOL   (global input) INTEGER
          The total number of columns over which the distributed
           submatrix is distributed.
  INFO   (output) INTEGER
          = 0:  successful exit.
          < 0:  if INFO = -i, the i-th argument had an illegal value.
          > 0:  The algorithm failed to compute the ith eigenvalue.
  =====================================================================
     .. Parameters ..

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

 
001        SUBROUTINE PDLAED3( ICTXT , K , N , NB , D , DROW , DCOL , RHO , DLAMDA ,
002       $W , Z , U , LDU , BUF , INDX , INDCOL , INDROW ,
003       $INDXR , INDXC , CTOT , NPCOL , INFO )
004  
005  *     -- ScaLAPACK auxiliary routine(version 1.7) --
006  *     University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
007  *     and University of California , Berkeley.
008  *     December 31 , 1998
009  
010  *     .. Scalar Arguments ..
011        INTEGER DCOL , DROW , ICTXT , INFO , K , LDU , N , NB , NPCOL
012        DOUBLE PRECISION RHO
013        DOUBLE PRECISION ONE
014        PARAMETER( ONE = 1.0D + 0 )
015  *     ..
016  *     .. Local Scalars ..
017        INTEGER COL , GI , I , IINFO , IIU , IPD , IU , J , JJU , JU ,
018       $KK , KL , KLC , KLR , MYCOL , MYKL , MYKLR , MYROW ,
019       $NPROW , PDC , PDR , ROW
020        DOUBLE PRECISION AUX , TEMP
021  *     ..
022  *     .. External Functions ..
023        INTEGER INDXG2L
024        DOUBLE PRECISION DLAMC3 , DNRM2
025        EXTERNAL INDXG2L , DLAMC3 , DNRM2
026  *     ..
027  *     .. External Subroutines ..
028        EXTERNAL BLACS_GRIDINFO , DCOPY , DGEBR2D , DGEBS2D ,
029       $DGERV2D , DGESD2D , DLAED4
030  *     ..
031  *     .. Intrinsic Functions ..
032        INTRINSIC MOD , SIGN , SQRT
033  *     ..
034  *     .. Executable Statements ..
035  
036  *     Test the input parameters.
037  
038        INFO = 0
039  
040  *     Quick return if possible
041  
042        IF( K.EQ.0 )
043       $    RETURN
044  
045            CALL BLACS_GRIDINFO( ICTXT , NPROW , NPCOL , MYROW , MYCOL )
046  
047            ROW = DROW
048            COL = DCOL
049            DO 20 I = 1 , N , NB
050                DO 10 J = 0 , NB - 1
051                    IF( I + J.LE.N ) THEN
052                        INDROW( I + J ) = ROW
053                        INDCOL( I + J ) = COL
054                    END IF
055     10         CONTINUE
056                ROW = MOD( ROW + 1 , NPROW )
057                COL = MOD( COL + 1 , NPCOL )
058     20     CONTINUE
059  
060            MYKL = CTOT( MYCOL , 1 ) + CTOT( MYCOL , 2 ) + CTOT( MYCOL , 3 )
061            KLR = MYKL / NPROW
062            IF( MYROW.EQ.DROW ) THEN
063                MYKLR = KLR + MOD( MYKL , NPROW )
064            ELSE
065                MYKLR = KLR
066            END IF
067            PDC = 1
068            COL = DCOL
069     30 CONTINUE
070        IF( MYCOL.NE.COL ) THEN
071            PDC = PDC + CTOT( COL , 1 ) + CTOT( COL , 2 ) + CTOT( COL , 3 )
072            COL = MOD( COL + 1 , NPCOL )
073            GO TO 30
074        END IF
075        PDR = PDC
076        KL = KLR + MOD( MYKL , NPROW )
077        ROW = DROW
078     40 CONTINUE
079        IF( MYROW.NE.ROW ) THEN
080            PDR = PDR + KL
081            KL = KLR
082            ROW = MOD( ROW + 1 , NPROW )
083            GO TO 40
084        END IF
085  
086        DO 50 I = 1 , K
087            DLAMDA( I ) = DLAMC3( DLAMDA( I ) , DLAMDA( I ) ) - DLAMDA( I )
088            Z( I ) = ONE
089     50 CONTINUE
090        IF( MYKLR.GT.0 ) THEN
091            KK = PDR
092            DO 80 I = 1 , MYKLR
093                CALL DLAED4( K , KK , DLAMDA , W , BUF , RHO , BUF( K + I ) , IINFO )
094                IF( IINFO.NE.0 ) THEN
095                    INFO = KK
096                END IF
097  
098  *             ..Compute part of z
099  
100                DO 60 J = 1 , KK - 1
101                    Z( J ) = Z( J )*( BUF( J ) /
102       $( DLAMDA( J ) - DLAMDA( KK ) ) )
103     60         CONTINUE
104                Z( KK ) = Z( KK )*BUF( KK )
105                DO 70 J = KK + 1 , K
106                    Z( J ) = Z( J )*( BUF( J ) /
107       $( DLAMDA( J ) - DLAMDA( KK ) ) )
108     70         CONTINUE
109                KK = KK + 1
110     80     CONTINUE
111  
112            IF( MYROW.NE.DROW ) THEN
113                CALL DCOPY( K , Z , 1 , BUF , 1 )
114                CALL DGESD2D( ICTXT , K + MYKLR , 1 , BUF , K + MYKLR , DROW , MYCOL )
115            ELSE
116                IPD = 2*K + 1
117                CALL DCOPY( MYKLR , BUF( K + 1 ) , 1 , BUF( IPD ) , 1 )
118                IF( KLR.GT.0 ) THEN
119                    IPD = MYKLR + IPD
120                    ROW = MOD( DROW + 1 , NPROW )
121                    DO 100 I = 1 , NPROW - 1
122                        CALL DGERV2D( ICTXT , K + KLR , 1 , BUF , K + KLR , ROW ,
123       $                MYCOL )
124                        CALL DCOPY( KLR , BUF( K + 1 ) , 1 , BUF( IPD ) , 1 )
125                        DO 90 J = 1 , K
126                            Z( J ) = Z( J )*BUF( J )
127     90                 CONTINUE
128                        IPD = IPD + KLR
129                        ROW = MOD( ROW + 1 , NPROW )
130    100             CONTINUE
131                END IF
132            END IF
133        END IF
134  
135        IF( MYROW.EQ.DROW ) THEN
136            IF( MYCOL.NE.DCOL .AND. MYKL.NE.0 ) THEN
137                CALL DCOPY( K , Z , 1 , BUF , 1 )
138                CALL DCOPY( MYKL , BUF( 2*K + 1 ) , 1 , BUF( K + 1 ) , 1 )
139                CALL DGESD2D( ICTXT , K + MYKL , 1 , BUF , K + MYKL , MYROW , DCOL )
140            ELSE IF( MYCOL.EQ.DCOL ) THEN
141                IPD = 2*K + 1
142                COL = DCOL
143                KL = MYKL
144                DO 120 I = 1 , NPCOL - 1
145                    IPD = IPD + KL
146                    COL = MOD( COL + 1 , NPCOL )
147                    KL = CTOT( COL , 1 ) + CTOT( COL , 2 ) + CTOT( COL , 3 )
148                    IF( KL.NE.0 ) THEN
149                        CALL DGERV2D( ICTXT , K + KL , 1 , BUF , K + KL , MYROW , COL )
150                        CALL DCOPY( KL , BUF( K + 1 ) , 1 , BUF( IPD ) , 1 )
151                        DO 110 J = 1 , K
152                            Z( J ) = Z( J )*BUF( J )
153    110                 CONTINUE
154                    END IF
155    120         CONTINUE
156                DO 130 I = 1 , K
157                    Z( I ) = SIGN( SQRT( - Z( I ) ) , W( I ) )
158    130         CONTINUE
159  
160            END IF
161        END IF
162  
163  *     Diffusion
164  
165        IF( MYROW.EQ.DROW .AND. MYCOL.EQ.DCOL ) THEN
166            CALL DCOPY( K , Z , 1 , BUF , 1 )
167            CALL DCOPY( K , BUF( 2*K + 1 ) , 1 , BUF( K + 1 ) , 1 )
168            CALL DGEBS2D( ICTXT , 'All' , ' ' , 2*K , 1 , BUF , 2*K )
169        ELSE
170            CALL DGEBR2D( ICTXT , 'All' , ' ' , 2*K , 1 , BUF , 2*K , DROW , DCOL )
171            CALL DCOPY( K , BUF , 1 , Z , 1 )
172        END IF
173  
174  *     Copy of D at the good place
175  
176        KLC = 0
177        KLR = 0
178        DO 140 I = 1 , K
179            GI = INDX( I )
180            D( GI ) = BUF( K + I )
181            COL = INDCOL( GI )
182            ROW = INDROW( GI )
183            IF( COL.EQ.MYCOL ) THEN
184                KLC = KLC + 1
185                INDXC( KLC ) = I
186            END IF
187            IF( ROW.EQ.MYROW ) THEN
188                KLR = KLR + 1
189                INDXR( KLR ) = I
190            END IF
191    140 CONTINUE
192  
193  *     Compute eigenvectors of the modified rank - 1 modification.
194  
195        IF( MYKL.NE.0 ) THEN
196            DO 180 J = 1 , MYKL
197                KK = INDXC( J )
198                JU = INDX( KK )
199                JJU = INDXG2L( JU , NB , J , J , NPCOL )
200                CALL DLAED4( K , KK , DLAMDA , W , BUF , RHO , AUX , IINFO )
201                IF( IINFO.NE.0 ) THEN
202                    INFO = KK
203                END IF
204                IF( K.EQ.1 .OR. K.EQ.2 ) THEN
205                    DO 150 I = 1 , KLR
206                        KK = INDXR( I )
207                        IU = INDX( KK )
208                        IIU = INDXG2L( IU , NB , J , J , NPROW )
209                        U( IIU , JJU ) = BUF( KK )
210    150             CONTINUE
211                    GO TO 180
212                END IF
213  
214                DO 160 I = 1 , K
215                    BUF( I ) = Z( I ) / BUF( I )
216    160         CONTINUE
217                TEMP = DNRM2( K , BUF , 1 )
218                DO 170 I = 1 , KLR
219                    KK = INDXR( I )
220                    IU = INDX( KK )
221                    IIU = INDXG2L( IU , NB , J , J , NPROW )
222                    U( IIU , JJU ) = BUF( KK ) / TEMP
223    170         CONTINUE
224  
225    180     CONTINUE
226        END IF
227  
228    190 CONTINUE
229  
230        RETURN
231  
232  *     End of PDLAED3
233  
234        END