2876
 2877
 2878
 2879
 2880
 2881
 2882
 2883      INTEGER            INCX, INFO, IX, JX, N
 2884
 2885
 2886      INTEGER            DESCX( * )
 2887      COMPLEX*16         PX( * ), X( * )
 2888
 2889
 2890
 2891
 2892
 2893
 2894
 2895
 2896
 2897
 2898
 2899
 2900
 2901
 2902
 2903
 2904
 2905
 2906
 2907
 2908
 2909
 2910
 2911
 2912
 2913
 2914
 2915
 2916
 2917
 2918
 2919
 2920
 2921
 2922
 2923
 2924
 2925
 2926
 2927
 2928
 2929
 2930
 2931
 2932
 2933
 2934
 2935
 2936
 2937
 2938
 2939
 2940
 2941
 2942
 2943
 2944
 2945
 2946
 2947
 2948
 2949
 2950
 2951
 2952
 2953
 2954
 2955
 2956
 2957
 2958
 2959
 2960
 2961
 2962
 2963
 2964
 2965
 2966
 2967
 2968
 2969
 2970
 2971
 2972
 2973
 2974
 2975
 2976
 2977
 2978
 2979
 2980
 2981
 2982
 2983
 2984
 2985
 2986
 2987
 2988
 2989
 2990
 2991
 2992
 2993
 2994
 2995
 2996
 2997
 2998
 2999
 3000
 3001
 3002
 3003
 3004
 3005
 3006
 3007      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 3008     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 3009     $                   RSRC_
 3010      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 3011     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 3012     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 3013     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 3014      DOUBLE PRECISION   ZERO
 3015      parameter( zero = 0.0d+0 )
 3016
 3017
 3018      LOGICAL            COLREP, ROWREP
 3019      INTEGER            I, IB, ICTXT, ICURCOL, ICURROW, II, IMBX, INBX,
 3020     $                   J, JB, JJ, KK, LDPX, LDX, LL, MBX, MPALL,
 3021     $                   MYCOL, MYCOLDIST, MYROW, MYROWDIST, NBX, NPCOL,
 3022     $                   NPROW, NQALL
 3023      DOUBLE PRECISION   EPS, ERR, ERRMAX
 3024
 3025
 3026      EXTERNAL           blacs_gridinfo, dgamx2d, 
pzerrset 
 3027
 3028
 3029      INTEGER            PB_NUMROC
 3030      DOUBLE PRECISION   PDLAMCH
 3032
 3033
 3034      INTRINSIC          abs, dble, dimag, 
max, 
min, mod
 
 3035
 3036
 3037
 3038      info = 0
 3039      errmax = zero
 3040
 3041
 3042
 3043      IF( ( descx( m_ ).LE.0 ).OR.( descx( n_ ).LE.0 ) )
 3044     $   RETURN
 3045
 3046
 3047
 3048      ictxt = descx( ctxt_ )
 3049      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 3050
 3052
 3053      mpall   = 
pb_numroc( descx( m_ ), 1, descx( imb_ ), descx( mb_ ),
 
 3054     $                     myrow, descx( rsrc_ ), nprow )
 3055      nqall   = 
pb_numroc( descx( n_ ), 1, descx( inb_ ), descx( nb_ ),
 
 3056     $                     mycol, descx( csrc_ ), npcol )
 3057
 3058      mbx     = descx( mb_ )
 3059      nbx     = descx( nb_ )
 3060      ldx     = descx( m_ )
 3061      ldpx    = descx( lld_ )
 3062      icurrow = descx( rsrc_ )
 3063      icurcol = descx( csrc_ )
 3064      rowrep  = ( icurrow.EQ.-1 )
 3065      colrep  = ( icurcol.EQ.-1 )
 3066      IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3067         imbx = descx( imb_ )
 3068      ELSE
 3069         imbx = mbx
 3070      END IF
 3071      IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3072         inbx = descx( inb_ )
 3073      ELSE
 3074         inbx = nbx
 3075      END IF
 3076      IF( rowrep ) THEN
 3077         myrowdist = 0
 3078      ELSE
 3079         myrowdist = mod( myrow - icurrow + nprow, nprow )
 3080      END IF
 3081      IF( colrep ) THEN
 3082         mycoldist = 0
 3083      ELSE
 3084         mycoldist = mod( mycol - icurcol + npcol, npcol )
 3085      END IF
 3086      ii = 1
 3087      jj = 1
 3088
 3089      IF( incx.EQ.descx( m_ ) ) THEN
 3090
 3091
 3092
 3093         IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3094
 3095            i = 1
 3096            IF( mycoldist.EQ.0 ) THEN
 3097               j = 1
 3098            ELSE
 3099               j = descx( inb_ ) + ( mycoldist - 1 ) * nbx + 1
 3100            END IF
 3101            jb = 
