388
  389
  390
  391
  392
  393
  394
  395      CHARACTER*1        MATRIX
  396      INTEGER            CSRCX, DTX, GAPMUL, ICTXT, IGAP, IMBX, IMIDX,
  397     $                   INBX, INCX, INFO, IPOSTX, IPREX, MBX, MPX, MX,
  398     $                   NBX, NOUT, NQX, NX, RSRCX
  399
  400
  401      INTEGER            DESCX( * )
  402
  403
  404
  405
  406
  407
  408
  409
  410
  411
  412
  413
  414
  415
  416
  417
  418
  419
  420
  421
  422
  423
  424
  425
  426
  427
  428
  429
  430
  431
  432
  433
  434
  435
  436
  437
  438
  439
  440
  441
  442
  443
  444
  445
  446
  447
  448
  449
  450
  451
  452
  453
  454
  455
  456
  457
  458
  459
  460
  461
  462
  463
  464
  465
  466
  467
  468
  469
  470
  471
  472
  473
  474
  475
  476
  477
  478
  479
  480
  481
  482
  483
  484
  485
  486
  487
  488
  489
  490
  491
  492
  493
  494
  495
  496
  497
  498
  499
  500
  501
  502
  503
  504
  505
  506
  507
  508
  509
  510
  511
  512
  513
  514
  515
  516
  517
  518
  519
  520
  521
  522
  523
  524
  525
  526
  527
  528
  529
  530
  531
  532
  533
  534
  535
  536
  537
  538
  539
  540
  541
  542
  543
  544
  545
  546
  547
  548
  549
  550
  551
  552
  553
  554
  555
  556
  557
  558
  559
  560
  561
  562
  563
  564
  565
  566
  567
  568
  569
  570
  571
  572
  573
  574
  575
  576
  577
  578      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
  579     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
  580     $                   RSRC_
  581      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
  582     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
  583     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
  584     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
  585
  586
  587      INTEGER            LLDX, MYCOL, MYROW, NPCOL, NPROW
  588
  589
  591
  592
  593      INTEGER            PB_NUMROC
  595
  596
  598
  599
  600
  601      info = 0
  602      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  603
  604
  605
  606      IF( dtx.NE.block_cyclic_2d_inb ) THEN
  607         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
  608     $      WRITE( nout, fmt = 9999 ) matrix, 'DTYPE', matrix, dtx,
  609     $                                block_cyclic_2d_inb
  610         info = 1
  611      END IF
  612
  613
  614
  615      IF( mx.LT.0 ) THEN
  616         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
  617     $      WRITE( nout, fmt = 9998 ) matrix, 'M', matrix, mx
  618         info = 1
  619      ELSE IF( nx.LT.0 ) THEN
  620         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
  621     $      WRITE( nout, fmt = 9997 ) matrix, 'N', matrix, nx
  622         info = 1
  623      END IF
  624
  625
  626
  627      IF( imbx.LT.1 ) THEN
  628         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
  629     $      WRITE( nout, fmt = 9996 ) matrix, 'IMB', matrix, imbx
  630         info = 1
  631      ELSE IF( inbx.LT.1 ) THEN
  632         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
  633     $      WRITE( nout, fmt = 9995 ) matrix, 'INB', matrix, inbx
  634         info = 1
  635      END IF
  636
  637
  638
  639      IF( mbx.LT.1 ) THEN
  640         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
  641     $      WRITE( nout, fmt = 9994 ) matrix, 'MB', matrix, mbx
  642         info = 1
  643      ELSE IF( nbx.LT.1 ) THEN
  644         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
  645     $      WRITE( nout, fmt = 9993 ) matrix, 'NB', matrix, nbx
  646         info = 1
  647      END IF
  648
  649
  650
  651      IF( rsrcx.LT.-1 .OR. rsrcx.GE.nprow ) THEN
  652         IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
  653            WRITE( nout, fmt = 9992 ) matrix
  654            WRITE( nout, fmt = 9990 ) 'RSRC', matrix, rsrcx, nprow
  655         END IF
  656         info = 1
  657      ELSE IF( csrcx.LT.-1 .OR. csrcx.GE.npcol ) THEN
  658         IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
  659            WRITE( nout, fmt = 9991 ) matrix
  660            WRITE( nout, fmt = 9990 ) 'CSRC', matrix, csrcx, npcol
  661         END IF
  662         info = 1
  663      END IF
  664
  665
  666
  667      IF( incx.NE.1 .AND. incx.NE.mx ) THEN
  668         IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
  669            WRITE( nout, fmt = 9989 ) matrix
  670            WRITE( nout, fmt = 9988 ) 'INC', matrix, incx, matrix, mx
  671         END IF
  672         info = 1
  673      END IF
  674
  675
  676
  677      CALL igsum2d( ictxt, 'All', ' ', 1, 1, info, 1, -1, 0 )
  678
  679      IF( info.NE.0 ) THEN
  680
  681         IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
  682            WRITE( nout, fmt = 9987 ) matrix
  683            WRITE( nout, fmt = * )
  684         END IF
  685
  686      ELSE
  687
  688
  689
  690         mpx    = 
