3
4
5
6
7
8
9
10 CHARACTER COMPZ
11 INTEGER INFO, IQ, JQ, LIWORK, LWORK, N
12
13
14 INTEGER DESCQ( * ), IWORK( * )
15 DOUBLE PRECISION D( * ), E( * ), Q( * ), WORK( * )
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
121 $ MB_, NB_, RSRC_, CSRC_, LLD_
122 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
123 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
124 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
125 DOUBLE PRECISION ZERO, ONE
126 parameter( zero = 0.0d+0, one = 1.0d+0 )
127
128
129 LOGICAL LQUERY
130 INTEGER ICOFFQ, IIQ, IPQ, IQCOL, IQROW, IROFFQ, JJQ,
131 $ LDQ, LIWMIN, LWMIN, MYCOL, MYROW, NB, NP,
132 $ NPCOL, NPROW, NQ
133 DOUBLE PRECISION ORGNRM
134
135
136 LOGICAL LSAME
137 INTEGER INDXG2P, NUMROC
138 DOUBLE PRECISION DLANST
140
141
142 EXTERNAL blacs_gridinfo,
chk1mat, dlascl, dstedc,
144
145
146 INTRINSIC dble, mod
147
148
149
150
151 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
152 $ rsrc_.LT.0 )RETURN
153
154
155
156 CALL blacs_gridinfo( descq( ctxt_ ), nprow, npcol, myrow, mycol )
157 ldq = descq( lld_ )
158 nb = descq( nb_ )
159 np =
numroc( n, nb, myrow, descq( rsrc_ ), nprow )
160 nq =
numroc( n, nb, mycol, descq( csrc_ ), npcol )
161 info = 0
162 IF( nprow.EQ.-1 ) THEN
163 info = -( 600+ctxt_ )
164 ELSE
165 CALL chk1mat( n, 2, n, 2, iq, jq, descq, 8, info )
166 IF( info.EQ.0 ) THEN
167 nb = descq( nb_ )
168 iroffq = mod( iq-1, descq( mb_ ) )
169 icoffq = mod( jq-1, descq( nb_ ) )
170 iqrow =
indxg2p( iq, nb, myrow, descq( rsrc_ ), nprow )
171 iqcol =
indxg2p( jq, nb, mycol, descq( csrc_ ), npcol )
172 lwmin = 6*n + 2*np*nq
173 liwmin = 2 + 7*n + 8*npcol
174
175 work( 1 ) = dble( lwmin )
176 iwork( 1 ) = liwmin
177 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
178 IF( .NOT.
lsame( compz,
'I' ) )
THEN
179 info = -1
180 ELSE IF( n.LT.0 ) THEN
181 info = -2
182 ELSE IF( iroffq.NE.icoffq .OR. icoffq.NE.0 ) THEN
183 info = -5
184 ELSE IF( descq( mb_ ).NE.descq( nb_ ) ) THEN
185 info = -( 700+nb_ )
186 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
187 info = -10
188 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery ) THEN
189 info = -12
190 END IF
191 END IF
192 END IF
193 IF( info.NE.0 ) THEN
194 CALL pxerbla( descq( ctxt_ ),
'PDSTEDC', -info )
195 RETURN
196 ELSE IF( lquery ) THEN
197 RETURN
198 END IF
199
200
201
202 IF( n.EQ.0 )
203 $ GO TO 10
204 CALL infog2l( iq, jq, descq, nprow, npcol, myrow, mycol, iiq, jjq,
205 $ iqrow, iqcol )
206 IF( n.EQ.1 ) THEN
207 IF( myrow.EQ.iqrow .AND. mycol.EQ.iqcol )
208 $ q( 1 ) = one
209 GO TO 10
210 END IF
211
212
213
214
215
216 IF( n.LE.nb ) THEN
217 IF( ( myrow.EQ.iqrow ) .AND. ( mycol.EQ.iqcol ) ) THEN
218 ipq = iiq + ( jjq-1 )*ldq
219 CALL dstedc( 'I', n, d, e, q( ipq ), ldq, work, lwork,
220 $ iwork, liwork, info )
221 IF( info.NE.0 ) THEN
222 info = ( n+1 ) + n
223 GO TO 10
224 END IF
225 END IF
226 GO TO 10
227 END IF
228
229
230
231 IF( npcol*nprow.EQ.1 ) THEN
232 ipq = iiq + ( jjq-1 )*ldq
233 CALL dstedc( 'I', n, d, e, q( ipq ), ldq, work, lwork, iwork,
234 $ liwork, info )
235 GO TO 10
236 END IF
237
238
239
240 orgnrm = dlanst( 'M', n, d, e )
241 IF( orgnrm.NE.zero ) THEN
242 CALL dlascl( 'G', 0, 0, orgnrm, one, n, 1, d, n, info )
243 CALL dlascl( 'G', 0, 0, orgnrm, one, n-1, 1, e, n-1, info )
244 END IF
245
246 CALL pdlaed0( n, d, e, q, iq, jq, descq, work, iwork, info )
247
248
249
250 CALL pdlasrt(
'I', n, d, q, iq, jq, descq, work, lwork, iwork,
251 $ liwork, info )
252
253
254
255 IF( orgnrm.NE.zero )
256 $ CALL dlascl( 'G', 0, 0, one, orgnrm, n, 1, d, n, info )
257
258 10 CONTINUE
259
260 IF( lwork.GT.0 )
261 $ work( 1 ) = dble( lwmin )
262 IF( liwork.GT.0 )
263 $ iwork( 1 ) = liwmin
264 RETURN
265
266
267
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pdlaed0(n, d, e, q, iq, jq, descq, work, iwork, info)
subroutine pdlasrt(id, n, d, q, iq, jq, descq, work, lwork, iwork, liwork, info)
subroutine pxerbla(ictxt, srname, info)