2742
2743
2744
2745
2746
2747
2748
2749 INTEGER DPOS0, IA, ICTXT, INFO, JA, M, MPOS0, N, NPOS0
2750
2751
2752 INTEGER DESCA( * )
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
2819 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
2820 $ RSRC_
2821 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
2822 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
2823 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
2824 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
2825 INTEGER DESCMULT, BIGNUM
2826 parameter( descmult = 100, bignum = descmult*descmult )
2827
2828
2829 INTEGER DPOS, IAPOS, JAPOS, MP, MPOS, MYCOL, MYROW,
2830 $ NPCOL, NPOS, NPROW, NQ
2831
2832
2833 INTEGER DESCA2( DLEN_ )
2834
2835
2837
2838
2839 INTEGER PB_NUMROC
2841
2842
2844
2845
2846
2847
2848
2850
2851
2852
2853
2854
2855 IF( info.GE.0 ) THEN
2856 info = bignum
2857 ELSE IF( info.LT.-descmult ) THEN
2858 info = -info
2859 ELSE
2860 info = -info * descmult
2861 END IF
2862
2863
2864
2865
2866 mpos = mpos0 * descmult
2867 npos = npos0 * descmult
2868 iapos = ( dpos0 - 2 ) * descmult
2869 japos = ( dpos0 - 1 ) * descmult
2870 dpos = dpos0 * descmult
2871
2872
2873
2874 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
2875
2876
2877
2878 IF( m.LT.0 )
2879 $ info =
min( info, mpos )
2880 IF( n.LT.0 )
2881 $ info =
min( info, npos )
2882 IF( ia.LT.1 )
2883 $ info =
min( info, iapos )
2884 IF( ja.LT.1 )
2885 $ info =
min( info, japos )
2886 IF( desca2( dtype_ ).NE.block_cyclic_2d_inb )
2887 $ info =
min( info, dpos + dtype_ )
2888 IF( desca2( imb_ ).LT.1 )
2889 $ info =
min( info, dpos + imb_ )
2890 IF( desca2( inb_ ).LT.1 )
2891 $ info =
min( info, dpos + inb_ )
2892 IF( desca2( mb_ ).LT.1 )
2893 $ info =
min( info, dpos + mb_ )
2894 IF( desca2( nb_ ).LT.1 )
2895 $ info =
min( info, dpos + nb_ )
2896 IF( desca2( rsrc_ ).LT.-1 .OR. desca2( rsrc_ ).GE.nprow )
2897 $ info =
min( info, dpos + rsrc_ )
2898 IF( desca2( csrc_ ).LT.-1 .OR. desca2( csrc_ ).GE.npcol )
2899 $ info =
min( info, dpos + csrc_ )
2900 IF( desca2( ctxt_ ).NE.ictxt )
2901 $ info =
min( info, dpos + ctxt_ )
2902
2903 IF( m.EQ.0 .OR. n.EQ.0 ) THEN
2904
2905
2906
2907 IF( desca2( m_ ).LT.0 )
2908 $ info =
min( info, dpos + m_ )
2909 IF( desca2( n_ ).LT.0 )
2910 $ info =
min( info, dpos + n_ )
2911 IF( desca2( lld_ ).LT.1 )
2912 $ info =
min( info, dpos + lld_ )
2913
2914 ELSE
2915
2916
2917
2918 mp =
pb_numroc( desca2( m_ ), 1, desca2( imb_ ), desca2( mb_ ),
2919 $ myrow, desca2( rsrc_ ), nprow )
2920
2921 IF( desca2( m_ ).LT.1 )
2922 $ info =
min( info, dpos + m_ )
2923 IF( desca2( n_ ).LT.1 )
2924 $ info =
min( info, dpos + n_ )
2925 IF( ia.GT.desca2( m_ ) )
2926 $ info =
min( info, iapos )
2927 IF( ja.GT.desca2( n_ ) )
2928 $ info =
min( info, japos )
2929 IF( ia+m-1.GT.desca2( m_ ) )
2930 $ info =
min( info, mpos )
2931 IF( ja+n-1.GT.desca2( n_ ) )
2932 $ info =
min( info, npos )
2933
2934 IF( desca2( lld_ ).LT.
max( 1, mp ) )
THEN
2935 nq =
pb_numroc( desca2( n_ ), 1, desca2( inb_ ),
2936 $ desca2( nb_ ), mycol, desca2( csrc_ ),
2937 $ npcol )
2938 IF( desca2( lld_ ).LT.1 ) THEN
2939 info =
min( info, dpos + lld_ )
2940 ELSE IF( nq.GT.0 ) THEN
2941 info =
min( info, dpos + lld_ )
2942 END IF
2943 END IF
2944
2945 END IF
2946
2947
2948
2949
2950 IF( info.EQ.bignum ) THEN
2951 info = 0
2952 ELSE IF( mod( info, descmult ).EQ.0 ) THEN
2953 info = -( info / descmult )
2954 ELSE
2955 info = -info
2956 END IF
2957
2958 RETURN
2959
2960
2961
subroutine pb_desctrans(descin, descout)
integer function pb_numroc(n, i, inb, nb, proc, srcproc, nprocs)