sdstp.f 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. *DECK SDSTP
  2. SUBROUTINE SDSTP (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 SDSTP
  9. C***SUBSIDIARY
  10. C***PURPOSE SDSTP 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 SINGLE PRECISION (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 SDSTP 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 SDSTP.
  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***ROUTINES CALLED SDCOR, SDCST, SDNTL, SDPSC, SDPST, SDSCL, SNRM2
  68. C***REVISION HISTORY (YYMMDD)
  69. C 790601 DATE WRITTEN
  70. C 900329 Initial submission to SLATEC.
  71. C***END PROLOGUE SDSTP
  72. EXTERNAL F, JACOBN, FA, USERS
  73. INTEGER I, IERROR, IMPL, IPVT(*), ISWFLG, ITER, J, JSTATE, JSTEPL,
  74. 8 JTASK, MATDIM, MAXORD, MINT, MITER, ML, MNTOLD, MTROLD,
  75. 8 MTRSV, MU, MXFAIL, MXITER, MXRDSV, MXTRY, N, NDE, NDJSTP,
  76. 8 NFAIL, NFE, NJE, NQ, NQUSED, NSTEP, NSV, NTRY, NWAIT
  77. REAL A(MATDIM,*), AVGH, AVGORD, BIAS1, BIAS2, BIAS3,
  78. 8 BND, CTEST, D, DENOM, DFDY(MATDIM,*), D1, EL(13,12), EPS,
  79. 8 ERDN, ERUP, ETEST, FAC(*), H, HMAX, HN, HOLD, HS, HUSED,
  80. 8 NUMER, RC, RCTEST, RH, RH1, RH2, RH3, RMAX, RMFAIL, RMNORM,
  81. 8 SAVE1(*), SAVE2(*), SNRM2, T, TOLD, TQ(3,12), TREND, TRSHLD,
  82. 8 UROUND, Y(*), YH(N,*), YWT(*), Y0NRM
  83. LOGICAL CONVRG, EVALFA, EVALJC, IER, SWITCH
  84. PARAMETER(BIAS1 = 1.3E0, BIAS2 = 1.2E0, BIAS3 = 1.4E0, MXFAIL = 3,
  85. 8 MXITER = 3, MXTRY = 50, RCTEST = .3E0, RMFAIL = 2.E0,
  86. 8 RMNORM = 10.E0, TRSHLD = 1.E0)
  87. PARAMETER (NDJSTP = 10)
  88. DATA IER /.FALSE./
  89. C***FIRST EXECUTABLE STATEMENT SDSTP
  90. NSV = N
  91. BND = 0.E0
  92. SWITCH = .FALSE.
  93. NTRY = 0
  94. TOLD = T
  95. NFAIL = 0
  96. IF (JTASK .LE. 0) THEN
  97. CALL SDNTL (EPS, F, FA, HMAX, HOLD, IMPL, JTASK, MATDIM,
  98. 8 MAXORD, MINT, MITER, ML, MU, N, NDE, SAVE1, T,
  99. 8 UROUND, USERS, Y, YWT, H, MNTOLD, MTROLD, NFE, RC,
  100. 8 YH, A, CONVRG, EL, FAC, IER, IPVT, NQ, NWAIT, RH,
  101. 8 RMAX, SAVE2, TQ, TREND, ISWFLG, JSTATE)
  102. IF (N .EQ. 0) GO TO 440
  103. IF (H .EQ. 0.E0) GO TO 400
  104. IF (IER) GO TO 420
  105. END IF
  106. 100 NTRY = NTRY + 1
  107. IF (NTRY .GT. MXTRY) GO TO 410
  108. T = T + H
  109. CALL SDPSC (1, N, NQ, YH)
  110. EVALJC = (((ABS(RC - 1.E0) .GT. RCTEST) .OR.
  111. 8 (NSTEP .GE. JSTEPL + NDJSTP)) .AND. (MITER .NE. 0))
  112. EVALFA = .NOT. EVALJC
  113. C
  114. 110 ITER = 0
  115. DO 115 I = 1,N
  116. 115 Y(I) = YH(I,1)
  117. CALL F (N, T, Y, SAVE2)
  118. IF (N .EQ. 0) THEN
  119. JSTATE = 6
  120. GO TO 430
  121. END IF
  122. NFE = NFE + 1
  123. IF (EVALJC .OR. IER) THEN
  124. CALL SDPST (EL, F, FA, H, IMPL, JACOBN, MATDIM, MITER, ML,
  125. 8 MU, N, NDE, NQ, SAVE2, T, USERS, Y, YH, YWT, UROUND,
  126. 8 NFE, NJE, A, DFDY, FAC, IER, IPVT, SAVE1, ISWFLG,
  127. 8 BND, JSTATE)
  128. IF (N .EQ. 0) GO TO 430
  129. IF (IER) GO TO 160
  130. CONVRG = .FALSE.
  131. RC = 1.E0
  132. JSTEPL = NSTEP
  133. END IF
  134. DO 125 I = 1,N
  135. 125 SAVE1(I) = 0.E0
  136. C Up to MXITER corrector iterations are taken.
  137. C Convergence is tested by requiring the r.m.s.
  138. C norm of changes to be less than EPS. The sum of
  139. C the corrections is accumulated in the vector
  140. C SAVE1(I). It is approximately equal to the L-th
  141. C derivative of Y multiplied by
  142. C H**L/(factorial(L-1)*EL(L,NQ)), and is thus
  143. C proportional to the actual errors to the lowest
  144. C power of H present (H**L). The YH array is not
  145. C altered in the correction loop. The norm of the
  146. C iterate difference is stored in D. If
  147. C ITER .GT. 0, an estimate of the convergence rate
  148. C constant is stored in TREND, and this is used in
  149. C the convergence test.
  150. C
  151. 130 CALL SDCOR (DFDY, EL, FA, H, IERROR, IMPL, IPVT, MATDIM, MITER,
  152. 8 ML, MU, N, NDE, NQ, T, USERS, Y, YH, YWT, EVALFA,
  153. 8 SAVE1, SAVE2, A, D, JSTATE)
  154. IF (N .EQ. 0) GO TO 430
  155. IF (ISWFLG .EQ. 3 .AND. MINT .EQ. 1) THEN
  156. IF (ITER .EQ. 0) THEN
  157. NUMER = SNRM2(N, SAVE1, 1)
  158. DO 132 I = 1,N
  159. 132 DFDY(1,I) = SAVE1(I)
  160. Y0NRM = SNRM2(N, YH, 1)
  161. ELSE
  162. DENOM = NUMER
  163. DO 134 I = 1,N
  164. 134 DFDY(1,I) = SAVE1(I) - DFDY(1,I)
  165. NUMER = SNRM2(N, DFDY, MATDIM)
  166. IF (EL(1,NQ)*NUMER .LE. 100.E0*UROUND*Y0NRM) THEN
  167. IF (RMAX .EQ. RMFAIL) THEN
  168. SWITCH = .TRUE.
  169. GO TO 170
  170. END IF
  171. END IF
  172. DO 136 I = 1,N
  173. 136 DFDY(1,I) = SAVE1(I)
  174. IF (DENOM .NE. 0.E0)
  175. 8 BND = MAX(BND, NUMER/(DENOM*ABS(H)*EL(1,NQ)))
  176. END IF
  177. END IF
  178. IF (ITER .GT. 0) TREND = MAX(.9E0*TREND, D/D1)
  179. D1 = D
  180. CTEST = MIN(2.E0*TREND, 1.E0)*D
  181. IF (CTEST .LE. EPS) GO TO 170
  182. ITER = ITER + 1
  183. IF (ITER .LT. MXITER) THEN
  184. DO 140 I = 1,N
  185. 140 Y(I) = YH(I,1) + EL(1,NQ)*SAVE1(I)
  186. CALL F (N, T, Y, SAVE2)
  187. IF (N .EQ. 0) THEN
  188. JSTATE = 6
  189. GO TO 430
  190. END IF
  191. NFE = NFE + 1
  192. GO TO 130
  193. END IF
  194. C The corrector iteration failed to converge in
  195. C MXITER tries. If partials are involved but are
  196. C not up to date, they are reevaluated for the next
  197. C try. Otherwise the YH array is retracted to its
  198. C values before prediction, and H is reduced, if
  199. C possible. If not, a no-convergence exit is taken.
  200. IF (CONVRG) THEN
  201. EVALJC = .TRUE.
  202. EVALFA = .FALSE.
  203. GO TO 110
  204. END IF
  205. 160 T = TOLD
  206. CALL SDPSC (-1, N, NQ, YH)
  207. NWAIT = NQ + 2
  208. IF (JTASK .NE. 0 .AND. JTASK .NE. 2) RMAX = RMFAIL
  209. IF (ITER .EQ. 0) THEN
  210. RH = .3E0
  211. ELSE
  212. RH = .9E0*(EPS/CTEST)**(.2E0)
  213. END IF
  214. IF (RH*H .EQ. 0.E0) GO TO 400
  215. CALL SDSCL (HMAX, N, NQ, RMAX, H, RC, RH, YH)
  216. GO TO 100
  217. C The corrector has converged. CONVRG is set
  218. C to .TRUE. if partial derivatives were used,
  219. C to indicate that they may need updating on
  220. C subsequent steps. The error test is made.
  221. 170 CONVRG = (MITER .NE. 0)
  222. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  223. DO 180 I = 1,NDE
  224. 180 SAVE2(I) = SAVE1(I)/YWT(I)
  225. ELSE
  226. DO 185 I = 1,NDE
  227. 185 SAVE2(I) = SAVE1(I)/MAX(ABS(Y(I)), YWT(I))
  228. END IF
  229. ETEST = SNRM2(NDE, SAVE2, 1)/(TQ(2,NQ)*SQRT(REAL(NDE)))
  230. C
  231. C The error test failed. NFAIL keeps track of
  232. C multiple failures. Restore T and the YH
  233. C array to their previous values, and prepare
  234. C to try the step again. Compute the optimum
  235. C step size for this or one lower order.
  236. IF (ETEST .GT. EPS) THEN
  237. T = TOLD
  238. CALL SDPSC (-1, N, NQ, YH)
  239. NFAIL = NFAIL + 1
  240. IF (NFAIL .LT. MXFAIL .OR. NQ .EQ. 1) THEN
  241. IF (JTASK .NE. 0 .AND. JTASK .NE. 2) RMAX = RMFAIL
  242. RH2 = 1.E0/(BIAS2*(ETEST/EPS)**(1.E0/(NQ+1)))
  243. IF (NQ .GT. 1) THEN
  244. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  245. DO 190 I = 1,NDE
  246. 190 SAVE2(I) = YH(I,NQ+1)/YWT(I)
  247. ELSE
  248. DO 195 I = 1,NDE
  249. 195 SAVE2(I) = YH(I,NQ+1)/MAX(ABS(Y(I)), YWT(I))
  250. END IF
  251. ERDN = SNRM2(NDE, SAVE2, 1)/(TQ(1,NQ)*SQRT(REAL(NDE)))
  252. RH1 = 1.E0/MAX(1.E0, BIAS1*(ERDN/EPS)**(1.E0/NQ))
  253. IF (RH2 .LT. RH1) THEN
  254. NQ = NQ - 1
  255. RC = RC*EL(1,NQ)/EL(1,NQ+1)
  256. RH = RH1
  257. ELSE
  258. RH = RH2
  259. END IF
  260. ELSE
  261. RH = RH2
  262. END IF
  263. NWAIT = NQ + 2
  264. IF (RH*H .EQ. 0.E0) GO TO 400
  265. CALL SDSCL (HMAX, N, NQ, RMAX, H, RC, RH, YH)
  266. GO TO 100
  267. END IF
  268. C Control reaches this section if the error test has
  269. C failed MXFAIL or more times. It is assumed that the
  270. C derivatives that have accumulated in the YH array have
  271. C errors of the wrong order. Hence the first derivative
  272. C is recomputed, the order is set to 1, and the step is
  273. C retried.
  274. NFAIL = 0
  275. JTASK = 2
  276. DO 215 I = 1,N
  277. 215 Y(I) = YH(I,1)
  278. CALL SDNTL (EPS, F, FA, HMAX, HOLD, IMPL, JTASK, MATDIM,
  279. 8 MAXORD, MINT, MITER, ML, MU, N, NDE, SAVE1, T,
  280. 8 UROUND, USERS, Y, YWT, H, MNTOLD, MTROLD, NFE, RC,
  281. 8 YH, A, CONVRG, EL, FAC, IER, IPVT, NQ, NWAIT, RH,
  282. 8 RMAX, SAVE2, TQ, TREND, ISWFLG, JSTATE)
  283. RMAX = RMNORM
  284. IF (N .EQ. 0) GO TO 440
  285. IF (H .EQ. 0.E0) GO TO 400
  286. IF (IER) GO TO 420
  287. GO TO 100
  288. END IF
  289. C After a successful step, update the YH array.
  290. NSTEP = NSTEP + 1
  291. HUSED = H
  292. NQUSED = NQ
  293. AVGH = ((NSTEP-1)*AVGH + H)/NSTEP
  294. AVGORD = ((NSTEP-1)*AVGORD + NQ)/NSTEP
  295. DO 230 J = 1,NQ+1
  296. DO 230 I = 1,N
  297. 230 YH(I,J) = YH(I,J) + EL(J,NQ)*SAVE1(I)
  298. DO 235 I = 1,N
  299. 235 Y(I) = YH(I,1)
  300. C If ISWFLG is 3, consider
  301. C changing integration methods.
  302. IF (ISWFLG .EQ. 3) THEN
  303. IF (BND .NE. 0.E0) THEN
  304. IF (MINT .EQ. 1 .AND. NQ .LE. 5) THEN
  305. HN = ABS(H)/MAX(UROUND, (ETEST/EPS)**(1.E0/(NQ+1)))
  306. HN = MIN(HN, 1.E0/(2.E0*EL(1,NQ)*BND))
  307. HS = ABS(H)/MAX(UROUND,
  308. 8 (ETEST/(EPS*EL(NQ+1,1)))**(1.E0/(NQ+1)))
  309. IF (HS .GT. 1.2E0*HN) THEN
  310. MINT = 2
  311. MNTOLD = MINT
  312. MITER = MTRSV
  313. MTROLD = MITER
  314. MAXORD = MIN(MXRDSV, 5)
  315. RC = 0.E0
  316. RMAX = RMNORM
  317. TREND = 1.E0
  318. CALL SDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  319. NWAIT = NQ + 2
  320. END IF
  321. ELSE IF (MINT .EQ. 2) THEN
  322. HS = ABS(H)/MAX(UROUND, (ETEST/EPS)**(1.E0/(NQ+1)))
  323. HN = ABS(H)/MAX(UROUND,
  324. 8 (ETEST*EL(NQ+1,1)/EPS)**(1.E0/(NQ+1)))
  325. HN = MIN(HN, 1.E0/(2.E0*EL(1,NQ)*BND))
  326. IF (HN .GE. HS) THEN
  327. MINT = 1
  328. MNTOLD = MINT
  329. MITER = 0
  330. MTROLD = MITER
  331. MAXORD = MIN(MXRDSV, 12)
  332. RMAX = RMNORM
  333. TREND = 1.E0
  334. CONVRG = .FALSE.
  335. CALL SDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  336. NWAIT = NQ + 2
  337. END IF
  338. END IF
  339. END IF
  340. END IF
  341. IF (SWITCH) THEN
  342. MINT = 2
  343. MNTOLD = MINT
  344. MITER = MTRSV
  345. MTROLD = MITER
  346. MAXORD = MIN(MXRDSV, 5)
  347. NQ = MIN(NQ, MAXORD)
  348. RC = 0.E0
  349. RMAX = RMNORM
  350. TREND = 1.E0
  351. CALL SDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  352. NWAIT = NQ + 2
  353. END IF
  354. C Consider changing H if NWAIT = 1. Otherwise
  355. C decrease NWAIT by 1. If NWAIT is then 1 and
  356. C NQ.LT.MAXORD, then SAVE1 is saved for use in
  357. C a possible order increase on the next step.
  358. C
  359. IF (JTASK .EQ. 0 .OR. JTASK .EQ. 2) THEN
  360. RH = 1.E0/MAX(UROUND, BIAS2*(ETEST/EPS)**(1.E0/(NQ+1)))
  361. IF (RH.GT.TRSHLD) CALL SDSCL (HMAX, N, NQ, RMAX, H, RC, RH, YH)
  362. ELSE IF (NWAIT .GT. 1) THEN
  363. NWAIT = NWAIT - 1
  364. IF (NWAIT .EQ. 1 .AND. NQ .LT. MAXORD) THEN
  365. DO 250 I = 1,NDE
  366. 250 YH(I,MAXORD+1) = SAVE1(I)
  367. END IF
  368. C If a change in H is considered, an increase or decrease in
  369. C order by one is considered also. A change in H is made
  370. C only if it is by a factor of at least TRSHLD. Factors
  371. C RH1, RH2, and RH3 are computed, by which H could be
  372. C multiplied at order NQ - 1, order NQ, or order NQ + 1,
  373. C respectively. The largest of these is determined and the
  374. C new order chosen accordingly. If the order is to be
  375. C increased, we compute one additional scaled derivative.
  376. C If there is a change of order, reset NQ and the
  377. C coefficients. In any case H is reset according to RH and
  378. C the YH array is rescaled.
  379. ELSE
  380. IF (NQ .EQ. 1) THEN
  381. RH1 = 0.E0
  382. ELSE
  383. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  384. DO 270 I = 1,NDE
  385. 270 SAVE2(I) = YH(I,NQ+1)/YWT(I)
  386. ELSE
  387. DO 275 I = 1,NDE
  388. 275 SAVE2(I) = YH(I,NQ+1)/MAX(ABS(Y(I)), YWT(I))
  389. END IF
  390. ERDN = SNRM2(NDE, SAVE2, 1)/(TQ(1,NQ)*SQRT(REAL(NDE)))
  391. RH1 = 1.E0/MAX(UROUND, BIAS1*(ERDN/EPS)**(1.E0/NQ))
  392. END IF
  393. RH2 = 1.E0/MAX(UROUND, BIAS2*(ETEST/EPS)**(1.E0/(NQ+1)))
  394. IF (NQ .EQ. MAXORD) THEN
  395. RH3 = 0.E0
  396. ELSE
  397. IF (IERROR .EQ. 1 .OR. IERROR .EQ. 5) THEN
  398. DO 290 I = 1,NDE
  399. 290 SAVE2(I) = (SAVE1(I) - YH(I,MAXORD+1))/YWT(I)
  400. ELSE
  401. DO 295 I = 1,NDE
  402. SAVE2(I) = (SAVE1(I) - YH(I,MAXORD+1))/
  403. 8 MAX(ABS(Y(I)), YWT(I))
  404. 295 CONTINUE
  405. END IF
  406. ERUP = SNRM2(NDE, SAVE2, 1)/(TQ(3,NQ)*SQRT(REAL(NDE)))
  407. RH3 = 1.E0/MAX(UROUND, BIAS3*(ERUP/EPS)**(1.E0/(NQ+2)))
  408. END IF
  409. IF (RH1 .GT. RH2 .AND. RH1 .GE. RH3) THEN
  410. RH = RH1
  411. IF (RH .LE. TRSHLD) GO TO 380
  412. NQ = NQ - 1
  413. RC = RC*EL(1,NQ)/EL(1,NQ+1)
  414. ELSE IF (RH2 .GE. RH1 .AND. RH2 .GE. RH3) THEN
  415. RH = RH2
  416. IF (RH .LE. TRSHLD) GO TO 380
  417. ELSE
  418. RH = RH3
  419. IF (RH .LE. TRSHLD) GO TO 380
  420. DO 360 I = 1,N
  421. 360 YH(I,NQ+2) = SAVE1(I)*EL(NQ+1,NQ)/(NQ+1)
  422. NQ = NQ + 1
  423. RC = RC*EL(1,NQ)/EL(1,NQ-1)
  424. END IF
  425. IF (ISWFLG .EQ. 3 .AND. MINT .EQ. 1) THEN
  426. IF (BND.NE.0.E0) RH = MIN(RH, 1.E0/(2.E0*EL(1,NQ)*BND*ABS(H)))
  427. END IF
  428. CALL SDSCL (HMAX, N, NQ, RMAX, H, RC, RH, YH)
  429. RMAX = RMNORM
  430. 380 NWAIT = NQ + 2
  431. END IF
  432. C All returns are made through this section. H is saved
  433. C in HOLD to allow the caller to change H on the next step
  434. JSTATE = 1
  435. HOLD = H
  436. RETURN
  437. C
  438. 400 JSTATE = 2
  439. HOLD = H
  440. DO 405 I = 1,N
  441. 405 Y(I) = YH(I,1)
  442. RETURN
  443. C
  444. 410 JSTATE = 3
  445. HOLD = H
  446. RETURN
  447. C
  448. 420 JSTATE = 4
  449. HOLD = H
  450. RETURN
  451. C
  452. 430 T = TOLD
  453. CALL SDPSC (-1, NSV, NQ, YH)
  454. DO 435 I = 1,NSV
  455. 435 Y(I) = YH(I,1)
  456. 440 HOLD = H
  457. RETURN
  458. END