C     MAIN PROGRAM
      INTEGER LUNIT
C     ALLOW 5000 UNDERFLOWS.
C     CALL TRAPS(0,0,5001,0,0)
C
C     OUTPUT UNIT NUMBER
C
      LUNIT = 6
C
      CALL SGTTS(LUNIT)
      STOP
      END
      SUBROUTINE SGTTS(LUNIT)
C     LUNIT IS THE OUTPUT UNIT NUMBER
C
C     TESTS
C        SGTSL,SPTSL
C
C     LINPACK. THIS VERSION DATED 08/14/78 .
C     JACK DONGARRA, ARGONNE NATIONAL LABORATORY.
C
C     SUBROUTINES AND FUNCTIONS
C
C     LINPACK SGTSL,CTPSL
C     EXTERNAL SGTXX
C     BLAS SASUM
C     FORTRAN ABS,AIMAG,AMAX1,FLOAT,REAL
C
C     INTERNAL VARIABLES
C
      INTEGER LUNIT
      REAL B(20),BSAVE(20),D(20),EYE,C(20),E(20),X(20)
      REAL ANORM,EN,ENORM,EPS,Q(2),RNORM,SASUM,XNORM
      REAL SMACH
      INTEGER I,INFO,IPT,PD,KASE,KFAIL(2),KSING,N,NM1,NPRINT,POSDEF
      EYE = 0.0E0
C     REAL EYE = IMAGINARY UNIT, REAL EYE = ZERO
C
C
C     WRITE MATRIX AND SOLUTIONS IF  N .LE. NPRINT
C
      NPRINT = 3
C
      WRITE (LUNIT,230)
      DO 10 I = 1, 2
         KFAIL(I) = 0
   10 CONTINUE
      KSING = 0
C
C     COMPUTE MACHINE EPSILON
C
      EPS = SMACH(1)
      WRITE (LUNIT,240) EPS
      WRITE (LUNIT,220)
C
C     START MAIN LOOP
C
      KASE = 1
   20 CONTINUE
C
C        GENERATE TEST MATRIX
C
         CALL SGTXX(C,D,E,N,KASE,POSDEF)
C
C        N = 0 SIGNALS NO MORE TEST MATRICES
C
C     ...EXIT
         IF (N .LE. 0) GO TO 210
         INFO = 0
         PD = 1
         IF (POSDEF .EQ. 1) PD = 2
         DO 200 IPT = 1, PD
            WRITE (LUNIT,250) KASE
            WRITE (LUNIT,260) N
            IF (N .GT. 1) GO TO 30
               ANORM = ABS(D(1))
               WRITE (LUNIT,450) D(1)
               X(1) = 1.0E0
               B(1) = D(1)
               BSAVE(1) = B(1)
            GO TO 110
   30       CONTINUE
               NM1 = N - 1
               ANORM = ABS(D(1)) + ABS(C(2))
               IF (N .LE. 2) GO TO 50
                  DO 40 I = 2, NM1
                     ANORM = AMAX1(ANORM,
     *                             ABS(C(I+1))+ABS(D(I))+ABS(E(I-1)))
   40             CONTINUE
   50          CONTINUE
               ANORM = AMAX1(ANORM,ABS(E(N-1))+ABS(D(N)))
               WRITE (LUNIT,430) ANORM
C
               IF (N .GT. NPRINT) GO TO 60
                  WRITE (LUNIT,220)
                  WRITE (LUNIT,450) (C(I), I = 2, N)
                  WRITE (LUNIT,220)
                  WRITE (LUNIT,450) (D(I), I = 1, N)
                  WRITE (LUNIT,220)
                  WRITE (LUNIT,450) (E(I), I = 1, NM1)
                  WRITE (LUNIT,220)
   60          CONTINUE
C
C              GENERATE EXACT SOLUTION
C
               X(1) = 1.0E0
               IF (N .GE. 2) X(2) = EYE
               IF (N .LE. 2) GO TO 80
                  DO 70 I = 3, N
                     X(I) = -X(I-2)
   70             CONTINUE
   80          CONTINUE
