ddpst.f 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. *DECK DDPST
  2. SUBROUTINE DDPST (EL, F, FA, H, IMPL, JACOBN, MATDIM, MITER, ML,
  3. 8 MU, N, NDE, NQ, SAVE2, T, USERS, Y, YH, YWT, UROUND, NFE, NJE,
  4. 8 A, DFDY, FAC, IER, IPVT, SAVE1, ISWFLG, BND, JSTATE)
  5. C***BEGIN PROLOGUE DDPST
  6. C***SUBSIDIARY
  7. C***PURPOSE Subroutine DDPST evaluates the Jacobian matrix of the right
  8. C hand side of the differential equations.
  9. C***LIBRARY SLATEC (SDRIVE)
  10. C***TYPE DOUBLE PRECISION (SDPST-S, DDPST-D, CDPST-C)
  11. C***AUTHOR Kahaner, D. K., (NIST)
  12. C National Institute of Standards and Technology
  13. C Gaithersburg, MD 20899
  14. C Sutherland, C. D., (LANL)
  15. C Mail Stop D466
  16. C Los Alamos National Laboratory
  17. C Los Alamos, NM 87545
  18. C***DESCRIPTION
  19. C
  20. C If MITER is 1, 2, 4, or 5, the matrix
  21. C P = I - L(0)*H*Jacobian is stored in DFDY and subjected to LU
  22. C decomposition, with the results also stored in DFDY.
  23. C
  24. C***ROUTINES CALLED DGBFA, DGEFA, DNRM2
  25. C***REVISION HISTORY (YYMMDD)
  26. C 790601 DATE WRITTEN
  27. C 900329 Initial submission to SLATEC.
  28. C***END PROLOGUE DDPST
  29. INTEGER I, IFLAG, IMAX, IMPL, INFO, ISWFLG, J, J2, JSTATE, K,
  30. 8 MATDIM, MITER, ML, MU, MW, N, NDE, NFE, NJE, NQ
  31. DOUBLE PRECISION A(MATDIM,*), BL, BND, BP, BR, BU, DFDY(MATDIM,*),
  32. 8 DFDYMX, DIFF, DY, EL(13,12), FAC(*), FACMAX, FACMIN, FACTOR,
  33. 8 H, SAVE1(*), SAVE2(*), SCALE, DNRM2, T, UROUND, Y(*),
  34. 8 YH(N,*), YJ, YS, YWT(*)
  35. INTEGER IPVT(*)
  36. LOGICAL IER
  37. PARAMETER(FACMAX = .5D0, BU = 0.5D0)
  38. C***FIRST EXECUTABLE STATEMENT DDPST
  39. NJE = NJE + 1
  40. IER = .FALSE.
  41. IF (MITER .EQ. 1 .OR. MITER .EQ. 2) THEN
  42. IF (MITER .EQ. 1) THEN
  43. CALL JACOBN (N, T, Y, DFDY, MATDIM, ML, MU)
  44. IF (N .EQ. 0) THEN
  45. JSTATE = 8
  46. RETURN
  47. END IF
  48. IF (ISWFLG .EQ. 3) BND = DNRM2(N*N, DFDY, 1)
  49. FACTOR = -EL(1,NQ)*H
  50. DO 110 J = 1,N
  51. DO 110 I = 1,N
  52. 110 DFDY(I,J) = FACTOR*DFDY(I,J)
  53. ELSE IF (MITER .EQ. 2) THEN
  54. BR = UROUND**(.875D0)
  55. BL = UROUND**(.75D0)
  56. BP = UROUND**(-.15D0)
  57. FACMIN = UROUND**(.78D0)
  58. DO 170 J = 1,N
  59. YS = MAX(ABS(YWT(J)), ABS(Y(J)))
  60. 120 DY = FAC(J)*YS
  61. IF (DY .EQ. 0.D0) THEN
  62. IF (FAC(J) .LT. FACMAX) THEN
  63. FAC(J) = MIN(100.D0*FAC(J), FACMAX)
  64. GO TO 120
  65. ELSE
  66. DY = YS
  67. END IF
  68. END IF
  69. IF (NQ .EQ. 1) THEN
  70. DY = SIGN(DY, SAVE2(J))
  71. ELSE
  72. DY = SIGN(DY, YH(J,3))
  73. END IF
  74. DY = (Y(J) + DY) - Y(J)
  75. YJ = Y(J)
  76. Y(J) = Y(J) + DY
  77. CALL F (N, T, Y, SAVE1)
  78. IF (N .EQ. 0) THEN
  79. JSTATE = 6
  80. RETURN
  81. END IF
  82. Y(J) = YJ
  83. FACTOR = -EL(1,NQ)*H/DY
  84. DO 140 I = 1,N
  85. 140 DFDY(I,J) = (SAVE1(I) - SAVE2(I))*FACTOR
  86. C Step 1
  87. DIFF = ABS(SAVE2(1) - SAVE1(1))
  88. IMAX = 1
  89. DO 150 I = 2,N
  90. IF (ABS(SAVE2(I) - SAVE1(I)) .GT. DIFF) THEN
  91. IMAX = I
  92. DIFF = ABS(SAVE2(I) - SAVE1(I))
  93. END IF
  94. 150 CONTINUE
  95. C Step 2
  96. IF (MIN(ABS(SAVE2(IMAX)), ABS(SAVE1(IMAX))) .GT. 0.D0) THEN
  97. SCALE = MAX(ABS(SAVE2(IMAX)), ABS(SAVE1(IMAX)))
  98. C Step 3
  99. IF (DIFF .GT. BU*SCALE) THEN
  100. FAC(J) = MAX(FACMIN, FAC(J)*.5D0)
  101. ELSE IF (BR*SCALE .LE. DIFF .AND. DIFF .LE. BL*SCALE) THEN
  102. FAC(J) = MIN(FAC(J)*2.D0, FACMAX)
  103. C Step 4
  104. ELSE IF (DIFF .LT. BR*SCALE) THEN
  105. FAC(J) = MIN(BP*FAC(J), FACMAX)
  106. END IF
  107. END IF
  108. 170 CONTINUE
  109. IF (ISWFLG .EQ. 3) BND = DNRM2(N*N, DFDY, 1)/(-EL(1,NQ)*H)
  110. NFE = NFE + N
  111. END IF
  112. IF (IMPL .EQ. 0) THEN
  113. DO 190 I = 1,N
  114. 190 DFDY(I,I) = DFDY(I,I) + 1.D0
  115. ELSE IF (IMPL .EQ. 1) THEN
  116. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  117. IF (N .EQ. 0) THEN
  118. JSTATE = 9
  119. RETURN
  120. END IF
  121. DO 210 J = 1,N
  122. DO 210 I = 1,N
  123. 210 DFDY(I,J) = DFDY(I,J) + A(I,J)
  124. ELSE IF (IMPL .EQ. 2) THEN
  125. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  126. IF (N .EQ. 0) THEN
  127. JSTATE = 9
  128. RETURN
  129. END IF
  130. DO 230 I = 1,NDE
  131. 230 DFDY(I,I) = DFDY(I,I) + A(I,1)
  132. ELSE IF (IMPL .EQ. 3) 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. DO 220 J = 1,NDE
  139. DO 220 I = 1,NDE
  140. 220 DFDY(I,J) = DFDY(I,J) + A(I,J)
  141. END IF
  142. CALL DGEFA (DFDY, MATDIM, N, IPVT, INFO)
  143. IF (INFO .NE. 0) IER = .TRUE.
  144. ELSE IF (MITER .EQ. 4 .OR. MITER .EQ. 5) THEN
  145. IF (MITER .EQ. 4) THEN
  146. CALL JACOBN (N, T, Y, DFDY(ML+1,1), MATDIM, ML, MU)
  147. IF (N .EQ. 0) THEN
  148. JSTATE = 8
  149. RETURN
  150. END IF
  151. FACTOR = -EL(1,NQ)*H
  152. MW = ML + MU + 1
  153. DO 260 J = 1,N
  154. DO 260 I = MAX(ML+1, MW+1-J), MIN(MW+N-J, MW+ML)
  155. 260 DFDY(I,J) = FACTOR*DFDY(I,J)
  156. ELSE IF (MITER .EQ. 5) THEN
  157. BR = UROUND**(.875D0)
  158. BL = UROUND**(.75D0)
  159. BP = UROUND**(-.15D0)
  160. FACMIN = UROUND**(.78D0)
  161. MW = ML + MU + 1
  162. J2 = MIN(MW, N)
  163. DO 340 J = 1,J2
  164. DO 290 K = J,N,MW
  165. YS = MAX(ABS(YWT(K)), ABS(Y(K)))
  166. 280 DY = FAC(K)*YS
  167. IF (DY .EQ. 0.D0) THEN
  168. IF (FAC(K) .LT. FACMAX) THEN
  169. FAC(K) = MIN(100.D0*FAC(K), FACMAX)
  170. GO TO 280
  171. ELSE
  172. DY = YS
  173. END IF
  174. END IF
  175. IF (NQ .EQ. 1) THEN
  176. DY = SIGN(DY, SAVE2(K))
  177. ELSE
  178. DY = SIGN(DY, YH(K,3))
  179. END IF
  180. DY = (Y(K) + DY) - Y(K)
  181. DFDY(MW,K) = Y(K)
  182. 290 Y(K) = Y(K) + DY
  183. CALL F (N, T, Y, SAVE1)
  184. IF (N .EQ. 0) THEN
  185. JSTATE = 6
  186. RETURN
  187. END IF
  188. DO 330 K = J,N,MW
  189. Y(K) = DFDY(MW,K)
  190. YS = MAX(ABS(YWT(K)), ABS(Y(K)))
  191. DY = FAC(K)*YS
  192. IF (DY .EQ. 0.D0) DY = YS
  193. IF (NQ .EQ. 1) THEN
  194. DY = SIGN(DY, SAVE2(K))
  195. ELSE
  196. DY = SIGN(DY, YH(K,3))
  197. END IF
  198. DY = (Y(K) + DY) - Y(K)
  199. FACTOR = -EL(1,NQ)*H/DY
  200. DO 300 I = MAX(ML+1, MW+1-K), MIN(MW+N-K, MW+ML)
  201. 300 DFDY(I,K) = FACTOR*(SAVE1(I+K-MW) - SAVE2(I+K-MW))
  202. C Step 1
  203. IMAX = MAX(1, K - MU)
  204. DIFF = ABS(SAVE2(IMAX) - SAVE1(IMAX))
  205. DO 310 I = MAX(1, K - MU)+1, MIN(K + ML, N)
  206. IF (ABS(SAVE2(I) - SAVE1(I)) .GT. DIFF) THEN
  207. IMAX = I
  208. DIFF = ABS(SAVE2(I) - SAVE1(I))
  209. END IF
  210. 310 CONTINUE
  211. C Step 2
  212. IF (MIN(ABS(SAVE2(IMAX)), ABS(SAVE1(IMAX))) .GT.0.D0) THEN
  213. SCALE = MAX(ABS(SAVE2(IMAX)), ABS(SAVE1(IMAX)))
  214. C Step 3
  215. IF (DIFF .GT. BU*SCALE) THEN
  216. FAC(J) = MAX(FACMIN, FAC(J)*.5D0)
  217. ELSE IF (BR*SCALE .LE.DIFF .AND. DIFF .LE.BL*SCALE) THEN
  218. FAC(J) = MIN(FAC(J)*2.D0, FACMAX)
  219. C Step 4
  220. ELSE IF (DIFF .LT. BR*SCALE) THEN
  221. FAC(K) = MIN(BP*FAC(K), FACMAX)
  222. END IF
  223. END IF
  224. 330 CONTINUE
  225. 340 CONTINUE
  226. NFE = NFE + J2
  227. END IF
  228. IF (ISWFLG .EQ. 3) THEN
  229. DFDYMX = 0.D0
  230. DO 345 J = 1,N
  231. DO 345 I = MAX(ML+1, MW+1-J), MIN(MW+N-J, MW+ML)
  232. 345 DFDYMX = MAX(DFDYMX, ABS(DFDY(I,J)))
  233. BND = 0.D0
  234. IF (DFDYMX .NE. 0.D0) THEN
  235. DO 350 J = 1,N
  236. DO 350 I = MAX(ML+1, MW+1-J), MIN(MW+N-J, MW+ML)
  237. 350 BND = BND + (DFDY(I,J)/DFDYMX)**2
  238. BND = DFDYMX*SQRT(BND)/(-EL(1,NQ)*H)
  239. END IF
  240. END IF
  241. IF (IMPL .EQ. 0) THEN
  242. DO 360 J = 1,N
  243. 360 DFDY(MW,J) = DFDY(MW,J) + 1.D0
  244. ELSE IF (IMPL .EQ. 1) THEN
  245. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  246. IF (N .EQ. 0) THEN
  247. JSTATE = 9
  248. RETURN
  249. END IF
  250. DO 380 J = 1,N
  251. DO 380 I = MAX(ML+1, MW+1-J), MIN(MW+N-J, MW+ML)
  252. 380 DFDY(I,J) = DFDY(I,J) + A(I,J)
  253. ELSE IF (IMPL .EQ. 2) THEN
  254. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  255. IF (N .EQ. 0) THEN
  256. JSTATE = 9
  257. RETURN
  258. END IF
  259. DO 400 J = 1,NDE
  260. 400 DFDY(MW,J) = DFDY(MW,J) + A(J,1)
  261. ELSE IF (IMPL .EQ. 3) THEN
  262. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  263. IF (N .EQ. 0) THEN
  264. JSTATE = 9
  265. RETURN
  266. END IF
  267. DO 390 J = 1,NDE
  268. DO 390 I = MAX(ML+1, MW+1-J), MIN(MW+NDE-J, MW+ML)
  269. 390 DFDY(I,J) = DFDY(I,J) + A(I,J)
  270. END IF
  271. CALL DGBFA (DFDY, MATDIM, N, ML, MU, IPVT, INFO)
  272. IF (INFO .NE. 0) IER = .TRUE.
  273. ELSE IF (MITER .EQ. 3) THEN
  274. IFLAG = 1
  275. CALL USERS (Y, YH(1,2), YWT, SAVE1, SAVE2, T, H, EL(1,NQ), IMPL,
  276. 8 N, NDE, IFLAG)
  277. IF (IFLAG .EQ. -1) THEN
  278. IER = .TRUE.
  279. RETURN
  280. END IF
  281. IF (N .EQ. 0) THEN
  282. JSTATE = 10
  283. RETURN
  284. END IF
  285. END IF
  286. RETURN
  287. END