3326
 3327
 3328
 3329
 3330
 3331
 3332
 3333      INTEGER            IA, INFO, JA, M, N
 3334      DOUBLE PRECISION   ERRMAX
 3335
 3336
 3337      INTEGER            DESCA( * )
 3338      DOUBLE PRECISION   PA( * ), A( * )
 3339
 3340
 3341
 3342
 3343
 3344
 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      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 3462     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 3463     $                   RSRC_
 3464      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 3465     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 3466     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 3467     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 3468      DOUBLE PRECISION   ZERO
 3469      parameter( zero = 0.0d+0 )
 3470
 3471
 3472      LOGICAL            COLREP, ROWREP
 3473      INTEGER            H, I, IACOL, IAROW, IB, ICTXT, ICURCOL,
 3474     $                   ICURROW, II, IIA, IN, J, JB, JJ, JJA, JN, K,
 3475     $                   KK, LDA, LDPA, LL, MYCOL, MYROW, NPCOL, NPROW
 3476      DOUBLE PRECISION   ERR, EPS
 3477
 3478
 3480
 3481
 3482      DOUBLE PRECISION   PDLAMCH
 3484
 3485
 3486      INTRINSIC          abs, 
max, 
min, mod
 
 3487
 3488
 3489
 3490      info   = 0
 3491      errmax = zero
 3492
 3493
 3494
 3495      IF( ( m.EQ.0 ).OR.( n.EQ.0 ) )
 3496     $   RETURN
 3497
 3498
 3499
 3500      ictxt = desca( ctxt_ )
 3501      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 3502
 3504
 3505      CALL pb_infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia,
 
 3506     $                 jja, iarow, iacol )
 3507
 3508      ii      = iia
 3509      jj      = jja
 3510      lda     = desca( m_ )
 3511      ldpa    = desca( lld_ )
 3512      icurrow = iarow
 3513      icurcol = iacol
 3514      rowrep  = ( iarow.EQ.-1 )
 3515      colrep  = ( iacol.EQ.-1 )
 3516
 3517
 3518
 3519      jb = desca( inb_ ) - ja  + 1
 3520      IF( jb.LE.0 )
 3521     $   jb = ( ( -jb ) / desca( nb_ ) + 1 ) * desca( nb_ ) + jb
 3523      jn = ja + jb - 1
 3524
 3525      IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3526
 3527         DO 40 h = 0, jb-1
 3528            ib = desca( imb_ ) - ia  + 1
 3529            IF( ib.LE.0 )
 3530     $         ib = ( ( -ib ) / desca( mb_ ) + 1 ) * desca( mb_ ) + ib
 3532            in = ia + ib - 1
 3533            IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3534               DO 10 k = 0, ib-1
 3535                  CALL pderrset( err, errmax, a( ia+k+(ja+h-1)*lda ),
 
 3536     $                           pa( ii+k+(jj+h-1)*ldpa ) )
 3537   10          CONTINUE
 3538               ii = ii + ib
 3539            END IF
 3540            icurrow = mod( icurrow+1, nprow )
 3541
 3542
 3543
 3544            DO 30 i = in+1, ia+m-1, desca( mb_ )
 3545               ib = 
min( desca( mb_ ), ia+m-i )
 
 3546               IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3547                  DO 20 k = 0, ib-1
 3548                     CALL pderrset( err, errmax, a( i+k+(ja+h-1)*lda ),
 
 3549     $                              pa( ii+k+(jj+h-1)*ldpa ) )
 3550   20             CONTINUE
 3551                  ii = ii + ib
 3552               END IF
 3553               icurrow = mod( icurrow+1, nprow )
 3554   30       CONTINUE
 3555
 3556            ii = iia
 3557            icurrow = iarow
 3558   40    CONTINUE
 3559
 3560         jj = jj + jb
 3561
 3562      END IF
 3563
 3564      icurcol = mod( icurcol+1, npcol )
 3565
 3566
 3567
 3568      DO 90 j = jn+1, ja+n-1, desca( nb_ )
 3569         jb = 
min(  desca( nb_ ), ja+n-j )
 
 3570         IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3571            DO 80 h = 0, jb-1
 3572               ib = desca( imb_ ) - ia  + 1
 3573               IF( ib.LE.0 )
 3574     $            ib = ( ( -ib ) / desca( mb_ ) + 1 )*desca( mb_ ) + ib
 3576               in = ia + ib - 1
 3577               IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3578                  DO 50 k = 0, ib-1
 3579                     CALL pderrset( err, errmax, a( ia+k+(j+h-1)*lda ),
 
 3580     $                              pa( ii+k+(jj+h-1)*ldpa ) )
 3581   50             CONTINUE
 3582                  ii = ii + ib
 3583               END IF
 3584               icurrow = mod( icurrow+1, nprow )
 3585
 3586
 3587
 3588               DO 70 i = in+1, ia+m-1, desca( mb_ )
 3589                  ib = 
min( desca( mb_ ), ia+m-i )
 
 3590                  IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3591                     DO 60 k = 0, ib-1
 3593     $                                 a( i+k+(j+h-1)*lda ),
 3594     $                                 pa( ii+k+(jj+h-1)*ldpa ) )
 3595   60                CONTINUE
 3596                     ii = ii + ib
 3597                  END IF
 3598                  icurrow = mod( icurrow+1, nprow )
 3599   70          CONTINUE
 3600
 3601               ii = iia
 3602               icurrow = iarow
 3603   80       CONTINUE
 3604
 3605            jj = jj + jb
 3606         END IF
 3607
 3608         icurcol = mod( icurcol+1, npcol )
 3609
 3610   90 CONTINUE
 3611
 3612      CALL dgamx2d( ictxt, 'All', ' ', 1, 1, errmax, 1, kk, ll, -1,
 3613     $              -1, -1 )
 3614
 3615      IF( errmax.GT.zero .AND. errmax.LE.eps ) THEN
 3616         info = 1
 3617      ELSE IF( errmax.GT.eps ) THEN
 3618         info = -1
 3619      END IF
 3620
 3621      RETURN
 3622
 3623
 3624
subroutine pb_infog2l(i, j, desc, nprow, npcol, myrow, mycol, ii, jj, prow, pcol)
 
subroutine pderrset(err, errmax, xtrue, x)
 
double precision function pdlamch(ictxt, cmach)