cdntl.f 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. *DECK CDNTL
  2. SUBROUTINE CDNTL (EPS, F, FA, HMAX, HOLD, IMPL, JTASK, MATDIM,
  3. 8 MAXORD, MINT, MITER, ML, MU, N, NDE, SAVE1, T, UROUND, USERS,
  4. 8 Y, YWT, H, MNTOLD, MTROLD, NFE, RC, YH, A, CONVRG, EL, FAC,
  5. 8 IER, IPVT, NQ, NWAIT, RH, RMAX, SAVE2, TQ, TREND, ISWFLG,
  6. 8 JSTATE)
  7. C***BEGIN PROLOGUE CDNTL
  8. C***SUBSIDIARY
  9. C***PURPOSE Subroutine CDNTL is called to set parameters on the first
  10. C call to CDSTP, on an internal restart, or when the user has
  11. C altered MINT, MITER, and/or H.
  12. C***LIBRARY SLATEC (SDRIVE)
  13. C***TYPE COMPLEX (SDNTL-S, DDNTL-D, CDNTL-C)
  14. C***AUTHOR Kahaner, D. K., (NIST)
  15. C National Institute of Standards and Technology
  16. C Gaithersburg, MD 20899
  17. C Sutherland, C. D., (LANL)
  18. C Mail Stop D466
  19. C Los Alamos National Laboratory
  20. C Los Alamos, NM 87545
  21. C***DESCRIPTION
  22. C
  23. C On the first call, the order is set to 1 and the initial derivatives
  24. C are calculated. RMAX is the maximum ratio by which H can be
  25. C increased in one step. It is initially RMINIT to compensate
  26. C for the small initial H, but then is normally equal to RMNORM.
  27. C If a failure occurs (in corrector convergence or error test), RMAX
  28. C is set at RMFAIL for the next increase.
  29. C If the caller has changed MINT, or if JTASK = 0, CDCST is called
  30. C to set the coefficients of the method. If the caller has changed H,
  31. C YH must be rescaled. If H or MINT has been changed, NWAIT is
  32. C reset to NQ + 2 to prevent further increases in H for that many
  33. C steps. Also, RC is reset. RC is the ratio of new to old values of
  34. C the coefficient L(0)*H. If the caller has changed MITER, RC is
  35. C set to 0 to force the partials to be updated, if partials are used.
  36. C
  37. C***ROUTINES CALLED CDCST, CDSCL, CGBFA, CGBSL, CGEFA, CGESL, SCNRM2
  38. C***REVISION HISTORY (YYMMDD)
  39. C 790601 DATE WRITTEN
  40. C 900329 Initial submission to SLATEC.
  41. C***END PROLOGUE CDNTL
  42. INTEGER I, IFLAG, IMPL, INFO, ISWFLG, JSTATE, JTASK, MATDIM,
  43. 8 MAXORD, MINT, MITER, ML, MNTOLD, MTROLD, MU, N, NDE, NFE,
  44. 8 NQ, NWAIT
  45. COMPLEX A(MATDIM,*), FAC(*), SAVE1(*), SAVE2(*), Y(*), YH(N,*),
  46. 8 YWT(*)
  47. REAL EL(13,12), EPS, H, HMAX, HOLD, OLDL0, RC, RH, RMAX,
  48. 8 RMINIT, SCNRM2, SUM, T, TQ(3,12), TREND, UROUND
  49. INTEGER IPVT(*)
  50. LOGICAL CONVRG, IER
  51. PARAMETER(RMINIT = 10000.E0)
  52. C***FIRST EXECUTABLE STATEMENT CDNTL
  53. IER = .FALSE.
  54. IF (JTASK .GE. 0) THEN
  55. IF (JTASK .EQ. 0) THEN
  56. CALL CDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  57. RMAX = RMINIT
  58. END IF
  59. RC = 0.E0
  60. CONVRG = .FALSE.
  61. TREND = 1.E0
  62. NQ = 1
  63. NWAIT = 3
  64. CALL F (N, T, Y, SAVE2)
  65. IF (N .EQ. 0) THEN
  66. JSTATE = 6
  67. RETURN
  68. END IF
  69. NFE = NFE + 1
  70. IF (IMPL .NE. 0) THEN
  71. IF (MITER .EQ. 3) THEN
  72. IFLAG = 0
  73. CALL USERS (Y, YH, YWT, SAVE1, SAVE2, T, H, EL, IMPL, N,
  74. 8 NDE, IFLAG)
  75. IF (IFLAG .EQ. -1) THEN
  76. IER = .TRUE.
  77. RETURN
  78. END IF
  79. IF (N .EQ. 0) THEN
  80. JSTATE = 10
  81. RETURN
  82. END IF
  83. ELSE IF (IMPL .EQ. 1) THEN
  84. IF (MITER .EQ. 1 .OR. MITER .EQ. 2) THEN
  85. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  86. IF (N .EQ. 0) THEN
  87. JSTATE = 9
  88. RETURN
  89. END IF
  90. CALL CGEFA (A, MATDIM, N, IPVT, INFO)
  91. IF (INFO .NE. 0) THEN
  92. IER = .TRUE.
  93. RETURN
  94. END IF
  95. CALL CGESL (A, MATDIM, N, IPVT, SAVE2, 0)
  96. ELSE IF (MITER .EQ. 4 .OR. MITER .EQ. 5) THEN
  97. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  98. IF (N .EQ. 0) THEN
  99. JSTATE = 9
  100. RETURN
  101. END IF
  102. CALL CGBFA (A, MATDIM, N, ML, MU, IPVT, INFO)
  103. IF (INFO .NE. 0) THEN
  104. IER = .TRUE.
  105. RETURN
  106. END IF
  107. CALL CGBSL (A, MATDIM, N, ML, MU, IPVT, SAVE2, 0)
  108. END IF
  109. ELSE IF (IMPL .EQ. 2) THEN
  110. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  111. IF (N .EQ. 0) THEN
  112. JSTATE = 9
  113. RETURN
  114. END IF
  115. DO 150 I = 1,NDE
  116. IF (A(I,1) .EQ. 0.E0) THEN
  117. IER = .TRUE.
  118. RETURN
  119. ELSE
  120. SAVE2(I) = SAVE2(I)/A(I,1)
  121. END IF
  122. 150 CONTINUE
  123. DO 155 I = NDE+1,N
  124. 155 A(I,1) = 0.E0
  125. ELSE IF (IMPL .EQ. 3) THEN
  126. IF (MITER .EQ. 1 .OR. MITER .EQ. 2) THEN
  127. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  128. IF (N .EQ. 0) THEN
  129. JSTATE = 9
  130. RETURN
  131. END IF
  132. CALL CGEFA (A, MATDIM, NDE, IPVT, INFO)
  133. IF (INFO .NE. 0) THEN
  134. IER = .TRUE.
  135. RETURN
  136. END IF
  137. CALL CGESL (A, MATDIM, NDE, IPVT, SAVE2, 0)
  138. ELSE IF (MITER .EQ. 4 .OR. MITER .EQ. 5) THEN
  139. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  140. IF (N .EQ. 0) THEN
  141. JSTATE = 9
  142. RETURN
  143. END IF
  144. CALL CGBFA (A, MATDIM, NDE, ML, MU, IPVT, INFO)
  145. IF (INFO .NE. 0) THEN
  146. IER = .TRUE.
  147. RETURN
  148. END IF
  149. CALL CGBSL (A, MATDIM, NDE, ML, MU, IPVT, SAVE2, 0)
  150. END IF
  151. END IF
  152. END IF
  153. DO 170 I = 1,NDE
  154. 170 SAVE1(I) = SAVE2(I)/MAX(1.E0, ABS(YWT(I)))
  155. SUM = SCNRM2(NDE, SAVE1, 1)/SQRT(REAL(NDE))
  156. IF (SUM .GT. EPS/ABS(H)) H = SIGN(EPS/SUM, H)
  157. DO 180 I = 1,N
  158. 180 YH(I,2) = H*SAVE2(I)
  159. IF (MITER .EQ. 2 .OR. MITER .EQ. 5 .OR. ISWFLG .EQ. 3) THEN
  160. DO 20 I = 1,N
  161. 20 FAC(I) = SQRT(UROUND)
  162. END IF
  163. ELSE
  164. IF (MITER .NE. MTROLD) THEN
  165. MTROLD = MITER
  166. RC = 0.E0
  167. CONVRG = .FALSE.
  168. END IF
  169. IF (MINT .NE. MNTOLD) THEN
  170. MNTOLD = MINT
  171. OLDL0 = EL(1,NQ)
  172. CALL CDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  173. RC = RC*EL(1,NQ)/OLDL0
  174. NWAIT = NQ + 2
  175. END IF
  176. IF (H .NE. HOLD) THEN
  177. NWAIT = NQ + 2
  178. RH = H/HOLD
  179. CALL CDSCL (HMAX, N, NQ, RMAX, HOLD, RC, RH, YH)
  180. END IF
  181. END IF
  182. RETURN
  183. END