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 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 REAL ZERO
717 parameter( zero = 0.0e+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 ALPHA
729
730
731 INTEGER DESCA2( DLEN_ ), IMULADD( 4, JMP_LEN ),
732 $ IRAN( 2 ), JMP( JMP_LEN ), MULADD0( 4 )
733
734
739
740
741 LOGICAL LSAME
743
744
746
747
748 DATA ( muladd0( i ), i = 1, 4 ) / 20077, 16838,
749 $ 12345, 0 /
750
751
752
753
754
756
757
758
759 ictxt = desca2( ctxt_ )
760 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
761
762
763
764 info = 0
765 IF( nprow.EQ.-1 ) THEN
766 info = -( 1000 + ctxt_ )
767 ELSE
768 symm =
lsame( aform,
'S' )
769 herm =
lsame( aform,
'H' )
770 notran =
lsame( aform,
'N' )
771 diagdo =
lsame( diag,
'D' )
772 IF( .NOT.( symm.OR.herm.OR.notran ) .AND.
773 $ .NOT.(
lsame( aform,
'T' ) ) .AND.
774 $ .NOT.(
lsame( aform,
'C' ) ) )
THEN
775 info = -2
776 ELSE IF( ( .NOT.diagdo ) .AND.
777 $ ( .NOT.
lsame( diag,
'N' ) ) )
THEN
778 info = -3
779 END IF
780 CALL pb_chkmat( ictxt, m, 5, n, 6, ia, ja, desca2, 10, info )
781 END IF
782
783 IF( info.NE.0 ) THEN
784 CALL pxerbla( ictxt,
'PCLAGEN', -info )
785 RETURN
786 END IF
787
788
789
790 IF( ( m.LE.0 ).OR.( n.LE.0 ) )
791 $ RETURN
792
793
794
795 mb = desca2( mb_ )
796 nb = desca2( nb_ )
797 imb = desca2( imb_ )
798 inb = desca2( inb_ )
799 rsrc = desca2( rsrc_ )
800 csrc = desca2( csrc_ )
801
802
803
804 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
805 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
806 $ iacol, mrrow, mrcol )
807
808
809
810 IF( inplace ) THEN
811 iia = 1
812 jja = 1
813 END IF
814
815
816
817
818 ioffda = ja + offa - ia
819 CALL pb_binfo( ioffda, mp, nq, imb1, inb1, mb, nb, mrrow,
820 $ mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
821 $ lmbloc, lnbloc, ilow, low, iupp, upp )
822
823
824
825
826
827
828
829 itmp =
max( 0, -offa )
830 ivir = ia + itmp
831 imbvir = imb + itmp
832 nvir = desca2( m_ ) + itmp
833
834 CALL pb_locinfo( ivir, imbvir, mb, myrow, rsrc, nprow, ilocblk,
835 $ ilocoff, myrdist )
836
837 itmp =
max( 0, offa )
838 jvir = ja + itmp
839 inbvir = inb + itmp
840 nvir =
max(
max( nvir, desca2( n_ ) + itmp ),
841 $ desca2( m_ ) + desca2( n_ ) - 1 )
842
843 CALL pb_locinfo( jvir, inbvir, nb, mycol, csrc, npcol, jlocblk,
844 $ jlocoff, mycdist )
845
846 IF( symm .OR. herm .OR. notran ) THEN
847
848 CALL pb_initjmp( .true., nvir, imbvir, inbvir, imbloc, inbloc,
849 $ mb, nb, rsrc, csrc, nprow, npcol, 2, jmp )
850
851
852
854
855
856
857 CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
858 $ myrdist, mycdist, nprow, npcol, jmp,
859 $ imuladd, iran )
860
861 CALL pb_clagen(
'Lower', aform, a( iia, jja ), lda, lcmt00,
862 $ iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
863 $ nb, lnbloc, jmp, imuladd )
864
865 END IF
866
867 IF( symm .OR. herm .OR. ( .NOT. notran ) ) THEN
868
869 CALL pb_initjmp( .false., nvir, imbvir, inbvir, imbloc, inbloc,
870 $ mb, nb, rsrc, csrc, nprow, npcol, 2, jmp )
871
872
873
875
876
877
878 CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
879 $ myrdist, mycdist, nprow, npcol, jmp,
880 $ imuladd, iran )
881
882 CALL pb_clagen(
'Upper', aform, a( iia, jja ), lda, lcmt00,
883 $ iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
884 $ nb, lnbloc, jmp, imuladd )
885
886 END IF
887
888 IF( diagdo ) THEN
889
890 maxmn =
max( desca2( m_ ), desca2( n_ ) )
891 IF( herm ) THEN
892 alpha =
cmplx( real( 2 * maxmn ), zero )
893 ELSE
894 alpha =
cmplx( real( maxmn ), real( maxmn ) )
895 END IF
896
897 IF( ioffda.GE.0 ) THEN
899 $ a,
min( ia+ioffda, ia+m-1 ), ja, desca )
900 ELSE
902 $ a, ia,
min( ja-ioffda, ja+n-1 ), desca )
903 END IF
904
905 END IF
906
907 RETURN
908
909
910
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)