2 SUBROUTINE DPREP
(NEQ
, Y
, YH
, SAVF
, EWT
, FTEM
, IA
, JA
,
3 1 WK
, IWK
, IPPER
, F
, JAC
)
5 INTEGER NEQ
, IA
, JA
, IWK
, IPPER
6 DOUBLE PRECISION Y
, YH
, SAVF
, EWT
, FTEM
, WK
7 DIMENSION NEQ
(*), Y
(*), YH
(*), SAVF
(*), EWT
(*), FTEM
(*),
8 1 IA
(*), JA
(*), WK
(*), IWK
(*)
10 1 ICF
, IERPJ
, IERSL
, JCUR
, JSTART
, KFLAG
, L
,
11 2 LYH
, LEWT
, LACOR
, LSAVF
, LWM
, LIWM
, METH
, MITER
,
12 3 MAXORD
, MAXCOR
, MSBP
, MXNCF
, N
, NQ
, NST
, NFE
, NJE
, NQU
13 INTEGER IPLOST
, IESP
, ISTATC
, IYS
, IBA
, IBIAN
, IBJAN
, IBJGP
,
14 1 IPIAN
, IPJAN
, IPJGP
, IPIGP
, IPR
, IPC
, IPIC
, IPISP
, IPRSP
, IPA
,
15 2 LENYH
, LENYHM
, LENWK
, LREQ
, LRAT
, LREST
, LWMIN
, MOSS
, MSBJ
,
16 3 NSLJ
, NGP
, NLU
, NNZ
, NSP
, NZL
, NZU
17 DOUBLE PRECISION ROWNS
,
18 1 CCMAX
, EL0
, H
, HMIN
, HMXI
, HU
, RC
, TN
, UROUND
19 DOUBLE PRECISION CON0
, CONMIN
, CCMXJ
, PSMALL
, RBIG
, SETH
20 COMMON /DLS001
/ ROWNS
(209),
21 1 CCMAX
, EL0
, H
, HMIN
, HMXI
, HU
, RC
, TN
, UROUND
,
23 3 ICF
, IERPJ
, IERSL
, JCUR
, JSTART
, KFLAG
, L
,
24 4 LYH
, LEWT
, LACOR
, LSAVF
, LWM
, LIWM
, METH
, MITER
,
25 5 MAXORD
, MAXCOR
, MSBP
, MXNCF
, N
, NQ
, NST
, NFE
, NJE
, NQU
26 COMMON /DLSS01
/ CON0
, CONMIN
, CCMXJ
, PSMALL
, RBIG
, SETH
,
27 1 IPLOST
, IESP
, ISTATC
, IYS
, IBA
, IBIAN
, IBJAN
, IBJGP
,
28 2 IPIAN
, IPJAN
, IPJGP
, IPIGP
, IPR
, IPC
, IPIC
, IPISP
, IPRSP
, IPA
,
29 3 LENYH
, LENYHM
, LENWK
, LREQ
, LRAT
, LREST
, LWMIN
, MOSS
, MSBJ
,
30 4 NSLJ
, NGP
, NLU
, NNZ
, NSP
, NZL
, NZU
31 INTEGER I
, IBR
, IER
, IPIL
, IPIU
, IPTT1
, IPTT2
, J
, JFOUND
, K
,
32 1 KNEW
, KMAX
, KMIN
, LDIF
, LENIGP
, LIWK
, MAXG
, NP1
, NZSUT
33 DOUBLE PRECISION DQ
, DYJ
, ERWT
, FAC
, YJ
34 C-----------------------------------------------------------------------
35 C This routine performs preprocessing related to the sparse linear
36 C systems that must be solved if MITER = 1 or 2.
37 C The operations that are performed here are:
38 C * compute sparseness structure of Jacobian according to MOSS,
39 C * compute grouping of column indices (MITER = 2),
40 C * compute a new ordering of rows and columns of the matrix,
41 C * reorder JA corresponding to the new ordering,
42 C * perform a symbolic LU factorization of the matrix, and
43 C * set pointers for segments of the IWK/WK array.
44 C In addition to variables described previously, DPREP uses the
45 C following for communication:
46 C YH = the history array. Only the first column, containing the
47 C current Y vector, is used. Used only if MOSS .ne. 0.
48 C SAVF = a work array of length NEQ, used only if MOSS .ne. 0.
49 C EWT = array of length NEQ containing (inverted) error weights.
50 C Used only if MOSS = 2 or if ISTATE = MOSS = 1.
51 C FTEM = a work array of length NEQ, identical to ACOR in the driver,
52 C used only if MOSS = 2.
53 C WK = a real work array of length LENWK, identical to WM in
55 C IWK = integer work array, assumed to occupy the same space as WK.
56 C LENWK = the length of the work arrays WK and IWK.
57 C ISTATC = a copy of the driver input argument ISTATE (= 1 on the
58 C first call, = 3 on a continuation call).
59 C IYS = flag value from ODRV or CDRV.
60 C IPPER = output error flag with the following values and meanings:
62 C -1 insufficient storage for internal structure pointers.
63 C -2 insufficient storage for JGROUP.
64 C -3 insufficient storage for ODRV.
65 C -4 other error flag from ODRV (should never occur).
66 C -5 insufficient storage for CDRV.
67 C -6 other error flag from CDRV.
68 C-----------------------------------------------------------------------
75 IF (IPJAN
+N
-1 .GT
. LIWK
) GO TO 210
76 IF (MOSS
.EQ
. 0) GO TO 30
78 IF (ISTATC
.EQ
. 3) GO TO 20
79 C ISTATE = 1 and MOSS .ne. 0. Perturb Y for structure determination. --
82 FAC
= 1.0D0
+ 1.0D0
/(I
+ 1.0D0
)
83 Y
(I
) = Y
(I
) + FAC*SIGN
(ERWT
,Y
(I
))
88 C ISTATE = 3 and MOSS .ne. 0. Load Y from YH(*,1). --------------------
93 C MOSS = 0. Process user's IA,JA. Add diagonal entries if necessary. -
100 IF (KMIN
.GT
. KMAX
) GO TO 45
103 IF (I
.EQ
. J
) JFOUND
= 1
104 IF (KNEW
.GT
. LIWK
) GO TO 210
108 IF (JFOUND
.EQ
. 1) GO TO 50
109 45 IF (KNEW
.GT
. LIWK
) GO TO 210
112 50 IWK
(IPIAN
+J
) = KNEW
+ 1 - IPJAN
117 C MOSS = 1. Compute structure from user-supplied Jacobian routine JAC.
119 C A dummy call to F allows user to create temporaries for use in JAC. --
120 CALL F
(NEQ
, TN
, Y
, SAVF
)
124 IF (K
.GT
. LIWK
) GO TO 210
129 CALL JAC
(NEQ
, TN
, Y
, J
, IWK
(IPIAN
), IWK
(IPJAN
), SAVF
)
131 IF (ABS
(SAVF
(I
)) .LE
. SETH
) GO TO 80
132 IF (I
.EQ
. J
) GO TO 80
133 IF (K
.GT
. LIWK
) GO TO 210
137 IWK
(IPIAN
+J
) = K
+ 1 - IPJAN
141 C MOSS = 2. Compute structure from results of N + 1 calls to F. -------
144 CALL F
(NEQ
, TN
, Y
, SAVF
)
146 IF (K
.GT
. LIWK
) GO TO 210
153 CALL F
(NEQ
, TN
, Y
, FTEM
)
156 DQ
= (FTEM
(I
) - SAVF
(I
))/DYJ
157 IF (ABS
(DQ
) .LE
. SETH
) GO TO 110
158 IF (I
.EQ
. J
) GO TO 110
159 IF (K
.GT
. LIWK
) GO TO 210
163 IWK
(IPIAN
+J
) = K
+ 1 - IPJAN
167 IF (MOSS
.EQ
. 0 .OR
. ISTATC
.NE
. 1) GO TO 150
168 C If ISTATE = 1 and MOSS .ne. 0, restore Y from YH. --------------------
171 150 NNZ
= IWK
(IPIAN
+N
) - 1
174 IF (MITER
.NE
. 2) GO TO 160
176 C Compute grouping of column indices (MITER = 2). ----------------------
184 IF (LREQ
.GT
. LIWK
) GO TO 220
185 CALL JGROUP
(N
, IWK
(IPIAN
), IWK
(IPJAN
), MAXG
, NGP
, IWK
(IPIGP
),
186 1 IWK
(IPJGP
), IWK
(IPTT1
), IWK
(IPTT2
), IER
)
187 IF (IER
.NE
. 0) GO TO 220
190 C Compute new ordering of rows/columns of Jacobian. --------------------
191 160 IPR
= IPIGP
+ LENIGP
195 IPRSP
= (IPISP
- 2)/LRAT
+ 2
196 IESP
= LENWK
+ 1 - IPRSP
197 IF (IESP
.LT
. 0) GO TO 230
201 NSP
= LIWK
+ 1 - IPISP
202 CALL ODRV
(N
, IWK
(IPIAN
), IWK
(IPJAN
), WK
, IWK
(IPR
), IWK
(IPIC
),
203 1 NSP
, IWK
(IPISP
), 1, IYS
)
204 IF (IYS
.EQ
. 11*N
+1) GO TO 240
205 IF (IYS
.NE
. 0) GO TO 230
207 C Reorder JAN and do symbolic LU factorization of matrix. --------------
208 IPA
= LENWK
+ 1 - NNZ
210 LREQ
= MAX
(12*N
/LRAT
, 6*N
/LRAT
+2*N
+NNZ
) + 3
211 LREQ
= LREQ
+ IPRSP
- 1 + NNZ
212 IF (LREQ
.GT
. LENWK
) GO TO 250
215 180 WK
(IBA
+I
) = 0.0D0
216 IPISP
= LRAT*
(IPRSP
- 1) + 1
217 CALL CDRV
(N
,IWK
(IPR
),IWK
(IPC
),IWK
(IPIC
),IWK
(IPIAN
),IWK
(IPJAN
),
218 1 WK
(IPA
),WK
(IPA
),WK
(IPA
),NSP
,IWK
(IPISP
),WK
(IPRSP
),IESP
,5,IYS
)
220 IF (IYS
.EQ
. 10*N
+1) GO TO 250
221 IF (IYS
.NE
. 0) GO TO 260
223 IPIU
= IPIL
+ 2*N
+ 1
224 NZU
= IWK
(IPIL
+N
) - IWK
(IPIL
)
225 NZL
= IWK
(IPIU
+N
) - IWK
(IPIU
)
226 IF (LRAT
.GT
. 1) GO TO 190
227 CALL ADJLR
(N
, IWK
(IPISP
), LDIF
)
230 IF (LRAT
.EQ
. 2 .AND
. NNZ
.EQ
. N
) LREQ
= LREQ
+ 1
231 NSP
= NSP
+ LREQ
- LENWK
238 LREQ
= 2 + (2*N
+ 1)/LRAT
239 LREQ
= MAX
(LENWK
+1,LREQ
)
243 LREQ
= (LREQ
- 1)/LRAT
+ 1
247 CALL CNTNZU
(N
, IWK
(IPIAN
), IWK
(IPJAN
), NZSUT
)
248 LREQ
= LENWK
- IESP
+ (3*N
+ 4*NZSUT
- 1)/LRAT
+ 1
260 C----------------------- End of Subroutine DPREP -----------------------