dpchci.f 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. *DECK DPCHCI
  2. SUBROUTINE DPCHCI (N, H, SLOPE, D, INCFD)
  3. C***BEGIN PROLOGUE DPCHCI
  4. C***SUBSIDIARY
  5. C***PURPOSE Set interior derivatives for DPCHIC
  6. C***LIBRARY SLATEC (PCHIP)
  7. C***TYPE DOUBLE PRECISION (PCHCI-S, DPCHCI-D)
  8. C***AUTHOR Fritsch, F. N., (LLNL)
  9. C***DESCRIPTION
  10. C
  11. C DPCHCI: DPCHIC Initial Derivative Setter.
  12. C
  13. C Called by DPCHIC to set derivatives needed to determine a monotone
  14. C piecewise cubic Hermite interpolant to the data.
  15. C
  16. C Default boundary conditions are provided which are compatible
  17. C with monotonicity. If the data are only piecewise monotonic, the
  18. C interpolant will have an extremum at each point where monotonicity
  19. C switches direction.
  20. C
  21. C To facilitate two-dimensional applications, includes an increment
  22. C between successive values of the D-array.
  23. C
  24. C The resulting piecewise cubic Hermite function should be identical
  25. C (within roundoff error) to that produced by DPCHIM.
  26. C
  27. C ----------------------------------------------------------------------
  28. C
  29. C Calling sequence:
  30. C
  31. C PARAMETER (INCFD = ...)
  32. C INTEGER N
  33. C DOUBLE PRECISION H(N), SLOPE(N), D(INCFD,N)
  34. C
  35. C CALL DPCHCI (N, H, SLOPE, D, INCFD)
  36. C
  37. C Parameters:
  38. C
  39. C N -- (input) number of data points.
  40. C If N=2, simply does linear interpolation.
  41. C
  42. C H -- (input) real*8 array of interval lengths.
  43. C SLOPE -- (input) real*8 array of data slopes.
  44. C If the data are (X(I),Y(I)), I=1(1)N, then these inputs are:
  45. C H(I) = X(I+1)-X(I),
  46. C SLOPE(I) = (Y(I+1)-Y(I))/H(I), I=1(1)N-1.
  47. C
  48. C D -- (output) real*8 array of derivative values at data points.
  49. C If the data are monotonic, these values will determine a
  50. C a monotone cubic Hermite function.
  51. C The value corresponding to X(I) is stored in
  52. C D(1+(I-1)*INCFD), I=1(1)N.
  53. C No other entries in D are changed.
  54. C
  55. C INCFD -- (input) increment between successive values in D.
  56. C This argument is provided primarily for 2-D applications.
  57. C
  58. C -------
  59. C WARNING: This routine does no validity-checking of arguments.
  60. C -------
  61. C
  62. C Fortran intrinsics used: ABS, MAX, MIN.
  63. C
  64. C***SEE ALSO DPCHIC
  65. C***ROUTINES CALLED DPCHST
  66. C***REVISION HISTORY (YYMMDD)
  67. C 820218 DATE WRITTEN
  68. C 820601 Modified end conditions to be continuous functions of
  69. C data when monotonicity switches in next interval.
  70. C 820602 1. Modified formulas so end conditions are less prone
  71. C to over/underflow problems.
  72. C 2. Minor modification to HSUM calculation.
  73. C 820805 Converted to SLATEC library version.
  74. C 870813 Minor cosmetic changes.
  75. C 890411 Added SAVE statements (Vers. 3.2).
  76. C 890531 Changed all specific intrinsics to generic. (WRB)
  77. C 890831 Modified array declarations. (WRB)
  78. C 890831 REVISION DATE from Version 3.2
  79. C 891214 Prologue converted to Version 4.0 format. (BAB)
  80. C 900328 Added TYPE section. (WRB)
  81. C 910408 Updated AUTHOR section in prologue. (WRB)
  82. C 930503 Improved purpose. (FNF)
  83. C***END PROLOGUE DPCHCI
  84. C
  85. C Programming notes:
  86. C 1. The function DPCHST(ARG1,ARG2) is assumed to return zero if
  87. C either argument is zero, +1 if they are of the same sign, and
  88. C -1 if they are of opposite sign.
  89. C**End
  90. C
  91. C DECLARE ARGUMENTS.
  92. C
  93. INTEGER N, INCFD
  94. DOUBLE PRECISION H(*), SLOPE(*), D(INCFD,*)
  95. C
  96. C DECLARE LOCAL VARIABLES.
  97. C
  98. INTEGER I, NLESS1
  99. DOUBLE PRECISION DEL1, DEL2, DMAX, DMIN, DRAT1, DRAT2, HSUM,
  100. * HSUMT3, THREE, W1, W2, ZERO
  101. SAVE ZERO, THREE
  102. DOUBLE PRECISION DPCHST
  103. C
  104. C INITIALIZE.
  105. C
  106. DATA ZERO /0.D0/, THREE/3.D0/
  107. C***FIRST EXECUTABLE STATEMENT DPCHCI
  108. NLESS1 = N - 1
  109. DEL1 = SLOPE(1)
  110. C
  111. C SPECIAL CASE N=2 -- USE LINEAR INTERPOLATION.
  112. C
  113. IF (NLESS1 .GT. 1) GO TO 10
  114. D(1,1) = DEL1
  115. D(1,N) = DEL1
  116. GO TO 5000
  117. C
  118. C NORMAL CASE (N .GE. 3).
  119. C
  120. 10 CONTINUE
  121. DEL2 = SLOPE(2)
  122. C
  123. C SET D(1) VIA NON-CENTERED THREE-POINT FORMULA, ADJUSTED TO BE
  124. C SHAPE-PRESERVING.
  125. C
  126. HSUM = H(1) + H(2)
  127. W1 = (H(1) + HSUM)/HSUM
  128. W2 = -H(1)/HSUM
  129. D(1,1) = W1*DEL1 + W2*DEL2
  130. IF ( DPCHST(D(1,1),DEL1) .LE. ZERO) THEN
  131. D(1,1) = ZERO
  132. ELSE IF ( DPCHST(DEL1,DEL2) .LT. ZERO) THEN
  133. C NEED DO THIS CHECK ONLY IF MONOTONICITY SWITCHES.
  134. DMAX = THREE*DEL1
  135. IF (ABS(D(1,1)) .GT. ABS(DMAX)) D(1,1) = DMAX
  136. ENDIF
  137. C
  138. C LOOP THROUGH INTERIOR POINTS.
  139. C
  140. DO 50 I = 2, NLESS1
  141. IF (I .EQ. 2) GO TO 40
  142. C
  143. HSUM = H(I-1) + H(I)
  144. DEL1 = DEL2
  145. DEL2 = SLOPE(I)
  146. 40 CONTINUE
  147. C
  148. C SET D(I)=0 UNLESS DATA ARE STRICTLY MONOTONIC.
  149. C
  150. D(1,I) = ZERO
  151. IF ( DPCHST(DEL1,DEL2) .LE. ZERO) GO TO 50
  152. C
  153. C USE BRODLIE MODIFICATION OF BUTLAND FORMULA.
  154. C
  155. HSUMT3 = HSUM+HSUM+HSUM
  156. W1 = (HSUM + H(I-1))/HSUMT3
  157. W2 = (HSUM + H(I) )/HSUMT3
  158. DMAX = MAX( ABS(DEL1), ABS(DEL2) )
  159. DMIN = MIN( ABS(DEL1), ABS(DEL2) )
  160. DRAT1 = DEL1/DMAX
  161. DRAT2 = DEL2/DMAX
  162. D(1,I) = DMIN/(W1*DRAT1 + W2*DRAT2)
  163. C
  164. 50 CONTINUE
  165. C
  166. C SET D(N) VIA NON-CENTERED THREE-POINT FORMULA, ADJUSTED TO BE
  167. C SHAPE-PRESERVING.
  168. C
  169. W1 = -H(N-1)/HSUM
  170. W2 = (H(N-1) + HSUM)/HSUM
  171. D(1,N) = W1*DEL1 + W2*DEL2
  172. IF ( DPCHST(D(1,N),DEL2) .LE. ZERO) THEN
  173. D(1,N) = ZERO
  174. ELSE IF ( DPCHST(DEL1,DEL2) .LT. ZERO) THEN
  175. C NEED DO THIS CHECK ONLY IF MONOTONICITY SWITCHES.
  176. DMAX = THREE*DEL2
  177. IF (ABS(D(1,N)) .GT. ABS(DMAX)) D(1,N) = DMAX
  178. ENDIF
  179. C
  180. C NORMAL RETURN.
  181. C
  182. 5000 CONTINUE
  183. RETURN
  184. C------------- LAST LINE OF DPCHCI FOLLOWS -----------------------------
  185. END