3
4
5
6
7
8
9
10 LOGICAL CHECK
11 INTEGER IAM, KFAIL, KPASS, KSKIP, NMAT, NOUT, NPROCS,
12 $ TOTMEM
13 REAL THRESH
14
15
16 INTEGER NVAL( * )
17 COMPLEX MEM( * )
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 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
72 $ MB_, NB_, RSRC_, CSRC_, LLD_
73 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
74 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
75 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
76 INTEGER REALSZ, CPLXSZ
77 COMPLEX PADVAL
78 parameter( realsz = 4, cplxsz = 8,
79 $ padval = ( -9923.0e+0, -9924.0e+0 ) )
80 INTEGER TIMETESTS
81 parameter( timetests = 11 )
82 INTEGER TESTS
83 parameter( tests = 8 )
84 INTEGER MINTIMEN
85 parameter( mintimen = 8 )
86
87
88 LOGICAL TIME
89 CHARACTER UPLO
90 CHARACTER*6 PASSED
91 INTEGER DUMMY, IASEED, ICTXT, IMIDPAD, INFO, IPA, IPD,
92 $ IPE, IPOSTPAD, IPREPAD, IPT, IPW, ITEMP, J, K,
93 $ LCM, LWMIN, MAXTESTS, MEMSIZ, MYCOL, MYROW, N,
94 $ NB, NDIAG, NGRIDS, NN, NOFFD, NP, NPCOL, NPROW,
95 $ NPS, NQ, SPLITSTIMED, WORKSIZ, WORKTRD
96 REAL ANORM, FRESID
97 DOUBLE PRECISION NOPS, TMFLOPS
98
99
100 INTEGER ANBTEST( TESTS ), ANBTIME( TIMETESTS ),
101 $ BALTEST( TESTS ), BALTIME( TIMETESTS ),
102 $ DESCA( DLEN_ ), DESCD( DLEN_ ), IERR( 1 ),
103 $ INTERTEST( TESTS ), INTERTIME( TIMETESTS ),
104 $ PNBTEST( TESTS ), PNBTIME( TIMETESTS ),
105 $ TWOGEMMTEST( TESTS ), TWOGEMMTIME( TIMETESTS )
106 DOUBLE PRECISION CTIME( 100 ), WTIME( 100 )
107
108
109 EXTERNAL blacs_barrier, blacs_get, blacs_gridexit,
110 $ blacs_gridinfo, blacs_gridinit,
descinit,
114
115
116 LOGICAL LSAME
117 INTEGER ICEIL, ILCM, NUMROC, PJLAENV
118 REAL PCLANHE
120
121
122 INTRINSIC dble, int,
max, real, sqrt
123
124
125
126 INTEGER ANB, BALANCED, BCKBLOCK, GSTBLOCK, INTERLEAVE,
127 $ LLTBLOCK, MINSZ, PNB, TIMEINTERNALS, TIMING,
128 $ TRSBLOCK, TWOGEMMS
129
130
131 COMMON / blocksizes / gstblock, lltblock, bckblock,
132 $ trsblock
133 COMMON / minsize / minsz
134 COMMON / pjlaenvtiming / timing
135 COMMON / tailoredopts / pnb, anb, interleave,
136 $ balanced, twogemms
137 COMMON / timecontrol / timeinternals
138
139
140 DATA baltime / 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0 /
141 DATA intertime / 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1 /
142 DATA twogemmtime / 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 /
143 DATA anbtime / 16, 16, 16, 16, 16, 8, 8, 32, 32, 16,
144 $ 16 /
145 DATA pnbtime / 32, 32, 32, 32, 32, 32, 32, 32, 32,
146 $ 16, 64 /
147 DATA baltest / 0, 0, 0, 0, 1, 1, 1, 1 /
148 DATA intertest / 0, 0, 1, 1, 0, 0, 1, 1 /
149 DATA twogemmtest / 0, 1, 0, 1, 0, 1, 0, 1 /
150 DATA anbtest / 1, 2, 3, 16, 1, 2, 3, 16 /
151 DATA pnbtest / 1, 16, 8, 1, 16, 8, 1, 16 /
152
153
154
155 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
156 $ rsrc_.LT.0 )RETURN
157
158
159 iaseed = 100
160 splitstimed = 0
161 nb = 1
162 uplo = 'L'
163 memsiz = totmem / cplxsz
164
165
166
167 IF( iam.EQ.0 ) THEN
168 WRITE( nout, fmt = * )
169 WRITE( nout, fmt = 9995 )
170 WRITE( nout, fmt = 9994 )
171 WRITE( nout, fmt = 9993 )
172 WRITE( nout, fmt = * )
173 END IF
174
175
176
177 ngrids = int( sqrt( real( nprocs ) ) )
178
179 DO 30 nn = 1, ngrids
180
181 nprow = nn
182 npcol = nn
183 ierr( 1 ) = 0
184
185
186
187 CALL blacs_get( -1, 0, ictxt )
188 CALL blacs_gridinit( ictxt, 'Row-major', nprow, npcol )
189 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
190
191
192
193 IF( myrow.GE.nprow .OR. mycol.GE.npcol )
194 $ GO TO 30
195
196 DO 20 j = 1, nmat
197
198 n = nval( j )
199
200
201
202 ierr( 1 ) = 0
203 IF( n.LT.1 ) THEN
204 IF( iam.EQ.0 )
205 $ WRITE( nout, fmt = 9999 )'MATRIX', 'N', n
206 ierr( 1 ) = 1
207 END IF
208
209
210
211 CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
212
213 IF( ierr( 1 ).GT.0 ) THEN
214 IF( iam.EQ.0 )
215 $ WRITE( nout, fmt = 9997 )'matrix'
216 kskip = kskip + 1
217 GO TO 20
218 END IF
219
220
221
222 IF( n.GT.mintimen ) THEN
223
224
225
226
227
228
229
230
231
232 time = .true.
233 maxtests = timetests + 2
234 ELSE
235 time = .false.
236 maxtests = tests
237 END IF
238
239
240 DO 10 k = 1, maxtests
241 timeinternals = 0
242 IF( time ) THEN
243 IF( k.GE.maxtests-1 ) THEN
244
245
246
247
248
249
250
251
252 minsz = -13
253 balanced = -13
254 interleave = -13
255 twogemms = -13
256 anb = -13
257 pnb = -13
258 timing = 1
259 dummy =
pjlaenv( ictxt, 3,
'PCHETTRD',
'L', 0, 0,
260 $ 0, 0 )
261 IF( k.EQ.maxtests )
262 $ timeinternals = 1
263 ELSE
264 timing = 0
265 minsz = 1
266 balanced = baltime( k )
267 interleave = intertime( k )
268 twogemms = twogemmtime( k )
269 anb = anbtime( k )
270 pnb = pnbtime( k )
271 END IF
272 ELSE
273 timing = 0
274 minsz = 1
275 balanced = baltest( k )
276 interleave = intertest( k )
277 twogemms = twogemmtest( k )
278 anb = anbtest( k )
279 pnb = pnbtest( k )
280 END IF
281
282
283
284
285 IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
286 CALL igebs2d( ictxt, 'All', ' ', 1, 1, splitstimed,
287 $ 1 )
288 ELSE
289 CALL igebr2d( ictxt, 'All', ' ', 1, 1, splitstimed, 1,
290 $ 0, 0 )
291 END IF
292
293
294 IF( splitstimed.EQ.0 .AND. k.EQ.maxtests )
295 $ GO TO 10
296
297
298
299
300
301 IF( pnb.EQ.1 )
302 $ pnb = 1 + iam
303
304
305
306 np =
numroc( n, nb, myrow, 0, nprow )
307 nq =
numroc( n, nb, mycol, 0, npcol )
308 IF( check ) THEN
309 iprepad =
max( nb, np )
310 imidpad = nb
311 ipostpad =
max( nb, nq )
312 ELSE
313 iprepad = 0
314 imidpad = 0
315 ipostpad = 0
316 END IF
317
318
319
320
321 CALL descinit( desca, n, n, nb, nb, 0, 0, ictxt,
322 $
max( 1, np )+imidpad, ierr( 1 ) )
323
324 CALL descinit( descd, 1, n, nb, nb, 0, 0, ictxt, 1,
325 $ info )
326
327
328
329 CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
330
331 IF( ierr( 1 ).LT.0 ) THEN
332 IF( iam.EQ.0 )
333 $ WRITE( nout, fmt = 9997 )'descriptor'
334 kskip = kskip + 1
335 GO TO 10
336 END IF
337
338
339
340
341 ndiag = nq
342 IF(
lsame( uplo,
'U' ) )
THEN
343 noffd = nq
344 ELSE
345 noffd =
numroc( n-1, nb, mycol, 0, npcol )
346 END IF
347 ndiag =
iceil( realsz*ndiag, cplxsz )
348 noffd =
iceil( realsz*noffd, cplxsz )
349
350 ipa = iprepad + 1
351 ipd = ipa + desca( lld_ )*nq + ipostpad + iprepad
352 ipe = ipd + ndiag + ipostpad + iprepad
353 ipt = ipe + noffd + ipostpad + iprepad
354 ipw = ipt + nq + ipostpad + iprepad
355
356
357
358
359 nps =
max(
numroc( n, 1, 0, 0, nprow ), 2*anb )
360 lwmin = 2*( anb+1 )*( 4*nps+2 ) + nps
361
362 worktrd = lwmin + ipostpad
363 worksiz = worktrd
364
365
366
367 IF( check ) THEN
368 itemp = 2*nq + np
369 IF( nprow.NE.npcol ) THEN
370 lcm =
ilcm( nprow, npcol )
371 itemp = nb*
iceil(
iceil( np, nb ), lcm / nprow ) +
372 $ itemp
373 END IF
374 itemp =
max(
iceil( realsz*itemp, cplxsz ),
375 $ 2*( nb+np )*nb )
376 worksiz =
max( lwmin, itemp ) + ipostpad
377 END IF
378
379
380
381 ierr( 1 ) = 0
382 IF( ipw+worksiz.GT.memsiz ) THEN
383 IF( iam.EQ.0 )
384 $ WRITE( nout, fmt = 9996 )'Tridiagonal reduction',
385 $ ( ipw+worksiz )*cplxsz
386 ierr( 1 ) = 1
387 END IF
388
389
390
391 CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
392
393 IF( ierr( 1 ).GT.0 ) THEN
394 IF( iam.EQ.0 )
395 $ WRITE( nout, fmt = 9997 )'MEMORY'
396 kskip = kskip + 1
397 GO TO 10
398 END IF
399
400
401
402
403
404 CALL pcmatgen( ictxt,
'Hemm',
'N', desca( m_ ),
405 $ desca( n_ ), desca( mb_ ), desca( nb_ ),
406 $ mem( ipa ), desca( lld_ ), desca( rsrc_ ),
407 $ desca( csrc_ ), iaseed, 0, np, 0, nq,
408 $ myrow, mycol, nprow, npcol )
409
410
411
412
413 IF( check ) THEN
414 CALL pcfillpad( ictxt, np, nq, mem( ipa-iprepad ),
415 $ desca( lld_ ), iprepad, ipostpad,
416 $ padval )
417 CALL pcfillpad( ictxt, ndiag, 1, mem( ipd-iprepad ),
418 $ ndiag, iprepad, ipostpad, padval )
419 CALL pcfillpad( ictxt, noffd, 1, mem( ipe-iprepad ),
420 $ noffd, iprepad, ipostpad, padval )
421 CALL pcfillpad( ictxt, nq, 1, mem( ipt-iprepad ), nq,
422 $ iprepad, ipostpad, padval )
423 CALL pcfillpad( ictxt, worksiz-ipostpad, 1,
424 $ mem( ipw-iprepad ), worksiz-ipostpad,
425 $ iprepad, ipostpad, padval )
426 anorm =
pclanhe(
'I', uplo, n, mem( ipa ), 1, 1,
427 $ desca, mem( ipw ) )
428 CALL pcchekpad( ictxt,
'PCLANHE', np, nq,
429 $ mem( ipa-iprepad ), desca( lld_ ),
430 $ iprepad, ipostpad, padval )
431 CALL pcchekpad( ictxt,
'PCLANHE', worksiz-ipostpad, 1,
432 $ mem( ipw-iprepad ), worksiz-ipostpad,
433 $ iprepad, ipostpad, padval )
434 CALL pcfillpad( ictxt, worktrd-ipostpad, 1,
435 $ mem( ipw-iprepad ), worktrd-ipostpad,
436 $ iprepad, ipostpad, padval )
437 END IF
438
440 CALL blacs_barrier( ictxt, 'All' )
442
443
444
445 CALL pchettrd( uplo, n, mem( ipa ), 1, 1, desca,
446 $ mem( ipd ), mem( ipe ), mem( ipt ),
447 $ mem( ipw ), lwmin, info )
448
450
451 IF( check ) THEN
452
453
454
455 CALL pcchekpad( ictxt,
'PCHETTRD', np, nq,
456 $ mem( ipa-iprepad ), desca( lld_ ),
457 $ iprepad, ipostpad, padval )
458 CALL pcchekpad( ictxt,
'PCHETTRD', ndiag, 1,
459 $ mem( ipd-iprepad ), ndiag, iprepad,
460 $ ipostpad, padval )
461
462 CALL pcchekpad( ictxt,
'PCHETTRDc', noffd, 1,
463 $ mem( ipe-iprepad ), noffd, iprepad,
464 $ ipostpad, padval )
465 CALL pcchekpad( ictxt,
'PCHETTRDd', nq, 1,
466 $ mem( ipt-iprepad ), nq, iprepad,
467 $ ipostpad, padval )
468 CALL pcchekpad( ictxt,
'PCHETTRDe', worktrd-ipostpad,
469 $ 1, mem( ipw-iprepad ),
470 $ worktrd-ipostpad, iprepad, ipostpad,
471 $ padval )
472 CALL pcfillpad( ictxt, worksiz-ipostpad, 1,
473 $ mem( ipw-iprepad ), worksiz-ipostpad,
474 $ iprepad, ipostpad, padval )
475
476
477
478 CALL pchetdrv( uplo, n, mem( ipa ), 1, 1, desca,
479 $ mem( ipd ), mem( ipe ), mem( ipt ),
480 $ mem( ipw ), ierr( 1 ) )
481
482
483
484
485
486 CALL pclatran( n, 1, mem( ipa ), 1, 1, desca,
487 $ mem( ipw ) )
488 CALL pclafchk(
'Hemm',
'No', n, n, mem( ipa ), 1, 1,
489 $ desca, iaseed, anorm, fresid,
490 $ mem( ipw ) )
491
492
493
494 CALL pcchekpad( ictxt,
'PCHETDRVf', np, nq,
495 $ mem( ipa-iprepad ), desca( lld_ ),
496 $ iprepad, ipostpad, padval )
497 CALL pcchekpad( ictxt,
'PCHETDRVg', ndiag, 1,
498 $ mem( ipd-iprepad ), ndiag, iprepad,
499 $ ipostpad, padval )
500 CALL pcchekpad( ictxt,
'PCHETDRVh', noffd, 1,
501 $ mem( ipe-iprepad ), noffd, iprepad,
502 $ ipostpad, padval )
503 CALL pcchekpad( ictxt,
'PCHETDRVi', worksiz-ipostpad,
504 $ 1, mem( ipw-iprepad ),
505 $ worksiz-ipostpad, iprepad, ipostpad,
506 $ padval )
507
508
509
510 IF( fresid.LE.thresh .AND. fresid-fresid.EQ.
511 $ 0.0e+0 .AND. ierr( 1 ).EQ.0 ) THEN
512 kpass = kpass + 1
513 passed = 'PASSED'
514 ELSE
515 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
516 $ WRITE( nout, fmt = 9991 )fresid
517 kfail = kfail + 1
518 passed = 'FAILED'
519
520
521 END IF
522
523
524 IF( myrow.EQ.0 .AND. mycol.EQ.0 .AND. ierr( 1 ).NE.0 )
525 $ WRITE( nout, fmt = * )'D or E copies incorrect ...'
526 ELSE
527
528
529
530 kpass = kpass + 1
531 fresid = fresid - fresid
532 passed = 'BYPASS'
533 END IF
534
535
536
537 CALL slcombine( ictxt,
'All',
'>',
'W', 50, 1, wtime )
538 CALL slcombine( ictxt,
'All',
'>',
'C', 50, 1, ctime )
539
540
541
542 IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
543
544
545
546 nops = dble( n )
547 nops = ( 16.0d+0 / 3.0d+0 )*nops**3
548 nops = nops / 1.0d+6
549
550
551
552 IF( wtime( 1 ).GT.0.0d+0 ) THEN
553 tmflops = nops / wtime( 1 )
554 ELSE
555 tmflops = 0.0d+0
556 END IF
557 IF( wtime( 1 ).GE.0.0d+0 )
558 $ WRITE( nout, fmt = 9992 )'WALL', n, interleave,
559 $ twogemms, balanced, anb, pnb, nprow*npcol,
560 $ wtime( 1 ), tmflops, fresid, passed
561
562
563
564 IF( ctime( 1 ).GT.0.0d+0 ) THEN
565 tmflops = nops / ctime( 1 )
566 ELSE
567 tmflops = 0.0d+0
568 END IF
569 IF( ctime( 1 ).GE.0.0d+0 )
570 $ WRITE( nout, fmt = 9992 )'CPU ', n, interleave,
571 $ twogemms, balanced, anb, pnb, nprow*npcol,
572 $ ctime( 1 ), tmflops, fresid, passed
573
574
575
576
577
578 IF( wtime( 13 )+wtime( 15 )+wtime( 16 ).GT.0.0d+0 .OR.
579 $ ctime( 13 )+ctime( 15 )+ctime( 16 ).GT.0.0d+0 )
580 $ THEN
581 splitstimed = 1
582 END IF
583 IF( splitstimed.EQ.1 ) THEN
584 WRITE( nout, fmt = 9990 )wtime( 10 ), wtime( 11 ),
585 $ wtime( 12 ), wtime( 13 ), wtime( 14 ),
586 $ wtime( 15 )
587 WRITE( nout, fmt = 9989 )wtime( 16 ), wtime( 17 ),
588 $ wtime( 18 ), wtime( 19 ), wtime( 20 ),
589 $ wtime( 21 )
590
591 WRITE( nout, fmt = 9988 )ctime( 10 ), ctime( 11 ),
592 $ ctime( 12 ), ctime( 13 ), ctime( 14 ),
593 $ ctime( 15 )
594 WRITE( nout, fmt = 9987 )ctime( 16 ), ctime( 17 ),
595 $ ctime( 18 ), ctime( 19 ), ctime( 20 ),
596 $ ctime( 21 )
597 WRITE( nout, fmt = 9986 )n, nprow*npcol, pnb, anb,
598 $ interleave, balanced, twogemms, timeinternals
599 END IF
600 END IF
601 10 CONTINUE
602 20 CONTINUE
603
604 IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
605 IF( splitstimed.EQ.1 ) THEN
606 WRITE( nout, fmt = 9985 )
607 WRITE( nout, fmt = 9984 )
608 WRITE( nout, fmt = 9983 )
609 WRITE( nout, fmt = 9982 )
610 WRITE( nout, fmt = 9981 )
611 WRITE( nout, fmt = 9980 )
612 WRITE( nout, fmt = 9979 )
613 WRITE( nout, fmt = 9978 )
614 WRITE( nout, fmt = 9977 )
615 WRITE( nout, fmt = 9976 )
616 WRITE( nout, fmt = 9975 )
617 WRITE( nout, fmt = 9974 )
618 WRITE( nout, fmt = 9973 )
619 END IF
620 END IF
621
622
623 CALL blacs_gridexit( ictxt )
624 30 CONTINUE
625 RETURN
626
627 9999 FORMAT( 'ILLEGAL ', a6, ': ', a5, ' = ', i3,
628 $ '; It should be at least 1' )
629 9998 FORMAT( 'ILLEGAL GRID: nprow*npcol = ', i4, '. It can be at most',
630 $ i4 )
631 9997 FORMAT( 'Bad ', a6, ' parameters: going on to next test case.' )
632 9996 FORMAT( 'Unable to perform ', a, ': need TOTMEM of at least',
633 $ i11 )
634
635 9995 FORMAT( 'PCHETTRD, tailored reduction to tridiagonal form, test.'
636 $ )
637 9994 FORMAT( 'TIME N int 2gm bal anb pnb prcs TRD Time ',
638 $ ' MFLOPS Residual CHECK' )
639 9993 FORMAT( '---- ---- --- --- --- --- --- ---- -------- ',
640 $ '----------- -------- ------' )
641 9992 FORMAT( a4, 1x, i5, 1x, i3, 1x, i3, 1x, i3, 1x, i3, 1x, i3, 1x,
642 $ i5, 1x, f9.2, 1x, f11.2, 1x, f8.2, 1x, a6 )
643 9991 FORMAT( '||A - Q*T*Q''|| / (||A|| * N * eps) = ', g25.7 )
644 9990 FORMAT( 'wsplit1=[wsplit1;', f9.2, 1x, f9.2, 1x, f9.2, 1x, f9.2,
645 $ 1x, f9.2, 1x, f9.2, ' ];' )
646 9989 FORMAT( 'wsplit2=[wsplit2;', f9.2, 1x, f9.2, 1x, f9.2, 1x, f9.2,
647 $ 1x, f9.2, 1x, f9.2, ' ];' )
648 9988 FORMAT( 'csplit1=[csplit1;', f9.2, 1x, f9.2, 1x, f9.2, 1x, f9.2,
649 $ 1x, f9.2, 1x, f9.2, ' ];' )
650 9987 FORMAT( 'csplit2=[csplit2;', f9.2, 1x, f9.2, 1x, f9.2, 1x, f9.2,
651 $ 1x, f9.2, 1x, f9.2, ' ];' )
652 9986 FORMAT( 'size_opts=[size_opts;', i4, 1x, i4, 1x, i4, 1x, i4, 1x,
653 $ i4, 1x, i4, 1x, i4, 1x, i4, 1x, ' ];' )
654 9985 FORMAT( 'N=1; NPROCS=2; PNB=3; ANB=4; INTERLEAVE=5; BALANCED=6;',
655 $ ' TWOGEMMS=7; TIMEINTERNALS=8;' )
656 9984 FORMAT( 'S1_OVERHEAD = 1; % Should be mainly cost of barrier' )
657 9983 FORMAT( 'S1_BARRIER = 2; % Cost of barrier' )
658 9982 FORMAT( 'S1_UPDCURCOL = 3; % Update the current column' )
659 9981 FORMAT( 'S1_HOUSE = 4; % Compute the householder vector' )
660 9980 FORMAT( 'S1_SPREAD = 5; % Spread across' )
661 9979 FORMAT( 'S1_TRANSPOSE = 6; % Transpose' )
662 9978 FORMAT( 'S2_UPDCURBLK = 1; % Update the current block column' )
663 9977 FORMAT( 'S2_TRMVT = 2; % TRMVT v = A * h; vt = ht * A'' ' )
664 9976 FORMAT( 'S2_UPD_V = 3; % v = v + V * HT * h + H * VT * h ' )
665 9975 FORMAT( 'S2_TRANS_SUM = 4; % v = v + vt'' ' )
666 9974 FORMAT( 'S2_DOT = 5; % c = v'' * h ' )
667 9973 FORMAT( 'S2_R2K = 6; % A = A - v * h'' - h * v'' ' )
668
669
670
671
subroutine pclafchk(aform, diag, m, n, a, ia, ja, desca, iaseed, anorm, fresid, work)
subroutine pcmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
integer function iceil(inum, idenom)
integer function ilcm(m, n)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pcchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pcfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pchetdrv(uplo, n, a, ia, ja, desca, d, e, tau, work, info)
subroutine pchettrd(uplo, n, a, ia, ja, desca, d, e, tau, work, lwork, info)
real function pclanhe(norm, uplo, n, a, ia, ja, desca, work)
subroutine pclatran(n, nb, a, ia, ja, desca, work)
integer function pjlaenv(ictxt, ispec, name, opts, n1, n2, n3, n4)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)