      SUBROUTINE DCSSMO(H, N, TNODE, G, WGS, RHO, GSMO, B, C, D)        DCS   10
C
C  THIS SUBROUTINE COMPUTES THE DISCRETE NATURAL CUBIC
C  SPLINE DEFINED ON THE INTERVAL (TNODE(1),TNODE(N)) WHICH
C  SMOOTHS THROUGH THE DATA (TNODE(I),G(I)),I=1,2,...,N.
C  N MUST BE 2 OR GREATER. THE NODES MUST SATISFY TNODE(I)
C  .LT.TNODE(I+1). THE SOLUTION S(T) FOR T IN THE INTERVAL
C  (TNODE(I),TNODE(I+1)) IS GIVEN BY
C
C     S(T)=GSMO(I)+B(I)*(T-TNODE(I))+
C             C(I)*(T-TNODE(I))**2+D(I)*(T-TNODE(I))**3
C
      DIMENSION TNODE(N), G(N), WGS(N), GSMO(N), B(N), C(N), D(N)
C
C  INPUT  PARAMETERS(NONE OF THE INPUT PARAMETERS ARE CHANGED
C         BY THIS SUBROUTINE)
C
C  H     - THE STEP SIZE USED FOR THE DISCRETE CUBIC SPLINE
C  N     - NUMBER OF NODES (TNODE) AND DATA VALUES(G)
C  TNODE - REAL ARRAY CONTAINING THE NODES (TNODE(I).LT.
C          TNODE(I+1)).
C  G     - REAL ARRAY CONTAINING THE DATA VALUES.
C  WGS   - REAL ARRAY CONTAINING THE WEIGHTS WGS(I)
C          CORRESPONDING TO THE DATA (TNODE(I),G(I)).
C  RHO   - SIMPLE REAL VARIABLE CONTAINING THE POSITIVE
C          PARAMETER FOR VARYING THE SMOOTHNESS OF THE FIT.
C          IF RHO IS SMALL SMOOTHNESS IS EMPHASIZED.
C          IF RHO IS LARGE DATA FITTING IS EMPHASIZED.
C
C  OUTPUT PARAMETERS
C
C  GSMO  - REAL ARRAY CONTAINING THE SMOOTHED VALUES OF
C          THE DATA G(I),I=1,2,....,N.
C  B     - REAL ARRAY CONTAINING THE COEFFICIENTS B(I) FOR
C          THE TERMS (T-TNODE(I)).
C  C     - REAL ARRAY CONTAINING THE COEFFICIENTS C(I) FOR
C          THE TERMS (T-TNODE(I))**2.
C  D     - REAL ARRAY CONTAINING THE COEFFICIENTS D(I) FOR
C          THE TERMS (T-TNODE(I))**3.
C
      IF (N.EQ.2) GO TO 180
      N1 = N - 1
      N2 = N1 - 1
      N3 = N2 - 1
C  THE RIGHT HAND SIDE OF THE LINEAR SYSTEM FOR THE
C  C(I)'S WILL NOW BE CONSTRUCTED.
      DO 10 I=1,N
        C(I) = G(I)
   10 CONTINUE
      DO 20 I=1,N1
        C(I) = (C(I+1)-C(I))/(TNODE(I+1)-TNODE(I))
   20 CONTINUE
      DO 30 I=1,N2
        C(I) = 3.0*(C(I+1)-C(I))
   30 CONTINUE
