3
4
5
6
7
8
9
10 CHARACTER UPLO
11 INTEGER IA, INFO, JA, LWORK, N
12
13
14 INTEGER DESCA( * )
15 REAL A( * ), D( * ), E( * ), TAU( * ), 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
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
216 $ LLD_, MB_, M_, NB_, N_, RSRC_
217 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
218 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
219 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
220 REAL HALF, ONE, ZERO
221 parameter( half = 0.5e+0, one = 1.0e+0, zero = 0.0e+0 )
222
223
224 LOGICAL LQUERY, UPPER
225 INTEGER IACOL, IAROW, ICOFFA, ICTXT, II, IK, IROFFA, J,
226 $ JJ, JK, JN, LDA, LWMIN, MYCOL, MYROW, NPCOL,
227 $ NPROW
228 REAL ALPHA, TAUI
229
230
232 $
pxerbla, saxpy, sgebr2d, sgebs2d,
233 $ slarfg, ssymv, ssyr2
234
235
236 LOGICAL LSAME
237 REAL SDOT
239
240
241 INTRINSIC real
242
243
244
245
246
247 ictxt = desca( ctxt_ )
248 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
249
250
251
252 info = 0
253 IF( nprow.EQ.-1 ) THEN
254 info = -(600+ctxt_)
255 ELSE
256 upper =
lsame( uplo,
'U' )
257 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
258 lwmin = 3 * n
259
260 work( 1 ) = real( lwmin )
261 lquery = ( lwork.EQ.-1 )
262 IF( info.EQ.0 ) THEN
263 iroffa = mod( ia-1, desca( mb_ ) )
264 icoffa = mod( ja-1, desca( nb_ ) )
265 IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
266 info = -1
267 ELSE IF( iroffa.NE.icoffa ) THEN
268 info = -5
269 ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
270 info = -(600+nb_)
271 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
272 info = -11
273 END IF
274 END IF
275 END IF
276
277 IF( info.NE.0 ) THEN
278 CALL pxerbla( ictxt,
'PSSYTD2', -info )
279 CALL blacs_abort( ictxt, 1 )
280 RETURN
281 ELSE IF( lquery ) THEN
282 RETURN
283 END IF
284
285
286
287 IF( n.LE.0 )
288 $ RETURN
289
290
291
292 lda = desca( lld_ )
293 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii, jj,
294 $ iarow, iacol )
295
296 IF( upper ) THEN
297
298
299
300 IF( mycol.EQ.iacol ) THEN
301 IF( myrow.EQ.iarow ) THEN
302
303
304
305 DO 10 j = n-1, 1, -1
306 ik = ii + j - 1
307 jk = jj + j - 1
308
309
310
311
312 CALL slarfg( j, a( ik+jk*lda ), a( ii+jk*lda ), 1,
313 $ taui )
314 e( jk+1 ) = a( ik+jk*lda )
315
316 IF( taui.NE.zero ) THEN
317
318
319
320
321 a( ik+jk*lda ) = one
322
323
324
325 CALL ssymv( uplo, j, taui, a( ii+(jj-1)*lda ),
326 $ lda, a( ii+jk*lda ), 1, zero,
327 $ tau( jj ), 1 )
328
329
330
331 alpha = -half*taui*sdot( j, tau( jj ), 1,
332 $ a( ii+jk*lda ), 1 )
333 CALL saxpy( j, alpha, a( ii+jk*lda ), 1,
334 $ tau( jj ), 1 )
335
336
337
338
339 CALL ssyr2( uplo, j, -one, a( ii+jk*lda ), 1,
340 $ tau( jj ), 1, a( ii+(jj-1)*lda ),
341 $ lda )
342 a( ik+jk*lda ) = e( jk+1 )
343 END IF
344
345
346
347 d( jk+1 ) = a( ik+1+jk*lda )
348 work( j+1 ) = d( jk+1 )
349 work( n+j+1 ) = e( jk+1 )
350 tau( jk+1 ) = taui
351 work( 2*n+j+1 ) = tau( jk+1 )
352
353 10 CONTINUE
354 d( jj ) = a( ii+(jj-1)*lda )
355 work( 1 ) = d( jj )
356 work( n+1 ) = zero
357 work( 2*n+1 ) = zero
358
359 CALL sgebs2d( ictxt, 'Columnwise', ' ', 1, 3*n, work, 1 )
360
361 ELSE
362 CALL sgebr2d( ictxt, 'Columnwise', ' ', 1, 3*n, work, 1,
363 $ iarow, iacol )
364 DO 20 j = 2, n
365 jn = jj + j - 1
366 d( jn ) = work( j )
367 e( jn ) = work( n+j )
368 tau( jn ) = work( 2*n+j )
369 20 CONTINUE
370 d( jj ) = work( 1 )
371 END IF
372 END IF
373
374 ELSE
375
376
377
378 IF( mycol.EQ.iacol ) THEN
379 IF( myrow.EQ.iarow ) THEN
380
381
382
383 DO 30 j = 1, n - 1
384 ik = ii + j - 1
385 jk = jj + j - 1
386
387
388
389
390 CALL slarfg( n-j, a( ik+1+(jk-1)*lda ),
391 $ a( ik+2+(jk-1)*lda ), 1, taui )
392 e( jk ) = a( ik+1+(jk-1)*lda )
393
394 IF( taui.NE.zero ) THEN
395
396
397
398
399 a( ik+1+(jk-1)*lda ) = one
400
401
402
403 CALL ssymv( uplo, n-j, taui, a( ik+1+jk*lda ),
404 $ lda, a( ik+1+(jk-1)*lda ), 1,
405 $ zero, tau( jk ), 1 )
406
407
408
409 alpha = -half*taui*sdot( n-j, tau( jk ), 1,
410 $ a( ik+1+(jk-1)*lda ), 1 )
411 CALL saxpy( n-j, alpha, a( ik+1+(jk-1)*lda ),
412 $ 1, tau( jk ), 1 )
413
414
415
416
417 CALL ssyr2( uplo, n-j, -one,
418 $ a( ik+1+(jk-1)*lda ), 1,
419 $ tau( jk ), 1, a( ik+1+jk*lda ),
420 $ lda )
421 a( ik+1+(jk-1)*lda ) = e( jk )
422 END IF
423
424
425
426
427 d( jk ) = a( ik+(jk-1)*lda )
428 work( j ) = d( jk )
429 work( n+j ) = e( jk )
430 tau( jk ) = taui
431 work( 2*n+j ) = tau( jk )
432 30 CONTINUE
433 jn = jj + n - 1
434 d( jn ) = a( ii+n-1+(jn-1)*lda )
435 work( n ) = d( jn )
436 tau( jn ) = zero
437 work( 2*n ) = zero
438
439 CALL sgebs2d( ictxt, 'Columnwise', ' ', 1, 3*n-1, work,
440 $ 1 )
441
442 ELSE
443 CALL sgebr2d( ictxt, 'Columnwise', ' ', 1, 3*n-1, work,
444 $ 1, iarow, iacol )
445 DO 40 j = 1, n - 1
446 jn = jj + j - 1
447 d( jn ) = work( j )
448 e( jn ) = work( n+j )
449 tau( jn ) = work( 2*n+j )
450 40 CONTINUE
451 jn = jj + n - 1
452 d( jn ) = work( n )
453 tau( jn ) = zero
454 END IF
455 END IF
456 END IF
457
458 work( 1 ) = real( lwmin )
459
460 RETURN
461
462
463
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine pxerbla(ictxt, srname, info)