3
4
5
6
7
8
9
10 CHARACTER UPLO
11 INTEGER IA, INFO, JA, LWORK, N
12
13
14 INTEGER DESCA( * )
15 REAL D( * ), E( * )
16 COMPLEX A( * ), TAU( * ), WORK( * )
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
225 $ LLD_, MB_, M_, NB_, N_, RSRC_
226 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
227 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
228 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
229 REAL ONE
230 parameter( one = 1.0e+0 )
231 COMPLEX CONE
232 parameter( cone = ( 1.0e+0, 0.0e+0 ) )
233
234
235 LOGICAL LQUERY, UPPER
236 CHARACTER COLCTOP, ROWCTOP
237 INTEGER I, IACOL, IAROW, ICOFFA, ICTXT, IINFO, IPW,
238 $ IROFFA, J, JB, JX, K, KK, LWMIN, MYCOL, MYROW,
239 $ NB, NP, NPCOL, NPROW, NQ
240
241
242 INTEGER DESCW( DLEN_ ), IDUM1( 2 ), IDUM2( 2 )
243
244
248
249
250 LOGICAL LSAME
251 INTEGER INDXG2L, INDXG2P, NUMROC
253
254
256
257
258
259
260
261 ictxt = desca( ctxt_ )
262 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
263
264
265
266 info = 0
267 IF( nprow.EQ.-1 ) THEN
268 info = -(600+ctxt_)
269 ELSE
270 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
271 upper =
lsame( uplo,
'U' )
272 IF( info.EQ.0 ) THEN
273 nb = desca( nb_ )
274 iroffa = mod( ia-1, desca( mb_ ) )
275 icoffa = mod( ja-1, desca( nb_ ) )
276 iarow =
indxg2p( ia, nb, myrow, desca( rsrc_ ), nprow )
277 iacol =
indxg2p( ja, nb, mycol, desca( csrc_ ), npcol )
278 np =
numroc( n, nb, myrow, iarow, nprow )
279 nq =
max( 1,
numroc( n+ja-1, nb, mycol, desca( csrc_ ),
280 $ npcol ) )
281 lwmin =
max( (np+1)*nb, 3*nb )
282
283 work( 1 ) =
cmplx( real( lwmin ) )
284 lquery = ( lwork.EQ.-1 )
285 IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
286 info = -1
287 ELSE IF( iroffa.NE.icoffa .OR. icoffa.NE.0 ) THEN
288 info = -5
289 ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
290 info = -(600+nb_)
291 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
292 info = -11
293 END IF
294 END IF
295 IF( upper ) THEN
296 idum1( 1 ) = ichar( 'U' )
297 ELSE
298 idum1( 1 ) = ichar( 'L' )
299 END IF
300 idum2( 1 ) = 1
301 IF( lwork.EQ.-1 ) THEN
302 idum1( 2 ) = -1
303 ELSE
304 idum1( 2 ) = 1
305 END IF
306 idum2( 2 ) = 11
307 CALL pchk1mat( n, 2, n, 2, ia, ja, desca, 6, 2, idum1, idum2,
308 $ info )
309 END IF
310
311 IF( info.NE.0 ) THEN
312 CALL pxerbla( ictxt,
'PCHETRD', -info )
313 RETURN
314 ELSE IF( lquery ) THEN
315 RETURN
316 END IF
317
318
319
320 IF( n.EQ.0 )
321 $ RETURN
322
323 CALL pb_topget( ictxt, 'Combine', 'Columnwise', colctop )
324 CALL pb_topget( ictxt, 'Combine', 'Rowwise', rowctop )
325 CALL pb_topset( ictxt, 'Combine', 'Columnwise', '1-tree' )
326 CALL pb_topset( ictxt, 'Combine', 'Rowwise', '1-tree' )
327
328 ipw = np * nb + 1
329
330 IF( upper ) THEN
331
332
333
334 kk = mod( ja+n-1, nb )
335 IF( kk.EQ.0 )
336 $ kk = nb
338 $ nb, mycol, desca( csrc_ ), npcol ), ictxt,
340
341 DO 10 k = n-kk+1, nb+1, -nb
342 jb =
min( n-k+1, nb )
343 i = ia + k - 1
344 j = ja + k - 1
345
346
347
348
349
350 CALL pclatrd( uplo, k+jb-1, jb, a, ia, ja, desca, d, e, tau,
351 $ work, 1, 1, descw, work( ipw ) )
352
353
354
355
356
357 CALL pcher2k( uplo, 'No transpose', k-1, jb, -cone, a, ia,
358 $ j, desca, work, 1, 1, descw, one, a, ia, ja,
359 $ desca )
360
361
362
363 jx =
min(
indxg2l( j, nb, 0, iacol, npcol ), nq )
365
366 descw( csrc_ ) = mod( descw( csrc_ ) + npcol - 1, npcol )
367
368 10 CONTINUE
369
370
371
372 CALL pchetd2( uplo,
min( n, nb ), a, ia, ja, desca, d, e,
373 $ tau, work, lwork, iinfo )
374
375 ELSE
376
377
378
379 kk = mod( ja+n-1, nb )
380 IF( kk.EQ.0 )
381 $ kk = nb
382 CALL descset( descw, n, nb, nb, nb, iarow, iacol, ictxt,
384
385 DO 20 k = 1, n-nb, nb
386 i = ia + k - 1
387 j = ja + k - 1
388
389
390
391
392
393 CALL pclatrd( uplo, n-k+1, nb, a, i, j, desca, d, e, tau,
394 $ work, k, 1, descw, work( ipw ) )
395
396
397
398
399
400 CALL pcher2k( uplo, 'No transpose', n-k-nb+1, nb, -cone, a,
401 $ i+nb, j, desca, work, k+nb, 1, descw, one, a,
402 $ i+nb, j+nb, desca )
403
404
405
406 jx =
min(
indxg2l( j+nb-1, nb, 0, iacol, npcol ), nq )
407 CALL pcelset( a, i+nb, j+nb-1, desca,
cmplx( e( jx ) ) )
408
409 descw( csrc_ ) = mod( descw( csrc_ ) + 1, npcol )
410
411 20 CONTINUE
412
413
414
415 CALL pchetd2( uplo, kk, a, ia+k-1, ja+k-1, desca, d, e,
416 $ tau, work, lwork, iinfo )
417 END IF
418
419 CALL pb_topset( ictxt, 'Combine', 'Columnwise', colctop )
420 CALL pb_topset( ictxt, 'Combine', 'Rowwise', rowctop )
421
422 work( 1 ) =
cmplx( real( lwmin ) )
423
424 RETURN
425
426
427
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
integer function indxg2l(indxglob, nb, iproc, isrcproc, nprocs)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pcelset(a, ia, ja, desca, alpha)
subroutine pchetd2(uplo, n, a, ia, ja, desca, d, e, tau, work, lwork, info)
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pclatrd(uplo, n, nb, a, ia, ja, desca, d, e, tau, w, iw, jw, descw, work)
subroutine pxerbla(ictxt, srname, info)