C  THE RIGHT HAND SIDE IS NOW IN ARRAY C.
C
C  THE P.D. 5 BANDED SYMMETRIC MATRIX WILL NOW BE CONSTRUCTED.
C  THE THREE NEEDED DIAGONALS WILL BE STORED IN ARRAYS
C  GSMO,B,D.
      H2 = H*H
      H3 = H2*H
      R6 = 6.0*H3/RHO
      HI3 = TNODE(2) - TNODE(1)
      HI4 = TNODE(3) - TNODE(2)
      ETA3 = HI3 + HI3 + H2/HI3
      BETA3 = R6/(WGS(1)*HI3)
      BETA4 = R6/(WGS(2)*HI3*HI4)
      EPS3 = (BETA3+BETA4*HI4)/HI3
      H2DHI = H2/HI4
      ETA4 = HI4 + HI4 + H2DHI
      IF (N.EQ.3) GO TO 60
      HI5 = TNODE(4) - TNODE(3)
      BETA5 = R6/(WGS(3)*HI4*HI5)
      EPS4 = (BETA4*HI3+BETA5*HI5)/HI4
      GSMO(1) = ETA3 + ETA4 + BETA4 + BETA4 + EPS3 + EPS4
      P = H2DHI + BETA4 + BETA5 + EPS4
      B(1) = HI4 - P
      IF (N.EQ.4) GO TO 50
      DO 40 I=2,N3
        HI3 = HI4
        HI4 = HI5
        HI5 = TNODE(I+3) - TNODE(I+2)
        ETA3 = ETA4
        H2DHI = H2/HI4
        ETA4 = HI4 + HI4 + H2DHI
        BETA3 = BETA4
        BETA4 = BETA5
        BETA5 = R6/(WGS(I+2)*HI4*HI5)
        EPS3 = EPS4
        EPS4 = (BETA4*HI3+BETA5*HI5)/HI4
        D(I-1) = BETA4
        P = H2DHI + BETA4 + BETA5 + EPS4
        B(I) = HI4 - P
        GSMO(I) = ETA3 + ETA4 + BETA4 + BETA4 + EPS3 + EPS4
   40 CONTINUE
   50 HI3 = HI4
      HI4 = HI5
      ETA3 = ETA4
      ETA4 = HI4 + HI4 + H2/HI4
      BETA4 = BETA5
      EPS3 = EPS4
   60 BETA5 = R6/(WGS(N)*HI4)
      EPS4 = (BETA4*HI3+BETA5)/HI4
      GSMO(N2) = ETA3 + ETA4 + BETA4 + BETA4 + EPS3 + EPS4
C  THE P.D. 5 BANDED SYMMETRIC MATRIX IS COMPLETE.
C  THE SYSTEM OF LINEAR EQUATION WILL NOW BE SOLVED FOR THE
C  C(I)'S.
      IF (N.GT.3) GO TO 70
      C(1) = C(1)/GSMO(1)
      GO TO 150
   70 IF (N.GT.4) GO TO 80
      C(1) = (C(1)*GSMO(2)-C(2)*B(1))/(GSMO(1)*GSMO(2)-B(1)**2)
      C(2) = (C(2)-C(1)*B(1))/GSMO(2)
      GO TO 150
C  THIS SOLVE THE 5 BANDED SYSTEM WHEN K=N-2.GT.3.
   80 K = N2
      K1 = K - 1
      K2 = K1 - 1
      K3 = K2 - 1
C  THE 5 BANDED MATRIX WILL NOW BE FACTORED.
      B(1) = B(1)/GSMO(1)
      D(1) = D(1)/GSMO(1)
      P = GSMO(1)*B(1)
      GSMO(2) = GSMO(2) - P*B(1)
      B(2) = (B(2)-P*D(1))/GSMO(2)
      IF (K.EQ.3) GO TO 110
      D(2) = D(2)/GSMO(2)
      IF (K.EQ.4) GO TO 100
      DO 90 I=3,K2
        I1 = I - 1
        I2 = I1 - 1
        P = GSMO(I1)*B(I1)
        GSMO(I) = GSMO(I) - GSMO(I2)*(D(I2)**2) - P*B(I1)
        B(I) = (B(I)-P*D(I1))/GSMO(I)
        D(I) = D(I)/GSMO(I)
   90 CONTINUE
  100 P = GSMO(K2)*B(K2)
      GSMO(K1) = GSMO(K1) - GSMO(K3)*(D(K3)**2) - P*B(K2)
      B(K1) = (B(K1)-P*D(K2))/GSMO(K1)
  110 GSMO(K) = GSMO(K) - GSMO(K2)*(D(K2)**2) - GSMO(K1)*(B(K1)**2)
