|
|
| |
| # 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 ..
|
|
|
|
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_*
032
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 )
039
040 $ INFO = - 1
041 IF( INFO.NE.0 ) THEN
041
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
058
059 DO 20 J = SUBPBS , 1 , - 1
059
060 IWORK( 2*J ) =( IWORK( J ) + 1 ) / 2
061 IWORK( 2*J - 1 ) = IWORK( J ) / 2
062 20 CONTINUE
062
063 SUBPBS = 2*SUBPBS
064 GO TO 10
065 END IF
066 DO 30 J = 2 , SUBPBS
066
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
073
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
082
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
086
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
090
091 CALL PXERBLA( DESCQ( CTXT_ ) , 'SSTEQR' , - INFO )
092 RETURN
093 END IF
094 IF( MYROW.NE.IQROW .OR. MYCOL.NE.IQCOL ) THEN
094
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
098
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
104
105 CALL SGEBS2D( DESCQ( CTXT_ ) , 'A' , ' ' , N , 1 , D , N )
106 ELSE
106
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
117
118 IM2 = SUBPBS - 2
119 DO 80 I = 0 , IM2 , 2
119
120 IF( I.EQ.0 ) THEN
120
121 NBL = IWORK( 2 )
122 NBL1 = IWORK( 1 )
123 IF( NBL1.EQ.0 )
123
124 $ GO TO 70
125 ID = 1
126 MATSIZ = MIN( N , NBL*NB )
127 N1 = NBL1*NB
128 ELSE
128
129 NBL = IWORK( I + 2 ) - IWORK( I )
130 NBL1 = NBL / 2
131 IF( NBL1.EQ.0 )
131
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
143
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 END22
22
|
|
Variables in Routine PSLAED0()
| Summary Report |
| Data Type | Quantity | Size(byte) |
| INTEGER | 43 | 172 |
| REAL | 1 | 4 |
| TOTAL | 44 | 176 |
List of Variables
INTEGER
| BLOCK_CYCLIC_2D | CSRC_ | CTXT_ | DLEN_ | DTYPE_ |
| I | ID | IDCOL | IDROW | IID |
| IINFO | IIQ | IM1 | IM2 | INFO |
| IPQ | IQ | IQCOL | IQROW | IWORK |
| J | JJD | JJQ | JQ | LDQ |
| LLD_ | M_ | MATSIZ | MB_ | MYCOL |
| MYROW | N | N_ | N1 | NB |
| NB_ | NBL | NBL1 | NPCOL | NPROW |
| RSRC_ | SUBPBS | TSUBPBS | | |
REAL
Variables Dependence Graph Put the mouse over a right hand side variable to display the corresponding line of the dependence | | - | | - | - | | D | <--- | IM1D( IM1 ) = D( IM1 ) - ABS( E( IM1 ) ){2D( I ) = D( I ) - ABS( E( IM1 ) )}, DD( IM1 ) = D( IM1 ) - ABS( E( IM1 ) ){2D( I ) = D( I ) - ABS( E( IM1 ) )}, ID( I ) = D( I ) - ABS( E( IM1 ) ) |
| I | <--- | IM2DO 80 I = 0, IM2, 2, NDO 40 I = NB + 1, N, NB, NBDO 40 I = NB + 1, N, NB |
| ID | <--- | IWORKID = IWORK( I )*NB + 1, NDO 50 ID = 1, N, NB, NBID = IWORK( I )*NB + 1{2DO 50 ID = 1, N, NB}, IID = IWORK( I )*NB + 1 |
| IM1 | <--- | IIM1 = I - 1 |
| IM2 | <--- | SUBPBSIM2 = SUBPBS - 2 |
| INFO | <--- | IINFOINFO = IINFO*( N+1 ) + ID, NINFO = IINFO*( N+1 ) + ID, IDINFO = IINFO*( N+1 ) + ID |
| IPQ | <--- | IIDIPQ = IID + ( JJD-1 )*LDQ, JJDIPQ = IID + ( JJD-1 )*LDQ, LDQIPQ = IID + ( JJD-1 )*LDQ |
| IWORK | <--- | IWORKIWORK( I / 2+1 ) = IWORK( I+2 ){2IWORK( 2*J ) = ( IWORK( J )+1 ) / 2, 3IWORK( 2*J-1 ) = IWORK( J ) / 2, 4IWORK( J ) = IWORK( J ) + IWORK( J-1 )}, JIWORK( 2*J ) = ( IWORK( J )+1 ) / 2{2IWORK( 2*J-1 ) = IWORK( J ) / 2, 3IWORK( J ) = IWORK( J ) + IWORK( J-1 )}, TSUBPBSIWORK( 1 ) = TSUBPBS, IIWORK( I / 2+1 ) = IWORK( I+2 ) |
| J | <--- | SUBPBSDO 20 J = SUBPBS, 1, -1{2DO 30 J = 2, SUBPBS} |
| LDQ | <--- | LLD_LDQ = DESCQ( LLD_ ) |
| MATSIZ | <--- | NMATSIZ = MIN( N, NBL*NB ){2MATSIZ = MIN( NB*NBL, N-ID+1 ), 3MATSIZ = MIN( NB, N-ID+1 )}, NBMATSIZ = MIN( N, NBL*NB ){2MATSIZ = MIN( NB*NBL, N-ID+1 ), 3MATSIZ = MIN( NB, N-ID+1 )}, NBLMATSIZ = MIN( N, NBL*NB ){2MATSIZ = MIN( NB*NBL, N-ID+1 )}, IDMATSIZ = MIN( NB*NBL, N-ID+1 ){2MATSIZ = MIN( NB, N-ID+1 )} |
| N1 | <--- | NBN1 = NBL1*NB{2N1 = NBL1*NB}, NBL1N1 = NBL1*NB{2N1 = NBL1*NB} |
| NB | <--- | NB_NB = DESCQ( NB_ ) |
| NBL | <--- | IWORKNBL = IWORK( 2 ){2NBL = IWORK( I+2 ) - IWORK( I )}, INBL = IWORK( I+2 ) - IWORK( I ) |
| NBL1 | <--- | IWORKNBL1 = IWORK( 1 ), NBLNBL1 = NBL / 2 |
| SUBPBS | <--- | SUBPBSSUBPBS = SUBPBS / 2{2SUBPBS = 2*SUBPBS} |
| TSUBPBS | <--- | NTSUBPBS = ( N-1 ) / NB + 1, NBTSUBPBS = ( N-1 ) / NB + 1 |
|
|
Analysis elements of the routine PSLAED0() Put the mouse over each element to display detailed matching information
Assigned variables |
| | | BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , DLEN_ , DTYPE_ , I , ID , IM1 , IM2 , INFO , IPQ , IWORK , J , LDQ , LLD_ , M_ , MATSIZ , MB_ , N_ , N1 , NB , NB_ , NBL , NBL1 , RSRC_ , SUBPBS , TSUBPBS |
|
Active variables |
| | | BLOCK_CYCLIC_2D , CSRC_ , CTXT_ , D , DESCQ , DLEN_ , DTYPE_ , E , I , ID , IDCOL , IDROW , IID , IINFO , IIQ , IM1 , IM2 , INFO , IPQ , IQ , IQCOL , IQROW , IWORK , J , JJD , JJQ , JQ , LDQ , LLD_ , M_ , MATSIZ , MB_ , MYCOL , MYROW , N , N_ , N1 , NB , NB_ , NBL , NBL1 , NPCOL , NPROW , Q , RSRC_ , SUBPBS , TSUBPBS , WORK |
|
Accessed arrays [ array name : associated index ] |
| | D | : I , ID , ID , ID , ID , IM1 |
| | DESCQ | : CTXT_ , CTXT_ , CTXT_ , CTXT_ , CTXT_ , CTXT_ , CTXT_ , LLD_ , NB_ , NB_ |
| | E | : ID , ID+N1-1 , IM1 , IM1 |
| | IWORK | : 1 , 1 , 2 , 2*J , 2*J-1 , I / 2+1 , I , I , I+2 , I+2 , J , J , J , J-1 , SUBPBS , SUBPBS+1 |
| | Q | : IPQ |
|
Conditional statements [ statement : associated predicate ] |
| | do | : ( 20 J = SUBPBS , 1 , - 1 ) , ( 30 J = 2 , SUBPBS ) , ( 40 I = NB + 1 , N , NB ) , ( 50 ID = 1 , N , NB ) , ( 80 I = 0 , IM2 , 2 ) |
| | for | : ( the corresponding larger matrix. ) |
| | if | : ( BLOCK_CYCLIC_2D*CSRC_*CTXT_*DLEN_*DTYPE_*LLD_*MB_*M_*NB_*N_* ) , ( (DESCQ( NB_ ).GT.N .OR. N.LT.2 ) ) , ( INFO.NE.0 ) , ( (IWORK( SUBPBS ).GT.1 ) ) , ( MYROW.EQ.IDROW .AND. MYCOL.EQ.IDCOL ) , ( INFO.NE.0 ) , ( MYROW.NE.IQROW .OR. MYCOL.NE.IQCOL ) , ( MYROW.EQ.IQROW .AND. MYCOL.EQ.IQCOL ) , ( MYROW.EQ.IQROW .AND. MYCOL.EQ.IQCOL ) , ( SUBPBS.GT.1 ) , ( I.EQ.0 ) , ( NBL1.EQ.0 ) , ( NBL1.EQ.0 ) , ( IINFO.NE.0 ) |
| | while | : ( SUBPBS > 1 ) |
|
| List of variables | BLOCK_CYCLIC_2D CSRC_ CTXT_ D DLEN_ DTYPE_ I
| ID IDCOL IDROW IID IINFO IIQ IM1 IM2
| INFO IPQ IQ IQCOL IQROW IWORK J JJD
| JJQ JQ LDQ LLD_ M_ MATSIZ MB_ MYCOL
| MYROW N N_ N1 NB NB_ NBL NBL1
| NPCOL NPROW RSRC_ SUBPBS TSUBPBS | | close
| |
BLOCK_CYCLIC_2D
CSRC_
CTXT_
D
DLEN_
DTYPE_
I
ID
IDCOL
IDROW
IID
IINFO
IIQ
IM1
IM2
INFO
IPQ
IQ
IQCOL
IQROW
IWORK
J
JJD
JJQ
JQ
LDQ
LLD_
M_
MATSIZ
MB_
MYCOL
MYROW
N
N_
N1
NB
NB_
NBL
NBL1
NPCOL
NPROW
RSRC_
SUBPBS
TSUBPBS
362
| |