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)