SCALAPACK 2.2.2
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
psnepdriver.f
Go to the documentation of this file.
1 PROGRAM psnepdriver
2*
3* -- ScaLAPACK testing driver (version 1.7) --
4* University of Tennessee, Knoxville, Oak Ridge National Laboratory,
5* and University of California, Berkeley.
6* May 1, 1997
7*
8* Purpose
9* =======
10*
11* PSNEPDRIVER is the main test program for the REAL
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* REALSZ INTEGER, default = 4 bytes.
47* REALSZ indicate the length in bytes on the given platform
48* for a real element.
49* MEM REAL array, dimension ( TOTMEM / REALSZ )
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* =====================================================================
57*
58* .. Parameters ..
59 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dt_,
60 $ lld_, mb_, m_, nb_, n_, rsrc_
61 parameter( block_cyclic_2d = 1, dlen_ = 9, dt_ = 1,
62 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
63 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
64 INTEGER realsz, totmem, memsiz, ntests
65 REAL padval, zero, one
66 parameter( realsz = 4, totmem = 2000000,
67 $ memsiz = totmem / realsz, ntests = 20,
68 $ padval = -9923.0e+0, zero = 0.0e+0,
69 $ one = 1.0e+0 )
70* ..
71* .. Local Scalars ..
72 LOGICAL check
73 CHARACTER*6 passed
74 CHARACTER*80 outfile
75 INTEGER i, iam, iaseed, ictxt, iii, imidpad, info, ipa,
76 $ ipostpad, iprepad, ipw, ipwi, ipwr, ipz, j, k,
77 $ kfail, kpass, kskip, ktests, lda, ldz, lwork,
78 $ mycol, myrow, n, nb, ngrids, nmat, nnb, nout,
79 $ np, npcol, nprocs, nprow, nq, worksiz
80 REAL thresh
81 REAL anorm, fresid, qresid, znorm
82 DOUBLE PRECISION nops, tmflops
83* ..
84* .. Local Arrays ..
85 INTEGER desca( dlen_ ), descz( dlen_ ), ierr( 2 ),
86 $ idum( 1 ), nbval( ntests ), nval( ntests ),
87 $ pval( ntests ), qval( ntests )
88 REAL mem ( memsiz )
89 DOUBLE PRECISION ctime( 1 ), wtime( 1 )
90* ..
91* .. External Subroutines ..
92 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
93 $ blacs_gridexit, blacs_gridinfo, blacs_gridinit,
94 $ blacs_pinfo, descinit, igsum2d, pschekpad,
95 $ psfillpad, psgemm, pslahqr, pslaset, psmatgen,
97 $ sltimer
98* ..
99* .. External Functions ..
100 INTEGER ilcm, numroc
101 REAL pslamch, pslange, pslanhs
102 EXTERNAL ilcm, numroc, pslamch, pslange, pslanhs
103* ..
104* .. Intrinsic Functions ..
105 INTRINSIC dble, max, min, real
106* ..
107* .. Data statements ..
108 DATA kfail, kpass, kskip, ktests / 4*0 /
109* ..
110* .. Executable Statements ..
111*
112* Get starting information
113*
114 CALL blacs_pinfo( iam, nprocs )
115 iaseed = 100
116 CALL psnepinfo( outfile, nout, nmat, nval, ntests, nnb, nbval,
117 $ ntests, ngrids, pval, ntests, qval, ntests,
118 $ thresh, mem, iam, nprocs )
119 check = ( thresh.GE.0.0e+0 )
120*
121* Print headings
122*
123 IF( iam.EQ.0 ) THEN
124 WRITE( nout, fmt = * )
125 WRITE( nout, fmt = 9995 )
126 WRITE( nout, fmt = 9994 )
127 WRITE( nout, fmt = * )
128 END IF
129*
130* Loop over different process grids
131*
132 DO 30 i = 1, ngrids
133*
134 nprow = pval( i )
135 npcol = qval( i )
136*
137* Make sure grid information is correct
138*
139 ierr( 1 ) = 0
140 IF( nprow.LT.1 ) THEN
141 IF( iam.EQ.0 )
142 $ WRITE( nout, fmt = 9999 )'GRID', 'nprow', nprow
143 ierr( 1 ) = 1
144 ELSE IF( npcol.LT.1 ) THEN
145 IF( iam.EQ.0 )
146 $ WRITE( nout, fmt = 9999 )'GRID', 'npcol', npcol
147 ierr( 1 ) = 1
148 ELSE IF( nprow*npcol.GT.nprocs ) THEN
149 IF( iam.EQ.0 )
150 $ WRITE( nout, fmt = 9998 )nprow*npcol, nprocs
151 ierr( 1 ) = 1
152 END IF
153*
154 IF( ierr( 1 ).GT.0 ) THEN
155 IF( iam.EQ.0 )
156 $ WRITE( nout, fmt = 9997 )'grid'
157 kskip = kskip + 1
158 GO TO 30
159 END IF
160*
161* Define process grid
162*
163 CALL blacs_get( -1, 0, ictxt )
164 CALL blacs_gridinit( ictxt, 'Row-major', nprow, npcol )
165 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
166*
167* Go to bottom of process grid loop if this case doesn't use my
168* process
169*
170 IF( myrow.GE.nprow .OR. mycol.GE.npcol )
171 $ GO TO 30
172*
173 DO 20 j = 1, nmat
174*
175 n = nval( j )
176*
177* Make sure matrix information is correct
178*
179 ierr( 1 ) = 0
180 IF( n.LT.1 ) THEN
181 IF( iam.EQ.0 )
182 $ WRITE( nout, fmt = 9999 )'MATRIX', 'N', n
183 ierr( 1 ) = 1
184 END IF
185*
186* Check all processes for an error
187*
188 CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
189*
190 IF( ierr( 1 ).GT.0 ) THEN
191 IF( iam.EQ.0 )
192 $ WRITE( nout, fmt = 9997 )'matrix'
193 kskip = kskip + 1
194 GO TO 20
195 END IF
196*
197 DO 10 k = 1, nnb
198*
199 nb = nbval( k )
200*
201* Make sure nb is legal
202*
203 ierr( 1 ) = 0
204 IF( nb.LT.6 ) THEN
205 ierr( 1 ) = 1
206 IF( iam.EQ.0 )
207 $ WRITE( nout, fmt = 9999 )'NB', 'NB', nb
208 END IF
209*
210* Check all processes for an error
211*
212 CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
213*
214 IF( ierr( 1 ).GT.0 ) THEN
215 IF( iam.EQ.0 )
216 $ WRITE( nout, fmt = 9997 )'NB'
217 kskip = kskip + 1
218 GO TO 10
219 END IF
220*
221* Padding constants
222*
223 np = numroc( n, nb, myrow, 0, nprow )
224 nq = numroc( n, nb, mycol, 0, npcol )
225 IF( check ) THEN
226 iprepad = max( nb, np )
227 imidpad = nb
228 ipostpad = max( nb, nq )
229 iprepad = iprepad + 1000
230 imidpad = imidpad + 1000
231 ipostpad = ipostpad + 1000
232 ELSE
233 iprepad = 0
234 imidpad = 0
235 ipostpad = 0
236 END IF
237*
238* Initialize the array descriptor for the matrix A
239*
240 CALL descinit( desca, n, n, nb, nb, 0, 0, ictxt,
241 $ max( 1, np )+imidpad, ierr( 1 ) )
242*
243* Initialize the array descriptor for the matrix Z
244*
245 CALL descinit( descz, n, n, nb, nb, 0, 0, ictxt,
246 $ max( 1, np )+imidpad, ierr( 2 ) )
247*
248 lda = desca( lld_ )
249 ldz = descz( lld_ )
250*
251* Check all processes for an error
252*
253 CALL igsum2d( ictxt, 'All', ' ', 2, 1, ierr, 2, -1, 0 )
254*
255 IF( ierr( 1 ).LT.0 .OR. ierr( 2 ).LT.0 ) THEN
256 IF( iam.EQ.0 )
257 $ WRITE( nout, fmt = 9997 )'descriptor'
258 kskip = kskip + 1
259 GO TO 10
260 END IF
261*
262* Assign pointers into MEM for SCALAPACK arrays, A is
263* allocated starting at position MEM( IPREPAD+1 )
264*
265 ipa = iprepad + 1
266 ipz = ipa + desca( lld_ )*nq + ipostpad + iprepad
267 ipwr = ipz + descz( lld_ )*nq + ipostpad + iprepad
268 ipwi = ipwr + n + ipostpad + iprepad
269 ipw = ipwi + n + ipostpad + iprepad
270 iii = n / nb
271 IF( iii*nb.LT.n )
272 $ iii = iii + 1
273 iii = 7*iii / ilcm( nprow, npcol )
274*
275*
276 lwork = 3*n + max( 2*max( lda, ldz )+2*nq, iii )
277 lwork = lwork + max(2*n, (8*ilcm(nprow,npcol)+2)**2 )
278*
279 IF( check ) THEN
280*
281* Figure the amount of workspace required by the
282* checking routines PSNEPFCHK and PSLANHS
283*
284 worksiz = lwork + max( np*desca( nb_ ),
285 $ desca( mb_ )*nq ) + ipostpad
286*
287 ELSE
288*
289 worksiz = lwork + ipostpad
290*
291 END IF
292*
293* Check for adequate memory for problem size
294*
295 ierr( 1 ) = 0
296 IF( ipw+worksiz.GT.memsiz ) THEN
297 IF( iam.EQ.0 )
298 $ WRITE( nout, fmt = 9996 )'Schur reduction',
299 $ ( ipw+worksiz )*realsz
300 ierr( 1 ) = 1
301 END IF
302*
303* Check all processes for an error
304*
305 CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
306*
307 IF( ierr( 1 ).GT.0 ) THEN
308 IF( iam.EQ.0 )
309 $ WRITE( nout, fmt = 9997 )'MEMORY'
310 kskip = kskip + 1
311 GO TO 10
312 END IF
313*
314* Generate matrix Z = In
315*
316 CALL pslaset( 'All', n, n, zero, one, mem( ipz ), 1, 1,
317 $ descz )
318*
319* Generate matrix A upper Hessenberg
320*
321 CALL psmatgen( ictxt, 'No transpose', 'No transpose',
322 $ desca( m_ ), desca( n_ ), desca( mb_ ),
323 $ desca( nb_ ), mem( ipa ), desca( lld_ ),
324 $ desca( rsrc_ ), desca( csrc_ ), iaseed, 0,
325 $ np, 0, nq, myrow, mycol, nprow, npcol )
326 CALL pslaset( 'Lower', max( 0, n-2 ), max( 0, n-2 ),
327 $ zero, zero, mem( ipa ), min( n, 3 ), 1,
328 $ desca )
329*
330* Calculate inf-norm of A for residual error-checking
331*
332 IF( check ) THEN
333 CALL psfillpad( ictxt, np, nq, mem( ipa-iprepad ),
334 $ desca( lld_ ), iprepad, ipostpad,
335 $ padval )
336 CALL psfillpad( ictxt, np, nq, mem( ipz-iprepad ),
337 $ descz( lld_ ), iprepad, ipostpad,
338 $ padval )
339 CALL psfillpad( ictxt, worksiz-ipostpad, 1,
340 $ mem( ipw-iprepad ), worksiz-ipostpad,
341 $ iprepad, ipostpad, padval )
342 anorm = pslanhs( 'I', n, mem( ipa ), 1, 1, desca,
343 $ mem( ipw ) )
344 CALL pschekpad( ictxt, 'PSLANHS', np, nq,
345 $ mem( ipa-iprepad ), desca( lld_ ),
346 $ iprepad, ipostpad, padval )
347 CALL pschekpad( ictxt, 'PSLANHS', worksiz-ipostpad, 1,
348 $ mem( ipw-iprepad ), worksiz-ipostpad,
349 $ iprepad, ipostpad, padval )
350*
351 CALL psfillpad( ictxt, n, 1, mem( ipwr-iprepad ), n,
352 $ iprepad, ipostpad, padval )
353 CALL psfillpad( ictxt, n, 1, mem( ipwi-iprepad ), n,
354 $ iprepad, ipostpad, padval )
355 CALL psfillpad( ictxt, lwork, 1, mem( ipw-iprepad ),
356 $ lwork, iprepad, ipostpad, padval )
357*
358 END IF
359*
360 CALL slboot( )
361 CALL blacs_barrier( ictxt, 'All' )
362 CALL sltimer( 1 )
363*
364* Perform NEP factorization
365*
366 CALL pslahqr( .true., .true., n, 1, n, mem( ipa ), desca,
367 $ mem( ipwr ), mem( ipwi ), 1, n, mem( ipz ),
368 $ descz, mem( ipw ), lwork, idum, 0, info )
369*
370 CALL sltimer( 1 )
371*
372 IF( info.NE.0 ) THEN
373 IF( iam.EQ.0 )
374 $ WRITE( nout, fmt = * )'PSLAHQR INFO=', info
375 kfail = kfail + 1
376 GO TO 10
377 END IF
378*
379 IF( check ) THEN
380*
381* Check for memory overwrite in NEP factorization
382*
383 CALL pschekpad( ictxt, 'PSLAHQR (A)', np, nq,
384 $ mem( ipa-iprepad ), desca( lld_ ),
385 $ iprepad, ipostpad, padval )
386 CALL pschekpad( ictxt, 'PSLAHQR (Z)', np, nq,
387 $ mem( ipz-iprepad ), descz( lld_ ),
388 $ iprepad, ipostpad, padval )
389 CALL pschekpad( ictxt, 'PSLAHQR (WR)', n, 1,
390 $ mem( ipwr-iprepad ), n, iprepad,
391 $ ipostpad, padval )
392 CALL pschekpad( ictxt, 'PSLAHQR (WI)', n, 1,
393 $ mem( ipwi-iprepad ), n, iprepad,
394 $ ipostpad, padval )
395 CALL pschekpad( ictxt, 'PSLAHQR (WORK)', lwork, 1,
396 $ mem( ipw-iprepad ), lwork, iprepad,
397 $ ipostpad, padval )
398*
399 CALL psfillpad( ictxt, worksiz-ipostpad, 1,
400 $ mem( ipw-iprepad ), worksiz-ipostpad,
401 $ iprepad, ipostpad, padval )
402*
403* Compute || Z * H * Z**T - H0 || / ( N*|| H0 ||*EPS )
404*
405 CALL psnepfchk( n, mem( ipa ), 1, 1, desca, iaseed,
406 $ mem( ipz ), 1, 1, descz, anorm,
407 $ fresid, mem( ipw ) )
408*
409 CALL pschekpad( ictxt, 'PSNEPFCHK (A)', np, nq,
410 $ mem( ipa-iprepad ), desca( lld_ ),
411 $ iprepad, ipostpad, padval )
412 CALL pschekpad( ictxt, 'PSNEPFCHK (Z)', np, nq,
413 $ mem( ipz-iprepad ), descz( lld_ ),
414 $ iprepad, ipostpad, padval )
415 CALL pschekpad( ictxt, 'PSNEPFCHK (WORK)',
416 $ worksiz-ipostpad, 1,
417 $ mem( ipw-iprepad ), worksiz-ipostpad,
418 $ iprepad, ipostpad, padval )
419*
420* Compute || (Z**T)*Z - In ||_1
421*
422 CALL pslaset( 'All', n, n, zero, one, mem( ipa ), 1,
423 $ 1, desca )
424 CALL psgemm( 'Transpose', 'No transpose', n, n, n,
425 $ -one, mem( ipz ), 1, 1, descz,
426 $ mem( ipz ), 1, 1, descz, one, mem( ipa ),
427 $ 1, 1, desca )
428 znorm = pslange( '1', n, n, mem( ipa ), 1, 1, desca,
429 $ mem( ipw ) )
430 qresid = znorm / ( real( n )*pslamch( ictxt, 'P' ) )
431*
432* Test residual and detect NaN result
433*
434 IF( ( fresid.LE.thresh ) .AND.
435 $ ( ( fresid-fresid ).EQ.0.0e+0 ) .AND.
436 $ ( qresid.LE.thresh ) .AND.
437 $ ( ( qresid-qresid ).EQ.0.0e+0 ) ) THEN
438 kpass = kpass + 1
439 passed = 'PASSED'
440 ELSE
441 kfail = kfail + 1
442 passed = 'FAILED'
443 IF( iam.EQ.0 ) THEN
444 WRITE( nout, fmt = 9986 )fresid
445 WRITE( nout, fmt = 9985 )qresid
446 END IF
447 END IF
448*
449 ELSE
450*
451* Don't perform the checking, only timing
452*
453 kpass = kpass + 1
454 fresid = fresid - fresid
455 qresid = qresid - qresid
456 passed = 'BYPASS'
457*
458 END IF
459*
460* Gather maximum of all CPU and WALL clock timings
461*
462 CALL slcombine( ictxt, 'All', '>', 'W', 1, 1, wtime )
463 CALL slcombine( ictxt, 'All', '>', 'C', 1, 1, ctime )
464*
465* Print results
466*
467 IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
468*
469* 18 N^3 flops for PxLAHQR
470*
471 nops = 18.0d+0*dble( n )**3
472*
473* Calculate total megaflops -- factorization only,
474* -- for WALL and CPU time, and print output
475*
476* Print WALL time if machine supports it
477*
478 IF( wtime( 1 ).GT.0.0d+0 ) THEN
479 tmflops = nops / ( wtime( 1 )*1.0d+6 )
480 ELSE
481 tmflops = 0.0d+0
482 END IF
483 IF( wtime( 1 ).GE.0.0d+0 )
484 $ WRITE( nout, fmt = 9993 )'WALL', n, nb, nprow,
485 $ npcol, wtime( 1 ), tmflops, passed
486*
487* Print CPU time if machine supports it
488*
489 IF( ctime( 1 ).GT.0.0d+0 ) THEN
490 tmflops = nops / ( ctime( 1 )*1.0d+6 )
491 ELSE
492 tmflops = 0.0d+0
493 END IF
494*
495 IF( ctime( 1 ).GE.0.0d+0 )
496 $ WRITE( nout, fmt = 9993 )'CPU ', n, nb, nprow,
497 $ npcol, ctime( 1 ), tmflops, passed
498 END IF
499*
500 10 CONTINUE
501*
502 20 CONTINUE
503*
504 CALL blacs_gridexit( ictxt )
505*
506 30 CONTINUE
507*
508* Print ending messages and close output file
509*
510 IF( iam.EQ.0 ) THEN
511 ktests = kpass + kfail + kskip
512 WRITE( nout, fmt = * )
513 WRITE( nout, fmt = 9992 )ktests
514 IF( check ) THEN
515 WRITE( nout, fmt = 9991 )kpass
516 WRITE( nout, fmt = 9989 )kfail
517 ELSE
518 WRITE( nout, fmt = 9990 )kpass
519 END IF
520 WRITE( nout, fmt = 9988 )kskip
521 WRITE( nout, fmt = * )
522 WRITE( nout, fmt = * )
523 WRITE( nout, fmt = 9987 )
524 IF( nout.NE.6 .AND. nout.NE.0 )
525 $ CLOSE ( nout )
526 END IF
527*
528 CALL blacs_exit( 0 )
529*
530 9999 FORMAT( 'ILLEGAL ', a6, ': ', a5, ' = ', i3,
531 $ '; It should be at least 1' )
532 9998 FORMAT( 'ILLEGAL GRID: nprow*npcol = ', i4, '. It can be at most',
533 $ i4 )
534 9997 FORMAT( 'Bad ', a6, ' parameters: going on to next test case.' )
535 9996 FORMAT( 'Unable to perform ', a, ': need TOTMEM of at least',
536 $ i11 )
537 9995 FORMAT( 'TIME N NB P Q NEP Time MFLOPS CHECK' )
538 9994 FORMAT( '---- ----- --- ---- ---- -------- -------- ------' )
539 9993 FORMAT( a4, 1x, i5, 1x, i3, 1x, i4, 1x, i4, 1x, f8.2, 1x, f8.2,
540 $ 1x, a6 )
541 9992 FORMAT( 'Finished ', i6, ' tests, with the following results:' )
542 9991 FORMAT( i5, ' tests completed and passed residual checks.' )
543 9990 FORMAT( i5, ' tests completed without checking.' )
544 9989 FORMAT( i5, ' tests completed and failed residual checks.' )
545 9988 FORMAT( i5, ' tests skipped because of illegal input values.' )
546 9987 FORMAT( 'END OF TESTS.' )
547 9986 FORMAT( '||H - Q*S*Q^T|| / (||H|| * N * eps) = ', g25.7 )
548 9985 FORMAT( '||Q^T*Q - I|| / ( N * eps ) ', g25.7 )
549*
550 stop
551*
552* End of PSNEPDRIVER
553*
554 END
subroutine psmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
Definition psmatgen.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
real function pslamch(ictxt, cmach)
Definition pcblastst.f:7455
#define max(A, B)
Definition pcgemr.c:180
#define min(A, B)
Definition pcgemr.c:181
subroutine pslaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
Definition psblastst.f:6863
subroutine pschekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
Definition pschekpad.f:3
subroutine psfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
Definition psfillpad.f:2
subroutine pslahqr(wantt, wantz, n, ilo, ihi, a, desca, wr, wi, iloz, ihiz, z, descz, work, lwork, iwork, ilwork, info)
Definition pslahqr.f:4
real function pslange(norm, m, n, a, ia, ja, desca, work)
Definition pslange.f:3
real function pslanhs(norm, n, a, ia, ja, desca, work)
Definition pslanhs.f:3
program psnepdriver
Definition psnepdriver.f:1
subroutine psnepfchk(n, a, ia, ja, desca, iaseed, z, iz, jz, descz, anorm, fresid, work)
Definition psnepfchk.f:3
subroutine psnepinfo(summry, nout, nmat, nval, ldnval, nnb, nbval, ldnbval, ngrids, pval, ldpval, qval, ldqval, thresh, work, iam, nprocs)
Definition psnepinfo.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