3332
 3333
 3334
 3335
 3336
 3337
 3338
 3339      INTEGER            IA, INFO, JA, M, N
 3340      DOUBLE PRECISION   ERRMAX
 3341
 3342
 3343      INTEGER            DESCA( * )
 3344      COMPLEX*16         PA( * ), A( * )
 3345
 3346
 3347
 3348
 3349
 3350
 3351
 3352
 3353
 3354
 3355
 3356
 3357
 3358
 3359
 3360
 3361
 3362
 3363
 3364
 3365
 3366
 3367
 3368
 3369
 3370
 3371
 3372
 3373
 3374
 3375
 3376
 3377
 3378
 3379
 3380
 3381
 3382
 3383
 3384
 3385
 3386
 3387
 3388
 3389
 3390
 3391
 3392
 3393
 3394
 3395
 3396
 3397
 3398
 3399
 3400
 3401
 3402
 3403
 3404
 3405
 3406
 3407
 3408
 3409
 3410
 3411
 3412
 3413
 3414
 3415
 3416
 3417
 3418
 3419
 3420
 3421
 3422
 3423
 3424
 3425
 3426
 3427
 3428
 3429
 3430
 3431
 3432
 3433
 3434
 3435
 3436
 3437
 3438
 3439
 3440
 3441
 3442
 3443
 3444
 3445
 3446
 3447
 3448
 3449
 3450
 3451
 3452
 3453
 3454
 3455
 3456
 3457
 3458
 3459
 3460
 3461
 3462
 3463
 3464
 3465
 3466
 3467      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 3468     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 3469     $                   RSRC_
 3470      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 3471     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 3472     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 3473     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 3474      DOUBLE PRECISION   ZERO
 3475      parameter( zero = 0.0d+0 )
 3476
 3477
 3478      LOGICAL            COLREP, ROWREP
 3479      INTEGER            H, I, IACOL, IAROW, IB, ICTXT, ICURCOL,
 3480     $                   ICURROW, II, IIA, IN, J, JB, JJ, JJA, JN, K,
 3481     $                   KK, LDA, LDPA, LL, MYCOL, MYROW, NPCOL, NPROW
 3482      DOUBLE PRECISION   ERR, EPS
 3483
 3484
 3486
 3487
 3488      DOUBLE PRECISION   PDLAMCH
 3490
 3491
 3492      INTRINSIC          abs, dble, dimag, 
max, 
min, mod
 
 3493
 3494
 3495
 3496      info   = 0
 3497      errmax = zero
 3498
 3499
 3500
 3501      IF( ( m.EQ.0 ).OR.( n.EQ.0 ) )
 3502     $   RETURN
 3503
 3504
 3505
 3506      ictxt = desca( ctxt_ )
 3507      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 3508
 3510
 3511      CALL pb_infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia,
 
 3512     $                 jja, iarow, iacol )
 3513
 3514      ii      = iia
 3515      jj      = jja
 3516      lda     = desca( m_ )
 3517      ldpa    = desca( lld_ )
 3518      icurrow = iarow
 3519      icurcol = iacol
 3520      rowrep  = ( iarow.EQ.-1 )
 3521      colrep  = ( iacol.EQ.-1 )
 3522
 3523
 3524
 3525      jb = desca( inb_ ) - ja  + 1
 3526      IF( jb.LE.0 )
 3527     $   jb = ( ( -jb ) / desca( nb_ ) + 1 ) * desca( nb_ ) + jb
 3529      jn = ja + jb - 1
 3530
 3531      IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3532
 3533         DO 40 h = 0, jb-1
 3534            ib = desca( imb_ ) - ia  + 1
 3535            IF( ib.LE.0 )
 3536     $         ib = ( ( -ib ) / desca( mb_ ) + 1 ) * desca( mb_ ) + ib
 3538            in = ia + ib - 1
 3539            IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3540               DO 10 k = 0, ib-1
 3541                  CALL pzerrset( err, errmax, a( ia+k+(ja+h-1)*lda ),
 
 3542     $                           pa( ii+k+(jj+h-1)*ldpa ) )
 3543   10          CONTINUE
 3544               ii = ii + ib
 3545            END IF
 3546            icurrow = mod( icurrow+1, nprow )
 3547
 3548
 3549
 3550            DO 30 i = in+1, ia+m-1, desca( mb_ )
 3551               ib = 
min( desca( mb_ ), ia+m-i )
 
 3552               IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3553                  DO 20 k = 0, ib-1
 3554                     CALL pzerrset( err, errmax, a( i+k+(ja+h-1)*lda ),
 
 3555     $                              pa( ii+k+(jj+h-1)*ldpa ) )
 3556   20             CONTINUE
 3557                  ii = ii + ib
 3558               END IF
 3559               icurrow = mod( icurrow+1, nprow )
 3560   30       CONTINUE
 3561
 3562            ii = iia
 3563            icurrow = iarow
 3564   40    CONTINUE
 3565
 3566         jj = jj + jb
 3567
 3568      END IF
 3569
 3570      icurcol = mod( icurcol+1, npcol )
 3571
 3572
 3573
 3574      DO 90 j = jn+1, ja+n-1, desca( nb_ )
 3575         jb = 
min(  desca( nb_ ), ja+n-j )
 
 3576         IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3577            DO 80 h = 0, jb-1
 3578               ib = desca( imb_ ) - ia  + 1
 3579               IF( ib.LE.0 )
 3580     $            ib = ( ( -ib ) / desca( mb_ ) + 1 )*desca( mb_ ) + ib
 3582               in = ia + ib - 1
 3583               IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3584                  DO 50 k = 0, ib-1
 3585                     CALL pzerrset( err, errmax, a( ia+k+(j+h-1)*lda ),
 
 3586     $                              pa( ii+k+(jj+h-1)*ldpa ) )
 3587   50             CONTINUE
 3588                  ii = ii + ib
 3589               END IF
 3590               icurrow = mod( icurrow+1, nprow )
 3591
 3592
 3593
 3594               DO 70 i = in+1, ia+m-1, desca( mb_ )
 3595                  ib = 
min( desca( mb_ ), ia+m-i )
 
 3596                  IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3597                     DO 60 k = 0, ib-1
 3599     $                                 a( i+k+(j+h-1)*lda ),
 3600     $                                 pa( ii+k+(jj+h-1)*ldpa ) )
 3601   60                CONTINUE
 3602                     ii = ii + ib
 3603                  END IF
 3604                  icurrow = mod( icurrow+1, nprow )
 3605   70          CONTINUE
 3606
 3607               ii = iia
 3608               icurrow = iarow
 3609   80       CONTINUE
 3610
 3611            jj = jj + jb
 3612         END IF
 3613
 3614         icurcol = mod( icurcol+1, npcol )
 3615
 3616   90 CONTINUE
 3617
 3618      CALL dgamx2d( ictxt, 'All', ' ', 1, 1, errmax, 1, kk, ll, -1,
 3619     $              -1, -1 )
 3620
 3621      IF( errmax.GT.zero .AND. errmax.LE.eps ) THEN
 3622         info = 1
 3623      ELSE IF( errmax.GT.eps ) THEN
 3624         info = -1
 3625      END IF
 3626
 3627      RETURN
 3628
 3629
 3630
subroutine pb_infog2l(i, j, desc, nprow, npcol, myrow, mycol, ii, jj, prow, pcol)
 
double precision function pdlamch(ictxt, cmach)
 
subroutine pzerrset(err, errmax, xtrue, x)