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 DOUBLE PRECISION 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
717
718 LOGICAL DIAGDO, SYMM, HERM, NOTRAN
719 INTEGER CSRC, I, IACOL, IAROW, ICTXT, IIA, ILOCBLK,
720 $ ILOCOFF, ILOW, IMB, IMB1, IMBLOC, IMBVIR, INB,
721 $ INB1, INBLOC, INBVIR, INFO, IOFFDA, ITMP, IUPP,
722 $ IVIR, JJA, JLOCBLK, JLOCOFF, JVIR, LCMT00,
723 $ LMBLOC, LNBLOC, LOW, MAXMN, MB, MBLKS, MP,
724 $ MRCOL, MRROW, MYCDIST, MYCOL, MYRDIST, MYROW,
725 $ NB, NBLKS, NPCOL, NPROW, NQ, NVIR, RSRC, UPP
726 DOUBLE PRECISION ALPHA
727
728
729 INTEGER DESCA2( DLEN_ ), IMULADD( 4, JMP_LEN ),
730 $ IRAN( 2 ), JMP( JMP_LEN ), MULADD0( 4 )
731
732
737
738
739 LOGICAL LSAME
741
742
744
745
746 DATA ( muladd0( i ), i = 1, 4 ) / 20077, 16838,
747 $ 12345, 0 /
748
749
750
751
752
754
755
756
757 ictxt = desca2( ctxt_ )
758 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
759
760
761
762 info = 0
763 IF( nprow.EQ.-1 ) THEN
764 info = -( 1000 + ctxt_ )
765 ELSE
766 symm =
lsame( aform,
'S' )
767 herm =
lsame( aform,
'H' )
768 notran =
lsame( aform,
'N' )
769 diagdo =
lsame( diag,
'D' )
770 IF( .NOT.( symm.OR.herm.OR.notran ) .AND.
771 $ .NOT.(
lsame( aform,
'T' ) ) .AND.
772 $ .NOT.(
lsame( aform,
'C' ) ) )
THEN
773 info = -2
774 ELSE IF( ( .NOT.diagdo ) .AND.
775 $ ( .NOT.
lsame( diag,
'N' ) ) )
THEN
776 info = -3
777 END IF
778 CALL pb_chkmat( ictxt, m, 5, n, 6, ia, ja, desca2, 10, info )
779 END IF
780
781 IF( info.NE.0 ) THEN
782 CALL pxerbla( ictxt,
'PDLAGEN', -info )
783 RETURN
784 END IF
785
786
787
788 IF( ( m.LE.0 ).OR.( n.LE.0 ) )
789 $ RETURN
790
791
792
793 mb = desca2( mb_ )
794 nb = desca2( nb_ )
795 imb = desca2( imb_ )
796 inb = desca2( inb_ )
797 rsrc = desca2( rsrc_ )
798 csrc = desca2( csrc_ )
799
800
801
802 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
803 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
804 $ iacol, mrrow, mrcol )
805
806
807
808 IF( inplace ) THEN
809 iia = 1
810 jja = 1
811 END IF
812
813
814
815
816 ioffda = ja + offa - ia
817 CALL pb_binfo( ioffda, mp, nq, imb1, inb1, mb, nb, mrrow,
818 $ mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
819 $ lmbloc, lnbloc, ilow, low, iupp, upp )
820
821
822
823
824
825
826
827 itmp =
max( 0, -offa )
828 ivir = ia + itmp
829 imbvir = imb + itmp
830 nvir = desca2( m_ ) + itmp
831
832 CALL pb_locinfo( ivir, imbvir, mb, myrow, rsrc, nprow, ilocblk,
833 $ ilocoff, myrdist )
834
835 itmp =
max( 0, offa )
836 jvir = ja + itmp
837 inbvir = inb + itmp
838 nvir =
max(
max( nvir, desca2( n_ ) + itmp ),
839 $ desca2( m_ ) + desca2( n_ ) - 1 )
840
841 CALL pb_locinfo( jvir, inbvir, nb, mycol, csrc, npcol, jlocblk,
842 $ jlocoff, mycdist )
843
844 IF( symm .OR. herm .OR. notran ) THEN
845
846 CALL pb_initjmp( .true., nvir, imbvir, inbvir, imbloc, inbloc,
847 $ mb, nb, rsrc, csrc, nprow, npcol, 1, jmp )
848
849
850
852
853
854
855 CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
856 $ myrdist, mycdist, nprow, npcol, jmp,
857 $ imuladd, iran )
858
859 CALL pb_dlagen(
'Lower', aform, a( iia, jja ), lda, lcmt00,
860 $ iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
861 $ nb, lnbloc, jmp, imuladd )
862
863 END IF
864
865 IF( symm .OR. herm .OR. ( .NOT. notran ) ) THEN
866
867 CALL pb_initjmp( .false., nvir, imbvir, inbvir, imbloc, inbloc,
868 $ mb, nb, rsrc, csrc, nprow, npcol, 1, jmp )
869
870
871
873
874
875
876 CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
877 $ myrdist, mycdist, nprow, npcol, jmp,
878 $ imuladd, iran )
879
880 CALL pb_dlagen(
'Upper', aform, a( iia, jja ), lda, lcmt00,
881 $ iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
882 $ nb, lnbloc, jmp, imuladd )
883
884 END IF
885
886 IF( diagdo ) THEN
887
888 maxmn =
max( desca2( m_ ), desca2( n_ ) )
889 alpha = dble( maxmn )
890
891 IF( ioffda.GE.0 ) THEN
893 $ a,
min( ia+ioffda, ia+m-1 ), ja, desca )
894 ELSE
896 $ a, ia,
min( ja-ioffda, ja+n-1 ), desca )
897 END IF
898
899 END IF
900
901 RETURN
902
903
904
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 pb_dlagen(uplo, aform, a, lda, lcmt00, iran, mblks, imbloc, mb, lmbloc, nblks, inbloc, nb, lnbloc, jmp, imuladd)
subroutine pdladom(inplace, n, alpha, a, ia, ja, desca)
subroutine pxerbla(ictxt, srname, info)