      SUBROUTINE FACTOR(A, B, C, G, H, N)                               FAC   10
C THE SUBROUTINE IS A NORMALISED FACTORISATION OF A SQUARE MATRIX OF
C ORDER GREATER THAN 4.
C THE COEFFICIENT MATRIX P IS SYMMETRIC,POSITIVE DEFINITE AND
C QUINDIAGONAL WITH NON-ZERO ELEMENTS ALSO IN THE LAST TWO COLUMNS OF
C THE FIRST ROW, THE LAST COLUMN OF THE SECOND ROW, THE FIRST COLUMN
C OF ROW (N-1) AND THE FIRST TWO COLUMNS OF THE LAST ROW. A,B,C ARE
C VECTORS EACH OF N ELEMENTS CONTAINING RESPECTIVELY THE SUPER-SUPER-
C DIAGONAL, SUPER-DIAGONAL AND DIAGONAL ELEMENTS OF P I.E. P(I,I+2),
C P(I,I+1) AND P(I,I). THE MATRIX ELEMENTS P(1,N-1), P(1,N), P(2,N)
C ARE STORED IN A(N-1), B(N), A(N) RESPECTIVELY, AS ARE P(N-1,1),
C P(N,1) AND P(N,2)
C THE MATRIX P IS FACTORISED INTO P=DRTD WHERE D IS A DIAGONAL MATRIX
C AND T IS A REAL, UPPER TRIANGULAR MATRIX WITH UNIT DIAGONAL ELEMENTS
C AND NON-ZERO ELEMENTS IN THE LAST TWO COLUMNS AND ON THE SUPER- AND
C SUPER-SUPER-DIAGONALS. R DENOTES THE TRANSPOSE OF T.
C THE INPUT VECTORS ARE OVERWRITTEN DURING THE FACTORISATION STAGE SO
C THAT VECTOR C CONTAINS THE DIAGONAL ELEMENTS OF D, VECTOR B CONTAINS
C THE ELEMENTS  T(I,I+1) FOR I=1 TO N-3  AND VECTOR A CONTAINS THE
C ELEMENTS  T(I,I+2)  FOR I=1 TO N-4.
C TWO RESULT VECTORS G,H ARE USED TO STORE THE ELEMENTS  T(I,N-1) FOR
C I=1 TO N-4  AND  T(I,N) FOR I=1 TO N-3 RESPECTIVELY. THE ELEMENTS
C T(N-3,N-1), T(N-2,N-1), T(N-2,N) AND T(N-1,N) ARE THEN GIVEN BY
C A(N-3)+G(N-3), B(N-2)+G(N-2), A(N-2)+H(N-2), B(N-1)+H(N-1)
C RESPECTIVELY.
      DIMENSION A(N), B(N), C(N), G(N), H(N)
      N1 = N - 1
      N2 = N - 2
      N3 = N - 3
      N4 = N - 4
      C(1) = SQRT(C(1))
      V = B(1)/C(1)
      C(2) = SQRT(C(2)-V*V)
      B(1) = V/C(2)
      DO 10 I=3,N2
        I1 = I - 1
        I2 = I - 2
        U = A(I2)/C(I2)
        V = B(I1)/C(I1) - B(I2)*U
        C(I) = SQRT(C(I)-U*U-V*V)
        A(I2) = U/C(I)
        B(I1) = V/C(I)
   10 CONTINUE
      G(1) = A(N1)/C(1)
      G(2) = -B(1)*G(1)
      U = A(N3)/C(N3)
      V = B(N2)/C(N2) - B(N3)*U
      DO 20 I=3,N2
        G(I) = -B(I-1)*G(I-1) - A(I-2)*G(I-2)
   20 CONTINUE
      W = 0.0
      DO 30 I=1,N4
        W = W + G(I)*G(I)
   30 CONTINUE
      C(N1) = SQRT(C(N1)-W-(G(N3)+U)**2-(G(N2)+V)**2)
      W = 1.0/C(N1)
      A(N3) = U*W
      B(N2) = V*W
      DO 40 I=1,N2
        G(I) = G(I)*W
   40 CONTINUE
      H(1) = B(N)/C(1)
      H(2) = A(N)/C(2) - B(1)*H(1)
      U = A(N2)/C(N2)
      V = B(N1)/C(N1) - B(N2)*U
      DO 50 I=3,N1
        H(I) = -B(I-1)*H(I-1) - A(I-2)*H(I-2)
   50 CONTINUE
      W = 0.0
      DO 60 I=1,N2
        W = W + G(I)*H(I)
   60 CONTINUE
      H(N1) = H(N1) - W - G(N2)*U
      W = 0.0
      DO 70 I=1,N3
        W = W + H(I)*H(I)
   70 CONTINUE
      C(N) = SQRT(C(N)-W-(H(N2)+U)**2-(H(N1)+V)**2)
      W = 1.0/C(N)
      A(N2) = U*W
      B(N1) = V*W
      DO 80 I=1,N1
        H(I) = H(I)*W
   80 CONTINUE
      RETURN
      END
      SUBROUTINE SOLVE(E, F, G, H, Q, N)                                SOL   10
