ddastp.f 17 KB

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