derkfs.f 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. *DECK DERKFS
  2. SUBROUTINE DERKFS (F, NEQ, T, Y, TOUT, INFO, RTOL, ATOL, IDID, H,
  3. + TOLFAC, YP, F1, F2, F3, F4, F5, YS, TOLD, DTSIGN, U26, RER,
  4. + INIT, KSTEPS, KOP, IQUIT, STIFF, NONSTF, NTSTEP, NSTIFS, RPAR,
  5. + IPAR)
  6. C***BEGIN PROLOGUE DERKFS
  7. C***SUBSIDIARY
  8. C***PURPOSE Subsidiary to DERKF
  9. C***LIBRARY SLATEC
  10. C***TYPE SINGLE PRECISION (DERKFS-S, DRKFS-D)
  11. C***AUTHOR Watts, H. A., (SNLA)
  12. C***DESCRIPTION
  13. C
  14. C Fehlberg Fourth-Fifth order Runge-Kutta Method
  15. C **********************************************************************
  16. C
  17. C DERKFS integrates a system of first order ordinary differential
  18. C equations as described in the comments for DERKF .
  19. C
  20. C The arrays YP,F1,F2,F3,F4,F5,and YS (of length at least NEQ)
  21. C appear in the call list for variable dimensioning purposes.
  22. C
  23. C The variables H,TOLFAC,TOLD,DTSIGN,U26,RER,INIT,KSTEPS,KOP,IQUIT,
  24. C STIFF,NONSTF,NTSTEP, and NSTIFS are used internally by the code
  25. C and appear in the call list to eliminate local retention of
  26. C variables between calls. Accordingly, these variables and the
  27. C array YP should not be altered.
  28. C Items of possible interest are
  29. C H - An appropriate step size to be used for the next step
  30. C TOLFAC - Factor of change in the tolerances
  31. C YP - Derivative of solution vector at T
  32. C KSTEPS - Counter on the number of steps attempted
  33. C
  34. C **********************************************************************
  35. C
  36. C***SEE ALSO DERKF
  37. C***ROUTINES CALLED DEFEHL, HSTART, HVNRM, R1MACH, XERMSG
  38. C***REVISION HISTORY (YYMMDD)
  39. C 800501 DATE WRITTEN
  40. C 890531 Changed all specific intrinsics to generic. (WRB)
  41. C 890831 Modified array declarations. (WRB)
  42. C 891024 Changed references from VNORM to HVNRM. (WRB)
  43. C 891024 REVISION DATE from Version 3.2
  44. C 891214 Prologue converted to Version 4.0 format. (BAB)
  45. C 900328 Added TYPE section. (WRB)
  46. C 900510 Convert XERRWV calls to XERMSG calls, replace GOTOs with
  47. C IF-THEN-ELSEs. (RWC)
  48. C 910722 Updated AUTHOR section. (ALS)
  49. C***END PROLOGUE DERKFS
  50. C
  51. LOGICAL HFAILD,OUTPUT,STIFF,NONSTF
  52. CHARACTER*8 XERN1
  53. CHARACTER*16 XERN3, XERN4
  54. C
  55. DIMENSION Y(*),YP(*),F1(*),F2(*),F3(*),F4(*),F5(*),
  56. 1 YS(*),INFO(15),RTOL(*),ATOL(*),RPAR(*),IPAR(*)
  57. C
  58. EXTERNAL F
  59. C
  60. C.......................................................................
  61. C
  62. C A FIFTH ORDER METHOD WILL GENERALLY NOT BE CAPABLE OF DELIVERING
  63. C ACCURACIES NEAR LIMITING PRECISION ON COMPUTERS WITH LONG
  64. C WORDLENGTHS. TO PROTECT AGAINST LIMITING PRECISION DIFFICULTIES
  65. C ARISING FROM UNREASONABLE ACCURACY REQUESTS, AN APPROPRIATE
  66. C TOLERANCE THRESHOLD REMIN IS ASSIGNED FOR THIS METHOD. THIS VALUE
  67. C SHOULD NOT BE CHANGED ACROSS DIFFERENT MACHINES.
  68. C
  69. SAVE REMIN, MXSTEP, MXKOP
  70. DATA REMIN/1.E-12/
  71. C
  72. C.......................................................................
  73. C
  74. C THE EXPENSE OF SOLVING THE PROBLEM IS MONITORED BY COUNTING THE
  75. C NUMBER OF STEPS ATTEMPTED. WHEN THIS EXCEEDS MXSTEP, THE COUNTER
  76. C IS RESET TO ZERO AND THE USER IS INFORMED ABOUT POSSIBLE EXCESSIVE
  77. C WORK.
  78. C
  79. DATA MXSTEP/500/
  80. C
  81. C.......................................................................
  82. C
  83. C INEFFICIENCY CAUSED BY TOO FREQUENT OUTPUT IS MONITORED BY COUNTING
  84. C THE NUMBER OF STEP SIZES WHICH ARE SEVERELY SHORTENED DUE SOLELY TO
  85. C THE CHOICE OF OUTPUT POINTS. WHEN THE NUMBER OF ABUSES EXCEED MXKOP,
  86. C THE COUNTER IS RESET TO ZERO AND THE USER IS INFORMED ABOUT POSSIBLE
  87. C MISUSE OF THE CODE.
  88. C
  89. DATA MXKOP/100/
  90. C
  91. C.......................................................................
  92. C
  93. C***FIRST EXECUTABLE STATEMENT DERKFS
  94. IF (INFO(1) .EQ. 0) THEN
  95. C
  96. C ON THE FIRST CALL , PERFORM INITIALIZATION --
  97. C DEFINE THE MACHINE UNIT ROUNDOFF QUANTITY U BY CALLING THE
  98. C FUNCTION ROUTINE R1MACH. THE USER MUST MAKE SURE THAT THE
  99. C VALUES SET IN R1MACH ARE RELEVANT TO THE COMPUTER BEING USED.
  100. C
  101. U = R1MACH(4)
  102. C -- SET ASSOCIATED MACHINE DEPENDENT PARAMETERS
  103. U26 = 26.*U
  104. RER = 2.*U+REMIN
  105. C -- SET TERMINATION FLAG
  106. IQUIT = 0
  107. C -- SET INITIALIZATION INDICATOR
  108. INIT = 0
  109. C -- SET COUNTER FOR IMPACT OF OUTPUT POINTS
  110. KOP = 0
  111. C -- SET COUNTER FOR ATTEMPTED STEPS
  112. KSTEPS = 0
  113. C -- SET INDICATORS FOR STIFFNESS DETECTION
  114. STIFF = .FALSE.
  115. NONSTF = .FALSE.
  116. C -- SET STEP COUNTERS FOR STIFFNESS DETECTION
  117. NTSTEP = 0
  118. NSTIFS = 0
  119. C -- RESET INFO(1) FOR SUBSEQUENT CALLS
  120. INFO(1) = 1
  121. ENDIF
  122. C
  123. C.......................................................................
  124. C
  125. C CHECK VALIDITY OF INPUT PARAMETERS ON EACH ENTRY
  126. C
  127. IF (INFO(1) .NE. 0 .AND. INFO(1) .NE. 1) THEN
  128. WRITE (XERN1, '(I8)') INFO(1)
  129. CALL XERMSG ('SLATEC', 'DERKFS',
  130. * 'IN DERKF, INFO(1) MUST BE SET TO 0 ' //
  131. * 'FOR THE START OF A NEW PROBLEM, AND MUST BE SET TO 1 ' //
  132. * 'FOLLOWING AN INTERRUPTED TASK. YOU ARE ATTEMPTING TO ' //
  133. * 'CONTINUE THE INTEGRATION ILLEGALLY BY CALLING THE CODE ' //
  134. * 'WITH INFO(1) = ' // XERN1, 3, 1)
  135. IDID = -33
  136. ENDIF
  137. C
  138. IF (INFO(2) .NE. 0 .AND. INFO(2) .NE. 1) THEN
  139. WRITE (XERN1, '(I8)') INFO(2)
  140. CALL XERMSG ('SLATEC', 'DERKFS',
  141. * 'IN DERKF, INFO(2) MUST BE 0 OR 1 INDICATING SCALAR ' //
  142. * 'AND VECTOR ERROR TOLERANCES, RESPECTIVELY. YOU HAVE ' //
  143. * 'CALLED THE CODE WITH INFO(2) = ' // XERN1, 4, 1)
  144. IDID = -33
  145. ENDIF
  146. C
  147. IF (INFO(3) .NE. 0 .AND. INFO(3) .NE. 1) THEN
  148. WRITE (XERN1, '(I8)') INFO(3)
  149. CALL XERMSG ('SLATEC', 'DERKFS',
  150. * 'IN DERKF, INFO(3) MUST BE 0 OR 1 INDICATING THE ' //
  151. * 'OR INTERMEDIATE-OUTPUT MODE OF INTEGRATION, ' //
  152. * 'RESPECTIVELY. YOU HAVE CALLED THE CODE ' //
  153. * 'WITH INFO(3) = ' // XERN1, 5, 1)
  154. IDID = -33
  155. ENDIF
  156. C
  157. IF (NEQ .LT. 1) THEN
  158. WRITE (XERN1, '(I8)') NEQ
  159. CALL XERMSG ('SLATEC', 'DERKFS',
  160. * 'IN DERKF, THE NUMBER OF EQUATIONS NEQ MUST BE A ' //
  161. * 'POSITIVE INTEGER. YOU HAVE CALLED THE ' //
  162. * 'CODE WITH NEQ = ' // XERN1, 6, 1)
  163. IDID = -33
  164. ENDIF
  165. C
  166. NRTOLP = 0
  167. NATOLP = 0
  168. DO 10 K=1,NEQ
  169. IF (NRTOLP .EQ. 0 .AND. RTOL(K) .LT. 0.D0) THEN
  170. WRITE (XERN1, '(I8)') K
  171. WRITE (XERN3, '(1PE15.6)') RTOL(K)
  172. CALL XERMSG ('SLATEC', 'DERKFS',
  173. * 'IN DERKF, THE RELATIVE ERROR ' //
  174. * 'TOLERANCES RTOL MUST BE NON-NEGATIVE. YOU HAVE ' //
  175. * 'CALLED THE CODE WITH RTOL(' // XERN1 // ') = ' //
  176. * XERN3 // '. IN THE CASE OF VECTOR ERROR TOLERANCES, ' //
  177. * 'NO FURTHER CHECKING OF RTOL COMPONENTS IS DONE.', 7, 1)
  178. IDID = -33
  179. NRTOLP = 1
  180. ENDIF
  181. C
  182. IF (NATOLP .EQ. 0 .AND. ATOL(K) .LT. 0.D0) THEN
  183. WRITE (XERN1, '(I8)') K
  184. WRITE (XERN3, '(1PE15.6)') ATOL(K)
  185. CALL XERMSG ('SLATEC', 'DERKFS',
  186. * 'IN DERKF, THE ABSOLUTE ERROR ' //
  187. * 'TOLERANCES ATOL MUST BE NON-NEGATIVE. YOU HAVE ' //
  188. * 'CALLED THE CODE WITH ATOL(' // XERN1 // ') = ' //
  189. * XERN3 // '. IN THE CASE OF VECTOR ERROR TOLERANCES, ' //
  190. * 'NO FURTHER CHECKING OF ATOL COMPONENTS IS DONE.', 8, 1)
  191. IDID = -33
  192. NATOLP = 1
  193. ENDIF
  194. C
  195. IF (INFO(2) .EQ. 0) GO TO 20
  196. IF (NATOLP.GT.0 .AND. NRTOLP.GT.0) GO TO 20
  197. 10 CONTINUE
  198. C
  199. C
  200. C CHECK SOME CONTINUATION POSSIBILITIES
  201. C
  202. 20 IF (INIT .NE. 0) THEN
  203. IF (T .EQ. TOUT) THEN
  204. WRITE (XERN3, '(1PE15.6)') T
  205. CALL XERMSG ('SLATEC', 'DERKFS',
  206. * 'IN DERKF, YOU HAVE CALLED THE ' //
  207. * 'CODE WITH T = TOUT = ' // XERN3 // '$$THIS IS NOT ' //
  208. * 'ALLOWED ON CONTINUATION CALLS.', 9, 1)
  209. IDID=-33
  210. ENDIF
  211. C
  212. IF (T .NE. TOLD) THEN
  213. WRITE (XERN3, '(1PE15.6)') TOLD
  214. WRITE (XERN4, '(1PE15.6)') T
  215. CALL XERMSG ('SLATEC', 'DERKFS',
  216. * 'IN DERKF, YOU HAVE CHANGED THE ' //
  217. * 'VALUE OF T FROM ' // XERN3 // ' TO ' // XERN4 //
  218. * '$$THIS IS NOT ALLOWED ON CONTINUATION CALLS.', 10, 1)
  219. IDID=-33
  220. ENDIF
  221. C
  222. IF (INIT .NE. 1) THEN
  223. IF (DTSIGN*(TOUT-T) .LT. 0.D0) THEN
  224. WRITE (XERN3, '(1PE15.6)') TOUT
  225. CALL XERMSG ('SLATEC', 'DERKFS',
  226. * 'IN DERKF, BY CALLING THE CODE ' //
  227. * 'WITH TOUT = ' // XERN3 // ' YOU ARE ATTEMPTING ' //
  228. * 'TO CHANGE THE DIRECTION OF INTEGRATION.$$THIS IS ' //
  229. * 'NOT ALLOWED WITHOUT RESTARTING.', 11, 1)
  230. IDID=-33
  231. ENDIF
  232. ENDIF
  233. ENDIF
  234. C
  235. C INVALID INPUT DETECTED
  236. C
  237. IF (IDID .EQ. (-33)) THEN
  238. IF (IQUIT .NE. (-33)) THEN
  239. IQUIT = -33
  240. GOTO 909
  241. ELSE
  242. CALL XERMSG ('SLATEC', 'DERKFS',
  243. * 'IN DERKF, INVALID INPUT WAS ' //
  244. * 'DETECTED ON SUCCESSIVE ENTRIES. IT IS IMPOSSIBLE ' //
  245. * 'TO PROCEED BECAUSE YOU HAVE NOT CORRECTED THE ' //
  246. * 'PROBLEM, SO EXECUTION IS BEING TERMINATED.', 12, 2)
  247. RETURN
  248. ENDIF
  249. ENDIF
  250. C
  251. C.......................................................................
  252. C
  253. C RTOL = ATOL = 0. IS ALLOWED AS VALID INPUT AND INTERPRETED AS
  254. C ASKING FOR THE MOST ACCURATE SOLUTION POSSIBLE. IN THIS CASE,
  255. C THE RELATIVE ERROR TOLERANCE RTOL IS RESET TO THE SMALLEST VALUE
  256. C RER WHICH IS LIKELY TO BE REASONABLE FOR THIS METHOD AND MACHINE.
  257. C
  258. DO 50 K=1,NEQ
  259. IF (RTOL(K)+ATOL(K) .GT. 0.) GO TO 45
  260. RTOL(K)=RER
  261. IDID=-2
  262. 45 IF (INFO(2) .EQ. 0) GO TO 55
  263. 50 CONTINUE
  264. C
  265. 55 IF (IDID .NE. (-2)) GO TO 60
  266. C
  267. C RTOL=ATOL=0 ON INPUT, SO RTOL WAS CHANGED TO A
  268. C SMALL POSITIVE VALUE
  269. TOLFAC=1.
  270. GO TO 909
  271. C
  272. C BRANCH ON STATUS OF INITIALIZATION INDICATOR
  273. C INIT=0 MEANS INITIAL DERIVATIVES AND STARTING STEP SIZE
  274. C NOT YET COMPUTED
  275. C INIT=1 MEANS STARTING STEP SIZE NOT YET COMPUTED
  276. C INIT=2 MEANS NO FURTHER INITIALIZATION REQUIRED
  277. C
  278. 60 IF (INIT .EQ. 0) GO TO 65
  279. IF (INIT .EQ. 1) GO TO 70
  280. GO TO 80
  281. C
  282. C.......................................................................
  283. C
  284. C MORE INITIALIZATION --
  285. C -- EVALUATE INITIAL DERIVATIVES
  286. C
  287. 65 INIT=1
  288. A=T
  289. CALL F(A,Y,YP,RPAR,IPAR)
  290. IF (T .EQ. TOUT) GO TO 666
  291. C
  292. C -- SET SIGN OF INTEGRATION DIRECTION AND
  293. C -- ESTIMATE STARTING STEP SIZE
  294. C
  295. 70 INIT=2
  296. DTSIGN=SIGN(1.,TOUT-T)
  297. U=R1MACH(4)
  298. BIG=SQRT(R1MACH(2))
  299. UTE=U**0.375
  300. DY=UTE*HVNRM(Y,NEQ)
  301. IF (DY .EQ. 0.) DY=UTE
  302. KTOL=1
  303. DO 75 K=1,NEQ
  304. IF (INFO(2) .EQ. 1) KTOL=K
  305. TOL=RTOL(KTOL)*ABS(Y(K))+ATOL(KTOL)
  306. IF (TOL .EQ. 0.) TOL=DY*RTOL(KTOL)
  307. 75 F1(K)=TOL
  308. C
  309. CALL HSTART (F,NEQ,T,TOUT,Y,YP,F1,4,U,BIG,F2,F3,F4,F5,RPAR,IPAR,H)
  310. C
  311. C.......................................................................
  312. C
  313. C SET STEP SIZE FOR INTEGRATION IN THE DIRECTION FROM T TO TOUT
  314. C AND SET OUTPUT POINT INDICATOR
  315. C
  316. 80 DT=TOUT-T
  317. H=SIGN(H,DT)
  318. OUTPUT= .FALSE.
  319. C
  320. C TEST TO SEE IF DERKF IS BEING SEVERELY IMPACTED BY TOO MANY
  321. C OUTPUT POINTS
  322. C
  323. IF (ABS(H) .GE. 2.*ABS(DT)) KOP=KOP+1
  324. IF (KOP .LE. MXKOP) GO TO 85
  325. C
  326. C UNNECESSARY FREQUENCY OF OUTPUT IS RESTRICTING
  327. C THE STEP SIZE CHOICE
  328. IDID=-5
  329. KOP=0
  330. GO TO 909
  331. C
  332. 85 IF (ABS(DT) .GT. U26*ABS(T)) GO TO 100
  333. C
  334. C IF TOO CLOSE TO OUTPUT POINT,EXTRAPOLATE AND RETURN
  335. C
  336. DO 90 K=1,NEQ
  337. 90 Y(K)=Y(K)+DT*YP(K)
  338. A=TOUT
  339. CALL F(A,Y,YP,RPAR,IPAR)
  340. KSTEPS=KSTEPS+1
  341. GO TO 666
  342. C
  343. C **********************************************************************
  344. C **********************************************************************
  345. C STEP BY STEP INTEGRATION
  346. C
  347. 100 HFAILD= .FALSE.
  348. C
  349. C TO PROTECT AGAINST IMPOSSIBLE ACCURACY REQUESTS, COMPUTE A
  350. C TOLERANCE FACTOR BASED ON THE REQUESTED ERROR TOLERANCE AND A
  351. C LEVEL OF ACCURACY ACHIEVABLE AT LIMITING PRECISION
  352. C
  353. TOLFAC=0.
  354. KTOL=1
  355. DO 125 K=1,NEQ
  356. IF (INFO(2) .EQ. 1) KTOL=K
  357. ET=RTOL(KTOL)*ABS(Y(K))+ATOL(KTOL)
  358. IF (ET .GT. 0.) GO TO 120
  359. TOLFAC=MAX(TOLFAC,RER/RTOL(KTOL))
  360. GO TO 125
  361. 120 TOLFAC=MAX(TOLFAC,ABS(Y(K))*(RER/ET))
  362. 125 CONTINUE
  363. IF (TOLFAC .LE. 1.) GO TO 150
  364. C
  365. C REQUESTED ERROR UNATTAINABLE DUE TO LIMITED
  366. C PRECISION AVAILABLE
  367. TOLFAC=2.*TOLFAC
  368. IDID=-2
  369. GO TO 909
  370. C
  371. C SET SMALLEST ALLOWABLE STEP SIZE
  372. C
  373. 150 HMIN=U26*ABS(T)
  374. C
  375. C ADJUST STEP SIZE IF NECESSARY TO HIT THE OUTPUT POINT --
  376. C LOOK AHEAD TWO STEPS TO AVOID DRASTIC CHANGES IN THE STEP SIZE AND
  377. C THUS LESSEN THE IMPACT OF OUTPUT POINTS ON THE CODE.
  378. C STRETCH THE STEP SIZE BY, AT MOST, AN AMOUNT EQUAL TO THE
  379. C SAFETY FACTOR OF 9/10.
  380. C
  381. DT=TOUT-T
  382. IF (ABS(DT) .GE. 2.*ABS(H)) GO TO 200
  383. IF (ABS(DT) .GT. ABS(H)/0.9) GO TO 175
  384. C
  385. C THE NEXT STEP, IF SUCCESSFUL, WILL COMPLETE THE INTEGRATION TO
  386. C THE OUTPUT POINT
  387. C
  388. OUTPUT= .TRUE.
  389. H=DT
  390. GO TO 200
  391. C
  392. 175 H=0.5*DT
  393. C
  394. C
  395. C **********************************************************************
  396. C CORE INTEGRATOR FOR TAKING A SINGLE STEP
  397. C **********************************************************************
  398. C TO AVOID PROBLEMS WITH ZERO CROSSINGS, RELATIVE ERROR IS MEASURED
  399. C USING THE AVERAGE OF THE MAGNITUDES OF THE SOLUTION AT THE
  400. C BEGINNING AND END OF A STEP.
  401. C THE ERROR ESTIMATE FORMULA HAS BEEN GROUPED TO CONTROL LOSS OF
  402. C SIGNIFICANCE.
  403. C LOCAL ERROR ESTIMATES FOR A FIRST ORDER METHOD USING THE SAME
  404. C STEP SIZE AS THE FEHLBERG METHOD ARE CALCULATED AS PART OF THE
  405. C TEST FOR STIFFNESS.
  406. C TO DISTINGUISH THE VARIOUS ARGUMENTS, H IS NOT PERMITTED
  407. C TO BECOME SMALLER THAN 26 UNITS OF ROUNDOFF IN T.
  408. C PRACTICAL LIMITS ON THE CHANGE IN THE STEP SIZE ARE ENFORCED TO
  409. C SMOOTH THE STEP SIZE SELECTION PROCESS AND TO AVOID EXCESSIVE
  410. C CHATTERING ON PROBLEMS HAVING DISCONTINUITIES.
  411. C TO PREVENT UNNECESSARY FAILURES, THE CODE USES 9/10 THE STEP SIZE
  412. C IT ESTIMATES WILL SUCCEED.
  413. C AFTER A STEP FAILURE, THE STEP SIZE IS NOT ALLOWED TO INCREASE FOR
  414. C THE NEXT ATTEMPTED STEP. THIS MAKES THE CODE MORE EFFICIENT ON
  415. C PROBLEMS HAVING DISCONTINUITIES AND MORE EFFECTIVE IN GENERAL
  416. C SINCE LOCAL EXTRAPOLATION IS BEING USED AND EXTRA CAUTION SEEMS
  417. C WARRANTED.
  418. C.......................................................................
  419. C
  420. C MONITOR NUMBER OF STEPS ATTEMPTED
  421. C
  422. 200 IF (KSTEPS .LE. MXSTEP) GO TO 222
  423. C
  424. C A SIGNIFICANT AMOUNT OF WORK HAS BEEN EXPENDED
  425. IDID=-1
  426. KSTEPS=0
  427. IF (.NOT. STIFF) GO TO 909
  428. C
  429. C PROBLEM APPEARS TO BE STIFF
  430. IDID=-4
  431. STIFF= .FALSE.
  432. NONSTF= .FALSE.
  433. NTSTEP=0
  434. NSTIFS=0
  435. GO TO 909
  436. C
  437. C ADVANCE AN APPROXIMATE SOLUTION OVER ONE STEP OF LENGTH H
  438. C
  439. 222 CALL DEFEHL(F,NEQ,T,Y,H,YP,F1,F2,F3,F4,F5,YS,RPAR,IPAR)
  440. KSTEPS=KSTEPS+1
  441. C
  442. C.......................................................................
  443. C
  444. C COMPUTE AND TEST ALLOWABLE TOLERANCES VERSUS LOCAL ERROR
  445. C ESTIMATES. NOTE THAT RELATIVE ERROR IS MEASURED WITH RESPECT TO
  446. C THE AVERAGE OF THE MAGNITUDES OF THE SOLUTION AT THE BEGINNING
  447. C AND END OF THE STEP.
  448. C LOCAL ERROR ESTIMATES FOR A SPECIAL FIRST ORDER METHOD ARE
  449. C CALCULATED ONLY WHEN THE STIFFNESS DETECTION IS TURNED ON.
  450. C
  451. EEOET=0.
  452. ESTIFF=0.
  453. KTOL=1
  454. DO 350 K=1,NEQ
  455. YAVG=0.5*(ABS(Y(K))+ABS(YS(K)))
  456. IF (INFO(2) .EQ. 1) KTOL=K
  457. ET=RTOL(KTOL)*YAVG+ATOL(KTOL)
  458. IF (ET .GT. 0.) GO TO 325
  459. C
  460. C PURE RELATIVE ERROR INAPPROPRIATE WHEN SOLUTION
  461. C VANISHES
  462. IDID=-3
  463. GO TO 909
  464. C
  465. 325 EE=ABS((-2090.*YP(K)+(21970.*F3(K)-15048.*F4(K)))+
  466. 1 (22528.*F2(K)-27360.*F5(K)))
  467. IF (STIFF .OR. NONSTF) GO TO 350
  468. ES=ABS(H*(0.055455*YP(K)-0.035493*F1(K)-0.036571*F2(K)+
  469. 1 0.023107*F3(K)-0.009515*F4(K)+0.003017*F5(K)))
  470. ESTIFF=MAX(ESTIFF,ES/ET)
  471. 350 EEOET=MAX(EEOET,EE/ET)
  472. C
  473. ESTTOL=ABS(H)*EEOET/752400.
  474. C
  475. IF (ESTTOL .LE. 1.) GO TO 500
  476. C
  477. C.......................................................................
  478. C
  479. C UNSUCCESSFUL STEP
  480. C
  481. IF (ABS(H) .GT. HMIN) GO TO 400
  482. C
  483. C REQUESTED ERROR UNATTAINABLE AT SMALLEST
  484. C ALLOWABLE STEP SIZE
  485. TOLFAC=1.69*ESTTOL
  486. IDID=-2
  487. GO TO 909
  488. C
  489. C REDUCE THE STEP SIZE , TRY AGAIN
  490. C THE DECREASE IS LIMITED TO A FACTOR OF 1/10
  491. C
  492. 400 HFAILD= .TRUE.
  493. OUTPUT= .FALSE.
  494. S=0.1
  495. IF (ESTTOL .LT. 59049.) S=0.9/ESTTOL**0.2
  496. H=SIGN(MAX(S*ABS(H),HMIN),H)
  497. GO TO 200
  498. C
  499. C.......................................................................
  500. C
  501. C SUCCESSFUL STEP
  502. C STORE SOLUTION AT T+H
  503. C AND EVALUATE DERIVATIVES THERE
  504. C
  505. 500 T=T+H
  506. DO 525 K=1,NEQ
  507. 525 Y(K)=YS(K)
  508. A=T
  509. CALL F(A,Y,YP,RPAR,IPAR)
  510. C
  511. C CHOOSE NEXT STEP SIZE
  512. C THE INCREASE IS LIMITED TO A FACTOR OF 5
  513. C IF STEP FAILURE HAS JUST OCCURRED, NEXT
  514. C STEP SIZE IS NOT ALLOWED TO INCREASE
  515. C
  516. S=5.
  517. IF (ESTTOL .GT. 1.889568E-4) S=0.9/ESTTOL**0.2
  518. IF (HFAILD) S=MIN(S,1.)
  519. H=SIGN(MAX(S*ABS(H),HMIN),H)
  520. C
  521. C.......................................................................
  522. C
  523. C CHECK FOR STIFFNESS (IF NOT ALREADY DETECTED)
  524. C
  525. C IN A SEQUENCE OF 50 SUCCESSFUL STEPS BY THE FEHLBERG METHOD, 25
  526. C SUCCESSFUL STEPS BY THE FIRST ORDER METHOD INDICATES STIFFNESS
  527. C AND TURNS THE TEST OFF. IF 26 FAILURES BY THE FIRST ORDER METHOD
  528. C OCCUR, THE TEST IS TURNED OFF UNTIL THIS SEQUENCE OF 50 STEPS
  529. C BY THE FEHLBERG METHOD IS COMPLETED.
  530. C
  531. IF (STIFF) GO TO 600
  532. NTSTEP=MOD(NTSTEP+1,50)
  533. IF (NTSTEP .EQ. 1) NONSTF= .FALSE.
  534. IF (NONSTF) GO TO 600
  535. IF (ESTIFF .GT. 1.) GO TO 550
  536. C
  537. C SUCCESSFUL STEP WITH FIRST ORDER METHOD
  538. NSTIFS=NSTIFS+1
  539. C TURN TEST OFF AFTER 25 INDICATIONS OF STIFFNESS
  540. IF (NSTIFS .EQ. 25) STIFF= .TRUE.
  541. GO TO 600
  542. C
  543. C UNSUCCESSFUL STEP WITH FIRST ORDER METHOD
  544. 550 IF (NTSTEP-NSTIFS .LE. 25) GO TO 600
  545. C TURN STIFFNESS DETECTION OFF FOR THIS BLOCK OF
  546. C FIFTY STEPS
  547. NONSTF= .TRUE.
  548. C RESET STIFF STEP COUNTER
  549. NSTIFS=0
  550. C
  551. C **********************************************************************
  552. C END OF CORE INTEGRATOR
  553. C **********************************************************************
  554. C
  555. C
  556. C SHOULD WE TAKE ANOTHER STEP
  557. C
  558. 600 IF (OUTPUT) GO TO 666
  559. IF (INFO(3) .EQ. 0) GO TO 100
  560. C
  561. C **********************************************************************
  562. C **********************************************************************
  563. C
  564. C INTEGRATION SUCCESSFULLY COMPLETED
  565. C
  566. C ONE-STEP MODE
  567. IDID=1
  568. TOLD=T
  569. RETURN
  570. C
  571. C INTERVAL MODE
  572. 666 IDID=2
  573. T=TOUT
  574. TOLD=T
  575. RETURN
  576. C
  577. C INTEGRATION TASK INTERRUPTED
  578. C
  579. 909 INFO(1)=-1
  580. TOLD=T
  581. IF (IDID .NE. (-2)) RETURN
  582. C
  583. C THE ERROR TOLERANCES ARE INCREASED TO VALUES
  584. C WHICH ARE APPROPRIATE FOR CONTINUING
  585. RTOL(1)=TOLFAC*RTOL(1)
  586. ATOL(1)=TOLFAC*ATOL(1)
  587. IF (INFO(2) .EQ. 0) RETURN
  588. DO 939 K=2,NEQ
  589. RTOL(K)=TOLFAC*RTOL(K)
  590. 939 ATOL(K)=TOLFAC*ATOL(K)
  591. RETURN
  592. END