C-------------------------------------------------------------     ************
C                                                                      FOLR
C                                                                  ************
      SUBROUTINE FOLR(N,A,INCA,B,INCB)
C
C     Solves first order linear recurrences of the form:
C             c(i) = -a(i)*c(i-1) + b(i)
C     Martin J. McBride.  8/8/85.
C     General Electric CRD, Information System Operation.
C
      INTEGER N,INCA,INCB,IA,IB
      DOUBLE PRECISION A(1),B(1),CUR,PRV

C  Set up initial conditions.
      IF (N .LT. 1) RETURN
      IA = 1
      IB = 1
      IF (INCA .LT. 0) IA = (-N+1)*INCA + 1
      IF (INCB .LT. 0) IB = (-N+1)*INCB + 1
      IF (INCB .NE. 0) GO TO 20

C  First order linear recurrence where the increment to the recurrence vector
C  is equal to zero.
      PRINT*
      PRINT*,'*********************************************************'
      PRINT*,'*  Possible user error - 0 increment encountered in     *'
      PRINT*,'*    FOLR.  Output will reproduce CRAY SCILIB action.   *'
      PRINT*,'*********************************************************'
      PRINT*
      CUR = B(IB+INCB)
      PRV = B(IB)
      DO 10 I = 2,N
         IA = IA + INCA
         IB = IB + INCB
         B(IB) = -A(IA)*CUR + PRV
         PRV = CUR
         CUR = B(IB)
   10 CONTINUE
      RETURN

C  First order linear recurrence with vector B becoming the result vector.
   20 DO 30 I = 2,N
         IA = IA + INCA
         IB = IB + INCB
         B(IB) = -A(IA)*B(IB-INCB) + B(IB)
   30 CONTINUE
      RETURN
      END

C-------------------------------------------------------------     ************
C                                                                     FOLRP
C                                                                  ************
      SUBROUTINE FOLRP(N,A,INCA,B,INCB)
C
C     Solves first order linear recurrences of the form:
C             c(i) = a(i)*c(i-1) + b(i)
C     Martin J. McBride.  8/9/85.
C     General Electric CRD, Information System Operation.
C
      INTEGER N,INCA,INCB,IA,IB
      DOUBLE PRECISION A(1),B(1),CUR,PRV

C  Set up initial conditions.
      IF (N .LT. 1) RETURN
      IA = 1
      IB = 1
      IF (INCA .LT. 0) IA = (-N+1)*INCA + 1
      IF (INCB .LT. 0) IB = (-N+1)*INCB + 1
      IF (INCB .NE. 0) GO TO 20

C  First order linear recurrence where the increment to the recurrence vector
C  is equal to zero.
      PRINT*
      PRINT*,'*********************************************************'
      PRINT*,'*  Possible user error - 0 increment encountered in     *'
      PRINT*,'*    FOLRP.  Output will reproduce CRAY SCILIB action.  *'
      PRINT*,'*********************************************************'
      PRINT*
      CUR = B(IB+INCB)
      PRV = B(IB)
      DO 10 I = 2,N
         IA = IA + INCA
         IB = IB + INCB
         B(IB) = A(IA)*CUR + PRV
         PRV = CUR
         CUR = B(IB)
   10 CONTINUE
      RETURN

C  First order linear recurrence with vector B becoming the result vector.
   20 DO 30 I = 2,N
         IA = IA + INCA
         IB = IB + INCB
         B(IB) = A(IA)*B(IB-INCB) + B(IB)
   30 CONTINUE
      RETURN
      END

C-------------------------------------------------------------     ************
C                                                                     FOLR2
C                                                                  ************
      SUBROUTINE FOLR2(N,A,INCA,B,INCB,C,INCC)
C
C     Solves first order linear recurrences of the form:
C             c(i) = -a(i)*c(i-1) + b(i)
C     Martin J. McBride.  8/9/85.
C     General Electric CRD, Information System Operation.
C
      INTEGER N,INCA,INCB,INCC,IA,IB,IC
      DOUBLE PRECISION A(1),B(1),C(1),CUR,PRV

C  Set up initial conditions.
      IF (N .LT. 1) RETURN
      IA = 1
      IB = 1
      IC = 1
      IF (INCA .LT. 0) IA = (-N+1)*INCA + 1
      IF (INCB .LT. 0) IB = (-N+1)*INCB + 1
      IF (INCC .LT. 0) IC = (-N+1)*INCC + 1
      C(IC) = B(IB)
      IF (INCC .NE. 0) GO TO 20

C  First order linear recurrence where the increment to the recurrence vector
C  is equal to zero.
      PRINT*
      PRINT*,'*********************************************************'
      PRINT*,'*  Possible user error - 0 increment encountered in     *'
      PRINT*,'*    FOLR2.  Output will reproduce CRAY SCILIB action.  *'
      PRINT*,'*********************************************************'
      PRINT*
      CUR = B(IB+INCB)
      PRV = B(IB)
      DO 10 I = 2,N
         IA = IA + INCA
         IB = IB + INCB
         IC = IC + INCC
         C(IC) = -A(IA)*CUR + PRV
         PRV = CUR
         CUR = C(IC)
   10 CONTINUE
      RETURN

