LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages

◆ smmtch()

subroutine smmtch ( character*1 uplo,
character*1 transa,
character*1 transb,
integer n,
integer kk,
real alpha,
real, dimension( lda, * ) a,
integer lda,
real, dimension( ldb, * ) b,
integer ldb,
real beta,
real, dimension( ldc, * ) c,
integer ldc,
real, dimension( * ) ct,
real, dimension( * ) g,
real, dimension( ldcc, * ) cc,
integer ldcc,
real eps,
real err,
logical fatal,
integer nout,
logical mv )

Definition at line 3243 of file sblat3.f.

3246*
3247* Checks the results of the computational tests.
3248*
3249* Auxiliary routine for test program for Level 3 Blas. (SGEMMTR)
3250*
3251* -- Written on 19-July-2023.
3252* Martin Koehler, MPI Magdeburg
3253*
3254* .. Parameters ..
3255 REAL ZERO, ONE
3256 parameter( zero = 0.0d0, one = 1.0d0 )
3257* .. Scalar Arguments ..
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* .. Array Arguments ..
3263 REAL A( LDA, * ), B( LDB, * ), C( LDC, * ),
3264 $ CC( LDCC, * ), CT( * ), G( * )
3265* .. Local Scalars ..
3266 REAL ERRI
3267 INTEGER I, J, K, ISTART, ISTOP
3268 LOGICAL TRANA, TRANB, UPPER
3269* .. Intrinsic Functions ..
3270 INTRINSIC abs, max, sqrt
3271* .. Executable Statements ..
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* Compute expected result, one column at a time, in CT using data
3277* in A, B and C.
3278* Compute gauges in G.
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* Compute the error ratio for this result.
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* If the loop completes, all results are at least half accurate.
3345 GO TO 150
3346*
3347* Report fatal error.
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* End of DMMTCH
3371*
Here is the caller graph for this function: