3337
3338
3339
3340
3341
3342
3343
3344 INTEGER DPOS0, IA, ICTXT, INFO, JA, M, MPOS0, N, NPOS0
3345
3346
3347 INTEGER DESCA( * )
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 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
3414 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
3415 $ RSRC_
3416 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
3417 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
3418 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
3419 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
3420 INTEGER DESCMULT, BIGNUM
3421 parameter( descmult = 100, bignum = descmult*descmult )
3422
3423
3424 INTEGER DPOS, IAPOS, JAPOS, MP, MPOS, MYCOL, MYROW,
3425 $ NPCOL, NPOS, NPROW, NQ
3426
3427
3428 INTEGER DESCA2( DLEN_ )
3429
3430
3432
3433
3434 INTEGER PB_NUMROC
3436
3437
3439
3440
3441
3442
3443
3445
3446
3447
3448
3449
3450 IF( info.GE.0 ) THEN
3451 info = bignum
3452 ELSE IF( info.LT.-descmult ) THEN
3453 info = -info
3454 ELSE
3455 info = -info * descmult
3456 END IF
3457
3458
3459
3460
3461 mpos = mpos0 * descmult
3462 npos = npos0 * descmult
3463 iapos = ( dpos0 - 2 ) * descmult
3464 japos = ( dpos0 - 1 ) * descmult
3465 dpos = dpos0 * descmult
3466
3467
3468
3469 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
3470
3471
3472
3473 IF( m.LT.0 )
3474 $ info =
min( info, mpos )
3475 IF( n.LT.0 )
3476 $ info =
min( info, npos )
3477 IF( ia.LT.1 )
3478 $ info =
min( info, iapos )
3479 IF( ja.LT.1 )
3480 $ info =
min( info, japos )
3481 IF( desca2( dtype_ ).NE.block_cyclic_2d_inb )
3482 $ info =
min( info, dpos + dtype_ )
3483 IF( desca2( imb_ ).LT.1 )
3484 $ info =
min( info, dpos + imb_ )
3485 IF( desca2( inb_ ).LT.1 )
3486 $ info =
min( info, dpos + inb_ )
3487 IF( desca2( mb_ ).LT.1 )
3488 $ info =
min( info, dpos + mb_ )
3489 IF( desca2( nb_ ).LT.1 )
3490 $ info =
min( info, dpos + nb_ )
3491 IF( desca2( rsrc_ ).LT.-1 .OR. desca2( rsrc_ ).GE.nprow )
3492 $ info =
min( info, dpos + rsrc_ )
3493 IF( desca2( csrc_ ).LT.-1 .OR. desca2( csrc_ ).GE.npcol )
3494 $ info =
min( info, dpos + csrc_ )
3495 IF( desca2( ctxt_ ).NE.ictxt )
3496 $ info =
min( info, dpos + ctxt_ )
3497
3498 IF( m.EQ.0 .OR. n.EQ.0 ) THEN
3499
3500
3501
3502 IF( desca2( m_ ).LT.0 )
3503 $ info =
min( info, dpos + m_ )
3504 IF( desca2( n_ ).LT.0 )
3505 $ info =
min( info, dpos + n_ )
3506 IF( desca2( lld_ ).LT.1 )
3507 $ info =
min( info, dpos + lld_ )
3508
3509 ELSE
3510
3511
3512
3513 mp =
pb_numroc( desca2( m_ ), 1, desca2( imb_ ), desca2( mb_ ),
3514 $ myrow, desca2( rsrc_ ), nprow )
3515
3516 IF( desca2( m_ ).LT.1 )
3517 $ info =
min( info, dpos + m_ )
3518 IF( desca2( n_ ).LT.1 )
3519 $ info =
min( info, dpos + n_ )
3520 IF( ia.GT.desca2( m_ ) )
3521 $ info =
min( info, iapos )
3522 IF( ja.GT.desca2( n_ ) )
3523 $ info =
min( info, japos )
3524 IF( ia+m-1.GT.desca2( m_ ) )
3525 $ info =
min( info, mpos )
3526 IF( ja+n-1.GT.desca2( n_ ) )
3527 $ info =
min( info, npos )
3528
3529 IF( desca2( lld_ ).LT.
max( 1, mp ) )
THEN
3530 nq =
pb_numroc( desca2( n_ ), 1, desca2( inb_ ),
3531 $ desca2( nb_ ), mycol, desca2( csrc_ ),
3532 $ npcol )
3533 IF( desca2( lld_ ).LT.1 ) THEN
3534 info =
min( info, dpos + lld_ )
3535 ELSE IF( nq.GT.0 ) THEN
3536 info =
min( info, dpos + lld_ )
3537 END IF
3538 END IF
3539
3540 END IF
3541
3542
3543
3544
3545 IF( info.EQ.bignum ) THEN
3546 info = 0
3547 ELSE IF( mod( info, descmult ).EQ.0 ) THEN
3548 info = -( info / descmult )
3549 ELSE
3550 info = -info
3551 END IF
3552
3553 RETURN
3554
3555
3556
subroutine pb_desctrans(descin, descout)
integer function pb_numroc(n, i, inb, nb, proc, srcproc, nprocs)