C
C              SAVE MATRIX AND GENERATE R.H.S.
C
               B(1) = D(1)*X(1) + E(1)*X(2)
               BSAVE(1) = B(1)
               IF (N .LE. 2) GO TO 100
                  DO 90 I = 2, NM1
                     B(I) = C(I)*X(I-1) + D(I)*X(I) + E(I)*X(I+1)
                     BSAVE(I) = B(I)
   90             CONTINUE
  100          CONTINUE
               B(N) = C(N)*X(N-1) + D(N)*X(N)
               BSAVE(N) = B(N)
  110       CONTINUE
C
C           FACTOR AND SOLVE A GENERAL TRIDIAGONAL SYSTEM
C
            IF (IPT .EQ. 1) CALL SGTSL(N,C,D,E,B,INFO)
C
C           TEST FOR SINGULARITY
C
            IF (INFO .EQ. 0) GO TO 120
               WRITE (LUNIT,270)
            GO TO 190
  120       CONTINUE
C
C              FACTOR AND SOLVE A POSITIVE DEFINITE SYSTEM
C
               IF (IPT .EQ. 2) CALL SPTSL(N,D,E,B)
               IF (IPT .EQ. 1) WRITE (LUNIT,280)
               IF (IPT .EQ. 2) WRITE (LUNIT,290)
               IF (N .GT. NPRINT) GO TO 130
                  WRITE (LUNIT,300)
                  WRITE (LUNIT,460) (B(I), I = 1, N)
                  WRITE (LUNIT,310)
                  WRITE (LUNIT,460) (BSAVE(I), I = 1, N)
  130          CONTINUE
C
C              COMPUTE ERRORS AND RESIDUALS
C                 E  =  X - X
C                 R  =  B - A*X
C
               XNORM = SASUM(N,X,1)
               CALL SGTXX(C,D,E,N,KASE,POSDEF)
               IF (N .GT. 1) GO TO 140
                  RNORM = ABS(D(1)*B(1)-BSAVE(1))
                  ENORM = ABS(B(1)-X(1))
               GO TO 170
  140          CONTINUE
                  ENORM = ABS(B(1)-X(1))
                  RNORM = ABS(D(1)*B(1)+E(1)*B(2)-BSAVE(1))
                  IF (N .LE. 2) GO TO 160
                     DO 150 I = 2, NM1
                        RNORM = RNORM
     *                          + ABS(C(I)*B(I-1)+D(I)*B(I)+E(I)*B(I+1)
     *                                -BSAVE(I))
                        ENORM = ENORM + ABS(B(I)-X(I))
  150                CONTINUE
  160             CONTINUE
                  RNORM = RNORM + ABS(C(N)*B(N-1)+D(N)*B(N)-BSAVE(N))
                  ENORM = ENORM + ABS(B(N)-X(N))
  170          CONTINUE
C
               WRITE (LUNIT,320) ENORM
               WRITE (LUNIT,330) RNORM
C
C              COMPUTE TEST RATIOS
C
               EN = FLOAT(N)
               Q(1) = RNORM/(EPS*ANORM*XNORM)
               Q(2) = ENORM/(EPS*XNORM)
               WRITE (LUNIT,220)
               WRITE (LUNIT,340)
               WRITE (LUNIT,220)
               WRITE (LUNIT,400)
               WRITE (LUNIT,410)
               WRITE (LUNIT,420)
               WRITE (LUNIT,220)
               WRITE (LUNIT,440) (Q(I), I = 1, 2)
               WRITE (LUNIT,220)
               IF (N .EQ. 1) EN = 2.0E0
               DO 180 I = 1, 2
                  IF (Q(I) .GT. EN) KFAIL(I) = KFAIL(I) + 1
  180          CONTINUE
  190       CONTINUE
C
            WRITE (LUNIT,350)
  200    CONTINUE
         KASE = KASE + 1
      GO TO 20
  210 CONTINUE
