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 REAL 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 REAL ZERO, ONE
126 parameter( zero = 0.0e+0, one = 1.0e+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 REAL ORGNRM
134
135
136 LOGICAL LSAME
137 INTEGER INDXG2P, NUMROC
138 REAL SLANST
140
141
144
145
146 INTRINSIC mod, real
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 work( 1 ) = real( lwmin )
175 iwork( 1 ) = liwmin
176 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
177 IF( .NOT.
lsame( compz,
'I' ) )
THEN
178 info = -1
179 ELSE IF( n.LT.0 ) THEN
180 info = -2
181 ELSE IF( iroffq.NE.icoffq .OR. icoffq.NE.0 ) THEN
182 info = -5
183 ELSE IF( descq( mb_ ).NE.descq( nb_ ) ) THEN
184 info = -( 700+nb_ )
185 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
186 info = -10
187 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery ) THEN
188 info = -12
189 END IF
190 END IF
191 END IF
192 IF( info.NE.0 ) THEN
193 CALL pxerbla( descq( ctxt_ ),
'PSSTEDC', -info )
194 RETURN
195 ELSE IF( lquery ) THEN
196 RETURN
197 END IF
198
199
200
201 IF( n.EQ.0 )
202 $ GO TO 10
203 CALL infog2l( iq, jq, descq, nprow, npcol, myrow, mycol, iiq, jjq,
204 $ iqrow, iqcol )
205 IF( n.EQ.1 ) THEN
206 IF( myrow.EQ.iqrow .AND. mycol.EQ.iqcol )
207 $ q( 1 ) = one
208 GO TO 10
209 END IF
210
211
212
213
214
215 IF( n.LE.nb ) THEN
216 IF( ( myrow.EQ.iqrow ) .AND. ( mycol.EQ.iqcol ) ) THEN
217 ipq = iiq + ( jjq-1 )*ldq
218 CALL sstedc( 'I', n, d, e, q( ipq ), ldq, work, lwork,
219 $ iwork, liwork, info )
220 IF( info.NE.0 ) THEN
221 info = ( n+1 ) + n
222 GO TO 10
223 END IF
224 END IF
225 GO TO 10
226 END IF
227
228
229
230 IF( npcol*nprow.EQ.1 ) THEN
231 ipq = iiq + ( jjq-1 )*ldq
232 CALL sstedc( 'I', n, d, e, q( ipq ), ldq, work, lwork, iwork,
233 $ liwork, info )
234 GO TO 10
235 END IF
236
237
238
239 orgnrm = slanst( 'M', n, d, e )
240 IF( orgnrm.NE.zero ) THEN
241 CALL slascl( 'G', 0, 0, orgnrm, one, n, 1, d, n, info )
242 CALL slascl( 'G', 0, 0, orgnrm, one, n-1, 1, e, n-1, info )
243 END IF
244
245 CALL pslaed0( n, d, e, q, iq, jq, descq, work, iwork, info )
246
247
248
249 CALL pslasrt(
'I', n, d, q, iq, jq, descq, work, lwork, iwork,
250 $ liwork, info )
251
252
253
254 IF( orgnrm.NE.zero )
255 $ CALL slascl( 'G', 0, 0, one, orgnrm, n, 1, d, n, info )
256
257 10 CONTINUE
258
259 IF( lwork.GT.0 )
260 $ work( 1 ) = real( lwmin )
261 IF( liwork.GT.0 )
262 $ iwork( 1 ) = liwmin
263 RETURN
264
265
266
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 pslaed0(n, d, e, q, iq, jq, descq, work, iwork, info)
subroutine pslasrt(id, n, d, q, iq, jq, descq, work, lwork, iwork, liwork, info)
subroutine pxerbla(ictxt, srname, info)