SCALAPACK 2.2.2
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
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
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
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
Definition descinit.f:3
integer function ilcm(m, n)
Definition ilcm.f:2
integer function numroc(n, nb, iproc, isrcproc, nprocs)
Definition numroc.f:2
subroutine pclaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
Definition pcblastst.f:7508
real function pslamch(ictxt, cmach)
Definition pcblastst.f:7455
subroutine pcchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
Definition pcchekpad.f:3
subroutine pcfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
Definition pcfillpad.f:2
#define max(A, B)
Definition pcgemr.c:180
#define min(A, B)
Definition pcgemr.c:181
subroutine pclahqr(wantt, wantz, n, ilo, ihi, a, desca, w, iloz, ihiz, z, descz, work, lwork, iwork, ilwork, info)
Definition pclahqr.f:4
real function pclange(norm, m, n, a, ia, ja, desca, work)
Definition pclange.f:3
real function pclanhs(norm, n, a, ia, ja, desca, work)
Definition pclanhs.f:3
program pcnepdriver
Definition pcnepdriver.f:1
subroutine pcnepfchk(n, a, ia, ja, desca, iaseed, z, iz, jz, descz, anorm, fresid, work)
Definition pcnepfchk.f:3
subroutine pcnepinfo(summry, nout, nmat, nval, ldnval, nnb, nbval, ldnbval, ngrids, pval, ldpval, qval, ldqval, thresh, work, iam, nprocs)
Definition pcnepinfo.f:4
subroutine slboot()
Definition sltimer.f:2
subroutine sltimer(i)
Definition sltimer.f:47
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)
Definition sltimer.f:267