3
4
5
6
7
8
9
10 INTEGER ID, INFO, IQ, JQ, N, N1
11 REAL RHO
12
13
14 INTEGER DESCQ( * ), IWORK( * )
15 REAL D( * ), 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 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
109 $ MB_, NB_, RSRC_, CSRC_, LLD_
110 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
111 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
112 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
113 REAL ZERO, ONE
114 parameter( zero = 0.0e+0, one = 1.0e+0 )
115
116
117 INTEGER COL, COLTYP, IBUF, ICTOT, ICTXT, IDLMDA, IIQ,
118 $ INDCOL, INDROW, INDX, INDXC, INDXP, INDXR, INQ,
119 $ IPQ, IPQ2, IPSM, IPU, IPWORK, IQ1, IQ2, IQCOL,
120 $ IQQ, IQROW, IW, IZ, J, JC, JJ2C, JJC, JJQ, JNQ,
121 $ K, LDQ, LDQ2, LDU, MYCOL, MYROW, NB, NN, NN1,
122 $ NN2, NP, NPCOL, NPROW, NQ
123
124
125 INTEGER DESCQ2( DLEN_ ), DESCU( DLEN_ )
126
127
128 INTEGER NUMROC
130
131
135
136
138
139
140
141
142 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
143 $ rsrc_.LT.0 )RETURN
144
145
146
147
148 CALL blacs_gridinfo( descq( ctxt_ ), nprow, npcol, myrow, mycol )
149 info = 0
150 IF( nprow.EQ.-1 ) THEN
151 info = -( 600+ctxt_ )
152 ELSE IF( n.LT.0 ) THEN
153 info = -1
154 ELSE IF( id.GT.descq( n_ ) ) THEN
155 info = -4
156 ELSE IF( n1.GE.n ) THEN
157 info = -2
158 END IF
159 IF( info.NE.0 ) THEN
160 CALL pxerbla( descq( ctxt_ ),
'PSLAED1', -info )
161 RETURN
162 END IF
163
164
165
166 IF( n.EQ.0 )
167 $ RETURN
168
169
170
171
172
173 ictxt = descq( ctxt_ )
174 nb = descq( nb_ )
175 ldq = descq( lld_ )
176
177 CALL infog2l( iq-1+id, jq-1+id, descq, nprow, npcol, myrow, mycol,
178 $ iiq, jjq, iqrow, iqcol )
179
180 np =
numroc( n, descq( mb_ ), myrow, iqrow, nprow )
181 nq =
numroc( n, descq( nb_ ), mycol, iqcol, npcol )
182
184 ldu = ldq2
185
186 iz = 1
187 idlmda = iz + n
188 iw = idlmda + n
189 ipq2 = iw + n
190 ipu = ipq2 + ldq2*nq
191 ibuf = ipu + ldu*nq
192
193
194 ictot = 1
195 ipsm = ictot + npcol*4
196 indx = ipsm + npcol*4
197 indxc = indx + n
198 indxp = indxc + n
199 indcol = indxp + n
200 coltyp = indcol + n
201 indrow = coltyp + n
202 indxr = indrow + n
203
204 CALL descinit( descq2, n, n, nb, nb, iqrow, iqcol, ictxt, ldq2,
205 $ info )
206 CALL descinit( descu, n, n, nb, nb, iqrow, iqcol, ictxt, ldu,
207 $ info )
208
209
210
211
212 ipwork = idlmda
213 CALL pslaedz( n, n1, id, q, iq, jq, ldq, descq, work( iz ),
214 $ work( ipwork ) )
215
216
217
218 ipq = iiq + ( jjq-1 )*ldq
219 CALL pslaed2( ictxt, k, n, n1, nb, d, iqrow, iqcol, q( ipq ), ldq,
220 $ rho, work( iz ), work( iw ), work( idlmda ),
221 $ work( ipq2 ), ldq2, work( ibuf ), iwork( ictot ),
222 $ iwork( ipsm ), npcol, iwork( indx ), iwork( indxc ),
223 $ iwork( indxp ), iwork( indcol ), iwork( coltyp ),
224 $ nn, nn1, nn2, iq1, iq2 )
225
226
227
228 IF( k.NE.0 ) THEN
229 CALL pslaset(
'A', n, n, zero, one, work( ipu ), 1, 1, descu )
230 CALL pslaed3( ictxt, k, n, nb, d, iqrow, iqcol, rho,
231 $ work( idlmda ), work( iw ), work( iz ),
232 $ work( ipu ), ldq2, work( ibuf ), iwork( indx ),
233 $ iwork( indcol ), iwork( indrow ), iwork( indxr ),
234 $ iwork( indxc ), iwork( ictot ), npcol, info )
235
236
237
238 iqq =
min( iq1, iq2 )
239 IF( nn1.GT.0 ) THEN
240 inq = iq - 1 + id
241 jnq = jq - 1 + id + iqq - 1
242 CALL psgemm( 'N', 'N', n1, nn, nn1, one, work( ipq2 ), 1,
243 $ iq1, descq2, work( ipu ), iq1, iqq, descu,
244 $ zero, q, inq, jnq, descq )
245 END IF
246 IF( nn2.GT.0 ) THEN
247 inq = iq - 1 + id + n1
248 jnq = jq - 1 + id + iqq - 1
249 CALL psgemm( 'N', 'N', n-n1, nn, nn2, one, work( ipq2 ),
250 $ n1+1, iq2, descq2, work( ipu ), iq2, iqq,
251 $ descu, zero, q, inq, jnq, descq )
252 END IF
253
254 DO 10 j = k + 1, n
255 jc = iwork( indx+j-1 )
256 CALL infog1l( jq-1+jc, nb, npcol, mycol, iqcol, jjc, col )
257 CALL infog1l( jc, nb, npcol, mycol, iqcol, jj2c, col )
258 IF( mycol.EQ.col ) THEN
259 iq2 = ipq2 + ( jj2c-1 )*ldq2
260 inq = ipq + ( jjc-1 )*ldq
261 CALL scopy( np, work( iq2 ), 1, q( inq ), 1 )
262 END IF
263 10 CONTINUE
264 END IF
265
266 20 CONTINUE
267 RETURN
268
269
270
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
subroutine infog1l(gindx, nb, nprocs, myroc, isrcproc, lindx, rocsrc)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pslaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pslaed2(ictxt, k, n, n1, nb, d, drow, dcol, q, ldq, rho, z, w, dlamda, q2, ldq2, qbuf, ctot, psm, npcol, indx, indxc, indxp, indcol, coltyp, nn, nn1, nn2, ib1, ib2)
subroutine pslaed3(ictxt, k, n, nb, d, drow, dcol, rho, dlamda, w, z, u, ldu, buf, indx, indcol, indrow, indxr, indxc, ctot, npcol, info)
subroutine pslaedz(n, n1, id, q, iq, jq, ldq, descq, z, work)
subroutine pxerbla(ictxt, srname, info)