home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / libcruft / villad / jcobi.f < prev    next >
Text File  |  1996-09-28  |  6KB  |  241 lines

  1. ****************************************************************
  2. *
  3. *     The following routines (JCOBI, DIF, DFOPR, INTRP, AND RADAU)
  4. *     are the same as found in Villadsen, J. and M.L. Michelsen,
  5. *     Solution of Differential Equation Models by Polynomial
  6. *     Approximation, Prentice-Hall (1978) pages 418-420.
  7. *
  8. *     Cosmetic changes (elimination of arithmetic IF statements, most
  9. *     GO TO statements, and indentation of program blocks) made by:
  10. *
  11. *     John W. Eaton
  12. *     Department of Chemical Engineering
  13. *     The University of Texas at Austin
  14. *     Austin, Texas 78712
  15. *
  16. *     June 6, 1987
  17. *
  18. *     Some error checking additions also made on June 7, 1987
  19. *
  20. *     Further cosmetic changes made August 20, 1987
  21. *
  22. ************************************************************************
  23. *
  24.       SUBROUTINE JCOBI
  25.      +  (
  26.      +  ND, N, N0, N1, ALPHA, BETA, DIF1, DIF2, DIF3, ROOT
  27.      +  )
  28. C
  29.       INTEGER
  30.      +
  31.      +  ND, N, N0, N1
  32.       DOUBLE PRECISION
  33.      +
  34.      +  ALPHA, BETA, DIF1(ND), DIF2(ND), DIF3(ND), ROOT(ND)
  35. C
  36. C***********************************************************************
  37. C
  38. C     VILLADSEN AND MICHELSEN, PAGES 131-132, 418
  39. C
  40. C     THIS SUBROUTINE COMPUTES THE ZEROS OF THE JACOBI POLYNOMIAL
  41. C
  42. C        (ALPHA,BETA)
  43. C       P  (X)
  44. C        N
  45. C
  46. C     USE DIF (GIVEN BELOW) TO COMPUTE THE DERIVATIVES OF THE NODE
  47. C     POLYNOMIAL
  48. C
  49. C                     N0     (ALPHA,BETA)           N1
  50. C       P  (X)  =  (X)   *  P (X)         *  (1 - X)
  51. C        NT                   N
  52. C
  53. C     AT THE INTERPOLATION POINTS.
  54. C
  55. C     INPUT PARAMETERS:
  56. C
  57. C       ND     : THE DIMENSION OF THE VECTORS DIF1, DIF2, DIF3, AND ROOT
  58. C
  59. C       N      : THE DEGREE OF THE JACOBI POLYNOMIAL, (i.e. THE NUMBER
  60. C                OF INTERIOR INTERPOLATION POINTS)
  61. C
  62. C       N0     : DETERMINES WHETHER X = 0 IS INCLUDED AS AN
  63. C                INTERPOLATION POINT
  64. C
  65. C                  N0 = 0  ==>  X = 0 IS NOT INCLUDED
  66. C                  N0 = 1  ==>  X = 0 IS INCLUDED
  67. C
  68. C       N1     : DETERMINES WHETHER X = 1 IS INCLUDED AS AN
  69. C                INTERPOLATION POINT
  70. C
  71. C                  N1 = 0  ==>  X = 1 IS NOT INCLUDED
  72. C                  N1 = 1  ==>  X = 1 IS INCLUDED
  73. C
  74. C       ALPHA  : THE VALUE OF ALPHA IN THE DESCRIPTION OF THE JACOBI
  75. C                POLYNOMIAL
  76. C
  77. C       BETA   : THE VALUE OF BETA IN THE DESCRIPTION OF THE JACOBI
  78. C                POLYNOMIAL
  79. C
  80. C       FOR A MORE COMPLETE EXPLANATION OF ALPHA AN BETA, SEE VILLADSEN
  81. C       AND MICHELSEN, PAGES 57 TO 59
  82. C
  83. C     OUTPUT PARAMETERS:
  84. C
  85. C       ROOT   : ONE DIMENSIONAL VECTOR CONTAINING ON EXIT THE
  86. C                N + N0 + N1 ZEROS OF THE NODE POLYNOMIAL USED IN THE
  87. C                INTERPOLATION ROUTINE
  88. C
  89. C       DIF1   : ONE DIMENSIONAL VECTOR CONTAINING THE FIRST DERIVATIVE
  90. C                OF THE NODE POLYNOMIAL AT THE ZEROS
  91. C
  92. C       DIF2   : ONE DIMENSIONAL VECTOR CONTAINING THE SECOND DERIVATIVE
  93. C                OF THE NODE POLYNOMIAL AT THE ZEROS
  94. C
  95. C       DIF3   : ONE DIMENSIONAL VECTOR CONTAINING THE THIRD DERIVATIVE
  96. C                OF THE NODE POLYNOMIAL AT THE ZEROS
  97. C
  98. C     COMMON BLOCKS:      NONE
  99. C
  100. C     REQUIRED ROUTINES:  VILERR, DIF
  101. C
  102. C***********************************************************************
  103. C
  104.       INTEGER           I,J,NT,IER
  105.       DOUBLE PRECISION  AB,AD,AP,Z1,Z,Y,X,XD,XN,XD1,XN1,XP,XP1,ZC
  106.       DOUBLE PRECISION  ZERO,ONE,TWO
  107.       LOGICAL           LSTOP
  108. C
  109.       PARAMETER ( ZERO = 0.0D+00, ONE = 1.0D+00, TWO = 2.0D+00 )
  110. C
  111. C -- ERROR CHECKING
  112. C
  113.       IF ((N0 .NE. 0) .AND. (N0 .NE. 1)) THEN
  114.         IER   = 1
  115.         LSTOP = .TRUE.
  116.         CALL VILERR(IER,LSTOP)
  117.       ELSE
  118.       END IF
  119. C
  120.       IF ((N1 .NE. 0) .AND. (N1 .NE. 1)) THEN
  121.         IER   = 2
  122.         LSTOP = .TRUE.
  123.         CALL VILERR(IER,LSTOP)
  124.       ELSE
  125.       END IF
  126. C
  127.       IF (ND .LT. (N + N0 + N1)) THEN
  128.         IER   = 3
  129.         LSTOP = .TRUE.
  130.         CALL VILERR(IER,LSTOP)
  131.       ELSE
  132.       END IF
  133. C
  134.       IF ((N + N0 + N1) .LT. 1) THEN
  135.         IER   = 7
  136.         LSTOP = .TRUE.
  137.         CALL VILERR(IER,LSTOP)
  138.       ELSE
  139.       END IF
  140. C
  141. C -- FIRST EVALUATION OF COEFFICIENTS IN RECURSION FORMULAS.
  142. C -- RECURSION COEFFICIENTS ARE STORED IN DIF1 AND DIF2.
  143. C
  144.       AB      = ALPHA + BETA
  145.       AD      = BETA - ALPHA
  146.       AP      = BETA*ALPHA
  147.       DIF1(1) = (AD/(AB + TWO) + ONE)/TWO
  148.       DIF2(1) = ZERO
  149. C
  150.       IF(N .GE. 2) THEN
  151.         DO 10 I = 2,N
  152. C
  153.           Z1      = DBLE(I) - ONE
  154.           Z       = AB + 2*Z1
  155.           DIF1(I) = (AB*AD/Z/(Z + TWO) + ONE)/TWO
  156. C
  157.           IF (I .EQ. 2) THEN
  158.             DIF2(I) = (AB + AP + Z1)/Z/Z/(Z + ONE)
  159.           ELSE
  160.             Z       = Z*Z
  161.             Y       = Z1*(AB + Z1)
  162.             Y       = Y*(AP + Y)
  163.             DIF2(I) = Y/Z/(Z - ONE)
  164.           END IF
  165. C
  166.    10   CONTINUE
  167.       ELSE
  168.       END IF
  169. C
  170. C -- ROOT DETERMINATION BY NEWTON METHOD WITH SUPPRESSION OF
  171. C -- PREVIOUSLY DETERMINED ROOTS
  172. C
  173.       X = ZERO
  174. C
  175.       DO 20 I = 1,N
  176. C
  177.    25   CONTINUE
  178.         XD  = ZERO
  179.         XN  = ONE
  180.         XD1 = ZERO
  181.         XN1 = ZERO
  182. C
  183.         DO 30 J = 1,N
  184.           XP  = (DIF1(J) - X)*XN  - DIF2(J)*XD
  185.           XP1 = (DIF1(J) - X)*XN1 - DIF2(J)*XD1 - XN
  186.           XD  = XN
  187.           XD1 = XN1
  188.           XN  = XP
  189.           XN1 = XP1
  190.    30   CONTINUE
  191. C
  192.         ZC  = ONE
  193.         Z   = XN/XN1
  194. C
  195.         IF (I .NE. 1) THEN
  196.           DO 22 J = 2,I
  197.             ZC = ZC - Z/(X - ROOT(J-1))
  198.    22     CONTINUE
  199.         ELSE
  200.         END IF
  201. C
  202.         Z  = Z/ZC
  203.         X  = X - Z
  204. C
  205.         IF (DABS(Z) .GT. 1.D-09) THEN
  206. C
  207. C -- BACKWARD BRANCH
  208. C
  209.           GO TO 25
  210.         ELSE
  211.         END IF
  212. C
  213.         ROOT(I) = X
  214.         X = X + 0.0001D0
  215. C
  216.    20 CONTINUE
  217. C
  218. C -- ADD INTERPOLATION POINTS AT X = 0 AND/OR X = 1
  219. C
  220.       NT = N + N0 + N1
  221. C
  222.       IF (N0 .NE. 0) THEN
  223.         DO 31 I = 1,N
  224.           J = N + 1 - I
  225.           ROOT(J+1) = ROOT(J)
  226.    31   CONTINUE
  227.         ROOT(1) = ZERO
  228.       ELSE
  229.       END IF
  230. C
  231.       IF (N1 .EQ. 1) THEN
  232.         ROOT(NT) = ONE
  233.       ELSE
  234.       END IF
  235. C
  236.       CALL DIF ( NT, ROOT, DIF1, DIF2, DIF3 )
  237. C
  238.       RETURN
  239.       END
  240.