ddaini.f 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. *DECK DDAINI
  2. SUBROUTINE DDAINI (X, Y, YPRIME, NEQ, RES, JAC, H, WT, IDID, RPAR,
  3. * IPAR, PHI, DELTA, E, WM, IWM, HMIN, UROUND, NONNEG, NTEMP)
  4. C***BEGIN PROLOGUE DDAINI
  5. C***SUBSIDIARY
  6. C***PURPOSE Initialization routine for DDASSL.
  7. C***LIBRARY SLATEC (DASSL)
  8. C***TYPE DOUBLE PRECISION (SDAINI-S, DDAINI-D)
  9. C***AUTHOR Petzold, Linda R., (LLNL)
  10. C***DESCRIPTION
  11. C-----------------------------------------------------------------
  12. C DDAINI TAKES ONE STEP OF SIZE H OR SMALLER
  13. C WITH THE BACKWARD EULER METHOD, TO
  14. C FIND YPRIME. X AND Y ARE UPDATED TO BE CONSISTENT WITH THE
  15. C NEW STEP. A MODIFIED DAMPED NEWTON ITERATION IS USED TO
  16. C SOLVE THE CORRECTOR ITERATION.
  17. C
  18. C THE INITIAL GUESS FOR YPRIME IS USED IN THE
  19. C PREDICTION, AND IN FORMING THE ITERATION
  20. C MATRIX, BUT IS NOT INVOLVED IN THE
  21. C ERROR TEST. THIS MAY HAVE TROUBLE
  22. C CONVERGING IF THE INITIAL GUESS IS NO
  23. C GOOD, OR IF G(X,Y,YPRIME) DEPENDS
  24. C NONLINEARLY ON YPRIME.
  25. C
  26. C THE PARAMETERS REPRESENT:
  27. C X -- INDEPENDENT VARIABLE
  28. C Y -- SOLUTION VECTOR AT X
  29. C YPRIME -- DERIVATIVE OF SOLUTION VECTOR
  30. C NEQ -- NUMBER OF EQUATIONS
  31. C H -- STEPSIZE. IMDER MAY USE A STEPSIZE
  32. C SMALLER THAN H.
  33. C WT -- VECTOR OF WEIGHTS FOR ERROR
  34. C CRITERION
  35. C IDID -- COMPLETION CODE WITH THE FOLLOWING MEANINGS
  36. C IDID= 1 -- YPRIME WAS FOUND SUCCESSFULLY
  37. C IDID=-12 -- DDAINI FAILED TO FIND YPRIME
  38. C RPAR,IPAR -- REAL AND INTEGER PARAMETER ARRAYS
  39. C THAT ARE NOT ALTERED BY DDAINI
  40. C PHI -- WORK SPACE FOR DDAINI
  41. C DELTA,E -- WORK SPACE FOR DDAINI
  42. C WM,IWM -- REAL AND INTEGER ARRAYS STORING
  43. C MATRIX INFORMATION
  44. C
  45. C-----------------------------------------------------------------
  46. C***ROUTINES CALLED DDAJAC, DDANRM, DDASLV
  47. C***REVISION HISTORY (YYMMDD)
  48. C 830315 DATE WRITTEN
  49. C 901009 Finished conversion to SLATEC 4.0 format (F.N.Fritsch)
  50. C 901019 Merged changes made by C. Ulrich with SLATEC 4.0 format.
  51. C 901026 Added explicit declarations for all variables and minor
  52. C cosmetic changes to prologue. (FNF)
  53. C 901030 Minor corrections to declarations. (FNF)
  54. C***END PROLOGUE DDAINI
  55. C
  56. INTEGER NEQ, IDID, IPAR(*), IWM(*), NONNEG, NTEMP
  57. DOUBLE PRECISION
  58. * X, Y(*), YPRIME(*), H, WT(*), RPAR(*), PHI(NEQ,*), DELTA(*),
  59. * E(*), WM(*), HMIN, UROUND
  60. EXTERNAL RES, JAC
  61. C
  62. EXTERNAL DDAJAC, DDANRM, DDASLV
  63. DOUBLE PRECISION DDANRM
  64. C
  65. INTEGER I, IER, IRES, JCALC, LNJE, LNRE, M, MAXIT, MJAC, NCF,
  66. * NEF, NSF
  67. DOUBLE PRECISION
  68. * CJ, DAMP, DELNRM, ERR, OLDNRM, R, RATE, S, XOLD, YNORM
  69. LOGICAL CONVGD
  70. C
  71. PARAMETER (LNRE=12)
  72. PARAMETER (LNJE=13)
  73. C
  74. DATA MAXIT/10/,MJAC/5/
  75. DATA DAMP/0.75D0/
  76. C
  77. C
  78. C---------------------------------------------------
  79. C BLOCK 1.
  80. C INITIALIZATIONS.
  81. C---------------------------------------------------
  82. C
  83. C***FIRST EXECUTABLE STATEMENT DDAINI
  84. IDID=1
  85. NEF=0
  86. NCF=0
  87. NSF=0
  88. XOLD=X
  89. YNORM=DDANRM(NEQ,Y,WT,RPAR,IPAR)
  90. C
  91. C SAVE Y AND YPRIME IN PHI
  92. DO 100 I=1,NEQ
  93. PHI(I,1)=Y(I)
  94. 100 PHI(I,2)=YPRIME(I)
  95. C
  96. C
  97. C----------------------------------------------------
  98. C BLOCK 2.
  99. C DO ONE BACKWARD EULER STEP.
  100. C----------------------------------------------------
  101. C
  102. C SET UP FOR START OF CORRECTOR ITERATION
  103. 200 CJ=1.0D0/H
  104. X=X+H
  105. C
  106. C PREDICT SOLUTION AND DERIVATIVE
  107. DO 250 I=1,NEQ
  108. 250 Y(I)=Y(I)+H*YPRIME(I)
  109. C
  110. JCALC=-1
  111. M=0
  112. CONVGD=.TRUE.
  113. C
  114. C
  115. C CORRECTOR LOOP.
  116. 300 IWM(LNRE)=IWM(LNRE)+1
  117. IRES=0
  118. C
  119. CALL RES(X,Y,YPRIME,DELTA,IRES,RPAR,IPAR)
  120. IF (IRES.LT.0) GO TO 430
  121. C
  122. C
  123. C EVALUATE THE ITERATION MATRIX
  124. IF (JCALC.NE.-1) GO TO 310
  125. IWM(LNJE)=IWM(LNJE)+1
  126. JCALC=0
  127. CALL DDAJAC(NEQ,X,Y,YPRIME,DELTA,CJ,H,
  128. * IER,WT,E,WM,IWM,RES,IRES,
  129. * UROUND,JAC,RPAR,IPAR,NTEMP)
  130. C
  131. S=1000000.D0
  132. IF (IRES.LT.0) GO TO 430
  133. IF (IER.NE.0) GO TO 430
  134. NSF=0
  135. C
  136. C
  137. C
  138. C MULTIPLY RESIDUAL BY DAMPING FACTOR
  139. 310 CONTINUE
  140. DO 320 I=1,NEQ
  141. 320 DELTA(I)=DELTA(I)*DAMP
  142. C
  143. C COMPUTE A NEW ITERATE (BACK SUBSTITUTION)
  144. C STORE THE CORRECTION IN DELTA
  145. C
  146. CALL DDASLV(NEQ,DELTA,WM,IWM)
  147. C
  148. C UPDATE Y AND YPRIME
  149. DO 330 I=1,NEQ
  150. Y(I)=Y(I)-DELTA(I)
  151. 330 YPRIME(I)=YPRIME(I)-CJ*DELTA(I)
  152. C
  153. C TEST FOR CONVERGENCE OF THE ITERATION.
  154. C
  155. DELNRM=DDANRM(NEQ,DELTA,WT,RPAR,IPAR)
  156. IF (DELNRM.LE.100.D0*UROUND*YNORM)
  157. * GO TO 400
  158. C
  159. IF (M.GT.0) GO TO 340
  160. OLDNRM=DELNRM
  161. GO TO 350
  162. C
  163. 340 RATE=(DELNRM/OLDNRM)**(1.0D0/M)
  164. IF (RATE.GT.0.90D0) GO TO 430
  165. S=RATE/(1.0D0-RATE)
  166. C
  167. 350 IF (S*DELNRM .LE. 0.33D0) GO TO 400
  168. C
  169. C
  170. C THE CORRECTOR HAS NOT YET CONVERGED. UPDATE
  171. C M AND AND TEST WHETHER THE MAXIMUM
  172. C NUMBER OF ITERATIONS HAVE BEEN TRIED.
  173. C EVERY MJAC ITERATIONS, GET A NEW
  174. C ITERATION MATRIX.
  175. C
  176. M=M+1
  177. IF (M.GE.MAXIT) GO TO 430
  178. C
  179. IF ((M/MJAC)*MJAC.EQ.M) JCALC=-1
  180. GO TO 300
  181. C
  182. C
  183. C THE ITERATION HAS CONVERGED.
  184. C CHECK NONNEGATIVITY CONSTRAINTS
  185. 400 IF (NONNEG.EQ.0) GO TO 450
  186. DO 410 I=1,NEQ
  187. 410 DELTA(I)=MIN(Y(I),0.0D0)
  188. C
  189. DELNRM=DDANRM(NEQ,DELTA,WT,RPAR,IPAR)
  190. IF (DELNRM.GT.0.33D0) GO TO 430
  191. C
  192. DO 420 I=1,NEQ
  193. Y(I)=Y(I)-DELTA(I)
  194. 420 YPRIME(I)=YPRIME(I)-CJ*DELTA(I)
  195. GO TO 450
  196. C
  197. C
  198. C EXITS FROM CORRECTOR LOOP.
  199. 430 CONVGD=.FALSE.
  200. 450 IF (.NOT.CONVGD) GO TO 600
  201. C
  202. C
  203. C
  204. C-----------------------------------------------------
  205. C BLOCK 3.
  206. C THE CORRECTOR ITERATION CONVERGED.
  207. C DO ERROR TEST.
  208. C-----------------------------------------------------
  209. C
  210. DO 510 I=1,NEQ
  211. 510 E(I)=Y(I)-PHI(I,1)
  212. ERR=DDANRM(NEQ,E,WT,RPAR,IPAR)
  213. C
  214. IF (ERR.LE.1.0D0) RETURN
  215. C
  216. C
  217. C
  218. C--------------------------------------------------------
  219. C BLOCK 4.
  220. C THE BACKWARD EULER STEP FAILED. RESTORE X, Y
  221. C AND YPRIME TO THEIR ORIGINAL VALUES.
  222. C REDUCE STEPSIZE AND TRY AGAIN, IF
  223. C POSSIBLE.
  224. C---------------------------------------------------------
  225. C
  226. 600 CONTINUE
  227. X = XOLD
  228. DO 610 I=1,NEQ
  229. Y(I)=PHI(I,1)
  230. 610 YPRIME(I)=PHI(I,2)
  231. C
  232. IF (CONVGD) GO TO 640
  233. IF (IER.EQ.0) GO TO 620
  234. NSF=NSF+1
  235. H=H*0.25D0
  236. IF (NSF.LT.3.AND.ABS(H).GE.HMIN) GO TO 690
  237. IDID=-12
  238. RETURN
  239. 620 IF (IRES.GT.-2) GO TO 630
  240. IDID=-12
  241. RETURN
  242. 630 NCF=NCF+1
  243. H=H*0.25D0
  244. IF (NCF.LT.10.AND.ABS(H).GE.HMIN) GO TO 690
  245. IDID=-12
  246. RETURN
  247. C
  248. 640 NEF=NEF+1
  249. R=0.90D0/(2.0D0*ERR+0.0001D0)
  250. R=MAX(0.1D0,MIN(0.5D0,R))
  251. H=H*R
  252. IF (ABS(H).GE.HMIN.AND.NEF.LT.10) GO TO 690
  253. IDID=-12
  254. RETURN
  255. 690 GO TO 200
  256. C
  257. C-------------END OF SUBROUTINE DDAINI----------------------
  258. END