ddcor.f 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. *DECK DDCOR
  2. SUBROUTINE DDCOR (DFDY, EL, FA, H, IERROR, IMPL, IPVT, MATDIM,
  3. 8 MITER, ML, MU, N, NDE, NQ, T, USERS, Y, YH, YWT, EVALFA, SAVE1,
  4. 8 SAVE2, A, D, JSTATE)
  5. C***BEGIN PROLOGUE DDCOR
  6. C***SUBSIDIARY
  7. C***PURPOSE Subroutine DDCOR computes corrections to the Y array.
  8. C***LIBRARY SLATEC (SDRIVE)
  9. C***TYPE DOUBLE PRECISION (SDCOR-S, DDCOR-D, CDCOR-C)
  10. C***AUTHOR Kahaner, D. K., (NIST)
  11. C National Institute of Standards and Technology
  12. C Gaithersburg, MD 20899
  13. C Sutherland, C. D., (LANL)
  14. C Mail Stop D466
  15. C Los Alamos National Laboratory
  16. C Los Alamos, NM 87545
  17. C***DESCRIPTION
  18. C
  19. C In the case of functional iteration, update Y directly from the
  20. C result of the last call to F.
  21. C In the case of the chord method, compute the corrector error and
  22. C solve the linear system with that as right hand side and DFDY as
  23. C coefficient matrix, using the LU decomposition if MITER is 1, 2, 4,
  24. C or 5.
  25. C
  26. C***ROUTINES CALLED DGBSL, DGESL, DNRM2
  27. C***REVISION HISTORY (YYMMDD)
  28. C 790601 DATE WRITTEN
  29. C 900329 Initial submission to SLATEC.
  30. C***END PROLOGUE DDCOR
  31. INTEGER I, IERROR, IFLAG, IMPL, J, JSTATE, MATDIM, MITER, ML, MU,
  32. 8 MW, N, NDE, NQ
  33. DOUBLE PRECISION A(MATDIM,*), D, DFDY(MATDIM,*), EL(13,12), H,
  34. 8 SAVE1(*), SAVE2(*), DNRM2, T, Y(*), YH(N,*), YWT(*)
  35. INTEGER IPVT(*)
  36. LOGICAL EVALFA
  37. C***FIRST EXECUTABLE STATEMENT DDCOR
  38. IF (MITER .EQ. 0) THEN
  39. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  40. DO 100 I = 1,N
  41. 100 SAVE1(I) = (H*SAVE2(I) - YH(I,2) - SAVE1(I))/YWT(I)
  42. ELSE
  43. DO 102 I = 1,N
  44. SAVE1(I) = (H*SAVE2(I) - YH(I,2) - SAVE1(I))/
  45. 8 MAX(ABS(Y(I)), YWT(I))
  46. 102 CONTINUE
  47. END IF
  48. D = DNRM2(N, SAVE1, 1)/SQRT(DBLE(N))
  49. DO 105 I = 1,N
  50. 105 SAVE1(I) = H*SAVE2(I) - YH(I,2)
  51. ELSE IF (MITER .EQ. 1 .OR. MITER .EQ. 2) THEN
  52. IF (IMPL .EQ. 0) THEN
  53. DO 130 I = 1,N
  54. 130 SAVE2(I) = H*SAVE2(I) - YH(I,2) - SAVE1(I)
  55. ELSE IF (IMPL .EQ. 1) THEN
  56. IF (EVALFA) THEN
  57. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  58. IF (N .EQ. 0) THEN
  59. JSTATE = 9
  60. RETURN
  61. END IF
  62. ELSE
  63. EVALFA = .TRUE.
  64. END IF
  65. DO 150 I = 1,N
  66. 150 SAVE2(I) = H*SAVE2(I)
  67. DO 160 J = 1,N
  68. DO 160 I = 1,N
  69. 160 SAVE2(I) = SAVE2(I) - A(I,J)*(YH(J,2) + SAVE1(J))
  70. ELSE IF (IMPL .EQ. 2) THEN
  71. IF (EVALFA) THEN
  72. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  73. IF (N .EQ. 0) THEN
  74. JSTATE = 9
  75. RETURN
  76. END IF
  77. ELSE
  78. EVALFA = .TRUE.
  79. END IF
  80. DO 180 I = 1,N
  81. 180 SAVE2(I) = H*SAVE2(I) - A(I,1)*(YH(I,2) + SAVE1(I))
  82. ELSE IF (IMPL .EQ. 3) THEN
  83. IF (EVALFA) THEN
  84. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  85. IF (N .EQ. 0) THEN
  86. JSTATE = 9
  87. RETURN
  88. END IF
  89. ELSE
  90. EVALFA = .TRUE.
  91. END IF
  92. DO 140 I = 1,N
  93. 140 SAVE2(I) = H*SAVE2(I)
  94. DO 170 J = 1,NDE
  95. DO 170 I = 1,NDE
  96. 170 SAVE2(I) = SAVE2(I) - A(I,J)*(YH(J,2) + SAVE1(J))
  97. END IF
  98. CALL DGESL (DFDY, MATDIM, N, IPVT, SAVE2, 0)
  99. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  100. DO 200 I = 1,N
  101. SAVE1(I) = SAVE1(I) + SAVE2(I)
  102. 200 SAVE2(I) = SAVE2(I)/YWT(I)
  103. ELSE
  104. DO 205 I = 1,N
  105. SAVE1(I) = SAVE1(I) + SAVE2(I)
  106. 205 SAVE2(I) = SAVE2(I)/MAX(ABS(Y(I)), YWT(I))
  107. END IF
  108. D = DNRM2(N, SAVE2, 1)/SQRT(DBLE(N))
  109. ELSE IF (MITER .EQ. 4 .OR. MITER .EQ. 5) THEN
  110. IF (IMPL .EQ. 0) THEN
  111. DO 230 I = 1,N
  112. 230 SAVE2(I) = H*SAVE2(I) - YH(I,2) - SAVE1(I)
  113. ELSE IF (IMPL .EQ. 1) THEN
  114. IF (EVALFA) THEN
  115. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  116. IF (N .EQ. 0) THEN
  117. JSTATE = 9
  118. RETURN
  119. END IF
  120. ELSE
  121. EVALFA = .TRUE.
  122. END IF
  123. DO 250 I = 1,N
  124. 250 SAVE2(I) = H*SAVE2(I)
  125. MW = ML + 1 + MU
  126. DO 260 J = 1,N
  127. DO 260 I = MAX(ML+1, MW+1-J), MIN(MW+N-J, MW+ML)
  128. SAVE2(I+J-MW) = SAVE2(I+J-MW)
  129. 8 - A(I,J)*(YH(J,2) + SAVE1(J))
  130. 260 CONTINUE
  131. ELSE IF (IMPL .EQ. 2) THEN
  132. IF (EVALFA) THEN
  133. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  134. IF (N .EQ. 0) THEN
  135. JSTATE = 9
  136. RETURN
  137. END IF
  138. ELSE
  139. EVALFA = .TRUE.
  140. END IF
  141. DO 280 I = 1,N
  142. 280 SAVE2(I) = H*SAVE2(I) - A(I,1)*(YH(I,2) + SAVE1(I))
  143. ELSE IF (IMPL .EQ. 3) THEN
  144. IF (EVALFA) THEN
  145. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  146. IF (N .EQ. 0) THEN
  147. JSTATE = 9
  148. RETURN
  149. END IF
  150. ELSE
  151. EVALFA = .TRUE.
  152. END IF
  153. DO 270 I = 1,N
  154. 270 SAVE2(I) = H*SAVE2(I)
  155. MW = ML + 1 + MU
  156. DO 290 J = 1,NDE
  157. DO 290 I = MAX(ML+1, MW+1-J), MIN(MW+NDE-J, MW+ML)
  158. SAVE2(I+J-MW) = SAVE2(I+J-MW)
  159. 8 - A(I,J)*(YH(J,2) + SAVE1(J))
  160. 290 CONTINUE
  161. END IF
  162. CALL DGBSL (DFDY, MATDIM, N, ML, MU, IPVT, SAVE2, 0)
  163. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  164. DO 300 I = 1,N
  165. SAVE1(I) = SAVE1(I) + SAVE2(I)
  166. 300 SAVE2(I) = SAVE2(I)/YWT(I)
  167. ELSE
  168. DO 305 I = 1,N
  169. SAVE1(I) = SAVE1(I) + SAVE2(I)
  170. 305 SAVE2(I) = SAVE2(I)/MAX(ABS(Y(I)), YWT(I))
  171. END IF
  172. D = DNRM2(N, SAVE2, 1)/SQRT(DBLE(N))
  173. ELSE IF (MITER .EQ. 3) THEN
  174. IFLAG = 2
  175. CALL USERS (Y, YH(1,2), YWT, SAVE1, SAVE2, T, H, EL(1,NQ), IMPL,
  176. 8 N, NDE, IFLAG)
  177. IF (N .EQ. 0) THEN
  178. JSTATE = 10
  179. RETURN
  180. END IF
  181. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  182. DO 320 I = 1,N
  183. SAVE1(I) = SAVE1(I) + SAVE2(I)
  184. 320 SAVE2(I) = SAVE2(I)/YWT(I)
  185. ELSE
  186. DO 325 I = 1,N
  187. SAVE1(I) = SAVE1(I) + SAVE2(I)
  188. 325 SAVE2(I) = SAVE2(I)/MAX(ABS(Y(I)), YWT(I))
  189. END IF
  190. D = DNRM2(N, SAVE2, 1)/SQRT(DBLE(N))
  191. END IF
  192. RETURN
  193. END