C  FACTORIZATION COMPLETE.
C  CARRY OUT FORWARD  AND BACKWARD SUBSTITUTION.
      C(2) = C(2) - B(1)*C(1)
      DO 120 I=3,K
        I1 = I - 1
        I2 = I - 2
        C(I) = C(I) - B(I1)*C(I1) - D(I2)*C(I2)
  120 CONTINUE
      DO 130 I=1,K
        C(I) = C(I)/GSMO(I)
  130 CONTINUE
      C(K1) = C(K1) - B(K1)*C(K)
      DO 140 I=2,K1
        J = K - I
        C(J) = C(J) - B(J)*C(J+1) - D(J)*C(J+2)
  140 CONTINUE
C  THE 5 BANDED SYSTEM HAS BEEN SOLVED.THE SOLUTION IS IN
C  ARRAY C. THE COEFFICIENTS GSMO, B, C, AND D WILL NOW BE
C  SET UP.
  150 C(N) = 0.0
      D(N) = 0.0
      C(N1) = C(N2)
      HK1 = TNODE(N) - TNODE(N1)
      D(N1) = -C(N1)/(3.0*HK1)
      GSMO(N) = G(N) + R6*D(N1)/WGS(N)
      IF (N.EQ.3) GO TO 170
      DO 160 I=2,N2
        K = N - I
        K1 = K + 1
        HK2 = HK1
        HK1 = TNODE(K1) - TNODE(K)
        C(K) = C(K-1)
        D(K) = (C(K1)-C(K))/(3.0*HK1)
        GSMO(K1) = G(K1) - R6*(D(K1)-D(K))/WGS(K1)
        B(K1) = (GSMO(K1+1)-GSMO(K1))/HK2 - HK2*(C(K1)+C(K1)+C(K1+1))/
     *    3.0
  160 CONTINUE
  170 C(1) = 0.0
      HK2 = HK1
      HK1 = TNODE(2) - TNODE(1)
      D(1) = (C(2)-C(1))/(3.0*HK1)
      GSMO(2) = G(2) - R6*(D(2)-D(1))/WGS(2)
      GSMO(1) = G(1) - R6*D(1)/WGS(1)
      B(2) = (GSMO(3)-GSMO(2))/HK2 - HK2*(C(2)+C(2)+C(3))/3.0
      B(1) = (GSMO(2)-GSMO(1))/HK1 - HK1*(C(1)+C(1)+C(2))/3.0
C  THE DISCRETE CUBIC SMOOTHING SPLINE IS NOW COMPLETE.
      RETURN
C  THE TRIVIAL CASE WHEN N=2 IS HANDLED HERE.
  180 GSMO(1) = G(1)
      GSMO(2) = G(2)
      B(1) = (G(2)-G(1))/(TNODE(2)-TNODE(1))
      C(1) = 0.0
      D(1) = 0.0
      RETURN
      END
      SUBROUTINE DCSINT(IENT, H, N, TNODE, G, END1, ENDN, B, C, D)      DCS   10
C
C  THIS SUBROUTINE COMPUTES THE DISCRETE CUBIC SPLINE
C  DEFINED ON THE INTERVAL (TNODE(1),TNODE(N)),WHICH INTER-
C  POLATES THE DATA (TNODE(I),G(I)),I=1,2,...,N. WE REQUIRE
C  THAT TNODE(I).LT.TNODE(I+1). END1 AND ENDN CONTAIN THE
C  VALUES OF THE END CONDITIONS BEING USED.
C
C  IF IENT=1,THE FIRST CENTRAL DIVIDED DIFFERENCE END
C  CONDITIONS ARE BEING USED.
C
C  IF IENT=2,THE SECOND CENTRAL DIVIDED DIFFERENCE END
C  CONDITIONS ARE BEING USED.
C
C  IF IENT=3,THE PERODIC END CONDITIONS ARE BEING USED.
C  FOR THIS CASE THE CONTENTS OF G(N), END1,AND ENDN ARE
C  IGNORED.
C
C  FOR ALL THREE END CONDITIONS N MUST BE GREATER THAN OR
C  EQUAL TO 2.
C
C  THE DISCRETE CUBIC SPLINE IS REPRESENTED BY PIECEWISE
C  CUBIC POLYNOMIALS. FOR T IN THE INTERNAL (TNODE(I),TNODE
C  (I+1)) THE CUBIC SPLINE IS
C
C     S(T)=G(I)+B(I)*(T-TNODE(I))
C                          +C(I)*(T-TNODE(I))**2
C                                   +D(I)*(T-TNODE(I))**3
C
      DIMENSION TNODE(N), G(N), B(N), C(N), D(N)
