OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
pdnepdriver.f
Go to the documentation of this file.
1 PROGRAM pdnepdriver
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* PDNEPDRIVER is the main test program for the DOUBLE PRECISION
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* DBLESZ INTEGER, default = 8 bytes.
47* DBLESZ indicate the length in bytes on the given platform
48* for a double precision real.
49* MEM DOUBLE PRECISION array, dimension ( TOTMEM / DBLESZ )
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 dblesz, totmem, memsiz, ntests
65 DOUBLE PRECISION padval, zero, one
66 parameter( dblesz = 8, totmem = 2000000,
67 $ memsiz = totmem / dblesz, ntests = 20,
68 $ padval = -9923.0d+0, zero = 0.0d+0,
69 $ one = 1.0d+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 DOUBLE PRECISION anorm, fresid, nops, qresid, tmflops, ZNORM
82* ..
83* .. Local Arrays ..
84 INTEGER desca( dlen_ ), descz( dlen_ ), ierr( 2 ),
85 $ idum( 1 ), nbval( ntests ), nval( NTESTS ),
86 $ pval( ntests ), qval( ntests )
87 DOUBLE PRECISION ctime( 1 ), mem( memsiz ), wtime( 1 )
88* ..
89* .. External Subroutines ..
90 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
92 $ blacs_pinfo, descinit, igsum2d, pdchekpad,
93 $ pdfillpad, pdgemm, pdlahqr, pdlaset, pdmatgen,
95 $ sltimer
96* ..
97* .. External Functions ..
98 INTEGER ilcm, numroc
99 DOUBLE PRECISION pdlamch, pdlange, pdlanhs
100 EXTERNAL ilcm, numroc, pdlamch, pdlange, pdlanhs
101* ..
102* .. Intrinsic Functions ..
103 INTRINSIC dble, max, min
104* ..
105* .. Data statements ..
106 DATA kfail, kpass, kskip, ktests / 4*0 /
107* ..
108* .. Executable Statements ..
109*
110* Get starting information
111*
112 CALL blacs_pinfo( iam, nprocs )
113 iaseed = 100
114 CALL pdnepinfo( outfile, nout, nmat, nval, ntests, nnb, nbval,
115 $ ntests, ngrids, pval, ntests, qval, ntests,
116 $ thresh, mem, iam, nprocs )
117 check = ( thresh.GE.0.0e+0 )
118*
119* Print headings
120*
121 IF( iam.EQ.0 ) THEN
122 WRITE( nout, fmt = * )
123 WRITE( nout, fmt = 9995 )
124 WRITE( nout, fmt = 9994 )
125 WRITE( nout, fmt = * )
126 END IF
127*
128* Loop over different process grids
129*
130 DO 30 i = 1, ngrids
131*
132 nprow = pval( i )
133 npcol = qval( i )
134*
135* Make sure grid information is correct
136*
137 ierr( 1 ) = 0
138 IF( nprow.LT.1 ) THEN
139 IF( iam.EQ.0 )
140 $ WRITE( nout, fmt = 9999 )'GRID', 'nprow', nprow
141 ierr( 1 ) = 1
142 ELSE IF( npcol.LT.1 ) THEN
143 IF( iam.EQ.0 )
144 $ WRITE( nout, fmt = 9999 )'GRID', 'npcol', npcol
145 ierr( 1 ) = 1
146 ELSE IF( nprow*npcol.GT.nprocs ) THEN
147 IF( iam.EQ.0 )
148 $ WRITE( nout, fmt = 9998 )nprow*npcol, nprocs
149 ierr( 1 ) = 1
150 END IF
151*
152 IF( ierr( 1 ).GT.0 ) THEN
153 IF( iam.EQ.0 )
154 $ WRITE( nout, fmt = 9997 )'grid'
155 kskip = kskip + 1
156 GO TO 30
157 END IF
158*
159* Define process grid
160*
161 CALL blacs_get( -1, 0, ictxt )
162 CALL blacs_gridinit( ictxt, 'Row-major', nprow, npcol )
163 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
164*
165* Go to bottom of process grid loop if this case doesn't use my
166* process
167*
168 IF( myrow.GE.nprow .OR. mycol.GE.npcol )
169 $ GO TO 30
170*
171 DO 20 j = 1, nmat
172*
173 n = nval( j )
174*
175* Make sure matrix information is correct
176*
177 ierr( 1 ) = 0
178 IF( n.LT.1 ) THEN
179 IF( iam.EQ.0 )
180 $ WRITE( nout, fmt = 9999 )'MATRIX', 'N', n
181 ierr( 1 ) = 1
182 END IF
183*
184* Check all processes for an error
185*
186 CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
187*
188 IF( ierr( 1 ).GT.0 ) THEN
189 IF( iam.EQ.0 )
190 $ WRITE( nout, fmt = 9997 )'matrix'
191 kskip = kskip + 1
192 GO TO 20
193 END IF
194*
195 DO 10 k = 1, nnb
196*
197 nb = nbval( k )
198*
199* Make sure nb is legal
200*
201 ierr( 1 ) = 0
202 IF( nb.LT.6 ) THEN
203 ierr( 1 ) = 1
204 IF( iam.EQ.0 )
205 $ WRITE( nout, fmt = 9999 )'NB', 'NB', nb
206 END IF
207*
208* Check all processes for an error
209*
210 CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
211*
212 IF( ierr( 1 ).GT.0 ) THEN
213 IF( iam.EQ.0 )
214 $ WRITE( nout, fmt = 9997 )'NB'
215 kskip = kskip + 1
216 GO TO 10
217 END IF
218*
219* Padding constants
220*
221 np = numroc( n, nb, myrow, 0, nprow )
222 nq = numroc( n, nb, mycol, 0, npcol )
223 IF( check ) THEN
224 iprepad = max( nb, np )
225 imidpad = nb
226 ipostpad = max( nb, nq )
227 iprepad = iprepad + 1000
228 imidpad = imidpad + 1000
229 ipostpad = ipostpad + 1000
230 ELSE
231 iprepad = 0
232 imidpad = 0
233 ipostpad = 0
234 END IF
235*
236* Initialize the array descriptor for the matrix A
237*
238 CALL descinit( desca, n, n, nb, nb, 0, 0, ictxt,
239 $ max( 1, np )+imidpad, ierr( 1 ) )
240*
241* Initialize the array descriptor for the matrix Z
242*
243 CALL descinit( descz, n, n, nb, nb, 0, 0, ictxt,
244 $ max( 1, np )+imidpad, ierr( 2 ) )
245*
246 lda = desca( lld_ )
247 ldz = descz( lld_ )
248*
249* Check all processes for an error
250*
251 CALL igsum2d( ictxt, 'All', ' ', 2, 1, ierr, 2, -1, 0 )
252*
253 IF( ierr( 1 ).LT.0 .OR. ierr( 2 ).LT.0 ) THEN
254 IF( iam.EQ.0 )
255 $ WRITE( nout, fmt = 9997 )'descriptor'
256 kskip = kskip + 1
257 GO TO 10
258 END IF
259*
260* Assign pointers into MEM for SCALAPACK arrays, A is
261* allocated starting at position MEM( IPREPAD+1 )
262*
263 ipa = iprepad + 1
264 ipz = ipa + desca( lld_ )*nq + ipostpad + iprepad
265 ipwr = ipz + descz( lld_ )*nq + ipostpad + iprepad
266 ipwi = ipwr + n + ipostpad + iprepad
267 ipw = ipwi + n + ipostpad + iprepad
268 iii = n / nb
269 IF( iii*nb.LT.n )
270 $ iii = iii + 1
271 iii = 7*iii / ilcm( nprow, npcol )
272*
273*
274 lwork = 3*n + max( 2*max( lda, ldz )+2*nq, iii )
275 lwork = lwork + max(2*n, (8*ilcm(nprow,npcol)+2)**2 )
276*
277 IF( check ) THEN
278*
279* Figure the amount of workspace required by the
280* checking routines PDNEPFCHK and PDLANHS
281*
282 worksiz = lwork + max( np*desca( nb_ ),
283 $ desca( mb_ )*nq ) + ipostpad
284*
285 ELSE
286*
287 worksiz = lwork + ipostpad
288*
289 END IF
290*
291* Check for adequate memory for problem size
292*
293 ierr( 1 ) = 0
294 IF( ipw+worksiz.GT.memsiz ) THEN
295 IF( iam.EQ.0 )
296 $ WRITE( nout, fmt = 9996 )'Schur reduction',
297 $ ( ipw+worksiz )*dblesz
298 ierr( 1 ) = 1
299 END IF
300*
301* Check all processes for an error
302*
303 CALL igsum2d( ictxt, 'All', ' ', 1, 1, ierr, 1, -1, 0 )
304*
305 IF( ierr( 1 ).GT.0 ) THEN
306 IF( iam.EQ.0 )
307 $ WRITE( nout, fmt = 9997 )'memory'
308 KSKIP = KSKIP + 1
309 GO TO 10
310 END IF
311*
312* Generate matrix Z = In
313*
314 CALL PDLASET( 'all', N, N, ZERO, ONE, MEM( IPZ ), 1, 1,
315 $ DESCZ )
316*
317* Generate matrix A upper Hessenberg
318*
319 CALL PDMATGEN( ICTXT, 'no transpose', 'no transpose',
320 $ DESCA( M_ ), DESCA( N_ ), DESCA( MB_ ),
321 $ DESCA( NB_ ), MEM( IPA ), DESCA( LLD_ ),
322 $ DESCA( RSRC_ ), DESCA( CSRC_ ), IASEED, 0,
323 $ NP, 0, NQ, MYROW, MYCOL, NPROW, NPCOL )
324 CALL PDLASET( 'lower', MAX( 0, N-2 ), MAX( 0, N-2 ),
325 $ ZERO, ZERO, MEM( IPA ), MIN( N, 3 ), 1,
326 $ DESCA )
327*
328* Calculate inf-norm of A for residual error-checking
329*
330 IF( CHECK ) THEN
331 CALL PDFILLPAD( ICTXT, NP, NQ, MEM( IPA-IPREPAD ),
332 $ DESCA( LLD_ ), IPREPAD, IPOSTPAD,
333 $ PADVAL )
334 CALL PDFILLPAD( ICTXT, NP, NQ, MEM( IPZ-IPREPAD ),
335 $ DESCZ( LLD_ ), IPREPAD, IPOSTPAD,
336 $ PADVAL )
337 CALL PDFILLPAD( ICTXT, WORKSIZ-IPOSTPAD, 1,
338 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
339 $ IPREPAD, IPOSTPAD, PADVAL )
340 ANORM = PDLANHS( 'i', N, MEM( IPA ), 1, 1, DESCA,
341 $ MEM( IPW ) )
342 CALL PDCHEKPAD( ICTXT, 'pdlanhs', NP, NQ,
343 $ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
344 $ IPREPAD, IPOSTPAD, PADVAL )
345 CALL PDCHEKPAD( ICTXT, 'pdlanhs', WORKSIZ-IPOSTPAD, 1,
346 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
347 $ IPREPAD, IPOSTPAD, PADVAL )
348*
349 CALL PDFILLPAD( ICTXT, N, 1, MEM( IPWR-IPREPAD ), N,
350 $ IPREPAD, IPOSTPAD, PADVAL )
351 CALL PDFILLPAD( ICTXT, N, 1, MEM( IPWI-IPREPAD ), N,
352 $ IPREPAD, IPOSTPAD, PADVAL )
353 CALL PDFILLPAD( ICTXT, LWORK, 1, MEM( IPW-IPREPAD ),
354 $ LWORK, IPREPAD, IPOSTPAD, PADVAL )
355*
356 END IF
357*
358 CALL SLBOOT( )
359 CALL BLACS_BARRIER( ICTXT, 'all' )
360 CALL SLTIMER( 1 )
361*
362* Perform NEP factorization
363*
364 CALL PDLAHQR( .TRUE., .TRUE., N, 1, N, MEM( IPA ), DESCA,
365 $ MEM( IPWR ), MEM( IPWI ), 1, N, MEM( IPZ ),
366 $ DESCZ, MEM( IPW ), LWORK, IDUM, 0, INFO )
367*
368 CALL SLTIMER( 1 )
369*
370.NE. IF( INFO0 ) THEN
371.EQ. IF( IAM0 )
372 $ WRITE( NOUT, FMT = * )'pdlahqr info=', INFO
373 KFAIL = KFAIL + 1
374 GO TO 10
375 END IF
376*
377 IF( CHECK ) THEN
378*
379* Check for memory overwrite in NEP factorization
380*
381 CALL PDCHEKPAD( ICTXT, 'pdlahqr(a)', NP, NQ,
382 $ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
383 $ IPREPAD, IPOSTPAD, PADVAL )
384 CALL PDCHEKPAD( ICTXT, 'pdlahqr(z)', NP, NQ,
385 $ MEM( IPZ-IPREPAD ), DESCZ( LLD_ ),
386 $ IPREPAD, IPOSTPAD, PADVAL )
387 CALL PDCHEKPAD( ICTXT, 'pdlahqr(wr)', N, 1,
388 $ MEM( IPWR-IPREPAD ), N, IPREPAD,
389 $ IPOSTPAD, PADVAL )
390 CALL PDCHEKPAD( ICTXT, 'pdlahqr(wi)', N, 1,
391 $ MEM( IPWI-IPREPAD ), N, IPREPAD,
392 $ IPOSTPAD, PADVAL )
393 CALL PDCHEKPAD( ICTXT, 'pdlahqr(work)', LWORK, 1,
394 $ MEM( IPW-IPREPAD ), LWORK, IPREPAD,
395 $ IPOSTPAD, PADVAL )
396*
397 CALL PDFILLPAD( ICTXT, WORKSIZ-IPOSTPAD, 1,
398 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
399 $ IPREPAD, IPOSTPAD, PADVAL )
400*
401* Compute || Z * H * Z**T - H0 || / ( N*|| H0 ||*EPS )
402*
403 CALL PDNEPFCHK( N, MEM( IPA ), 1, 1, DESCA, IASEED,
404 $ MEM( IPZ ), 1, 1, DESCZ, ANORM,
405 $ FRESID, MEM( IPW ) )
406*
407 CALL PDCHEKPAD( ICTXT, 'pdnepfchk(a)', NP, NQ,
408 $ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
409 $ IPREPAD, IPOSTPAD, PADVAL )
410 CALL PDCHEKPAD( ICTXT, 'pdnepfchk (z)', NP, NQ,
411 $ MEM( IPZ-IPREPAD ), DESCZ( LLD_ ),
412 $ IPREPAD, IPOSTPAD, PADVAL )
413 CALL PDCHEKPAD( ICTXT, 'pdnepfchk(work)',
414 $ WORKSIZ-IPOSTPAD, 1,
415 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
416 $ IPREPAD, IPOSTPAD, PADVAL )
417*
418* Compute || (Z**T)*Z - In ||_1
419*
420 CALL PDLASET( 'all', N, N, ZERO, ONE, MEM( IPA ), 1,
421 $ 1, DESCA )
422 CALL PDGEMM( 'transpose', 'no transpose', N, N, N,
423 $ -ONE, MEM( IPZ ), 1, 1, DESCZ,
424 $ MEM( IPZ ), 1, 1, DESCZ, ONE, MEM( IPA ),
425 $ 1, 1, DESCA )
426 ZNORM = PDLANGE( '1', N, N, MEM( IPA ), 1, 1, DESCA,
427 $ MEM( IPW ) )
428 QRESID = ZNORM / ( DBLE( N )*PDLAMCH( ICTXT, 'p' ) )
429*
430* Test residual and detect NaN result
431*
432.LE..AND. IF( ( FRESIDTHRESH )
433.EQ..AND. $ ( ( FRESID-FRESID )0.0D+0 )
434.LE..AND. $ ( QRESIDTHRESH )
435.EQ. $ ( ( QRESID-QRESID )0.0D+0 ) ) THEN
436 KPASS = KPASS + 1
437 PASSED = 'passed'
438 ELSE
439 KFAIL = KFAIL + 1
440 PASSED = 'failed'
441.EQ. IF( IAM0 ) THEN
442 WRITE( NOUT, FMT = 9986 )FRESID
443 WRITE( NOUT, FMT = 9985 )QRESID
444 END IF
445 END IF
446*
447 ELSE
448*
449* Don't perform the checking, only timing
450*
451 KPASS = KPASS + 1
452 FRESID = FRESID - FRESID
453 QRESID = QRESID - QRESID
454 PASSED = 'bypass'
455*
456 END IF
457*
458* Gather maximum of all CPU and WALL clock timings
459*
460 CALL SLCOMBINE( ICTXT, 'all', '>', 'w', 1, 1, WTIME )
461 CALL SLCOMBINE( ICTXT, 'all', '>', 'c', 1, 1, CTIME )
462*
463* Print results
464*
465.EQ..AND..EQ. IF( MYROW0 MYCOL0 ) THEN
466*
467* 18 N^3 flops for PxLAHQR
468*
469 NOPS = 18.0D+0*DBLE( N )**3
470*
471* Calculate total megaflops -- factorization only,
472* -- for WALL and CPU time, and print output
473*
474* Print WALL time if machine supports it
475*
476.GT. IF( WTIME( 1 )0.0D+0 ) THEN
477 TMFLOPS = NOPS / ( WTIME( 1 )*1.0D+6 )
478 ELSE
479 TMFLOPS = 0.0D+0
480 END IF
481.GE. IF( WTIME( 1 )0.0D+0 )
482 $ WRITE( NOUT, FMT = 9993 )'wall', N, NB, NPROW,
483 $ NPCOL, WTIME( 1 ), TMFLOPS, PASSED
484*
485* Print CPU time if machine supports it
486*
487.GT. IF( CTIME( 1 )0.0D+0 ) THEN
488 TMFLOPS = NOPS / ( CTIME( 1 )*1.0D+6 )
489 ELSE
490 TMFLOPS = 0.0D+0
491 END IF
492*
493.GE. IF( CTIME( 1 )0.0D+0 )
494 $ WRITE( NOUT, FMT = 9993 )'cpu ', N, NB, NPROW,
495 $ NPCOL, CTIME( 1 ), TMFLOPS, PASSED
496 END IF
497*
498 10 CONTINUE
499*
500 20 CONTINUE
501*
502 CALL BLACS_GRIDEXIT( ICTXT )
503*
504 30 CONTINUE
505*
506* Print ending messages and close output file
507*
508.EQ. IF( IAM0 ) THEN
509 KTESTS = KPASS + KFAIL + KSKIP
510 WRITE( NOUT, FMT = * )
511 WRITE( NOUT, FMT = 9992 )KTESTS
512 IF( CHECK ) THEN
513 WRITE( NOUT, FMT = 9991 )KPASS
514 WRITE( NOUT, FMT = 9989 )KFAIL
515 ELSE
516 WRITE( NOUT, FMT = 9990 )KPASS
517 END IF
518 WRITE( NOUT, FMT = 9988 )KSKIP
519 WRITE( NOUT, FMT = * )
520 WRITE( NOUT, FMT = * )
521 WRITE( NOUT, FMT = 9987 )
522.NE..AND..NE. IF( NOUT6 NOUT0 )
523 $ CLOSE ( NOUT )
524 END IF
525*
526 CALL BLACS_EXIT( 0 )
527*
528 9999 FORMAT( 'illegal ', A6, ': ', A5, ' = ', I3,
529 $ '; it should be at least 1' )
530 9998 FORMAT( 'illegal grid: nprow*npcol = ', I4, '. it can be at most',
531 $ I4 )
532 9997 FORMAT( 'bad ', A6, ' parameters: going on to next test case.' )
533 9996 FORMAT( 'unable to perform ', A, ': need totmem of at least',
534 $ I11 )
535 9995 FORMAT( 'time n nb p q nep time mflops check' )
536 9994 FORMAT( '---- ----- --- ---- ---- -------- -------- ------' )
537 9993 FORMAT( A4, 1X, I5, 1X, I3, 1X, I4, 1X, I4, 1X, F8.2, 1X, F8.2,
538 $ 1X, A6 )
539 9992 FORMAT( 'finished ', I6, ' tests, with the following results:' )
540 9991 FORMAT( I5, ' tests completed and passed residual checks.' )
541 9990 FORMAT( I5, ' tests completed without checking.' )
542 9989 FORMAT( I5, ' tests completed and failed residual checks.' )
543 9988 FORMAT( I5, ' tests skipped because of illegal input values.' )
544 9987 FORMAT( 'END OF TESTS.' )
545 9986 FORMAT( '||H - Q*S*Q^T|| / (||H|| * N * eps) = ', G25.7 )
546 9985 FORMAT( '||Q^T*Q - I|| / ( N * eps ) ', G25.7 )
547*
548 STOP
549*
550* End of PDNEPDRIVER
551*
552 END
subroutine pdmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
Definition pdmatgen.f:4
end diagonal values have been computed in the(sparse) matrix id.SOL
integer function ilcm(m, n)
Definition ilcm.f:2
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21
subroutine blacs_gridinit(cntxt, c, nprow, npcol)
Definition mpi.f:745
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
Definition mpi.f:777
subroutine blacs_gridexit(cntxt)
Definition mpi.f:762
double precision function pdlange(norm, m, n, a, ia, ja, desca, work)
Definition mpi.f:1311
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
Definition mpi.f:754
integer function numroc(n, nb, iproc, isrcproc, nprocs)
Definition mpi.f:786
subroutine pdlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
Definition pdblastst.f:6862
double precision function pdlamch(ictxt, cmach)
Definition pdblastst.f:6769
subroutine pdchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
Definition pdchekpad.f:3
subroutine pdfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
Definition pdfillpad.f:2
subroutine pdlahqr(wantt, wantz, n, ilo, ihi, a, desca, wr, wi, iloz, ihiz, z, descz, work, lwork, iwork, ilwork, info)
Definition pdlahqr.f:4
double precision function pdlanhs(norm, n, a, ia, ja, desca, work)
Definition pdlanhs.f:3
program pdnepdriver
Definition pdnepdriver.f:1
subroutine pdnepfchk(n, a, ia, ja, desca, iaseed, z, iz, jz, descz, anorm, fresid, work)
Definition pdnepfchk.f:3
subroutine pdnepinfo(summry, nout, nmat, nval, ldnval, nnb, nbval, ldnbval, ngrids, pval, ldpval, qval, ldqval, thresh, work, iam, nprocs)
Definition pdnepinfo.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