2
3
4
5
6
7
8
9 INTEGER INFO, IQ, JQ, N
10
11
12 INTEGER DESCQ( * ), IWORK( * )
13 REAL D( * ), E( * ), Q( * ), WORK( * )
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
82 $ MB_, NB_, RSRC_, CSRC_, LLD_
83 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
84 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
85 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
86
87
88 INTEGER I, ID, IDCOL, IDROW, IID, IINFO, IIQ, IM1, IM2,
89 $ IPQ, IQCOL, IQROW, J, JJD, JJQ, LDQ, MATSIZ,
90 $ MYCOL, MYROW, N1, NB, NBL, NBL1, NPCOL, NPROW,
91 $ SUBPBS, TSUBPBS
92
93
95 $ sgebr2d, sgebs2d, sgerv2d, sgesd2d, ssteqr
96
97
99
100
101
102
103 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
104 $ rsrc_.LT.0 )RETURN
105
106
107
108 CALL blacs_gridinfo( descq( ctxt_ ), nprow, npcol, myrow, mycol )
109 info = 0
110 IF( descq( nb_ ).GT.n .OR. n.LT.2 )
111 $ info = -1
112 IF( info.NE.0 ) THEN
113 CALL pxerbla( descq( ctxt_ ),
'PSLAED0', -info )
114 RETURN
115 END IF
116
117 nb = descq( nb_ )
118 ldq = descq( lld_ )
119 CALL infog2l( iq, jq, descq, nprow, npcol, myrow, mycol, iiq, jjq,
120 $ iqrow, iqcol )
121
122
123
124
125 tsubpbs = ( n-1 ) / nb + 1
126 iwork( 1 ) = tsubpbs
127 subpbs = 1
128 10 CONTINUE
129 IF( iwork( subpbs ).GT.1 ) THEN
130 DO 20 j = subpbs, 1, -1
131 iwork( 2*j ) = ( iwork( j )+1 ) / 2
132 iwork( 2*j-1 ) = iwork( j ) / 2
133 20 CONTINUE
134 subpbs = 2*subpbs
135 GO TO 10
136 END IF
137 DO 30 j = 2, subpbs
138 iwork( j ) = iwork( j ) + iwork( j-1 )
139 30 CONTINUE
140
141
142
143
144 DO 40 i = nb + 1, n, nb
145 im1 = i - 1
146 d( im1 ) = d( im1 ) - abs( e( im1 ) )
147 d( i ) = d( i ) - abs( e( im1 ) )
148 40 CONTINUE
149
150
151
152
153 DO 50 id = 1, n, nb
154 CALL infog2l( iq-1+id, jq-1+id, descq, nprow, npcol, myrow,
155 $ mycol, iid, jjd, idrow, idcol )
156 matsiz =
min( nb, n-id+1 )
157 IF( myrow.EQ.idrow .AND. mycol.EQ.idcol ) THEN
158 ipq = iid + ( jjd-1 )*ldq
159 CALL ssteqr( 'I', matsiz, d( id ), e( id ), q( ipq ), ldq,
160 $ work, info )
161 IF( info.NE.0 ) THEN
162 CALL pxerbla( descq( ctxt_ ),
'SSTEQR', -info )
163 RETURN
164 END IF
165 IF( myrow.NE.iqrow .OR. mycol.NE.iqcol ) THEN
166 CALL sgesd2d( descq( ctxt_ ), matsiz, 1, d( id ), matsiz,
167 $ iqrow, iqcol )
168 END IF
169 ELSE IF( myrow.EQ.iqrow .AND. mycol.EQ.iqcol ) THEN
170 CALL sgerv2d( descq( ctxt_ ), matsiz, 1, d( id ), matsiz,
171 $ idrow, idcol )
172 END IF
173 50 CONTINUE
174
175 IF( myrow.EQ.iqrow .AND. mycol.EQ.iqcol ) THEN
176 CALL sgebs2d( descq( ctxt_ ), 'A', ' ', n, 1, d, n )
177 ELSE
178 CALL sgebr2d( descq( ctxt_ ), 'A', ' ', n, 1, d, n, iqrow,
179 $ iqcol )
180 END IF
181
182
183
184
185
186
187 60 CONTINUE
188 IF( subpbs.GT.1 ) THEN
189 im2 = subpbs - 2
190 DO 80 i = 0, im2, 2
191 IF( i.EQ.0 ) THEN
192 nbl = iwork( 2 )
193 nbl1 = iwork( 1 )
194 IF( nbl1.EQ.0 )
195 $ GO TO 70
196 id = 1
197 matsiz =
min( n, nbl*nb )
198 n1 = nbl1*nb
199 ELSE
200 nbl = iwork( i+2 ) - iwork( i )
201 nbl1 = nbl / 2
202 IF( nbl1.EQ.0 )
203 $ GO TO 70
204 id = iwork( i )*nb + 1
205 matsiz =
min( nb*nbl, n-id+1 )
206 n1 = nbl1*nb
207 END IF
208
209
210
211
212 CALL pslaed1( matsiz, n1, d( id ), id, q, iq, jq, descq,
213 $ e( id+n1-1 ), work, iwork( subpbs+1 ), iinfo )
214 IF( iinfo.NE.0 ) THEN
215 info = iinfo*( n+1 ) + id
216 END IF
217 70 CONTINUE
218 iwork( i / 2+1 ) = iwork( i+2 )
219 80 CONTINUE
220 subpbs = subpbs / 2
221 GO TO 60
222 END IF
223
224
225
226 90 CONTINUE
227 RETURN
228
229
230
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine pslaed1(n, n1, d, id, q, iq, jq, descq, rho, work, iwork, info)
subroutine pxerbla(ictxt, srname, info)