C
C  INPUT PARAMETERS (NONE OF THESE PARAMETERS
C                          ARE CHANGED BY THIS SUBROUTINE.)
C
C  IENT  - SPECIFIES END CONDITIONS WHICH ARE IN EFFECT.
C  H     - THE STEP SIZE USED FOR THE DISCRETE CUBIC SPLINE.
C  N     - NUMBER OF NODES (TNODE) AND DATA VALUES (G).
C          (N.GE.2)
C  TNODE - REAL ARRAY CONTAINING THE NODES (TNODE(I).LT.
C          TNODE(I+1)).
C  G     - REAL ARRAY CONTAINING THE INTERPOLATING DATA.
C  END1  - END CONDITION VALUE AT TNODE(1).
C  ENDN  - END CONDITION VALUE AT TNODE(N).
C
C  OUTPUT PARAMETERS
C
C  B     - REAL ARRAY CONTAINING COEFFICIENTS OF
C          (T-TNODE(I)),I=1,2,....,N-1.
C  C     - REAL ARRAY CONTAINING COEFFICIENTS OF
C          (T-TNODE(I))**2,I=1,2,...,N-1.
C  D     - REAL ARRAY CONTAINING COEFFICIENTS OF
C          (T-TNODE(I))**3,I=1,2,...,N-1.
C
C  SPECIAL CASES ARE ACCOUNTED FOR HERE.
      IF (N.EQ.2 .AND. IENT.EQ.3) GO TO 220
      H2 = H*H
      N1 = N - 1
      IF (N.EQ.2 .AND. IENT.EQ.2) GO TO 180
      N2 = N1 - 1
C  THE SYMMETRIC TRIDIAGONAL(OR NEAR TRIDIAGONAL) LINEAR
C  SYSTEM WILL NOW BE SET UP FOR THE APPROPRIATE END
C  CONDITIONS
      HI = TNODE(2) - TNODE(1)
      H2DHI = H2/HI
      ETA2 = HI + HI + H2DHI
      GO TO (10, 40, 60), IENT
C  IENT=1 - FIRST CENTRAL DIVIDED DIFFERENCE END CONDITONS
C  SET UP.
   10 B(1) = ETA2
      D(1) = HI - H2DHI
      G2 = (G(2)-G(1))/HI
      C(1) = 3.0*(G2-END1)
      IF (N.EQ.2) GO TO 30
      DO 20 I=2,N1
        ETA1 = ETA2
        G1 = G2
        HI = TNODE(I+1) - TNODE(I)
        H2DHI = H2/HI
        ETA2 = HI + HI + H2DHI
        B(I) = ETA1 + ETA2
        D(I) = HI - H2DHI
        G2 = (G(I+1)-G(I))/HI
        C(I) = 3.0*(G2-G1)
   20 CONTINUE
   30 B(N) = ETA2
      C(N) = 3.0*(ENDN-G2)
      L = N
C  SET UP FOR (1) FIRST CENTRAL DIVIDED DIFFERENCE END
C  CONDITING COMPLETE.THE LINEAR EQUATIONS WILL BE NOW
C  SOLVED.
      GO TO 110
C  IENT=2 - SECOND CENTRAL DIVIDED DIFFERENCE END CONDITIONS
C  SET UP.
   40 GAMMA = HI - H2DHI
      G2 = (G(2)-G(1))/HI
      DO 50 I=1,N2
        ETA1 = ETA2
        G1 = G2
        HI = TNODE(I+2) - TNODE(I+1)
        H2DHI = H2/HI
        ETA2 = HI + HI + H2DHI
        B(I) = ETA1 + ETA2
        D(I) = HI - H2DHI
        G2 = (G(I+2)-G(I+1))/HI
        C(I) = 3.0*(G2-G1)
   50 CONTINUE
      C(1) = C(1) - GAMMA*END1/2.0
      HI = TNODE(N) - TNODE(N1)
      GAMMA = HI - H2/HI
      C(N2) = C(N2) - GAMMA*ENDN/2.0
