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