3146 IMPLICIT NONE
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156 COMPLEX ZERO
3157 parameter( zero = ( 0.0, 0.0 ) )
3158 REAL RZERO, RONE
3159 parameter( rzero = 0.0, rone = 1.0 )
3160
3161 COMPLEX ALPHA, BETA
3162 REAL EPS, ERR
3163 INTEGER KK, LDA, LDB, LDC, LDCC, N, NOUT
3164 LOGICAL FATAL, MV
3165 CHARACTER*1 TRANSA, TRANSB, UPLO
3166
3167 COMPLEX A( LDA, * ), B( LDB, * ), C( LDC, * ),
3168 $ CC( LDCC, * ), CT( * )
3169 REAL G( * )
3170
3171 COMPLEX CL
3172 REAL ERRI
3173 INTEGER I, J, K, ISTART, ISTOP
3174 LOGICAL CTRANA, CTRANB, TRANA, TRANB, UPPER
3175
3176 INTRINSIC abs, aimag, conjg, max, real, sqrt
3177
3178 REAL ABS1
3179
3180 abs1( cl ) = abs( real( cl ) ) + abs( aimag( cl ) )
3181
3182
3183 upper = uplo.EQ.'U'
3184 trana = transa.EQ.'T'.OR.transa.EQ.'C'
3185 tranb = transb.EQ.'T'.OR.transb.EQ.'C'
3186 ctrana = transa.EQ.'C'
3187 ctranb = transb.EQ.'C'
3188
3189 istart = 1
3190 istop = n
3191
3192
3193
3194
3195
3196 DO 220 j = 1, n
3197
3198 IF (upper) THEN
3199 istart = 1
3200 istop = j
3201 ELSE
3202 istart = j
3203 istop = n
3204 END IF
3205 DO 10 i = istart, istop
3206 ct( i ) = zero
3207 g( i ) = rzero
3208 10 CONTINUE
3209 IF( .NOT.trana.AND..NOT.tranb )THEN
3210 DO 30 k = 1, kk
3211 DO 20 i = istart, istop
3212 ct( i ) = ct( i ) + a( i, k )*b( k, j )
3213 g( i ) = g( i ) + abs1( a( i, k ) )*abs1( b( k, j ) )
3214 20 CONTINUE
3215 30 CONTINUE
3216 ELSE IF( trana.AND..NOT.tranb )THEN
3217 IF( ctrana )THEN
3218 DO 50 k = 1, kk
3219 DO 40 i = istart, istop
3220 ct( i ) = ct( i ) + conjg( a( k, i ) )*b( k, j )
3221 g( i ) = g( i ) + abs1( a( k, i ) )*
3222 $ abs1( b( k, j ) )
3223 40 CONTINUE
3224 50 CONTINUE
3225 ELSE
3226 DO 70 k = 1, kk
3227 DO 60 i = istart, istop
3228 ct( i ) = ct( i ) + a( k, i )*b( k, j )
3229 g( i ) = g( i ) + abs1( a( k, i ) )*
3230 $ abs1( b( k, j ) )
3231 60 CONTINUE
3232 70 CONTINUE
3233 END IF
3234 ELSE IF( .NOT.trana.AND.tranb )THEN
3235 IF( ctranb )THEN
3236 DO 90 k = 1, kk
3237 DO 80 i = istart, istop
3238 ct( i ) = ct( i ) + a( i, k )*conjg( b( j, k ) )
3239 g( i ) = g( i ) + abs1( a( i, k ) )*
3240 $ abs1( b( j, k ) )
3241 80 CONTINUE
3242 90 CONTINUE
3243 ELSE
3244 DO 110 k = 1, kk
3245 DO 100 i = istart, istop
3246 ct( i ) = ct( i ) + a( i, k )*b( j, k )
3247 g( i ) = g( i ) + abs1( a( i, k ) )*
3248 $ abs1( b( j, k ) )
3249 100 CONTINUE
3250 110 CONTINUE
3251 END IF
3252 ELSE IF( trana.AND.tranb )THEN
3253 IF( ctrana )THEN
3254 IF( ctranb )THEN
3255 DO 130 k = 1, kk
3256 DO 120 i = istart, istop
3257 ct( i ) = ct( i ) + conjg( a( k, i ) )*
3258 $ conjg( b( j, k ) )
3259 g( i ) = g( i ) + abs1( a( k, i ) )*
3260 $ abs1( b( j, k ) )
3261 120 CONTINUE
3262 130 CONTINUE
3263 ELSE
3264 DO 150 k = 1, kk
3265 DO 140 i = istart, istop
3266 ct( i ) = ct( i ) + conjg( a( k, i ) )*b( j, k )
3267 g( i ) = g( i ) + abs1( a( k, i ) )*
3268 $ abs1( b( j, k ) )
3269 140 CONTINUE
3270 150 CONTINUE
3271 END IF
3272 ELSE
3273 IF( ctranb )THEN
3274 DO 170 k = 1, kk
3275 DO 160 i = istart, istop
3276 ct( i ) = ct( i ) + a( k, i )*conjg( b( j, k ) )
3277 g( i ) = g( i ) + abs1( a( k, i ) )*
3278 $ abs1( b( j, k ) )
3279 160 CONTINUE
3280 170 CONTINUE
3281 ELSE
3282 DO 190 k = 1, kk
3283 DO 180 i = istart, istop
3284 ct( i ) = ct( i ) + a( k, i )*b( j, k )
3285 g( i ) = g( i ) + abs1( a( k, i ) )*
3286 $ abs1( b( j, k ) )
3287 180 CONTINUE
3288 190 CONTINUE
3289 END IF
3290 END IF
3291 END IF
3292 DO 200 i = istart, istop
3293 ct( i ) = alpha*ct( i ) + beta*c( i, j )
3294 g( i ) = abs1( alpha )*g( i ) +
3295 $ abs1( beta )*abs1( c( i, j ) )
3296 200 CONTINUE
3297
3298
3299
3300 err = zero
3301 DO 210 i = istart, istop
3302 erri = abs1( ct( i ) - cc( i, j ) )/eps
3303 IF( g( i ).NE.rzero )
3304 $ erri = erri/g( i )
3305 err = max( err, erri )
3306 IF( err*sqrt( eps ).GE.rone )
3307 $ GO TO 230
3308 210 CONTINUE
3309
3310 220 CONTINUE
3311
3312
3313 GO TO 250
3314
3315
3316
3317 230 fatal = .true.
3318 WRITE( nout, fmt = 9999 )
3319 DO 240 i = istart, istop
3320 IF( mv )THEN
3321 WRITE( nout, fmt = 9998 )i, ct( i ), cc( i, j )
3322 ELSE
3323 WRITE( nout, fmt = 9998 )i, cc( i, j ), ct( i )
3324 END IF
3325 240 CONTINUE
3326 IF( n.GT.1 )
3327 $ WRITE( nout, fmt = 9997 )j
3328
3329 250 CONTINUE
3330 RETURN
3331
3332 9999 FORMAT(' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
3333 $ 'F ACCURATE *******', /' EXPECTED RE',
3334 $ 'SULT COMPUTED RESULT' )
3335 9998 FORMAT( 1x, i7, 2( ' (', g15.6, ',', g15.6, ')' ) )
3336 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', i3 )
3337
3338
3339