pjac.f 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. *DECK PJAC
  2. SUBROUTINE PJAC (NEQ, Y, YH, NYH, EWT, FTEM, SAVF, WM, IWM, F,
  3. + JAC, RPAR, IPAR)
  4. C***BEGIN PROLOGUE PJAC
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DEBDF
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE PRECISION (PJAC-S, DPJAC-D)
  9. C***AUTHOR Watts, H. A., (SNLA)
  10. C***DESCRIPTION
  11. C
  12. C PJAC sets up the iteration matrix (involving the Jacobian) for the
  13. C integration package DEBDF.
  14. C
  15. C***SEE ALSO DEBDF
  16. C***ROUTINES CALLED SGBFA, SGEFA, VNWRMS
  17. C***COMMON BLOCKS DEBDF1
  18. C***REVISION HISTORY (YYMMDD)
  19. C 800901 DATE WRITTEN
  20. C 890531 Changed all specific intrinsics to generic. (WRB)
  21. C 891214 Prologue converted to Version 4.0 format. (BAB)
  22. C 900328 Added TYPE section. (WRB)
  23. C 910722 Updated AUTHOR section. (ALS)
  24. C 920422 Changed DIMENSION statement. (WRB)
  25. C***END PROLOGUE PJAC
  26. C
  27. CLLL. OPTIMIZE
  28. INTEGER NEQ, NYH, IWM, I, I1, I2, IER, II, IOWND, IOWNS, J, J1,
  29. 1 JJ, JSTART, KFLAG, L, LENP, MAXORD, MBA, MBAND, MEB1, MEBAND,
  30. 2 METH, MITER, ML, ML3, MU, N, NFE, NJE, NQ, NQU, NST
  31. EXTERNAL F, JAC
  32. REAL Y, YH, EWT, FTEM, SAVF, WM,
  33. 1 ROWND, ROWNS, EL0, H, HMIN, HMXI, HU, TN, UROUND,
  34. 2 CON, DI, FAC, HL0, R, R0, SRUR, YI, YJ, YJJ, VNWRMS
  35. DIMENSION Y(*), YH(NYH,*), EWT(*), FTEM(*), SAVF(*),
  36. 1 WM(*), IWM(*), RPAR(*), IPAR(*)
  37. COMMON /DEBDF1/ ROWND, ROWNS(210),
  38. 1 EL0, H, HMIN, HMXI, HU, TN, UROUND, IOWND(14), IOWNS(6),
  39. 2 IER, JSTART, KFLAG, L, METH, MITER, MAXORD, N, NQ, NST, NFE,
  40. 3 NJE, NQU
  41. C-----------------------------------------------------------------------
  42. C PJAC IS CALLED BY STOD TO COMPUTE AND PROCESS THE MATRIX
  43. C P = I - H*EL(1)*J , WHERE J IS AN APPROXIMATION TO THE JACOBIAN.
  44. C HERE J IS COMPUTED BY THE USER-SUPPLIED ROUTINE JAC IF
  45. C MITER = 1 OR 4, OR BY FINITE DIFFERENCING IF MITER = 2, 3, OR 5.
  46. C IF MITER = 3, A DIAGONAL APPROXIMATION TO J IS USED.
  47. C J IS STORED IN WM AND REPLACED BY P. IF MITER .NE. 3, P IS THEN
  48. C SUBJECTED TO LU DECOMPOSITION IN PREPARATION FOR LATER SOLUTION
  49. C OF LINEAR SYSTEMS WITH P AS COEFFICIENT MATRIX. THIS IS DONE
  50. C BY SGEFA IF MITER = 1 OR 2, AND BY SGBFA IF MITER = 4 OR 5.
  51. C
  52. C IN ADDITION TO VARIABLES DESCRIBED PREVIOUSLY, COMMUNICATION
  53. C WITH PJAC USES THE FOLLOWING..
  54. C Y = ARRAY CONTAINING PREDICTED VALUES ON ENTRY.
  55. C FTEM = WORK ARRAY OF LENGTH N (ACOR IN STOD ).
  56. C SAVF = ARRAY CONTAINING F EVALUATED AT PREDICTED Y.
  57. C WM = REAL WORK SPACE FOR MATRICES. ON OUTPUT IT CONTAINS THE
  58. C INVERSE DIAGONAL MATRIX IF MITER = 3 AND THE LU DECOMPOSITION
  59. C OF P IF MITER IS 1, 2 , 4, OR 5.
  60. C STORAGE OF MATRIX ELEMENTS STARTS AT WM(3).
  61. C WM ALSO CONTAINS THE FOLLOWING MATRIX-RELATED DATA..
  62. C WM(1) = SQRT(UROUND), USED IN NUMERICAL JACOBIAN INCREMENTS.
  63. C WM(2) = H*EL0, SAVED FOR LATER USE IF MITER = 3.
  64. C IWM = INTEGER WORK SPACE CONTAINING PIVOT INFORMATION, STARTING AT
  65. C IWM(21), IF MITER IS 1, 2, 4, OR 5. IWM ALSO CONTAINS THE
  66. C BAND PARAMETERS ML = IWM(1) AND MU = IWM(2) IF MITER IS 4 OR 5.
  67. C EL0 = EL(1) (INPUT).
  68. C IER = OUTPUT ERROR FLAG, = 0 IF NO TROUBLE, .NE. 0 IF
  69. C P MATRIX FOUND TO BE SINGULAR.
  70. C THIS ROUTINE ALSO USES THE COMMON VARIABLES EL0, H, TN, UROUND,
  71. C MITER, N, NFE, AND NJE.
  72. C-----------------------------------------------------------------------
  73. C***FIRST EXECUTABLE STATEMENT PJAC
  74. NJE = NJE + 1
  75. HL0 = H*EL0
  76. GO TO (100, 200, 300, 400, 500), MITER
  77. C IF MITER = 1, CALL JAC AND MULTIPLY BY SCALAR. -----------------------
  78. 100 LENP = N*N
  79. DO 110 I = 1,LENP
  80. 110 WM(I+2) = 0.0E0
  81. CALL JAC (TN, Y, WM(3), N, RPAR, IPAR)
  82. CON = -HL0
  83. DO 120 I = 1,LENP
  84. 120 WM(I+2) = WM(I+2)*CON
  85. GO TO 240
  86. C IF MITER = 2, MAKE N CALLS TO F TO APPROXIMATE J. --------------------
  87. 200 FAC = VNWRMS (N, SAVF, EWT)
  88. R0 = 1000.0E0*ABS(H)*UROUND*N*FAC
  89. IF (R0 .EQ. 0.0E0) R0 = 1.0E0
  90. SRUR = WM(1)
  91. J1 = 2
  92. DO 230 J = 1,N
  93. YJ = Y(J)
  94. R = MAX(SRUR*ABS(YJ),R0*EWT(J))
  95. Y(J) = Y(J) + R
  96. FAC = -HL0/R
  97. CALL F (TN, Y, FTEM, RPAR, IPAR)
  98. DO 220 I = 1,N
  99. 220 WM(I+J1) = (FTEM(I) - SAVF(I))*FAC
  100. Y(J) = YJ
  101. J1 = J1 + N
  102. 230 CONTINUE
  103. NFE = NFE + N
  104. C ADD IDENTITY MATRIX. -------------------------------------------------
  105. 240 J = 3
  106. DO 250 I = 1,N
  107. WM(J) = WM(J) + 1.0E0
  108. 250 J = J + (N + 1)
  109. C DO LU DECOMPOSITION ON P. --------------------------------------------
  110. CALL SGEFA (WM(3), N, N, IWM(21), IER)
  111. RETURN
  112. C IF MITER = 3, CONSTRUCT A DIAGONAL APPROXIMATION TO J AND P. ---------
  113. 300 WM(2) = HL0
  114. IER = 0
  115. R = EL0*0.1E0
  116. DO 310 I = 1,N
  117. 310 Y(I) = Y(I) + R*(H*SAVF(I) - YH(I,2))
  118. CALL F (TN, Y, WM(3), RPAR, IPAR)
  119. NFE = NFE + 1
  120. DO 320 I = 1,N
  121. R0 = H*SAVF(I) - YH(I,2)
  122. DI = 0.1E0*R0 - H*(WM(I+2) - SAVF(I))
  123. WM(I+2) = 1.0E0
  124. IF (ABS(R0) .LT. UROUND*EWT(I)) GO TO 320
  125. IF (ABS(DI) .EQ. 0.0E0) GO TO 330
  126. WM(I+2) = 0.1E0*R0/DI
  127. 320 CONTINUE
  128. RETURN
  129. 330 IER = -1
  130. RETURN
  131. C IF MITER = 4, CALL JAC AND MULTIPLY BY SCALAR. -----------------------
  132. 400 ML = IWM(1)
  133. MU = IWM(2)
  134. ML3 = 3
  135. MBAND = ML + MU + 1
  136. MEBAND = MBAND + ML
  137. LENP = MEBAND*N
  138. DO 410 I = 1,LENP
  139. 410 WM(I+2) = 0.0E0
  140. CALL JAC (TN, Y, WM(ML3), MEBAND, RPAR, IPAR)
  141. CON = -HL0
  142. DO 420 I = 1,LENP
  143. 420 WM(I+2) = WM(I+2)*CON
  144. GO TO 570
  145. C IF MITER = 5, MAKE MBAND CALLS TO F TO APPROXIMATE J. ----------------
  146. 500 ML = IWM(1)
  147. MU = IWM(2)
  148. MBAND = ML + MU + 1
  149. MBA = MIN(MBAND,N)
  150. MEBAND = MBAND + ML
  151. MEB1 = MEBAND - 1
  152. SRUR = WM(1)
  153. FAC = VNWRMS (N, SAVF, EWT)
  154. R0 = 1000.0E0*ABS(H)*UROUND*N*FAC
  155. IF (R0 .EQ. 0.0E0) R0 = 1.0E0
  156. DO 560 J = 1,MBA
  157. DO 530 I = J,N,MBAND
  158. YI = Y(I)
  159. R = MAX(SRUR*ABS(YI),R0*EWT(I))
  160. 530 Y(I) = Y(I) + R
  161. CALL F (TN, Y, FTEM, RPAR, IPAR)
  162. DO 550 JJ = J,N,MBAND
  163. Y(JJ) = YH(JJ,1)
  164. YJJ = Y(JJ)
  165. R = MAX(SRUR*ABS(YJJ),R0*EWT(JJ))
  166. FAC = -HL0/R
  167. I1 = MAX(JJ-MU,1)
  168. I2 = MIN(JJ+ML,N)
  169. II = JJ*MEB1 - ML + 2
  170. DO 540 I = I1,I2
  171. 540 WM(II+I) = (FTEM(I) - SAVF(I))*FAC
  172. 550 CONTINUE
  173. 560 CONTINUE
  174. NFE = NFE + MBA
  175. C ADD IDENTITY MATRIX. -------------------------------------------------
  176. 570 II = MBAND + 2
  177. DO 580 I = 1,N
  178. WM(II) = WM(II) + 1.0E0
  179. 580 II = II + MEBAND
  180. C DO LU DECOMPOSITION OF P. --------------------------------------------
  181. CALL SGBFA (WM(3), MEBAND, N, ML, MU, IWM(21), IER)
  182. RETURN
  183. C----------------------- END OF SUBROUTINE PJAC -----------------------
  184. END