PROGRAM GENERALFIT

       IMPLICIT REAL*8 (A-H,O-Z)

C

C          THIS PROGRAM IS FOR FITTING A SET OF DATE POINTS IN ONE VARIABLE,

C          X, TO A POWER SERIES IN X, THEREBY FINDING THE DERIVATIVES WITH

C          RESPECT TO X AT X = 0.

C

C          IT USES THE ROMBERG SCHEME FOR PURGING HIGHER ORDER CONTAMINATION,

C          AS IT WORKS THROUGH DERIVATIVES ORDER BY ORDER. THE ROMBERG SCHEME

C          REQUIRES THAT THE DATA POINTS BE AT VALUES OF X THAT ARE IN THE

C          RATIO OF 2, AS IN THE SET X = {0,3,6,12,...}. THE EVEN-TEMPERED

C          ROMBERG SCHEME IN THIS PROGRAM REQUIRES ONLY THAT THE X VALUES

C          HAVE A CONSISTENT RATIO FROM POINT TO POINT (I.E., RATIOS OTHER

C          THAN 2 ARE ACCEPTABLE).

C

C          THE PROGRAM DETERMINES THE RATIO OF X-VALUES BY TAKING AS

C          INPUT DATA THE 2ND AND 3RD VALUES. THE FIRST X-VALUE IS 0.0.

C          THE ASSOCIATED Y-VALUES MUST THEN BE ORDERED ACCORDING TO THE

C          ORDER OF THE X-VALUES.

C

C          A SPECIAL OPTION, CALLED "IEVEN", CAN BE USED TO HAVE THE FITTING

C          DONE TO ELIMINATE ODD POWERS IN THE POWER SERIES EXPANSION. IN

C          FACT, IT CAN BE USED FOR MORE SPECIALIZED FITS AS INDICATED BELOW.

C

C          C. E. DYKSTRA   -    VERSION 1.1

C

       DIMENSION E(40,40), X(40), P(40,40)

C

       KLIMIT = 40

       WRITE(6,800)

       READ(5,*) KPTS, X(2), X(3), IEVEN

       IF(KPTS. LE. KLIMIT) GO TO 10

          WRITE(6,700) KPTS, KLIMIT

          CALL EXIT

   10  X(1) = 0.0D 0

C

C          ANALYSIS CAN BE APPLIED TO EVEN POWER EXPANSIONS BY SIMPLY

C          SQUARING THE COORDINATE VALUES

C

C               IEVEN = 0  ALL POWERS OF X

C               IEVEN = 1  POWERS OF X LIMITED TO 2, 4, 6, 8, ...

C               IEVEN = 2  POWERS OF X LIMITED TO 4, 8, 12, ...

C

       IF(IEVEN .NE. 0) X(2) = X(2) ** 2

       IF(IEVEN .NE. 0) X(3) = X(3) ** 2

       IF(IEVEN .EQ. 2) X(2) = X(2) ** 2

       IF(IEVEN .EQ. 2) X(3) = X(3) ** 2

       C = X(3) / X(2)

       IF(C .LT. 1.0D 0) WRITE(6,710)

       IF(KPTS .EQ. 3) GO TO 30

       DO 20 K=4,KPTS

          X(K) = X(K-1) * C

   20  CONTINUE

   30  REWIND 88

       READ(88,*) (E(I,1),I=1,KPTS)

C

C          FORM DIFFERENCES AS INITIAL DERIVATIVE VALUES

C

       NORDER = KPTS

       DO 50 N=2,NORDER

          DO 40 I=N,KPTS

             II = I - N + 1

             E(I,N) = (E(I,N-1) - E(I-1,N-1)) / (X(I) - X(II))

   40     CONTINUE

   50  CONTINUE

C

C          PURGE CONTAMINATION DUE TO HIGHER ORDER DERIVATIVES,

C          DOING THIS DERIVATIVE BY DERIVATIVE

C

       DO 90 N=2,NORDER

          MAX = NORDER - N + 1

          IF(MAX .LT. 2) GO TO 100

          NDERIV = N - 1

          NNNN = (IEVEN + 1) * NDERIV

          WRITE(6,910) NNNN

          N1 = N + 1

          DO 60 I=N,KPTS

             P(I,1) = E(I,N)

   60     CONTINUE

          WRITE(6,920)

          WRITE(6,930) (I, P(I,1),I=N,KPTS)

          KPTSN = KPTS

          DO 80 ITER=2,MAX

             ITPURGE = ITER + N - 2

             KPTSN = KPTSN - 1

             IF(KPTSN . LT. N1) GO TO 80

             WRITE(6,940) ITPURGE

             CQ = C**(ITER - 1)

             CQ1 = CQ - 1.0D 0

             DO 70 L=N1,KPTSN

                P(L,ITER) = (CQ * P(L,ITER-1) - P(L+1,ITER-1)) / CQ1

   70        CONTINUE

             WRITE(6,930) (L,P(L,ITER),L=N1,KPTSN)

   80     CONTINUE

   90  CONTINUE

  100  WRITE(6,950)

       WRITE(6,960)

       CALL EXIT

C

  700  FORMAT(' >>> EXECUTION TERMINATED:',I6,' IS MORE THAN'

     1        ' THE PROGRAM LIMIT OF'/

     2        '                          ',I6,' POINTS')

  710  FORMAT(' >>> WARNING: RATIO OF VARIABLES IS LESS THAN 1'/)

  800  FORMAT(' ENTER FORMAT-FREE (1) THE NUMBER OF DATA POINTS'/

     1        '                   (2) THE 2ND POINT-S VARIABLE VALUE'/

     2        '                   (3) THE 3RD POINT-S VARIABLE VALUE'/

     3        '                   (4) ZERO (NORMAL) OR ONE IF NO'/

     4        '                       ODD POWERS IN EXPANSION [N]'/)

  910  FORMAT(/' RESULTS FOR DERIVATIVE'I5)

  920  FORMAT(/'        INITIAL VALUES BY POINTS')

  930  FORMAT(I8,G16.8,I6,G16.8,I6,G16.8)

  940  FORMAT(/'        PURGING THROUGH'I5'      VALUES BY POINTS:')

  950  FORMAT(/'  ...  DERIVATIVE FITTING PROGRAM   VERSION 1.1   '

     1         ' BY C. E. DYKSTRA  ...       '/)

  960 FORMAT('  VALUES GENERATED AFTER PURGING HIGHER ORDER'

     3       ' CONTAMINATION ARE EXPANSION'/'  COEFFICIENTS IN A SIMPLE'

     4       ' POLYNOMIAL: F(X) = C0 + C1*X + C2*X*X + C3*X*X*X ...'

     5      /'  FACTORS OF 2, 6, 24, 120 AND SO ON SHOULD MULTIPLY'

     6       ' THESE COEFFICIENTS'/'  TO USE THEM AS '

     7       ' DERIVATIVE VALUES IN A TAYLOR EXPANSION OF F(X).'/)

       END