2737
2738
2739
2740
2741
2742
2743
2744 CHARACTER*1 DIAG, SIDE, TRANSA, TRANSB, UPLO
2745 INTEGER IA, IB, IC, ICTXT, INFO, JA, JB, JC, K, M, N,
2746 $ NOUT, NROUT
2747 REAL THRESH
2748 DOUBLE PRECISION ALPHA, BETA, ROGUE
2749
2750
2751 INTEGER DESCA( * ), DESCB( * ), DESCC( * )
2752 DOUBLE PRECISION A( * ), B( * ), C( * ), PA( * ), PB( * ),
2753 $ PC( * ), WORK( * )
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
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
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 DOUBLE PRECISION ONE, ZERO
2971 parameter( one = 1.0d+0, zero = 0.0d+0 )
2972 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
2973 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
2974 $ RSRC_
2975 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
2976 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
2977 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
2978 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
2979
2980
2981 INTEGER I, IPG, MYCOL, MYROW, NPCOL, NPROW
2982 DOUBLE PRECISION ERR
2983
2984
2985 INTEGER IERR( 3 )
2986
2987
2990
2991
2992 LOGICAL LSAME
2994
2995
2996 INTRINSIC dble
2997
2998
2999
3000 info = 0
3001
3002
3003
3004 IF( ( m.LE.0 ).OR.( n.LE.0 ) )
3005 $ RETURN
3006
3007
3008
3009 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
3010
3011 DO 10 i = 1, 3
3012 ierr( i ) = 0
3013 10 CONTINUE
3014 ipg =
max( m,
max( n, k ) ) + 1
3015
3016 IF( nrout.EQ.1 ) THEN
3017
3018
3019
3020
3021
3022 CALL pdmmch( ictxt, transa, transb, m, n, k, alpha, a, ia, ja,
3023 $ desca, b, ib, jb, descb, beta, c, pc, ic, jc,
3024 $ descc, work, work( ipg ), err, ierr( 3 ) )
3025
3026 IF( ierr( 3 ).NE.0 ) THEN
3027 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3028 $ WRITE( nout, fmt = 9998 )
3029 ELSE IF( err.GT.dble( thresh ) ) THEN
3030 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3031 $ WRITE( nout, fmt = 9997 ) err
3032 END IF
3033
3034
3035
3036 IF(
lsame( transa,
'N' ) )
THEN
3037 CALL pdchkmin( err, m, k, a, pa, ia, ja, desca, ierr( 1 ) )
3038 ELSE
3039 CALL pdchkmin( err, k, m, a, pa, ia, ja, desca, ierr( 1 ) )
3040 END IF
3041 IF(
lsame( transb,
'N' ) )
THEN
3042 CALL pdchkmin( err, k, n, b, pb, ib, jb, descb, ierr( 2 ) )
3043 ELSE
3044 CALL pdchkmin( err, n, k, b, pb, ib, jb, descb, ierr( 2 ) )
3045 END IF
3046
3047 ELSE IF( nrout.EQ.2 ) THEN
3048
3049
3050
3051
3052
3053 IF(
lsame( side,
'L' ) )
THEN
3054 CALL pdmmch( ictxt,
'No transpose',
'No transpose', m, n, m,
3055 $ alpha, a, ia, ja, desca, b, ib, jb, descb,
3056 $ beta, c, pc, ic, jc, descc, work, work( ipg ),
3057 $ err, ierr( 3 ) )
3058 ELSE
3059 CALL pdmmch( ictxt,
'No transpose',
'No transpose', m, n, n,
3060 $ alpha, b, ib, jb, descb, a, ia, ja, desca,
3061 $ beta, c, pc, ic, jc, descc, work, work( ipg ),
3062 $ err, ierr( 3 ) )
3063 END IF
3064
3065 IF( ierr( 3 ).NE.0 ) THEN
3066 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3067 $ WRITE( nout, fmt = 9998 )
3068 ELSE IF( err.GT.dble( thresh ) ) THEN
3069 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3070 $ WRITE( nout, fmt = 9997 ) err
3071 END IF
3072
3073
3074
3075 IF(
lsame( uplo,
'L' ) )
THEN
3076 IF(
lsame( side,
'L' ) )
THEN
3077 CALL pb_dlaset(
'Upper', m-1, m-1, 0, rogue, rogue,
3078 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
3079 ELSE
3080 CALL pb_dlaset(
'Upper', n-1, n-1, 0, rogue, rogue,
3081 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
3082 END IF
3083 ELSE
3084 IF(
lsame( side,
'L' ) )
THEN
3085 CALL pb_dlaset(
'Lower', m-1, m-1, 0, rogue, rogue,
3086 $ a( ia+1+(ja-1)*desca( m_ ) ),
3087 $ desca( m_ ) )
3088 ELSE
3089 CALL pb_dlaset(
'Lower', n-1, n-1, 0, rogue, rogue,
3090 $ a( ia+1+(ja-1)*desca( m_ ) ),
3091 $ desca( m_ ) )
3092 END IF
3093 END IF
3094
3095 IF(
lsame( side,
'L' ) )
THEN
3096 CALL pdchkmin( err, m, m, a, pa, ia, ja, desca, ierr( 1 ) )
3097 ELSE
3098 CALL pdchkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
3099 END IF
3100 CALL pdchkmin( err, m, n, b, pb, ib, jb, descb, ierr( 2 ) )
3101
3102 ELSE IF( nrout.EQ.3 ) THEN
3103
3104
3105
3106
3107
3108 IF(
lsame( transa,
'N' ) )
THEN
3109 CALL pdmmch1( ictxt, uplo,
'No transpose', n, k, alpha, a,
3110 $ ia, ja, desca, beta, c, pc, ic, jc, descc,
3111 $ work, work( ipg ), err, ierr( 3 ) )
3112 ELSE
3113 CALL pdmmch1( ictxt, uplo,
'Transpose', n, k, alpha, a, ia,
3114 $ ja, desca, beta, c, pc, ic, jc, descc, work,
3115 $ work( ipg ), err, ierr( 3 ) )
3116 END IF
3117
3118 IF( ierr( 3 ).NE.0 ) THEN
3119 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3120 $ WRITE( nout, fmt = 9998 )
3121 ELSE IF( err.GT.dble( thresh ) ) THEN
3122 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3123 $ WRITE( nout, fmt = 9997 ) err
3124 END IF
3125
3126
3127
3128 IF(
lsame( transa,
'N' ) )
THEN
3129 CALL pdchkmin( err, n, k, a, pa, ia, ja, desca, ierr( 1 ) )
3130 ELSE
3131 CALL pdchkmin( err, k, n, a, pa, ia, ja, desca, ierr( 1 ) )
3132 END IF
3133
3134 ELSE IF( nrout.EQ.4 ) THEN
3135
3136
3137
3138
3139
3140 IF(
lsame( transa,
'N' ) )
THEN
3141 CALL pdmmch2( ictxt, uplo,
'No transpose', n, k, alpha, a,
3142 $ ia, ja, desca, b, ib, jb, descb, beta, c, pc,
3143 $ ic, jc, descc, work, work( ipg ), err,
3144 $ ierr( 3 ) )
3145 ELSE
3146 CALL pdmmch2( ictxt, uplo,
'Transpose', n, k, alpha, a,
3147 $ ia, ja, desca, b, ib, jb, descb, beta, c, pc,
3148 $ ic, jc, descc, work, work( ipg ), err,
3149 $ ierr( 3 ) )
3150 END IF
3151
3152 IF( ierr( 3 ).NE.0 ) THEN
3153 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3154 $ WRITE( nout, fmt = 9998 )
3155 ELSE IF( err.GT.dble( thresh ) ) THEN
3156 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3157 $ WRITE( nout, fmt = 9997 ) err
3158 END IF
3159
3160
3161
3162 IF(
lsame( transa,
'N' ) )
THEN
3163 CALL pdchkmin( err, n, k, a, pa, ia, ja, desca, ierr( 1 ) )
3164 CALL pdchkmin( err, n, k, b, pb, ib, jb, descb, ierr( 2 ) )
3165 ELSE
3166 CALL pdchkmin( err, k, n, a, pa, ia, ja, desca, ierr( 1 ) )
3167 CALL pdchkmin( err, k, n, b, pb, ib, jb, descb, ierr( 2 ) )
3168 END IF
3169
3170 ELSE IF( nrout.EQ.5 ) THEN
3171
3172
3173
3174
3175
3176 IF(
lsame( side,
'L' ) )
THEN
3177 CALL pdmmch( ictxt, transa,
'No transpose', m, n, m,
3178 $ alpha, a, ia, ja, desca, c, ib, jb, descb,
3179 $ zero, b, pb, ib, jb, descb, work,
3180 $ work( ipg ), err, ierr( 2 ) )
3181 ELSE
3182 CALL pdmmch( ictxt,
'No transpose', transa, m, n, n,
3183 $ alpha, c, ib, jb, descb, a, ia, ja, desca,
3184 $ zero, b, pb, ib, jb, descb, work,
3185 $ work( ipg ), err, ierr( 2 ) )
3186 END IF
3187
3188 IF( ierr( 2 ).NE.0 ) THEN
3189 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3190 $ WRITE( nout, fmt = 9998 )
3191 ELSE IF( err.GT.dble( thresh ) ) THEN
3192 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3193 $ WRITE( nout, fmt = 9997 ) err
3194 END IF
3195
3196
3197
3198 IF(
lsame( side,
'L' ) )
THEN
3199 IF(
lsame( uplo,
'L' ) )
THEN
3200 IF(
lsame( diag,
'N' ) )
THEN
3201 CALL pb_dlaset(
'Upper', m-1, m-1, 0, rogue, rogue,
3202 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
3203 ELSE
3204 CALL pb_dlaset(
'Upper', m, m, 0, rogue, one,
3205 $ a( ia+(ja-1)*desca( m_ ) ),
3206 $ desca( m_ ) )
3207 END IF
3208 ELSE
3209 IF(
lsame( diag,
'N' ) )
THEN
3210 CALL pb_dlaset(
'Lower', m-1, m-1, 0, rogue, rogue,
3211 $ a( ia+1+(ja-1)*desca( m_ ) ),
3212 $ desca( m_ ) )
3213 ELSE
3214 CALL pb_dlaset(
'Lower', m, m, 0, rogue, one,
3215 $ a( ia+(ja-1)*desca( m_ ) ),
3216 $ desca( m_ ) )
3217 END IF
3218 END IF
3219 CALL pdchkmin( err, m, m, a, pa, ia, ja, desca, ierr( 1 ) )
3220 ELSE
3221 IF(
lsame( uplo,
'L' ) )
THEN
3222 IF(
lsame( diag,
'N' ) )
THEN
3223 CALL pb_dlaset(
'Upper', n-1, n-1, 0, rogue, rogue,
3224 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
3225 ELSE
3226 CALL pb_dlaset(
'Upper', n, n, 0, rogue, one,
3227 $ a( ia+(ja-1)*desca( m_ ) ),
3228 $ desca( m_ ) )
3229 END IF
3230 ELSE
3231 IF(
lsame( diag,
'N' ) )
THEN
3232 CALL pb_dlaset(
'Lower', n-1, n-1, 0, rogue, rogue,
3233 $ a( ia+1+(ja-1)*desca( m_ ) ),
3234 $ desca( m_ ) )
3235 ELSE
3236 CALL pb_dlaset(
'Lower', n, n, 0, rogue, one,
3237 $ a( ia+(ja-1)*desca( m_ ) ),
3238 $ desca( m_ ) )
3239 END IF
3240 END IF
3241 CALL pdchkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
3242 END IF
3243
3244 ELSE IF( nrout.EQ.6 ) THEN
3245
3246
3247
3248
3249
3250 CALL dtrsm( side, uplo, transa, diag, m, n, alpha,
3251 $ a( ia+(ja-1)*desca( m_ ) ), desca( m_ ),
3252 $ b( ib+(jb-1)*descb( m_ ) ), descb( m_ ) )
3253 CALL pdtrmm( side, uplo, transa, diag, m, n, alpha, pa, ia, ja,
3254 $ desca, pb, ib, jb, descb )
3255 IF(
lsame( side,
'L' ) )
THEN
3256 CALL pdmmch( ictxt, transa,
'No transpose', m, n, m, alpha,
3257 $ a, ia, ja, desca, b, ib, jb, descb, zero, c,
3258 $ pb, ib, jb, descb, work, work( ipg ), err,
3259 $ ierr( 2 ) )
3260 ELSE
3261 CALL pdmmch( ictxt,
'No transpose', transa, m, n, n, alpha,
3262 $ b, ib, jb, descb, a, ia, ja, desca, zero, c,
3263 $ pb, ib, jb, descb, work, work( ipg ), err,
3264 $ ierr( 2 ) )
3265 END IF
3266
3267 IF( ierr( 2 ).NE.0 ) THEN
3268 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3269 $ WRITE( nout, fmt = 9998 )
3270 ELSE IF( err.GT.dble( thresh ) ) THEN
3271 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3272 $ WRITE( nout, fmt = 9997 ) err
3273 END IF
3274
3275
3276
3277 IF(
lsame( side,
'L' ) )
THEN
3278 IF(
lsame( uplo,
'L' ) )
THEN
3279 IF(
lsame( diag,
'N' ) )
THEN
3280 CALL pb_dlaset(
'Upper', m-1, m-1, 0, rogue, rogue,
3281 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
3282 ELSE
3283 CALL pb_dlaset(
'Upper', m, m, 0, rogue, one,
3284 $ a( ia+(ja-1)*desca( m_ ) ),
3285 $ desca( m_ ) )
3286 END IF
3287 ELSE
3288 IF(
lsame( diag,
'N' ) )
THEN
3289 CALL pb_dlaset(
'Lower', m-1, m-1, 0, rogue, rogue,
3290 $ a( ia+1+(ja-1)*desca( m_ ) ),
3291 $ desca( m_ ) )
3292 ELSE
3293 CALL pb_dlaset(
'Lower', m, m, 0, rogue, one,
3294 $ a( ia+(ja-1)*desca( m_ ) ),
3295 $ desca( m_ ) )
3296 END IF
3297 END IF
3298 CALL pdchkmin( err, m, m, a, pa, ia, ja, desca, ierr( 1 ) )
3299 ELSE
3300 IF(
lsame( uplo,
'L' ) )
THEN
3301 IF(
lsame( diag,
'N' ) )
THEN
3302 CALL pb_dlaset(
'Upper', n-1, n-1, 0, rogue, rogue,
3303 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
3304 ELSE
3305 CALL pb_dlaset(
'Upper', n, n, 0, rogue, one,
3306 $ a( ia+(ja-1)*desca( m_ ) ),
3307 $ desca( m_ ) )
3308 END IF
3309 ELSE
3310 IF(
lsame( diag,
'N' ) )
THEN
3311 CALL pb_dlaset(
'Lower', n-1, n-1, 0, rogue, rogue,
3312 $ a( ia+1+(ja-1)*desca( m_ ) ),
3313 $ desca( m_ ) )
3314 ELSE
3315 CALL pb_dlaset(
'Lower', n, n, 0, rogue, one,
3316 $ a( ia+(ja-1)*desca( m_ ) ),
3317 $ desca( m_ ) )
3318 END IF
3319 END IF
3320 CALL pdchkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
3321 END IF
3322 ELSE IF( nrout.EQ.7 ) THEN
3323
3324
3325
3326
3327
3328 CALL pdmmch3(
'All', transa, m, n, alpha, a, ia, ja, desca,
3329 $ beta, c, pc, ic, jc, descc, err, ierr( 3 ) )
3330
3331
3332
3333 IF(
lsame( transa,
'N' ) )
THEN
3334 CALL pdchkmin( err, m, n, a, pa, ia, ja, desca, ierr( 1 ) )
3335 ELSE
3336 CALL pdchkmin( err, n, m, a, pa, ia, ja, desca, ierr( 1 ) )
3337 END IF
3338
3339 ELSE IF( nrout.EQ.8 ) THEN
3340
3341
3342
3343
3344
3345 CALL pdmmch3( uplo, transa, m, n, alpha, a, ia, ja, desca,
3346 $ beta, c, pc, ic, jc, descc, err, ierr( 3 ) )
3347
3348
3349
3350 IF(
lsame( transa,
'N' ) )
THEN
3351 CALL pdchkmin( err, m, n, a, pa, ia, ja, desca, ierr( 1 ) )
3352 ELSE
3353 CALL pdchkmin( err, n, m, a, pa, ia, ja, desca, ierr( 1 ) )
3354 END IF
3355
3356 END IF
3357
3358 IF( ierr( 1 ).NE.0 ) THEN
3359 info = info + 1
3360 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3361 $ WRITE( nout, fmt = 9999 ) 'A'
3362 END IF
3363
3364 IF( ierr( 2 ).NE.0 ) THEN
3365 info = info + 2
3366 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3367 $ WRITE( nout, fmt = 9999 ) 'B'
3368 END IF
3369
3370 IF( ierr( 3 ).NE.0 ) THEN
3371 info = info + 4
3372 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3373 $ WRITE( nout, fmt = 9999 ) 'C'
3374 END IF
3375
3376 9999 FORMAT( 2x, ' ***** ERROR: Matrix operand ', a,
3377 $ ' is incorrect.' )
3378 9998 FORMAT( 2x, ' ***** FATAL ERROR - Computed result is less ',
3379 $ 'than half accurate *****' )
3380 9997 FORMAT( 2x, ' ***** Test completed with maximum test ratio: ',
3381 $ f11.5, ' SUSPECT *****' )
3382
3383 RETURN
3384
3385
3386
subroutine pdmmch2(ictxt, uplo, trans, n, k, alpha, a, ia, ja, desca, b, ib, jb, descb, beta, c, pc, ic, jc, descc, ct, g, err, info)
subroutine pdmmch(ictxt, transa, transb, m, n, k, alpha, a, ia, ja, desca, b, ib, jb, descb, beta, c, pc, ic, jc, descc, ct, g, err, info)
subroutine pb_dlaset(uplo, m, n, ioffd, alpha, beta, a, lda)
subroutine pdmmch3(uplo, trans, m, n, alpha, a, ia, ja, desca, beta, c, pc, ic, jc, descc, err, info)
subroutine pdmmch1(ictxt, uplo, trans, n, k, alpha, a, ia, ja, desca, beta, c, pc, ic, jc, descc, ct, g, err, info)
subroutine pdchkmin(errmax, m, n, a, pa, ia, ja, desca, info)