Routine: PSLAED0()  File: SRC\pslaed0.f

 
 
# lines: 231
  # code: 231
  # comment: 0
  # blank:0
# Variables:44
# Callers:1
# Callings:1
# Words:143
# Keywords:95
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  PSLAED0 computes all eigenvalues and corresponding eigenvectors of a
  symmetric tridiagonal matrix using the divide and conquer method.
  Arguments
  =========
  N       (global input) INTEGER
          The order of the tridiagonal matrix T.  N >= 0.
  D       (global input/output) REAL array, dimension (N)
          On entry, the diagonal elements of the tridiagonal matrix.
          On exit, if INFO = 0, the eigenvalues in descending order.
  E       (global input/output) REAL array, dimension (N-1)
          On entry, the subdiagonal elements of the tridiagonal matrix.
          On exit, E has been destroyed.
  Q       (local output) REAL array,
          global dimension (N, N),
          local dimension ( LLD_Q, LOCc(JQ+N-1))
          Q  contains the orthonormal eigenvectors of the symmetric
          tridiagonal matrix.
          On output, Q is distributed across the P processes in block
          cyclic format.
  IQ      (global input) INTEGER
          Q's global row index, which points to the beginning of the
          submatrix which is to be operated on.
  JQ      (global input) INTEGER
          Q's global column index, which points to the beginning of
          the submatrix which is to be operated on.
  DESCQ   (global and local input) INTEGER array of dimension DLEN_.
          The array descriptor for the distributed matrix Z.
  WORK    (local workspace ) REAL array, dimension (LWORK)
          LWORK = 6*N + 2*NP*NQ, with
          NP = NUMROC( N, MB_Q, MYROW, IQROW, NPROW )
          NQ = NUMROC( N, NB_Q, MYCOL, IQCOL, NPCOL )
          IQROW = INDXG2P( IQ, NB_Q, MYROW, RSRC_Q, NPROW )
          IQCOL = INDXG2P( JQ, MB_Q, MYCOL, CSRC_Q, NPCOL )
  IWORK   (local workspace/output) INTEGER array, dimension (LIWORK)
          LIWORK = 2 + 7*N + 8*NPCOL
  INFO    (global output) INTEGER
          = 0:  successful exit
          < 0:  If the i-th argument is an array and the j-entry had
                an illegal value, then INFO = -(i*100+j), if the i-th
                argument is a scalar and had an illegal value, then
                INFO = -i.
          > 0:  The algorithm failed to compute the INFO/(N+1) th
                eigenvalue while working on the submatrix lying in
                global rows and columns mod(INFO,N+1).
  =====================================================================
     .. Parameters ..

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

 
001        SUBROUTINE PSLAED0( N , D , E , Q , IQ , JQ , DESCQ , WORK , IWORK , INFO )
002  
003  *     -- ScaLAPACK auxiliary routine(version 1.7) --
004  *     University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
005  *     and University of California , Berkeley.
006  *     December 31 , 1998
007  
008  *     .. Scalar Arguments ..
009        INTEGER INFO , IQ , JQ , N
010        INTEGER BLOCK_CYCLIC_2D , DLEN_ , DTYPE_ , CTXT_ , M_ , N_ ,
011       $MB_ , NB_ , RSRC_ , CSRC_ , LLD_
012        PARAMETER( BLOCK_CYCLIC_2D = 1 , DLEN_ = 9 , DTYPE_ = 1 ,
013       $CTXT_ = 2 , M_ = 3 , N_ = 4 , MB_ = 5 , NB_ = 6 ,
014       $RSRC_ = 7 , CSRC_ = 8 , LLD_ = 9 )
015  *     ..
016  *     .. Local Scalars ..
017        INTEGER I , ID , IDCOL , IDROW , IID , IINFO , IIQ , IM1 , IM2 ,
018       $IPQ , IQCOL , IQROW , J , JJD , JJQ , LDQ , MATSIZ ,
019       $MYCOL , MYROW , N1 , NB , NBL , NBL1 , NPCOL , NPROW ,
020       $SUBPBS , TSUBPBS
021  *     ..
022  *     .. External Subroutines ..
023        EXTERNAL BLACS_GRIDINFO , INFOG2L , PSLAED1 , PXERBLA ,
024       $SGEBR2D , SGEBS2D , SGERV2D , SGESD2D , SSTEQR
025  *     ..
026  *     .. Intrinsic Functions ..
027        INTRINSIC ABS , MIN
028  *     ..
029  *     .. Executable Statements ..
030  
031  *     This is just to keep ftnchek and toolpack / 1 happy
032        IF( BLOCK_CYCLIC_2D*CSRC_*CTXT_*DLEN_*DTYPE_*LLD_*MB_*M_*NB_*N_*
033       $    RSRC_.LT.0 )RETURN
034  
035  *         Test the input parameters.
036  
037            CALL BLACS_GRIDINFO( DESCQ( CTXT_ ) , NPROW , NPCOL , MYROW , MYCOL )
038            INFO = 0
039            IF( DESCQ( NB_ ).GT.N .OR. N.LT.2 )
040       $        INFO = - 1
041                IF( INFO.NE.0 ) THEN
042                    CALL PXERBLA( DESCQ( CTXT_ ) , 'PSLAED0' , - INFO )
043                    RETURN
044                END IF
045  
046                NB = DESCQ( NB_ )
047                LDQ = DESCQ( LLD_ )
048                CALL INFOG2L( IQ , JQ , DESCQ , NPROW , NPCOL , MYROW , MYCOL , IIQ , JJQ ,
049       $        IQROW , IQCOL )
050  
051  *             Determine the size and placement of the submatrices , and save in
052  *             the leading elements of IWORK.
053  
054                TSUBPBS =( N - 1 ) / NB + 1
055                IWORK( 1 ) = TSUBPBS
056                SUBPBS = 1
057     10 CONTINUE
058        IF( IWORK( SUBPBS ).GT.1 ) THEN
059            DO 20 J = SUBPBS , 1 , - 1
060                IWORK( 2*J ) =( IWORK( J ) + 1 ) / 2
061                IWORK( 2*J - 1 ) = IWORK( J ) / 2
062     20     CONTINUE
063            SUBPBS = 2*SUBPBS
064            GO TO 10
065        END IF
066        DO 30 J = 2 , SUBPBS
067            IWORK( J ) = IWORK( J ) + IWORK( J - 1 )
068     30 CONTINUE
069  
070  *     Divide the matrix into TSUBPBS submatrices of size at most NB
071  *     using rank - 1 modifications(cuts).
072  
073        DO 40 I = NB + 1 , N , NB
074            IM1 = I - 1
075            D( IM1 ) = D( IM1 ) - ABS( E( IM1 ) )
076            D( I ) = D( I ) - ABS( E( IM1 ) )
077     40 CONTINUE
078  
079  *     Solve each submatrix eigenproblem at the bottom of the divide and
080  *     conquer tree. D is the same on each process.
081  
082        DO 50 ID = 1 , N , NB
083            CALL INFOG2L( IQ - 1 + ID , JQ - 1 + ID , DESCQ , NPROW , NPCOL , MYROW ,
084       $    MYCOL , IID , JJD , IDROW , IDCOL )
085            MATSIZ = MIN( NB , N - ID + 1 )
086            IF( MYROW.EQ.IDROW .AND. MYCOL.EQ.IDCOL ) THEN
087                IPQ = IID + ( JJD - 1 )*LDQ
088                CALL SSTEQR( 'I' , MATSIZ , D( ID ) , E( ID ) , Q( IPQ ) , LDQ ,
089       $        WORK , INFO )
090                IF( INFO.NE.0 ) THEN
091                    CALL PXERBLA( DESCQ( CTXT_ ) , 'SSTEQR' , - INFO )
092                    RETURN
093                END IF
094                IF( MYROW.NE.IQROW .OR. MYCOL.NE.IQCOL ) THEN
095                    CALL SGESD2D( DESCQ( CTXT_ ) , MATSIZ , 1 , D( ID ) , MATSIZ ,
096       $            IQROW , IQCOL )
097                END IF
098            ELSE IF( MYROW.EQ.IQROW .AND. MYCOL.EQ.IQCOL ) THEN
099                CALL SGERV2D( DESCQ( CTXT_ ) , MATSIZ , 1 , D( ID ) , MATSIZ ,
100       $        IDROW , IDCOL )
101            END IF
102     50 CONTINUE
103  
104        IF( MYROW.EQ.IQROW .AND. MYCOL.EQ.IQCOL ) THEN
105            CALL SGEBS2D( DESCQ( CTXT_ ) , 'A' , ' ' , N , 1 , D , N )
106        ELSE
107            CALL SGEBR2D( DESCQ( CTXT_ ) , 'A' , ' ' , N , 1 , D , N , IQROW ,
108       $    IQCOL )
109        END IF
110  
111  *     Successively merge eigensystems of adjacent submatrices
112  *     into eigensystem for the corresponding larger matrix.
113  
114  *     while( SUBPBS > 1 )
115  
116     60 CONTINUE
117        IF( SUBPBS.GT.1 ) THEN
118            IM2 = SUBPBS - 2
119            DO 80 I = 0 , IM2 , 2
120                IF( I.EQ.0 ) THEN
121                    NBL = IWORK( 2 )
122                    NBL1 = IWORK( 1 )
123                    IF( NBL1.EQ.0 )
124       $                GO TO 70
125                        ID = 1
126                        MATSIZ = MIN( N , NBL*NB )
127                        N1 = NBL1*NB
128                    ELSE
129                        NBL = IWORK( I + 2 ) - IWORK( I )
130                        NBL1 = NBL / 2
131                        IF( NBL1.EQ.0 )
132       $                    GO TO 70
133                            ID = IWORK( I )*NB + 1
134                            MATSIZ = MIN( NB*NBL , N - ID + 1 )
135                            N1 = NBL1*NB
136                        END IF
137  
138  *                     Merge lower order eigensystems(of size N1 and MATSIZ - N1)
139  *                     into an eigensystem of size MATSIZ.
140  
141                        CALL PSLAED1 ( MATSIZ , N1 , D( ID ) , ID , Q , IQ , JQ , DESCQ ,
142       $                E( ID + N1 - 1 ) , WORK , IWORK( SUBPBS + 1 ) , IINFO )
143                        IF( IINFO.NE.0 ) THEN
144                            INFO = IINFO*( N + 1 ) + ID
145                        END IF
146     70 CONTINUE
147        IWORK( I / 2 + 1 ) = IWORK( I + 2 )
148     80 CONTINUE
149        SUBPBS = SUBPBS / 2
150        GO TO 60
151        END IF
152  
153  *     end while
154  
155     90 CONTINUE
156        RETURN
157  
158  *     End of PSLAED0
159  
160        END