cdcor.f 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. *DECK CDCOR
  2. SUBROUTINE CDCOR (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 CDCOR
  6. C***SUBSIDIARY
  7. C***PURPOSE Subroutine CDCOR computes corrections to the Y array.
  8. C***LIBRARY SLATEC (SDRIVE)
  9. C***TYPE COMPLEX (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 CGBSL, CGESL, SCNRM2
  27. C***REVISION HISTORY (YYMMDD)
  28. C 790601 DATE WRITTEN
  29. C 900329 Initial submission to SLATEC.
  30. C***END PROLOGUE CDCOR
  31. INTEGER I, IERROR, IFLAG, IMPL, J, JSTATE, MATDIM, MITER, ML, MU,
  32. 8 MW, N, NDE, NQ
  33. COMPLEX A(MATDIM,*), DFDY(MATDIM,*), SAVE1(*), SAVE2(*), Y(*),
  34. 8 YH(N,*), YWT(*)
  35. REAL D, EL(13,12), H, SCNRM2, T
  36. INTEGER IPVT(*)
  37. LOGICAL EVALFA
  38. C***FIRST EXECUTABLE STATEMENT CDCOR
  39. IF (MITER .EQ. 0) THEN
  40. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  41. DO 100 I = 1,N
  42. 100 SAVE1(I) = (H*SAVE2(I) - YH(I,2) - SAVE1(I))/YWT(I)
  43. ELSE
  44. DO 102 I = 1,N
  45. SAVE1(I) = (H*SAVE2(I) - YH(I,2) - SAVE1(I))/
  46. 8 MAX(ABS(Y(I)), ABS(YWT(I)))
  47. 102 CONTINUE
  48. END IF
  49. D = SCNRM2(N, SAVE1, 1)/SQRT(REAL(N))
  50. DO 105 I = 1,N
  51. 105 SAVE1(I) = H*SAVE2(I) - YH(I,2)
  52. ELSE IF (MITER .EQ. 1 .OR. MITER .EQ. 2) THEN
  53. IF (IMPL .EQ. 0) THEN
  54. DO 130 I = 1,N
  55. 130 SAVE2(I) = H*SAVE2(I) - YH(I,2) - SAVE1(I)
  56. ELSE IF (IMPL .EQ. 1) THEN
  57. IF (EVALFA) THEN
  58. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  59. IF (N .EQ. 0) THEN
  60. JSTATE = 9
  61. RETURN
  62. END IF
  63. ELSE
  64. EVALFA = .TRUE.
  65. END IF
  66. DO 150 I = 1,N
  67. 150 SAVE2(I) = H*SAVE2(I)
  68. DO 160 J = 1,N
  69. DO 160 I = 1,N
  70. 160 SAVE2(I) = SAVE2(I) - A(I,J)*(YH(J,2) + SAVE1(J))
  71. ELSE IF (IMPL .EQ. 2) THEN
  72. IF (EVALFA) THEN
  73. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  74. IF (N .EQ. 0) THEN
  75. JSTATE = 9
  76. RETURN
  77. END IF
  78. ELSE
  79. EVALFA = .TRUE.
  80. END IF
  81. DO 180 I = 1,N
  82. 180 SAVE2(I) = H*SAVE2(I) - A(I,1)*(YH(I,2) + SAVE1(I))
  83. ELSE IF (IMPL .EQ. 3) THEN
  84. IF (EVALFA) THEN
  85. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  86. IF (N .EQ. 0) THEN
  87. JSTATE = 9
  88. RETURN
  89. END IF
  90. ELSE
  91. EVALFA = .TRUE.
  92. END IF
  93. DO 140 I = 1,N
  94. 140 SAVE2(I) = H*SAVE2(I)
  95. DO 170 J = 1,NDE
  96. DO 170 I = 1,NDE
  97. 170 SAVE2(I) = SAVE2(I) - A(I,J)*(YH(J,2) + SAVE1(J))
  98. END IF
  99. CALL CGESL (DFDY, MATDIM, N, IPVT, SAVE2, 0)
  100. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  101. DO 200 I = 1,N
  102. SAVE1(I) = SAVE1(I) + SAVE2(I)
  103. 200 SAVE2(I) = SAVE2(I)/YWT(I)
  104. ELSE
  105. DO 205 I = 1,N
  106. SAVE1(I) = SAVE1(I) + SAVE2(I)
  107. 205 SAVE2(I) = SAVE2(I)/MAX(ABS(Y(I)), ABS(YWT(I)))
  108. END IF
  109. D = SCNRM2(N, SAVE2, 1)/SQRT(REAL(N))
  110. ELSE IF (MITER .EQ. 4 .OR. MITER .EQ. 5) THEN
  111. IF (IMPL .EQ. 0) THEN
  112. DO 230 I = 1,N
  113. 230 SAVE2(I) = H*SAVE2(I) - YH(I,2) - SAVE1(I)
  114. ELSE IF (IMPL .EQ. 1) THEN
  115. IF (EVALFA) THEN
  116. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  117. IF (N .EQ. 0) THEN
  118. JSTATE = 9
  119. RETURN
  120. END IF
  121. ELSE
  122. EVALFA = .TRUE.
  123. END IF
  124. DO 250 I = 1,N
  125. 250 SAVE2(I) = H*SAVE2(I)
  126. MW = ML + 1 + MU
  127. DO 260 J = 1,N
  128. DO 260 I = MAX(ML+1, MW+1-J), MIN(MW+N-J, MW+ML)
  129. SAVE2(I+J-MW) = SAVE2(I+J-MW)
  130. 8 - A(I,J)*(YH(J,2) + SAVE1(J))
  131. 260 CONTINUE
  132. ELSE IF (IMPL .EQ. 2) THEN
  133. IF (EVALFA) THEN
  134. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  135. IF (N .EQ. 0) THEN
  136. JSTATE = 9
  137. RETURN
  138. END IF
  139. ELSE
  140. EVALFA = .TRUE.
  141. END IF
  142. DO 280 I = 1,N
  143. 280 SAVE2(I) = H*SAVE2(I) - A(I,1)*(YH(I,2) + SAVE1(I))
  144. ELSE IF (IMPL .EQ. 3) THEN
  145. IF (EVALFA) THEN
  146. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  147. IF (N .EQ. 0) THEN
  148. JSTATE = 9
  149. RETURN
  150. END IF
  151. ELSE
  152. EVALFA = .TRUE.
  153. END IF
  154. DO 270 I = 1,N
  155. 270 SAVE2(I) = H*SAVE2(I)
  156. MW = ML + 1 + MU
  157. DO 290 J = 1,NDE
  158. DO 290 I = MAX(ML+1, MW+1-J), MIN(MW+NDE-J, MW+ML)
  159. SAVE2(I+J-MW) = SAVE2(I+J-MW)
  160. 8 - A(I,J)*(YH(J,2) + SAVE1(J))
  161. 290 CONTINUE
  162. END IF
  163. CALL CGBSL (DFDY, MATDIM, N, ML, MU, IPVT, SAVE2, 0)
  164. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  165. DO 300 I = 1,N
  166. SAVE1(I) = SAVE1(I) + SAVE2(I)
  167. 300 SAVE2(I) = SAVE2(I)/YWT(I)
  168. ELSE
  169. DO 305 I = 1,N
  170. SAVE1(I) = SAVE1(I) + SAVE2(I)
  171. 305 SAVE2(I) = SAVE2(I)/MAX(ABS(Y(I)), ABS(YWT(I)))
  172. END IF
  173. D = SCNRM2(N, SAVE2, 1)/SQRT(REAL(N))
  174. ELSE IF (MITER .EQ. 3) THEN
  175. IFLAG = 2
  176. CALL USERS (Y, YH(1,2), YWT, SAVE1, SAVE2, T, H, EL(1,NQ), IMPL,
  177. 8 N, NDE, IFLAG)
  178. IF (N .EQ. 0) THEN
  179. JSTATE = 10
  180. RETURN
  181. END IF
  182. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  183. DO 320 I = 1,N
  184. SAVE1(I) = SAVE1(I) + SAVE2(I)
  185. 320 SAVE2(I) = SAVE2(I)/YWT(I)
  186. ELSE
  187. DO 325 I = 1,N
  188. SAVE1(I) = SAVE1(I) + SAVE2(I)
  189. 325 SAVE2(I) = SAVE2(I)/MAX(ABS(Y(I)), ABS(YWT(I)))
  190. END IF
  191. D = SCNRM2(N, SAVE2, 1)/SQRT(REAL(N))
  192. END IF
  193. RETURN
  194. END