7
8
9
10
11
12
13
14 LOGICAL WKNOWN
15 CHARACTER JOBZ, RANGE, UPLO
16 INTEGER IA, IL, IPOSTPAD, IPREPAD, IU, JA, LIWORK,
17 $ LWORK, LWORK1, N, NOUT, RESULT
18 REAL ABSTOL, QTQNRM, THRESH, TSTNRM, VL, VU
19
20
21 INTEGER DESCA( * ), ICLUSTR( * ), IFAIL( * ),
22 $ IWORK( * )
23 REAL A( * ), COPYA( * ), GAP( * ), WIN( * ),
24 $ WNEW( * ), WORK( * ), Z( * )
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 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
197 $ MB_, NB_, RSRC_, CSRC_, LLD_
198 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
199 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
200 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
201 REAL PADVAL, FIVE, NEGONE
202 parameter( padval = 13.5285e+0, five = 5.0e+0,
203 $ negone = -1.0e+0 )
204 INTEGER IPADVAL
205 parameter( ipadval = 927 )
206
207
208 INTEGER I, IAM, INDIWRK, INFO, ISIZESUBTST, ISIZESYEVX,
209 $ ISIZETST, J, M, MAXEIGS, MAXIL, MAXIU, MAXSIZE,
210 $ MINIL, MQ, MYCOL, MYIL, MYROW, NCLUSTERS, NP,
211 $ NPCOL, NPROW, NQ, NZ, OLDIL, OLDIU, OLDNZ, RES,
212 $ SIZECHK, SIZEMQRLEFT, SIZEMQRRIGHT, SIZEQRF,
213 $ SIZEQTQ, SIZESUBTST, SIZESYEVX, SIZETMS,
214 $ SIZETST, VALSIZE, VECSIZE
215 REAL EPS, EPSNORMA, ERROR, MAXERROR, MAXVU,
216 $ MINERROR, MINVL, NORMWIN, OLDVL, OLDVU, ORFAC,
217 $ SAFMIN
218
219
220 INTEGER DESCZ( DLEN_ ), DSEED( 4 ), ITMP( 2 )
221
222
223
224 LOGICAL LSAME
225 INTEGER NUMROC
226 REAL PSLAMCH, PSLANSY
228
229
230 EXTERNAL blacs_gridinfo,
descinit, igamn2d, igamx2d,
235
236
237 INTRINSIC abs,
max,
min, mod
238
239
240
241 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
242 $ rsrc_.LT.0 )RETURN
243 CALL pslasizesep( desca, iprepad, ipostpad, sizemqrleft,
244 $ sizemqrright, sizeqrf, sizetms, sizeqtq,
245 $ sizechk, sizesyevx, isizesyevx, sizesubtst,
246 $ isizesubtst, sizetst, isizetst )
247
248 tstnrm = negone
249 qtqnrm = negone
250 eps =
pslamch( desca( ctxt_ ),
'Eps' )
251 safmin =
pslamch( desca( ctxt_ ),
'Safe min' )
252 normwin = safmin / eps
253 IF( n.GE.1 )
254 $ normwin =
max( abs( win( 1 ) ), abs( win( n ) ), normwin )
255
256
257
258
259 nz = -13
260 oldnz = nz
261 oldil = il
262 oldiu = iu
263 oldvl = vl
264 oldvu = vu
265
266 DO 10 i = 1, lwork1, 1
267 work( i+iprepad ) = 14.3e+0
268 10 CONTINUE
269 DO 20 i = 1, liwork, 1
270 iwork( i+iprepad ) = 14
271 20 CONTINUE
272
273 DO 30 i = 1, n
274 wnew( i+iprepad ) = 3.14159e+0
275 30 CONTINUE
276
277 iclustr( 1+iprepad ) = 139
278
279 IF(
lsame( jobz,
'N' ) )
THEN
280 maxeigs = 0
281 ELSE
282 IF(
lsame( range,
'A' ) )
THEN
283 maxeigs = n
284 ELSE IF(
lsame( range,
'I' ) )
THEN
285 maxeigs = iu - il + 1
286 ELSE
287 minvl = vl - normwin*five*eps - abstol
288 maxvu = vu + normwin*five*eps + abstol
289 minil = 1
290 maxiu = 0
291 DO 40 i = 1, n
292 IF( win( i ).LT.minvl )
293 $ minil = minil + 1
294 IF( win( i ).LE.maxvu )
295 $ maxiu = maxiu + 1
296 40 CONTINUE
297
298 maxeigs = maxiu - minil + 1
299 END IF
300 END IF
301
302
303 CALL descinit( descz, desca( m_ ), desca( n_ ), desca( mb_ ),
304 $ desca( nb_ ), desca( rsrc_ ), desca( csrc_ ),
305 $ desca( ctxt_ ), desca( lld_ ), info )
306
307 CALL blacs_gridinfo( desca( ctxt_ ), nprow, npcol, myrow, mycol )
308 indiwrk = 1 + iprepad + nprow*npcol + 1
309
310 iam = 1
311 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
312 $ iam = 0
313
314
315
316 result = -3
317 IF( myrow.GE.nprow .OR. myrow.LT.0 )
318 $ GO TO 150
319 result = 0
320
321
322
323
324
325 dseed( 1 ) = 1
326
328 $ dseed, win, maxsize, vecsize, valsize )
329
330 np =
numroc( n, desca( mb_ ), myrow, 0, nprow )
331 nq =
numroc( n, desca( nb_ ), mycol, 0, npcol )
332 mq =
numroc( maxeigs, desca( nb_ ), mycol, 0, npcol )
333
334 CALL slacpy( 'A', np, nq, copya, desca( lld_ ), a( 1+iprepad ),
335 $ desca( lld_ ) )
336
337 CALL psfillpad( desca( ctxt_ ), np, nq, a, desca( lld_ ), iprepad,
338 $ ipostpad, padval )
339
340 CALL psfillpad( descz( ctxt_ ), np, mq, z, descz( lld_ ), iprepad,
341 $ ipostpad, padval+1.0e+0 )
342
343 CALL psfillpad( desca( ctxt_ ), n, 1, wnew, n, iprepad, ipostpad,
344 $ padval+2.0e+0 )
345
346 CALL psfillpad( desca( ctxt_ ), nprow*npcol, 1, gap, nprow*npcol,
347 $ iprepad, ipostpad, padval+3.0e+0 )
348
349 CALL psfillpad( desca( ctxt_ ), lwork1, 1, work, lwork1, iprepad,
350 $ ipostpad, padval+4.0e+0 )
351
352 CALL pifillpad( desca( ctxt_ ), liwork, 1, iwork, liwork, iprepad,
353 $ ipostpad, ipadval )
354
355 CALL pifillpad( desca( ctxt_ ), n, 1, ifail, n, iprepad, ipostpad,
356 $ ipadval )
357
358 CALL pifillpad( desca( ctxt_ ), 2*nprow*npcol, 1, iclustr,
359 $ 2*nprow*npcol, iprepad, ipostpad, ipadval )
360
361
362
363
364 DO 60 i = 1, n, 1
365 DO 50 j = 1, maxeigs, 1
366 CALL pselset( z( 1+iprepad ), i, j, desca, 13.0e+0 )
367 50 CONTINUE
368 60 CONTINUE
369
370 orfac = -1.0e+0
371
375 CALL pssyevx( jobz, range, uplo, n, a( 1+iprepad ), ia, ja, desca,
376 $ vl, vu, il, iu, abstol, m, nz, wnew( 1+iprepad ),
377 $ orfac, z( 1+iprepad ), ia, ja, desca,
378 $ work( 1+iprepad ), lwork1, iwork( 1+iprepad ),
379 $ liwork, ifail( 1+iprepad ), iclustr( 1+iprepad ),
380 $ gap( 1+iprepad ), info )
383
384 IF( thresh.LE.0 ) THEN
385 result = 0
386 ELSE
387 CALL pschekpad( desca( ctxt_ ),
'PSSYEVX-A', np, nq, a,
388 $ desca( lld_ ), iprepad, ipostpad, padval )
389
390 CALL pschekpad( descz( ctxt_ ),
'PSSYEVX-Z', np, mq, z,
391 $ descz( lld_ ), iprepad, ipostpad,
392 $ padval+1.0e+0 )
393
394 CALL pschekpad( desca( ctxt_ ),
'PSSYEVX-WNEW', n, 1, wnew, n,
395 $ iprepad, ipostpad, padval+2.0e+0 )
396
397 CALL pschekpad( desca( ctxt_ ),
'PSSYEVX-GAP', nprow*npcol, 1,
398 $ gap, nprow*npcol, iprepad, ipostpad,
399 $ padval+3.0e+0 )
400
401 CALL pschekpad( desca( ctxt_ ),
'PSSYEVX-WORK', lwork1, 1,
402 $ work, lwork1, iprepad, ipostpad,
403 $ padval+4.0e+0 )
404
405 CALL pichekpad( desca( ctxt_ ),
'PSSYEVX-IWORK', liwork, 1,
406 $ iwork, liwork, iprepad, ipostpad, ipadval )
407
408 CALL pichekpad( desca( ctxt_ ),
'PSSYEVX-IFAIL', n, 1, ifail,
409 $ n, iprepad, ipostpad, ipadval )
410
411 CALL pichekpad( desca( ctxt_ ),
'PSSYEVX-ICLUSTR',
412 $ 2*nprow*npcol, 1, iclustr, 2*nprow*npcol,
413 $ iprepad, ipostpad, ipadval )
414
415
416
417
418 IF(
lsame( range,
'A' ) )
THEN
420 $ dseed, wnew( 1+iprepad ), maxsize,
421 $ vecsize, valsize )
422 END IF
423
424
425
426
427
428
429
430 itmp( 1 ) = info
431 itmp( 2 ) = info
432
433 CALL igamn2d( desca( ctxt_ ), 'a', ' ', 1, 1, itmp, 1, 1, 1,
434 $ -1, -1, 0 )
435 CALL igamx2d( desca( ctxt_ ), 'a', ' ', 1, 1, itmp( 2 ), 1, 1,
436 $ 1, -1, -1, 0 )
437
438
439 IF( itmp( 1 ).NE.itmp( 2 ) ) THEN
440 IF( iam.EQ.0 )
441 $ WRITE( nout, fmt = * )
442 $ 'Different processes return different INFO'
443 result = 1
444 ELSE IF( mod( info, 2 ).EQ.1 .OR. info.GT.7 .OR. info.LT.0 )
445 $ THEN
446 IF( iam.EQ.0 )
447 $ WRITE( nout, fmt = 9999 )info
448 result = 1
449 ELSE IF( mod( info / 2, 2 ).EQ.1 .AND. lwork1.GE.maxsize ) THEN
450 IF( iam.EQ.0 )
451 $ WRITE( nout, fmt = 9996 )info
452 result = 1
453 ELSE IF( mod( info / 4, 2 ).EQ.1 .AND. lwork1.GE.vecsize ) THEN
454 IF( iam.EQ.0 )
455 $ WRITE( nout, fmt = 9996 )info
456 result = 1
457 END IF
458
459
460 IF(
lsame( jobz,
'V' ) .AND. ( iclustr( 1+iprepad ).NE.
461 $ 0 ) .AND. ( mod( info / 2, 2 ).NE.1 ) ) THEN
462 IF( iam.EQ.0 )
463 $ WRITE( nout, fmt = 9995 )
464 result = 1
465 END IF
466
467
468
469 IF( ( m.LT.0 ) .OR. ( m.GT.n ) ) THEN
470 IF( iam.EQ.0 )
471 $ WRITE( nout, fmt = 9994 )
472 result = 1
473 ELSE IF(
lsame( range,
'A' ) .AND. ( m.NE.n ) )
THEN
474 IF( iam.EQ.0 )
475 $ WRITE( nout, fmt = 9993 )
476 result = 1
477 ELSE IF(
lsame( range,
'I' ) .AND. ( m.NE.iu-il+1 ) )
THEN
478 IF( iam.EQ.0 )
479 $ WRITE( nout, fmt = 9992 )
480 result = 1
481 ELSE IF(
lsame( jobz,
'V' ) .AND.
482 $ ( .NOT.(
lsame( range,
'V' ) ) ) .AND. ( m.NE.nz ) )
483 $ THEN
484 IF( iam.EQ.0 )
485 $ WRITE( nout, fmt = 9991 )
486 result = 1
487 END IF
488
489
490
491 IF(
lsame( jobz,
'V' ) )
THEN
492 IF(
lsame( range,
'V' ) )
THEN
493 IF( nz.GT.m ) THEN
494 IF( iam.EQ.0 )
495 $ WRITE( nout, fmt = 9990 )
496 result = 1
497 END IF
498 IF( nz.LT.m .AND. mod( info / 4, 2 ).NE.1 ) THEN
499 IF( iam.EQ.0 )
500 $ WRITE( nout, fmt = 9989 )
501 result = 1
502 END IF
503 ELSE
504 IF( nz.NE.m ) THEN
505 IF( iam.EQ.0 )
506 $ WRITE( nout, fmt = 9988 )
507 result = 1
508 END IF
509 END IF
510 END IF
511 IF( result.EQ.0 ) THEN
512
513
514
515 itmp( 1 ) = m
516 itmp( 2 ) = m
517
518 CALL igamn2d( desca( ctxt_ ), 'a', ' ', 1, 1, itmp, 1, 1, 1,
519 $ -1, -1, 0 )
520 CALL igamx2d( desca( ctxt_ ), 'a', ' ', 1, 1, itmp( 2 ), 1,
521 $ 1, 1, -1, -1, 0 )
522
523 IF( itmp( 1 ).NE.itmp( 2 ) ) THEN
524 IF( iam.EQ.0 )
525 $ WRITE( nout, fmt = 9987 )
526 result = 1
527 ELSE
528
529
530
531 DO 70 i = 1, m
532 work( i ) = wnew( i+iprepad )
533 work( i+m ) = wnew( i+iprepad )
534 70 CONTINUE
535
536 CALL sgamn2d( desca( ctxt_ ), 'a', ' ', m, 1, work, m, 1,
537 $ 1, -1, -1, 0 )
538 CALL sgamx2d( desca( ctxt_ ), 'a', ' ', m, 1,
539 $ work( 1+m ), m, 1, 1, -1, -1, 0 )
540
541 DO 80 i = 1, m
542 IF( result.EQ.0 .AND. work( i ).NE.work( m+i ) ) THEN
543 IF( iam.EQ.0 )
544 $ WRITE( nout, fmt = 9986 )
545 result = 1
546 END IF
547 80 CONTINUE
548 END IF
549 END IF
550
551
552
553 IF(
lsame( jobz,
'V' ) )
THEN
554 nclusters = 0
555 DO 90 i = 0, nprow*npcol - 1
556 IF( iclustr( 1+iprepad+2*i ).EQ.0 )
557 $ GO TO 100
558 nclusters = nclusters + 1
559 90 CONTINUE
560 100 CONTINUE
561 itmp( 1 ) = nclusters
562 itmp( 2 ) = nclusters
563
564 CALL igamn2d( desca( ctxt_ ), 'a', ' ', 1, 1, itmp, 1, 1, 1,
565 $ -1, -1, 0 )
566 CALL igamx2d( desca( ctxt_ ), 'a', ' ', 1, 1, itmp( 2 ), 1,
567 $ 1, 1, -1, -1, 0 )
568
569 IF( itmp( 1 ).NE.itmp( 2 ) ) THEN
570 IF( iam.EQ.0 )
571 $ WRITE( nout, fmt = 9985 )
572 result = 1
573 ELSE
574
575
576
577 DO 110 i = 1, nclusters
578 iwork( indiwrk+i ) = iclustr( i+iprepad )
579 iwork( indiwrk+i+nclusters ) = iclustr( i+iprepad )
580 110 CONTINUE
581 CALL igamn2d( desca( ctxt_ ), 'a', ' ', nclusters*2+1, 1,
582 $ iwork( indiwrk+1 ), nclusters*2+1, 1, 1,
583 $ -1, -1, 0 )
584 CALL igamx2d( desca( ctxt_ ), 'a', ' ', nclusters*2+1, 1,
585 $ iwork( indiwrk+1+nclusters ),
586 $ nclusters*2+1, 1, 1, -1, -1, 0 )
587
588
589 DO 120 i = 1, nclusters
590 IF( result.EQ.0 .AND. iwork( indiwrk+i ).NE.
591 $ iwork( indiwrk+nclusters+i ) ) THEN
592 IF( iam.EQ.0 )
593 $ WRITE( nout, fmt = 9984 )
594 result = 1
595 END IF
596 120 CONTINUE
597
598 IF( iclustr( 1+iprepad+nclusters*2 ).NE.0 ) THEN
599 IF( iam.EQ.0 )
600 $ WRITE( nout, fmt = 9983 )
601 result = 1
602 END IF
603 END IF
604 END IF
605
606
607 CALL igamx2d( desca( ctxt_ ), 'a', ' ', 1, 1, result, 1, 1, 1,
608 $ -1, -1, 0 )
609 IF( result.NE.0 )
610 $ GO TO 150
611
612
613
614 IF( n.EQ.0 ) THEN
615 epsnorma = eps
616 ELSE
617 epsnorma =
pslansy(
'I', uplo, n, copya, ia, ja, desca,
618 $ work )*eps
619 END IF
620
621
622
623
624
625
626
627
628
629
630
631 IF(
lsame( jobz,
'V' ) )
THEN
632
633
634
635 CALL psfillpad( desca( ctxt_ ), sizechk, 1, work, sizechk,
636 $ iprepad, ipostpad, 4.3e+0 )
637
638 CALL pssepchk( n, nz, copya, ia, ja, desca,
639 $
max( abstol+epsnorma, safmin ), thresh,
640 $ z( 1+iprepad ), ia, ja, descz,
641 $ a( 1+iprepad ), ia, ja, desca,
642 $ wnew( 1+iprepad ), work( 1+iprepad ),
643 $ sizechk, tstnrm, res )
644
645 CALL pschekpad( desca( ctxt_ ),
'PSSEPCHK-WORK', sizechk, 1,
646 $ work, sizechk, iprepad, ipostpad, 4.3e+0 )
647
648 IF( res.NE.0 )
649 $ result = 1
650
651
652
653 CALL psfillpad( desca( ctxt_ ), sizeqtq, 1, work, sizeqtq,
654 $ iprepad, ipostpad, 4.3e+0 )
655
656
657 CALL pssepqtq( n, nz, thresh, z( 1+iprepad ), ia, ja, descz,
658 $ a( 1+iprepad ), ia, ja, desca,
659 $ iwork( 1+iprepad+1 ), iclustr( 1+iprepad ),
660 $ gap( 1+iprepad ), work( iprepad+1 ), sizeqtq,
661 $ qtqnrm, info, res )
662
663 CALL pschekpad( desca( ctxt_ ),
'PSSEPQTQ-WORK', sizeqtq, 1,
664 $ work, sizeqtq, iprepad, ipostpad, 4.3e+0 )
665
666 IF( res.NE.0 )
667 $ result = 1
668
669 IF( info.NE.0 ) THEN
670 IF( iam.EQ.0 )
671 $ WRITE( nout, fmt = 9998 )info
672 result = 1
673 END IF
674 END IF
675
676
677
678 IF( wknown ) THEN
679
680
681
682 myil = il
683
684 IF(
lsame( range,
'V' ) )
THEN
685 myil = 1
686 minil = 1
687 maxil = n - m + 1
688 ELSE
689 IF(
lsame( range,
'A' ) )
THEN
690 myil = 1
691 END IF
692 minil = myil
693 maxil = myil
694 END IF
695
696
697
698
699 minerror = normwin
700
701 DO 140 myil = minil, maxil
702 maxerror = 0
703
704
705
706 IF( .NOT.
lsame( range,
'V' ) .OR.
707 $ ( myil.EQ.1 .OR. ( win( myil-1 ).LT.vl+normwin*five*
708 $ thresh*eps ) ) ) THEN
709 IF( .NOT.
lsame( range,
'V' ) .OR.
710 $ ( myil.EQ.n-m+1 .OR. ( win( myil+m ).GT.vu-
711 $ normwin*five*thresh*eps ) ) ) THEN
712
713
714
715 DO 130 i = 1, m
716 error = abs( win( i+myil-1 )-wnew( i+iprepad ) )
717 maxerror =
max( maxerror, error )
718 130 CONTINUE
719
720 minerror =
min( maxerror, minerror )
721 END IF
722 END IF
723 140 CONTINUE
724
725
726
727
728
729
730
731 IF(
lsame( jobz,
'V' ) .AND.
lsame( range,
'A' ) )
THEN
732 IF( minerror.GT.normwin*five*five*thresh*eps ) THEN
733 IF( iam.EQ.0 )
734 $ WRITE( nout, fmt = 9997 )minerror, normwin
735 result = 1
736 END IF
737 ELSE
738 IF( minerror.GT.normwin*five*thresh*eps ) THEN
739 IF( iam.EQ.0 )
740 $ WRITE( nout, fmt = 9997 )minerror, normwin
741 result = 1
742 END IF
743 END IF
744 END IF
745
746
747
748
749 IF( il.NE.oldil .OR. iu.NE.oldiu .OR. vl.NE.oldvl .OR. vu.NE.
750 $ oldvu ) THEN
751 IF( iam.EQ.0 )
752 $ WRITE( nout, fmt = 9982 )
753 result = 1
754 END IF
755
756 IF(
lsame( jobz,
'N' ) .AND. ( nz.NE.oldnz ) )
THEN
757 IF( iam.EQ.0 )
758 $ WRITE( nout, fmt = 9981 )
759 result = 1
760 END IF
761
762 END IF
763
764
765
766 CALL igamx2d( desca( ctxt_ ), 'a', ' ', 1, 1, result, 1, 1, 1, -1,
767 $ -1, 0 )
768
769 150 CONTINUE
770
771
772 RETURN
773
774 9999 FORMAT( 'PSSYEVX returned INFO=', i7 )
775 9998 FORMAT( 'PSSEPQTQ returned INFO=', i7 )
776 9997 FORMAT( 'PSSEPSUBTST minerror =', d11.2, ' normwin=', d11.2 )
777 9996 FORMAT( 'PSSYEVX returned INFO=', i7,
778 $ ' despite adequate workspace' )
779 9995 FORMAT( .NE..NE.'ICLUSTR(1)0 but mod(INFO/2,2)1' )
780 9994 FORMAT( 'M not in the range 0 to N' )
781 9993 FORMAT( 'M not equal to N' )
782 9992 FORMAT( 'M not equal to IU-IL+1' )
783 9991 FORMAT( 'M not equal to NZ' )
784 9990 FORMAT( 'NZ > M' )
785 9989 FORMAT( 'NZ < M' )
786 9988 FORMAT( 'NZ not equal to M' )
787 9987 FORMAT( 'Different processes return different values for M' )
788 9986 FORMAT( 'Different processes return different eigenvalues' )
789 9985 FORMAT( 'Different processes return ',
790 $ 'different numbers of clusters' )
791 9984 FORMAT( 'Different processes return different clusters' )
792 9983 FORMAT( 'ICLUSTR not zero terminated' )
793 9982 FORMAT( 'IL, IU, VL or VU altered by PSSYEVX' )
794 9981 FORMAT( 'NZ altered by PSSYEVX with JOBZ=N' )
795
796
797
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
real function pslamch(ictxt, cmach)
subroutine pichekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pifillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pschekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pselset(a, ia, ja, desca, alpha)
subroutine psfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
real function pslansy(norm, uplo, n, a, ia, ja, desca, work)
subroutine pslasizesep(desca, iprepad, ipostpad, sizemqrleft, sizemqrright, sizeqrf, sizetms, sizeqtq, sizechk, sizesyevx, isizesyevx, sizesubtst, isizesubtst, sizetst, isizetst)
subroutine pslasizesyevx(wknown, range, n, desca, vl, vu, il, iu, iseed, win, maxsize, vecsize, valsize)
subroutine pssepchk(ms, nv, a, ia, ja, desca, epsnorma, thresh, q, iq, jq, descq, c, ic, jc, descc, w, work, lwork, tstnrm, result)
subroutine pssepqtq(ms, nv, thresh, q, iq, jq, descq, c, ic, jc, descc, procdist, iclustr, gap, work, lwork, qtqnrm, info, res)
subroutine pssyevx(jobz, range, uplo, n, a, ia, ja, desca, vl, vu, il, iu, abstol, m, nz, w, orfac, z, iz, jz, descz, work, lwork, iwork, liwork, ifail, iclustr, gap, info)