drkfs.f 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. *DECK DRKFS
  2. SUBROUTINE DRKFS (DF, 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 DRKFS
  7. C***SUBSIDIARY
  8. C***PURPOSE Subsidiary to DDERKF
  9. C***LIBRARY SLATEC
  10. C***TYPE DOUBLE 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 DRKFS integrates a system of first order ordinary differential
  18. C equations as described in the comments for DDERKF .
  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 DDERKF
  37. C***ROUTINES CALLED D1MACH, DFEHL, DHSTRT, DHVNRM, XERMSG
  38. C***REVISION HISTORY (YYMMDD)
  39. C 820301 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 DVNORM to DHVNRM. (WRB)
  43. C 891214 Prologue converted to Version 4.0 format. (BAB)
  44. C 900328 Added TYPE section. (WRB)
  45. C 900510 Convert XERRWV calls to XERMSG calls, change GOTOs to
  46. C IF-THEN-ELSEs. (RWC)
  47. C 910722 Updated AUTHOR section. (ALS)
  48. C***END PROLOGUE DRKFS
  49. C
  50. INTEGER IDID, INFO, INIT, IPAR, IQUIT, K, KOP, KSTEPS, KTOL,
  51. 1 MXKOP, MXSTEP, NATOLP, NEQ, NRTOLP, NSTIFS, NTSTEP
  52. DOUBLE PRECISION A, ATOL, BIG, D1MACH,
  53. 1 DT, DTSIGN, DHVNRM, DY, EE, EEOET, ES, ESTIFF,
  54. 2 ESTTOL, ET, F1, F2, F3, F4, F5, H, HMIN, REMIN, RER, RPAR,
  55. 3 RTOL, S, T, TOL, TOLD, TOLFAC, TOUT, U, U26, UTE, Y, YAVG,
  56. 4 YP, YS
  57. LOGICAL HFAILD,OUTPUT,STIFF,NONSTF
  58. CHARACTER*8 XERN1
  59. CHARACTER*16 XERN3, XERN4
  60. C
  61. DIMENSION Y(*),YP(*),F1(*),F2(*),F3(*),F4(*),F5(*),
  62. 1 YS(*),INFO(15),RTOL(*),ATOL(*),RPAR(*),IPAR(*)
  63. C
  64. EXTERNAL DF
  65. C
  66. C ..................................................................
  67. C
  68. C A FIFTH ORDER METHOD WILL GENERALLY NOT BE CAPABLE OF DELIVERING
  69. C ACCURACIES NEAR LIMITING PRECISION ON COMPUTERS WITH LONG
  70. C WORDLENGTHS. TO PROTECT AGAINST LIMITING PRECISION DIFFICULTIES
  71. C ARISING FROM UNREASONABLE ACCURACY REQUESTS, AN APPROPRIATE
  72. C TOLERANCE THRESHOLD REMIN IS ASSIGNED FOR THIS METHOD. THIS
  73. C VALUE SHOULD NOT BE CHANGED ACROSS DIFFERENT MACHINES.
  74. C
  75. SAVE REMIN, MXSTEP, MXKOP
  76. DATA REMIN /1.0D-12/
  77. C
  78. C ..................................................................
  79. C
  80. C THE EXPENSE OF SOLVING THE PROBLEM IS MONITORED BY COUNTING THE
  81. C NUMBER OF STEPS ATTEMPTED. WHEN THIS EXCEEDS MXSTEP, THE
  82. C COUNTER IS RESET TO ZERO AND THE USER IS INFORMED ABOUT POSSIBLE
  83. C EXCESSIVE WORK.
  84. C
  85. DATA MXSTEP /500/
  86. C
  87. C ..................................................................
  88. C
  89. C INEFFICIENCY CAUSED BY TOO FREQUENT OUTPUT IS MONITORED BY
  90. C COUNTING THE NUMBER OF STEP SIZES WHICH ARE SEVERELY SHORTENED
  91. C DUE SOLELY TO THE CHOICE OF OUTPUT POINTS. WHEN THE NUMBER OF
  92. C ABUSES EXCEED MXKOP, THE COUNTER IS RESET TO ZERO AND THE USER
  93. C IS INFORMED ABOUT POSSIBLE MISUSE OF THE CODE.
  94. C
  95. DATA MXKOP /100/
  96. C
  97. C ..................................................................
  98. C
  99. C***FIRST EXECUTABLE STATEMENT DRKFS
  100. IF (INFO(1) .EQ. 0) THEN
  101. C
  102. C ON THE FIRST CALL , PERFORM INITIALIZATION --
  103. C DEFINE THE MACHINE UNIT ROUNDOFF QUANTITY U BY CALLING THE
  104. C FUNCTION ROUTINE D1MACH. THE USER MUST MAKE SURE THAT THE
  105. C VALUES SET IN D1MACH ARE RELEVANT TO THE COMPUTER BEING USED.
  106. C
  107. U = D1MACH(4)
  108. C -- SET ASSOCIATED MACHINE DEPENDENT PARAMETERS
  109. U26 = 26.0D0*U
  110. RER = 2.0D0*U + REMIN
  111. C -- SET TERMINATION FLAG
  112. IQUIT = 0
  113. C -- SET INITIALIZATION INDICATOR
  114. INIT = 0
  115. C -- SET COUNTER FOR IMPACT OF OUTPUT POINTS
  116. KOP = 0
  117. C -- SET COUNTER FOR ATTEMPTED STEPS
  118. KSTEPS = 0
  119. C -- SET INDICATORS FOR STIFFNESS DETECTION
  120. STIFF = .FALSE.
  121. NONSTF = .FALSE.
  122. C -- SET STEP COUNTERS FOR STIFFNESS DETECTION
  123. NTSTEP = 0
  124. NSTIFS = 0
  125. C -- RESET INFO(1) FOR SUBSEQUENT CALLS
  126. INFO(1) = 1
  127. ENDIF
  128. C
  129. C.......................................................................
  130. C
  131. C CHECK VALIDITY OF INPUT PARAMETERS ON EACH ENTRY
  132. C
  133. IF (INFO(1) .NE. 0 .AND. INFO(1) .NE. 1) THEN
  134. WRITE (XERN1, '(I8)') INFO(1)
  135. CALL XERMSG ('SLATEC', 'DRKFS',
  136. * 'IN DDERKF, INFO(1) MUST BE SET TO 0 ' //
  137. * 'FOR THE START OF A NEW PROBLEM, AND MUST BE SET TO 1 ' //
  138. * 'FOLLOWING AN INTERRUPTED TASK. YOU ARE ATTEMPTING TO ' //
  139. * 'CONTINUE THE INTEGRATION ILLEGALLY BY CALLING THE CODE ' //
  140. * 'WITH INFO(1) = ' // XERN1, 3, 1)
  141. IDID = -33
  142. ENDIF
  143. C
  144. IF (INFO(2) .NE. 0 .AND. INFO(2) .NE. 1) THEN
  145. WRITE (XERN1, '(I8)') INFO(2)
  146. CALL XERMSG ('SLATEC', 'DRKFS',
  147. * 'IN DDERKF, INFO(2) MUST BE 0 OR 1 ' //
  148. * 'INDICATING SCALAR AND VECTOR ERROR TOLERANCES, ' //
  149. * 'RESPECTIVELY. YOU HAVE CALLED THE CODE WITH INFO(2) = ' //
  150. * XERN1, 4, 1)
  151. IDID = -33
  152. ENDIF
  153. C
  154. IF (INFO(3) .NE. 0 .AND. INFO(3) .NE. 1) THEN
  155. WRITE (XERN1, '(I8)') INFO(3)
  156. CALL XERMSG ('SLATEC', 'DRKFS',
  157. * 'IN DDERKF, INFO(3) MUST BE 0 OR 1 ' //
  158. * 'INDICATING THE INTERVAL OR INTERMEDIATE-OUTPUT MODE OF ' //
  159. * 'INTEGRATION, RESPECTIVELY. YOU HAVE CALLED THE CODE ' //
  160. * 'WITH INFO(3) = ' // XERN1, 5, 1)
  161. IDID = -33
  162. ENDIF
  163. C
  164. IF (NEQ .LT. 1) THEN
  165. WRITE (XERN1, '(I8)') NEQ
  166. CALL XERMSG ('SLATEC', 'DRKFS',
  167. * 'IN DDERKF, THE NUMBER OF EQUATIONS ' //
  168. * 'NEQ MUST BE A POSITIVE INTEGER. YOU HAVE CALLED THE ' //
  169. * 'CODE WITH NEQ = ' // XERN1, 6, 1)
  170. IDID = -33
  171. ENDIF
  172. C
  173. NRTOLP = 0
  174. NATOLP = 0
  175. DO 10 K=1,NEQ
  176. IF (NRTOLP .EQ. 0 .AND. RTOL(K) .LT. 0.D0) THEN
  177. WRITE (XERN1, '(I8)') K
  178. WRITE (XERN3, '(1PE15.6)') RTOL(K)
  179. CALL XERMSG ('SLATEC', 'DRKFS',
  180. * 'IN DDERKF, THE RELATIVE ERROR ' //
  181. * 'TOLERANCES RTOL MUST BE NON-NEGATIVE. YOU HAVE ' //
  182. * 'CALLED THE CODE WITH RTOL(' // XERN1 // ') = ' //
  183. * XERN3 // '. IN THE CASE OF VECTOR ERROR TOLERANCES, ' //
  184. * 'NO FURTHER CHECKING OF RTOL COMPONENTS IS DONE.', 7, 1)
  185. IDID = -33
  186. NRTOLP = 1
  187. ENDIF
  188. C
  189. IF (NATOLP .EQ. 0 .AND. ATOL(K) .LT. 0.D0) THEN
  190. WRITE (XERN1, '(I8)') K
  191. WRITE (XERN3, '(1PE15.6)') ATOL(K)
  192. CALL XERMSG ('SLATEC', 'DRKFS',
  193. * 'IN DDERKF, THE ABSOLUTE ERROR ' //
  194. * 'TOLERANCES ATOL MUST BE NON-NEGATIVE. YOU HAVE ' //
  195. * 'CALLED THE CODE WITH ATOL(' // XERN1 // ') = ' //
  196. * XERN3 // '. IN THE CASE OF VECTOR ERROR TOLERANCES, ' //
  197. * 'NO FURTHER CHECKING OF ATOL COMPONENTS IS DONE.', 8, 1)
  198. IDID = -33
  199. NATOLP = 1
  200. ENDIF
  201. C
  202. IF (INFO(2) .EQ. 0) GO TO 20
  203. IF (NATOLP.GT.0 .AND. NRTOLP.GT.0) GO TO 20
  204. 10 CONTINUE
  205. C
  206. C
  207. C CHECK SOME CONTINUATION POSSIBILITIES
  208. C
  209. 20 IF (INIT .NE. 0) THEN
  210. IF (T .EQ. TOUT) THEN
  211. WRITE (XERN3, '(1PE15.6)') T
  212. CALL XERMSG ('SLATEC', 'DRKFS',
  213. * 'IN DDERKF, YOU HAVE CALLED THE ' //
  214. * 'CODE WITH T = TOUT = ' // XERN3 // '$$THIS IS NOT ' //
  215. * 'ALLOWED ON CONTINUATION CALLS.', 9, 1)
  216. IDID=-33
  217. ENDIF
  218. C
  219. IF (T .NE. TOLD) THEN
  220. WRITE (XERN3, '(1PE15.6)') TOLD
  221. WRITE (XERN4, '(1PE15.6)') T
  222. CALL XERMSG ('SLATEC', 'DRKFS',
  223. * 'IN DDERKF, YOU HAVE CHANGED THE ' //
  224. * 'VALUE OF T FROM ' // XERN3 // ' TO ' // XERN4 //
  225. * '$$THIS IS NOT ALLOWED ON CONTINUATION CALLS.', 10, 1)
  226. IDID=-33
  227. ENDIF
  228. C
  229. IF (INIT .NE. 1) THEN
  230. IF (DTSIGN*(TOUT-T) .LT. 0.D0) THEN
  231. WRITE (XERN3, '(1PE15.6)') TOUT
  232. CALL XERMSG ('SLATEC', 'DRKFS',
  233. * 'IN DDERKF, BY CALLING THE CODE WITH TOUT = ' //
  234. * XERN3 // ' YOU ARE ATTEMPTING TO CHANGE THE ' //
  235. * 'DIRECTION OF INTEGRATION.$$THIS IS NOT ALLOWED ' //
  236. * 'WITHOUT RESTARTING.', 11, 1)
  237. IDID=-33
  238. ENDIF
  239. ENDIF
  240. ENDIF
  241. C
  242. C INVALID INPUT DETECTED
  243. C
  244. IF (IDID .EQ. (-33)) THEN
  245. IF (IQUIT .NE. (-33)) THEN
  246. IQUIT = -33
  247. GOTO 540
  248. ELSE
  249. CALL XERMSG ('SLATEC', 'DRKFS',
  250. * 'IN DDERKF, INVALID INPUT WAS ' //
  251. * 'DETECTED ON SUCCESSIVE ENTRIES. IT IS IMPOSSIBLE ' //
  252. * 'TO PROCEED BECAUSE YOU HAVE NOT CORRECTED THE ' //
  253. * 'PROBLEM, SO EXECUTION IS BEING TERMINATED.', 12, 2)
  254. RETURN
  255. ENDIF
  256. ENDIF
  257. C
  258. C ............................................................
  259. C
  260. C RTOL = ATOL = 0. IS ALLOWED AS VALID INPUT AND
  261. C INTERPRETED AS ASKING FOR THE MOST ACCURATE SOLUTION
  262. C POSSIBLE. IN THIS CASE, THE RELATIVE ERROR TOLERANCE
  263. C RTOL IS RESET TO THE SMALLEST VALUE RER WHICH IS LIKELY
  264. C TO BE REASONABLE FOR THIS METHOD AND MACHINE.
  265. C
  266. DO 190 K = 1, NEQ
  267. IF (RTOL(K) + ATOL(K) .GT. 0.0D0) GO TO 180
  268. RTOL(K) = RER
  269. IDID = -2
  270. 180 CONTINUE
  271. C ...EXIT
  272. IF (INFO(2) .EQ. 0) GO TO 200
  273. 190 CONTINUE
  274. 200 CONTINUE
  275. C
  276. IF (IDID .NE. (-2)) GO TO 210
  277. C
  278. C RTOL=ATOL=0 ON INPUT, SO RTOL WAS CHANGED TO A
  279. C SMALL POSITIVE VALUE
  280. TOLFAC = 1.0D0
  281. GO TO 530
  282. 210 CONTINUE
  283. C
  284. C BRANCH ON STATUS OF INITIALIZATION INDICATOR
  285. C INIT=0 MEANS INITIAL DERIVATIVES AND
  286. C STARTING STEP SIZE
  287. C NOT YET COMPUTED
  288. C INIT=1 MEANS STARTING STEP SIZE NOT YET
  289. C COMPUTED INIT=2 MEANS NO FURTHER
  290. C INITIALIZATION REQUIRED
  291. C
  292. IF (INIT .EQ. 0) GO TO 220
  293. C ......EXIT
  294. IF (INIT .EQ. 1) GO TO 240
  295. C .........EXIT
  296. GO TO 260
  297. 220 CONTINUE
  298. C
  299. C ................................................
  300. C
  301. C MORE INITIALIZATION --
  302. C -- EVALUATE INITIAL
  303. C DERIVATIVES
  304. C
  305. INIT = 1
  306. A = T
  307. CALL DF(A,Y,YP,RPAR,IPAR)
  308. IF (T .NE. TOUT) GO TO 230
  309. C
  310. C INTERVAL MODE
  311. IDID = 2
  312. T = TOUT
  313. TOLD = T
  314. C .....................EXIT
  315. GO TO 560
  316. 230 CONTINUE
  317. 240 CONTINUE
  318. C
  319. C -- SET SIGN OF INTEGRATION DIRECTION AND
  320. C -- ESTIMATE STARTING STEP SIZE
  321. C
  322. INIT = 2
  323. DTSIGN = SIGN(1.0D0,TOUT-T)
  324. U = D1MACH(4)
  325. BIG = SQRT(D1MACH(2))
  326. UTE = U**0.375D0
  327. DY = UTE*DHVNRM(Y,NEQ)
  328. IF (DY .EQ. 0.0D0) DY = UTE
  329. KTOL = 1
  330. DO 250 K = 1, NEQ
  331. IF (INFO(2) .EQ. 1) KTOL = K
  332. TOL = RTOL(KTOL)*ABS(Y(K)) + ATOL(KTOL)
  333. IF (TOL .EQ. 0.0D0) TOL = DY*RTOL(KTOL)
  334. F1(K) = TOL
  335. 250 CONTINUE
  336. C
  337. CALL DHSTRT(DF,NEQ,T,TOUT,Y,YP,F1,4,U,BIG,F2,F3,F4,
  338. 1 F5,RPAR,IPAR,H)
  339. 260 CONTINUE
  340. C
  341. C ......................................................
  342. C
  343. C SET STEP SIZE FOR INTEGRATION IN THE DIRECTION
  344. C FROM T TO TOUT AND SET OUTPUT POINT INDICATOR
  345. C
  346. DT = TOUT - T
  347. H = SIGN(H,DT)
  348. OUTPUT = .FALSE.
  349. C
  350. C TEST TO SEE IF DDERKF IS BEING SEVERELY IMPACTED BY
  351. C TOO MANY OUTPUT POINTS
  352. C
  353. IF (ABS(H) .GE. 2.0D0*ABS(DT)) KOP = KOP + 1
  354. IF (KOP .LE. MXKOP) GO TO 270
  355. C
  356. C UNNECESSARY FREQUENCY OF OUTPUT IS RESTRICTING
  357. C THE STEP SIZE CHOICE
  358. IDID = -5
  359. KOP = 0
  360. GO TO 510
  361. 270 CONTINUE
  362. C
  363. IF (ABS(DT) .GT. U26*ABS(T)) GO TO 290
  364. C
  365. C IF TOO CLOSE TO OUTPUT POINT,EXTRAPOLATE AND
  366. C RETURN
  367. C
  368. DO 280 K = 1, NEQ
  369. Y(K) = Y(K) + DT*YP(K)
  370. 280 CONTINUE
  371. A = TOUT
  372. CALL DF(A,Y,YP,RPAR,IPAR)
  373. KSTEPS = KSTEPS + 1
  374. GO TO 500
  375. 290 CONTINUE
  376. C BEGIN BLOCK PERMITTING ...EXITS TO 490
  377. C
  378. C *********************************************
  379. C *********************************************
  380. C STEP BY STEP INTEGRATION
  381. C
  382. 300 CONTINUE
  383. C BEGIN BLOCK PERMITTING ...EXITS TO 480
  384. HFAILD = .FALSE.
  385. C
  386. C TO PROTECT AGAINST IMPOSSIBLE ACCURACY
  387. C REQUESTS, COMPUTE A TOLERANCE FACTOR
  388. C BASED ON THE REQUESTED ERROR TOLERANCE
  389. C AND A LEVEL OF ACCURACY ACHIEVABLE AT
  390. C LIMITING PRECISION
  391. C
  392. TOLFAC = 0.0D0
  393. KTOL = 1
  394. DO 330 K = 1, NEQ
  395. IF (INFO(2) .EQ. 1) KTOL = K
  396. ET = RTOL(KTOL)*ABS(Y(K))
  397. 1 + ATOL(KTOL)
  398. IF (ET .GT. 0.0D0) GO TO 310
  399. TOLFAC = MAX(TOLFAC,
  400. 1 RER/RTOL(KTOL))
  401. GO TO 320
  402. 310 CONTINUE
  403. TOLFAC = MAX(TOLFAC,
  404. 1 ABS(Y(K))
  405. 2 *(RER/ET))
  406. 320 CONTINUE
  407. 330 CONTINUE
  408. IF (TOLFAC .LE. 1.0D0) GO TO 340
  409. C
  410. C REQUESTED ERROR UNATTAINABLE DUE TO LIMITED
  411. C PRECISION AVAILABLE
  412. TOLFAC = 2.0D0*TOLFAC
  413. IDID = -2
  414. C .....................EXIT
  415. GO TO 520
  416. 340 CONTINUE
  417. C
  418. C SET SMALLEST ALLOWABLE STEP SIZE
  419. C
  420. HMIN = U26*ABS(T)
  421. C
  422. C ADJUST STEP SIZE IF NECESSARY TO HIT
  423. C THE OUTPUT POINT -- LOOK AHEAD TWO
  424. C STEPS TO AVOID DRASTIC CHANGES IN THE
  425. C STEP SIZE AND THUS LESSEN THE IMPACT OF
  426. C OUTPUT POINTS ON THE CODE. STRETCH THE
  427. C STEP SIZE BY, AT MOST, AN AMOUNT EQUAL
  428. C TO THE SAFETY FACTOR OF 9/10.
  429. C
  430. DT = TOUT - T
  431. IF (ABS(DT) .GE. 2.0D0*ABS(H))
  432. 1 GO TO 370
  433. IF (ABS(DT) .GT. ABS(H)/0.9D0)
  434. 1 GO TO 350
  435. C
  436. C THE NEXT STEP, IF SUCCESSFUL,
  437. C WILL COMPLETE THE INTEGRATION TO
  438. C THE OUTPUT POINT
  439. C
  440. OUTPUT = .TRUE.
  441. H = DT
  442. GO TO 360
  443. 350 CONTINUE
  444. C
  445. H = 0.5D0*DT
  446. 360 CONTINUE
  447. 370 CONTINUE
  448. C
  449. C
  450. C ***************************************
  451. C CORE INTEGRATOR FOR TAKING A
  452. C SINGLE STEP
  453. C ***************************************
  454. C TO AVOID PROBLEMS WITH ZERO
  455. C CROSSINGS, RELATIVE ERROR IS
  456. C MEASURED USING THE AVERAGE OF THE
  457. C MAGNITUDES OF THE SOLUTION AT THE
  458. C BEGINNING AND END OF A STEP.
  459. C THE ERROR ESTIMATE FORMULA HAS
  460. C BEEN GROUPED TO CONTROL LOSS OF
  461. C SIGNIFICANCE.
  462. C LOCAL ERROR ESTIMATES FOR A FIRST
  463. C ORDER METHOD USING THE SAME
  464. C STEP SIZE AS THE FEHLBERG METHOD
  465. C ARE CALCULATED AS PART OF THE
  466. C TEST FOR STIFFNESS.
  467. C TO DISTINGUISH THE VARIOUS
  468. C ARGUMENTS, H IS NOT PERMITTED
  469. C TO BECOME SMALLER THAN 26 UNITS OF
  470. C ROUNDOFF IN T. PRACTICAL LIMITS
  471. C ON THE CHANGE IN THE STEP SIZE ARE
  472. C ENFORCED TO SMOOTH THE STEP SIZE
  473. C SELECTION PROCESS AND TO AVOID
  474. C EXCESSIVE CHATTERING ON PROBLEMS
  475. C HAVING DISCONTINUITIES. TO
  476. C PREVENT UNNECESSARY FAILURES, THE
  477. C CODE USES 9/10 THE STEP SIZE
  478. C IT ESTIMATES WILL SUCCEED.
  479. C AFTER A STEP FAILURE, THE STEP
  480. C SIZE IS NOT ALLOWED TO INCREASE
  481. C FOR THE NEXT ATTEMPTED STEP. THIS
  482. C MAKES THE CODE MORE EFFICIENT ON
  483. C PROBLEMS HAVING DISCONTINUITIES
  484. C AND MORE EFFECTIVE IN GENERAL
  485. C SINCE LOCAL EXTRAPOLATION IS BEING
  486. C USED AND EXTRA CAUTION SEEMS
  487. C WARRANTED.
  488. C .......................................
  489. C
  490. C MONITOR NUMBER OF STEPS ATTEMPTED
  491. C
  492. 380 CONTINUE
  493. IF (KSTEPS .LE. MXSTEP) GO TO 390
  494. C
  495. C A SIGNIFICANT AMOUNT OF WORK HAS
  496. C BEEN EXPENDED
  497. IDID = -1
  498. KSTEPS = 0
  499. C ........................EXIT
  500. IF (.NOT.STIFF) GO TO 520
  501. C
  502. C PROBLEM APPEARS TO BE STIFF
  503. IDID = -4
  504. STIFF = .FALSE.
  505. NONSTF = .FALSE.
  506. NTSTEP = 0
  507. NSTIFS = 0
  508. C ........................EXIT
  509. GO TO 520
  510. 390 CONTINUE
  511. C
  512. C ADVANCE AN APPROXIMATE SOLUTION OVER
  513. C ONE STEP OF LENGTH H
  514. C
  515. CALL DFEHL(DF,NEQ,T,Y,H,YP,F1,F2,F3,
  516. 1 F4,F5,YS,RPAR,IPAR)
  517. KSTEPS = KSTEPS + 1
  518. C
  519. C ....................................
  520. C
  521. C COMPUTE AND TEST ALLOWABLE
  522. C TOLERANCES VERSUS LOCAL ERROR
  523. C ESTIMATES. NOTE THAT RELATIVE
  524. C ERROR IS MEASURED WITH RESPECT
  525. C TO THE AVERAGE OF THE
  526. C MAGNITUDES OF THE SOLUTION AT
  527. C THE BEGINNING AND END OF THE
  528. C STEP. LOCAL ERROR ESTIMATES
  529. C FOR A SPECIAL FIRST ORDER
  530. C METHOD ARE CALCULATED ONLY WHEN
  531. C THE STIFFNESS DETECTION IS
  532. C TURNED ON.
  533. C
  534. EEOET = 0.0D0
  535. ESTIFF = 0.0D0
  536. KTOL = 1
  537. DO 420 K = 1, NEQ
  538. YAVG = 0.5D0
  539. 1 *(ABS(Y(K))
  540. 2 + ABS(YS(K)))
  541. IF (INFO(2) .EQ. 1) KTOL = K
  542. ET = RTOL(KTOL)*YAVG + ATOL(KTOL)
  543. IF (ET .GT. 0.0D0) GO TO 400
  544. C
  545. C PURE RELATIVE ERROR INAPPROPRIATE WHEN SOLUTION
  546. C VANISHES
  547. IDID = -3
  548. C ...........................EXIT
  549. GO TO 520
  550. 400 CONTINUE
  551. C
  552. EE = ABS((-2090.0D0*YP(K)
  553. 1 +(21970.0D0*F3(K)
  554. 2 -15048.0D0*F4(K)))
  555. 3 +(22528.0D0*F2(K)
  556. 4 -27360.0D0*F5(K)))
  557. IF (STIFF .OR. NONSTF) GO TO 410
  558. ES = ABS(H
  559. 1 *(0.055455D0*YP(K)
  560. 2 -0.035493D0*F1(K)
  561. 3 -0.036571D0*F2(K)
  562. 4 +0.023107D0*F3(K)
  563. 5 -0.009515D0*F4(K)
  564. 6 +0.003017D0*F5(K))
  565. 7 )
  566. ESTIFF = MAX(ESTIFF,ES/ET)
  567. 410 CONTINUE
  568. EEOET = MAX(EEOET,EE/ET)
  569. 420 CONTINUE
  570. C
  571. ESTTOL = ABS(H)*EEOET/752400.0D0
  572. C
  573. C ...EXIT
  574. IF (ESTTOL .LE. 1.0D0) GO TO 440
  575. C
  576. C ....................................
  577. C
  578. C UNSUCCESSFUL STEP
  579. C
  580. IF (ABS(H) .GT. HMIN) GO TO 430
  581. C
  582. C REQUESTED ERROR UNATTAINABLE AT SMALLEST
  583. C ALLOWABLE STEP SIZE
  584. TOLFAC = 1.69D0*ESTTOL
  585. IDID = -2
  586. C ........................EXIT
  587. GO TO 520
  588. 430 CONTINUE
  589. C
  590. C REDUCE THE STEP SIZE , TRY AGAIN
  591. C THE DECREASE IS LIMITED TO A FACTOR
  592. C OF 1/10
  593. C
  594. HFAILD = .TRUE.
  595. OUTPUT = .FALSE.
  596. S = 0.1D0
  597. IF (ESTTOL .LT. 59049.0D0)
  598. 1 S = 0.9D0/ESTTOL**0.2D0
  599. H = SIGN(MAX(S*ABS(H),HMIN),H)
  600. GO TO 380
  601. 440 CONTINUE
  602. C
  603. C .......................................
  604. C
  605. C SUCCESSFUL STEP
  606. C STORE SOLUTION AT T+H
  607. C AND EVALUATE
  608. C DERIVATIVES THERE
  609. C
  610. T = T + H
  611. DO 450 K = 1, NEQ
  612. Y(K) = YS(K)
  613. 450 CONTINUE
  614. A = T
  615. CALL DF(A,Y,YP,RPAR,IPAR)
  616. C
  617. C CHOOSE NEXT STEP SIZE
  618. C THE INCREASE IS LIMITED TO A FACTOR OF
  619. C 5 IF STEP FAILURE HAS JUST OCCURRED,
  620. C NEXT
  621. C STEP SIZE IS NOT ALLOWED TO INCREASE
  622. C
  623. S = 5.0D0
  624. IF (ESTTOL .GT. 1.889568D-4)
  625. 1 S = 0.9D0/ESTTOL**0.2D0
  626. IF (HFAILD) S = MIN(S,1.0D0)
  627. H = SIGN(MAX(S*ABS(H),HMIN),H)
  628. C
  629. C .......................................
  630. C
  631. C CHECK FOR STIFFNESS (IF NOT
  632. C ALREADY DETECTED)
  633. C
  634. C IN A SEQUENCE OF 50 SUCCESSFUL
  635. C STEPS BY THE FEHLBERG METHOD, 25
  636. C SUCCESSFUL STEPS BY THE FIRST
  637. C ORDER METHOD INDICATES STIFFNESS
  638. C AND TURNS THE TEST OFF. IF 26
  639. C FAILURES BY THE FIRST ORDER METHOD
  640. C OCCUR, THE TEST IS TURNED OFF
  641. C UNTIL THIS SEQUENCE OF 50 STEPS BY
  642. C THE FEHLBERG METHOD IS COMPLETED.
  643. C
  644. C ...EXIT
  645. IF (STIFF) GO TO 480
  646. NTSTEP = MOD(NTSTEP+1,50)
  647. IF (NTSTEP .EQ. 1) NONSTF = .FALSE.
  648. C ...EXIT
  649. IF (NONSTF) GO TO 480
  650. IF (ESTIFF .GT. 1.0D0) GO TO 460
  651. C
  652. C SUCCESSFUL STEP WITH FIRST ORDER
  653. C METHOD
  654. NSTIFS = NSTIFS + 1
  655. C TURN TEST OFF AFTER 25 INDICATIONS
  656. C OF STIFFNESS
  657. IF (NSTIFS .EQ. 25) STIFF = .TRUE.
  658. GO TO 470
  659. 460 CONTINUE
  660. C
  661. C UNSUCCESSFUL STEP WITH FIRST ORDER
  662. C METHOD
  663. IF (NTSTEP - NSTIFS .LE. 25) GO TO 470
  664. C TURN STIFFNESS DETECTION OFF FOR THIS BLOCK OF
  665. C FIFTY STEPS
  666. NONSTF = .TRUE.
  667. C RESET STIFF STEP COUNTER
  668. NSTIFS = 0
  669. 470 CONTINUE
  670. 480 CONTINUE
  671. C
  672. C ******************************************
  673. C END OF CORE INTEGRATOR
  674. C ******************************************
  675. C
  676. C
  677. C SHOULD WE TAKE ANOTHER STEP
  678. C
  679. C ......EXIT
  680. IF (OUTPUT) GO TO 490
  681. IF (INFO(3) .EQ. 0) GO TO 300
  682. C
  683. C *********************************************
  684. C *********************************************
  685. C
  686. C INTEGRATION SUCCESSFULLY COMPLETED
  687. C
  688. C ONE-STEP MODE
  689. IDID = 1
  690. TOLD = T
  691. C .....................EXIT
  692. GO TO 560
  693. 490 CONTINUE
  694. 500 CONTINUE
  695. C
  696. C INTERVAL MODE
  697. IDID = 2
  698. T = TOUT
  699. TOLD = T
  700. C ...............EXIT
  701. GO TO 560
  702. 510 CONTINUE
  703. 520 CONTINUE
  704. 530 CONTINUE
  705. 540 CONTINUE
  706. C
  707. C INTEGRATION TASK INTERRUPTED
  708. C
  709. INFO(1) = -1
  710. TOLD = T
  711. C ...EXIT
  712. IF (IDID .NE. (-2)) GO TO 560
  713. C
  714. C THE ERROR TOLERANCES ARE INCREASED TO VALUES
  715. C WHICH ARE APPROPRIATE FOR CONTINUING
  716. RTOL(1) = TOLFAC*RTOL(1)
  717. ATOL(1) = TOLFAC*ATOL(1)
  718. C ...EXIT
  719. IF (INFO(2) .EQ. 0) GO TO 560
  720. DO 550 K = 2, NEQ
  721. RTOL(K) = TOLFAC*RTOL(K)
  722. ATOL(K) = TOLFAC*ATOL(K)
  723. 550 CONTINUE
  724. 560 CONTINUE
  725. RETURN
  726. END