3
4
5
6
7
8
9
10 INTEGER ID, INFO, IQ, JQ, N, N1
11 DOUBLE PRECISION RHO
12
13
14 INTEGER DESCQ( * ), IWORK( * )
15 DOUBLE PRECISION 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 DOUBLE PRECISION ZERO, ONE
114 parameter( zero = 0.0d+0, one = 1.0d+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_ ),
'PDLAED1', -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 pdlaedz( n, n1, id, q, iq, jq, ldq, descq, work( iz ),
214 $ work( ipwork ) )
215
216
217
218 ipq = iiq + ( jjq-1 )*ldq
219 CALL pdlaed2( 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
229 IF( k.NE.0 ) THEN
230 CALL pdlaset(
'A', n, n, zero, one, work( ipu ), 1, 1, descu )
231 CALL pdlaed3( ictxt, k, n, nb, d, iqrow, iqcol, rho,
232 $ work( idlmda ), work( iw ), work( iz ),
233 $ work( ipu ), ldq2, work( ibuf ), iwork( indx ),
234 $ iwork( indcol ), iwork( indrow ), iwork( indxr ),
235 $ iwork( indxc ), iwork( ictot ), npcol, info )
236
237
238
239 iqq =
min( iq1, iq2 )
240 IF( nn1.GT.0 ) THEN
241 inq = iq - 1 + id
242 jnq = jq - 1 + id + iqq - 1
243 CALL pdgemm( 'N', 'N', n1, nn, nn1, one, work( ipq2 ), 1,
244 $ iq1, descq2, work( ipu ), iq1, iqq, descu,
245 $ zero, q, inq, jnq, descq )
246 END IF
247 IF( nn2.GT.0 ) THEN
248 inq = iq - 1 + id + n1
249 jnq = jq - 1 + id + iqq - 1
250 CALL pdgemm( 'N', 'N', n-n1, nn, nn2, one, work( ipq2 ),
251 $ n1+1, iq2, descq2, work( ipu ), iq2, iqq,
252 $ descu, zero, q, inq, jnq, descq )
253 END IF
254
255 DO 10 j = k + 1, n
256 jc = iwork( indx+j-1 )
257 CALL infog1l( jq-1+jc, nb, npcol, mycol, iqcol, jjc, col )
258 CALL infog1l( jc, nb, npcol, mycol, iqcol, jj2c, col )
259 IF( mycol.EQ.col ) THEN
260 iq2 = ipq2 + ( jj2c-1 )*ldq2
261 inq = ipq + ( jjc-1 )*ldq
262 CALL dcopy( np, work( iq2 ), 1, q( inq ), 1 )
263 END IF
264 10 CONTINUE
265 END IF
266
267 20 CONTINUE
268 RETURN
269
270
271
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 pdlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pdlaed2(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 pdlaed3(ictxt, k, n, nb, d, drow, dcol, rho, dlamda, w, z, u, ldu, buf, indx, indcol, indrow, indxr, indxc, ctot, npcol, info)
subroutine pdlaedz(n, n1, id, q, iq, jq, ldq, descq, z, work)
subroutine pxerbla(ictxt, srname, info)