510
  511
  512
  513
  514
  515
  516
  517      LOGICAL            INPLACE
  518      CHARACTER*1        AFORM, DIAG
  519      INTEGER            IA, IASEED, JA, LDA, M, N, OFFA
  520
  521
  522      INTEGER            DESCA( * )
  523      COMPLEX*16         A( LDA, * )
  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
  579
  580
  581
  582
  583
  584
  585
  586
  587
  588
  589
  590
  591
  592
  593
  594
  595
  596
  597
  598
  599
  600
  601
  602
  603
  604
  605
  606
  607
  608
  609
  610
  611
  612
  613
  614
  615
  616
  617
  618
  619
  620
  621
  622
  623
  624
  625
  626
  627
  628
  629
  630
  631
  632
  633
  634
  635
  636
  637
  638
  639
  640
  641
  642
  643
  644
  645
  646
  647
  648
  649
  650
  651
  652
  653
  654
  655
  656
  657
  658
  659
  660
  661
  662
  663
  664
  665
  666
  667
  668
  669
  670
  671
  672
  673
  674
  675
  676
  677
  678
  679
  680
  681
  682
  683
  684
  685
  686
  687
  688
  689
  690
  691
  692
  693
  694
  695
  696
  697
  698
  699
  700
  701      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
  702     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
  703     $                   RSRC_
  704      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
  705     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
  706     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
  707     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
  708      INTEGER            JMP_1, JMP_COL, JMP_IMBV, JMP_INBV, JMP_LEN,
  709     $                   JMP_MB, JMP_NB, JMP_NPIMBLOC, JMP_NPMB,
  710     $                   JMP_NQINBLOC, JMP_NQNB, JMP_ROW
  711      parameter( jmp_1 = 1, jmp_row = 2, jmp_col = 3,
  712     $                   jmp_mb = 4, jmp_imbv = 5, jmp_npmb = 6,
  713     $                   jmp_npimbloc = 7, jmp_nb = 8, jmp_inbv = 9,
  714     $                   jmp_nqnb = 10, jmp_nqinbloc = 11,
  715     $                   jmp_len = 11 )
  716      DOUBLE PRECISION   ZERO
  717      parameter( zero = 0.0d+0 )
  718
  719
  720      LOGICAL            DIAGDO, SYMM, HERM, NOTRAN
  721      INTEGER            CSRC, I, IACOL, IAROW, ICTXT, IIA, ILOCBLK,
  722     $                   ILOCOFF, ILOW, IMB, IMB1, IMBLOC, IMBVIR, INB,
  723     $                   INB1, INBLOC, INBVIR, INFO, IOFFDA, ITMP, IUPP,
  724     $                   IVIR, JJA, JLOCBLK, JLOCOFF, JVIR, LCMT00,
  725     $                   LMBLOC, LNBLOC, LOW, MAXMN, MB, MBLKS, MP,
  726     $                   MRCOL, MRROW, MYCDIST, MYCOL, MYRDIST, MYROW,
  727     $                   NB, NBLKS, NPCOL, NPROW, NQ, NVIR, RSRC, UPP
  728      COMPLEX*16         ALPHA
  729
  730
  731      INTEGER            DESCA2( DLEN_ ), IMULADD( 4, JMP_LEN ),
  732     $                   IRAN( 2 ), JMP( JMP_LEN ), MULADD0( 4 )
  733
  734
  740
  741
  742      LOGICAL            LSAME
  744
  745
  746      INTRINSIC          dble, dcmplx, 
max, 
min 
  747
  748
  749      DATA               ( muladd0( i ), i = 1, 4 ) / 20077, 16838,
  750     $                   12345, 0 /
  751
  752
  753
  754
  755
  757
  758
  759
  760      ictxt = desca2( ctxt_ )
  761      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  762
  763
  764
  765      info = 0
  766      IF( nprow.EQ.-1 ) THEN
  767         info = -( 1000 + ctxt_ )
  768      ELSE
  769         symm   = 
lsame( aform, 
'S' )
 
  770         herm   = 
lsame( aform, 
'H' )
 
  771         notran = 
lsame( aform, 
'N' )
 
  772         diagdo = 
lsame( diag, 
'D' )
 
  773         IF( .NOT.( symm.OR.herm.OR.notran ) .AND.
  774     $       .NOT.( 
lsame( aform, 
'T' )    ) .AND.
 
  775     $       .NOT.( 
lsame( aform, 
'C' )    ) ) 
THEN 
  776            info = -2
  777         ELSE IF( ( .NOT.diagdo ) .AND.
  778     $            ( .NOT.
lsame( diag, 
'N' ) ) ) 
THEN 
  779            info = -3
  780         END IF
  781         CALL pb_chkmat( ictxt, m, 5, n, 6, ia, ja, desca2, 10, info )
 
  782      END IF
  783
  784      IF( info.NE.0 ) THEN
  785         CALL pxerbla( ictxt, 
'PZLAGEN', -info )
 
  786         RETURN
  787      END IF
  788
  789
  790
  791      IF( ( m.LE.0 ).OR.( n.LE.0 ) )
  792     $   RETURN
  793
  794
  795
  796      mb   = desca2( mb_   )
  797      nb   = desca2( nb_   )
  798      imb  = desca2( imb_  )
  799      inb  = desca2( inb_  )
  800      rsrc = desca2( rsrc_ )
  801      csrc = desca2( csrc_ )
  802
  803
  804
  805      CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
 
  806     $                  mycol, imb1, inb1, mp, nq, iia, jja, iarow,
  807     $                  iacol, mrrow, mrcol )
  808
  809
  810
  811      IF( inplace ) THEN
  812         iia = 1
  813         jja = 1
  814      END IF
  815
  816
  817
  818
  819      ioffda = ja + offa - ia
  820      CALL pb_binfo( ioffda, mp, nq, imb1, inb1, mb, nb, mrrow,
 
  821     $               mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
  822     $               lmbloc, lnbloc, ilow, low, iupp, upp )
  823
  824
  825
  826
  827
  828
  829
  830      itmp   = 
