sdastp.f 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. *DECK SDASTP
  2. SUBROUTINE SDASTP (X, Y, YPRIME, NEQ, RES, JAC, H, WT, JSTART,
  3. * IDID, RPAR, IPAR, PHI, DELTA, E, WM, IWM, ALPHA, BETA, GAMMA,
  4. * PSI, SIGMA, CJ, CJOLD, HOLD, S, HMIN, UROUND, IPHASE, JCALC, K,
  5. * KOLD, NS, NONNEG, NTEMP)
  6. C***BEGIN PROLOGUE SDASTP
  7. C***SUBSIDIARY
  8. C***PURPOSE Perform one step of the SDASSL integration.
  9. C***LIBRARY SLATEC (DASSL)
  10. C***TYPE SINGLE PRECISION (SDASTP-S, DDASTP-D)
  11. C***AUTHOR Petzold, Linda R., (LLNL)
  12. C***DESCRIPTION
  13. C-----------------------------------------------------------------------
  14. C SDASTP SOLVES A SYSTEM OF DIFFERENTIAL/
  15. C ALGEBRAIC EQUATIONS OF THE FORM
  16. C G(X,Y,YPRIME) = 0, FOR ONE STEP (NORMALLY
  17. C FROM X TO X+H).
  18. C
  19. C THE METHODS USED ARE MODIFIED DIVIDED
  20. C DIFFERENCE,FIXED LEADING COEFFICIENT
  21. C FORMS OF BACKWARD DIFFERENTIATION
  22. C FORMULAS. THE CODE ADJUSTS THE STEPSIZE
  23. C AND ORDER TO CONTROL THE LOCAL ERROR PER
  24. C STEP.
  25. C
  26. C
  27. C THE PARAMETERS REPRESENT
  28. C X -- INDEPENDENT VARIABLE
  29. C Y -- SOLUTION VECTOR AT X
  30. C YPRIME -- DERIVATIVE OF SOLUTION VECTOR
  31. C AFTER SUCCESSFUL STEP
  32. C NEQ -- NUMBER OF EQUATIONS TO BE INTEGRATED
  33. C RES -- EXTERNAL USER-SUPPLIED SUBROUTINE
  34. C TO EVALUATE THE RESIDUAL. THE CALL IS
  35. C CALL RES(X,Y,YPRIME,DELTA,IRES,RPAR,IPAR)
  36. C X,Y,YPRIME ARE INPUT. DELTA IS OUTPUT.
  37. C ON INPUT, IRES=0. RES SHOULD ALTER IRES ONLY
  38. C IF IT ENCOUNTERS AN ILLEGAL VALUE OF Y OR A
  39. C STOP CONDITION. SET IRES=-1 IF AN INPUT VALUE
  40. C OF Y IS ILLEGAL, AND SDASTP WILL TRY TO SOLVE
  41. C THE PROBLEM WITHOUT GETTING IRES = -1. IF
  42. C IRES=-2, SDASTP RETURNS CONTROL TO THE CALLING
  43. C PROGRAM WITH IDID = -11.
  44. C JAC -- EXTERNAL USER-SUPPLIED ROUTINE TO EVALUATE
  45. C THE ITERATION MATRIX (THIS IS OPTIONAL)
  46. C THE CALL IS OF THE FORM
  47. C CALL JAC(X,Y,YPRIME,PD,CJ,RPAR,IPAR)
  48. C PD IS THE MATRIX OF PARTIAL DERIVATIVES,
  49. C PD=DG/DY+CJ*DG/DYPRIME
  50. C H -- APPROPRIATE STEP SIZE FOR NEXT STEP.
  51. C NORMALLY DETERMINED BY THE CODE
  52. C WT -- VECTOR OF WEIGHTS FOR ERROR CRITERION.
  53. C JSTART -- INTEGER VARIABLE SET 0 FOR
  54. C FIRST STEP, 1 OTHERWISE.
  55. C IDID -- COMPLETION CODE WITH THE FOLLOWING MEANINGS:
  56. C IDID= 1 -- THE STEP WAS COMPLETED SUCCESSFULLY
  57. C IDID=-6 -- THE ERROR TEST FAILED REPEATEDLY
  58. C IDID=-7 -- THE CORRECTOR COULD NOT CONVERGE
  59. C IDID=-8 -- THE ITERATION MATRIX IS SINGULAR
  60. C IDID=-9 -- THE CORRECTOR COULD NOT CONVERGE.
  61. C THERE WERE REPEATED ERROR TEST
  62. C FAILURES ON THIS STEP.
  63. C IDID=-10-- THE CORRECTOR COULD NOT CONVERGE
  64. C BECAUSE IRES WAS EQUAL TO MINUS ONE
  65. C IDID=-11-- IRES EQUAL TO -2 WAS ENCOUNTERED,
  66. C AND CONTROL IS BEING RETURNED TO
  67. C THE CALLING PROGRAM
  68. C RPAR,IPAR -- REAL AND INTEGER PARAMETER ARRAYS THAT
  69. C ARE USED FOR COMMUNICATION BETWEEN THE
  70. C CALLING PROGRAM AND EXTERNAL USER ROUTINES
  71. C THEY ARE NOT ALTERED BY SDASTP
  72. C PHI -- ARRAY OF DIVIDED DIFFERENCES USED BY
  73. C SDASTP. THE LENGTH IS NEQ*(K+1),WHERE
  74. C K IS THE MAXIMUM ORDER
  75. C DELTA,E -- WORK VECTORS FOR SDASTP OF LENGTH NEQ
  76. C WM,IWM -- REAL AND INTEGER ARRAYS STORING
  77. C MATRIX INFORMATION SUCH AS THE MATRIX
  78. C OF PARTIAL DERIVATIVES,PERMUTATION
  79. C VECTOR, AND VARIOUS OTHER INFORMATION.
  80. C
  81. C THE OTHER PARAMETERS ARE INFORMATION
  82. C WHICH IS NEEDED INTERNALLY BY SDASTP TO
  83. C CONTINUE FROM STEP TO STEP.
  84. C
  85. C-----------------------------------------------------------------------
  86. C***ROUTINES CALLED SDAJAC, SDANRM, SDASLV, SDATRP
  87. C***REVISION HISTORY (YYMMDD)
  88. C 830315 DATE WRITTEN
  89. C 901009 Finished conversion to SLATEC 4.0 format (F.N.Fritsch)
  90. C 901019 Merged changes made by C. Ulrich with SLATEC 4.0 format.
  91. C 901026 Added explicit declarations for all variables and minor
  92. C cosmetic changes to prologue. (FNF)
  93. C***END PROLOGUE SDASTP
  94. C
  95. INTEGER NEQ, JSTART, IDID, IPAR(*), IWM(*), IPHASE, JCALC, K,
  96. * KOLD, NS, NONNEG, NTEMP
  97. REAL X, Y(*), YPRIME(*), H, WT(*), RPAR(*), PHI(NEQ,*), DELTA(*),
  98. * E(*), WM(*), ALPHA(*), BETA(*), GAMMA(*), PSI(*), SIGMA(*), CJ,
  99. * CJOLD, HOLD, S, HMIN, UROUND
  100. EXTERNAL RES, JAC
  101. C
  102. EXTERNAL SDAJAC, SDANRM, SDASLV, SDATRP
  103. REAL SDANRM
  104. C
  105. INTEGER I, IER, IRES, J, J1, KDIFF, KM1, KNEW, KP1, KP2, LCTF,
  106. * LETF, LMXORD, LNJE, LNRE, LNST, M, MAXIT, NCF, NEF, NSF, NSP1
  107. REAL ALPHA0, ALPHAS, CJLAST, CK, DELNRM, ENORM, ERK, ERKM1,
  108. * ERKM2, ERKP1, ERR, EST, HNEW, OLDNRM, PNORM, R, RATE, TEMP1,
  109. * TEMP2, TERK, TERKM1, TERKM2, TERKP1, XOLD, XRATE
  110. LOGICAL CONVGD
  111. C
  112. PARAMETER (LMXORD=3)
  113. PARAMETER (LNST=11)
  114. PARAMETER (LNRE=12)
  115. PARAMETER (LNJE=13)
  116. PARAMETER (LETF=14)
  117. PARAMETER (LCTF=15)
  118. C
  119. DATA MAXIT/4/
  120. DATA XRATE/0.25E0/
  121. C
  122. C
  123. C
  124. C
  125. C
  126. C-----------------------------------------------------------------------
  127. C BLOCK 1.
  128. C INITIALIZE. ON THE FIRST CALL,SET
  129. C THE ORDER TO 1 AND INITIALIZE
  130. C OTHER VARIABLES.
  131. C-----------------------------------------------------------------------
  132. C
  133. C INITIALIZATIONS FOR ALL CALLS
  134. C***FIRST EXECUTABLE STATEMENT SDASTP
  135. IDID=1
  136. XOLD=X
  137. NCF=0
  138. NSF=0
  139. NEF=0
  140. IF(JSTART .NE. 0) GO TO 120
  141. C
  142. C IF THIS IS THE FIRST STEP,PERFORM
  143. C OTHER INITIALIZATIONS
  144. IWM(LETF) = 0
  145. IWM(LCTF) = 0
  146. K=1
  147. KOLD=0
  148. HOLD=0.0E0
  149. JSTART=1
  150. PSI(1)=H
  151. CJOLD = 1.0E0/H
  152. CJ = CJOLD
  153. S = 100.E0
  154. JCALC = -1
  155. DELNRM=1.0E0
  156. IPHASE = 0
  157. NS=0
  158. 120 CONTINUE
  159. C
  160. C
  161. C
  162. C
  163. C
  164. C-----------------------------------------------------------------------
  165. C BLOCK 2
  166. C COMPUTE COEFFICIENTS OF FORMULAS FOR
  167. C THIS STEP.
  168. C-----------------------------------------------------------------------
  169. 200 CONTINUE
  170. KP1=K+1
  171. KP2=K+2
  172. KM1=K-1
  173. XOLD=X
  174. IF(H.NE.HOLD.OR.K .NE. KOLD) NS = 0
  175. NS=MIN(NS+1,KOLD+2)
  176. NSP1=NS+1
  177. IF(KP1 .LT. NS)GO TO 230
  178. C
  179. BETA(1)=1.0E0
  180. ALPHA(1)=1.0E0
  181. TEMP1=H
  182. GAMMA(1)=0.0E0
  183. SIGMA(1)=1.0E0
  184. DO 210 I=2,KP1
  185. TEMP2=PSI(I-1)
  186. PSI(I-1)=TEMP1
  187. BETA(I)=BETA(I-1)*PSI(I-1)/TEMP2
  188. TEMP1=TEMP2+H
  189. ALPHA(I)=H/TEMP1
  190. SIGMA(I)=(I-1)*SIGMA(I-1)*ALPHA(I)
  191. GAMMA(I)=GAMMA(I-1)+ALPHA(I-1)/H
  192. 210 CONTINUE
  193. PSI(KP1)=TEMP1
  194. 230 CONTINUE
  195. C
  196. C COMPUTE ALPHAS, ALPHA0
  197. ALPHAS = 0.0E0
  198. ALPHA0 = 0.0E0
  199. DO 240 I = 1,K
  200. ALPHAS = ALPHAS - 1.0E0/I
  201. ALPHA0 = ALPHA0 - ALPHA(I)
  202. 240 CONTINUE
  203. C
  204. C COMPUTE LEADING COEFFICIENT CJ
  205. CJLAST = CJ
  206. CJ = -ALPHAS/H
  207. C
  208. C COMPUTE VARIABLE STEPSIZE ERROR COEFFICIENT CK
  209. CK = ABS(ALPHA(KP1) + ALPHAS - ALPHA0)
  210. CK = MAX(CK,ALPHA(KP1))
  211. C
  212. C DECIDE WHETHER NEW JACOBIAN IS NEEDED
  213. TEMP1 = (1.0E0 - XRATE)/(1.0E0 + XRATE)
  214. TEMP2 = 1.0E0/TEMP1
  215. IF (CJ/CJOLD .LT. TEMP1 .OR. CJ/CJOLD .GT. TEMP2) JCALC = -1
  216. IF (CJ .NE. CJLAST) S = 100.E0
  217. C
  218. C CHANGE PHI TO PHI STAR
  219. IF(KP1 .LT. NSP1) GO TO 280
  220. DO 270 J=NSP1,KP1
  221. DO 260 I=1,NEQ
  222. 260 PHI(I,J)=BETA(J)*PHI(I,J)
  223. 270 CONTINUE
  224. 280 CONTINUE
  225. C
  226. C UPDATE TIME
  227. X=X+H
  228. C
  229. C
  230. C
  231. C
  232. C
  233. C-----------------------------------------------------------------------
  234. C BLOCK 3
  235. C PREDICT THE SOLUTION AND DERIVATIVE,
  236. C AND SOLVE THE CORRECTOR EQUATION
  237. C-----------------------------------------------------------------------
  238. C
  239. C FIRST,PREDICT THE SOLUTION AND DERIVATIVE
  240. 300 CONTINUE
  241. DO 310 I=1,NEQ
  242. Y(I)=PHI(I,1)
  243. 310 YPRIME(I)=0.0E0
  244. DO 330 J=2,KP1
  245. DO 320 I=1,NEQ
  246. Y(I)=Y(I)+PHI(I,J)
  247. 320 YPRIME(I)=YPRIME(I)+GAMMA(J)*PHI(I,J)
  248. 330 CONTINUE
  249. PNORM = SDANRM (NEQ,Y,WT,RPAR,IPAR)
  250. C
  251. C
  252. C
  253. C SOLVE THE CORRECTOR EQUATION USING A
  254. C MODIFIED NEWTON SCHEME.
  255. CONVGD= .TRUE.
  256. M=0
  257. IWM(LNRE)=IWM(LNRE)+1
  258. IRES = 0
  259. CALL RES(X,Y,YPRIME,DELTA,IRES,RPAR,IPAR)
  260. IF (IRES .LT. 0) GO TO 380
  261. C
  262. C
  263. C IF INDICATED,REEVALUATE THE
  264. C ITERATION MATRIX PD = DG/DY + CJ*DG/DYPRIME
  265. C (WHERE G(X,Y,YPRIME)=0). SET
  266. C JCALC TO 0 AS AN INDICATOR THAT
  267. C THIS HAS BEEN DONE.
  268. IF(JCALC .NE. -1)GO TO 340
  269. IWM(LNJE)=IWM(LNJE)+1
  270. JCALC=0
  271. CALL SDAJAC(NEQ,X,Y,YPRIME,DELTA,CJ,H,
  272. * IER,WT,E,WM,IWM,RES,IRES,UROUND,JAC,RPAR,
  273. * IPAR,NTEMP)
  274. CJOLD=CJ
  275. S = 100.E0
  276. IF (IRES .LT. 0) GO TO 380
  277. IF(IER .NE. 0)GO TO 380
  278. NSF=0
  279. C
  280. C
  281. C INITIALIZE THE ERROR ACCUMULATION VECTOR E.
  282. 340 CONTINUE
  283. DO 345 I=1,NEQ
  284. 345 E(I)=0.0E0
  285. C
  286. C
  287. C CORRECTOR LOOP.
  288. 350 CONTINUE
  289. C
  290. C MULTIPLY RESIDUAL BY TEMP1 TO ACCELERATE CONVERGENCE
  291. TEMP1 = 2.0E0/(1.0E0 + CJ/CJOLD)
  292. DO 355 I = 1,NEQ
  293. 355 DELTA(I) = DELTA(I) * TEMP1
  294. C
  295. C COMPUTE A NEW ITERATE (BACK-SUBSTITUTION).
  296. C STORE THE CORRECTION IN DELTA.
  297. CALL SDASLV(NEQ,DELTA,WM,IWM)
  298. C
  299. C UPDATE Y, E, AND YPRIME
  300. DO 360 I=1,NEQ
  301. Y(I)=Y(I)-DELTA(I)
  302. E(I)=E(I)-DELTA(I)
  303. 360 YPRIME(I)=YPRIME(I)-CJ*DELTA(I)
  304. C
  305. C TEST FOR CONVERGENCE OF THE ITERATION
  306. DELNRM=SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
  307. IF (DELNRM .LE. 100.E0*UROUND*PNORM) GO TO 375
  308. IF (M .GT. 0) GO TO 365
  309. OLDNRM = DELNRM
  310. GO TO 367
  311. 365 RATE = (DELNRM/OLDNRM)**(1.0E0/M)
  312. IF (RATE .GT. 0.90E0) GO TO 370
  313. S = RATE/(1.0E0 - RATE)
  314. 367 IF (S*DELNRM .LE. 0.33E0) GO TO 375
  315. C
  316. C THE CORRECTOR HAS NOT YET CONVERGED.
  317. C UPDATE M AND TEST WHETHER THE
  318. C MAXIMUM NUMBER OF ITERATIONS HAVE
  319. C BEEN TRIED.
  320. M=M+1
  321. IF(M.GE.MAXIT)GO TO 370
  322. C
  323. C EVALUATE THE RESIDUAL
  324. C AND GO BACK TO DO ANOTHER ITERATION
  325. IWM(LNRE)=IWM(LNRE)+1
  326. IRES = 0
  327. CALL RES(X,Y,YPRIME,DELTA,IRES,
  328. * RPAR,IPAR)
  329. IF (IRES .LT. 0) GO TO 380
  330. GO TO 350
  331. C
  332. C
  333. C THE CORRECTOR FAILED TO CONVERGE IN MAXIT
  334. C ITERATIONS. IF THE ITERATION MATRIX
  335. C IS NOT CURRENT,RE-DO THE STEP WITH
  336. C A NEW ITERATION MATRIX.
  337. 370 CONTINUE
  338. IF(JCALC.EQ.0)GO TO 380
  339. JCALC=-1
  340. GO TO 300
  341. C
  342. C
  343. C THE ITERATION HAS CONVERGED. IF NONNEGATIVITY OF SOLUTION IS
  344. C REQUIRED, SET THE SOLUTION NONNEGATIVE, IF THE PERTURBATION
  345. C TO DO IT IS SMALL ENOUGH. IF THE CHANGE IS TOO LARGE, THEN
  346. C CONSIDER THE CORRECTOR ITERATION TO HAVE FAILED.
  347. 375 IF(NONNEG .EQ. 0) GO TO 390
  348. DO 377 I = 1,NEQ
  349. 377 DELTA(I) = MIN(Y(I),0.0E0)
  350. DELNRM = SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
  351. IF(DELNRM .GT. 0.33E0) GO TO 380
  352. DO 378 I = 1,NEQ
  353. 378 E(I) = E(I) - DELTA(I)
  354. GO TO 390
  355. C
  356. C
  357. C EXITS FROM BLOCK 3
  358. C NO CONVERGENCE WITH CURRENT ITERATION
  359. C MATRIX,OR SINGULAR ITERATION MATRIX
  360. 380 CONVGD= .FALSE.
  361. 390 JCALC = 1
  362. IF(.NOT.CONVGD)GO TO 600
  363. C
  364. C
  365. C
  366. C
  367. C
  368. C-----------------------------------------------------------------------
  369. C BLOCK 4
  370. C ESTIMATE THE ERRORS AT ORDERS K,K-1,K-2
  371. C AS IF CONSTANT STEPSIZE WAS USED. ESTIMATE
  372. C THE LOCAL ERROR AT ORDER K AND TEST
  373. C WHETHER THE CURRENT STEP IS SUCCESSFUL.
  374. C-----------------------------------------------------------------------
  375. C
  376. C ESTIMATE ERRORS AT ORDERS K,K-1,K-2
  377. ENORM = SDANRM(NEQ,E,WT,RPAR,IPAR)
  378. ERK = SIGMA(K+1)*ENORM
  379. TERK = (K+1)*ERK
  380. EST = ERK
  381. KNEW=K
  382. IF(K .EQ. 1)GO TO 430
  383. DO 405 I = 1,NEQ
  384. 405 DELTA(I) = PHI(I,KP1) + E(I)
  385. ERKM1=SIGMA(K)*SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
  386. TERKM1 = K*ERKM1
  387. IF(K .GT. 2)GO TO 410
  388. IF(TERKM1 .LE. 0.5E0*TERK)GO TO 420
  389. GO TO 430
  390. 410 CONTINUE
  391. DO 415 I = 1,NEQ
  392. 415 DELTA(I) = PHI(I,K) + DELTA(I)
  393. ERKM2=SIGMA(K-1)*SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
  394. TERKM2 = (K-1)*ERKM2
  395. IF(MAX(TERKM1,TERKM2).GT.TERK)GO TO 430
  396. C LOWER THE ORDER
  397. 420 CONTINUE
  398. KNEW=K-1
  399. EST = ERKM1
  400. C
  401. C
  402. C CALCULATE THE LOCAL ERROR FOR THE CURRENT STEP
  403. C TO SEE IF THE STEP WAS SUCCESSFUL
  404. 430 CONTINUE
  405. ERR = CK * ENORM
  406. IF(ERR .GT. 1.0E0)GO TO 600
  407. C
  408. C
  409. C
  410. C
  411. C
  412. C-----------------------------------------------------------------------
  413. C BLOCK 5
  414. C THE STEP IS SUCCESSFUL. DETERMINE
  415. C THE BEST ORDER AND STEPSIZE FOR
  416. C THE NEXT STEP. UPDATE THE DIFFERENCES
  417. C FOR THE NEXT STEP.
  418. C-----------------------------------------------------------------------
  419. IDID=1
  420. IWM(LNST)=IWM(LNST)+1
  421. KDIFF=K-KOLD
  422. KOLD=K
  423. HOLD=H
  424. C
  425. C
  426. C ESTIMATE THE ERROR AT ORDER K+1 UNLESS:
  427. C ALREADY DECIDED TO LOWER ORDER, OR
  428. C ALREADY USING MAXIMUM ORDER, OR
  429. C STEPSIZE NOT CONSTANT, OR
  430. C ORDER RAISED IN PREVIOUS STEP
  431. IF(KNEW.EQ.KM1.OR.K.EQ.IWM(LMXORD))IPHASE=1
  432. IF(IPHASE .EQ. 0)GO TO 545
  433. IF(KNEW.EQ.KM1)GO TO 540
  434. IF(K.EQ.IWM(LMXORD)) GO TO 550
  435. IF(KP1.GE.NS.OR.KDIFF.EQ.1)GO TO 550
  436. DO 510 I=1,NEQ
  437. 510 DELTA(I)=E(I)-PHI(I,KP2)
  438. ERKP1 = (1.0E0/(K+2))*SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
  439. TERKP1 = (K+2)*ERKP1
  440. IF(K.GT.1)GO TO 520
  441. IF(TERKP1.GE.0.5E0*TERK)GO TO 550
  442. GO TO 530
  443. 520 IF(TERKM1.LE.MIN(TERK,TERKP1))GO TO 540
  444. IF(TERKP1.GE.TERK.OR.K.EQ.IWM(LMXORD))GO TO 550
  445. C
  446. C RAISE ORDER
  447. 530 K=KP1
  448. EST = ERKP1
  449. GO TO 550
  450. C
  451. C LOWER ORDER
  452. 540 K=KM1
  453. EST = ERKM1
  454. GO TO 550
  455. C
  456. C IF IPHASE = 0, INCREASE ORDER BY ONE AND MULTIPLY STEPSIZE BY
  457. C FACTOR TWO
  458. 545 K = KP1
  459. HNEW = H*2.0E0
  460. H = HNEW
  461. GO TO 575
  462. C
  463. C
  464. C DETERMINE THE APPROPRIATE STEPSIZE FOR
  465. C THE NEXT STEP.
  466. 550 HNEW=H
  467. TEMP2=K+1
  468. R=(2.0E0*EST+0.0001E0)**(-1.0E0/TEMP2)
  469. IF(R .LT. 2.0E0) GO TO 555
  470. HNEW = 2.0E0*H
  471. GO TO 560
  472. 555 IF(R .GT. 1.0E0) GO TO 560
  473. R = MAX(0.5E0,MIN(0.9E0,R))
  474. HNEW = H*R
  475. 560 H=HNEW
  476. C
  477. C
  478. C UPDATE DIFFERENCES FOR NEXT STEP
  479. 575 CONTINUE
  480. IF(KOLD.EQ.IWM(LMXORD))GO TO 585
  481. DO 580 I=1,NEQ
  482. 580 PHI(I,KP2)=E(I)
  483. 585 CONTINUE
  484. DO 590 I=1,NEQ
  485. 590 PHI(I,KP1)=PHI(I,KP1)+E(I)
  486. DO 595 J1=2,KP1
  487. J=KP1-J1+1
  488. DO 595 I=1,NEQ
  489. 595 PHI(I,J)=PHI(I,J)+PHI(I,J+1)
  490. RETURN
  491. C
  492. C
  493. C
  494. C
  495. C
  496. C-----------------------------------------------------------------------
  497. C BLOCK 6
  498. C THE STEP IS UNSUCCESSFUL. RESTORE X,PSI,PHI
  499. C DETERMINE APPROPRIATE STEPSIZE FOR
  500. C CONTINUING THE INTEGRATION, OR EXIT WITH
  501. C AN ERROR FLAG IF THERE HAVE BEEN MANY
  502. C FAILURES.
  503. C-----------------------------------------------------------------------
  504. 600 IPHASE = 1
  505. C
  506. C RESTORE X,PHI,PSI
  507. X=XOLD
  508. IF(KP1.LT.NSP1)GO TO 630
  509. DO 620 J=NSP1,KP1
  510. TEMP1=1.0E0/BETA(J)
  511. DO 610 I=1,NEQ
  512. 610 PHI(I,J)=TEMP1*PHI(I,J)
  513. 620 CONTINUE
  514. 630 CONTINUE
  515. DO 640 I=2,KP1
  516. 640 PSI(I-1)=PSI(I)-H
  517. C
  518. C
  519. C TEST WHETHER FAILURE IS DUE TO CORRECTOR ITERATION
  520. C OR ERROR TEST
  521. IF(CONVGD)GO TO 660
  522. IWM(LCTF)=IWM(LCTF)+1
  523. C
  524. C
  525. C THE NEWTON ITERATION FAILED TO CONVERGE WITH
  526. C A CURRENT ITERATION MATRIX. DETERMINE THE CAUSE
  527. C OF THE FAILURE AND TAKE APPROPRIATE ACTION.
  528. IF(IER.EQ.0)GO TO 650
  529. C
  530. C THE ITERATION MATRIX IS SINGULAR. REDUCE
  531. C THE STEPSIZE BY A FACTOR OF 4. IF
  532. C THIS HAPPENS THREE TIMES IN A ROW ON
  533. C THE SAME STEP, RETURN WITH AN ERROR FLAG
  534. NSF=NSF+1
  535. R = 0.25E0
  536. H=H*R
  537. IF (NSF .LT. 3 .AND. ABS(H) .GE. HMIN) GO TO 690
  538. IDID=-8
  539. GO TO 675
  540. C
  541. C
  542. C THE NEWTON ITERATION FAILED TO CONVERGE FOR A REASON
  543. C OTHER THAN A SINGULAR ITERATION MATRIX. IF IRES = -2, THEN
  544. C RETURN. OTHERWISE, REDUCE THE STEPSIZE AND TRY AGAIN, UNLESS
  545. C TOO MANY FAILURES HAVE OCCURRED.
  546. 650 CONTINUE
  547. IF (IRES .GT. -2) GO TO 655
  548. IDID = -11
  549. GO TO 675
  550. 655 NCF = NCF + 1
  551. R = 0.25E0
  552. H = H*R
  553. IF (NCF .LT. 10 .AND. ABS(H) .GE. HMIN) GO TO 690
  554. IDID = -7
  555. IF (IRES .LT. 0) IDID = -10
  556. IF (NEF .GE. 3) IDID = -9
  557. GO TO 675
  558. C
  559. C
  560. C THE NEWTON SCHEME CONVERGED, AND THE CAUSE
  561. C OF THE FAILURE WAS THE ERROR ESTIMATE
  562. C EXCEEDING THE TOLERANCE.
  563. 660 NEF=NEF+1
  564. IWM(LETF)=IWM(LETF)+1
  565. IF (NEF .GT. 1) GO TO 665
  566. C
  567. C ON FIRST ERROR TEST FAILURE, KEEP CURRENT ORDER OR LOWER
  568. C ORDER BY ONE. COMPUTE NEW STEPSIZE BASED ON DIFFERENCES
  569. C OF THE SOLUTION.
  570. K = KNEW
  571. TEMP2 = K + 1
  572. R = 0.90E0*(2.0E0*EST+0.0001E0)**(-1.0E0/TEMP2)
  573. R = MAX(0.25E0,MIN(0.9E0,R))
  574. H = H*R
  575. IF (ABS(H) .GE. HMIN) GO TO 690
  576. IDID = -6
  577. GO TO 675
  578. C
  579. C ON SECOND ERROR TEST FAILURE, USE THE CURRENT ORDER OR
  580. C DECREASE ORDER BY ONE. REDUCE THE STEPSIZE BY A FACTOR OF
  581. C FOUR.
  582. 665 IF (NEF .GT. 2) GO TO 670
  583. K = KNEW
  584. H = 0.25E0*H
  585. IF (ABS(H) .GE. HMIN) GO TO 690
  586. IDID = -6
  587. GO TO 675
  588. C
  589. C ON THIRD AND SUBSEQUENT ERROR TEST FAILURES, SET THE ORDER TO
  590. C ONE AND REDUCE THE STEPSIZE BY A FACTOR OF FOUR.
  591. 670 K = 1
  592. H = 0.25E0*H
  593. IF (ABS(H) .GE. HMIN) GO TO 690
  594. IDID = -6
  595. GO TO 675
  596. C
  597. C
  598. C
  599. C
  600. C FOR ALL CRASHES, RESTORE Y TO ITS LAST VALUE,
  601. C INTERPOLATE TO FIND YPRIME AT LAST X, AND RETURN
  602. 675 CONTINUE
  603. CALL SDATRP(X,X,Y,YPRIME,NEQ,K,PHI,PSI)
  604. RETURN
  605. C
  606. C
  607. C GO BACK AND TRY THIS STEP AGAIN
  608. 690 GO TO 200
  609. C
  610. C------END OF SUBROUTINE SDASTP------
  611. END