cdstp.f 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. *DECK CDSTP
  2. SUBROUTINE CDSTP (EPS, F, FA, HMAX, IMPL, IERROR, JACOBN, MATDIM,
  3. 8 MAXORD, MINT, MITER, ML, MU, N, NDE, YWT, UROUND, USERS, AVGH,
  4. 8 AVGORD, H, HUSED, JTASK, MNTOLD, MTROLD, NFE, NJE, NQUSED,
  5. 8 NSTEP, T, Y, YH, A, CONVRG, DFDY, EL, FAC, HOLD, IPVT, JSTATE,
  6. 8 JSTEPL, NQ, NWAIT, RC, RMAX, SAVE1, SAVE2, TQ, TREND, ISWFLG,
  7. 8 MTRSV, MXRDSV)
  8. C***BEGIN PROLOGUE CDSTP
  9. C***SUBSIDIARY
  10. C***PURPOSE CDSTP performs one step of the integration of an initial
  11. C value problem for a system of ordinary differential
  12. C equations.
  13. C***LIBRARY SLATEC (SDRIVE)
  14. C***TYPE COMPLEX (SDSTP-S, DDSTP-D, CDSTP-C)
  15. C***AUTHOR Kahaner, D. K., (NIST)
  16. C National Institute of Standards and Technology
  17. C Gaithersburg, MD 20899
  18. C Sutherland, C. D., (LANL)
  19. C Mail Stop D466
  20. C Los Alamos National Laboratory
  21. C Los Alamos, NM 87545
  22. C***DESCRIPTION
  23. C
  24. C Communication with CDSTP is done with the following variables:
  25. C
  26. C YH An N by MAXORD+1 array containing the dependent variables
  27. C and their scaled derivatives. MAXORD, the maximum order
  28. C used, is currently 12 for the Adams methods and 5 for the
  29. C Gear methods. YH(I,J+1) contains the J-th derivative of
  30. C Y(I), scaled by H**J/factorial(J). Only Y(I),
  31. C 1 .LE. I .LE. N, need be set by the calling program on
  32. C the first entry. The YH array should not be altered by
  33. C the calling program. When referencing YH as a
  34. C 2-dimensional array, use a column length of N, as this is
  35. C the value used in CDSTP.
  36. C DFDY A block of locations used for partial derivatives if MITER
  37. C is not 0. If MITER is 1 or 2 its length must be at least
  38. C N*N. If MITER is 4 or 5 its length must be at least
  39. C (2*ML+MU+1)*N.
  40. C YWT An array of N locations used in convergence and error tests
  41. C SAVE1
  42. C SAVE2 Arrays of length N used for temporary storage.
  43. C IPVT An integer array of length N used by the linear system
  44. C solvers for the storage of row interchange information.
  45. C A A block of locations used to store the matrix A, when using
  46. C the implicit method. If IMPL is 1, A is a MATDIM by N
  47. C array. If MITER is 1 or 2 MATDIM is N, and if MITER is 4
  48. C or 5 MATDIM is 2*ML+MU+1. If IMPL is 2 its length is N.
  49. C If IMPL is 3, A is a MATDIM by NDE array.
  50. C JTASK An integer used on input.
  51. C It has the following values and meanings:
  52. C .EQ. 0 Perform the first step. This value enables
  53. C the subroutine to initialize itself.
  54. C .GT. 0 Take a new step continuing from the last.
  55. C Assumes the last step was successful and
  56. C user has not changed any parameters.
  57. C .LT. 0 Take a new step with a new value of H and/or
  58. C MINT and/or MITER.
  59. C JSTATE A completion code with the following meanings:
  60. C 1 The step was successful.
  61. C 2 A solution could not be obtained with H .NE. 0.
  62. C 3 A solution was not obtained in MXTRY attempts.
  63. C 4 For IMPL .NE. 0, the matrix A is singular.
  64. C On a return with JSTATE .GT. 1, the values of T and
  65. C the YH array are as of the beginning of the last
  66. C step, and H is the last step size attempted.
  67. C
  68. C***ROUTINES CALLED CDCOR, CDCST, CDNTL, CDPSC, CDPST, CDSCL, SCNRM2
  69. C***REVISION HISTORY (YYMMDD)
  70. C 790601 DATE WRITTEN
  71. C 900329 Initial submission to SLATEC.
  72. C***END PROLOGUE CDSTP
  73. EXTERNAL F, JACOBN, FA, USERS
  74. INTEGER I, IERROR, IMPL, IPVT(*), ISWFLG, ITER, J, JSTATE, JSTEPL,
  75. 8 JTASK, MATDIM, MAXORD, MINT, MITER, ML, MNTOLD, MTROLD,
  76. 8 MTRSV, MU, MXFAIL, MXITER, MXRDSV, MXTRY, N, NDE, NDJSTP,
  77. 8 NFAIL, NFE, NJE, NQ, NQUSED, NSTEP, NSV, NTRY, NWAIT
  78. COMPLEX A(MATDIM,*), DFDY(MATDIM,*), FAC(*), SAVE1(*), SAVE2(*),
  79. 8 Y(*), YH(N,*), YWT(*)
  80. REAL AVGH, AVGORD, BIAS1, BIAS2, BIAS3, BND, CTEST, D, DENOM, D1,
  81. 8 EL(13,12), EPS, ERDN, ERUP, ETEST, H, HMAX, HN, HOLD, HS,
  82. 8 HUSED, NUMER, RC, RCTEST, RH, RH1, RH2, RH3, RMAX, RMFAIL,
  83. 8 RMNORM, SCNRM2, T, TOLD, TQ(3,12), TREND, TRSHLD, UROUND,
  84. 8 Y0NRM
  85. LOGICAL CONVRG, EVALFA, EVALJC, IER, SWITCH
  86. PARAMETER(BIAS1 = 1.3E0, BIAS2 = 1.2E0, BIAS3 = 1.4E0, MXFAIL = 3,
  87. 8 MXITER = 3, MXTRY = 50, RCTEST = .3E0, RMFAIL = 2.E0,
  88. 8 RMNORM = 10.E0, TRSHLD = 1.E0)
  89. PARAMETER (NDJSTP = 10)
  90. DATA IER /.FALSE./
  91. C***FIRST EXECUTABLE STATEMENT CDSTP
  92. NSV = N
  93. BND = 0.E0
  94. SWITCH = .FALSE.
  95. NTRY = 0
  96. TOLD = T
  97. NFAIL = 0
  98. IF (JTASK .LE. 0) THEN
  99. CALL CDNTL (EPS, F, FA, HMAX, HOLD, IMPL, JTASK, MATDIM,
  100. 8 MAXORD, MINT, MITER, ML, MU, N, NDE, SAVE1, T,
  101. 8 UROUND, USERS, Y, YWT, H, MNTOLD, MTROLD, NFE, RC,
  102. 8 YH, A, CONVRG, EL, FAC, IER, IPVT, NQ, NWAIT, RH,
  103. 8 RMAX, SAVE2, TQ, TREND, ISWFLG, JSTATE)
  104. IF (N .EQ. 0) GO TO 440
  105. IF (H .EQ. 0.E0) GO TO 400
  106. IF (IER) GO TO 420
  107. END IF
  108. 100 NTRY = NTRY + 1
  109. IF (NTRY .GT. MXTRY) GO TO 410
  110. T = T + H
  111. CALL CDPSC (1, N, NQ, YH)
  112. EVALJC = (((ABS(RC - 1.E0) .GT. RCTEST) .OR.
  113. 8 (NSTEP .GE. JSTEPL + NDJSTP)) .AND. (MITER .NE. 0))
  114. EVALFA = .NOT. EVALJC
  115. C
  116. 110 ITER = 0
  117. DO 115 I = 1,N
  118. 115 Y(I) = YH(I,1)
  119. CALL F (N, T, Y, SAVE2)
  120. IF (N .EQ. 0) THEN
  121. JSTATE = 6
  122. GO TO 430
  123. END IF
  124. NFE = NFE + 1
  125. IF (EVALJC .OR. IER) THEN
  126. CALL CDPST (EL, F, FA, H, IMPL, JACOBN, MATDIM, MITER, ML,
  127. 8 MU, N, NDE, NQ, SAVE2, T, USERS, Y, YH, YWT, UROUND,
  128. 8 NFE, NJE, A, DFDY, FAC, IER, IPVT, SAVE1, ISWFLG,
  129. 8 BND, JSTATE)
  130. IF (N .EQ. 0) GO TO 430
  131. IF (IER) GO TO 160
  132. CONVRG = .FALSE.
  133. RC = 1.E0
  134. JSTEPL = NSTEP
  135. END IF
  136. DO 125 I = 1,N
  137. 125 SAVE1(I) = 0.E0
  138. C Up to MXITER corrector iterations are taken.
  139. C Convergence is tested by requiring the r.m.s.
  140. C norm of changes to be less than EPS. The sum of
  141. C the corrections is accumulated in the vector
  142. C SAVE1(I). It is approximately equal to the L-th
  143. C derivative of Y multiplied by
  144. C H**L/(factorial(L-1)*EL(L,NQ)), and is thus
  145. C proportional to the actual errors to the lowest
  146. C power of H present (H**L). The YH array is not
  147. C altered in the correction loop. The norm of the
  148. C iterate difference is stored in D. If
  149. C ITER .GT. 0, an estimate of the convergence rate
  150. C constant is stored in TREND, and this is used in
  151. C the convergence test.
  152. C
  153. 130 CALL CDCOR (DFDY, EL, FA, H, IERROR, IMPL, IPVT, MATDIM, MITER,
  154. 8 ML, MU, N, NDE, NQ, T, USERS, Y, YH, YWT, EVALFA,
  155. 8 SAVE1, SAVE2, A, D, JSTATE)
  156. IF (N .EQ. 0) GO TO 430
  157. IF (ISWFLG .EQ. 3 .AND. MINT .EQ. 1) THEN
  158. IF (ITER .EQ. 0) THEN
  159. NUMER = SCNRM2(N, SAVE1, 1)
  160. DO 132 I = 1,N
  161. 132 DFDY(1,I) = SAVE1(I)
  162. Y0NRM = SCNRM2(N, YH, 1)
  163. ELSE
  164. DENOM = NUMER
  165. DO 134 I = 1,N
  166. 134 DFDY(1,I) = SAVE1(I) - DFDY(1,I)
  167. NUMER = SCNRM2(N, DFDY, MATDIM)
  168. IF (EL(1,NQ)*NUMER .LE. 100.E0*UROUND*Y0NRM) THEN
  169. IF (RMAX .EQ. RMFAIL) THEN
  170. SWITCH = .TRUE.
  171. GO TO 170
  172. END IF
  173. END IF
  174. DO 136 I = 1,N
  175. 136 DFDY(1,I) = SAVE1(I)
  176. IF (DENOM .NE. 0.E0)
  177. 8 BND = MAX(BND, NUMER/(DENOM*ABS(H)*EL(1,NQ)))
  178. END IF
  179. END IF
  180. IF (ITER .GT. 0) TREND = MAX(.9E0*TREND, D/D1)
  181. D1 = D
  182. CTEST = MIN(2.E0*TREND, 1.E0)*D
  183. IF (CTEST .LE. EPS) GO TO 170
  184. ITER = ITER + 1
  185. IF (ITER .LT. MXITER) THEN
  186. DO 140 I = 1,N
  187. 140 Y(I) = YH(I,1) + EL(1,NQ)*SAVE1(I)
  188. CALL F (N, T, Y, SAVE2)
  189. IF (N .EQ. 0) THEN
  190. JSTATE = 6
  191. GO TO 430
  192. END IF
  193. NFE = NFE + 1
  194. GO TO 130
  195. END IF
  196. C The corrector iteration failed to converge in
  197. C MXITER tries. If partials are involved but are
  198. C not up to date, they are reevaluated for the next
  199. C try. Otherwise the YH array is retracted to its
  200. C values before prediction, and H is reduced, if
  201. C possible. If not, a no-convergence exit is taken.
  202. IF (CONVRG) THEN
  203. EVALJC = .TRUE.
  204. EVALFA = .FALSE.
  205. GO TO 110
  206. END IF
  207. 160 T = TOLD
  208. CALL CDPSC (-1, N, NQ, YH)
  209. NWAIT = NQ + 2
  210. IF (JTASK .NE. 0 .AND. JTASK .NE. 2) RMAX = RMFAIL
  211. IF (ITER .EQ. 0) THEN
  212. RH = .3E0
  213. ELSE
  214. RH = .9E0*(EPS/CTEST)**(.2E0)
  215. END IF
  216. IF (RH*H .EQ. 0.E0) GO TO 400
  217. CALL CDSCL (HMAX, N, NQ, RMAX, H, RC, RH, YH)
  218. GO TO 100
  219. C The corrector has converged. CONVRG is set
  220. C to .TRUE. if partial derivatives were used,
  221. C to indicate that they may need updating on
  222. C subsequent steps. The error test is made.
  223. 170 CONVRG = (MITER .NE. 0)
  224. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  225. DO 180 I = 1,NDE
  226. 180 SAVE2(I) = SAVE1(I)/YWT(I)
  227. ELSE
  228. DO 185 I = 1,NDE
  229. 185 SAVE2(I) = SAVE1(I)/MAX(ABS(Y(I)), ABS(YWT(I)))
  230. END IF
  231. ETEST = SCNRM2(NDE, SAVE2, 1)/(TQ(2,NQ)*SQRT(REAL(NDE)))
  232. C
  233. C The error test failed. NFAIL keeps track of
  234. C multiple failures. Restore T and the YH
  235. C array to their previous values, and prepare
  236. C to try the step again. Compute the optimum
  237. C step size for this or one lower order.
  238. IF (ETEST .GT. EPS) THEN
  239. T = TOLD
  240. CALL CDPSC (-1, N, NQ, YH)
  241. NFAIL = NFAIL + 1
  242. IF (NFAIL .LT. MXFAIL .OR. NQ .EQ. 1) THEN
  243. IF (JTASK .NE. 0 .AND. JTASK .NE. 2) RMAX = RMFAIL
  244. RH2 = 1.E0/(BIAS2*(ETEST/EPS)**(1.E0/(NQ+1)))
  245. IF (NQ .GT. 1) THEN
  246. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  247. DO 190 I = 1,NDE
  248. 190 SAVE2(I) = YH(I,NQ+1)/YWT(I)
  249. ELSE
  250. DO 195 I = 1,NDE
  251. 195 SAVE2(I) = YH(I,NQ+1)/MAX(ABS(Y(I)), ABS(YWT(I)))
  252. END IF
  253. ERDN = SCNRM2(NDE, SAVE2, 1)/(TQ(1,NQ)*SQRT(REAL(NDE)))
  254. RH1 = 1.E0/MAX(1.E0, BIAS1*(ERDN/EPS)**(1.E0/NQ))
  255. IF (RH2 .LT. RH1) THEN
  256. NQ = NQ - 1
  257. RC = RC*EL(1,NQ)/EL(1,NQ+1)
  258. RH = RH1
  259. ELSE
  260. RH = RH2
  261. END IF
  262. ELSE
  263. RH = RH2
  264. END IF
  265. NWAIT = NQ + 2
  266. IF (RH*H .EQ. 0.E0) GO TO 400
  267. CALL CDSCL (HMAX, N, NQ, RMAX, H, RC, RH, YH)
  268. GO TO 100
  269. END IF
  270. C Control reaches this section if the error test has
  271. C failed MXFAIL or more times. It is assumed that the
  272. C derivatives that have accumulated in the YH array have
  273. C errors of the wrong order. Hence the first derivative
  274. C is recomputed, the order is set to 1, and the step is
  275. C retried.
  276. NFAIL = 0
  277. JTASK = 2
  278. DO 215 I = 1,N
  279. 215 Y(I) = YH(I,1)
  280. CALL CDNTL (EPS, F, FA, HMAX, HOLD, IMPL, JTASK, MATDIM,
  281. 8 MAXORD, MINT, MITER, ML, MU, N, NDE, SAVE1, T,
  282. 8 UROUND, USERS, Y, YWT, H, MNTOLD, MTROLD, NFE, RC,
  283. 8 YH, A, CONVRG, EL, FAC, IER, IPVT, NQ, NWAIT, RH,
  284. 8 RMAX, SAVE2, TQ, TREND, ISWFLG, JSTATE)
  285. RMAX = RMNORM
  286. IF (N .EQ. 0) GO TO 440
  287. IF (H .EQ. 0.E0) GO TO 400
  288. IF (IER) GO TO 420
  289. GO TO 100
  290. END IF
  291. C After a successful step, update the YH array.
  292. NSTEP = NSTEP + 1
  293. HUSED = H
  294. NQUSED = NQ
  295. AVGH = ((NSTEP-1)*AVGH + H)/NSTEP
  296. AVGORD = ((NSTEP-1)*AVGORD + NQ)/NSTEP
  297. DO 230 J = 1,NQ+1
  298. DO 230 I = 1,N
  299. 230 YH(I,J) = YH(I,J) + EL(J,NQ)*SAVE1(I)
  300. DO 235 I = 1,N
  301. 235 Y(I) = YH(I,1)
  302. C If ISWFLG is 3, consider
  303. C changing integration methods.
  304. IF (ISWFLG .EQ. 3) THEN
  305. IF (BND .NE. 0.E0) THEN
  306. IF (MINT .EQ. 1 .AND. NQ .LE. 5) THEN
  307. HN = ABS(H)/MAX(UROUND, (ETEST/EPS)**(1.E0/(NQ+1)))
  308. HN = MIN(HN, 1.E0/(2.E0*EL(1,NQ)*BND))
  309. HS = ABS(H)/MAX(UROUND,
  310. 8 (ETEST/(EPS*EL(NQ+1,1)))**(1.E0/(NQ+1)))
  311. IF (HS .GT. 1.2E0*HN) THEN
  312. MINT = 2
  313. MNTOLD = MINT
  314. MITER = MTRSV
  315. MTROLD = MITER
  316. MAXORD = MIN(MXRDSV, 5)
  317. RC = 0.E0
  318. RMAX = RMNORM
  319. TREND = 1.E0
  320. CALL CDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  321. NWAIT = NQ + 2
  322. END IF
  323. ELSE IF (MINT .EQ. 2) THEN
  324. HS = ABS(H)/MAX(UROUND, (ETEST/EPS)**(1.E0/(NQ+1)))
  325. HN = ABS(H)/MAX(UROUND,
  326. 8 (ETEST*EL(NQ+1,1)/EPS)**(1.E0/(NQ+1)))
  327. HN = MIN(HN, 1.E0/(2.E0*EL(1,NQ)*BND))
  328. IF (HN .GE. HS) THEN
  329. MINT = 1
  330. MNTOLD = MINT
  331. MITER = 0
  332. MTROLD = MITER
  333. MAXORD = MIN(MXRDSV, 12)
  334. RMAX = RMNORM
  335. TREND = 1.E0
  336. CONVRG = .FALSE.
  337. CALL CDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  338. NWAIT = NQ + 2
  339. END IF
  340. END IF
  341. END IF
  342. END IF
  343. IF (SWITCH) THEN
  344. MINT = 2
  345. MNTOLD = MINT
  346. MITER = MTRSV
  347. MTROLD = MITER
  348. MAXORD = MIN(MXRDSV, 5)
  349. NQ = MIN(NQ, MAXORD)
  350. RC = 0.E0
  351. RMAX = RMNORM
  352. TREND = 1.E0
  353. CALL CDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  354. NWAIT = NQ + 2
  355. END IF
  356. C Consider changing H if NWAIT = 1. Otherwise
  357. C decrease NWAIT by 1. If NWAIT is then 1 and
  358. C NQ.LT.MAXORD, then SAVE1 is saved for use in
  359. C a possible order increase on the next step.
  360. C
  361. IF (JTASK .EQ. 0 .OR. JTASK .EQ. 2) THEN
  362. RH = 1.E0/MAX(UROUND, BIAS2*(ETEST/EPS)**(1.E0/(NQ+1)))
  363. IF (RH.GT.TRSHLD) CALL CDSCL (HMAX, N, NQ, RMAX, H, RC, RH, YH)
  364. ELSE IF (NWAIT .GT. 1) THEN
  365. NWAIT = NWAIT - 1
  366. IF (NWAIT .EQ. 1 .AND. NQ .LT. MAXORD) THEN
  367. DO 250 I = 1,NDE
  368. 250 YH(I,MAXORD+1) = SAVE1(I)
  369. END IF
  370. C If a change in H is considered, an increase or decrease in
  371. C order by one is considered also. A change in H is made
  372. C only if it is by a factor of at least TRSHLD. Factors
  373. C RH1, RH2, and RH3 are computed, by which H could be
  374. C multiplied at order NQ - 1, order NQ, or order NQ + 1,
  375. C respectively. The largest of these is determined and the
  376. C new order chosen accordingly. If the order is to be
  377. C increased, we compute one additional scaled derivative.
  378. C If there is a change of order, reset NQ and the
  379. C coefficients. In any case H is reset according to RH and
  380. C the YH array is rescaled.
  381. ELSE
  382. IF (NQ .EQ. 1) THEN
  383. RH1 = 0.E0
  384. ELSE
  385. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  386. DO 270 I = 1,NDE
  387. 270 SAVE2(I) = YH(I,NQ+1)/YWT(I)
  388. ELSE
  389. DO 275 I = 1,NDE
  390. 275 SAVE2(I) = YH(I,NQ+1)/MAX(ABS(Y(I)), ABS(YWT(I)))
  391. END IF
  392. ERDN = SCNRM2(NDE, SAVE2, 1)/(TQ(1,NQ)*SQRT(REAL(NDE)))
  393. RH1 = 1.E0/MAX(UROUND, BIAS1*(ERDN/EPS)**(1.E0/NQ))
  394. END IF
  395. RH2 = 1.E0/MAX(UROUND, BIAS2*(ETEST/EPS)**(1.E0/(NQ+1)))
  396. IF (NQ .EQ. MAXORD) THEN
  397. RH3 = 0.E0
  398. ELSE
  399. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  400. DO 290 I = 1,NDE
  401. 290 SAVE2(I) = (SAVE1(I) - YH(I,MAXORD+1))/YWT(I)
  402. ELSE
  403. DO 295 I = 1,NDE
  404. SAVE2(I) = (SAVE1(I) - YH(I,MAXORD+1))/
  405. 8 MAX(ABS(Y(I)), ABS(YWT(I)))
  406. 295 CONTINUE
  407. END IF
  408. ERUP = SCNRM2(NDE, SAVE2, 1)/(TQ(3,NQ)*SQRT(REAL(NDE)))
  409. RH3 = 1.E0/MAX(UROUND, BIAS3*(ERUP/EPS)**(1.E0/(NQ+2)))
  410. END IF
  411. IF (RH1 .GT. RH2 .AND. RH1 .GE. RH3) THEN
  412. RH = RH1
  413. IF (RH .LE. TRSHLD) GO TO 380
  414. NQ = NQ - 1
  415. RC = RC*EL(1,NQ)/EL(1,NQ+1)
  416. ELSE IF (RH2 .GE. RH1 .AND. RH2 .GE. RH3) THEN
  417. RH = RH2
  418. IF (RH .LE. TRSHLD) GO TO 380
  419. ELSE
  420. RH = RH3
  421. IF (RH .LE. TRSHLD) GO TO 380
  422. DO 360 I = 1,N
  423. 360 YH(I,NQ+2) = SAVE1(I)*EL(NQ+1,NQ)/(NQ+1)
  424. NQ = NQ + 1
  425. RC = RC*EL(1,NQ)/EL(1,NQ-1)
  426. END IF
  427. IF (ISWFLG .EQ. 3 .AND. MINT .EQ. 1) THEN
  428. IF (BND.NE.0.E0) RH = MIN(RH, 1.E0/(2.E0*EL(1,NQ)*BND*ABS(H)))
  429. END IF
  430. CALL CDSCL (HMAX, N, NQ, RMAX, H, RC, RH, YH)
  431. RMAX = RMNORM
  432. 380 NWAIT = NQ + 2
  433. END IF
  434. C All returns are made through this section. H is saved
  435. C in HOLD to allow the caller to change H on the next step
  436. JSTATE = 1
  437. HOLD = H
  438. RETURN
  439. C
  440. 400 JSTATE = 2
  441. HOLD = H
  442. DO 405 I = 1,N
  443. 405 Y(I) = YH(I,1)
  444. RETURN
  445. C
  446. 410 JSTATE = 3
  447. HOLD = H
  448. RETURN
  449. C
  450. 420 JSTATE = 4
  451. HOLD = H
  452. RETURN
  453. C
  454. 430 T = TOLD
  455. CALL CDPSC (-1, NSV, NQ, YH)
  456. DO 435 I = 1,NSV
  457. 435 Y(I) = YH(I,1)
  458. 440 HOLD = H
  459. RETURN
  460. END