ScaLAPACK 2.1  2.1
ScaLAPACK: Scalable Linear Algebra PACKage
pcevcdriver.f
Go to the documentation of this file.
1  PROGRAM pcevcdriver
2 *
3 * -- ScaLAPACK testing driver (version 1.7) --
4 * University of Tennessee, Knoxville, Oak Ridge National Laboratory,
5 * and University of California, Berkeley.
6 * June, 2000
7 *
8 * Purpose
9 * =======
10 *
11 * PCEVCDRIVER is the main test program for the COMPLEX
12 * SCALAPACK PCTREVC routine. This test driver performs a right and
13 * left eigenvector calculation of a triangular matrix followed by
14 * a residual checks of the calcuated eigenvectors.
15 *
16 * The program must be driven by a short data file and uses the same
17 * input file as the PCNEPDRIVER. An annotated example of a data file
18 * can be obtained by deleting the first 3 characters from the following
19 * 18 lines:
20 * 'SCALAPACK, Version 1.8, NEP (Nonsymmetric EigenProblem) input file'
21 * 'Intel iPSC/860 hypercube, gamma model.'
22 * 'NEP.out' output file name (if any)
23 * 6 device out
24 * 8 number of problems sizes
25 * 1 2 3 4 6 10 100 200 vales of N
26 * 3 number of NB's
27 * 6 20 40 values of NB
28 * 4 number of process grids (ordered pairs of P & Q)
29 * 1 2 1 4 values of P
30 * 1 2 4 1 values of Q
31 * 20.0 threshold
32 *
33 * Internal Parameters
34 * ===================
35 *
36 * TOTMEM INTEGER, default = 2000000
37 * TOTMEM is a machine-specific parameter indicating the
38 * maximum amount of available memory in bytes.
39 * The user should customize TOTMEM to his platform. Remember
40 * to leave room in memory for the operating system, the BLACS
41 * buffer, etc. For example, on a system with 8 MB of memory
42 * per process (e.g., one processor on an Intel iPSC/860), the
43 * parameters we use are TOTMEM=6200000 (leaving 1.8 MB for OS,
44 * code, BLACS buffer, etc). However, for PVM, we usually set
45 * TOTMEM = 2000000. Some experimenting with the maximum value
46 * of TOTMEM may be required.
47 *
48 * CPLXSZ INTEGER, default = 8 bytes.
49 * CPLXSZ indicate the length in bytes on the given platform
50 * for a single precision complex.
51 * MEM COMPLEX array, dimension ( TOTMEM / CPLXSZ )
52 *
53 * All arrays used by SCALAPACK routines are allocated from
54 * this array and referenced by pointers. The integer IPA,
55 * for example, is a pointer to the starting element of MEM for
56 * the matrix A.
57 *
58 * Further Details
59 * ==============
60 *
61 * Contributed by Mark Fahey, June, 2000
62 *
63 * =====================================================================
64 *
65 * .. Parameters ..
66  INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dt_,
67  $ lld_, mb_, m_, nb_, n_, rsrc_
68  parameter( block_cyclic_2d = 1, dlen_ = 9, dt_ = 1,
69  $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
70  $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
71  INTEGER cplxsz, totmem, memsiz, ntests
72  parameter( cplxsz = 8, totmem = 200000000,
73  $ memsiz = totmem / cplxsz, ntests = 20 )
74  COMPLEX padval, zero, one
75  parameter( padval = ( -9923.0e+0, -9923.0e+0 ),
76  $ zero = ( 0.0e+0, 0.0e+0 ),
77  $ one = ( 1.0e+0, 0.0e+0 ) )
78 * ..
79 * .. Local Scalars ..
80  LOGICAL check
81  CHARACTER*6 passed
82  CHARACTER*80 outfile
83  INTEGER i, iam, iaseed, icol, ictxt, ii, iii, imidpad,
84  $ info, ipa, ipostpad, iprepad, ipvl, ipvr, ipw,
85  $ ipwr, ipc, irow, j, jj, jjj, k, kfail, kpass,
86  $ kskip, ktests, lda, ldz, lwork, m, mycol,
87  $ myrow, n, nb, ngrids, nmat, nnb, nout, np,
88  $ npcol, nprocs, nprow, nq, worksiz
89  REAL thresh
90  REAL anorm, fresid, qresid
91  DOUBLE PRECISION nops, tmflops
92 * ..
93 * .. Local Arrays ..
94  LOGICAL select( 1 )
95  INTEGER desca( dlen_ ), descz( dlen_ ), ierr( 2 ),
96  $ nbval( ntests ), nval( ntests ),
97  $ pval( ntests ), qval( ntests )
98  REAL result( 2 ), rwork( 5000 )
99  DOUBLE PRECISION ctime( 2 ), wtime( 2 )
100  COMPLEX mem( memsiz )
101 * ..
102 * .. External Subroutines ..
103  EXTERNAL blacs_barrier, blacs_exit, blacs_get,
104  $ blacs_gridexit, blacs_gridinfo, blacs_gridinit,
105  $ blacs_pinfo, descinit, igsum2d, infog2l,
108  $ sltimer, cgsum2d
109 * ..
110 * .. External Functions ..
111  INTEGER ilcm, numroc
112  REAL pclanhs
113  EXTERNAL ilcm, numroc, pclanhs
114 * ..
115 * .. Intrinsic Functions ..
116  INTRINSIC real, max, min
117 * ..
118 * .. Data statements ..
119  DATA kfail, kpass, kskip, ktests / 4*0 /
120 * ..
121 * .. Executable Statements ..
122 *
123 * Get starting information
124 *
125  CALL blacs_pinfo( iam, nprocs )
126  iaseed = 100
127  CALL pcevcinfo( outfile, nout, nmat, nval, ntests, nnb, nbval,
128  $ ntests, ngrids, pval, ntests, qval, ntests,
129  $ thresh, mem, iam, nprocs )
130  check = ( thresh.GE.0.0e+0 )
131 *
132 * Print headings
133 *
134  IF( iam.EQ.0 ) THEN
135  WRITE( nout, fmt = * )
136  WRITE( nout, fmt = 9995 )
137  WRITE( nout, fmt = 9994 )
138  WRITE( nout, fmt = * )
139  END IF
140 *
141 * Loop over different process grids
142 *
143  DO 40 i = 1, ngrids
144 *
145  nprow = pval( i )
146  npcol = qval( i )
147 *
148 * Make sure grid information is correct
149 *
150  ierr( 1 ) = 0
151  IF( nprow.LT.1 ) THEN
152  IF( iam.EQ.0 )
153  $ WRITE( nout, fmt = 9999 )'GRID', 'nprow', nprow
154  ierr( 1 ) = 1
155  ELSE IF( npcol.LT.1 ) THEN
156  IF( iam.EQ.0 )
157  $ WRITE( nout, fmt = 9999 )'GRID', 'npcol', npcol
158  ierr( 1 ) = 1
159  ELSE IF( nprow*npcol.GT.nprocs ) THEN
160  IF( iam.EQ.0 )
161  $ WRITE( nout, fmt = 9998 )nprow*npcol, nprocs
162  ierr( 1 ) = 1
163  END IF
164 *
165  IF( ierr( 1 ).GT.0 ) THEN
166  IF( iam.EQ.0 )
167  $ WRITE( nout, fmt = 9997 )'grid'
168  kskip = kskip + 1
169  GO TO 40
170  END IF
171 *
172 * Define process grid
173 *
174  CALL blacs_get( -1, 0, ictxt )
175  CALL blacs_gridinit( ictxt, 'Row-major', nprow, npcol )
176  CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
177 *
178 * Go to bottom of process grid loop if this case doesn't use my
179 * process
180 *
181  IF( myrow.GE.nprow .OR. mycol.GE.npcol )
182  $ GO TO 40
183 *
184  DO 30 j = 1, nmat
185 *
186  n = nval( j )
187 *
188 * Make sure matrix information is correct
189 *
190  ierr( 1 ) = 0
191  IF( n.LT.1 ) THEN
192  IF( iam.EQ.0 )
193  $ WRITE( nout, fmt = 9999 )'MATRIX', 'N', n
194  ierr( 1 ) = 1
195  END IF
196 *
197 * Check all processes for an error
198 *
199  CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
200 *
201  IF( ierr( 1 ).GT.0 ) THEN
202  IF( iam.EQ.0 )
203  $ WRITE( nout, fmt = 9997 )'matrix'
204  kskip = kskip + 1
205  GO TO 30
206  END IF
207 *
208  DO 20 k = 1, nnb
209 *
210  nb = nbval( k )
211 *
212 * Make sure nb is legal
213 *
214  ierr( 1 ) = 0
215  IF( nb.LT.6 ) THEN
216  ierr( 1 ) = 1
217  IF( iam.EQ.0 )
218  $ WRITE( nout, fmt = 9999 )'NB', 'NB', nb
219  END IF
220 *
221 * Check all processes for an error
222 *
223  CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
224 *
225  IF( ierr( 1 ).GT.0 ) THEN
226  IF( iam.EQ.0 )
227  $ WRITE( nout, fmt = 9997 )'NB'
228  kskip = kskip + 1
229  GO TO 20
230  END IF
231 *
232 * Padding constants
233 *
234  np = numroc( n, nb, myrow, 0, nprow )
235  nq = numroc( n, nb, mycol, 0, npcol )
236  IF( check ) THEN
237  iprepad = max( nb, np )
238  imidpad = nb
239  ipostpad = max( nb, nq )
240  iprepad = iprepad + 1000
241  imidpad = imidpad + 1000
242  ipostpad = ipostpad + 1000
243  ELSE
244  iprepad = 0
245  imidpad = 0
246  ipostpad = 0
247  END IF
248 *
249 * Initialize the array descriptor for the matrix A
250 *
251  CALL descinit( desca, n, n, nb, nb, 0, 0, ictxt,
252  $ max( 1, np )+imidpad, ierr( 1 ) )
253 *
254 * Initialize the array descriptor for the matrix Z
255 *
256  CALL descinit( descz, n, n, nb, nb, 0, 0, ictxt,
257  $ max( 1, np )+imidpad, ierr( 2 ) )
258 *
259  lda = desca( lld_ )
260  ldz = descz( lld_ )
261 *
262 * Check all processes for an error
263 *
264  CALL igsum2d( ictxt, 'All', ' ', 2, 1, ierr, 2, -1, 0 )
265 *
266  IF( ierr( 1 ).LT.0 .OR. ierr( 2 ).LT.0 ) THEN
267  IF( iam.EQ.0 )
268  $ WRITE( nout, fmt = 9997 )'descriptor'
269  kskip = kskip + 1
270  GO TO 20
271  END IF
272 *
273 * Assign pointers into MEM for SCALAPACK arrays, A is
274 * allocated starting at position MEM( IPREPAE+1 )
275 *
276  ipa = iprepad + 1
277  ipc = ipa + desca( lld_ )*nq + ipostpad + iprepad
278  ipwr = ipc + descz( lld_ )*nq + ipostpad + iprepad
279  ipvl = ipwr + n + ipostpad + iprepad
280  ipvr = ipvl + descz( lld_ )*nq + ipostpad + iprepad
281  ipw = ipvr + descz( lld_ )*nq + ipostpad + iprepad
282  iii = n / nb
283  IF( iii*nb.LT.n )
284  $ iii = iii + 1
285  iii = 7*iii / ilcm( nprow, npcol )
286 *
287 *
288  lwork = 3*n + max( 2*max( lda, ldz )+2*nq, iii )
289  lwork = lwork + max( 2*n, ( 8*ilcm( nprow, npcol )+2 )**
290  $ 2 )
291 *
292  IF( check ) THEN
293 *
294 * Figure the amount of workspace required by the
295 * checking routines PCEVCFCHK and PCLANHS
296 *
297  worksiz = lwork + max( np*desca( nb_ ),
298  $ desca( mb_ )*nq ) + ipostpad
299 *
300  ELSE
301 *
302  worksiz = lwork + ipostpad
303 *
304  END IF
305 *
306 * Check for adequate memory for problem size
307 *
308  ierr( 1 ) = 0
309  IF( ipw+worksiz.GT.memsiz ) THEN
310  IF( iam.EQ.0 )
311  $ WRITE( nout, fmt = 9996 )'Schur reduction',
312  $ ( ipw+worksiz )*cplxsz
313  ierr( 1 ) = 1
314  END IF
315 *
316 * Check all processes for an error
317 *
318  CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
319 *
320  IF( ierr( 1 ).GT.0 ) THEN
321  IF( iam.EQ.0 )
322  $ WRITE( nout, fmt = 9997 )'MEMORY'
323  kskip = kskip + 1
324  GO TO 20
325  END IF
326 *
327 * Generate matrix Z = In
328 *
329  CALL pclaset( 'All', n, n, zero, one, mem( ipc ), 1, 1,
330  $ descz )
331  CALL pclaset( 'All', n, n, zero, zero, mem( ipvr ), 1, 1,
332  $ descz )
333  CALL pclaset( 'All', n, n, zero, zero, mem( ipvl ), 1, 1,
334  $ descz )
335 *
336 * Generate matrix A upper Hessenberg
337 *
338  CALL pcmatgen( ictxt, 'No transpose', 'No transpose',
339  $ desca( m_ ), desca( n_ ), desca( mb_ ),
340  $ desca( nb_ ), mem( ipa ), desca( lld_ ),
341  $ desca( rsrc_ ), desca( csrc_ ), iaseed, 0,
342  $ np, 0, nq, myrow, mycol, nprow, npcol )
343  CALL pclaset( 'Lower', max( 0, n-1 ), max( 0, n-1 ),
344  $ zero, zero, mem( ipa ), min( n, 2 ), 1,
345  $ desca )
346 *
347 * Calculate inf-norm of A for residual error-checking
348 *
349  IF( check ) THEN
350  CALL pcfillpad( ictxt, np, nq, mem( ipa-iprepad ),
351  $ desca( lld_ ), iprepad, ipostpad,
352  $ padval )
353  CALL pcfillpad( ictxt, np, nq, mem( ipvr-iprepad ),
354  $ descz( lld_ ), iprepad, ipostpad,
355  $ padval )
356  CALL pcfillpad( ictxt, np, nq, mem( ipvl-iprepad ),
357  $ descz( lld_ ), iprepad, ipostpad,
358  $ padval )
359  CALL pcfillpad( ictxt, np, nq, mem( ipc-iprepad ),
360  $ descz( lld_ ), iprepad, ipostpad,
361  $ padval )
362  CALL pcfillpad( ictxt, worksiz-ipostpad, 1,
363  $ mem( ipw-iprepad ), worksiz-ipostpad,
364  $ iprepad, ipostpad, padval )
365  anorm = pclanhs( 'I', n, mem( ipa ), 1, 1, desca,
366  $ mem( ipw ) )
367  CALL pcchekpad( ictxt, 'PCLANHS', np, nq,
368  $ mem( ipa-iprepad ), desca( lld_ ),
369  $ iprepad, ipostpad, padval )
370  CALL pcchekpad( ictxt, 'PCLANHS', worksiz-ipostpad, 1,
371  $ mem( ipw-iprepad ), worksiz-ipostpad,
372  $ iprepad, ipostpad, padval )
373 *
374  CALL pcfillpad( ictxt, n, 1, mem( ipwr-iprepad ), n,
375  $ iprepad, ipostpad, padval )
376  CALL pcfillpad( ictxt, lwork, 1, mem( ipw-iprepad ),
377  $ lwork, iprepad, ipostpad, padval )
378 *
379  END IF
380 *
381 * Set eigenvalues from diagonal
382 *
383  DO 10 jjj = 1, n
384  CALL infog2l( jjj, jjj, descz, nprow, npcol, myrow,
385  $ mycol, irow, icol, ii, jj )
386  IF( myrow.EQ.ii .AND. mycol.EQ.jj ) THEN
387  mem( ipwr-1+jjj ) = mem( ipa-1+( icol-1 )*lda+
388  $ irow )
389  ELSE
390  mem( ipwr-1+jjj ) = zero
391  END IF
392  10 CONTINUE
393  CALL cgsum2d( ictxt, 'All', ' ', n, 1, mem( ipwr ), n,
394  $ -1, -1 )
395 *
396  SELECT( 1 ) = .true.
397  CALL slboot()
398  CALL blacs_barrier( ictxt, 'All' )
399  CALL sltimer( 1 )
400 *
401 * Perform eigenvector calculation
402 *
403  CALL pctrevc( 'B', 'A', SELECT, n, mem( ipa ), desca,
404  $ mem( ipvl ), descz, mem( ipvr ), descz, n,
405  $ m, mem( ipw ), rwork, info )
406 *
407  CALL sltimer( 1 )
408 *
409  IF( info.NE.0 ) THEN
410  IF( iam.EQ.0 )
411  $ WRITE( nout, fmt = * )'PCTREVC INFO=', info
412  kfail = kfail + 1
413  GO TO 20
414  END IF
415 *
416  IF( check ) THEN
417 *
418 * Check for memory overwrite in NEP factorization
419 *
420  CALL pcchekpad( ictxt, 'PCTREVC (A)', np, nq,
421  $ mem( ipa-iprepad ), desca( lld_ ),
422  $ iprepad, ipostpad, padval )
423  CALL pcchekpad( ictxt, 'PCTREVC (VR)', np, nq,
424  $ mem( ipvr-iprepad ), descz( lld_ ),
425  $ iprepad, ipostpad, padval )
426  CALL pcchekpad( ictxt, 'PCTREVC (VL)', np, nq,
427  $ mem( ipvl-iprepad ), descz( lld_ ),
428  $ iprepad, ipostpad, padval )
429  CALL pcchekpad( ictxt, 'PCTREVC (WR)', n, 1,
430  $ mem( ipwr-iprepad ), n, iprepad,
431  $ ipostpad, padval )
432  CALL pcchekpad( ictxt, 'PCTREVC (WORK)', lwork, 1,
433  $ mem( ipw-iprepad ), lwork, iprepad,
434  $ ipostpad, padval )
435 *
436  CALL pcfillpad( ictxt, worksiz-ipostpad, 1,
437  $ mem( ipw-iprepad ), worksiz-ipostpad,
438  $ iprepad, ipostpad, padval )
439 *
440 * Compute || T * Z - Z * D || / ( N*|| T ||*EPS )
441 *
442  fresid = 0.0e+0
443  qresid = 0.0e+0
444  CALL pcget22( 'N', 'N', 'N', n, mem( ipa ), desca,
445  $ mem( ipvr ), descz, mem( ipwr ),
446  $ mem( ipc ), descz, rwork, result )
447  fresid = result( 1 )
448  qresid = result( 2 )
449 *
450 * Compute || T^H * L - L * D^H || / ( N*|| T ||*EPS )
451 *
452  CALL pcget22( 'C', 'N', 'C', n, mem( ipa ), desca,
453  $ mem( ipvl ), descz, mem( ipwr ),
454  $ mem( ipc ), descz, rwork, result )
455  fresid = max( fresid, result( 1 ) )
456  qresid = max( qresid, result( 2 ) )
457 *
458  CALL pcchekpad( ictxt, 'PCGET22 (A)', np, nq,
459  $ mem( ipa-iprepad ), desca( lld_ ),
460  $ iprepad, ipostpad, padval )
461  CALL pcchekpad( ictxt, 'PCGET22 (VR)', np, nq,
462  $ mem( ipvr-iprepad ), descz( lld_ ),
463  $ iprepad, ipostpad, padval )
464  CALL pcchekpad( ictxt, 'PCGET22 (VL)', np, nq,
465  $ mem( ipvl-iprepad ), descz( lld_ ),
466  $ iprepad, ipostpad, padval )
467  CALL pcchekpad( ictxt, 'PCGET22 (Z)', np, nq,
468  $ mem( ipc-iprepad ), descz( lld_ ),
469  $ iprepad, ipostpad, padval )
470 *
471 * Test residual and detect NaN result
472 *
473  IF( ( fresid.LE.thresh ) .AND.
474  $ ( ( fresid-fresid ).EQ.0.0e+0 ) .AND.
475  $ ( qresid.LE.thresh ) .AND.
476  $ ( ( qresid-qresid ).EQ.0.0e+0 ) ) THEN
477  kpass = kpass + 1
478  passed = 'PASSED'
479  ELSE
480  kfail = kfail + 1
481  passed = 'FAILED'
482  IF( iam.EQ.0 ) THEN
483  WRITE( nout, fmt = 9986 )fresid
484  WRITE( nout, fmt = 9985 )qresid
485  END IF
486  END IF
487 *
488  ELSE
489 *
490 * Don't perform the checking, only timing
491 *
492  kpass = kpass + 1
493  fresid = fresid - fresid
494  qresid = qresid - qresid
495  passed = 'BYPASS'
496 *
497  END IF
498 *
499 * Gather maximum of all CPU and WALL clock timings
500 *
501  CALL slcombine( ictxt, 'All', '>', 'W', 1, 1, wtime )
502  CALL slcombine( ictxt, 'All', '>', 'C', 1, 1, ctime )
503 *
504 * Print results
505 *
506  IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
507 *
508 * 2 N^2 flops for PxTREVC
509 *
510  nops = 2.0d+0*dble( n )**2
511 *
512 * Calculate total megaflops -- eigenvector calc only,
513 * -- for WALL and CPU time, and print output
514 *
515 * Print WALL time if machine supports it
516 *
517  IF( wtime( 1 ).GT.0.0d+0 ) THEN
518  tmflops = nops / ( wtime( 1 )*1.0d+6 )
519  ELSE
520  tmflops = 0.0d+0
521  END IF
522  IF( wtime( 1 ).GE.0.0d+0 )
523  $ WRITE( nout, fmt = 9993 )'WALL', n, nb, nprow,
524  $ npcol, wtime( 1 ), tmflops, passed
525 *
526 * Print CPU time if machine supports it
527 *
528  IF( ctime( 1 ).GT.0.0d+0 ) THEN
529  tmflops = nops / ( ctime( 1 )*1.0d+6 )
530  ELSE
531  tmflops = 0.0d+0
532  END IF
533 *
534  IF( ctime( 1 ).GE.0.0d+0 )
535  $ WRITE( nout, fmt = 9993 )'CPU ', n, nb, nprow,
536  $ npcol, ctime( 1 ), tmflops, passed
537  END IF
538 *
539  20 CONTINUE
540 *
541  30 CONTINUE
542 *
543  CALL blacs_gridexit( ictxt )
544 *
545  40 CONTINUE
546 *
547 * Print ending messages and close output file
548 *
549  IF( iam.EQ.0 ) THEN
550  ktests = kpass + kfail + kskip
551  WRITE( nout, fmt = * )
552  WRITE( nout, fmt = 9992 )ktests
553  IF( check ) THEN
554  WRITE( nout, fmt = 9991 )kpass
555  WRITE( nout, fmt = 9989 )kfail
556  ELSE
557  WRITE( nout, fmt = 9990 )kpass
558  END IF
559  WRITE( nout, fmt = 9988 )kskip
560  WRITE( nout, fmt = * )
561  WRITE( nout, fmt = * )
562  WRITE( nout, fmt = 9987 )
563  IF( nout.NE.6 .AND. nout.NE.0 )
564  $ CLOSE ( nout )
565  END IF
566 *
567  CALL blacs_exit( 0 )
568 *
569  9999 FORMAT( 'ILLEGAL ', a6, ': ', a5, ' = ', i3,
570  $ '; It should be at least 1' )
571  9998 FORMAT( 'ILLEGAL GRID: nprow*npcol = ', i4, '. It can be at most',
572  $ i4 )
573  9997 FORMAT( 'Bad ', a6, ' parameters: going on to next test case.' )
574  9996 FORMAT( 'Unable to perform ', a, ': need TOTMEM of at least',
575  $ i11 )
576  9995 FORMAT( 'TIME N NB P Q NEP Time MFLOPS CHECK' )
577  9994 FORMAT( '---- ----- --- ---- ---- -------- -------- ------' )
578  9993 FORMAT( a4, 1x, i5, 1x, i3, 1x, i4, 1x, i4, 1x, f8.2, 1x, f8.2,
579  $ 1x, a6 )
580  9992 FORMAT( 'Finished ', i6, ' tests, with the following results:' )
581  9991 FORMAT( i5, ' tests completed and passed residual checks.' )
582  9990 FORMAT( i5, ' tests completed without checking.' )
583  9989 FORMAT( i5, ' tests completed and failed residual checks.' )
584  9988 FORMAT( i5, ' tests skipped because of illegal input values.' )
585  9987 FORMAT( 'END OF TESTS.' )
586  9986 FORMAT( '||H*Z - Z*D|| / (||T|| * N * eps) = ', g25.7 )
587  9985 FORMAT( 'max_j(max|Z(j)| - 1) / ( N * eps ) ', g25.7 )
588 *
589  stop
590 *
591 * End of PCEVCDRIVER
592 *
593  END
pcevcinfo
subroutine pcevcinfo(SUMMRY, NOUT, NMAT, NVAL, LDNVAL, NNB, NBVAL, LDNBVAL, NGRIDS, PVAL, LDPVAL, QVAL, LDQVAL, THRESH, WORK, IAM, NPROCS)
Definition: pcevcinfo.f:4
max
#define max(A, B)
Definition: pcgemr.c:180
ilcm
integer function ilcm(M, N)
Definition: ilcm.f:2
infog2l
subroutine infog2l(GRINDX, GCINDX, DESC, NPROW, NPCOL, MYROW, MYCOL, LRINDX, LCINDX, RSRC, CSRC)
Definition: infog2l.f:3
sltimer
subroutine sltimer(I)
Definition: sltimer.f:47
pcevcdriver
program pcevcdriver
Definition: pcevcdriver.f:1
pcchekpad
subroutine pcchekpad(ICTXT, MESS, M, N, A, LDA, IPRE, IPOST, CHKVAL)
Definition: pcchekpad.f:3
pcmatgen
subroutine pcmatgen(ICTXT, AFORM, DIAG, M, N, MB, NB, A, LDA, IAROW, IACOL, ISEED, IROFF, IRNUM, ICOFF, ICNUM, MYROW, MYCOL, NPROW, NPCOL)
Definition: pcmatgen.f:4
pcget22
subroutine pcget22(TRANSA, TRANSE, TRANSW, N, A, DESCA, E, DESCE, W, WORK, DESCW, RWORK, RESULT)
Definition: pcget22.f:3
descinit
subroutine descinit(DESC, M, N, MB, NB, IRSRC, ICSRC, ICTXT, LLD, INFO)
Definition: descinit.f:3
pclaset
subroutine pclaset(UPLO, M, N, ALPHA, BETA, A, IA, JA, DESCA)
Definition: pcblastst.f:7508
slboot
subroutine slboot()
Definition: sltimer.f:2
pcfillpad
subroutine pcfillpad(ICTXT, M, N, A, LDA, IPRE, IPOST, CHKVAL)
Definition: pcfillpad.f:2
numroc
integer function numroc(N, NB, IPROC, ISRCPROC, NPROCS)
Definition: numroc.f:2
pctrevc
subroutine pctrevc(SIDE, HOWMNY, SELECT, N, T, DESCT, VL, DESCVL, VR, DESCVR, MM, M, WORK, RWORK, INFO)
Definition: pctrevc.f:3
pclanhs
real function pclanhs(NORM, N, A, IA, JA, DESCA, WORK)
Definition: pclanhs.f:3
slcombine
subroutine slcombine(ICTXT, SCOPE, OP, TIMETYPE, N, IBEG, TIMES)
Definition: sltimer.f:267
min
#define min(A, B)
Definition: pcgemr.c:181