C THE SUBROUTINE SOLVES THE SET OF N LINEAR EQUATIONS RTZ=Q WHERE T IS
C AN UPPER TRIANGULAR MATRIX WITH UNIT ELEMENTS ON THE DIAGONAL AND R
C DENOTES THE TRANSPOSE OF T. THE OTHER NON-ZERO ELEMENTS OF T OCCUR ON
C THE SUPER-DIAGONAL I.E. T(I,I+1), THE SUPER-SUPER-DIAGONAL I.E.
C T(I,I+2) AND IN THE LAST TWO COLUMNS I.E. T(I,N-1) AND T(I,N).
C THE STORAGE IS SUCH THAT THE FOLLOWING ARE EQUIVALENT----
C        T(I,I+1)   AND E(I)   FOR I=1 TO N-3
C        T(I,I+2)   AND F(I)   FOR I=1 TO N-4
C        T(I,N-1)   AND G(I)   FOR I=1 TO N-4
C        T(I,N)     AND H(I)   FOR I=1 TO N-3
C        T(N-3,N-1) AND F(N-3)+G(N-3)
C        T(N-2,N-1) AND E(N-2)+G(N-2)
C        T(N-2,N)   AND F(N-2)+H(N-2)
C        T(N-1,N)   AND E(N-1)+H(N-1)
C THE SOLUTION IS EFFECTED BY A FORWARD SUBSTITUTION PROCESS FOLLOWED
C BY A BACKWARD SUBSTITUTION AND THE INPUT VECTOR Q IS SUCCESSIVELY
C OVERWRITTEN BY THE INTERMEDIATE SOLUTION (OF THE FORWARD ELIMINATION)
C AND THEN THE FINAL SOLUTION.
      DIMENSION E(N), F(N), G(N), H(N), Q(N)
      N1 = N - 1
      N2 = N - 2
      N3 = N - 3
      Q(2) = Q(2) - E(1)*Q(1)
      DO 10 I=3,N2
        Q(I) = Q(I) - E(I-1)*Q(I-1) - F(I-2)*Q(I-2)
   10 CONTINUE
      U = 0.0
      V = 0.0
      DO 20 I=1,N2
        U = U + G(I)*Q(I)
        V = V + H(I)*Q(I)
   20 CONTINUE
      Q(N1) = Q(N1) - E(N2)*Q(N2) - F(N3)*Q(N3) - U
      Q(N) = Q(N) - (E(N1)+H(N1))*Q(N1) - F(N2)*Q(N2) - V
      Q(N1) = Q(N1) - (E(N1)+H(N1))*Q(N)
      Q(N2) = Q(N2) - (E(N2)+G(N2))*Q(N1) - (F(N2)+H(N2))*Q(N)
      DO 30 II=1,N3
        I = N3 - II + 1
        Q(I) = Q(I) - E(I)*Q(I+1) - F(I)*Q(I+2) - G(I)*Q(N1) -
     *   H(I)*Q(N)
   30 CONTINUE
      RETURN
      END
      SUBROUTINE RHS(D, S, N)                                           RHS   10
C THE SUBROUTINE FORMS Q WHERE BQ=S AND B IS A DIAGONAL MATRIX OF ORDER
C N WHOSE NON-ZERO DIAGONAL ENTRIES ARE STORED IN A VECTOR D OF N
C ELEMENTS. THE INPUT VECTOR S IS OVERWRITTEN BY THE RESULT Q
      DIMENSION D(N), S(N)
      DO 10 I=1,N
        S(I) = S(I)/D(I)
   10 CONTINUE
      RETURN
      END