C
C     FINISH MAIN LOOP
C
C     SUMMARY
C
      WRITE (LUNIT,360)
      KASE = KASE - 1
      WRITE (LUNIT,370) KASE
      WRITE (LUNIT,380) KSING
      WRITE (LUNIT,390) KFAIL
      WRITE (LUNIT,470)
      RETURN
C
C     ALL FORMATS
C
  220 FORMAT (1H )
  230 FORMAT (29H1LINPACK TESTER, SGT**, SPT** /
     *        30H THIS VERSION DATED 08/14/78 .)
  240 FORMAT (18H MACHINE EPSILON =, 1PE13.5)
  250 FORMAT (14H MATRIX NUMBER, I4)
  260 FORMAT (4H N =, I4)
  270 FORMAT (16H MAYBE SINGULAR.)
  280 FORMAT (18H RESULTS FOR SGTSL)
  290 FORMAT (18H RESULTS FOR SPTSL)
  300 FORMAT ( / 4H X =)
  310 FORMAT ( / 4H B =)
  320 FORMAT (14H ERROR NORMS =, 1P2E13.5)
  330 FORMAT (14H RESID NORMS =, 1P2E13.5)
  340 FORMAT (26H TEST RATIOS.. E = MACHEPS)
  350 FORMAT ( / 14H ************* /)
  360 FORMAT (8H1SUMMARY)
  370 FORMAT (18H NUMBER OF TESTS =, I4)
  380 FORMAT (30H NUMBER OF SINGULAR MATRICES =, I4)
  390 FORMAT (30H NUMBER OF SUSPICIOUS RATIOS =, 8I4)
  400 FORMAT (20H    ERROR     RESID )
  410 FORMAT (2(10H   -------))
  420 FORMAT (20H     E*X      E*A*X )
  430 FORMAT (14H NORM(A)     =, 1PE13.5)
  440 FORMAT (8F10.4)
  450 FORMAT (6G11.4)
  460 FORMAT (2G14.6)
  470 FORMAT ( / 12H END OF TEST)
      END
      SUBROUTINE SGTXX(C,D,E,N,KASE,POSDEF)
C     FORTRAN FLOAT
C
      INTEGER N,KASE,POSDEF
      REAL C(1),D(1),E(1)
C
      REAL EYE
      INTEGER I
C
      EYE = 0.0E0
      GO TO (10,20,30,30,30,50,50,70,70,90,110), KASE
C
   10 CONTINUE
         N = 1
         D(1) = 1.0E0
         POSDEF = 1
      GO TO 120
C
   20 CONTINUE
         N = 2
         D(1) = 4.0E0
         D(2) = 4.0E0
         C(2) = 2.0E0
         E(1) = 2.0E0
         POSDEF = 1
      GO TO 120
C
   30 CONTINUE
         N = (KASE - 2)*3
         DO 40 I = 1, N
            C(I) = 1.0E0/(FLOAT(2*I+2) + EYE)
            D(I) = 1.0E0/(FLOAT(2*I+1) + EYE)
            E(I) = 1.0E0/(FLOAT(2*I) + EYE)
   40    CONTINUE
         POSDEF = 0
      GO TO 120
C
   50 CONTINUE
         IF (KASE .EQ. 6) N = 10
         IF (KASE .EQ. 7) N = 20
         DO 60 I = 1, N
            C(I) = 1.0E0
            D(I) = 4.0E0
            E(I) = 1.0E0
   60    CONTINUE
         POSDEF = 1
      GO TO 120
C
   70 CONTINUE
         IF (KASE .EQ. 8) N = 10
         IF (KASE .EQ. 9) N = 20
         DO 80 I = 1, N
            C(I) = 1.0E0 + EYE
            D(I) = 4.0E0 + EYE
            E(I) = 1.0E0 - EYE
   80    CONTINUE
         POSDEF = 1
      GO TO 120
C
   90 CONTINUE
         N = 10
         DO 100 I = 1, N
            C(I) = 0.0E0
            D(I) = 1.0E0
            E(I) = 0.0E0
  100    CONTINUE
         POSDEF = 1
      GO TO 120
C
  110 CONTINUE
         N = 0
  120 CONTINUE
      RETURN
      END