min( 
max( 0, descx( n_ ) - j + 1 ), inbx )
 
 3102            ib = 
min( descx( m_ ), descx( imb_ ) )
 
 3103
 3104            DO 20 kk = 0, jb-1
 3105               DO 10 ll = 0, ib-1
 3106                  IF( i+ll.NE.ix .OR. j+kk.LT.jx .OR. j+kk.GT.jx+n-1 )
 3108     $                              x( i+ll+(j+kk-1)*ldx ),
 3109     $                              px( ii+ll+(jj+kk-1)*ldpx ) )
 3110   10          CONTINUE
 3111   20       CONTINUE
 3112            IF( colrep ) THEN
 3113               j = j + inbx
 3114            ELSE
 3115               j = j + inbx + ( npcol - 1 ) * nbx
 3116            END IF
 3117
 3118            DO 50 jj = inbx+1, nqall, nbx
 3119               jb = 
min( nqall-jj+1, nbx )
 
 3120
 3121               DO 40 kk = 0, jb-1
 3122                  DO 30 ll = 0, ib-1
 3123                     IF( i+ll.NE.ix .OR. j+kk.LT.jx .OR.
 3124     $                   j+kk.GT.jx+n-1 )
 3126     $                                 x( i+ll+(j+kk-1)*ldx ),
 3127     $                                 px( ii+ll+(jj+kk-1)*ldpx ) )
 3128   30             CONTINUE
 3129   40          CONTINUE
 3130
 3131               IF( colrep ) THEN
 3132                  j = j + nbx
 3133               ELSE
 3134                  j = j + npcol * nbx
 3135               END IF
 3136
 3137   50       CONTINUE
 3138
 3139            ii = ii + ib
 3140
 3141         END IF
 3142
 3143         icurrow = mod( icurrow + 1, nprow )
 3144
 3145         DO 110 i = descx( imb_ ) + 1, descx( m_ ), mbx
 3146            ib = 
min( descx( m_ ) - i + 1, mbx )
 
 3147
 3148            IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 3149
 3150               IF( mycoldist.EQ.0 ) THEN
 3151                  j = 1
 3152               ELSE
 3153                  j = descx( inb_ ) + ( mycoldist - 1 ) * nbx + 1
 3154               END IF
 3155
 3156               jj = 1
 3157               jb = 
min( 
max( 0, descx( n_ ) - j + 1 ), inbx )
 
 3158               DO 70 kk = 0, jb-1
 3159                  DO 60 ll = 0, ib-1
 3160                     IF( i+ll.NE.ix .OR. j+kk.LT.jx .OR.
 3161     $                   j+kk.GT.jx+n-1 )
 3163     $                                 x( i+ll+(j+kk-1)*ldx ),
 3164     $                                 px( ii+ll+(jj+kk-1)*ldpx ) )
 3165   60             CONTINUE
 3166   70          CONTINUE
 3167               IF( colrep ) THEN
 3168                  j = j + inbx
 3169               ELSE
 3170                  j = j + inbx + ( npcol - 1 ) * nbx
 3171               END IF
 3172
 3173               DO 100 jj = inbx+1, nqall, nbx
 3174                  jb = 
min( nqall-jj+1, nbx )
 
 3175
 3176                  DO 90 kk = 0, jb-1
 3177                     DO 80 ll = 0, ib-1
 3178                        IF( i+ll.NE.ix .OR. j+kk.LT.jx .OR.
 3179     $                      j+kk.GT.jx+n-1 )
 3181     $                                    x( i+ll+(j+kk-1)*ldx ),
 3182     $                                    px( ii+ll+(jj+kk-1)*ldpx ) )
 3183   80                CONTINUE
 3184   90             CONTINUE
 3185
 3186                  IF( colrep ) THEN
 3187                     j = j + nbx
 3188                  ELSE
 3189                     j = j + npcol * nbx
 3190                  END IF
 3191
 3192  100          CONTINUE
 3193
 3194               ii = ii + ib
 3195
 3196            END IF
 3197
 3198            icurrow = mod( icurrow + 1, nprow )
 3199
 3200  110    CONTINUE
 3201
 3202      ELSE
 3203
 3204
 3205
 3206         IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3207
 3208            j = 1
 3209            IF( myrowdist.EQ.0 ) THEN
 3210               i = 1
 3211            ELSE
 3212               i = descx( imb_ ) + ( myrowdist - 1 ) * mbx + 1
 3213            END IF
 3214            ib = 
min( 
max( 0, descx( m_ ) - i + 1 ), imbx )
 
 3215            jb = 
