@@ -4,7 +4,7 @@ PROGRAM PCNEPDRIVER
4
4
* University of Tennessee, Knoxville, Oak Ridge National Laboratory,
5
5
* and University of California, Berkeley.
6
6
* March, 2000
7
- * Modifications Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved.
7
+ * Modifications Copyright (c) 2024-2025 Advanced Micro Devices, Inc. All rights reserved.
8
8
*
9
9
* Purpose
10
10
* =======
@@ -61,6 +61,7 @@ PROGRAM PCNEPDRIVER
61
61
*
62
62
* =====================================================================
63
63
*
64
+ use,intrinsic :: ieee_arithmetic
64
65
* .. Parameters ..
65
66
INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DT_,
66
67
$ LLD_, MB_, M_, NB_, N_, RSRC_
@@ -122,6 +123,14 @@ PROGRAM PCNEPDRIVER
122
123
* ..
123
124
* .. Data statements ..
124
125
DATA KFAIL, KPASS, KSKIP, KTESTS / 4 * 0 /
126
+ * Take command-line arguments if requested
127
+ CHARACTER * 80 arg
128
+ INTEGER numArgs, count
129
+ LOGICAL :: help_flag = .FALSE.
130
+ LOGICAL :: EX_FLAG = .FALSE. , RES_FLAG = .FALSE.
131
+ INTEGER :: INF_PERCENT = 0
132
+ INTEGER :: NAN_PERCENT = 0
133
+ DOUBLE PRECISION :: X
125
134
* ..
126
135
* .. Executable Statements ..
127
136
*
@@ -136,6 +145,33 @@ PROGRAM PCNEPDRIVER
136
145
$ NTESTS, NGRIDS, PVAL, NTESTS, QVAL, NTESTS,
137
146
$ THRESH, MEM, IAM, NPROCS )
138
147
CHECK = ( THRESH.GE. 0.0E+0 )
148
+ *
149
+ numArgs = command_argument_count()
150
+ * Process command-line arguments
151
+ do count = 1 , numArgs, 2
152
+ call get_command_argument(count, arg)
153
+ select case (arg)
154
+ case (" -h" , " --help" )
155
+ help_flag = .true.
156
+ exit
157
+ case (" -inf" )
158
+ call get_command_argument(count + 1 , arg)
159
+ read (arg, * ) INF_PERCENT
160
+ IF (INF_PERCENT .GT. 0 ) THEN
161
+ EX_FLAG = .TRUE.
162
+ END IF
163
+ case (" -nan" )
164
+ call get_command_argument(count + 1 , arg)
165
+ read (arg, * ) NAN_PERCENT
166
+ IF (NAN_PERCENT .GT. 0 ) THEN
167
+ EX_FLAG = .TRUE.
168
+ END IF
169
+ case default
170
+ print * , " Invalid option: " , arg
171
+ help_flag = .true.
172
+ exit
173
+ end select
174
+ end do
139
175
*
140
176
* Print headings
141
177
*
@@ -155,6 +191,7 @@ PROGRAM PCNEPDRIVER
155
191
*
156
192
* Make sure grid information is correct
157
193
*
194
+ #ifdef ENABLE_DRIVER_CHECK
158
195
IERR( 1 ) = 0
159
196
IF ( NPROW.LT. 1 ) THEN
160
197
IF ( IAM.EQ. 0 )
@@ -176,6 +213,7 @@ PROGRAM PCNEPDRIVER
176
213
KSKIP = KSKIP + 1
177
214
GO TO 30
178
215
END IF
216
+ #endif
179
217
*
180
218
* Define process grid
181
219
*
@@ -206,6 +244,7 @@ PROGRAM PCNEPDRIVER
206
244
*
207
245
* Check all processes for an error
208
246
*
247
+ #ifdef ENABLE_DRIVER_CHECK
209
248
CALL IGSUM2D( ICTXT, ' All' , ' ' , 1 , 1 , IERR, 1 , - 1 , 0 )
210
249
*
211
250
IF ( IERR( 1 ).GT. 0 ) THEN
@@ -214,6 +253,7 @@ PROGRAM PCNEPDRIVER
214
253
KSKIP = KSKIP + 1
215
254
GO TO 20
216
255
END IF
256
+ #endif
217
257
*
218
258
DO 10 K = 1 , NNB
219
259
*
@@ -230,6 +270,7 @@ PROGRAM PCNEPDRIVER
230
270
*
231
271
* Check all processes for an error
232
272
*
273
+ #ifdef ENABLE_DRIVER_CHECK
233
274
CALL IGSUM2D( ICTXT, ' All' , ' ' , 1 , 1 , IERR, 1 , - 1 , 0 )
234
275
*
235
276
IF ( IERR( 1 ).GT. 0 ) THEN
@@ -238,6 +279,7 @@ PROGRAM PCNEPDRIVER
238
279
KSKIP = KSKIP + 1
239
280
GO TO 10
240
281
END IF
282
+ #endif
241
283
*
242
284
* Padding constants
243
285
*
@@ -292,6 +334,21 @@ PROGRAM PCNEPDRIVER
292
334
$ IERR( 2 ).EQ. - 2 .OR.
293
335
$ IERR( 2 ).EQ. - 8 .OR.
294
336
$ IERR( 2 ).EQ. - 4 ) ) THEN
337
+ * If DESCINIT is returning correct error code we need to pass
338
+ * and it will be ScaLAPACK API
339
+ WRITE ( NOUT, FMT = 9983 ) ' N'
340
+ * disable extreme value case when N < 0
341
+ EX_FLAG = .FALSE.
342
+ ELSE IF (N .EQ. 0 .AND. (IERR(1 ) .EQ. 0 .OR.
343
+ $ IERR(1 ) .EQ. - 5 .OR. IERR(1 ) .EQ. - 10 .OR.
344
+ $ IERR(1 ) .EQ. - 15 .OR. IERR(1 ) .EQ. - 20 )) THEN
345
+ * DESCINIT returns the correct error code,
346
+ * When N = 0,
347
+ * -5, -10 or -20 incase of incorrect grid info
348
+ * MAIN API can be validated.
349
+ * Do NOTHING
350
+ * disable extreme value case when N = 0
351
+ EX_FLAG = .FALSE.
295
352
WRITE ( NOUT, FMT = 9984 ) ' PCLAHQR'
296
353
ELSE IF ( IERR( 1 ).LT. 0 .OR. IERR( 2 ).LT. 0 ) THEN
297
354
IF ( IAM.EQ. 0 )
@@ -410,15 +467,16 @@ PROGRAM PCNEPDRIVER
410
467
CALL SLTIMER( 1 )
411
468
*
412
469
IF ( INFO.NE. 0 ) THEN
413
- IF ( IAM.EQ. 0 )
470
+ IF ( IAM.EQ. 0 .AND. .NOT. (EX_FLAG) )
414
471
$ WRITE ( NOUT, FMT = * )' PCLAHQR INFO=' , INFO
415
472
* If N < 0 in NEP.dat file then PCLAHQR API
416
473
* sets INFO = -5
417
474
IF (N.LT. 0 .AND. INFO.EQ. - 5 ) THEN
418
475
* If PCLAHQR is returning correct error
419
476
* code we need to pass this case
420
477
WRITE ( NOUT, FMT = 9983 ) ' PCLAHQR'
421
- ELSE IF ( N.GT. 1 .AND. INFO.NE. 0 ) THEN
478
+ ELSE IF ( N.GT. 1 .AND. INFO.NE. 0
479
+ $ .AND. .NOT. EX_FLAG ) THEN
422
480
KFAIL = KFAIL + 1
423
481
GO TO 10
424
482
END IF
@@ -428,7 +486,7 @@ PROGRAM PCNEPDRIVER
428
486
WRITE ( NOUT, FMT = 9982 ) ' PCLAHQR'
429
487
END IF
430
488
*
431
- IF ( CHECK .AND. INFO.EQ. 0 ) THEN
489
+ IF ( CHECK .AND. INFO.EQ. 0 .AND. .NOT. (EX_FLAG) ) THEN
432
490
*
433
491
* Check for memory overwrite in NEP factorization
434
492
*
@@ -480,7 +538,33 @@ PROGRAM PCNEPDRIVER
480
538
*
481
539
* Test residual and detect NaN result
482
540
*
483
- IF ( ( FRESID.LE. THRESH ) .AND.
541
+ IF ( N .EQ. 0 .AND. (INFO .EQ. - 4 .OR.
542
+ $ INFO .EQ. 0 )) THEN
543
+ * If N =0 this is the case of
544
+ * early return from ScaLAPACK API.
545
+ * If there is safe exit from API; pass this case
546
+ KPASS = KPASS + 1
547
+ WRITE ( NOUT, FMT = 9984 ) ' PCLAHQR'
548
+ PASSED = ' PASSED'
549
+ * Re-enable EX_FLAG
550
+ IF (NAN_PERCENT .GT. 0 .OR.
551
+ $ INF_PERCENT .GT. 0 ) THEN
552
+ EX_FLAG = .TRUE.
553
+ END IF
554
+ ELSE IF (N .LT. 0 .AND. (INFO .EQ. - 2 .OR.
555
+ $ INFO .EQ. - 804 )) THEN
556
+ * When N < 0/Invalid, PCLAHQR INFO = -1
557
+ * Expected Error code for N < 0
558
+ * Hence this case can be passed
559
+ KPASS = KPASS + 1
560
+ WRITE ( NOUT, FMT = 9982 ) ' PCLAHQR'
561
+ PASSED = ' PASSED'
562
+ * Re-enable EX_FLAG
563
+ IF (NAN_PERCENT .GT. 0 .OR.
564
+ $ INF_PERCENT .GT. 0 ) THEN
565
+ EX_FLAG = .TRUE.
566
+ END IF
567
+ ELSE IF ( ( FRESID.LE. THRESH ).AND.
484
568
$ ( ( FRESID- FRESID ).EQ. 0.0E+0 ) .AND.
485
569
$ ( QRESID.LE. THRESH ) .AND.
486
570
$ ( ( QRESID- QRESID ).EQ. 0.0E+0 ) ) THEN
@@ -499,8 +583,39 @@ PROGRAM PCNEPDRIVER
499
583
END IF
500
584
END IF
501
585
*
502
- ELSE
586
+ * Extreme-value validation block
587
+ ELSE IF (EX_FLAG) THEN
588
+ * Check presence of INF/NAN in output
589
+ * Pass the case if present
590
+ DO IK = 0 , N-1
591
+ DO JK = 1 , N
592
+ X = (MEM(IK* N + JK))
593
+ IF (isnan(X)) THEN
594
+ * NAN DETECTED
595
+ RES_FLAG = .TRUE.
596
+ EXIT
597
+ ELSE IF (.NOT. ieee_is_finite(
598
+ $ X)) THEN
599
+ * INFINITY DETECTED
600
+ RES_FLAG = .TRUE.
601
+ EXIT
602
+ END IF
603
+ END DO
604
+ IF (RES_FLAG) THEN
605
+ EXIT
606
+ END IF
607
+ END DO
608
+ IF (.NOT. (RES_FLAG)) THEN
609
+ KFAIL = KFAIL + 1
610
+ PASSED = ' FAILED'
611
+ ELSE
612
+ KPASS = KPASS + 1
613
+ PASSED = ' PASSED'
614
+ * RESET RESIDUAL FLAG
615
+ RES_FLAG = .FALSE.
616
+ END IF
503
617
*
618
+ ELSE
504
619
* Don't perform the checking, only timing
505
620
*
506
621
KPASS = KPASS + 1
0 commit comments