2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227 DOUBLE PRECISION ZERO, ONE
2228 parameter( zero = 0.0d0, one = 1.0d0 )
2229
2230 DOUBLE PRECISION ALPHA, BETA, EPS, ERR
2231 INTEGER KK, LDA, LDB, LDC, LDCC, M, N, NOUT
2232 LOGICAL FATAL, MV
2233 CHARACTER*1 TRANSA, TRANSB
2234
2235 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), C( LDC, * ),
2236 $ CC( LDCC, * ), CT( * ), G( * )
2237
2238 DOUBLE PRECISION ERRI
2239 INTEGER I, J, K
2240 LOGICAL TRANA, TRANB
2241
2242 INTRINSIC abs, max, sqrt
2243
2244 trana = transa.EQ.'T'.OR.transa.EQ.'C'
2245 tranb = transb.EQ.'T'.OR.transb.EQ.'C'
2246
2247
2248
2249
2250
2251 DO 120 j = 1, n
2252
2253 DO 10 i = 1, m
2254 ct( i ) = zero
2255 g( i ) = zero
2256 10 CONTINUE
2257 IF( .NOT.trana.AND..NOT.tranb )THEN
2258 DO 30 k = 1, kk
2259 DO 20 i = 1, m
2260 ct( i ) = ct( i ) + a( i, k )*b( k, j )
2261 g( i ) = g( i ) + abs( a( i, k ) )*abs( b( k, j ) )
2262 20 CONTINUE
2263 30 CONTINUE
2264 ELSE IF( trana.AND..NOT.tranb )THEN
2265 DO 50 k = 1, kk
2266 DO 40 i = 1, m
2267 ct( i ) = ct( i ) + a( k, i )*b( k, j )
2268 g( i ) = g( i ) + abs( a( k, i ) )*abs( b( k, j ) )
2269 40 CONTINUE
2270 50 CONTINUE
2271 ELSE IF( .NOT.trana.AND.tranb )THEN
2272 DO 70 k = 1, kk
2273 DO 60 i = 1, m
2274 ct( i ) = ct( i ) + a( i, k )*b( j, k )
2275 g( i ) = g( i ) + abs( a( i, k ) )*abs( b( j, k ) )
2276 60 CONTINUE
2277 70 CONTINUE
2278 ELSE IF( trana.AND.tranb )THEN
2279 DO 90 k = 1, kk
2280 DO 80 i = 1, m
2281 ct( i ) = ct( i ) + a( k, i )*b( j, k )
2282 g( i ) = g( i ) + abs( a( k, i ) )*abs( b( j, k ) )
2283 80 CONTINUE
2284 90 CONTINUE
2285 END IF
2286 DO 100 i = 1, m
2287 ct( i ) = alpha*ct( i ) + beta*c( i, j )
2288 g( i ) = abs( alpha )*g( i ) + abs( beta )*abs( c( i, j ) )
2289 100 CONTINUE
2290
2291
2292
2293 err = zero
2294 DO 110 i = 1, m
2295 erri = abs( ct( i ) - cc( i, j ) )/eps
2296 IF( g( i ).NE.zero )
2297 $ erri = erri/g( i )
2298 err = max( err, erri )
2299 IF( err*sqrt( eps ).GE.one )
2300 $ GO TO 130
2301 110 CONTINUE
2302
2303 120 CONTINUE
2304
2305
2306 GO TO 150
2307
2308
2309
2310 130 fatal = .true.
2311 WRITE( nout, fmt = 9999 )
2312 DO 140 i = 1, m
2313 IF( mv )THEN
2314 WRITE( nout, fmt = 9998 )i, ct( i ), cc( i, j )
2315 ELSE
2316 WRITE( nout, fmt = 9998 )i, cc( i, j ), ct( i )
2317 END IF
2318 140 CONTINUE
2319 IF( n.GT.1 )
2320 $ WRITE( nout, fmt = 9997 )j
2321
2322 150 CONTINUE
2323 RETURN
2324
2325 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
2326 $ 'F ACCURATE *******', /' EXPECTED RESULT COMPU',
2327 $ 'TED RESULT' )
2328 9998 FORMAT( 1x, i7, 2g18.6 )
2329 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', i3 )
2330
2331
2332