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)