sdcor.f 6.3 KB

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