C  STEP UP FOR (2) SECOND CENTRAL DIVIDED DIFFERENCE
C  END CONDITIONS COMPLETE. THE LINEAR EQUATIONS WILL NOW
C  BE SOLVED.
      IF (N2.EQ.1) GO TO 100
      L = N2
      GO TO 110
C  IENT=3 - PERIODIC END CONDITIONS SET UP.
   60 B(1) = ETA2
      D(1) = HI - H2DHI
      DO 70 I=2,N1
        ETA1 = ETA2
        HI = TNODE(I+1) - TNODE(I)
        H2DHI = H2/HI
        ETA2 = HI + HI + H2DHI
        B(I) = ETA1 + ETA2
        D(I) = HI - H2DHI
        C(I) = 0.0
   70 CONTINUE
      CT = D(N1)
      C(1) = CT
      C(N1) = CT
      B(1) = B(1) + ETA2 - CT
      B(N1) = B(N1) - CT
      L = N1
      ITRANS = 1
      GO TO 120
   80 G1 = (G(N1)-G(N2))/(TNODE(N1)-TNODE(N2))
      G2 = (G(1)-G(N1))/(TNODE(N)-TNODE(N1))
      DEN = (1.0+C(1)+C(N1))
      CT = 3.0*(G2-G1)
      BS1 = CT*C(N1)
      C(N1) = CT
      DO 90 I=1,N2
        HI = TNODE(I+1) - TNODE(I)
        G1 = G2
        G2 = (G(I+1)-G(I))/HI
        CT = 3.0*(G2-G1)
        BS1 = BS1 + CT*C(I)
        C(I) = CT
   90 CONTINUE
      BS1 = BS1/DEN
      C(1) = C(1) - BS1
      C(N1) = C(N1) - BS1
      ITRANS = 0
      GO TO 140
C  THE SET UP AND MOST OF THE DETAILS FOR SOLVING THE
C  LINEAR EQUQTION FOR (3)  THE PERIODIC END CONDITIONS
C  ARE COMPLETED.
C
C  THE LINEAR EQUATION ARE SOLVED HERE.
  100 C(2) = C(1)/B(1)
      GO TO 180
  110 ITRANS = 0
  120 L1 = L - 1
      DO 130 I=1,L1
        T = D(I)/B(I)
        B(I+1) = B(I+1) - T*D(I)
        D(I) = T
  130 CONTINUE
C  THE LINEAR EQUATION SOLVER IS ENTERED AT THIS POINT
C  IF THE LU FACTORIZATION HAS ALREADY BEEN DONE.
  140 DO 150 I=1,L1
        C(I+1) = C(I+1) - D(I)*C(I)
  150 CONTINUE
      C(L) = C(L)/B(L)
      DO 160 I=1,L1
        LI = L - I
        C(LI) = C(LI)/B(LI) - D(LI)*C(LI+1)
  160 CONTINUE
      IF (ITRANS.GE.1) GO TO 80
C  THE LINEAR SYSTEM HAS BEEN SOLVE FOR THE C-VECTOR
      IF (IENT.EQ.3) C(N) = C(1)
      IF (IENT.NE.2) GO TO 190
      DO 170 I=1,N2
        LI = N - I
        C(LI) = C(LI-1)
  170 CONTINUE
  180 C(1) = END1/2.0
      C(N) = ENDN/2.0
  190 C1 = C(1)
      C2 = C(2)
      HI = TNODE(2) - TNODE(1)
      IF (N.EQ.2) GO TO 210
      DO 200 I=1,N2
        B(I) = (G(I+1)-G(I))/HI - HI*(C1+C1+C2)/3.0
        D(I) = (C2-C1)/(3.0*HI)
        HI = TNODE(I+2) - TNODE(I+1)
        C1 = C2
        C2 = C(I+2)
  200 CONTINUE
  210 GN = G(1)
      IF (IENT.NE.3) GN = G(N)
      B(N1) = (GN-G(N1))/HI - HI*(C1+C1+C2)/3.0
      D(N1) = (C2-C1)/(3.0*HI)