max( 0, -offa )
 
  831      ivir   = ia  + itmp
  832      imbvir = imb + itmp
  833      nvir   = desca2( m_ ) + itmp
  834
  835      CALL pb_locinfo( ivir, imbvir, mb, myrow, rsrc, nprow, ilocblk,
 
  836     $                 ilocoff, myrdist )
  837
  838      itmp   = 
max( 0, offa )
 
  839      jvir   = ja  + itmp
  840      inbvir = inb + itmp
  841      nvir   = 
max( 
max( nvir, desca2( n_ ) + itmp ),
 
  842     $              desca2( m_ ) + desca2( n_ ) - 1 )
  843
  844      CALL pb_locinfo( jvir, inbvir, nb, mycol, csrc, npcol, jlocblk,
 
  845     $                 jlocoff, mycdist )
  846
  847      IF( symm .OR. herm .OR. notran ) THEN
  848
  849         CALL pb_initjmp( .true., nvir, imbvir, inbvir, imbloc, inbloc,
 
  850     $                    mb, nb, rsrc, csrc, nprow, npcol, 2, jmp )
  851
  852
  853
  855
  856
  857
  858         CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
 
  859     $                      myrdist, mycdist, nprow, npcol, jmp,
  860     $                      imuladd, iran )
  861
  862         CALL pb_zlagen( 
'Lower', aform, a( iia, jja ), lda, lcmt00,
 
  863     $                   iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
  864     $                   nb, lnbloc, jmp, imuladd )
  865
  866      END IF
  867
  868      IF( symm .OR. herm .OR. ( .NOT. notran ) ) THEN
  869
  870         CALL pb_initjmp( .false., nvir, imbvir, inbvir, imbloc, inbloc,
 
  871     $                    mb, nb, rsrc, csrc, nprow, npcol, 2, jmp )
  872
  873
  874
  876
  877
  878
  879         CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
 
  880     $                      myrdist, mycdist, nprow, npcol, jmp,
  881     $                      imuladd, iran )
  882
  883         CALL pb_zlagen( 
'Upper', aform, a( iia, jja ), lda, lcmt00,
 
  884     $                   iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
  885     $                   nb, lnbloc, jmp, imuladd )
  886
  887      END IF
  888
  889      IF( diagdo ) THEN
  890
  891         maxmn = 
max( desca2( m_ ), desca2( n_ ) )
 
  892         IF( herm ) THEN
  893            alpha = dcmplx( dble( 2 * maxmn ), zero )
  894         ELSE
  895            alpha = dcmplx( dble( nvir ), dble( maxmn ) )
  896         END IF
  897
  898         IF( ioffda.GE.0 ) THEN
  900     $                    a, 
min( ia+ioffda, ia+m-1 ), ja, desca )
 
  901         ELSE
  903     $                    a, ia, 
min( ja-ioffda, ja+n-1 ), desca )
 
  904         END IF
  905
  906      END IF
  907
  908      RETURN
  909
  910
  911
subroutine pb_ainfog2l(m, n, i, j, desc, nprow, npcol, myrow, mycol, imb1, inb1, mp, nq, ii, jj, prow, pcol, rprow, rpcol)
 
subroutine pb_binfo(offd, m, n, imb1, inb1, mb, nb, mrrow, mrcol, lcmt00, mblks, nblks, imbloc, inbloc, lmbloc, lnbloc, ilow, low, iupp, upp)
 
subroutine pb_setran(iran, iac)
 
subroutine pb_locinfo(i, inb, nb, myroc, srcproc, nprocs, ilocblk, ilocoff, mydist)
 
subroutine pb_chkmat(ictxt, m, mpos0, n, npos0, ia, ja, desca, dpos0, info)
 
subroutine pb_jump(k, muladd, irann, iranm, ima)
 
subroutine pb_setlocran(seed, ilocblk, jlocblk, ilocoff, jlocoff, myrdist, mycdist, nprow, npcol, jmp, imuladd, iran)
 
subroutine pb_initmuladd(muladd0, jmp, imuladd)
 
subroutine pb_desctrans(descin, descout)
 
subroutine pb_initjmp(colmaj, nvir, imbvir, inbvir, imbloc, inbloc, mb, nb, rsrc, csrc, nprow, npcol, stride, jmp)
 
subroutine pb_jumpit(muladd, irann, iranm)
 
subroutine pxerbla(ictxt, srname, info)
 
subroutine pb_zlagen(uplo, aform, a, lda, lcmt00, iran, mblks, imbloc, mb, lmbloc, nblks, inbloc, nb, lnbloc, jmp, imuladd)
 
subroutine pzladom(inplace, n, alpha, a, ia, ja, desca)