C  First order linear recurrence with result vector C.
   20 DO 30 I = 2,N
         IA = IA + INCA
         IB = IB + INCB
         IC = IC + INCC
         C(IC) = -A(IA)*C(IC-INCC) + B(IB)
   30 CONTINUE
      RETURN
      END

C-------------------------------------------------------------     ************
C                                                                     FOLR2P
C                                                                  ************
      SUBROUTINE FOLR2P(N,A,INCA,B,INCB,C,INCC)
C
C     Solves first order linear recurrences of the form:
C             c(i) = a(i)*c(i-1) + b(i)
C     Martin J. McBride.  8/9/85.
C     General Electric CRD, Information System Operation.
C
      INTEGER N,INCA,INCB,INCC,IA,IB,IC
      DOUBLE PRECISION A(1),B(1),C(1),CUR,PRV

C  Set up initial conditions.
      IF (N .LT. 1) RETURN
      IA = 1
      IB = 1
      IC = 1
      IF (INCA .LT. 0) IA = (-N+1)*INCA + 1
      IF (INCB .LT. 0) IB = (-N+1)*INCB + 1
      IF (INCC .LT. 0) IC = (-N+1)*INCC + 1
      C(IC) = B(IB)
      IF (INCC .NE. 0) GO TO 20

C  First order linear recurrence where the increment to the recurrence vector
C  is equal to zero.
      PRINT*
      PRINT*,'*********************************************************'
      PRINT*,'*  Possible user error - 0 increment encountered in     *'
      PRINT*,'*    FOLR2P.  Output will reproduce CRAY SCILIB action. *'
      PRINT*,'*********************************************************'
      PRINT*
      CUR = B(IB+INCB)
      PRV = B(IB)
      DO 10 I = 2,N
         IA = IA + INCA
         IB = IB + INCB
         IC = IC + INCC
         C(IC) = A(IA)*CUR + PRV
         PRV = CUR
         CUR = C(IC)
   10 CONTINUE
      RETURN

C  First order linear recurrence with result vector C.
   20 DO 30 I = 2,N
         IA = IA + INCA
         IB = IB + INCB
         IC = IC + INCC
         C(IC) = A(IA)*C(IC-INCC) + B(IB)
   30 CONTINUE
      RETURN
      END

C-------------------------------------------------------------     ************
C                                                                     FOLRN
C                                                                  ************
      DOUBLE PRECISION FUNCTION FOLRN(N,A,INCA,B,INCB)
C
C     Solves for only the last term of first order linear
C          recurrences of the form:
C             c(i) = -a(i)*c(i-1) + b(i)
C     Martin J. McBride.  8/8/85.
C     General Electric CRD, Information System Operation.
C
      INTEGER N,INCA,INCB,IA,IB
      DOUBLE PRECISION A(1),B(1),C

C  Set up initial conditions.
      FOLRN = 0.0D0
      IF (N .LT. 1) RETURN
      IA = 1
      IB = 1
      IF (INCA .LT. 0) IA = (-N+1)*INCA + 1
      IF (INCB .LT. 0) IB = (-N+1)*INCB + 1
      IF (INCB .NE. 0) GO TO 10

C  Warning message for increment of recurrence vector, B, equal to zero.
      PRINT*
      PRINT*,'*********************************************************'
      PRINT*,'*  Possible user error - 0 increment encountered in     *'
      PRINT*,'*    FOLRN.  Output will reproduce CRAY SCILIB action.  *'
      PRINT*,'*********************************************************'
      PRINT*

C  Linear recurrence with C used to determine the last term.
   10 C = B(IB)
      DO 20 I = 2,N
         IA = IA + INCA
         IB = IB + INCB
         C = -A(IA)*C + B(IB)
   20 CONTINUE
      FOLRN = C
      RETURN
      END

C-------------------------------------------------------------     ************
C                                                                      SOLR
C                                                                  ************
      SUBROUTINE SOLR(N,A,INCA,B,INCB,C,INCC)
C
C     Solves second order linear recurrences of the form:
C             c(i+2) = a(i)*c(i+1) + b(i)*c(i)
C     Martin J. McBride.  8/9/85.
C     General Electric CRD, Information System Operation.
C
      INTEGER N,INCA,INCB,INCC,IA,IB,IC
      DOUBLE PRECISION A(1),B(1),C(1)

C  Set up initial conditions.
      IF (N .LT. 1) RETURN
      IA = 1
      IB = 1
      IC = 1
      IF (INCA .LT. 0) IA = (-N+1)*INCA + 1
      IF (INCB .LT. 0) IB = (-N+1)*INCB + 1
      IF (INCC .LT. 0) IC = (-N+1)*INCC + 1
      IC = IC + INCC
      IF (INCC .NE. 0) GO TO 20