min( descx( n_ ), descx( inb_ ) )
 
 3216
 3217            DO 130 kk = 0, jb-1
 3218               DO 120 ll = 0, ib-1
 3219                  IF( j+kk.NE.jx .OR. i+ll.LT.ix .OR. i+ll.GT.ix+n-1 )
 3221     $                              x( i+ll+(j+kk-1)*ldx ),
 3222     $                              px( ii+ll+(jj+kk-1)*ldpx ) )
 3223  120          CONTINUE
 3224  130       CONTINUE
 3225            IF( rowrep ) THEN
 3226               i = i + imbx
 3227            ELSE
 3228               i = i + imbx + ( nprow - 1 ) * mbx
 3229            END IF
 3230
 3231            DO 160 ii = imbx+1, mpall, mbx
 3232               ib = 
min( mpall-ii+1, mbx )
 
 3233
 3234               DO 150 kk = 0, jb-1
 3235                  DO 140 ll = 0, ib-1
 3236                     IF( j+kk.NE.jx .OR. i+ll.LT.ix .OR.
 3237     $                   i+ll.GT.ix+n-1 )
 3239     $                                 x( i+ll+(j+kk-1)*ldx ),
 3240     $                                 px( ii+ll+(jj+kk-1)*ldpx ) )
 3241  140             CONTINUE
 3242  150          CONTINUE
 3243
 3244               IF( rowrep ) THEN
 3245                  i = i + mbx
 3246               ELSE
 3247                  i = i + nprow * mbx
 3248               END IF
 3249
 3250  160       CONTINUE
 3251
 3252            jj = jj + jb
 3253
 3254         END IF
 3255
 3256         icurcol = mod( icurcol + 1, npcol )
 3257
 3258         DO 220 j = descx( inb_ ) + 1, descx( n_ ), nbx
 3259            jb = 
min( descx( n_ ) - j + 1, nbx )
 
 3260
 3261            IF( mycol.EQ.icurcol .OR. colrep ) THEN
 3262
 3263               IF( myrowdist.EQ.0 ) THEN
 3264                  i = 1
 3265               ELSE
 3266                  i = descx( imb_ ) + ( myrowdist - 1 ) * mbx + 1
 3267               END IF
 3268
 3269               ii = 1
 3270               ib = 
min( 
max( 0, descx( m_ ) - i + 1 ), imbx )
 
 3271               DO 180 kk = 0, jb-1
 3272                  DO 170 ll = 0, ib-1
 3273                     IF( j+kk.NE.jx .OR. i+ll.LT.ix .OR.
 3274     $                   i+ll.GT.ix+n-1 )
 3276     $                                 x( i+ll+(j+kk-1)*ldx ),
 3277     $                                 px( ii+ll+(jj+kk-1)*ldpx ) )
 3278  170             CONTINUE
 3279  180          CONTINUE
 3280               IF( rowrep ) THEN
 3281                  i = i + imbx
 3282               ELSE
 3283                  i = i + imbx + ( nprow - 1 ) * mbx
 3284               END IF
 3285
 3286               DO 210 ii = imbx+1, mpall, mbx
 3287                  ib = 
min( mpall-ii+1, mbx )
 
 3288
 3289                  DO 200 kk = 0, jb-1
 3290                     DO 190 ll = 0, ib-1
 3291                        IF( j+kk.NE.jx .OR. i+ll.LT.ix .OR.
 3292     $                      i+ll.GT.ix+n-1 )
 3294     $                                    x( i+ll+(j+kk-1)*ldx ),
 3295     $                                    px( ii+ll+(jj+kk-1)*ldpx ) )
 3296  190                CONTINUE
 3297  200             CONTINUE
 3298
 3299                  IF( rowrep ) THEN
 3300                     i = i + mbx
 3301                  ELSE
 3302                     i = i + nprow * mbx
 3303                  END IF
 3304
 3305  210          CONTINUE
 3306
 3307               jj = jj + jb
 3308
 3309            END IF
 3310
 3311            icurcol = mod( icurcol + 1, npcol )
 3312
 3313  220    CONTINUE
 3314
 3315      END IF
 3316
 3317      CALL dgamx2d( ictxt, 'All', ' ', 1, 1, errmax, 1, kk, ll, -1,
 3318     $              -1, -1 )
 3319
 3320      IF( errmax.GT.zero .AND. errmax.LE.eps ) THEN
 3321         info = 1
 3322      ELSE IF( errmax.GT.eps ) THEN
 3323         info = -1
 3324      END IF
 3325
 3326      RETURN
 3327
 3328
 3329
integer function pb_numroc(n, i, inb, nb, proc, srcproc, nprocs)
 
double precision function pdlamch(ictxt, cmach)
 
subroutine pzerrset(err, errmax, xtrue, x)