438
439
440
441
442
443
444
445
446
447
448
449
450 REAL ZERO
451 parameter( zero = 0.0 )
452
453 REAL EPS, THRESH
454 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
455 LOGICAL FATAL, REWI, TRACE
456 CHARACTER*13 SNAME
457
458 REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
459 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
460 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
461 $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
462 $ CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
463 INTEGER IDIM( NIDIM )
464
465 REAL ALPHA, ALS, BETA, BLS, ERR, ERRMAX
466 INTEGER I, IA, IB, ICA, ICB, IK, IM, IN, K, KS, LAA,
467 $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS, M,
468 $ MA, MB, MS, N, NA, NARGS, NB, NC, NS
469 LOGICAL NULL, RESET, SAME, TRANA, TRANB
470 CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB
471 CHARACTER*3 ICH
472
473 LOGICAL ISAME( 13 )
474
475 LOGICAL LSE, LSERES
477
479
480 INTRINSIC max
481
482 INTEGER INFOT, NOUTC
483 LOGICAL OK
484
485 COMMON /infoc/infot, noutc, ok
486
487 DATA ich/'NTC'/
488
489
490 nargs = 13
491 nc = 0
492 reset = .true.
493 errmax = zero
494
495 DO 110 im = 1, nidim
496 m = idim( im )
497
498 DO 100 in = 1, nidim
499 n = idim( in )
500
501 ldc = m
502 IF( ldc.LT.nmax )
503 $ ldc = ldc + 1
504
505 IF( ldc.GT.nmax )
506 $ GO TO 100
507 lcc = ldc*n
508 null = n.LE.0.OR.m.LE.0
509
510 DO 90 ik = 1, nidim
511 k = idim( ik )
512
513 DO 80 ica = 1, 3
514 transa = ich( ica: ica )
515 trana = transa.EQ.'T'.OR.transa.EQ.'C'
516
517 IF( trana )THEN
518 ma = k
519 na = m
520 ELSE
521 ma = m
522 na = k
523 END IF
524
525 lda = ma
526 IF( lda.LT.nmax )
527 $ lda = lda + 1
528
529 IF( lda.GT.nmax )
530 $ GO TO 80
531 laa = lda*na
532
533
534
535 CALL smake(
'GE',
' ',
' ', ma, na, a, nmax, aa, lda,
536 $ reset, zero )
537
538 DO 70 icb = 1, 3
539 transb = ich( icb: icb )
540 tranb = transb.EQ.'T'.OR.transb.EQ.'C'
541
542 IF( tranb )THEN
543 mb = n
544 nb = k
545 ELSE
546 mb = k
547 nb = n
548 END IF
549
550 ldb = mb
551 IF( ldb.LT.nmax )
552 $ ldb = ldb + 1
553
554 IF( ldb.GT.nmax )
555 $ GO TO 70
556 lbb = ldb*nb
557
558
559
560 CALL smake(
'GE',
' ',
' ', mb, nb, b, nmax, bb,
561 $ ldb, reset, zero )
562
563 DO 60 ia = 1, nalf
564 alpha = alf( ia )
565
566 DO 50 ib = 1, nbet
567 beta = bet( ib )
568
569
570
571 CALL smake(
'GE',
' ',
' ', m, n, c, nmax,
572 $ cc, ldc, reset, zero )
573
574 nc = nc + 1
575
576
577
578
579 tranas = transa
580 tranbs = transb
581 ms = m
582 ns = n
583 ks = k
584 als = alpha
585 DO 10 i = 1, laa
586 as( i ) = aa( i )
587 10 CONTINUE
588 ldas = lda
589 DO 20 i = 1, lbb
590 bs( i ) = bb( i )
591 20 CONTINUE
592 ldbs = ldb
593 bls = beta
594 DO 30 i = 1, lcc
595 cs( i ) = cc( i )
596 30 CONTINUE
597 ldcs = ldc
598
599
600
601 IF( trace )
602 $
CALL sprcn1(ntra, nc, sname, iorder,
603 $ transa, transb, m, n, k, alpha, lda,
604 $ ldb, beta, ldc)
605 IF( rewi )
606 $ rewind ntra
607 CALL csgemm( iorder, transa, transb, m, n,
608 $ k, alpha, aa, lda, bb, ldb,
609 $ beta, cc, ldc )
610
611
612
613 IF( .NOT.ok )THEN
614 WRITE( nout, fmt = 9994 )
615 fatal = .true.
616 GO TO 120
617 END IF
618
619
620
621 isame( 1 ) = transa.EQ.tranas
622 isame( 2 ) = transb.EQ.tranbs
623 isame( 3 ) = ms.EQ.m
624 isame( 4 ) = ns.EQ.n
625 isame( 5 ) = ks.EQ.k
626 isame( 6 ) = als.EQ.alpha
627 isame( 7 ) =
lse( as, aa, laa )
628 isame( 8 ) = ldas.EQ.lda
629 isame( 9 ) =
lse( bs, bb, lbb )
630 isame( 10 ) = ldbs.EQ.ldb
631 isame( 11 ) = bls.EQ.beta
632 IF( null )THEN
633 isame( 12 ) =
lse( cs, cc, lcc )
634 ELSE
635 isame( 12 ) =
lseres(
'GE',
' ', m, n, cs,
636 $ cc, ldc )
637 END IF
638 isame( 13 ) = ldcs.EQ.ldc
639
640
641
642
643 same = .true.
644 DO 40 i = 1, nargs
645 same = same.AND.isame( i )
646 IF( .NOT.isame( i ) )
647 $ WRITE( nout, fmt = 9998 )i+1
648 40 CONTINUE
649 IF( .NOT.same )THEN
650 fatal = .true.
651 GO TO 120
652 END IF
653
654 IF( .NOT.null )THEN
655
656
657
658 CALL smmch( transa, transb, m, n, k,
659 $ alpha, a, nmax, b, nmax, beta,
660 $ c, nmax, ct, g, cc, ldc, eps,
661 $ err, fatal, nout, .true. )
662 errmax = max( errmax, err )
663
664
665 IF( fatal )
666 $ GO TO 120
667 END IF
668
669 50 CONTINUE
670
671 60 CONTINUE
672
673 70 CONTINUE
674
675 80 CONTINUE
676
677 90 CONTINUE
678
679 100 CONTINUE
680
681 110 CONTINUE
682
683
684
685 IF( errmax.LT.thresh )THEN
686 IF ( iorder.EQ.0) WRITE( nout, fmt = 10000 )sname, nc
687 IF ( iorder.EQ.1) WRITE( nout, fmt = 10001 )sname, nc
688 ELSE
689 IF ( iorder.EQ.0) WRITE( nout, fmt = 10002 )sname, nc, errmax
690 IF ( iorder.EQ.1) WRITE( nout, fmt = 10003 )sname, nc, errmax
691 END IF
692 GO TO 130
693
694 120 CONTINUE
695 WRITE( nout, fmt = 9996 )sname
696 CALL sprcn1(nout, nc, sname, iorder, transa, transb,
697 $ m, n, k, alpha, lda, ldb, beta, ldc)
698
699 130 CONTINUE
700 RETURN
701
70210003 FORMAT( ' ', a13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
703 $ 'TESTS (', i6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
704 $ 'RATIO ', f8.2, ' - SUSPECT *******' )
70510002 FORMAT( ' ', a13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
706 $ 'TESTS (', i6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
707 $ 'RATIO ', f8.2, ' - SUSPECT *******' )
70810001 FORMAT( ' ', a13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
709 $ ' (', i6, ' CALL', 'S)' )
71010000 FORMAT( ' ', a13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
711 $ ' (', i6, ' CALL', 'S)' )
712 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', i2, ' WAS CH',
713 $ 'ANGED INCORRECTLY *******' )
714 9996 FORMAT( ' ******* ', a13,' FAILED ON CALL NUMBER:' )
715 9995 FORMAT( 1x, i6, ': ', a13,'(''', a1, ''',''', a1, ''',',
716 $ 3( i3, ',' ), f4.1, ', A,', i3, ', B,', i3, ',', f4.1, ', ',
717 $ 'C,', i3, ').' )
718 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
719 $ '******' )
720
721
722
subroutine sprcn1(nout, nc, sname, iorder, transa, transb, m, n, k, alpha, lda, ldb, beta, ldc)
logical function lseres(type, uplo, m, n, aa, as, lda)
subroutine smake(type, uplo, diag, m, n, a, nmax, aa, lda, kl, ku, reset, transl)
logical function lse(ri, rj, lr)
subroutine smmch(transa, transb, m, n, kk, alpha, a, lda, b, ldb, beta, c, ldc, ct, g, cc, ldcc, eps, err, fatal, nout, mv)