2505
2506
2507
2508
2509
2510
2511
2512
2513
2514 REAL ZERO
2515 parameter( zero = 0.0 )
2516
2517 REAL EPS, THRESH
2518 INTEGER NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER
2519 LOGICAL FATAL, REWI, TRACE
2520 CHARACTER*13 SNAME
2521
2522 REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
2523 $ AS( NMAX*NMAX ), B( NMAX, NMAX ),
2524 $ BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),
2525 $ C( NMAX, NMAX ), CC( NMAX*NMAX ),
2526 $ CS( NMAX*NMAX ), CT( NMAX ), G( NMAX )
2527 INTEGER IDIM( NIDIM )
2528
2529 REAL ALPHA, ALS, BETA, BLS, ERR, ERRMAX
2530 INTEGER I, IA, IB, ICA, ICB, IK, IN, K, KS, LAA,
2531 $ LBB, LCC, LDA, LDAS, LDB, LDBS, LDC, LDCS,
2532 $ MA, MB, N, NA, NARGS, NB, NC, NS, IS
2533 LOGICAL NULL, RESET, SAME, TRANA, TRANB
2534 CHARACTER*1 TRANAS, TRANBS, TRANSA, TRANSB, UPLO, UPLOS
2535 CHARACTER*3 ICH
2536 CHARACTER*2 ISHAPE
2537
2538 LOGICAL ISAME( 13 )
2539
2540 LOGICAL LSE, LSERES
2542
2544
2545 INTRINSIC max
2546
2547 INTEGER INFOT, NOUTC
2548 LOGICAL LERR, OK
2549
2550 COMMON /infoc/infot, noutc, ok, lerr
2551
2552 DATA ich/'NTC'/
2553 DATA ishape/'UL'/
2554
2555
2556 nargs = 13
2557 nc = 0
2558 reset = .true.
2559 errmax = zero
2560
2561 DO 100 in = 1, nidim
2562 n = idim( in )
2563
2564 ldc = n
2565 IF( ldc.LT.nmax )
2566 $ ldc = ldc + 1
2567
2568 IF( ldc.GT.nmax )
2569 $ GO TO 100
2570 lcc = ldc*n
2571 null = n.LE.0
2572
2573 DO 90 ik = 1, nidim
2574 k = idim( ik )
2575
2576 DO 80 ica = 1, 3
2577 transa = ich( ica: ica )
2578 trana = transa.EQ.'T'.OR.transa.EQ.'C'
2579
2580 IF( trana )THEN
2581 ma = k
2582 na = n
2583 ELSE
2584 ma = n
2585 na = k
2586 END IF
2587
2588 lda = ma
2589 IF( lda.LT.nmax )
2590 $ lda = lda + 1
2591
2592 IF( lda.GT.nmax )
2593 $ GO TO 80
2594 laa = lda*na
2595
2596
2597
2598 CALL smake(
'GE',
' ',
' ', ma, na, a, nmax, aa, lda,
2599 $ reset, zero )
2600
2601 DO 70 icb = 1, 3
2602 transb = ich( icb: icb )
2603 tranb = transb.EQ.'T'.OR.transb.EQ.'C'
2604
2605 IF( tranb )THEN
2606 mb = n
2607 nb = k
2608 ELSE
2609 mb = k
2610 nb = n
2611 END IF
2612
2613 ldb = mb
2614 IF( ldb.LT.nmax )
2615 $ ldb = ldb + 1
2616
2617 IF( ldb.GT.nmax )
2618 $ GO TO 70
2619 lbb = ldb*nb
2620
2621
2622
2623 CALL smake(
'GE',
' ',
' ', mb, nb, b, nmax, bb,
2624 $ ldb, reset, zero )
2625
2626 DO 60 ia = 1, nalf
2627 alpha = alf( ia )
2628
2629 DO 50 ib = 1, nbet
2630 beta = bet( ib )
2631
2632 DO 45 is = 1, 2
2633 uplo = ishape( is: is )
2634
2635
2636
2637
2638 CALL smake(
'GE', uplo,
' ', n, n, c,
2639 $ nmax, cc, ldc, reset, zero )
2640
2641 nc = nc + 1
2642
2643
2644
2645
2646 uplos = uplo
2647 tranas = transa
2648 tranbs = transb
2649 ns = n
2650 ks = k
2651 als = alpha
2652 DO 10 i = 1, laa
2653 as( i ) = aa( i )
2654 10 CONTINUE
2655 ldas = lda
2656 DO 20 i = 1, lbb
2657 bs( i ) = bb( i )
2658 20 CONTINUE
2659 ldbs = ldb
2660 bls = beta
2661 DO 30 i = 1, lcc
2662 cs( i ) = cc( i )
2663 30 CONTINUE
2664 ldcs = ldc
2665
2666
2667
2668 IF( trace )
2669 $
CALL sprcn8(ntra, nc, sname, iorder, uplo,
2670 $ transa, transb, n, k, alpha, lda,
2671 $ ldb, beta, ldc)
2672 IF( rewi )
2673 $ rewind ntra
2674 CALL csgemmtr( iorder, uplo, transa, transb,
2675 $ n, k, alpha, aa, lda, bb, ldb,
2676 $ beta, cc, ldc )
2677
2678
2679
2680 IF( .NOT.ok )THEN
2681 WRITE( nout, fmt = 9994 )
2682 fatal = .true.
2683 GO TO 120
2684 END IF
2685
2686
2687
2688 isame( 1 ) = uplo.EQ.uplos
2689 isame( 2 ) = transa.EQ.tranas
2690 isame( 3 ) = transb.EQ.tranbs
2691 isame( 4 ) = ns.EQ.n
2692 isame( 5 ) = ks.EQ.k
2693 isame( 6 ) = als.EQ.alpha
2694 isame( 7 ) =
lse( as, aa, laa )
2695 isame( 8 ) = ldas.EQ.lda
2696 isame( 9 ) =
lse( bs, bb, lbb )
2697 isame( 10 ) = ldbs.EQ.ldb
2698 isame( 11 ) = bls.EQ.beta
2699 IF( null )THEN
2700 isame( 12 ) =
lse( cs, cc, lcc )
2701 ELSE
2702 isame( 12 ) =
lseres(
'GE',
' ', n, n,
2703 $ cs, cc, ldc )
2704 END IF
2705 isame( 13 ) = ldcs.EQ.ldc
2706
2707
2708
2709
2710 same = .true.
2711 DO 40 i = 1, nargs
2712 same = same.AND.isame( i )
2713 IF( .NOT.isame( i ) )
2714 $ WRITE( nout, fmt = 9998 )i
2715 40 CONTINUE
2716 IF( .NOT.same )THEN
2717 fatal = .true.
2718 GO TO 120
2719 END IF
2720
2721 IF( .NOT.null )THEN
2722
2723
2724
2725 CALL smmtch( uplo, transa, transb,
2726 $ n, k,
2727 $ alpha, a, nmax, b, nmax, beta,
2728 $ c, nmax, ct, g, cc, ldc, eps,
2729 $ err, fatal, nout, .true. )
2730 errmax = max( errmax, err )
2731
2732
2733 IF( fatal )
2734 $ GO TO 120
2735 END IF
2736
2737 45 CONTINUE
2738
2739 50 CONTINUE
2740
2741 60 CONTINUE
2742
2743 70 CONTINUE
2744
2745 80 CONTINUE
2746
2747 90 CONTINUE
2748
2749 100 CONTINUE
2750
2751
2752
2753
2754 IF( errmax.LT.thresh )THEN
2755 IF ( iorder.EQ.0) WRITE( nout, fmt = 10000 )sname, nc
2756 IF ( iorder.EQ.1) WRITE( nout, fmt = 10001 )sname, nc
2757 ELSE
2758 IF ( iorder.EQ.0) WRITE( nout, fmt = 10002 )sname, nc, errmax
2759 IF ( iorder.EQ.1) WRITE( nout, fmt = 10003 )sname, nc, errmax
2760 END IF
2761 GO TO 130
2762
2763 120 CONTINUE
2764 WRITE( nout, fmt = 9996 )sname
2765 CALL sprcn8(nout, nc, sname, iorder, uplo, transa, transb,
2766 $ n, k, alpha, lda, ldb, beta, ldc)
2767
2768 130 CONTINUE
2769 RETURN
2770
277110003 FORMAT( ' ', a13,' COMPLETED THE ROW-MAJOR COMPUTATIONAL ',
2772 $ 'TESTS (', i6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
2773 $ 'RATIO ', f8.2, ' - SUSPECT *******' )
277410002 FORMAT( ' ', a13,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',
2775 $ 'TESTS (', i6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',
2776 $ 'RATIO ', f8.2, ' - SUSPECT *******' )
277710001 FORMAT( ' ', a13,' PASSED THE ROW-MAJOR COMPUTATIONAL TESTS',
2778 $ ' (', i6, ' CALL', 'S)' )
277910000 FORMAT( ' ', a13,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',
2780 $ ' (', i6, ' CALL', 'S)' )
2781 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', i2, ' WAS CH',
2782 $ 'ANGED INCORRECTLY *******' )
2783 9997 FORMAT( ' ', a13, ' COMPLETED THE COMPUTATIONAL TESTS (', i6, ' C'
2784 $ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', f8.2,
2785 $ ' - SUSPECT *******' )
2786 9996 FORMAT( ' ******* ', a13, ' FAILED ON CALL NUMBER:' )
2787 9995 FORMAT( 1x, i6, ': ', a13, '(''',a1, ''',''',a1, ''',''', a1,''','
2788 $ 2( i3, ',' ), f4.1, ', A,', i3, ', B,', i3, ',', f4.1, ', ',
2789 $ 'C,', i3, ').' )
2790 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
2791 $ '******' )
2792
2793
2794
subroutine sprcn8(nout, nc, sname, iorder, uplo, transa, transb, 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 smmtch(uplo, transa, transb, n, kk, alpha, a, lda, b, ldb, beta, c, ldc, ct, g, cc, ldcc, eps, err, fatal, nout, mv)