cdpst.f 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. *DECK CDPST
  2. SUBROUTINE CDPST (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 CDPST
  6. C***SUBSIDIARY
  7. C***PURPOSE Subroutine CDPST evaluates the Jacobian matrix of the right
  8. C hand side of the differential equations.
  9. C***LIBRARY SLATEC (SDRIVE)
  10. C***TYPE COMPLEX (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 CGBFA, CGEFA, SCNRM2
  25. C***REVISION HISTORY (YYMMDD)
  26. C 790601 DATE WRITTEN
  27. C 900329 Initial submission to SLATEC.
  28. C***END PROLOGUE CDPST
  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. COMPLEX A(MATDIM,*), CFCTR, DFDY(MATDIM,*), DY, FAC(*), SAVE1(*),
  32. 8 SAVE2(*), Y(*), YH(N,*), YJ, YS, YWT(*)
  33. REAL BL, BND, BP, BR, BU, DFDYMX, DIFF, EL(13,12), FACMAX, FACMIN,
  34. 8 FACTOR, H, SCALE, SCNRM2, T, UROUND, ZMAX, ZMIN
  35. INTEGER IPVT(*)
  36. LOGICAL IER
  37. PARAMETER(FACMAX = .5E0, BU = 0.5E0)
  38. C***FIRST EXECUTABLE STATEMENT CDPST
  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 = SCNRM2(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**(.875E0)
  55. BL = UROUND**(.75E0)
  56. BP = UROUND**(-.15E0)
  57. FACMIN = UROUND**(.78E0)
  58. DO 170 J = 1,N
  59. IF (ABS(Y(J)) .GT. ABS(YWT(J))) THEN
  60. YS = Y(J)
  61. ELSE
  62. YS = YWT(J)
  63. END IF
  64. 120 DY = FAC(J)*YS
  65. IF (DY .EQ. 0.E0) THEN
  66. IF (REAL(FAC(J)) .LT. FACMAX) THEN
  67. FAC(J) = MIN(100.E0*REAL(FAC(J)), FACMAX)
  68. GO TO 120
  69. ELSE
  70. DY = YS
  71. END IF
  72. END IF
  73. DY = (Y(J) + DY) - Y(J)
  74. YJ = Y(J)
  75. Y(J) = Y(J) + DY
  76. CALL F (N, T, Y, SAVE1)
  77. IF (N .EQ. 0) THEN
  78. JSTATE = 6
  79. RETURN
  80. END IF
  81. Y(J) = YJ
  82. CFCTR = -EL(1,NQ)*H/DY
  83. DO 140 I = 1,N
  84. 140 DFDY(I,J) = (SAVE1(I) - SAVE2(I))*CFCTR
  85. C Step 1
  86. DIFF = ABS(SAVE2(1) - SAVE1(1))
  87. IMAX = 1
  88. DO 150 I = 2,N
  89. IF (ABS(SAVE2(I) - SAVE1(I)) .GT. DIFF) THEN
  90. IMAX = I
  91. DIFF = ABS(SAVE2(I) - SAVE1(I))
  92. END IF
  93. 150 CONTINUE
  94. C Step 2
  95. IF (MIN(ABS(SAVE2(IMAX)), ABS(SAVE1(IMAX))) .GT. 0.E0) THEN
  96. SCALE = MAX(ABS(SAVE2(IMAX)), ABS(SAVE1(IMAX)))
  97. C Step 3
  98. IF (DIFF .GT. BU*SCALE) THEN
  99. FAC(J) = MAX(FACMIN, REAL(FAC(J))*.5E0)
  100. ELSE IF (BR*SCALE .LE. DIFF .AND. DIFF .LE. BL*SCALE) THEN
  101. FAC(J) = MIN(REAL(FAC(J))*2.E0, FACMAX)
  102. C Step 4
  103. ELSE IF (DIFF .LT. BR*SCALE) THEN
  104. FAC(J) = MIN(BP*REAL(FAC(J)), FACMAX)
  105. END IF
  106. END IF
  107. 170 CONTINUE
  108. IF (ISWFLG .EQ. 3) BND = SCNRM2(N*N, DFDY, 1)/(-EL(1,NQ)*H)
  109. NFE = NFE + N
  110. END IF
  111. IF (IMPL .EQ. 0) THEN
  112. DO 190 I = 1,N
  113. 190 DFDY(I,I) = DFDY(I,I) + 1.E0
  114. ELSE IF (IMPL .EQ. 1) THEN
  115. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  116. IF (N .EQ. 0) THEN
  117. JSTATE = 9
  118. RETURN
  119. END IF
  120. DO 210 J = 1,N
  121. DO 210 I = 1,N
  122. 210 DFDY(I,J) = DFDY(I,J) + A(I,J)
  123. ELSE IF (IMPL .EQ. 2) THEN
  124. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  125. IF (N .EQ. 0) THEN
  126. JSTATE = 9
  127. RETURN
  128. END IF
  129. DO 230 I = 1,NDE
  130. 230 DFDY(I,I) = DFDY(I,I) + A(I,1)
  131. ELSE IF (IMPL .EQ. 3) 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. DO 220 J = 1,NDE
  138. DO 220 I = 1,NDE
  139. 220 DFDY(I,J) = DFDY(I,J) + A(I,J)
  140. END IF
  141. CALL CGEFA (DFDY, MATDIM, N, IPVT, INFO)
  142. IF (INFO .NE. 0) IER = .TRUE.
  143. ELSE IF (MITER .EQ. 4 .OR. MITER .EQ. 5) THEN
  144. IF (MITER .EQ. 4) THEN
  145. CALL JACOBN (N, T, Y, DFDY(ML+1,1), MATDIM, ML, MU)
  146. IF (N .EQ. 0) THEN
  147. JSTATE = 8
  148. RETURN
  149. END IF
  150. FACTOR = -EL(1,NQ)*H
  151. MW = ML + MU + 1
  152. DO 260 J = 1,N
  153. DO 260 I = MAX(ML+1, MW+1-J), MIN(MW+N-J, MW+ML)
  154. 260 DFDY(I,J) = FACTOR*DFDY(I,J)
  155. ELSE IF (MITER .EQ. 5) THEN
  156. BR = UROUND**(.875E0)
  157. BL = UROUND**(.75E0)
  158. BP = UROUND**(-.15E0)
  159. FACMIN = UROUND**(.78E0)
  160. MW = ML + MU + 1
  161. J2 = MIN(MW, N)
  162. DO 340 J = 1,J2
  163. DO 290 K = J,N,MW
  164. IF (ABS(Y(K)) .GT. ABS(YWT(K))) THEN
  165. YS = Y(K)
  166. ELSE
  167. YS = YWT(K)
  168. END IF
  169. 280 DY = FAC(K)*YS
  170. IF (DY .EQ. 0.E0) THEN
  171. IF (REAL(FAC(K)) .LT. FACMAX) THEN
  172. FAC(K) = MIN(100.E0*REAL(FAC(K)), FACMAX)
  173. GO TO 280
  174. ELSE
  175. DY = YS
  176. END IF
  177. END IF
  178. DY = (Y(K) + DY) - Y(K)
  179. DFDY(MW,K) = Y(K)
  180. 290 Y(K) = Y(K) + DY
  181. CALL F (N, T, Y, SAVE1)
  182. IF (N .EQ. 0) THEN
  183. JSTATE = 6
  184. RETURN
  185. END IF
  186. DO 330 K = J,N,MW
  187. DY = Y(K) - DFDY(MW,K)
  188. Y(K) = DFDY(MW,K)
  189. CFCTR = -EL(1,NQ)*H/DY
  190. DO 300 I = MAX(ML+1, MW+1-K), MIN(MW+N-K, MW+ML)
  191. 300 DFDY(I,K) = CFCTR*(SAVE1(I+K-MW) - SAVE2(I+K-MW))
  192. C Step 1
  193. IMAX = MAX(1, K - MU)
  194. DIFF = ABS(SAVE2(IMAX) - SAVE1(IMAX))
  195. DO 310 I = MAX(1, K - MU)+1, MIN(K + ML, N)
  196. IF (ABS(SAVE2(I) - SAVE1(I)) .GT. DIFF) THEN
  197. IMAX = I
  198. DIFF = ABS(SAVE2(I) - SAVE1(I))
  199. END IF
  200. 310 CONTINUE
  201. C Step 2
  202. IF (MIN(ABS(SAVE2(IMAX)), ABS(SAVE1(IMAX))) .GT.0.E0) THEN
  203. SCALE = MAX(ABS(SAVE2(IMAX)), ABS(SAVE1(IMAX)))
  204. C Step 3
  205. IF (DIFF .GT. BU*SCALE) THEN
  206. FAC(J) = MAX(FACMIN, REAL(FAC(J))*.5E0)
  207. ELSE IF (BR*SCALE .LE.DIFF .AND. DIFF .LE.BL*SCALE) THEN
  208. FAC(J) = MIN(REAL(FAC(J))*2.E0, FACMAX)
  209. C Step 4
  210. ELSE IF (DIFF .LT. BR*SCALE) THEN
  211. FAC(K) = MIN(BP*REAL(FAC(K)), FACMAX)
  212. END IF
  213. END IF
  214. 330 CONTINUE
  215. 340 CONTINUE
  216. NFE = NFE + J2
  217. END IF
  218. IF (ISWFLG .EQ. 3) THEN
  219. DFDYMX = 0.E0
  220. DO 345 J = 1,N
  221. DO 345 I = MAX(ML+1, MW+1-J), MIN(MW+N-J, MW+ML)
  222. ZMAX = MAX(ABS(REAL(DFDY(I,J))), ABS(AIMAG(DFDY(I,J))))
  223. ZMIN = MIN(ABS(REAL(DFDY(I,J))), ABS(AIMAG(DFDY(I,J))))
  224. IF (ZMAX .NE. 0.E0)
  225. 8 DFDYMX = MAX(DFDYMX, ZMAX*SQRT(1.E0+ (ZMIN/ZMAX)**2))
  226. 345 CONTINUE
  227. BND = 0.E0
  228. IF (DFDYMX .NE. 0.E0) THEN
  229. DO 350 J = 1,N
  230. DO 350 I = MAX(ML+1, MW+1-J), MIN(MW+N-J, MW+ML)
  231. BND = BND + (REAL(DFDY(I,J))/DFDYMX)**2 +
  232. 8 (AIMAG(DFDY(I,J))/DFDYMX)**2
  233. 350 CONTINUE
  234. BND = DFDYMX*SQRT(BND)/(-EL(1,NQ)*H)
  235. END IF
  236. END IF
  237. IF (IMPL .EQ. 0) THEN
  238. DO 360 J = 1,N
  239. 360 DFDY(MW,J) = DFDY(MW,J) + 1.E0
  240. ELSE IF (IMPL .EQ. 1) THEN
  241. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  242. IF (N .EQ. 0) THEN
  243. JSTATE = 9
  244. RETURN
  245. END IF
  246. DO 380 J = 1,N
  247. DO 380 I = MAX(ML+1, MW+1-J), MIN(MW+N-J, MW+ML)
  248. 380 DFDY(I,J) = DFDY(I,J) + A(I,J)
  249. ELSE IF (IMPL .EQ. 2) THEN
  250. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  251. IF (N .EQ. 0) THEN
  252. JSTATE = 9
  253. RETURN
  254. END IF
  255. DO 400 J = 1,NDE
  256. 400 DFDY(MW,J) = DFDY(MW,J) + A(J,1)
  257. ELSE IF (IMPL .EQ. 3) THEN
  258. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  259. IF (N .EQ. 0) THEN
  260. JSTATE = 9
  261. RETURN
  262. END IF
  263. DO 390 J = 1,NDE
  264. DO 390 I = MAX(ML+1, MW+1-J), MIN(MW+NDE-J, MW+ML)
  265. 390 DFDY(I,J) = DFDY(I,J) + A(I,J)
  266. END IF
  267. CALL CGBFA (DFDY, MATDIM, N, ML, MU, IPVT, INFO)
  268. IF (INFO .NE. 0) IER = .TRUE.
  269. ELSE IF (MITER .EQ. 3) THEN
  270. IFLAG = 1
  271. CALL USERS (Y, YH(1,2), YWT, SAVE1, SAVE2, T, H, EL(1,NQ), IMPL,
  272. 8 N, NDE, IFLAG)
  273. IF (IFLAG .EQ. -1) THEN
  274. IER = .TRUE.
  275. RETURN
  276. END IF
  277. IF (N .EQ. 0) THEN
  278. JSTATE = 10
  279. RETURN
  280. END IF
  281. END IF
  282. RETURN
  283. END