C  THE INTERPOLATING DISCRETE CUBIC SPLINE HAS BEEN
C  CONSTRUCTED.
      RETURN
C  THE FOLLOWING HANDLES THE TRIVIAL PERIODIC CASE
C  (IENT.EQ.3) WHEN N.EQ.2.
  220 B(1) = 0.0
      C(1) = 0.0
      D(1) = 0.0
      RETURN
      END
C TEST FOR DURIS ALGORITHM, JAN 1979                                    DU 00010
C  DRIVER FOR DCSSMO                                                    DU 00020
C  THIS DRIVER USES SUBROUTINE DCSSMO TO COMPUTE THE                    DU 00030
C  DISCRETE NATURAL CUBIC SPLINE WHICH SMOOTHS THROUGH                  DU 00040
C  THE DATA (TNODE(I),G(I)),I=1,2,...,N AS SPECIFIED                    DU 00050
C  BY THE SMOOTHING PARAMETER RHO AND THE WEIGHTS WGS(I),               DU 00060
C  I=1,2,...,N.                                                         DU 00070
      DIMENSION TNODE(20), G(20), B(20), C(20), D(20), GSMO(20),        DU 00080
     *  WGS(20)                                                         DU 00090
C  THE NEXT READ STATEMENT BRINGS IN THE TOTAL NUMBER                   DU 00100
C  OF DATA POINTS N, THE STEP SIZE H , AND THE PARAMETER RHO            DU 00110
C  SPECIFYING THE AMOUNT OF SMOOTHING DESIRED.                          DU 00120
      READ (5,99999) N, H, RHO                                          DU 00130
C  THE FOLLOW WRITE STATMENTS OUTPUT N,H,AND RHO AND                    DU 00140
C  PREPARES TO OUTPUT DATA AND SOLUTION.                                DU 00150
      WRITE (6,99998)                                                   DU 00160
      WRITE (6,99997) N, H, RHO                                         DU 00170
C  THE NEXT DO LOOP READS IN THE DATA VALUES                            DU 00180
C  (TNODE(I),G(I)), AND THE WEIGHTS WGS(I) FOR                          DU 00190
C  I=1,2,...,N AND AT THE SAME TIME WRITES THIS DATA                    DU 00200
C  AS OUTPUT TO THE USER.                                               DU 00210
      DO 10 I=1,N                                                       DU 00220
        READ (5,99995) TNODE(I), G(I), WGS(I)                           DU 00230
        WRITE (6,99996) I, TNODE(I), G(I), WGS(I)                       DU 00240
   10 CONTINUE                                                          DU 00250
C  SUBROUTINE DCSMO PARAMETERS H, TNODE,G,WGS,                          DU 00260
C   ARE AS SPECIFIED ABOVE.                                             DU 00270
      DRHO=RHO                                                          DU 00280
      NN=N                                                              DU 00290
      DO 50 N=2,NN                                                      DU 00300
      DO 40 IRHO=1,3                                                    DU 00310
      RHO=DRHO*100.**(IRHO-2)                                           DU 00320
      WRITE (6,99998)                                                   DU 00330
      WRITE (6,99997) N, H, RHO                                         DU 00340
      DO 15 I=1,N                                                       DU 00350
        WRITE (6,99996) I, TNODE(I), G(I), WGS(I)                       DU 00360
   15 CONTINUE                                                          DU 00370
      CALL DCSSMO(H, N, TNODE, G, WGS, RHO, GSMO, B, C, D)              DU 00380