C  Second order linear recurrence where the increment to the recurrence
C  vector, C, is equal to zero.
      PRINT*
      PRINT*,'*********************************************************'
      PRINT*,'*  Possible user error - 0 increment encountered in     *'
      PRINT*,'*    SOLR.  Output will reproduce CRAY SCILIB action.   *'
      PRINT*,'*********************************************************'
      PRINT*
      CUR = C(IC)
      PRV = C(IC-INCC)
      DO 10 I = 3,N
         IC = IC + INCC
         C(IC) = A(IA)*CUR + B(IB)*PRV
         PRV = CUR
         CUR = C(IC)
         IA = IA + INCA
         IB = IB + INCB
   10 CONTINUE
      RETURN

C  Second order linear recurrence with result vector C.
   20 DO 30 I = 3,N
         IC = IC + INCC
         C(IC) = A(IA)*C(IC-INCC) + B(IB)*C(IC-2*INCC)
         IA = IA + INCA
         IB = IB + INCB
   30 CONTINUE
      RETURN
      END

C-------------------------------------------------------------     ************
C                                                                     SOLRN
C                                                                  ************
      DOUBLE PRECISION FUNCTION SOLRN(N,A,INCA,B,INCB,C,INCC)
C
C     Solves for only the last term of second order linear
C          recurrences of the form:
C             c(i+2) = a(i)*c(i+1) + b(i)*c(i)
C     Martin J. McBride.  8/13/85.
C     General Electric CRD, Information System Operation.
C
      INTEGER N,INCA,INCB,INCC,IA,IB,IC
      DOUBLE PRECISION A(1),B(1),C(1),C1,C2,C3

C  Set up initial conditions.
      SOLRN = 0.0D0
      IF (N .LT. 2) RETURN
      IA = 1
      IB = 1
      IC = 1
      IF (INCA .LT. 0) IA = (-N+1)*INCA + 1
      IF (INCB .LT. 0) IB = (-N+1)*INCB + 1
      IF (INCC .LT. 0) IC = (-N+1)*INCC + 1
      IF (INCC .NE. 0) GO TO 10

C  Warning message for increment of recurrence vector, C, equal to zero.
      PRINT*
      PRINT*,'*********************************************************'
      PRINT*,'*  Possible user error - 0 increment encountered in     *'
      PRINT*,'*    SOLRN.  Output will reproduce CRAY SCILIB action.  *'
      PRINT*,'*********************************************************'
      PRINT*

C  Second order linear recurrence with result vector C and the last term,
C  SOLRN.
   10 C1 = C(IC)
      C2 = C(IC+INCC)
      C3 = C2
      DO 20 I = 3,N
         C3 = A(IA)*C2 + B(IB)*C1
         C1 = C2
         C2 = C3
         IA = IA + INCA
         IB = IB + INCB
   20 CONTINUE
      SOLRN = C3
      RETURN
      END

C-------------------------------------------------------------     ************
C                                                                     SOLR3
C                                                                  ************
      SUBROUTINE SOLR3(N,A,INCA,B,INCB,C,INCC)
C
C     Solves second order linear recurrences of the form:
C             c(i+2) = c(i+2) + a(i)*c(i+1) + b(i)*c(i)
C     Martin J. McBride.  8/9/85.
C     General Electric CRD, Information System Operation.
C
      INTEGER N,INCA,INCB,INCC,IA,IB,IC
      DOUBLE PRECISION A(1),B(1),C(1)

C  Set up initial conditions.
      IF (N .LT. 1) RETURN
      IA = 1
      IB = 1
      IC = 1
      IF (INCA .LT. 0) IA = (-N+1)*INCA + 1
      IF (INCB .LT. 0) IB = (-N+1)*INCB + 1
      IF (INCC .LT. 0) IC = (-N+1)*INCC + 1
      IC = IC + INCC
      IF (INCC .NE. 0) GO TO 20

C  Second order linear recurrence where the increment to the recurrence
C  vector, C, is equal to zero.
      PRINT*
      PRINT*,'*********************************************************'
      PRINT*,'*  Possible user error - 0 increment encountered in     *'
      PRINT*,'*    SOLR3.  Output will reproduce CRAY SCILIB action.  *'
      PRINT*,'*********************************************************'
      PRINT*
      CUR = C(IC)
      PRV = C(IC-INCC)
      DO 10 I = 3,N
         IC = IC + INCC
         C(IC) = C(IC) + A(IA)*CUR + B(IB)*PRV
         PRV = CUR
         CUR = C(IC)
         IA = IA + INCA
         IB = IB + INCB
   10 CONTINUE
      RETURN

C  Second order linear recurrence with result vector C.
   20 DO 30 I = 3,N
         IC = IC + INCC
         C(IC) = C(IC) + A(IA)*C(IC-INCC) + B(IB)*C(IC-2*INCC)
         IA = IA + INCA
         IB = IB + INCB
   30 CONTINUE
      RETURN
      END