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