3246
 3247
 3248
 3249
 3250
 3251
 3252
 3253
 3254
 3255      REAL               ZERO, ONE
 3256      parameter( zero = 0.0d0, one = 1.0d0 )
 3257
 3258      REAL               ALPHA, BETA, EPS, ERR
 3259      INTEGER            KK, LDA, LDB, LDC, LDCC, N, NOUT
 3260      LOGICAL            FATAL, MV
 3261      CHARACTER*1        UPLO, TRANSA, TRANSB
 3262
 3263      REAL               A( LDA, * ), B( LDB, * ), C( LDC, * ),
 3264     $                   CC( LDCC, * ), CT( * ), G( * )
 3265
 3266      REAL               ERRI
 3267      INTEGER            I, J, K, ISTART, ISTOP
 3268      LOGICAL            TRANA, TRANB, UPPER
 3269
 3270      INTRINSIC          abs, max, sqrt
 3271
 3272      upper = uplo.EQ.'U'
 3273      trana = transa.EQ.'T'.OR.transa.EQ.'C'
 3274      tranb = transb.EQ.'T'.OR.transb.EQ.'C'
 3275
 3276
 3277
 3278
 3279
 3280      istart = 1
 3281      istop  = n
 3282 
 3283      DO 120 j = 1, n
 3284
 3285         IF ( upper ) THEN
 3286             istart = 1
 3287             istop = j
 3288         ELSE
 3289             istart = j
 3290             istop = n
 3291         END IF
 3292         DO 10 i = istart, istop
 3293            ct( i ) = zero
 3294            g( i ) = zero
 3295   10    CONTINUE
 3296         IF( .NOT.trana.AND..NOT.tranb )THEN
 3297            DO 30 k = 1, kk
 3298               DO 20 i = istart, istop
 3299                  ct( i ) = ct( i ) + a( i, k )*b( k, j )
 3300                  g( i ) = g( i ) + abs( a( i, k ) )*abs( b( k, j ) )
 3301   20          CONTINUE
 3302   30       CONTINUE
 3303         ELSE IF( trana.AND..NOT.tranb )THEN
 3304            DO 50 k = 1, kk
 3305               DO 40 i = istart, istop
 3306                  ct( i ) = ct( i ) + a( k, i )*b( k, j )
 3307                  g( i ) = g( i ) + abs( a( k, i ) )*abs( b( k, j ) )
 3308   40          CONTINUE
 3309   50       CONTINUE
 3310         ELSE IF( .NOT.trana.AND.tranb )THEN
 3311            DO 70 k = 1, kk
 3312               DO 60 i = istart, istop
 3313                  ct( i ) = ct( i ) + a( i, k )*b( j, k )
 3314                  g( i ) = g( i ) + abs( a( i, k ) )*abs( b( j, k ) )
 3315   60          CONTINUE
 3316   70       CONTINUE
 3317         ELSE IF( trana.AND.tranb )THEN
 3318            DO 90 k = 1, kk
 3319               DO 80 i = istart, istop
 3320                  ct( i ) = ct( i ) + a( k, i )*b( j, k )
 3321                  g( i ) = g( i ) + abs( a( k, i ) )*abs( b( j, k ) )
 3322   80          CONTINUE
 3323   90       CONTINUE
 3324         END IF
 3325         DO 100 i = istart, istop
 3326            ct( i ) = alpha*ct( i ) + beta*c( i, j )
 3327            g( i ) = abs( alpha )*g( i ) + abs( beta )*abs( c( i, j ) )
 3328  100    CONTINUE
 3329
 3330
 3331
 3332         err = zero
 3333         DO 110 i = istart, istop
 3334            erri = abs( ct( i ) - cc( i, j ) )/eps
 3335            IF( g( i ).NE.zero )
 3336     $         erri = erri/g( i )
 3337            err = max( err, erri )
 3338            IF( err*sqrt( eps ).GE.one )
 3339     $         GO TO 130
 3340  110    CONTINUE
 3341
 3342  120 CONTINUE
 3343
 3344
 3345      GO TO 150
 3346
 3347
 3348
 3349  130 fatal = .true.
 3350      WRITE( nout, fmt = 9999 )
 3351      DO 140 i = istart, istop
 3352         IF( mv )THEN
 3353            WRITE( nout, fmt = 9998 )i, ct( i ), cc( i, j )
 3354         ELSE
 3355            WRITE( nout, fmt = 9998 )i, cc( i, j ), ct( i )
 3356         END IF
 3357  140 CONTINUE
 3358      IF( n.GT.1 )
 3359     $   WRITE( nout, fmt = 9997 )j
 3360
 3361  150 CONTINUE
 3362      RETURN
 3363
 3364 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
 3365     $      'F ACCURATE *******', /'           EXPECTED RESULT   COMPU',
 3366     $      'TED RESULT' )
 3367 9998 FORMAT( 1x, i7, 2g18.6 )
 3368 9997 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', i3 )
 3369
 3370
 3371