dpolvl.f 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. *DECK DPOLVL
  2. SUBROUTINE DPOLVL (NDER, XX, YFIT, YP, N, X, C, WORK, IERR)
  3. C***BEGIN PROLOGUE DPOLVL
  4. C***PURPOSE Calculate the value of a polynomial and its first NDER
  5. C derivatives where the polynomial was produced by a previous
  6. C call to DPLINT.
  7. C***LIBRARY SLATEC
  8. C***CATEGORY E3
  9. C***TYPE DOUBLE PRECISION (POLYVL-S, DPOLVL-D)
  10. C***KEYWORDS POLYNOMIAL EVALUATION
  11. C***AUTHOR Huddleston, R. E., (SNLL)
  12. C***DESCRIPTION
  13. C
  14. C Abstract -
  15. C Subroutine DPOLVL calculates the value of the polynomial and
  16. C its first NDER derivatives where the polynomial was produced by
  17. C a previous call to DPLINT.
  18. C The variable N and the arrays X and C must not be altered
  19. C between the call to DPLINT and the call to DPOLVL.
  20. C
  21. C ****** Dimensioning Information *******
  22. C
  23. C YP must be dimensioned by at least NDER
  24. C X must be dimensioned by at least N (see the abstract )
  25. C C must be dimensioned by at least N (see the abstract )
  26. C WORK must be dimensioned by at least 2*N if NDER is .GT. 0.
  27. C
  28. C *** Note ***
  29. C If NDER=0, neither YP nor WORK need to be dimensioned variables.
  30. C If NDER=1, YP does not need to be a dimensioned variable.
  31. C
  32. C
  33. C ***** Input parameters
  34. C *** All TYPE REAL variables are DOUBLE PRECISION ***
  35. C
  36. C NDER - the number of derivatives to be evaluated
  37. C
  38. C XX - the argument at which the polynomial and its derivatives
  39. C are to be evaluated.
  40. C
  41. C N - *****
  42. C * N, X, and C must not be altered between the call
  43. C X - * to DPLINT and the call to DPOLVL.
  44. C C - *****
  45. C
  46. C
  47. C ***** Output Parameters
  48. C *** All TYPE REAL variables are DOUBLE PRECISION ***
  49. C
  50. C YFIT - the value of the polynomial at XX
  51. C
  52. C YP - the derivatives of the polynomial at XX. The derivative of
  53. C order J at XX is stored in YP(J) , J = 1,...,NDER.
  54. C
  55. C IERR - Output error flag with the following possible values.
  56. C = 1 indicates normal execution
  57. C
  58. C ***** Storage Parameters
  59. C
  60. C WORK = this is an array to provide internal working storage for
  61. C DPOLVL. It must be dimensioned by at least 2*N if NDER is
  62. C .GT. 0. If NDER=0, WORK does not need to be a dimensioned
  63. C variable.
  64. C
  65. C***REFERENCES L. F. Shampine, S. M. Davenport and R. E. Huddleston,
  66. C Curve fitting by polynomials in one variable, Report
  67. C SLA-74-0270, Sandia Laboratories, June 1974.
  68. C***ROUTINES CALLED (NONE)
  69. C***REVISION HISTORY (YYMMDD)
  70. C 740601 DATE WRITTEN
  71. C 890531 Changed all specific intrinsics to generic. (WRB)
  72. C 891006 Cosmetic changes to prologue. (WRB)
  73. C 891006 REVISION DATE from Version 3.2
  74. C 891214 Prologue converted to Version 4.0 format. (BAB)
  75. C 920501 Reformatted the REFERENCES section. (WRB)
  76. C***END PROLOGUE DPOLVL
  77. INTEGER I,IERR,IM1,IZERO,K,KM1,KM1PI,KM2PN,KM2PNI,M,MM,N,NDR,NDER,
  78. * NMKP1,NPKM1
  79. DOUBLE PRECISION C(*),FAC,PIONE,PITWO,PONE,PTWO,X(*),XK,XX,
  80. * YFIT,YP(*),WORK(*)
  81. C***FIRST EXECUTABLE STATEMENT DPOLVL
  82. IERR=1
  83. IF (NDER.GT.0) GO TO 10020
  84. C
  85. C ***** CODING FOR THE CASE NDER = 0
  86. C
  87. PIONE=1.0D0
  88. PONE=C(1)
  89. YFIT=PONE
  90. IF (N.EQ.1) RETURN
  91. DO 10010 K=2,N
  92. PITWO=(XX-X(K-1))*PIONE
  93. PIONE=PITWO
  94. PTWO=PONE+PITWO*C(K)
  95. PONE=PTWO
  96. 10010 CONTINUE
  97. YFIT=PTWO
  98. RETURN
  99. C
  100. C ***** END OF NDER = 0 CASE
  101. C
  102. 10020 CONTINUE
  103. IF (N.GT.1) GO TO 10040
  104. YFIT=C(1)
  105. C
  106. C ***** CODING FOR THE CASE N=1 AND NDER .GT. 0
  107. C
  108. DO 10030 K=1,NDER
  109. YP(K)=0.0D0
  110. 10030 CONTINUE
  111. RETURN
  112. C
  113. C ***** END OF THE CASE N = 1 AND NDER .GT. 0
  114. C
  115. 10040 CONTINUE
  116. IF (NDER.LT.N) GO TO 10050
  117. C
  118. C ***** SET FLAGS FOR NUMBER OF DERIVATIVES AND FOR DERIVATIVES
  119. C IN EXCESS OF THE DEGREE (N-1) OF THE POLYNOMIAL.
  120. C
  121. IZERO=1
  122. NDR=N-1
  123. GO TO 10060
  124. 10050 CONTINUE
  125. IZERO=0
  126. NDR=NDER
  127. 10060 CONTINUE
  128. M=NDR+1
  129. MM=M
  130. C
  131. C ***** START OF THE CASE NDER .GT. 0 AND N .GT. 1
  132. C ***** THE POLYNOMIAL AND ITS DERIVATIVES WILL BE EVALUATED AT XX
  133. C
  134. DO 10070 K=1,NDR
  135. YP(K)=C(K+1)
  136. 10070 CONTINUE
  137. C
  138. C ***** THE FOLLOWING SECTION OF CODE IS EASIER TO READ IF ONE
  139. C BREAKS WORK INTO TWO ARRAYS W AND V. THE CODE WOULD THEN
  140. C READ
  141. C W(1) = 1.
  142. C PONE = C(1)
  143. C *DO K = 2,N
  144. C * V(K-1) = XX - X(K-1)
  145. C * W(K) = V(K-1)*W(K-1)
  146. C * PTWO = PONE + W(K)*C(K)
  147. C * PONE = PWO
  148. C
  149. C YFIT = PTWO
  150. C
  151. WORK(1)=1.0D0
  152. PONE=C(1)
  153. DO 10080 K=2,N
  154. KM1=K-1
  155. NPKM1=N+K-1
  156. WORK(NPKM1)=XX-X(KM1)
  157. WORK(K)=WORK(NPKM1)*WORK(KM1)
  158. PTWO=PONE+WORK(K)*C(K)
  159. PONE=PTWO
  160. 10080 CONTINUE
  161. YFIT=PTWO
  162. C
  163. C ** AT THIS POINT THE POLYNOMIAL HAS BEEN EVALUATED AND INFORMATION
  164. C FOR THE DERIVATIVE EVALUATIONS HAVE BEEN STORED IN THE ARRAY
  165. C WORK
  166. IF (N.EQ.2) GO TO 10110
  167. IF (M.EQ.N) MM=NDR
  168. C
  169. C ***** EVALUATE THE DERIVATIVES AT XX
  170. C
  171. C ****** DO K=2,MM (FOR MOST CASES, MM = NDER + 1)
  172. C * ****** DO I=2,N-K+1
  173. C * * W(I) = V(K-2+I)*W(I-1) + W(I)
  174. C * * YP(K-1) = YP(K-1) + W(I)*C(K-1+I)
  175. C ****** CONTINUE
  176. C
  177. DO 10090 K=2,MM
  178. NMKP1=N-K+1
  179. KM1=K-1
  180. KM2PN=K-2+N
  181. DO 10090 I=2,NMKP1
  182. KM2PNI=KM2PN+I
  183. IM1=I-1
  184. KM1PI=KM1+I
  185. WORK(I)=WORK(KM2PNI)*WORK(IM1)+WORK(I)
  186. YP(KM1)=YP(KM1)+WORK(I)*C(KM1PI)
  187. 10090 CONTINUE
  188. IF (NDR.EQ.1) GO TO 10110
  189. FAC=1.0D0
  190. DO 10100 K=2,NDR
  191. XK=K
  192. FAC=XK*FAC
  193. YP(K)=FAC*YP(K)
  194. 10100 CONTINUE
  195. C
  196. C ***** END OF DERIVATIVE EVALUATIONS
  197. C
  198. 10110 CONTINUE
  199. IF (IZERO.EQ.0) RETURN
  200. C
  201. C ***** SET EXCESS DERIVATIVES TO ZERO.
  202. C
  203. DO 10120 K=N,NDER
  204. YP(K)=0.0D0
  205. 10120 CONTINUE
  206. RETURN
  207. END