8491
8492
8493
8494
8495
8496
8497
8498 LOGICAL INPLACE
8499 CHARACTER*1 AFORM, DIAG
8500 INTEGER IA, IASEED, JA, LDA, M, N, OFFA
8501
8502
8503 INTEGER DESCA( * )
8504 COMPLEX A( LDA, * )
8505
8506
8507
8508
8509
8510
8511
8512
8513
8514
8515
8516
8517
8518
8519
8520
8521
8522
8523
8524
8525
8526
8527
8528
8529
8530
8531
8532
8533
8534
8535
8536
8537
8538
8539
8540
8541
8542
8543
8544
8545
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680
8681
8682 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
8683 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
8684 $ RSRC_
8685 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
8686 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
8687 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
8688 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
8689 INTEGER JMP_1, JMP_COL, JMP_IMBV, JMP_INBV, JMP_LEN,
8690 $ JMP_MB, JMP_NB, JMP_NPIMBLOC, JMP_NPMB,
8691 $ JMP_NQINBLOC, JMP_NQNB, JMP_ROW
8692 parameter( jmp_1 = 1, jmp_row = 2, jmp_col = 3,
8693 $ jmp_mb = 4, jmp_imbv = 5, jmp_npmb = 6,
8694 $ jmp_npimbloc = 7, jmp_nb = 8, jmp_inbv = 9,
8695 $ jmp_nqnb = 10, jmp_nqinbloc = 11,
8696 $ jmp_len = 11 )
8697 REAL ZERO
8698 parameter( zero = 0.0e+0 )
8699
8700
8701 LOGICAL DIAGDO, SYMM, HERM, NOTRAN
8702 INTEGER CSRC, I, IACOL, IAROW, ICTXT, IIA, ILOCBLK,
8703 $ ILOCOFF, ILOW, IMB, IMB1, IMBLOC, IMBVIR, INB,
8704 $ INB1, INBLOC, INBVIR, INFO, IOFFDA, ITMP, IUPP,
8705 $ IVIR, JJA, JLOCBLK, JLOCOFF, JVIR, LCMT00,
8706 $ LMBLOC, LNBLOC, LOW, MAXMN, MB, MBLKS, MP,
8707 $ MRCOL, MRROW, MYCDIST, MYCOL, MYRDIST, MYROW,
8708 $ NB, NBLKS, NPCOL, NPROW, NQ, NVIR, RSRC, UPP
8709 COMPLEX ALPHA
8710
8711
8712 INTEGER DESCA2( DLEN_ ), IMULADD( 4, JMP_LEN ),
8713 $ IRAN( 2 ), JMP( JMP_LEN ), MULADD0( 4 )
8714
8715
8720
8721
8722 LOGICAL LSAME
8724
8725
8727
8728
8729 DATA ( muladd0( i ), i = 1, 4 ) / 20077, 16838,
8730 $ 12345, 0 /
8731
8732
8733
8734
8735
8737
8738
8739
8740 ictxt = desca2( ctxt_ )
8741 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
8742
8743
8744
8745 info = 0
8746 IF( nprow.EQ.-1 ) THEN
8747 info = -( 1000 + ctxt_ )
8748 ELSE
8749 symm =
lsame( aform,
'S' )
8750 herm =
lsame( aform,
'H' )
8751 notran =
lsame( aform,
'N' )
8752 diagdo =
lsame( diag,
'D' )
8753 IF( .NOT.( symm.OR.herm.OR.notran ) .AND.
8754 $ .NOT.(
lsame( aform,
'T' ) ) .AND.
8755 $ .NOT.(
lsame( aform,
'C' ) ) )
THEN
8756 info = -2
8757 ELSE IF( ( .NOT.diagdo ) .AND.
8758 $ ( .NOT.
lsame( diag,
'N' ) ) )
THEN
8759 info = -3
8760 END IF
8761 CALL pb_chkmat( ictxt, m, 5, n, 6, ia, ja, desca2, 10, info )
8762 END IF
8763
8764 IF( info.NE.0 ) THEN
8765 CALL pxerbla( ictxt,
'PCLAGEN', -info )
8766 RETURN
8767 END IF
8768
8769
8770
8771 IF( ( m.LE.0 ).OR.( n.LE.0 ) )
8772 $ RETURN
8773
8774
8775
8776 mb = desca2( mb_ )
8777 nb = desca2( nb_ )
8778 imb = desca2( imb_ )
8779 inb = desca2( inb_ )
8780 rsrc = desca2( rsrc_ )
8781 csrc = desca2( csrc_ )
8782
8783
8784
8785 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
8786 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
8787 $ iacol, mrrow, mrcol )
8788
8789
8790
8791 IF( inplace ) THEN
8792 iia = 1
8793 jja = 1
8794 END IF
8795
8796
8797
8798
8799 ioffda = ja + offa - ia
8800 CALL pb_binfo( ioffda, mp, nq, imb1, inb1, mb, nb, mrrow,
8801 $ mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
8802 $ lmbloc, lnbloc, ilow, low, iupp, upp )
8803
8804
8805
8806
8807
8808
8809
8810 itmp =
max( 0, -offa )
8811 ivir = ia + itmp
8812 imbvir = imb + itmp
8813 nvir = desca2( m_ ) + itmp
8814
8815 CALL pb_locinfo( ivir, imbvir, mb, myrow, rsrc, nprow, ilocblk,
8816 $ ilocoff, myrdist )
8817
8818 itmp =
max( 0, offa )
8819 jvir = ja + itmp
8820 inbvir = inb + itmp
8821 nvir =
max(
max( nvir, desca2( n_ ) + itmp ),
8822 $ desca2( m_ ) + desca2( n_ ) - 1 )
8823
8824 CALL pb_locinfo( jvir, inbvir, nb, mycol, csrc, npcol, jlocblk,
8825 $ jlocoff, mycdist )
8826
8827 IF( symm .OR. herm .OR. notran ) THEN
8828
8829 CALL pb_initjmp( .true., nvir, imbvir, inbvir, imbloc, inbloc,
8830 $ mb, nb, rsrc, csrc, nprow, npcol, 2, jmp )
8831
8832
8833
8835
8836
8837
8838 CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
8839 $ myrdist, mycdist, nprow, npcol, jmp,
8840 $ imuladd, iran )
8841
8842 CALL pb_clagen(
'Lower', aform, a( iia, jja ), lda, lcmt00,
8843 $ iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
8844 $ nb, lnbloc, jmp, imuladd )
8845
8846 END IF
8847
8848 IF( symm .OR. herm .OR. ( .NOT. notran ) ) THEN
8849
8850 CALL pb_initjmp( .false., nvir, imbvir, inbvir, imbloc, inbloc,
8851 $ mb, nb, rsrc, csrc, nprow, npcol, 2, jmp )
8852
8853
8854
8856
8857
8858
8859 CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
8860 $ myrdist, mycdist, nprow, npcol, jmp,
8861 $ imuladd, iran )
8862
8863 CALL pb_clagen(
'Upper', aform, a( iia, jja ), lda, lcmt00,
8864 $ iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
8865 $ nb, lnbloc, jmp, imuladd )
8866
8867 END IF
8868
8869 IF( diagdo ) THEN
8870
8871 maxmn =
max( desca2( m_ ), desca2( n_ ) )
8872 IF( herm ) THEN
8873 alpha =
cmplx( real( 2 * maxmn ), zero )
8874 ELSE
8875 alpha =
cmplx( real( maxmn ), real( maxmn ) )
8876 END IF
8877
8878 IF( ioffda.GE.0 ) THEN
8880 $ a,
min( ia+ioffda, ia+m-1 ), ja, desca )
8881 ELSE
8883 $ a, ia,
min( ja-ioffda, ja+n-1 ), desca )
8884 END IF
8885
8886 END IF
8887
8888 RETURN
8889
8890
8891
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 pcladom(inplace, n, alpha, a, ia, ja, desca)
subroutine pb_clagen(uplo, aform, a, lda, lcmt00, iran, mblks, imbloc, mb, lmbloc, nblks, inbloc, nb, lnbloc, jmp, imuladd)
subroutine pxerbla(ictxt, srname, info)