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