C  OUTPUT FROM DCSSMO IS GSMO(I),B(I),C(I),AND D(I) FOR                 DU 00390
C  I=1,2,...,N-1. IN PARTICULAR THE DISCRETE CUBIC SPLINE               DU 00400
C  ON THE INTERVAL (TNODE(1),TNODE(I+1)0 IS DESCRIBED BY                DU 00410
C  THE CUBIC POLYNOMIAL                                                 DU 00420
C                                                                       DU 00430
C      S(T)=GSMO(I)+B(I)*(T-TNODE(I))+                                  DU 00440
C          C(I)*(T-TNODE(I))**2+D(I)*(T-TNODE(I))**3                    DU 00450
C                                                                       DU 00460
      N1 = N - 1                                                        DU 00470
C  THE SOLUTION IS NOW PRINTED OUT BY THE FOLLOWING STATEMENTS          DU 00480
      WRITE (6,99994)                                                   DU 00490
      DO 20 I=1,N1                                                      DU 00500
        WRITE (6,99993) I, GSMO(I), B(I), C(I), D(I)                    DU 00510
   20 CONTINUE                                                          DU 00520
      WRITE(6,99992)                                                    DU 00530
      DO 30 I=1,N1                                                      DU 00540
      T=TNODE(I+1)-TNODE(I)                                             DU 00550
      SL=GSMO(I)                                                        DU 00560
      SR=GSMO(I)+(B(I)+(C(I)+D(I)*T)*T)*T                               DU 00570
      FL=B(I)+D(I)*H*H                                                  DU 00580
      FR=FL+(2.*C(I)+3.*D(I)*T)*T                                       DU 00590
      DL=2.*C(I)                                                        DU 00600
      DR=DL+6.*D(I)*T                                                   DU 00610
      WRITE(6,99993)I,SL,SR,FL,FR,DL,DR                                 DU 00620
30    CONTINUE                                                          DU 00630
40    CONTINUE                                                          DU 00640
50    CONTINUE                                                          DU 00650
      CALL TEST2                                                        DU 00660
      STOP                                                              DU 00670
99999 FORMAT (I10, 2E10.2)                                              DU 00680
99998 FORMAT (///5H DATA)                                               DU 00690
99997 FORMAT (3H N=, I3, 2X, 2HH=, F10.4, 3X, 4HRHO=, F10.4  //5H   I , DU 00700
     *  3X, 8HTNODE(I), 9X, 4HG(I), 7X, 6HWGS(I))                       DU 00710
99996 FORMAT (I3, 3E16.7)                                               DU 00720
99995 FORMAT (3E10.2)                                                   DU 00730
99994 FORMAT (//40H DISCRETE NATURAL CUBIC SMOOTHING SPLINE//4H  I ,    DU 00740
     *  2X, 7HGSMO(I), 12X, 4HB(I), 16X, 4HC(I), 16X, 4HD(I))           DU 00750
99993 FORMAT (I3, 6E17.7)                                               DU 00760
99992 FORMAT(3H0 I,14X,6HVALUES,18X,25HFIRST DIVIDED DIFFERENCES,       DU 00770
     1 9X,26HSECOND DIVIDED DIFFERENCES)                                DU 00780
      END                                                               DU 00790
      SUBROUTINE TEST2                                                  DU 00800
C  DRIVER FOR DCSINT
C  THIS DRIVER USES SUBROUTINE DCSINT TO COMPUTE THE
C  DISCRETE CUBIC SPLINE WHICH INTERPOLATES THE DATA
C  (TNODE(I),G(I)),I=1,2,...,N SUBJECT TO THE END CONDITIONS
C  SPECIFIED BY IENT,END1,AND ENDN.
C
      DIMENSION TNODE(20), G(20), B(20), C(20), D(20)
C
C  THE NEXT READ STATEMENT BRINGS IN THE NUMBER OF DATA
C  POINTS N AND THE DISCRETE CUBIC SPLINE STEP SIZE H.
C
      READ (5,99999) N, H
      WRITE (6,99998) N, H
      WRITE (6,99997)
C  THE NEXT DO LOOP READS IN AND WRITES OUT THE DATA
C  VALUES (TNODE(I),G(I)),I=1,2...,N.
      DO 10 I=1,N
        READ (5,99996) TNODE(I), G(I)
        WRITE (6,99995) I, TNODE(I), G(I)
   10 CONTINUE
C  THE END CONDITIONS ARE NOW READ IN. IENT SPECIFIES
C  THE TYPE OF END CONDITION(SEE SUBROUTINE COMMENTS)
C  AND END1 AND ENDN SPECIFY THE VALUES OF THE END CONDITIONS.
      READ (5,99994) IENT, END1, ENDN
C  SUBROUTINE DCSINT IS NOW CALLED. THE PARAMETERS
C  H,TNODE,G,END1,AND ENDN ARE AS SPECIFIED ABOVE
      NN=N
      DO 50 N=2,NN
      WRITE (6,99998) N, H
      WRITE (6,99997)
      DO 15 I=1,N
        WRITE (6,99995) I, TNODE(I), G(I)
   15 CONTINUE
      DO 40 IENT=1,3
C
      CALL DCSINT(IENT, H, N, TNODE, G, END1, ENDN, B, C, D)
C  THE END CONDITIONS IENT,END1,ENDN AND THE DISCRETE
C  CUBIC SPLINE SOLUTION TO THE INTERPOLATIONPROBLEM
C  ARE NOW OUTPUTED BELOW. IN PARTICULAR THE DISCRETE
C  CUBIC SPLINE ON THE INTERVAL (TNODE(I),TNODE(I+1))
C  IS DESCRIBES BY THE CUBIC POLYNOMIAL
C
C       S(T)=G(I)+B(I)*ARG+C(I)*ARG**2
C                 +D(I)*ARG**3
C
C  WHERE ARG=(T-TNODE(I)).
C
      WRITE (6,99993) IENT, END1, ENDN
      WRITE (6,99992)
      N1 = N - 1
      DO 20 I=1,N1
        WRITE (6,99991) I, G(I), B(I), C(I), D(I)
   20 CONTINUE
      WRITE(6,99990)
      DO 30 I=1,N1
      T=TNODE(I+1)-TNODE(I)
      SL=G(I)
      SR=G(I)+(B(I)+(C(I)+D(I)*T)*T)*T
      FL=B(I)+D(I)*H*H
      FR=FL+(2.*C(I)+3.*D(I)*T)*T
      DL=2.*C(I)
      DR=DL+6.*D(I)*T
      WRITE(6,99991)I,SL,SR,FL,FR,DL,DR
30    CONTINUE
40    CONTINUE
50    CONTINUE
      RETURN
99999 FORMAT (I10, E10.2)
99998 FORMAT (///5H DATA//3H N=, I3, 2X, 2HH=, F10.5)
99997 FORMAT (2H I, 3X, 8HTNODE(I), 10X, 4HG(I))
99996 FORMAT (2E10.2)
99995 FORMAT (I3, 3E16.7)
99994 FORMAT (I10, 2E10.2)
99993 FORMAT (///6H IENT=, I2, 2X, 5HEND1=, E16.7, 2X, 5HEND2=, E16.7)
99992 FORMAT (/2H I, 3X, 4HG(I), 13X, 4HB(I), 13X, 4HC(I), 13X, 4HD(I))
99991 FORMAT (I3, 6E17.7)
99990 FORMAT(3H0 I,14X,6HVALUES,18X,25HFIRST DIVIDED DIFFERENCES,
     1 9X,26HSECOND DIVIDED DIFFERENCES)
      END
         7  0.1       100.0                                             DU 01610
  0.5        1.0      2.0                                               DU 01620
   0.7       0.5     2.5                                                DU 01630
   1.0      2.0      1.0                                                DU 01640
   1.5       2.5      1.5                                               DU 01650
   2.1      2.0        2.0                                              DU 01660
   2.5       1.0      2.0                                               DU 01670
   3.0       0.1      2.0                                               DU 01680
         6  0.1                                                         DU 01690
  0.5        1.0                                                        DU 01700
   0.7       0.5                                                        DU 01710
   1.0      2.0                                                         DU 01720
   1.5       2.5                                                        DU 01730
   2.1      2.0                                                         DU 01740
   2.5       1.0                                                        DU 01750
         2  0.001    0.002                                              DU 01760
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
