End of file
Contents
Index

      SUBROUTINE ISPLNK (N,XN,FN,B,C,D,H,DM,RS,IERR)
C
C*******************************************************************
C                                                                  *
C  ISPLNK computes the coefficients B(I), C(I), D(I) for I=0,1,.., *
C  N-1 of a cubic interpolating spline with 'not a node' end       *
C  point derivatives.                                              *
C                                                                  *
C  The spline has the form:                                        *
C                                                                  *
C  S(X) = FN(I) + B(I)(X-XN(I)) + C(I)(X-XN(I))**2 +               *
C                               + D(I)(X-XN(I))**3                 *
C                                                                  *
C  for X in the interval [XN(I),XN(I+1)] for I=0,1,...,N-1.        *
C                                                                  *
C                                                                  *
C  ASSUMPTIONS:   1.         N > 2                                 *
C  ============   2.     XN(I) < XN(I+1), I=0,1,...,N-1            *
C                                                                  *
C                                                                  *
C  NOTE:  ISPLNK should not be used by itself, but rather via the  *
C  =====  SUBROUTINE ISPLNP, which also checks the input data.     *
C                                                                  *
C                                                                  *
C  INPUT PARAMETERS:                                               *
C  =================                                               *
C  N  :  index of the final node                                   *
C  XN :  vector XN(0:N); the nodes XN(I), I = 0,1,...,N            *
C  FN :  vector FN(0:N); the functional values FN(I) = FN( XN(I) ) *
C                                                                  *
C                                                                  *
C  AUXILIARY VARIABLES:                                            *
C  ====================                                            *
C  H  :   N-vector H(0:N-1)                                        *
C  DM :   N-1-vector DM(1:N-1)                                     *
C  RS :   N-1-vector RS(1:N-1)                                     *
C                                                                  *
C                                                                  *
C  OUTPUT PARAMETERS:                                              *
C  ==================                                              *
C  FN :  ]  N+1-vectors ..(0:N);                                   *
C  B  :  ]  The first N entries of B, C and D are the spline       *
C  C  :  ]  coefficients for S. B(N), C(N), D(N) are auxiliary     *
C  D  :  ]  variables.                                             *
C  IERR :  error parameter                                         *
C          =  0 :  All is ok                                       *
C          = -1 :  N < 3                                           *
C          =  1 :  crash in SUBROUTINE TRDIG, system matrix        *
C                  numerically singular                            *
C                                                                  *
C------------------------------------------------------------------*
C                                                                  *
C  Subroutines required: TRDIG                                     *
C                                                                  *
C                                                                  *
C                                                                  *
C*******************************************************************
C                                                                  *
C  Author   : Günter Palm                                          *
C  Date     : 04.15.1988                                           *
C  Source   : FORTRAN 77                                           *
C                                                                  *
C*******************************************************************
C
      IMPLICIT DOUBLE PRECISION (A-H, O-Z)
      DOUBLE PRECISION XN(0:N), FN(0:N), B(0:N), C(0:N), D(0:N),
     +                 H(0:N-1), DM(1:N-1), RS(1:N-1)
C
C-----Computing auxiliary variables
C
      DO 10 I=0,N-1,1
        H(I) = XN(I+1) - XN(I)
   10 CONTINUE
C
C-----Compute the main and both co diagonals of the system
C     matrix and the right hand side of A*C=RS with a
C     tridiagonal matrix A
C
C     co diagonals
C
      D(1) = H(1) - H(0)
      B(2) = H(0)
      DO 20 I=2,N-3,1
        D(I)   = H(I)
        B(I+1) = H(I)
   20 CONTINUE
      D(N-2) = H(N-2)
      B(N-1) = H(N-2) - H(N-1)
C
C     main diagonal
C
      DM(1) = H(0) + 2.0D0*H(1)
      DO 30 I=2,N-2,1
        DM(I) = 2.0D0*(H(I-1) + H(I))
   30 CONTINUE
      DM(N-1) = 2.0D0*H(N-2) + H(N-1)
C
C     right hand side
C
      DUMMY1 = (FN(2) - FN(1))/H(1)
      RS(1)  = 3.0D0*H(1)/(H(1)+H(0))*(DUMMY1 - (FN(1)-FN(0))/H(0))
      DO 40 I = 2,N-2,1
        DUMMY2 = (FN(I+1) - FN(I))/H(I)
        RS(I)  = 3.0D0*(DUMMY2 - DUMMY1)
        DUMMY1 = DUMMY2
   40 CONTINUE
      RS(N-1) = 3.0D0*H(N-2)/(H(N-2)+H(N-1))*((FN(N)-FN(N-1))/H(N-1)
     +          - DUMMY1)
C
C-----Solve the linear system to find C(1), ..., C(N-1)
C
      CALL TRDIG (N-1,B(1),DM,D(1),RS,C(1),IFLAG)
      IF (IFLAG .NE. 1) THEN
        IF (IFLAG .EQ. 0) THEN
          IERR = 1
        ELSE
          IERR = -1
        ENDIF
      ENDIF
      IERR = 0
C
C-----Compute the remaining spline coefficients
C
      C(0) = C(1) + H(0)/H(1)*(C(1) - C(2))
      C(N) = C(N-1) + H(N-1)/H(N-2)*(C(N-1) - C(N-2))
C
      DO 50 I=0,N-1,1
        B(I) = (FN(I+1)-FN(I))/H(I) - H(I)/3.0D0*(C(I+1)+2.0D0*C(I))
        D(I) = (C(I+1)-C(I))/(3.0D0*H(I))
   50 CONTINUE
      RETURN
      END


Begin of file
Contents
Index