sdaini.f 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. *DECK SDAINI
  2. SUBROUTINE SDAINI (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 SDAINI
  5. C***SUBSIDIARY
  6. C***PURPOSE Initialization routine for SDASSL.
  7. C***LIBRARY SLATEC (DASSL)
  8. C***TYPE SINGLE PRECISION (SDAINI-S, DDAINI-D)
  9. C***AUTHOR Petzold, Linda R., (LLNL)
  10. C***DESCRIPTION
  11. C-----------------------------------------------------------------
  12. C SDAINI 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 -- SDAINI FAILED TO FIND YPRIME
  38. C RPAR,IPAR -- REAL AND INTEGER PARAMETER ARRAYS
  39. C THAT ARE NOT ALTERED BY SDAINI
  40. C PHI -- WORK SPACE FOR SDAINI
  41. C DELTA,E -- WORK SPACE FOR SDAINI
  42. C WM,IWM -- REAL AND INTEGER ARRAYS STORING
  43. C MATRIX INFORMATION
  44. C
  45. C-----------------------------------------------------------------
  46. C***ROUTINES CALLED SDAJAC, SDANRM, SDASLV
  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 SDAINI
  55. C
  56. INTEGER NEQ, IDID, IPAR(*), IWM(*), NONNEG, NTEMP
  57. REAL X, Y(*), YPRIME(*), H, WT(*), RPAR(*), PHI(NEQ,*), DELTA(*),
  58. * E(*), WM(*), HMIN, UROUND
  59. EXTERNAL RES, JAC
  60. C
  61. EXTERNAL SDAJAC, SDANRM, SDASLV
  62. REAL SDANRM
  63. C
  64. INTEGER I, IER, IRES, JCALC, LNJE, LNRE, M, MAXIT, MJAC, NCF,
  65. * NEF, NSF
  66. REAL CJ, DAMP, DELNRM, ERR, OLDNRM, R, RATE, S, XOLD, YNORM
  67. LOGICAL CONVGD
  68. C
  69. PARAMETER (LNRE=12)
  70. PARAMETER (LNJE=13)
  71. C
  72. DATA MAXIT/10/,MJAC/5/
  73. DATA DAMP/0.75E0/
  74. C
  75. C
  76. C---------------------------------------------------
  77. C BLOCK 1.
  78. C INITIALIZATIONS.
  79. C---------------------------------------------------
  80. C
  81. C***FIRST EXECUTABLE STATEMENT SDAINI
  82. IDID=1
  83. NEF=0
  84. NCF=0
  85. NSF=0
  86. XOLD=X
  87. YNORM=SDANRM(NEQ,Y,WT,RPAR,IPAR)
  88. C
  89. C SAVE Y AND YPRIME IN PHI
  90. DO 100 I=1,NEQ
  91. PHI(I,1)=Y(I)
  92. 100 PHI(I,2)=YPRIME(I)
  93. C
  94. C
  95. C----------------------------------------------------
  96. C BLOCK 2.
  97. C DO ONE BACKWARD EULER STEP.
  98. C----------------------------------------------------
  99. C
  100. C SET UP FOR START OF CORRECTOR ITERATION
  101. 200 CJ=1.0E0/H
  102. X=X+H
  103. C
  104. C PREDICT SOLUTION AND DERIVATIVE
  105. DO 250 I=1,NEQ
  106. 250 Y(I)=Y(I)+H*YPRIME(I)
  107. C
  108. JCALC=-1
  109. M=0
  110. CONVGD=.TRUE.
  111. C
  112. C
  113. C CORRECTOR LOOP.
  114. 300 IWM(LNRE)=IWM(LNRE)+1
  115. IRES=0
  116. C
  117. CALL RES(X,Y,YPRIME,DELTA,IRES,RPAR,IPAR)
  118. IF (IRES.LT.0) GO TO 430
  119. C
  120. C
  121. C EVALUATE THE ITERATION MATRIX
  122. IF (JCALC.NE.-1) GO TO 310
  123. IWM(LNJE)=IWM(LNJE)+1
  124. JCALC=0
  125. CALL SDAJAC(NEQ,X,Y,YPRIME,DELTA,CJ,H,
  126. * IER,WT,E,WM,IWM,RES,IRES,
  127. * UROUND,JAC,RPAR,IPAR,NTEMP)
  128. C
  129. S=1000000.E0
  130. IF (IRES.LT.0) GO TO 430
  131. IF (IER.NE.0) GO TO 430
  132. NSF=0
  133. C
  134. C
  135. C
  136. C MULTIPLY RESIDUAL BY DAMPING FACTOR
  137. 310 CONTINUE
  138. DO 320 I=1,NEQ
  139. 320 DELTA(I)=DELTA(I)*DAMP
  140. C
  141. C COMPUTE A NEW ITERATE (BACK SUBSTITUTION)
  142. C STORE THE CORRECTION IN DELTA
  143. C
  144. CALL SDASLV(NEQ,DELTA,WM,IWM)
  145. C
  146. C UPDATE Y AND YPRIME
  147. DO 330 I=1,NEQ
  148. Y(I)=Y(I)-DELTA(I)
  149. 330 YPRIME(I)=YPRIME(I)-CJ*DELTA(I)
  150. C
  151. C TEST FOR CONVERGENCE OF THE ITERATION.
  152. C
  153. DELNRM=SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
  154. IF (DELNRM.LE.100.E0*UROUND*YNORM)
  155. * GO TO 400
  156. C
  157. IF (M.GT.0) GO TO 340
  158. OLDNRM=DELNRM
  159. GO TO 350
  160. C
  161. 340 RATE=(DELNRM/OLDNRM)**(1.0E0/M)
  162. IF (RATE.GT.0.90E0) GO TO 430
  163. S=RATE/(1.0E0-RATE)
  164. C
  165. 350 IF (S*DELNRM .LE. 0.33E0) GO TO 400
  166. C
  167. C
  168. C THE CORRECTOR HAS NOT YET CONVERGED. UPDATE
  169. C M AND AND TEST WHETHER THE MAXIMUM
  170. C NUMBER OF ITERATIONS HAVE BEEN TRIED.
  171. C EVERY MJAC ITERATIONS, GET A NEW
  172. C ITERATION MATRIX.
  173. C
  174. M=M+1
  175. IF (M.GE.MAXIT) GO TO 430
  176. C
  177. IF ((M/MJAC)*MJAC.EQ.M) JCALC=-1
  178. GO TO 300
  179. C
  180. C
  181. C THE ITERATION HAS CONVERGED.
  182. C CHECK NONNEGATIVITY CONSTRAINTS
  183. 400 IF (NONNEG.EQ.0) GO TO 450
  184. DO 410 I=1,NEQ
  185. 410 DELTA(I)=MIN(Y(I),0.0E0)
  186. C
  187. DELNRM=SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
  188. IF (DELNRM.GT.0.33E0) GO TO 430
  189. C
  190. DO 420 I=1,NEQ
  191. Y(I)=Y(I)-DELTA(I)
  192. 420 YPRIME(I)=YPRIME(I)-CJ*DELTA(I)
  193. GO TO 450
  194. C
  195. C
  196. C EXITS FROM CORRECTOR LOOP.
  197. 430 CONVGD=.FALSE.
  198. 450 IF (.NOT.CONVGD) GO TO 600
  199. C
  200. C
  201. C
  202. C-----------------------------------------------------
  203. C BLOCK 3.
  204. C THE CORRECTOR ITERATION CONVERGED.
  205. C DO ERROR TEST.
  206. C-----------------------------------------------------
  207. C
  208. DO 510 I=1,NEQ
  209. 510 E(I)=Y(I)-PHI(I,1)
  210. ERR=SDANRM(NEQ,E,WT,RPAR,IPAR)
  211. C
  212. IF (ERR.LE.1.0E0) RETURN
  213. C
  214. C
  215. C
  216. C--------------------------------------------------------
  217. C BLOCK 4.
  218. C THE BACKWARD EULER STEP FAILED. RESTORE X, Y
  219. C AND YPRIME TO THEIR ORIGINAL VALUES.
  220. C REDUCE STEPSIZE AND TRY AGAIN, IF
  221. C POSSIBLE.
  222. C---------------------------------------------------------
  223. C
  224. 600 CONTINUE
  225. X = XOLD
  226. DO 610 I=1,NEQ
  227. Y(I)=PHI(I,1)
  228. 610 YPRIME(I)=PHI(I,2)
  229. C
  230. IF (CONVGD) GO TO 640
  231. IF (IER.EQ.0) GO TO 620
  232. NSF=NSF+1
  233. H=H*0.25E0
  234. IF (NSF.LT.3.AND.ABS(H).GE.HMIN) GO TO 690
  235. IDID=-12
  236. RETURN
  237. 620 IF (IRES.GT.-2) GO TO 630
  238. IDID=-12
  239. RETURN
  240. 630 NCF=NCF+1
  241. H=H*0.25E0
  242. IF (NCF.LT.10.AND.ABS(H).GE.HMIN) GO TO 690
  243. IDID=-12
  244. RETURN
  245. C
  246. 640 NEF=NEF+1
  247. R=0.90E0/(2.0E0*ERR+0.0001E0)
  248. R=MAX(0.1E0,MIN(0.5E0,R))
  249. H=H*R
  250. IF (ABS(H).GE.HMIN.AND.NEF.LT.10) GO TO 690
  251. IDID=-12
  252. RETURN
  253. 690 GO TO 200
  254. C
  255. C-------------END OF SUBROUTINE SDAINI----------------------
  256. END