pb_numroc( mx, 1, imbx, mbx, myrow, rsrcx, nprow )
 
  691         nqx    = 
pb_numroc( nx, 1, inbx, nbx, mycol, csrcx, npcol )
 
  692         iprex  = 
max( gapmul*nbx, mpx )
 
  693         imidx  = igap
  694         ipostx = 
max( gapmul*nbx, nqx )
 
  695         lldx   = 
max( 1, mpx ) + imidx
 
  696
  697         CALL pb_descinit2( descx, mx, nx, imbx, inbx, mbx, nbx, rsrcx,
 
  698     $                      csrcx, ictxt, lldx, info )
  699
  700
  701
  702         CALL igsum2d( ictxt, 'All', ' ', 1, 1, info, 1, -1, 0 )
  703
  704         IF( info.NE.0 ) THEN
  705            IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
  706               WRITE( nout, fmt = 9987 ) matrix
  707               WRITE( nout, fmt = * )
  708            END IF
  709         END IF
  710
  711      END IF
  712
  713 9999 FORMAT( 2x, '>> Invalid matrix ', a1, ' descriptor type ', a5, a1,
  714     $        ': ', i6, ' should be ', i3, '.' )
  715 9998 FORMAT( 2x, '>> Invalid matrix ', a1, ' row dimension ', a1, a1,
  716     $        ': ', i6, ' should be at least 1.' )
  717 9997 FORMAT( 2x, '>> Invalid matrix ', a1, ' column dimension ', a1,
  718     $        a1, ': ', i6, ' should be at least 1.' )
  719 9996 FORMAT( 2x, '>> Invalid matrix ', a1, ' first row block size ',
  720     $        a3, a1, ': ', i6, ' should be at least 1.' )
  721 9995 FORMAT( 2x, '>> Invalid matrix ', a1, ' first column block size ',
  722     $        a3, a1,': ', i6, ' should be at least 1.' )
  723 9994 FORMAT( 2x, '>> Invalid matrix ', a1, ' row block size ', a2, a1,
  724     $        ': ', i6, ' should be at least 1.' )
  725 9993 FORMAT( 2x, '>> Invalid matrix ', a1, ' column block size ', a2,
  726     $        a1,': ', i6, ' should be at least 1.' )
  727 9992 FORMAT( 2x, '>> Invalid matrix ', a1, ' row process source:' )
  728 9991 FORMAT( 2x, '>> Invalid matrix ', a1, ' column process source:' )
  729 9990 FORMAT( 2x, '>> ', a4, a1, '= ', i6, ' should be >= -1 and < ',
  730     $        i6, '.' )
  731 9989 FORMAT( 2x, '>> Invalid vector ', a1, ' increment:' )
  732 9988 FORMAT( 2x, '>> ', a3, a1, '= ', i6, ' should be 1 or M', a1,
  733     $        ' = ', i6, '.' )
  734 9987 FORMAT( 2x, '>> Invalid matrix ', a1, ' descriptor: going on to ',
  735     $        'next test case.' )
  736
  737      RETURN
  738
  739
  740
subroutine pb_descinit2(desc, m, n, imb, inb, mb, nb, rsrc, csrc, ctxt, lld, info)
 
integer function pb_numroc(n, i, inb, nb, proc, srcproc, nprocs)