2865 SUBROUTINE PZBLAS3TSTCHK( ICTXT, NOUT, NROUT, SIDE, UPLO, TRANSA,
2866 $ TRANSB, DIAG, M, N, K, ALPHA, A, PA, IA,
2867 $ JA, DESCA, B, PB, IB, JB, DESCB, BETA,
2868 $ C, PC, IC, JC, DESCC, THRESH, ROGUE,
2869 $ WORK, RWORK, INFO )
2877 CHARACTER*1 DIAG, SIDE, TRANSA, TRANSB, UPLO
2878 INTEGER IA, IB, IC, ICTXT, INFO, JA, JB, JC, K, M, N,
2881 COMPLEX*16 ALPHA, BETA, ROGUE
2884 INTEGER DESCA( * ), DESCB( * ), DESCC( * )
2885 DOUBLE PRECISION RWORK( * )
2886 COMPLEX*16 A( * ), B( * ), C( * ), PA( * ), PB( * ),
2887 $ PC( * ), WORK( * )
3113 DOUBLE PRECISION RZERO
3114 PARAMETER ( RZERO = 0.0D+0 )
3115 COMPLEX*16 ONE, ZERO
3116 PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ),
3117 $ ZERO = ( 0.0D+0, 0.0D+0 ) )
3118 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
3119 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
3121 PARAMETER ( BLOCK_CYCLIC_2D_INB = 2, DLEN_ = 11,
3122 $ DTYPE_ = 1, CTXT_ = 2, M_ = 3, N_ = 4,
3123 $ IMB_ = 5, INB_ = 6, MB_ = 7, NB_ = 8,
3124 $ RSRC_ = 9, CSRC_ = 10, LLD_ = 11 )
3127 INTEGER I, MYCOL, MYROW, NPCOL, NPROW
3128 DOUBLE PRECISION ERR
3129 COMPLEX*16 ALPHA1, BETA1
3135 EXTERNAL BLACS_GRIDINFO, PB_ZLASET, PZCHKMIN, PZMMCH,
3136 $ PZMMCH1, PZMMCH2, PZMMCH3, PZTRMM, ZTRSM
3143 INTRINSIC DBLE, DCMPLX
3151.LE..OR..LE.
IF( ( M0 )( N0 ) )
3156 CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
3162.EQ.
IF( NROUT1 ) THEN
3168 CALL PZMMCH( ICTXT, TRANSA, TRANSB, M, N, K, ALPHA, A, IA, JA,
3169 $ DESCA, B, IB, JB, DESCB, BETA, C, PC, IC, JC,
3170 $ DESCC, WORK, RWORK, ERR, IERR( 3 ) )
3172.NE.
IF( IERR( 3 )0 ) THEN
3173.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
3174 $ WRITE( NOUT, FMT = 9998 )
3175.GT.
ELSE IF( ERRDBLE( THRESH ) ) THEN
3176.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
3177 $ WRITE( NOUT, FMT = 9997 ) ERR
3182 IF( LSAME( TRANSA, 'n
' ) ) THEN
3183 CALL PZCHKMIN( ERR, M, K, A, PA, IA, JA, DESCA, IERR( 1 ) )
3185 CALL PZCHKMIN( ERR, K, M, A, PA, IA, JA, DESCA, IERR( 1 ) )
3187 IF( LSAME( TRANSB, 'n
' ) ) THEN
3188 CALL PZCHKMIN( ERR, K, N, B, PB, IB, JB, DESCB, IERR( 2 ) )
3190 CALL PZCHKMIN( ERR, N, K, B, PB, IB, JB, DESCB, IERR( 2 ) )
3193.EQ.
ELSE IF( NROUT2 ) THEN
3199 IF( LSAME( SIDE, 'l
' ) ) THEN
3200 CALL PZMMCH( ICTXT, 'no transpose
', 'no transpose
', M, N, M,
3201 $ ALPHA, A, IA, JA, DESCA, B, IB, JB, DESCB,
3202 $ BETA, C, PC, IC, JC, DESCC, WORK, RWORK, ERR,
3205 CALL PZMMCH( ICTXT, 'no transpose
', 'no transpose
', M, N, N,
3206 $ ALPHA, B, IB, JB, DESCB, A, IA, JA, DESCA,
3207 $ BETA, C, PC, IC, JC, DESCC, WORK, RWORK, ERR,
3211.NE.
IF( IERR( 3 )0 ) THEN
3212.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
3213 $ WRITE( NOUT, FMT = 9998 )
3214.GT.
ELSE IF( ERRDBLE( THRESH ) ) THEN
3215.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
3216 $ WRITE( NOUT, FMT = 9997 ) ERR
3221 IF( LSAME( UPLO, 'l
' ) ) THEN
3222 IF( LSAME( SIDE, 'l
' ) ) THEN
3223 CALL PB_ZLASET( 'upper
', M-1, M-1, 0, ROGUE, ROGUE,
3224 $ A( IA+JA*DESCA( M_ ) ), DESCA( M_ ) )
3226 CALL PB_ZLASET( 'upper
', N-1, N-1, 0, ROGUE, ROGUE,
3227 $ A( IA+JA*DESCA( M_ ) ), DESCA( M_ ) )
3230 IF( LSAME( SIDE, 'l
' ) ) THEN
3231 CALL PB_ZLASET( 'lower
', M-1, M-1, 0, ROGUE, ROGUE,
3232 $ A( IA+1+(JA-1)*DESCA( M_ ) ),
3235 CALL PB_ZLASET( 'lower
', N-1, N-1, 0, ROGUE, ROGUE,
3236 $ A( IA+1+(JA-1)*DESCA( M_ ) ),
3241 IF( LSAME( SIDE, 'l
' ) ) THEN
3242 CALL PZCHKMIN( ERR, M, M, A, PA, IA, JA, DESCA, IERR( 1 ) )
3244 CALL PZCHKMIN( ERR, N, N, A, PA, IA, JA, DESCA, IERR( 1 ) )
3246 CALL PZCHKMIN( ERR, M, N, B, PB, IB, JB, DESCB, IERR( 2 ) )
3248.EQ.
ELSE IF( NROUT3 ) THEN
3254 IF( LSAME( SIDE, 'l
' ) ) THEN
3255 CALL PZMMCH( ICTXT, 'no transpose
', 'no transpose
', M, N, M,
3256 $ ALPHA, A, IA, JA, DESCA, B, IB, JB, DESCB,
3257 $ BETA, C, PC, IC, JC, DESCC, WORK, RWORK, ERR,
3260 CALL PZMMCH( ICTXT, 'no transpose
', 'no transpose
', M, N, N,
3261 $ ALPHA, B, IB, JB, DESCB, A, IA, JA, DESCA,
3262 $ BETA, C, PC, IC, JC, DESCC, WORK, RWORK, ERR,
3266.NE.
IF( IERR( 3 )0 ) THEN
3267.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
3268 $ WRITE( NOUT, FMT = 9998 )
3269.GT.
ELSE IF( ERRDBLE( THRESH ) ) THEN
3270.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
3271 $ WRITE( NOUT, FMT = 9997 ) ERR
3276 IF( LSAME( UPLO, 'l
' ) ) THEN
3277 IF( LSAME( SIDE, 'l
' ) ) THEN
3278 CALL PB_ZLASET( 'upper
', M-1, M-1, 0, ROGUE, ROGUE,
3279 $ A( IA+JA*DESCA( M_ ) ), DESCA( M_ ) )
3281 CALL PB_ZLASET( 'upper
', N-1, N-1, 0, ROGUE, ROGUE,
3282 $ A( IA+JA*DESCA( M_ ) ), DESCA( M_ ) )
3285 IF( LSAME( SIDE, 'l
' ) ) THEN
3286 CALL PB_ZLASET( 'lower
', M-1, M-1, 0, ROGUE, ROGUE,
3287 $ A( IA+1+(JA-1)*DESCA( M_ ) ),
3290 CALL PB_ZLASET( 'lower
', N-1, N-1, 0, ROGUE, ROGUE,
3291 $ A( IA+1+(JA-1)*DESCA( M_ ) ),
3296 IF( LSAME( SIDE, 'l
' ) ) THEN
3297 CALL PZCHKMIN( ERR, M, M, A, PA, IA, JA, DESCA, IERR( 1 ) )
3299 CALL PZCHKMIN( ERR, N, N, A, PA, IA, JA, DESCA, IERR( 1 ) )
3301 CALL PZCHKMIN( ERR, M, N, B, PB, IB, JB, DESCB, IERR( 2 ) )
3303.EQ.
ELSE IF( NROUT4 ) THEN
3309 IF( LSAME( TRANSA, 'n
' ) ) THEN
3310 CALL PZMMCH1( ICTXT, UPLO, 'no transpose
', N, K, ALPHA, A,
3311 $ IA, JA, DESCA, BETA, C, PC, IC, JC, DESCC,
3312 $ WORK, RWORK, ERR, IERR( 3 ) )
3314 CALL PZMMCH1( ICTXT, UPLO, 'transpose
', N, K, ALPHA, A, IA,
3315 $ JA, DESCA, BETA, C, PC, IC, JC, DESCC, WORK,
3316 $ RWORK, ERR, IERR( 3 ) )
3319.NE.
IF( IERR( 3 )0 ) THEN
3320.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
3321 $ WRITE( NOUT, FMT = 9998 )
3322.GT.
ELSE IF( ERRDBLE( THRESH ) ) THEN
3323.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
3324 $ WRITE( NOUT, FMT = 9997 ) ERR
3329 IF( LSAME( TRANSA, 'n
' ) ) THEN
3330 CALL PZCHKMIN( ERR, N, K, A, PA, IA, JA, DESCA, IERR( 1 ) )
3332 CALL PZCHKMIN( ERR, K, N, A, PA, IA, JA, DESCA, IERR( 1 ) )
3335.EQ.
ELSE IF( NROUT5 ) THEN
3341 BETA1 = DCMPLX( DBLE( BETA ), RZERO )
3342 ALPHA1 = DCMPLX( DBLE( ALPHA ), RZERO )
3343 IF( LSAME( TRANSA, 'n
' ) ) THEN
3344 CALL PZMMCH1( ICTXT, UPLO, 'hermitian
', N, K, ALPHA1, A, IA,
3345 $ JA, DESCA, BETA1, C, PC, IC, JC, DESCC, WORK,
3346 $ RWORK, ERR, IERR( 3 ) )
3348 CALL PZMMCH1( ICTXT, UPLO, 'conjugate transpose
', N, K,
3349 $ ALPHA1, A, IA, JA, DESCA, BETA1, C, PC, IC,
3350 $ JC, DESCC, WORK, RWORK, ERR, IERR( 3 ) )
3353.NE.
IF( IERR( 3 )0 ) THEN
3354.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
3355 $ WRITE( NOUT, FMT = 9998 )
3356.GT.
ELSE IF( ERRDBLE( THRESH ) ) THEN
3357.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
3358 $ WRITE( NOUT, FMT = 9997 ) ERR
3363 IF( LSAME( TRANSA, 'n' ) )
THEN
3364 CALL pzchkmin( err, n, k, a, pa, ia, ja, desca, ierr( 1 ) )
3366 CALL pzchkmin( err, k, n, a, pa, ia, ja, desca, ierr( 1 ) )
3369 ELSE IF( nrout.EQ.6 )
THEN
3375 IF(
lsame( transa,
'N' ) )
THEN
3376 CALL pzmmch2( ictxt, uplo,
'No transpose', n, k,
alpha, a,
3377 $ ia, ja, desca, b, ib, jb, descb, beta, c, pc,
3378 $ ic, jc, descc, work, rwork, err, ierr( 3 ) )
3380 CALL pzmmch2( ictxt, uplo,
'Transpose', n, k,
alpha, a,
3381 $ ia, ja, desca, b, ib, jb, descb, beta, c, pc,
3382 $ ic, jc, descc, work, rwork, err,
3386 IF( ierr( 3 ).NE.0 )
THEN
3387 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3388 $
WRITE( nout, fmt = 9998 )
3389 ELSE IF( err.GT.dble( thresh ) )
THEN
3390 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3391 $
WRITE( nout, fmt = 9997 ) err
3396 IF(
lsame( transa,
'N' ) )
THEN
3397 CALL pzchkmin( err, n, k, a, pa, ia, ja, desca, ierr( 1 ) )
3398 CALL pzchkmin( err, n, k, b, pb, ib, jb, descb, ierr( 2 ) )
3400 CALL pzchkmin( err, k, n, a, pa, ia, ja, desca, ierr( 1 ) )
3401 CALL pzchkmin( err, k, n, b, pb, ib, jb, descb, ierr( 2 ) )
3404 ELSE IF( nrout.EQ.7 )
THEN
3410 beta1 = dcmplx( dble( beta ), rzero )
3411 IF(
lsame( transa,
'N' ) )
THEN
3412 CALL pzmmch2( ictxt, uplo,
'Hermitian', n, k,
alpha, a, ia,
3413 $ ja, desca, b, ib, jb, descb, beta1, c, pc, ic,
3414 $ jc, descc, work, rwork, err, ierr( 3 ) )
3416 CALL pzmmch2( ictxt, uplo,
'Conjugate transpose', n, k,
3417 $
alpha, a, ia, ja, desca, b, ib, jb, descb,
3418 $ beta1, c, pc, ic, jc, descc, work, rwork, err,
3422 IF( ierr( 3 ).NE.0 )
THEN
3423 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3424 $
WRITE( nout, fmt = 9998 )
3425 ELSE IF( err.GT.dble( thresh ) )
THEN
3426 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3427 $
WRITE( nout, fmt = 9997 ) err
3432 IF(
lsame( transa,
'N' ) )
THEN
3433 CALL pzchkmin( err, n, k, a, pa, ia, ja, desca, ierr( 1 ) )
3434 CALL pzchkmin( err, n, k, b, pb, ib, jb, descb, ierr( 2 ) )
3436 CALL pzchkmin( err, k, n, a, pa, ia, ja, desca, ierr( 1 ) )
3440 ELSE IF( nrout.EQ.8 )
THEN
3446 IF(
lsame( side,
'L' ) )
THEN
3447 CALL pzmmch( ictxt, transa,
'No transpose', m, n, m,
3448 $
alpha, a, ia, ja, desca, c, ib, jb, descb,
3449 $ zero, b, pb, ib, jb, descb, work, rwork, err,
3452 CALL pzmmch( ictxt,
'No transpose', transa, m, n, n,
3453 $
alpha, c, ib, jb, descb, a, ia, ja, desca,
3454 $ zero, b, pb, ib, jb, descb, work, rwork, err,
3458 IF( ierr( 2 ).NE.0 )
THEN
3459 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3460 $
WRITE( nout, fmt = 9998 )
3461 ELSE IF( err.GT.dble( thresh ) )
THEN
3462 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3463 $
WRITE( nout, fmt = 9997 ) err
3468 IF(
lsame( side,
'L' ) )
THEN
3469 IF(
lsame( uplo,
'L' ) )
THEN
3470 IF(
lsame( diag,
'N' ) )
THEN
3471 CALL pb_zlaset(
'Upper', m-1, m-1, 0, rogue, rogue,
3472 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
3474 CALL pb_zlaset(
'Upper', m, m, 0, rogue, one,
3475 $ a( ia+(ja-1)*desca( m_ ) ),
3479 IF(
lsame( diag,
'N' ) )
THEN
3480 CALL pb_zlaset(
'Lower', m-1, m-1, 0, rogue, rogue,
3481 $ a( ia+1+(ja-1)*desca( m_ ) ),
3484 CALL pb_zlaset(
'Lower', m, m, 0, rogue, one,
3485 $ a( ia+(ja-1)*desca( m_ ) ),
3489 CALL pzchkmin( err, m, m, a, pa, ia, ja, desca, ierr( 1 ) )
3491 IF(
lsame( uplo,
'L' ) )
THEN
3492 IF(
lsame( diag,
'N' ) )
THEN
3493 CALL pb_zlaset(
'Upper', n-1, n-1, 0, rogue, rogue,
3494 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
3496 CALL pb_zlaset(
'Upper', n, n, 0, rogue, one,
3497 $ a( ia+(ja-1)*desca( m_ ) ),
3501 IF(
lsame( diag
'N' ) )
THEN
3502 CALL pb_zlaset(
'Lower', n-1, n-1, 0, rogue, rogue,
3503 $ a( ia+1+(ja-1)*desca( m_ ) ),
3506 CALL pb_zlaset(
'Lower', n, n, 0, rogue, one,
3507 $ a( ia+(ja-1)*desca( m_ ) ),
3511 CALL pzchkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
3514 ELSE IF( nrout.EQ.9 )
THEN
3520 CALL ztrsm( side, uplo, transa, diag, m, n,
alpha,
3521 $ a( ia+(ja-1)*desca( m_ ) ), desca( m_ ),
3522 $ b( ib+(jb-1)*descb( m_ ) ), descb( m_ ) )
3523 CALL pztrmm( side, uplo, transa, diag, m, n,
alpha, pa, ia, ja,
3524 $ desca, pb, ib, jb, descb )
3525 IF(
lsame( side,
'L' ) )
THEN
3526 CALL pzmmch( ictxt, transa,
'No transpose', m, n, m,
alpha,
3527 $ a, ia, ja, desca, b, ib, jb, descb, zero, c,
3528 $ pb, ib, jb, descb, work, rwork, err,
3531 CALL pzmmch( ictxt,
'No transpose', transa, m, n, n,
alpha,
3532 $ b, ib, jb, descb, a, ia, ja, desca, zero, c,
3533 $ pb, ib, jb, descb, work, rwork, err,
3537 IF( ierr( 2 ).NE.0 )
THEN
3538 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3539 $
WRITE( nout, fmt = 9998 )
3540 ELSE IF( err.GT.dble( thresh ) )
THEN
3541 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3542 $
WRITE( nout, fmt = 9997 ) err
3547 IF(
lsame( side,
'L' ) )
THEN
3548 IF(
lsame( uplo,
'L' ) )
THEN
3549 IF(
lsame( diag,
'N' ) )
THEN
3550 CALL pb_zlaset(
'Upper', m-1, m-1, 0, rogue, rogue,
3551 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
3553 CALL pb_zlaset(
'Upper', m, m, 0, rogue, one,
3554 $ a( ia+(ja-1)*desca( m_ ) ),
3558 IF(
lsame( diag,
'N' ) )
THEN
3559 CALL pb_zlaset(
'Lower', m-1, m-1, 0, rogue, rogue,
3560 $ a( ia+1+(ja-1)*desca( m_ ) ),
3563 CALL pb_zlaset(
'Lower', m, m, 0, rogue, one,
3564 $ a( ia+(ja-1)*desca( m_ ) ),
3568 CALL pzchkmin( err, m, m, a, pa, ia, ja, desca, ierr( 1 ) )
3570 IF(
lsame( uplo,
'L' ) )
THEN
3571 IF(
lsame( diag,
'N' ) )
THEN
3572 CALL pb_zlaset(
'Upper', n-1, n-1, 0, rogue, rogue,
3573 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
3575 CALL pb_zlaset(
'Upper', n, n, 0, rogue, one,
3576 $ a( ia+(ja-1)*desca( m_ ) ),
3580 IF(
lsame( diag,
'N' ) )
THEN
3581 CALL pb_zlaset(
'Lower', n-1, n-1, 0, rogue, rogue,
3582 $ a( ia+1+(ja-1)*desca( m_ ) ),
3585 CALL pb_zlaset(
'Lower', n, n, 0, rogue, one,
3586 $ a( ia+(ja-1)*desca
3592 ELSE IF( nrout.EQ.10 )
THEN
3598 CALL pzmmch3(
'All', transa, m, n,
alpha, a, ia, ja, desca,
3599 $ beta, c, pc, ic, jc, descc, err, ierr( 3 ) )
3603 IF(
lsame( transa,
'N' ) )
THEN
3604 CALL pzchkmin( err, m, n, a, pa, ia, ja, desca, ierr( 1 ) )
3606 CALL pzchkmin( err, n, m, a, pa, ia, ja, desca, ierr( 1 ) )
3609 ELSE IF( nrout.EQ.11 )
THEN
3615 CALL pzmmch3( uplo, transa, m, n,
alpha, a, ia, ja, desca,
3616 $ beta, c, pc, ic, jc, descc, err, ierr( 3 ) )
3620 IF(
lsame( transa,
'N' ) )
THEN
3621 CALL pzchkmin( err, m, n, a, pa, ia, ja, desca, ierr( 1 ) )
3623 CALL pzchkmin( err, n, m, a, pa, ia, ja, desca, ierr( 1 ) )
3628 IF( ierr( 1 ).NE.0 )
THEN
3630 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3631 $
WRITE( nout, fmt = 9999 )
'A'
3634 IF( ierr( 2 ).NE.0 )
THEN
3636 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3637 $
WRITE( nout, fmt = 9999 )
'B'
3640 IF( ierr( 3 ).NE.0 )
THEN
3642 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3643 $
WRITE( nout, fmt = 9999 )
'C'
3646 9999
FORMAT( 2x,
' ***** ERROR: Matrix operand ', a,
3647 $
' is incorrect.' )
3648 9998
FORMAT( 2x,
' ***** FATAL ERROR - Computed result is less ',
3649 $
'than half accurate *****' )
3650 9997
FORMAT( 2x,
' ***** Test completed with maximum test ratio: ',
3651 $ f11.5,
' SUSPECT *****' )