source: palm/trunk/UTIL/chemistry/gasphase_preproc/kpp/int.modified_WCOPY/kpp_odessa_ddm.f @ 3534

Last change on this file since 3534 was 2696, checked in by kanani, 6 years ago

Merge of branch palm4u into trunk

File size: 178.2 KB
Line 
1      SUBROUTINE INTEGRATE( NSENSIT, Y, TIN, TOUT )
2
3      INCLUDE 'KPP_ROOT_Parameters.h'
4      INCLUDE 'KPP_ROOT_Global.h'
5
6C TIN - Start Time
7      REAL*8 TIN
8C TOUT - End Time
9      REAL*8 TOUT
10C Concentrations and Sensitivities
11      REAL*8 Y(NVAR,NSENSIT+1), PARAMS(NSENSIT)
12C ---  Note: Y contains: (1:NVAR) concentrations, followed by
13C ---                   (1:NVAR) sensitivities w.r.t. first parameter, followed by
14C ---                   etc.,  followed by
15C ---                   (1:NVAR) sensitivities w.r.t. NSENSIT's parameter
16      INTEGER i
17
18      INTEGER LIW, LRW
19C      PARAMETER (LRW = 22 + 8*(NSENSIT+1)*NVAR + NVAR**2 + NVAR)
20C      PARAMETER (LIW = 21 + NVAR + NSENSIT)
21C      REAL*8 RWORK(LRW)
22C      INTEGER IWORK(LIW)
23C Note: the following dynamic allocation is not standard F77 and may not work on
24C       some systems. Declare LRW, LIW parameters as above with some upper bound used for NSENSIT
25      REAL*8 RWORK(22 + 8*(NSENSIT+1)*NVAR + NVAR**2 + NVAR)
26      INTEGER IWORK(21 + NVAR + NSENSIT)
27
28      INTEGER IOPT(3), NEQ(2)
29
30      EXTERNAL FUNC_CHEM,JAC,DFUNC_CHEMDPAR
31
32      MF = 21    ! --- BDF plus user-supplied Jacobian
33
34      LRW = 22 + 8*(NSENSIT+1)*NVAR + NVAR**2 + NVAR
35      LIW = 21 + NVAR + NSENSIT
36
37      NEQ(1) = NVAR ! --- No. of Variables
38      NEQ(2) = NSENSIT ! --- No of parameters
39
40      ITOL=1     ! --- 1=Scalar Tolerances; 4 = VECTOR TOLERANCES
41      ITASK=1    ! --- Normal Output
42      ISTATE=1
43      IOPT(1)=1  ! --- 0= No optional parameters, 1=Optional parameters
44      IOPT(2)=1  ! --- 1=Perform sensitivity analysis; 0 if not
45      IOPT(3)=1  ! --- 1 if DFUNC_CHEMDPAR supplied by the user;
46                 ! --- 0 if finite differences are to be used
47C --- Set optional parameters
48      DO 10 i=1,LRW
49        RWORK(i) = 0.0D0
50 10   CONTINUE
51      DO 20 i=1,LIW
52        IWORK(i) = 0
53 20   CONTINUE
54
55      RWORK(5) = STEPMIN   !    THE STEP SIZE TO BE ATTEMPTED ON THE FIRST STEP.
56      RWORK(6) = STEPMAX     ! THE MAXIMUM ABSOLUTE STEP SIZE ALLOWED.
57      RWORK(7) = 0.0D0       ! THE MINIMUM ABSOLUTE STEP SIZE ALLOWED.
58      IWORK(6) = 5000        !  MAXIMUM NUMBER OF (INTERNALLY DEFINED) STEPS
59
60      CALL KPP_ODESSA( FUNC_CHEM,DFUNC_CHEMDPAR,NEQ,Y,PARAMS,TIN,TOUT,
61     &              ITOL,RTOL,ATOL,
62     1              ITASK,ISTATE,IOPT,RWORK,LRW,IWORK,LIW,
63     &              JAC,MF)
64
65      IF (ISTATE.LT.0) THEN
66        print *,'KPP_ODESSA: Unsucessfull exit at T=',
67     &          TIN,' (ISTATE=',ISTATE,')'
68      ENDIF
69
70      RETURN
71      END
72
73
74
75
76        SUBROUTINE FUNC_CHEM (N, T, V, PARAMS, FCT)
77        INCLUDE 'KPP_ROOT_Parameters.h'
78        INCLUDE 'KPP_ROOT_Global.h'
79
80        DIMENSION V(NVAR), PARAMS(*), FCT(NVAR)
81        TOLD = TIME
82        TIME = T
83        CALL Update_SUN()
84        CALL Update_RCONST()
85        TIME = TOLD
86        CALL Fun(V,  FIX, RCONST, FCT)
87        RETURN
88        END
89
90        SUBROUTINE DFUNC_CHEMDPAR (N, T, V, PARAMS, DFCT, JPAR)
91        INCLUDE 'KPP_ROOT_Parameters.h'
92        INCLUDE 'KPP_ROOT_Global.h'
93C --- NCOEFF = number of rate coefficients w.r.t. which we differentiate
94C    (note that in some applications NCOEFF may be different than NSENSIT)
95C    JCOEFF(1:NCOEFF) are the indices of rate coefficients   w.r.t. which we differentiate
96        INTEGER NCOEFF, JCOEFF(NREACT)
97        COMMON /DDMRCOEFF/ NCOEFF, JCOEFF
98
99        DIMENSION V(NVAR), PARAMS(*), DFCT(NVAR)
100        INTEGER JPAR, i, JC(1)
101        IF (DDMTYPE .EQ. 0) THEN
102C This setting is required for sensitivities w.r.t. initial conditions
103          DO i=1,NVAR
104            DFCT(i) = 0.d0
105          END DO
106        ELSE
107C This setting is required for sensitivities w.r.t. rate coefficients
108C   ... and should be changed by the user for other applications
109          JC(1) = JCOEFF(JPAR)
110          CALL dFun_dRcoeff(V,  FIX, 1, JC, DFCT )
111        END IF
112        RETURN
113        END
114
115        SUBROUTINE JAC (N, T, V, PARAMS, ML, MU, JS, NROWPD)
116        INCLUDE 'KPP_ROOT_Parameters.h'
117        INCLUDE 'KPP_ROOT_Sparse.h'
118
119        REAL*8 V(NVAR), PARAMS(*), JS(LU_NONZERO)
120        INTEGER ML, MU, NROWPD
121        TOLD = TIME
122        TIME = T
123        CALL Update_SUN()
124        CALL Update_RCONST()
125        TIME = TOLD
126        DO i=1,LU_NONZERO
127            JS(i) = 0.0D0
128        END DO
129        CALL Jac_SP(V,  FIX, RCONST, JS)
130        RETURN
131        END
132
133
134C      ALGORITHM 658, COLLECTED ALGORITHMS FROM ACM.
135C      THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE,
136C      VOL. 14, NO. 1, P.61.
137C-----------------------------------------------------------------------
138C THIS IS THE SEPTEMBER 1, 1986 VERSION OF ODESSA..
139C AN ORDINARY DIFFERENTIAL EQUATION KppSolveR WITH EXPLICIT SIMULTANEOUS
140C SENSITIVITY ANALYSIS.
141C
142C THIS PACKAGE IS A MODIFICATION OF THE AUGUST 13, 1981 VERSION OF
143C LSODE..  LIVERMORE KppSolveR FOR ORDINARY DIFFERENTIAL EQUATIONS.
144C THIS VERSION IS IN DOUBLE PRECISION.
145C
146C ODESSA KppSolveS FOR THE FIRST-ORDER SENSITIVITY COEFFICIENTS..
147C    DY(I)/DP, FOR A SINGLE PARAMETER, OR,
148C    DY(I)/DP(J), FOR MULTIPLE PARAMETERS,
149C ASSOCIATED WITH A SYSTEM OF ORDINARY DIFFERENTIAL EQUATIONS..
150C    DY/DT = F(Y,T;P).
151C-----------------------------------------------------------------------
152C REFERENCES...
153C
154C  1. JORGE R. LEIS AND MARK A. KRAMER, THE SIMULTANEOUS SOLUTION AND
155C     EXPLICIT SENSITIVITY ANALYSIS OF SYSTEMS DESCRIBED BY ORDINARY
156C     DIFFERENTIAL EQUATIONS.  SUBMITTED TO ACM TRANS. MATH. SOFTWARE,
157C     (1985).
158C
159C  2. JORGE R. LEIS AND MARK A. KRAMER, ODESSA - AN ORDINARY DIFFERENTIA
160C     EQUATION KppSolveR WITH EXPLICIT SIMULTANEOUS SENSITIVITY ANALYSIS.
161C     SUBMITTED TO ACM TRANS. MATH. SOFTWARE, (1985).
162C
163C  3. ALAN C. HINDMARSH,  LSODE AND LSODI,  TWO NEW INITIAL VALUE
164C     ORDINARY DIFFERENTIAL EQUATION KppSolveRS, ACM-SIGNUM NEWSLETTER,
165C     VOL. 15, NO. 4 (1980), PP. 10-11.
166C-----------------------------------------------------------------------
167C PROBLEM STATEMENT..
168C
169C THE ODESSA MODIFICATION OF THE LSODE PACKAGE PROVIDES THE OPTION TO
170C CALCULATE FIRST-ORDER SENSITIVITY COEFFICIENTS FOR A SYSTEM OF STIFF
171C OR NON-STIFF EXPLICIT ORDINARY DIFFERENTIAL EQUATIONS OF THE GENERAL
172C FORM :
173C
174C                  DY/DT = F(Y,T;P)     (1)
175C
176C WHERE Y IS AN N-DIMENSIONAL DEPENDENT VARIABLE VECTOR, T IS THE
177C INDEPENDENT INTEGRATION VARIABLE, AND P IS AN NPAR-DIMENSIONAL
178C CONSTANT VECTOR. THE GOVERNING EQUATIONS FOR THE FIRST-ORDER
179C SENSITIVITY COEFFICIENTS ARE GIVEN BY :
180C
181C                  S'(T) = J(T)*S(T) + DF/DP     (2)
182C
183C WHERE
184C
185C                  S(T)  = DY(T)/DP (= SENSITIVITY FUNCTIONS)
186C                  S'(T) = D(DY(T)/DP)/DT
187C                  J(T)  = DF(Y,T;P)/DY(T) (= JACOBIAN MATRIX)
188C AND              DF/DP = DF(Y,T;P)/DP (= INHOMOGENEITY MATRIX)
189C
190C SOLUTION OF EQUATIONS (1) AND (2) PROCEEDS SIMULTANEOUSLY VIA AN
191C EXTENSION OF THE LSODE PACKAGE AS DESCRIBED IN [1].
192C----------------------------------------------------------------------
193C ACKNOWLEDGEMENT : THE FOLLOWING ODESSA PACKAGE DOCUMENTATION IS A
194C                   MODIFICATION OF THE LSODE DOCUMENTATION WHICH
195C                   ACCOMPANIES THE LSODE PACKAGE CODE.
196C----------------------------------------------------------------------
197C SUMMARY OF USAGE.
198C
199C COMMUNICATION BETWEEN THE USER AND THE ODESSA PACKAGE, FOR NORMAL
200C SITUATIONS, IS SUMMARIZED HERE. THIS SUMMARY DESCRIBES ONLY A SUBSET
201C OF THE FULL SET OF OPTIONS AVAILABLE.  SEE THE FULL DESCRIPTION FOR
202C DETAILS, INCLUDING OPTIONAL COMMUNICATION, NONSTANDARD OPTIONS,
203C AND INSTRUCTIONS FOR SPECIAL SITUATIONS.  SEE ALSO THE EXAMPLE
204C PROBLEM (WITH PROGRAM AND OUTPUT) FOLLOWING THIS SUMMARY.
205C
206C A. FIRST PROVIDE A SUBROUTINE OF THE FORM..
207C              SUBROUTINE F (N, T, Y, PAR, YDOT)
208C              DOUBLE PRECISION T, Y, PAR, YDOT
209C              DIMENSION Y(N), YDOT(N), PAR(NPAR)
210C WHICH SUPPLIES THE VECTOR FUNCTION F BY LOADING YDOT(I) WITH F(I).
211C N IS THE NUMBER OF FIRST-ORDER DIFFERENTIAL EQUATIONS IN THE
212C ABOVE MODEL. NPAR IS THE NUMBER OF MODEL PARAMETERS FOR WHICH
213C VECTOR SENSITIVITY FUNCTIONS ARE DESIRED. YOU ARE ALSO ENCOURAGED
214C TO PROVIDE A SUBROUTINE OF THE FORM..
215C              SUBROUTINE DF (N, T, Y, PAR, DFDP, JPAR)
216C              DOUBLE PRECISION T, Y, PAR, DFDP
217C              DIMENSION Y(N), PAR(NPAR), DFDP(N)
218C              GO TO (1,...,NPAR) JPAR
219C         1    DFDP(1) = DF(1)/DP(1)
220C              .
221C              DFDP(I) = DF(I)/DP(1)
222C              .
223C              DFDP(N) = DF(N)/DP(1)
224C              RETURN
225C         2    DFDP(1) = DF(1)/DP(2)
226C              .
227C              DFDP(I) = DF(I)/DP(2)
228C              .
229C              DFDP(N) = DF(N)/DP(2)
230C              RETURN
231C         .    .
232C         .    .
233C              RETURN
234C       NPAR   DFDP(1) = DF(1)/DP(NPAR)
235C              .
236C              DFDP(I) = DF(I)/DP(NPAR)
237C              .
238C              DFDP(N) = DF(N)/DP(NPAR)
239C              RETURN
240C              END
241C ONLY NONZERO ELEMENTS NEED BE LOADED. IF THIS IS NOT FEASIBLE,
242C ODESSA WILL GENERATE THIS MATRIX INTERNALLY BY DIFFERENCE QUOTIENTS.
243C
244C B. NEXT DETERMINE (OR GUESS) WHETHER OR NOT THE PROBLEM IS STIFF.
245C STIFFNESS OCCURS WHEN THE JACOBIAN MATRIX DF/DY HAS AN EIGENVALUE
246C WHOSE REAL PART IS NEGATIVE AND LARGE IN MAGNITUDE, COMPARED TO THE
247C RECIPROCAL OF THE T SPAN OF INTEREST.  IF THE PROBLEM IS NONSTIFF,
248C USE METH = 10.  IF IT IS STIFF, USE METH = 20. THE USER IS REQUIRED
249C TO INPUT THE METHOD FLAG MF = 10*METH + MITER. THERE ARE FOUR
250C STANDARD CHOICES FOR MITER WHEN A SENSITIVITY ANALYSIS IS DESIRED,
251C AND ODESSA REQUIRES THE JACOBIAN MATRIX IN SOME FORM.
252C THIS MATRIX IS REGARDED EITHER AS FULL (MITER = 1 OR 2),
253C OR BANDED (MITER = 4 OR 5). IN THE BANDED CASE, ODESSA REQUIRES TWO
254C HALF-BANDWIDTH PARAMETERS ML AND MU.  THESE ARE, RESPECTIVELY, THE
255C WIDTHS OF THE LOWER AND UPPER PARTS OF THE BAND, EXCLUDING THE MAIN
256C DIAGONAL.  THUS THE BAND CONSISTS OF THE LOCATIONS (I,J) WITH
257C I-ML .LE. J .LE. I+MU, AND THE FULL BANDWIDTH IS ML+MU+1.
258C
259C C. YOU ARE ENCOURAGED TO SUPPLY THE JACOBIAN DIRECTLY (MF = 11, 14,
260C 21, OR 24), BUT IF THIS IS NOT FEASIBLE, ODESSA WILL COMPUTE IT
261C INTERNALLY BY DIFFERENCE QUOTIENTS (MF = 12, 15, 22, OR 25). IF YOU
262C ARE SUPPLYING THE JACOBIAN, PROVIDE A SUBROUTINE OF THE FORM..
263C         SUBROUTINE JAC (NEQ, T, Y, PAR, ML, MU, PD, NROWPD)
264C         DOUBLE PRECISION T, Y, PAR, PD
265C         DIMENSION Y(N), PD(NROWPD,N), PAR(NPAR)
266C WHICH SUPPLIES DF/DY BY LOADING PD AS FOLLOWS..
267C  FOR A FULL JACOBIAN (MF = 11, OR 21), LOAD PD(I,J) WITH DF(I)/DY(J),
268C  THE PARTIAL DERIVATIVE OF F(I) WITH RESPECT TO Y(J).  (IGNORE THE
269C  ML AND MU ARGUMENTS IN THIS CASE.)
270C  FOR A BANDED JACOBIAN (MF = 14, OR 24), LOAD PD(I-J+MU+1,J) WITH
271C  DF(I)/DY(J), I.E. LOAD THE DIAGONAL LINES OF DF/DY INTO THE ROWS OF
272C  PD FROM THE TOP DOWN.
273C IN EITHER CASE, ONLY NONZERO ELEMENTS NEED BE LOADED.
274C
275C D. WRITE A MAIN PROGRAM WHICH CALLS SUBROUTINE ODESSA ONCE FOR
276C EACH POINT AT WHICH ANSWERS ARE DESIRED.  THIS SHOULD ALSO PROVIDE
277C FOR POSSIBLE USE OF LOGICAL UNIT 6 FOR OUTPUT OF ERROR MESSAGES BY
278C ODESSA.  ON THE FIRST CALL TO ODESSA, SUPPLY ARGUMENTS AS FOLLOWS..
279C F     = NAME OF SUBROUTINE FOR RIGHT-HAND SIDE VECTOR F (MODEL).
280C         THIS NAME MUST BE DECLARED EXTERNAL IN CALLING PROGRAM.
281C DF    = NAME OF SUBROUTINE FOR INHOMOGENEITY MATRIX DF/DP.
282C         IF USED (IDF = 1), THIS NAME MUST BE DECLARED EXTERNAL IN
283C         CALLING PROGRAM. IF NOT USED (IDF = 0), PASS A DUMMY NAME.
284C N     = NUMBER OF FIRST ORDER ODE-S IN MODEL; LOAD INTO NEQ(1).
285C NPAR  = NUMBER OF MODEL PARAMETERS OF INTEREST; LOAD INTO NEQ(2).
286C Y     = AN (N) BY (NPAR+1) REAL ARRAY OF INITIAL VALUES..
287C         Y(I,1) , I = 1,N , CONTAIN THE STATE, OR MODEL, DEPENDENT
288C                            VARIABLES,
289C         Y(I,J) , J = 2,NPAR , CONTAIN THE DEPENDENT SENSITIVITY
290C                               COEFFICIENTS.
291C PAR   = A REAL ARRAY OF LENGTH NPAR CONTAINING MODEL PARAMETERS
292C         OF INTEREST.
293C T     = THE INITIAL VALUE OF THE INDEPENDENT VARIABLE.
294C TOUT  = FIRST POINT WHERE OUTPUT IS DESIRED (.NE. T).
295C ITOL  = 1, 2, 3, OR 4 ACCORDING AS RTOL, ATOL (BELOW) ARE  SCALARS
296C         OR ARRAYS.
297C RTOL  = RELATIVE TOLERANCE PARAMETER (SCALAR OR (N) BY (NPAR+1)
298C         ARRAY).
299C ATOL  = ABSOLUTE TOLERANCE PARAMETER (SCALAR OR (N) BY (NPAR+1)
300C         ARRAY).
301C         THE ESTIMATED LOCAL ERROR IN Y(I,J) WILL BE CONTROLLED SO AS
302C         TO BE ROUGHLY LESS (IN MAGNITUDE) THAN
303C          EWT(I,J) = RTOL*ABS(Y(I,J)) + ATOL          IF ITOL = 1,
304C          EWT(I,J) = RTOL*ABS(Y(I,J)) + ATOL(I,J)     IF ITOL = 2,
305C          EWT(I,J) = RTOL(I,J)*ABS(Y(I,J) + ATOL      IF ITOL = 3, OR
306C          EWT(I,J) = RTOL(I,J)*ABS(Y(I,J) + ATOL(I,J) IF ITOL = 4.
307C         THUS THE LOCAL ERROR TEST PASSES IF, IN EACH COMPONENT,
308C         EITHER THE ABSOLUTE ERROR IS LESS THAN ATOL (OR ATOL(I,J)),
309C         OR THE RELATIVE ERROR IS LESS THAN RTOL (OR RTOL(I,J)).
310C         USE RTOL = 0.0 FOR PURE ABSOLUTE ERROR CONTROL, AND
311C         USE ATOL = 0.0 FOR PURE RELATIVE ERROR CONTROL.
312C         CAUTION.. ACTUAL (GLOBAL) ERRORS MAY EXCEED THESE LOCAL
313C         TOLERANCES, SO CHOOSE THEM CONSERVATIVELY.
314C ITASK = 1 FOR NORMAL COMPUTATION OF OUTPUT VALUES OF Y AT T = TOUT.
315C ISTATE = INTEGER FLAG (INPUT AND OUTPUT).  SET ISTATE = 1.
316C IOPT  = 0, TO INDICATE NO OPTIONAL INPUTS FOR INTEGRATION;
317C          LOAD INTO IOPT(1).
318C ISOPT = 1, TO INDICATE SENSITIVITY ANALYSIS, = 0, TO INDICATE
319C          NO SENSITIVITY ANALYSIS; LOAD INTO IOPT(2).
320C IDF   = 1, IF SUBROUTINE DF (ABOVE) IS SUPPLIED BY THE USER,
321C          = 0, OTHERWISE; LOAD INTO IOPT(3).
322C RWORK = REAL WORK ARRAY OF LENGTH AT LEAST..
323C           22 + 16*N + N**2           FOR MF = 11 OR 12,
324C           22 + 17*N + (2*ML + MU)*N  FOR MF = 14 OR 15,
325C           22 +  9*N + N**2           FOR MF = 21 OR 22,
326C           22 + 10*N + (2*ML + MU)*N  FOR MF = 24 OR 25,
327C         IF ISOPT = 0, OR..
328C           22 + 15*(NPAR+1)*N + N**2 + N           FOR MF = 11 OR 12,
329C           24 + 15*(NPAR+1)*N + (2*ML+MU+2)*N + N  FOR MF = 14 OR 15,
330C           22 + 8*(NPAR+1)*N + N**2 + N            FOR MF = 21 OR 22,
331C           24 + 8*(NPAR+1)*N + (2*ML+MU+2)*N + N   FOR MF = 24 OR 25,
332C         IF ISOPT = 1.
333C LRW   = DECLARED LENGTH OF RWORK (IN USER-S DIMENSION STATEMENT).
334C IWORK = INTEGER WORK ARRAY OF LENGTH AT LEAST..
335C          20 + N         IF ISOPT = 0,
336C          21 + N + NPAR  IF ISOPT = 1.
337C        IF MITER = 4 OR 5, INPUT IN IWORK(1),IWORK(2) THE LOWER
338C        AND UPPER HALF-BANDWIDTHS ML,MU (EXCLUDING MAIN DIAGONAL).
339C LIW  = DECLARED LENGTH OF IWORK (IN USER-S DIMENSION STATEMENT).
340C JAC  = NAME OF SUBROUTINE FOR JACOBIAN MATRIX.
341C        IF USED, THIS NAME MUST BE DECLARED EXTERNAL IN CALLING
342C        PROGRAM.  IF NOT USED, PASS A DUMMY NAME.
343C MF   = METHOD FLAG.  STANDARD VALUES FOR ISOPT = 0 ARE..
344C         10 FOR NONSTIFF (ADAMS) METHOD, NO JACOBIAN USED.
345C         21 FOR STIFF (BDF) METHOD, USER-SUPPLIED FULL JACOBIAN.
346C         22 FOR STIFF METHOD, INTERNALLY GENERATED FULL JACOBIAN.
347C         24 FOR STIFF METHOD, USER-SUPPLIED BANDED JACOBIAN.
348C         25 FOR STIFF METHOD, INTERNALLY GENERATED BANDED JACOBIAN.
349C        IF ISOPT = 1, MF = 10 IS ILLEGAL AND CAN BE REPLACED BY..
350C         11 FOR NONSTIFF METHOD, USER-SUPPLIED FULL JACOBIAN.
351C         12 FOR NONSTIFF METHOD, INTERNALLY GENERATED FULL JACOBIAN.
352C         14 FOR NONSTIFF METHOD, USER-SUPPLIED BANDED JACOBIAN.
353C         15 FOR NONSTIFF METHOD, INTERNALLY GENERATED BANDED JACOBIAN.
354C NOTE THAT THE MAIN PROGRAM MUST DECLARE ARRAYS Y, RWORK, IWORK, AND
355C POSSIBLY ATOL AND RTOL, AS WELL AS NEQ, IOPT, AND PAR IF ISOPT = 1.
356C
357C E. THE OUTPUT FROM THE FIRST CALL (OR ANY CALL) IS..
358C     Y = ARRAY OF COMPUTED VALUES OF Y(T) VECTOR.
359C     T = CORRESPONDING VALUE OF INDEPENDENT VARIABLE (NORMALLY TOUT).
360C ISTATE = 2  IF ODESSA WAS SUCCESSFUL, NEGATIVE OTHERWISE.
361C         -1 MEANS EXCESS WORK DONE ON THIS CALL (PERHAPS WRONG MF).
362C         -2 MEANS EXCESS ACCURACY REQUESTED (TOLERANCES TOO SMALL).
363C         -3 MEANS ILLEGAL INPUT DETECTED (SEE PRINTED MESSAGE).
364C         -4 MEANS REPEATED ERROR TEST FAILURES (CHECK ALL INPUTS).
365C         -5 MEANS REPEATED CONVERGENCE FAILURES (PERHAPS BAD JACOBIAN
366C            SUPPLIED OR WRONG CHOICE OF MF OR TOLERANCES).
367C         -6 MEANS ERROR WEIGHT BECAME ZERO DURING PROBLEM. (SOLUTION
368C            COMPONENT I,J VANISHED, AND ATOL OR ATOL(I,J) = 0.0)
369C
370C F. TO CONTINUE THE INTEGRATION AFTER A SUCCESSFUL RETURN, SIMPLY
371C RESET TOUT AND CALL ODESSA AGAIN. NO OTHER PARAMETERS NEED BE RESET.
372C----------------------------------------------------------------------
373C EXAMPLE PROBLEM.
374C
375C THE FOLLOWING IS A SIMPLE EXAMPLE PROBLEM, WITH THE CODING
376C NEEDED FOR ITS SOLUTION BY ODESSA.  THE PROBLEM IS FROM CHEMICAL
377C KINETICS, AND CONSISTS OF THE FOLLOWING THREE RATE EQUATIONS..
378C    DY1/DT = -PAR(1)*Y1 + PAR(2)*Y2*Y3 ; PAR(1) = .04, PAR(2) = 1.E4
379C    DY2/DT = PAR(1)*Y1 - PAR(2)*Y2*Y3 - PAR(3)*Y2**2 ; PAR(3) = 3.E7
380C    DY3/DT = PAR(3)*Y2**2
381C ON THE INTERVAL FROM T = 0.0 TO T = 4.E10, WITH INITIAL CONDITIONS
382C Y1 = 1.0, Y2 = Y3 = 0, AND S(I,J) = 0, I = 1,3, J = 1,3.
383C THE PROBLEM IS STIFF.
384C
385C THE FOLLOWING CODING KppSolveS THIS PROBLEM WITH ODESSA, USING
386C MF = 21 AND PRINTING RESULTS AT T = .4, 4., ..., 4.E10.
387C IT USES ITOL = 4 AND ATOL MUCH SMALLER FOR Y2 THAN Y1 OR Y3,
388C BECAUSE Y2 HAS MUCH SMALLER VALUES. LESS STRINGENT TOLERANCES
389C ARE ASSIGNED FOR THE SENSITIVITIES TO ACHIEVE GREATER EFFICIENCY.
390C AT THE END OF THE RUN, STATISTICAL QUANTITIES OF INTEREST ARE
391C PRINTED (SEE OPTIONAL OUTPUTS IN THE FULL DESCRIPTION BELOW).
392C
393C      DOUBLE PRECISION ATOL, RWORK, RTOL, T, TOUT, Y, PAR
394C      EXTERNAL FEX, JEX, DFEX
395C      DIMENSION Y(3,4), PAR(3), ATOL(3,4), RTOL(3,4), RWORK(130),
396C     1  IWORK(27), NEQ(2), IOPT(3)
397C      N = 3
398C      NPAR = 3
399C      NEQ(1) = N
400C      NEQ(2) = NPAR
401C      NSV = NPAR+1
402C      DO 10 I = 1,N
403C      DO 10 J = 1,NSV
404C 10     Y(I,J) = 0.0D0
405C      Y(1,1) = 1.0D0
406C      PAR(1) = 0.04D0
407C      PAR(2) = 1.0D4
408C      PAR(3) = 3.0D7
409C      T = 0.D0
410C      TOUT = .4D0
411C      ITOL = 4
412C      ATOL(1,1) = 1.D-6
413C      ATOL(2,1) = 1.D-10
414C      ATOL(3,1) = 1.D-6
415C      DO 20 I = 1,N
416C        RTOL(I,1) = 1.D-4
417C        DO 15 J = 2,NSV
418C          RTOL(I,J) = 1.D-3
419C 15       ATOL(I,J) = 1.D2 * ATOL(I,1)
420C 20   CONTINUE
421C      ITASK = 1
422C      ISTATE = 1
423C      IOPT(1) = 0
424C      IOPT(2) = 1
425C      IOPT(3) = 1
426C      LRW = 130
427C      LIW = 27
428C      MF = 21
429C      DO 60 IOUT = 1,12
430C        CALL ODESSA(FEX,DFEX,NEQ,Y,PAR,T,TOUT,ITOL,RTOL,ATOL,
431C     1    ITASK,ISTATE, IOPT,RWORK,LRW,IWORK,LIW,JEX,MF)
432C        WRITE(6,30)T,Y(1,1),Y(2,1),Y(3,1)
433C 30     FORMAT(1X,7H AT T =,E12.4,6H   Y =,3E14.6)
434C        DO 50 J = 2,NSV
435C          JPAR = J-1
436C          WRITE(6,40)JPAR,Y(1,J),Y(2,J),Y(3,J)
437C 40       FORMAT(20X,2HS(,I1,3H) =,3E14.6)
438C 50     CONTINUE
439C        IF (ISTATE .LT. 0) GO TO 80
440C 60     TOUT = TOUT*10.D0
441C      WRITE(6,70)IWORK(11),IWORK(12),IWORK(13),IWORK(19)
442C 70   FORMAT(1X,/,12H NO. STEPS =,I4,11H  NO. F-S =,I4,11H  NO. J-S =,
443C     1  I4,12H  NO. DF-S =,I4)
444C      STOP
445C 80   WRITE(6,90)ISTATE
446C 90   FORMAT(///22H ERROR HALT.. ISTATE =,I3)
447C      STOP
448C      END
449C
450C      SUBROUTINE FEX (NEQ, T, Y, PAR, YDOT)
451C      DOUBLE PRECISION T, Y, YDOT, PAR
452C      DIMENSION Y(3), YDOT(3), PAR(3)
453C      YDOT(1) = -PAR(1)*Y(1) + PAR(2)*Y(2)*Y(3)
454C      YDOT(3) = PAR(3)*Y(2)*Y(2)
455C      YDOT(2) = -YDOT(1) - YDOT(3)
456C      RETURN
457C      END
458C
459C      SUBROUTINE JEX (NEQ, T, Y, PAR, ML, MU, PD, NRPD)
460C      DOUBLE PRECISION PD, T, Y, PAR
461C      DIMENSION Y(3), PD(NRPD,3), PAR(3)
462C      PD(1,1) = -PAR(1)
463C      PD(1,2) = PAR(2)*Y(3)
464C      PD(1,3) = PAR(2)*Y(2)
465C      PD(2,1) = PAR(1)
466C      PD(2,3) = -PD(1,3)
467C      PD(3,2) = 2.D0*PAR(3)*Y(2)
468C      PD(2,2) = -PD(1,2) - PD(3,2)
469C      RETURN
470C      END
471C
472C      SUBROUTINE DFEX (NEQ, T, Y, PAR, DFDP, JPAR)
473C      DOUBLE PRECISION T, Y, PAR, DFDP
474C      DIMENSION Y(3), PAR(3), DFDP(3)
475C      GO TO (1,2,3), JPAR
476C  1   DFDP(1) = -Y(1)
477C      DFDP(2) = Y(1)
478C      RETURN
479C  2   DFDP(1) = Y(2)*Y(3)
480C      DFDP(2) = -Y(2)*Y(3)
481C      RETURN
482C  3   DFDP(2) = -Y(2)*Y(2)
483C      DFDP(3) = Y(2)*Y(2)
484C      RETURN
485C      END
486C
487C  THE OUTPUT OF THIS PROGRAM (ON A DATA GENERAL MV-8000 IN
488C  DOUBLE PRECISION IS AS FOLLOWS:
489C
490C AT T =   .4000E+00   Y =   .985173E+00   .338641E-04   .147930E-01
491C                   S(1) =  -.355914E+00   .390261E-03   .355524E+00
492C                   S(2) =   .955150E-07  -.213065E-09  -.953019E-07
493C                   S(3) =  -.158466E-10  -.529012E-12   .163756E-10
494C AT T =   .4000E+01   Y =   .905516E+00   .224044E-04   .944615E-01
495C                   S(1) =  -.187621E+01   .179197E-03   .187603E+01
496C                   S(2) =   .296093E-05  -.583104E-09  -.296034E-05
497C                   S(3) =  -.493267E-09  -.276246E-12   .493544E-09
498C AT T =   .4000E+02   Y =   .715848E+00   .918628E-05   .284143E+00
499C                   S(1) =  -.424730E+01   .459360E-04   .424726E+01
500C                   S(2) =   .137294E-04  -.235815E-09  -.137291E-04
501C                   S(3) =  -.228818E-08  -.113803E-12   .228829E-08
502C AT T =   .4000E+03   Y =   .450526E+00   .322299E-05   .549471E+00
503C                   S(1) =  -.595837E+01   .354310E-05   .595836E+01
504C                   S(2) =   .227380E-04  -.226041E-10  -.227380E-04
505C                   S(3) =  -.378971E-08  -.499501E-13   .378976E-08
506C AT T =   .4000E+04   Y =   .183185E+00   .894131E-06   .816814E+00
507C                   S(1) =  -.475006E+01  -.599504E-05   .475007E+01
508C                   S(2) =   .188089E-04   .231330E-10  -.188089E-04
509C                   S(3) =  -.313478E-08  -.187575E-13   .313480E-08
510C AT T =   .4000E+05   Y =   .389733E-01   .162133E-06   .961027E+00
511C                   S(1) =  -.157477E+01  -.276199E-05   .157477E+01
512C                   S(2) =   .628668E-05   .110026E-10  -.628670E-05
513C                   S(3) =  -.104776E-08  -.453588E-14   .104776E-08
514C AT T =   .4000E+06   Y =   .493609E-02   .198411E-07   .995064E+00
515C                   S(1) =  -.236244E+00  -.458262E-06   .236244E+00
516C                   S(2) =   .944669E-06   .183193E-11  -.944671E-06
517C                   S(3) =  -.157441E-09  -.635990E-15   .157442E-09
518C AT T =   .4000E+07   Y =   .516087E-03   .206540E-08   .999484E+00
519C                   S(1) =  -.256277E-01  -.509808E-07   .256278E-01
520C                   S(2) =   .102506E-06   .203905E-12  -.102506E-06
521C                   S(3) =  -.170825E-10  -.684002E-16   .170826E-10
522C AT T =   .4000E+08   Y =   .519314E-04   .207736E-09   .999948E+00
523C                   S(1) =  -.259316E-02  -.518029E-08   .259316E-02
524C                   S(2) =   .103726E-07   .207209E-13  -.103726E-07
525C                   S(3) =  -.172845E-11  -.691450E-17   .172845E-11
526C AT T =   .4000E+09   Y =   .544710E-05   .217885E-10   .999995E+00
527C                   S(1) =  -.271637E-03  -.541849E-09   .271638E-03
528C                   S(2) =   .108655E-08   .216739E-14  -.108655E-08
529C                   S(3) =  -.180902E-12  -.723615E-18   .180902E-12
530C AT T =   .4000E+10   Y =   .446748E-06   .178699E-11   .100000E+01
531C                   S(1) =  -.322322E-04  -.842541E-10   .322323E-04
532C                   S(2) =   .128929E-09   .337016E-15  -.128929E-09
533C                   S(3) =  -.209715E-13  -.838859E-19   .209715E-13
534C AT T =   .4000E+11   Y =  -.363960E-07  -.145584E-12   .100000E+01
535C                   S(1) =  -.164109E-06  -.429604E-11   .164113E-06
536C                   S(2) =   .656436E-12   .171842E-16  -.656451E-12
537C                   S(3) =  -.689361E-15  -.275745E-20   .689363E-15
538C
539C NO. STEPS = 340  NO. F-S = 412  NO. J-S = 343  NO. DF-S =1023
540C----------------------------------------------------------------------
541C FULL DESCRIPTION OF USER INTERFACE TO ODESSA.
542C
543C THE USER INTERFACE TO ODESSA CONSISTS OF THE FOLLOWING PARTS.
544C
545C I.  THE CALL SEQUENCE TO SUBROUTINE ODESSA, WHICH IS A DRIVER
546C     ROUTINE FOR THE KppSolveR.  THIS INCLUDES DESCRIPTIONS OF BOTH
547C     THE CALL SEQUENCE ARGUMENTS AND OF USER-SUPPLIED ROUTINES.
548C     FOLLOWING THESE DESCRIPTIONS IS A DESCRIPTION OF
549C     OPTIONAL INPUTS AVAILABLE THROUGH THE CALL SEQUENCE, AND THEN
550C     A DESCRIPTION OF OPTIONAL OUTPUTS (IN THE WORK ARRAYS).
551C
552C II.  DESCRIPTIONS OF OTHER ROUTINES IN THE ODESSA PACKAGE THAT MAY
553C     BE (OPTIONALLY) CALLED BY THE USER.  THESE PROVIDE THE ABILITY
554C     TO ALTER ERROR MESSAGE HANDLING, SAVE AND RESTORE THE INTERNAL
555C     COMMON, AND OBTAIN SPECIFIED DERIVATIVES OF THE SOLUTION Y(T).
556C
557C III. DESCRIPTIONS OF COMMON BLOCKS TO BE DECLARED IN OVERLAY
558C     OR SIMILAR ENVIRONMENTS, OR TO BE SAVED WHEN DOING AN INTERRUPT
559C     OF THE PROBLEM AND CONTINUED SOLUTION LATER.
560C
561C IV.  DESCRIPTION OF TWO SUBROUTINES IN THE ODESSA PACKAGE, EITHER OF
562C     WHICH THE USER MAY REPLACE WITH HIS OWN VERSION, IF DESIRED.
563C     THESE RELATE TO THE MEASUREMENT OF ERRORS.
564C
565C V.   GENERAL REMARKS WHICH HIGHLIGHT DIFFERENCES BETWEEN THE LSODE
566C     PACKAGE AND THE ODESSA PACKAGE.
567C----------------------------------------------------------------------
568C PART I.  CALL SEQUENCE.
569C
570C THE CALL SEQUENCE PARAMETERS USED FOR INPUT ONLY ARE..
571C    F, DF, NEQ, PAR, TOUT, ITOL, RTOL, ATOL, ITASK, IOPT, LRW, LIW,
572C    JAC, MF,
573C AND THOSE USED FOR BOTH INPUT AND OUTPUT ARE
574C    Y, T, ISTATE.
575C THE WORK ARRAYS RWORK AND IWORK ARE ALSO USED FOR CONDITIONAL AND
576C OPTIONAL INPUTS AND OPTIONAL OUTPUTS.  (THE TERM OUTPUT HERE REFERS
577C TO THE RETURN FROM SUBROUTINE ODESSA TO THE USER-S CALLING PROGRAM.)
578C
579C THE LEGALITY OF INPUT PARAMETERS WILL BE THOROUGHLY CHECKED ON THE
580C INITIAL CALL FOR THE PROBLEM, BUT NOT CHECKED THEREAFTER UNLESS A
581C CHANGE IN INPUT PARAMETERS IS FLAGGED BY ISTATE = 3 ON INPUT.
582C
583C THE DESCRIPTIONS OF THE CALL ARGUMENTS ARE AS FOLLOWS.
584C
585C F     = THE NAME OF THE USER-SUPPLIED SUBROUTINE DEFINING THE
586C         ODE MODEL. THIS SYSTEM MUST BE PUT IN THE FIRST-ORDER
587C         FORM DY/DT = F(Y,T;P), WHERE F IS A VECTOR-VALUED FUNCTION
588C         OF THE SCALAR T AND VECTORS Y, AND PAR.  SUBROUTINE F IS TO
589C         COMPUTE THE FUNCTION F.  IT IS TO HAVE THE FORM..
590C              SUBROUTINE F (NEQ, T, Y, PAR, YDOT)
591C              DOUBLE PRECISION T, Y, PAR, YDOT
592C              DIMENSION Y(1), PAR(1), YDOT(1)
593C         WHERE NEQ, T, Y, AND PAR ARE INPUT, AND YDOT = F(Y,T;P)
594C         IS OUTPUT.  Y AND YDOT ARE ARRAYS OF LENGTH N (= NEQ(1)).
595C         (IN THE DIMENSION STATEMENT ABOVE, 1 IS A DUMMY
596C         DIMENSION.. IT CAN BE REPLACED BY ANY VALUE.)
597C         F SHOULD NOT ALTER ARRAY Y, OR PAR(1),...,PAR(NPAR).
598C         F MUST BE DECLARED EXTERNAL IN THE CALLING PROGRAM.
599C
600C         SUBROUTINE F MAY ACCESS USER-DEFINED QUANTITIES IN
601C         NEQ(2),... AND PAR(NPAR+1),... IF NEQ IS AN ARRAY
602C         (DIMENSIONED IN F) AND PAR HAS LENGTH EXCEEDING NPAR.
603C         SEE THE DESCRIPTIONS OF NEQ AND PAR BELOW.
604C
605C DF    = THE NAME OF THE USER-SUPPLIED ROUTINE (IDF = 1) TO COMPUTE
606C         THE INHOMOGENEITY MATRIX, DF/DP, AS A FUNCTION OF THE SCALAR
607C         T, AND THE VECTORS Y, AND PAR. IT IS TO HAVE THE FORM
608C                SUBROUTINE DF (NEQ, T, Y, PAR, DFDP, JPAR)
609C                DOUBLE PRECISION T, Y, PAR, DFDP
610C                DIMENSION Y(1), PAR(1), DFDP(1)
611C                GO TO (1,2,...,NPAR) JPAR
612C            1   DFDP(1) = DF(1)/DP(1)
613C                .
614C                DFDP(I) = DF(I)/DP(1)
615C                .
616C                DFDP(N) = DF(N)/DP(1)
617C                RETURN
618C            2   DFDP(1) = DF(1)/DP(2)
619C                .
620C                DFDP(I) = DF(I)/DP(2)
621C                .
622C                DFDP(N) = DF(N)/DP(2)
623C                .
624C                RETURN
625C            .   .
626C            .   .
627C          NPAR  DFDP(1) = DF(1)/DP(NPAR)
628C                .
629C                DFDP(I) = DF(I)/DP(NPAR)
630C                .
631C                DFDP(N) = DF(N)/DP(NPAR)
632C                RETURN
633C                END
634C         WHERE NEQ, T, Y, PAR, AND JPAR ARE INPUT AND THE VECTOR
635C         DFDP(*,JPAR) IS TO BE LOADED WITH THE PARTIAL DERIVATIVES
636C         DF(Y,T;PAR)/DP(JPAR) ON OUTPUT. ONLY NONZERO ELEMENTS NEED
637C         BE LOADED.  T, Y, AND PAR HAVE THE SAME MEANING AS IN
638C         SUBROUTINE F. (IN THE DIMENSION STATEMENT ABOVE, 1 IS A DUMMY
639C         DIMENSION.. IT CAN BE REPLACED BY ANY VALUE).
640C
641C         DFDP(*,JPAR) IS PRESET TO ZERO BY THE KppSolveR, SO THAT ONLY
642C         THE NONZERO ELEMENTS NEED BE LOADED BY DF. SUBROUTINE DF
643C         MUST BE DECLARED EXTERNAL IN THE CALLING PROGRAM IF USED.
644C         IF IDF = 0 (OR ISOPT = 0), A DUMMY ARGUMENT CAN BE USED.
645C
646C         SUBROUTINE DF MAY ACCESS USER-DEFINED QUANTITIES IN
647C         NEQ(2),... AND PAR(NPAR+1),... IF NEQ IS AN ARRAY
648C         (DIMENSIONED IN DF) AND PAR HAS A LENGTH EXCEEDING NPAR.
649C         SEE THE DESCRIPTIONS OF NEQ AND PAR (BELOW).
650C
651C NEQ   = THE SIZE OF THE ODE SYSTEM (NUMBER OF FIRST ORDER ORDINARY
652C         DIFFERENTIAL EQUATIONS (N) IN THE MODEL).  USED ONLY FOR
653C         INPUT.  NEQ MAY NOT BE CHANGED DURING THE PROBLEM.
654C
655C         FOR ISOPT = 0, NEQ IS NORMALLY A SCALAR.  HOWEVER, NEQ MAY
656C         BE AN ARRAY, WITH NEQ(1) SET TO THE SYSTEM SIZE (N), IN WHICH
657C         CASE THE ODESSA PACKAGE ACCESSES ONLY NEQ(1). HOWEVER,
658C         THIS PARAMETER IS PASSED AS THE NEQ ARGUMENT IN ALL CALLS
659C         TO F, DF, AND JAC.  HENCE, IF IT IS AN ARRAY, LOCATIONS
660C         NEQ(2),... MAY BE USED TO STORE OTHER INTEGER DATA AND PASS
661C         IT TO F, DF, AND/OR JAC.  FOR ISOPT = 1, NPAR MUST BE LOADED
662C         INTO NEQ(2), AND IS NOT ALLOWED TO CHANGE DURING THE PROBLEM.
663C         IN THESE CASES, SUBROUTINES F, DF, AND/OR JAC MUST INCLUDE
664C         NEQ IN A DIMENSION STATEMENT.
665C
666C Y     = A REAL ARRAY FOR THE VECTOR OF DEPENDENT VARIABLES, OF
667C         DIMENSION (N) BY (NPAR+1).  USED FOR BOTH INPUT AND
668C         OUTPUT ON THE FIRST CALL (ISTATE = 1), AND ONLY FOR
669C         OUTPUT ON OTHER CALLS. ON THE FIRST CALL, Y MUST CONTAIN
670C         THE VECTORS OF INITIAL VALUES.  ON OUTPUT, Y CONTAINS THE
671C         COMPUTED SOLUTION VECTORS, EVALUATED AT T.
672C
673C PAR   = A REAL ARRAY FOR THE VECTOR OF CONSTANT MODEL PARAMETERS
674C         OF INTEREST IN THE SENSITIVITY ANALYSIS, OF LENGTH NPAR
675C         OR MORE. PAR IS PASSED AS AN ARGUMENT IN ALL CALLS TO F,
676C         DF, AND JAC. HENCE LOCATIONS PAR(NPAR+1),... MAY BE USED
677C         TO STORE OTHER REAL DATA AND PASS IT TO F, DF, AND/OR JAC.
678C         LOCATIONS PAR(1),...,PAR(NPAR) ARE USED AS INPUT ONLY,
679C         AND MUST NOT BE CHANGED DURING THE PROBLEM.
680C
681C T     = THE INDEPENDENT VARIABLE.  ON INPUT, T IS USED ONLY ON THE
682C         FIRST CALL, AS THE INITIAL POINT OF THE INTEGRATION.
683C         ON OUTPUT, AFTER EACH CALL, T IS THE VALUE AT WHICH A
684C         COMPUTED SOLUTION Y IS EVALUATED (USUALLY THE SAME AS TOUT).
685C         ON AN ERROR RETURN, T IS THE FARTHEST POINT REACHED.
686C
687C TOUT  = THE NEXT VALUE OF T AT WHICH A COMPUTED SOLUTION IS DESIRED.
688C         USED ONLY FOR INPUT.
689C
690C         WHEN STARTING THE PROBLEM (ISTATE = 1), TOUT MAY BE EQUAL
691C         TO T FOR ONE CALL, THEN SHOULD .NE. T FOR THE NEXT CALL.
692C         FOR THE INITIAL T, AN INPUT VALUE OF TOUT .NE. T IS USED
693C         IN ORDER TO DETERMINE THE DIRECTION OF THE INTEGRATION
694C         (I.E. THE ALGEBRAIC SIGN OF THE STEP SIZES) AND THE ROUGH
695C         SCALE OF THE PROBLEM.  INTEGRATION IN EITHER DIRECTION
696C         (FORWARD OR BACKWARD IN T) IS PERMITTED.
697C
698C         IF ITASK = 2 OR 5 (ONE-STEP MODES), TOUT IS IGNORED AFTER
699C         THE FIRST CALL (I.E. THE FIRST CALL WITH TOUT .NE. T).
700C         OTHERWISE, TOUT IS REQUIRED ON EVERY CALL.
701C
702C         IF ITASK = 1, 3, OR 4, THE VALUES OF TOUT NEED NOT BE
703C         MONOTONE, BUT A VALUE OF TOUT WHICH BACKS UP IS LIMITED
704C         TO THE CURRENT INTERNAL T INTERVAL, WHOSE ENDPOINTS ARE
705C         TCUR - HU AND TCUR (SEE OPTIONAL OUTPUTS, BELOW, FOR
706C         TCUR AND HU).
707C
708C ITOL  = AN INDICATOR FOR THE TYPE OF ERROR CONTROL.  SEE
709C         DESCRIPTION BELOW UNDER ATOL.  USED ONLY FOR INPUT.
710C
711C RTOL  = A RELATIVE ERROR TOLERANCE PARAMETER, EITHER A SCALAR OR
712C         AN ARRAY OF SPACE (N) BY (NPAR+1).  SEE DESCRIPTION BELOW
713C         UNDER ATOL. INPUT ONLY.
714C
715C ATOL  = AN ABSOLUTE ERROR TOLERANCE PARAMETER, EITHER A SCALAR OR
716C         AN ARRAY OF SPACE (N) BY (NPAR+1).  INPUT ONLY.
717C
718C            THE INPUT PARAMETERS ITOL, RTOL, AND ATOL DETERMINE
719C         THE ERROR CONTROL PERFORMED BY THE KppSolveR.  THE KppSolveR WILL
720C         CONTROL THE VECTOR E = (E(I,J)) OF ESTIMATED LOCAL ERRORS
721C         IN Y, ACCORDING TO AN INEQUALITY OF THE FORM
722C                   RMS-NORM OF ( E(I,J)/EWT(I,J) )   .LE.   1,
723C         WHERE     EWT(I,J) = RTOL(I,J)*ABS(Y(I,J)) + ATOL(I,J),
724C         AND THE RMS-NORM (ROOT-MEAN-SQUARE NORM) HERE IS
725C         RMS-NORM(V) = SQRT ( (1/N) * SUM (V(I,J)**2) ); I =1,...,N.
726C         HERE EWT = (EWT(I,J)) IS A VECTOR OF WEIGHTS WHICH MUST
727C         ALWAYS BE POSITIVE, AND THE VALUES OF RTOL AND ATOL SHOULD
728C         ALL BE NON-NEGATIVE.  THE FOLLOWING TABLE GIVES THE TYPES
729C         (SCALAR/ARRAY) OF RTOL AND ATOL, AND THE CORRESPONDING FORM
730C         OF EWT(I,J).
731C
732C          ITOL   RTOL      ATOL           EWT(I,J)
733C           1    SCALAR    SCALAR   RTOL*ABS(Y(I,J)) + ATOL
734C           2    SCALAR    ARRAY    RTOL*ABS(Y(I,J)) + ATOL(I,J)
735C           3    ARRAY     SCALAR   RTOL(I,J)*ABS(Y(I,J)) + ATOL
736C           4    ARRAY     ARRAY    RTOL(I,J)*ABS(Y(I,J)) + ATOL(I,J)
737C
738C         WHEN EITHER OF THESE PARAMETERS IS A SCALAR, IT NEED NOT
739C         BE DIMENSIONED IN THE USER-S CALLING PROGRAM.
740C
741C         THE TOTAL NUMBER OF ERROR TEST FAILURES DUE TO THE SENSITIVITY
742C         ANALYSIS, AND WHICH REQUIRE AN INTEGRATION STEP TO BE
743C         REPEATED, ARE ACCUMULATED IN THE LAST NPAR+1 LOCATIONS OF THE
744C         INTEGER WORK ARRAY IWORK (SEE OPTIONAL OUTPUTS BELOW).
745C         THIS INFORMATION MAY BE OF VALUE IN DETERMINING APPROPRIATE
746C         ERROR TOLERANCES TO BE APPLIED TO THE SENSITIVITY FUNCTIONS.
747C
748C         IF NONE OF THE ABOVE CHOICES (WITH ITOL, RTOL, AND ATOL
749C         FIXED THROUGHOUT THE PROBLEM) IS SUITABLE, MORE GENERAL
750C         ERROR CONTROLS CAN BE OBTAINED BY SUBSTITUTING
751C         USER-SUPPLIED ROUTINES FOR THE SETTING OF EWT AND/OR FOR
752C         THE NORM CALCULATION.  SEE PART IV BELOW.
753C
754C         IF GLOBAL ERRORS ARE TO BE ESTIMATED BY MAKING A REPEATED
755C         RUN ON THE SAME PROBLEM WITH SMALLER TOLERANCES, THEN ALL
756C         COMPONENTS OF RTOL AND ATOL (I.E. OF EWT) SHOULD BE SCALED
757C         DOWN UNIFORMLY.
758C
759C ITASK  = AN INDEX SPECIFYING THE TASK TO BE PERFORMED.
760C         INPUT ONLY.  ITASK HAS THE FOLLOWING VALUES AND MEANINGS.
761C         1  MEANS NORMAL COMPUTATION OF OUTPUT VALUES OF Y(T) AT
762C            T = TOUT (BY OVERSHOOTING AND INTERPOLATING).
763C         2  MEANS TAKE ONE STEP ONLY AND RETURN.
764C         3  MEANS STOP AT THE FIRST INTERNAL MESH POINT AT OR
765C            BEYOND T = TOUT AND RETURN.
766C         4  MEANS NORMAL COMPUTATION OF OUTPUT VALUES OF Y(T) AT
767C            T = TOUT BUT WITHOUT OVERSHOOTING T = TCRIT.
768C            TCRIT MUST BE INPUT AS RWORK(1).  TCRIT MAY BE EQUAL TO
769C            OR BEYOND TOUT, BUT NOT BEHIND IT IN THE DIRECTION OF
770C            INTEGRATION.  THIS OPTION IS USEFUL IF THE PROBLEM
771C            HAS A SINGULARITY AT OR BEYOND T = TCRIT.
772C         5  MEANS TAKE ONE STEP, WITHOUT PASSING TCRIT, AND RETURN.
773C            TCRIT MUST BE INPUT AS RWORK(1).
774C
775C         NOTE..  IF ITASK = 4 OR 5 AND THE KppSolveR REACHES TCRIT
776C         (WITHIN ROUNDOFF), IT WILL RETURN T = TCRIT (EXACTLY) TO
777C         INDICATE THIS (UNLESS ITASK = 4 AND TOUT COMES BEFORE TCRIT,
778C         IN WHICH CASE ANSWERS AT T = TOUT ARE RETURNED FIRST).
779C
780C ISTATE = AN INDEX USED FOR INPUT AND OUTPUT TO SPECIFY THE
781C         THE STATE OF THE CALCULATION.
782C
783C         ON INPUT, THE VALUES OF ISTATE ARE AS FOLLOWS.
784C         1  MEANS THIS IS THE FIRST CALL FOR THE PROBLEM
785C            (INITIALIZATIONS WILL BE DONE).  SEE NOTE BELOW.
786C         2  MEANS THIS IS NOT THE FIRST CALL, AND THE CALCULATION
787C            IS TO CONTINUE NORMALLY, WITH NO CHANGE IN ANY INPUT
788C            PARAMETERS EXCEPT POSSIBLY TOUT AND ITASK.
789C            (IF ITOL, RTOL, AND/OR ATOL ARE CHANGED BETWEEN CALLS
790C            WITH ISTATE = 2, THE NEW VALUES WILL BE USED BUT NOT
791C            TESTED FOR LEGALITY.)
792C         3  MEANS THIS IS NOT THE FIRST CALL, AND THE
793C            CALCULATION IS TO CONTINUE NORMALLY, BUT WITH
794C            A CHANGE IN INPUT PARAMETERS OTHER THAN
795C            TOUT AND ITASK.  CHANGES ARE ALLOWED IN
796C            ITOL, RTOL, ATOL, IOPT, LRW, LIW, MF, ML, MU,
797C            AND ANY OF THE OPTIONAL INPUTS EXCEPT H0.
798C            (SEE IWORK DESCRIPTION FOR ML AND MU.)
799C         NOTE..  A PRELIMINARY CALL WITH TOUT = T IS NOT COUNTED
800C         AS A FIRST CALL HERE, AS NO INITIALIZATION OR CHECKING OF
801C         INPUT IS DONE.  (SUCH A CALL IS SOMETIMES USEFUL FOR THE
802C         PURPOSE OF OUTPUTTING THE INITIAL CONDITIONS.)
803C         THUS THE FIRST CALL FOR WHICH TOUT .NE. T REQUIRES
804C         ISTATE = 1 ON INPUT.
805C
806C         ON OUTPUT, ISTATE HAS THE FOLLOWING VALUES AND MEANINGS.
807C          1  MEANS NOTHING WAS DONE, AS TOUT WAS EQUAL TO T WITH
808C             ISTATE = 1 ON INPUT.  (HOWEVER, AN INTERNAL COUNTER WAS
809C             SET TO DETECT AND PREVENT REPEATED CALLS OF THIS TYPE.)
810C          2  MEANS THE INTEGRATION WAS PERFORMED SUCCESSFULLY.
811C         -1  MEANS AN EXCESSIVE AMOUNT OF WORK (MORE THAN MXSTEP
812C             STEPS) WAS DONE ON THIS CALL, BEFORE COMPLETING THE
813C             REQUESTED TASK, BUT THE INTEGRATION WAS OTHERWISE
814C             SUCCESSFUL AS FAR AS T.  (MXSTEP IS AN OPTIONAL INPUT
815C             AND IS NORMALLY 500.)  TO CONTINUE, THE USER MAY
816C             SIMPLY RESET ISTATE TO A VALUE .GT. 1 AND CALL AGAIN
817C             (THE EXCESS WORK STEP COUNTER WILL BE RESET TO 0).
818C             IN ADDITION, THE USER MAY INCREASE MXSTEP TO AVOID
819C             THIS ERROR RETURN (SEE BELOW ON OPTIONAL INPUTS).
820C         -2  MEANS TOO MUCH ACCURACY WAS REQUESTED FOR THE PRECISION
821C             OF THE MACHINE BEING USED.  THIS WAS DETECTED BEFORE
822C             COMPLETING THE REQUESTED TASK, BUT THE INTEGRATION
823C             WAS SUCCESSFUL AS FAR AS T.  TO CONTINUE, THE TOLERANCE
824C             PARAMETERS MUST BE RESET, AND ISTATE MUST BE SET
825C             TO 3.  THE OPTIONAL OUTPUT TOLSF MAY BE USED FOR THIS
826C             PURPOSE.  (NOTE.. IF THIS CONDITION IS DETECTED BEFORE
827C             TAKING ANY STEPS, THEN AN ILLEGAL INPUT RETURN
828C             (ISTATE = -3) OCCURS INSTEAD.)
829C         -3  MEANS ILLEGAL INPUT WAS DETECTED, BEFORE TAKING ANY
830C             INTEGRATION STEPS.  SEE WRITTEN MESSAGE FOR DETAILS.
831C             NOTE..  IF THE KppSolveR DETECTS AN INFINITE LOOP OF CALLS
832C             TO THE KppSolveR WITH ILLEGAL INPUT, IT WILL CAUSE
833C             THE RUN TO STOP.
834C         -4  MEANS THERE WERE REPEATED ERROR TEST FAILURES ON
835C             ONE ATTEMPTED STEP, BEFORE COMPLETING THE REQUESTED
836C             TASK, BUT THE INTEGRATION WAS SUCCESSFUL AS FAR AS T.
837C             THE PROBLEM MAY HAVE A SINGULARITY, OR THE INPUT
838C             MAY BE INAPPROPRIATE.
839C         -5  MEANS THERE WERE REPEATED CONVERGENCE TEST FAILURES ON
840C             ONE ATTEMPTED STEP, BEFORE COMPLETING THE REQUESTED
841C             TASK, BUT THE INTEGRATION WAS SUCCESSFUL AS FAR AS T.
842C             THIS MAY BE CAUSED BY AN INACCURATE JACOBIAN MATRIX,
843C             IF ONE IS BEING USED.
844C         -6  MEANS EWT(I,J) BECAME ZERO FOR SOME I,J DURING THE
845C             INTEGRATION.  PURE RELATIVE ERROR CONTROL (ATOL(I,J)=0.0)
846C             WAS REQUESTED ON A VARIABLE WHICH HAS NOW VANISHED.
847C             THE INTEGRATION WAS SUCCESSFUL AS FAR AS T.
848C
849C         NOTE..  SINCE THE NORMAL OUTPUT VALUE OF ISTATE IS 2,
850C         IT DOES NOT NEED TO BE RESET FOR NORMAL CONTINUATION.
851C         ALSO, SINCE A NEGATIVE INPUT VALUE OF ISTATE WILL BE
852C         REGARDED AS ILLEGAL, A NEGATIVE OUTPUT VALUE REQUIRES THE
853C         USER TO CHANGE IT, AND POSSIBLY OTHER INPUTS, BEFORE
854C         CALLING THE KppSolveR AGAIN.
855C
856C IOPT  = AN INTEGER ARRAY FLAG TO SPECIFY WHETHER OR NOT ANY OPTIONAL
857C         INPUTS ARE BEING USED ON THIS CALL.  INPUT ONLY.
858C         THE OPTIONAL INPUTS ARE LISTED SEPARATELY BELOW.
859C         IOPT(1) = 0 MEANS NO OPTIONAL INPUTS FOR THE KppSolveR WILL BE
860C                   USED. DEFAULT VALUES WILL BE USED IN ALL CASES.
861C                 = 1 MEANS ONE OR MORE OPTIONAL INPUTS FOR THE
862C                   KppSolveR ARE BEING USED.
863C                   NOTE : IOPT(1) IS INDEPENDENT OF ISOPT AND IDF.
864C         IOPT(2) = 0 MEANS NO SENSITIVITY ANALYSIS WILL BE PERFORMED.
865C                 = 1 MEANS A SENSITIVITY ANALYSIS WILL BE PERFORMED.
866C                   NOTE : IOPT(2) IS RENAMED TO ISOPT IN ODESSA.
867C                 = 0 MEANS DF/DP WILL BE CALCULATED BY FINITE
868C                   DIFFERENCE WITHIN ODESSA.
869C         IOPT(3) = 1 MEANS DF/DP WILL BE CALCULATED BY A USER-SUPPLIED
870C                   ROUTINE.
871C                   NOTE : IOPT(3) IS RENAMED TO IDF IN ODESSA.
872C                          IF IDF = 1, THE USER MUST SUPPLY A
873C                          SUBROUTINE DF (THE NAME IS ARBITRARY) AS
874C                          DESCRIBED BELOW UNDER DF. FOR IDF = 0,
875C                          A DUMMY ARGUMENT CAN BE USED.
876C
877C RWORK  = A REAL WORKING ARRAY (DOUBLE PRECISION).
878C         FOR ISOPT = 0, THE LENGTH OF RWORK MUST BE AT LEAST..
879C            20 + NYH*(MAXORD + 1) + 3*NEQ + LWM
880C         FOR ISOPT = 1, THE LENGTH OF RWORK MUST BE AT LEAST..
881C            20 + NYH*(MAXORD + 1) + 2*NYH + LWM + N
882C         WHERE..
883C         NYH    = THE TOTAL NUMBER OF DEPENDENT VARIABLES;
884C                  (= N IF ISOPT = 0, AND N*(NPAR+1) IF ISOPT = 1).
885C         MAXORD = 12 (IF METH = 1) OR 5 (IF METH = 2) (UNLESS A
886C                  SMALLER VALUE IS GIVEN AS AN OPTIONAL INPUT),
887C         LWM    = 0                  IF MITER = 0,
888C         LWM    = N**2 + 2           IF MITER IS 1 OR 2,
889C         LWM    = N + 2              IF MITER = 3, AND
890C         LWM    = (2*ML+MU+1)*N + 2  IF MITER IS 4 OR 5.
891C         (SEE THE MF DESCRIPTION FOR METH AND MITER.)
892C
893C         THE FIRST 20 WORDS OF RWORK ARE RESERVED FOR CONDITIONAL
894C         AND OPTIONAL INPUTS AND OPTIONAL OUTPUTS.
895C
896C         THE FOLLOWING WORD IN RWORK IS A CONDITIONAL INPUT..
897C           RWORK(1) = TCRIT = CRITICAL VALUE OF T WHICH THE KppSolveR
898C                      IS NOT TO OVERSHOOT.  REQUIRED IF ITASK IS
899C                      4 OR 5, AND IGNORED OTHERWISE.  (SEE ITASK.)
900C
901C LRW   = THE LENGTH OF THE ARRAY RWORK, AS DECLARED BY THE USER.
902C         (THIS WILL BE CHECKED BY THE KppSolveR.)
903C
904C IWORK  = AN INTEGER WORK ARRAY. THE LENGTH MUST BE AT LEAST..
905C            20      IF MITER = 0 OR 3 (MF = 10, 13, 20, 23), OR
906C            20 + N  OTHERWISE (MF = 11, 12, 14, 15, 21, 22, 24, 25).
907C          FOR ISOPT = 0, OR..
908C            21 + N + NPAR
909C          FOR ISOPT = 1.
910C         THE FIRST FEW WORDS OF IWORK ARE USED FOR CONDITIONAL AND
911C         OPTIONAL INPUTS AND OPTIONAL OUTPUTS.
912C
913C         THE FOLLOWING 2 WORDS IN IWORK ARE CONDITIONAL INPUTS..
914C           IWORK(1) = ML     THESE ARE THE LOWER AND UPPER
915C           IWORK(2) = MU     HALF-BANDWIDTHS, RESPECTIVELY, OF THE
916C                      BANDED JACOBIAN, EXCLUDING THE MAIN DIAGONAL.
917C                      THE BAND IS DEFINED BY THE MATRIX LOCATIONS
918C                      (I,J) WITH I-ML .LE. J .LE. I+MU.  ML AND MU
919C                      MUST SATISFY  0 .LE.  ML,MU  .LE. NEQ-1.
920C                      THESE ARE REQUIRED IF MITER IS 4 OR 5, AND
921C                      IGNORED OTHERWISE.  ML AND MU MAY IN FACT BE
922C                      THE BAND PARAMETERS FOR A MATRIX TO WHICH
923C                      DF/DY IS ONLY APPROXIMATELY EQUAL.
924*
925C
926C LIW   = THE LENGTH OF THE ARRAY IWORK, AS DECLARED BY THE USER.
927C         (THIS WILL BE CHECKED BY THE KppSolveR.)
928C
929C NOTE..  THE WORK ARRAYS MUST NOT BE ALTERED BETWEEN CALLS TO ODESSA
930C FOR THE SAME PROBLEM, EXCEPT POSSIBLY FOR THE CONDITIONAL AND
931C OPTIONAL INPUTS, AND EXCEPT FOR THE LAST 2*NYH + N WORDS OF RWORK.
932C THE LATTER SPACE IS USED FOR INTERNAL SCRATCH SPACE, AND SO IS
933C AVAILABLE FOR USE BY THE USER OUTSIDE ODESSA BETWEEN CALLS, IF
934C DESIRED (BUT NOT FOR USE BY F, DF, OR JAC).
935C
936C JAC   = THE NAME OF THE USER-SUPPLIED ROUTINE (MITER = 1 OR 4) TO
937C         COMPUTE THE JACOBIAN MATRIX, DF/DY, AS A FUNCTION OF THE
938C         SCALAR T AND THE VECTORS Y, AND PAR.  IT IS TO HAVE THE FORM
939C              SUBROUTINE JAC (NEQ, T, Y, PAR, ML, MU, PD, NROWPD)
940C              DOUBLE PRECISION T, Y, PAR, PD
941C              DIMENSION Y(1), PAR(1), PD(NROWPD,1)
942C         WHERE NEQ, T, Y, PAR, ML, MU, AND NROWPD ARE INPUT AND THE
943C         ARRAY PD IS TO BE LOADED WITH PARTIAL DERIVATIVES (ELEMENTS
944C         OF THE JACOBIAN MATRIX) ON OUTPUT.  PD MUST BE GIVEN A FIRST
945C         DIMENSION OF NROWPD.  T, Y, AND PAR HAVE THE SAME MEANING AS
946C         IN SUBROUTINE F.  (IN THE DIMENSION STATEMENT ABOVE, 1 IS A
947C         DUMMY DIMENSION.. IT CAN BE REPLACED BY ANY VALUE.)
948C              IN THE FULL MATRIX CASE (MITER = 1), ML AND MU ARE
949C         IGNORED, AND THE JACOBIAN IS TO BE LOADED INTO PD IN
950C         COLUMNWISE MANNER, WITH DF(I)/DY(J) LOADED INTO PD(I,J).
951C              IN THE BAND MATRIX CASE (MITER = 4), THE ELEMENTS
952C         WITHIN THE BAND ARE TO BE LOADED INTO PD IN COLUMNWISE
953C         MANNER, WITH DIAGONAL LINES OF DF/DY LOADED INTO THE ROWS
954C         OF PD.  THUS DF(I)/DY(J) IS TO BE LOADED INTO PD(I-J+MU+1,J).
955C         ML AND MU ARE THE HALF-BANDWIDTH PARAMETERS (SEE IWORK).
956C         THE LOCATIONS IN PD IN THE TWO TRIANGULAR AREAS WHICH
957C         CORRESPOND TO NONEXISTENT MATRIX ELEMENTS CAN BE IGNORED
958C         OR LOADED ARBITRARILY, AS THEY ARE OVERWRITTEN BY ODESSA.
959C              PD IS PRESET TO ZERO BY THE KppSolveR, SO THAT ONLY THE
960C         NONZERO ELEMENTS NEED BE LOADED BY JAC. EACH CALL TO JAC IS
961C         PRECEDED BY A CALL TO F WITH THE SAME ARGUMENTS NEQ, T, Y,
962C         AND PAR. THUS TO GAIN SOME EFFICIENCY, INTERMEDIATE
963C         QUANTITIES SHARED BY BOTH CALCULATIONS MAY BE SAVED IN A
964C         USER COMMON BLOCK BY F AND NOT RECOMPUTED BY JAC, IF
965C         DESIRED.  ALSO, JAC MAY ALTER THE Y ARRAY, IF DESIRED.
966C         JAC MUST BE DECLARED EXTERNAL IN THE CALLING PROGRAM.
967C              SUBROUTINE JAC MAY ACCESS USER-DEFINED QUANTITIES IN
968C         NEQ(2),... AND PAR(NPAR+1),.... SEE THE DESCRIPTIONS OF
969C         NEQ (ABOVE) AND PAR (BELOW).
970C
971C MF    = THE METHOD FLAG.  USED ONLY FOR INPUT.  THE LEGAL VALUES OF
972C         MF ARE 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, AND 25.
973C         MF HAS DECIMAL DIGITS METH AND MITER.. MF = 10*METH + MITER.
974C         METH INDICATES THE BASIC LINEAR MULTISTEP METHOD..
975C           METH = 1 MEANS THE IMPLICIT ADAMS METHOD.
976*
977C           METH = 2 MEANS THE METHOD BASED ON BACKWARD
978C                    DIFFERENTIATION FORMULAS (BDF-S).
979C         MITER INDICATES THE CORRECTOR ITERATION METHOD..
980C           MITER = 0 MEANS FUNCTIONAL ITERATION (NO JACOBIAN MATRIX
981C                     IS INVOLVED).
982C           MITER = 1 MEANS CHORD ITERATION WITH A USER-SUPPLIED
983C                     FULL (NEQ BY NEQ) JACOBIAN.
984C           MITER = 2 MEANS CHORD ITERATION WITH AN INTERNALLY
985C                     GENERATED (DIFFERENCE QUOTIENT) FULL JACOBIAN
986C                     (USING NEQ EXTRA CALLS TO F PER DF/DY VALUE).
987C           MITER = 3 MEANS CHORD ITERATION WITH AN INTERNALLY
988C                     GENERATED DIAGONAL JACOBIAN APPROXIMATION.
989C                     (USING 1 EXTRA CALL TO F PER DF/DY EVALUATION).
990C           MITER = 4 MEANS CHORD ITERATION WITH A USER-SUPPLIED
991C                     BANDED JACOBIAN.
992C           MITER = 5 MEANS CHORD ITERATION WITH AN INTERNALLY
993C                     GENERATED BANDED JACOBIAN (USING ML+MU+1 EXTRA
994C                     CALLS TO F PER DF/DY EVALUATION).
995C         IF MITER = 1 OR 4, THE USER MUST SUPPLY A SUBROUTINE JAC
996C         (THE NAME IS ARBITRARY) AS DESCRIBED ABOVE UNDER JAC.
997C         FOR OTHER VALUES OF MITER, A DUMMY ARGUMENT CAN BE USED.
998C
999C         IF A SENSITIVITY ANLYSIS IS DESIRED (ISOPT = 1), MITER = 0
1000C         AND 3 ARE DISALLOWED. IN THESE CASES, THE USER IS RECOMMENDED
1001C         TO SUPPLY AN ANALYTICAL JACOBIAN (MITER = 1 OR 4) AND AN
1002C         ANALYTICAL INHOMOGENEITY MATRIX (IDF = 1).
1003C----------------------------------------------------------------------
1004C OPTIONAL INPUTS.
1005C
1006C THE FOLLOWING IS A LIST OF THE OPTIONAL INPUTS PROVIDED FOR IN THE
1007C CALL SEQUENCE.  (SEE ALSO PART II.)  FOR EACH SUCH INPUT VARIABLE,
1008C THIS TABLE LISTS ITS NAME AS USED IN THIS DOCUMENTATION, ITS
1009C LOCATION IN THE CALL SEQUENCE, ITS MEANING, AND THE DEFAULT VALUE.
1010C THE USE OF ANY OF THESE INPUTS REQUIRES IOPT(1) = 1, AND IN THAT
1011C CASE ALL OF THESE INPUTS ARE EXAMINED.  A VALUE OF ZERO FOR ANY
1012C OF THESE OPTIONAL INPUTS WILL CAUSE THE DEFAULT VALUE TO BE USED.
1013C THUS TO USE A SUBSET OF THE OPTIONAL INPUTS, SIMPLY PRELOAD
1014C LOCATIONS 5 TO 10 IN RWORK AND IWORK TO 0.0 AND 0 RESPECTIVELY, AND
1015C THEN SET THOSE OF INTEREST TO NONZERO VALUES.
1016C
1017C NAME   LOCATION      MEANING AND DEFAULT VALUE
1018C
1019C H0     RWORK(5)  THE STEP SIZE TO BE ATTEMPTED ON THE FIRST STEP.
1020C                  THE DEFAULT VALUE IS DETERMINED BY THE KppSolveR.
1021C
1022C HMAX   RWORK(6)  THE MAXIMUM ABSOLUTE STEP SIZE ALLOWED.
1023C                  THE DEFAULT VALUE IS INFINITE.
1024C
1025C HMIN   RWORK(7)  THE MINIMUM ABSOLUTE STEP SIZE ALLOWED.
1026C                  THE DEFAULT VALUE IS 0.  (THIS LOWER BOUND IS NOT
1027C                  ENFORCED ON THE FINAL STEP BEFORE REACHING TCRIT
1028C                  WHEN ITASK = 4 OR 5.)
1029C
1030C MAXORD  IWORK(5)  THE MAXIMUM ORDER TO BE ALLOWED.  THE DEFAULT
1031C                  VALUE IS 12 IF METH = 1, AND 5 IF METH = 2.
1032C                  IF MAXORD EXCEEDS THE DEFAULT VALUE, IT WILL
1033C                  BE REDUCED TO THE DEFAULT VALUE.
1034C                  IF MAXORD IS CHANGED DURING THE PROBLEM, IT MAY
1035C                  CAUSE THE CURRENT ORDER TO BE REDUCED.
1036C
1037C MXSTEP  IWORK(6)  MAXIMUM NUMBER OF (INTERNALLY DEFINED) STEPS
1038C                  ALLOWED DURING ONE CALL TO THE KppSolveR.
1039C                  THE DEFAULT VALUE IS 500.
1040C
1041C MXHNIL  IWORK(7)  MAXIMUM NUMBER OF MESSAGES PRINTED (PER PROBLEM)
1042C                  WARNING THAT T + H = T ON A STEP (H = STEP SIZE).
1043C                  THIS MUST BE POSITIVE TO RESULT IN A NON-DEFAULT
1044C                  VALUE.  THE DEFAULT VALUE IS 10.
1045C----------------------------------------------------------------------
1046C OPTIONAL OUTPUTS.
1047C
1048C AS OPTIONAL ADDITIONAL OUTPUT FROM ODESSA, THE VARIABLES LISTED
1049C BELOW ARE QUANTITIES RELATED TO THE PERFORMANCE OF ODESSA
1050C WHICH ARE AVAILABLE TO THE USER.  THESE ARE COMMUNICATED BY WAY OF
1051C THE WORK ARRAYS, BUT ALSO HAVE INTERNAL MNEMONIC NAMES AS SHOWN.
1052C EXCEPT WHERE STATED OTHERWISE, ALL OF THESE OUTPUTS ARE DEFINED
1053C ON ANY SUCCESSFUL RETURN FROM ODESSA, AND ON ANY RETURN WITH
1054C ISTATE = -1, -2, -4, -5, OR -6.  ON AN ILLEGAL INPUT RETURN
1055C (ISTATE = -3), THEY WILL BE UNCHANGED FROM THEIR EXISTING VALUES
1056C (IF ANY), EXCEPT POSSIBLY FOR TOLSF, LENRW, AND LENIW.
1057C ON ANY ERROR RETURN, OUTPUTS RELEVANT TO THE ERROR WILL BE DEFINED,
1058C AS NOTED BELOW.
1059C
1060C NAME   LOCATION      MEANING
1061C
1062C HU     RWORK(11) THE STEP SIZE IN T LAST USED (SUCCESSFULLY).
1063C
1064C HCUR   RWORK(12) THE STEP SIZE TO BE ATTEMPTED ON THE NEXT STEP.
1065C
1066C TCUR   RWORK(13) THE CURRENT VALUE OF THE INDEPENDENT VARIABLE
1067C                  WHICH THE KppSolveR HAS ACTUALLY REACHED, I.E. THE
1068C                  CURRENT INTERNAL MESH POINT IN T.  ON OUTPUT, TCUR
1069C                  WILL ALWAYS BE AT LEAST AS FAR AS THE ARGUMENT
1070C                  T, BUT MAY BE FARTHER (IF INTERPOLATION WAS DONE).
1071C
1072C TOLSF  RWORK(14) A TOLERANCE SCALE FACTOR, GREATER THAN 1.0,
1073C                  COMPUTED WHEN A REQUEST FOR TOO MUCH ACCURACY WAS
1074C                  DETECTED (ISTATE = -3 IF DETECTED AT THE START OF
1075C                  THE PROBLEM, ISTATE = -2 OTHERWISE).  IF ITOL IS
1076C                  LEFT UNALTERED BUT RTOL AND ATOL ARE UNIFORMLY
1077C                  SCALED UP BY A FACTOR OF TOLSF FOR THE NEXT CALL,
1078C                  THEN THE KppSolveR IS DEEMED LIKELY TO SUCCEED.
1079C                  (THE USER MAY ALSO IGNORE TOLSF AND ALTER THE
1080C                  TOLERANCE PARAMETERS IN ANY OTHER WAY APPROPRIATE.)
1081C
1082C NST    IWORK(11) THE NUMBER OF STEPS TAKEN FOR THE PROBLEM SO FAR.
1083C
1084C NFE    IWORK(12) THE NUMBER OF F EVALUATIONS FOR THE PROBLEM SO FAR.
1085C
1086C NJE    IWORK(13) THE NUMBER OF JACOBIAN EVALUATIONS (AND OF MATRIX
1087C                  LU DECOMPOSITIONS IF ISOPT = 0) FOR THE PROBLEM SO
1088C                  FAR. IF ISOPT = 1, THE NUMBER OF LU DECOMPOSITIONS
1089C                  IS EQUAL TO NJE - NSPE (SEE BELOW).
1090C
1091C NQU    IWORK(14) THE METHOD ORDER LAST USED (SUCCESSFULLY).
1092C
1093C NQCUR  IWORK(15) THE ORDER TO BE ATTEMPTED ON THE NEXT STEP.
1094C
1095C IMXER  IWORK(16) THE INDEX OF THE COMPONENT OF LARGEST MAGNITUDE IN
1096C                  THE WEIGHTED LOCAL ERROR VECTOR (E(I,J)/EWT(I,J)),
1097C                  ON AN ERROR RETURN WITH ISTATE = -4 OR -5.
1098C
1099C LENRW  IWORK(17) THE LENGTH OF RWORK ACTUALLY REQUIRED.
1100C                  THIS IS DEFINED ON NORMAL RETURNS AND ON AN ILLEGAL
1101C                  INPUT RETURN FOR INSUFFICIENT STORAGE.
1102C
1103C LENIW  IWORK(18) THE LENGTH OF IWORK ACTUALLY REQUIRED.
1104C                  THIS IS DEFINED ON NORMAL RETURNS AND ON AN ILLEGAL
1105C                  INPUT RETURN FOR INSUFFICIENT STORAGE.
1106C
1107C NDFE   IWORK(19) THE NUMBER OF DF/DP (VECTOR) EVALUATIONS.
1108C
1109C NSPE   IWORK(20) THE NUMBER OF CALLS TO SUBROUTINE SPRIME. EACH CALL
1110C                  TO SPRIME REQUIRES A JACOBIAN EVALUATION, BUT NOT
1111C                  AN LU DECOMPOSITION.
1112C
1113C THE FOLLOWING ARRAYS ARE SEGMENTS OF THE RWORK AND IWORK ARRAYS
1114C WHICH MAY ALSO BE OF INTEREST TO THE USER AS OPTIONAL OUTPUTS.
1115C FOR EACH ARRAY, THE TABLE BELOW GIVES ITS INTERNAL NAME, ITS BASE
1116C ADDRESS IN RWORK OR IWORK, AND ITS DESCRIPTION.
1117C
1118C NAME   BASE ADDRESS      DESCRIPTION
1119C
1120C YH     21 IN RWORK    THE NORDSIECK HISTORY ARRAY, OF SIZE NYH BY
1121C                       (NQCUR + 1). FOR J = 0,1,...,NQCUR, COLUMN J+1
1122C                       OF YH CONTAINS HCUR**J/FACTORIAL(J) TIMES
1123C                       THE J-TH DERIVATIVE OF THE INTERPOLATING
1124C                       POLYNOMIAL CURRENTLY REPRESENTING THE SOLUTION,
1125C                       EVALUATED AT T = TCUR.
1126C
1127C ACOR    LENRW-NYH+1   ARRAY OF SIZE NYH USED FOR THE ACCUMULATED
1128C         IN RWORK      CORRECTIONS ON EACH STEP, SCALED ON OUTPUT
1129C                       TO REPRESENT THE ESTIMATED LOCAL ERROR IN Y
1130C                       ON THE LAST STEP.  THIS IS THE VECTOR E IN
1131C                       THE DESCRIPTION OF THE ERROR CONTROL.
1132C                       IT IS DEFINED ONLY ON A SUCCESSFUL RETURN
1133C                       FROM ODESSA.
1134C NRS     LENIW-NPAR    ARRAY OF SIZE NPAR+1, USED TO STORE THE
1135C         IN IWORK      ACCUMULATED NUMBER OF REPEATED STEPS DUE TO
1136C                       THE SENSITIVITY ANALYSIS..
1137C                         NRS(1) = TOTAL NUMBER OF REPEATED STEPS,
1138C                         NRS(2),... = NUMBER OF REPEATED STEPS DUE TO
1139C                                      MODEL PARAMETER 1,...
1140C
1141C----------------------------------------------------------------------
1142C PART II.  OTHER ROUTINES CALLABLE.
1143C
1144C THE FOLLOWING ARE OPTIONAL CALLS WHICH THE USER MAY MAKE TO
1145C GAIN ADDITIONAL CAPABILITIES IN CONJUNCTION WITH ODESSA.
1146C (THE ROUTINES XSETUN AND XSETF ARE DESIGNED TO CONFORM TO THE
1147C SLATEC ERROR HANDLING PACKAGE.)
1148C
1149C    FORM OF CALL                  FUNCTION
1150C  CALL XSETUN(LUN)          SET THE LOGICAL UNIT NUMBER, LUN, FOR
1151C                            OUTPUT OF MESSAGES FROM ODESSA, IF
1152C                            THE DEFAULT IS NOT DESIRED.
1153C                            THE DEFAULT VALUE OF LUN IS 6.
1154C
1155C  CALL XSETF(MFLAG)         SET A FLAG TO CONTROL THE PRINTING OF
1156C                            MESSAGES BY ODESSA..
1157C                            MFLAG = 0 MEANS DO NOT PRINT. (DANGER..
1158C                            THIS RISKS LOSING VALUABLE INFORMATION.)
1159C                            MFLAG = 1 MEANS PRINT (THE DEFAULT).
1160C
1161C                            EITHER OF THE ABOVE CALLS MAY BE MADE AT
1162C                            ANY TIME AND WILL TAKE EFFECT IMMEDIATELY.
1163C
1164C  CALL SVCOM (RSAV, ISAV)   STORE IN RSAV AND ISAV THE CONTENTS
1165C                            OF THE INTERNAL COMMON BLOCKS USED BY
1166C                            ODESSA (SEE PART III BELOW).
1167C                            RSAV MUST BE A REAL ARRAY OF LENGTH 222
1168C                            OR MORE, AND ISAV MUST BE AN INTEGER
1169C                            ARRAY OF LENGTH 54 OR MORE.
1170C
1171C  CALL RSCOM (RSAV, ISAV)   RESTORE, FROM RSAV AND ISAV, THE CONTENTS
1172C                            OF THE INTERNAL COMMON BLOCKS USED BY
1173C                            ODESSA.  PRESUMES A PRIOR CALL TO SVCOM
1174C                            WITH THE SAME ARGUMENTS.
1175C
1176C                            SVCOM AND RSCOM ARE USEFUL IF
1177C                            INTERRUPTING A RUN AND RESTARTING
1178C                            LATER, OR ALTERNATING BETWEEN TWO OR
1179C                            MORE PROBLEMS KppSolveD WITH ODESSA.
1180C
1181C  CALL INTDY(,,,,,)         PROVIDE DERIVATIVES OF Y, OF VARIOUS
1182C       (SEE BELOW)          ORDERS, AT A SPECIFIED POINT T, IF
1183C                            DESIRED.  IT MAY BE CALLED ONLY AFTER
1184C                            A SUCCESSFUL RETURN FROM ODESSA.
1185C
1186C THE DETAILED INSTRUCTIONS FOR USING INTDY ARE AS FOLLOWS.
1187C THE FORM OF THE CALL IS..
1188C
1189C  CALL INTDY (T, K, RWORK(21), NYH, DKY, IFLAG)
1190C
1191C THE INPUT PARAMETERS ARE..
1192C
1193C T        = VALUE OF INDEPENDENT VARIABLE WHERE ANSWERS ARE DESIRED
1194C            (NORMALLY THE SAME AS THE T LAST RETURNED BY ODESSA).
1195C            FOR VALID RESULTS, T MUST LIE BETWEEN TCUR - HU AND TCUR.
1196C            (SEE OPTIONAL OUTPUTS FOR TCUR AND HU.)
1197C K        = INTEGER ORDER OF THE DERIVATIVE DESIRED.  K MUST SATISFY
1198C            0 .LE. K .LE. NQCUR, WHERE NQCUR IS THE CURRENT ORDER
1199C            (SEE OPTIONAL OUTPUTS).  THE CAPABILITY CORRESPONDING
1200C            TO K = 0, I.E. COMPUTING Y(T), IS ALREADY PROVIDED
1201C            BY ODESSA DIRECTLY.  SINCE NQCUR .GE. 1, THE FIRST
1202C            DERIVATIVE DY/DT IS ALWAYS AVAILABLE WITH INTDY.
1203C RWORK(21) = THE BASE ADDRESS OF THE HISTORY ARRAY YH.
1204C NYH      = COLUMN LENGTH OF YH, EQUAL TO THE TOTAL NUMBER OF
1205C            DEPENDENT VARIABLES. IF ISOPT = 0, NYH = N. IF ISOPT = 1,
1206C            NYH = N * (NPAR + 1).
1207C
1208C THE OUTPUT PARAMETERS ARE..
1209C
1210C DKY      = A REAL ARRAY OF LENGTH NYH CONTAINING THE COMPUTED VALUE
1211C            OF THE K-TH DERIVATIVE OF Y(T).
1212C IFLAG    = INTEGER FLAG, RETURNED AS 0 IF K AND T WERE LEGAL,
1213C            -1 IF K WAS ILLEGAL, AND -2 IF T WAS ILLEGAL.
1214C            ON AN ERROR RETURN, A MESSAGE IS ALSO WRITTEN.
1215C----------------------------------------------------------------------
1216C PART III.  COMMON BLOCKS.
1217C
1218C IF ODESSA IS TO BE USED IN AN OVERLAY SITUATION, THE USER
1219C MUST DECLARE, IN THE PRIMARY OVERLAY, THE VARIABLES IN..
1220C  (1) THE CALL SEQUENCE TO ODESSA,
1221C  (2) THE THREE INTERNAL COMMON BLOCKS
1222C        /ODE001/  OF LENGTH  258  (219 DOUBLE PRECISION WORDS
1223C                        FOLLOWED BY 39 INTEGER WORDS),
1224C        /ODE002/  OF LENGTH 14 (3 DOUBLE PRECISION WORDS FOLLOWED
1225C                        BY 11 INTEGER WORDS),
1226C        /EH0001/  OF LENGTH  2 (INTEGER WORDS).
1227C
1228C IF ODESSA IS USED ON A SYSTEM IN WHICH THE CONTENTS OF INTERNAL
1229C COMMON BLOCKS ARE NOT PRESERVED BETWEEN CALLS, THE USER SHOULD
1230C DECLARE THE ABOVE THREE COMMON BLOCKS IN HIS MAIN PROGRAM TO INSURE
1231C THAT THEIR CONTENTS ARE PRESERVED.
1232C
1233C IF THE SOLUTION OF A GIVEN PROBLEM BY ODESSA IS TO BE INTERRUPTED
1234C AND THEN LATER CONTINUED, SUCH AS WHEN RESTARTING AN INTERRUPTED RUN
1235C OR ALTERNATING BETWEEN TWO OR MORE PROBLEMS, THE USER SHOULD SAVE,
1236C FOLLOWING THE RETURN FROM THE LAST ODESSA CALL PRIOR TO THE
1237C INTERRUPTION, THE CONTENTS OF THE CALL SEQUENCE VARIABLES AND THE
1238C INTERNAL COMMON BLOCKS, AND LATER RESTORE THESE VALUES BEFORE THE
1239C NEXT ODESSA CALL FOR THAT PROBLEM.  TO SAVE AND RESTORE THE COMMON
1240C BLOCKS, USE SUBROUTINES SVCOM AND RSCOM (SEE PART II ABOVE).
1241C
1242C----------------------------------------------------------------------
1243C PART IV.  OPTIONALLY REPLACEABLE KppSolveR ROUTINES.
1244C
1245C BELOW ARE DESCRIPTIONS OF TWO ROUTINES IN THE ODESSA PACKAGE WHICH
1246C RELATE TO THE MEASUREMENT OF ERRORS.  EITHER ROUTINE CAN BE
1247C REPLACED BY A USER-SUPPLIED VERSION, IF DESIRED. HOWEVER, SINCE SUCH
1248C A REPLACEMENT MAY HAVE A MAJOR IMPACT ON PERFORMANCE, IT SHOULD BE
1249C DONE ONLY WHEN ABSOLUTELY NECESSARY, AND ONLY WITH GREAT CAUTION.
1250C (NOTE.. THE MEANS BY WHICH THE PACKAGE VERSION OF A ROUTINE IS
1251C SUPERSEDED BY THE USER-S VERSION MAY BE SYSTEM-DEPENDENT.)
1252C
1253C (A) EWSET.
1254C THE FOLLOWING SUBROUTINE IS CALLED JUST BEFORE EACH INTERNAL
1255C INTEGRATION STEP, AND SETS THE ARRAY OF ERROR WEIGHTS, EWT, AS
1256C DESCRIBED UNDER ITOL/RTOL/ATOL ABOVE..
1257C    SUBROUTINE EWSET (NYH, ITOL, RTOL, ATOL, YCUR, EWT)
1258C WHERE NEQ, ITOL, RTOL, AND ATOL ARE AS IN THE ODESSA CALL SEQUENCE,
1259C YCUR CONTAINS THE CURRENT DEPENDENT VARIABLE VECTOR, AND
1260C EWT IS THE ARRAY OF WEIGHTS SET BY EWSET.
1261C
1262C IF THE USER SUPPLIES THIS SUBROUTINE, IT MUST RETURN IN EWT(I)
1263C (I = 1,...,NYH) A POSITIVE QUANTITY SUITABLE FOR COMPARING ERRORS
1264C IN Y(I) TO.  THE EWT ARRAY RETURNED BY EWSET IS PASSED TO THE
1265C VNORM ROUTINE (SEE BELOW), AND ALSO USED BY ODESSA IN THE COMPUTATION
1266C OF THE OPTIONAL OUTPUT IMXER, THE DIAGONAL JACOBIAN APPROXIMATION,
1267C AND THE INCREMENTS FOR DIFFERENCE QUOTIENT JACOBIANS.
1268C
1269C IN THE USER-SUPPLIED VERSION OF EWSET, IT MAY BE DESIRABLE TO USE
1270C THE CURRENT VALUES OF DERIVATIVES OF Y.  DERIVATIVES UP TO ORDER NQ
1271C ARE AVAILABLE FROM THE HISTORY ARRAY YH, DESCRIBED ABOVE UNDER
1272C OPTIONAL OUTPUTS.  IN EWSET, YH IS IDENTICAL TO THE YCUR ARRAY,
1273C EXTENDED TO NQ + 1 COLUMNS WITH A COLUMN LENGTH OF NYH AND SCALE
1274C FACTORS OF H**J/FACTORIAL(J).  ON THE FIRST CALL FOR THE PROBLEM,
1275C GIVEN BY NST = 0, NQ IS 1 AND H IS TEMPORARILY SET TO 1.0.
1276C THE QUANTITIES NQ, NYH, H, AND NST CAN BE OBTAINED BY INCLUDING
1277C IN EWSET THE STATEMENTS..
1278C    DOUBLE PRECISION H, RLS
1279C    COMMON /ODE001/ RLS(219),ILS(39)
1280C    NQ = ILS(35)
1281C    NYH = ILS(14)
1282C    NST = ILS(36)
1283C    H = RLS(213)
1284C THUS, FOR EXAMPLE, THE CURRENT VALUE OF DY/DT CAN BE OBTAINED AS
1285C YCUR(NYH+I)/H  (I=1,...,N)  (AND THE DIVISION BY H IS
1286C UNNECESSARY WHEN NST = 0).
1287C
1288C (B) VNORM.
1289C THE FOLLOWING IS A REAL FUNCTION ROUTINE WHICH COMPUTES THE WEIGHTED
1290C ROOT-MEAN-SQUARE NORM OF A VECTOR V..
1291C    D = VNORM (LV, V, W)
1292C WHERE..
1293C  LV = THE LENGTH OF THE VECTOR,
1294C  V = REAL ARRAY OF LENGTH N CONTAINING THE VECTOR,
1295C  W = REAL ARRAY OF LENGTH N CONTAINING WEIGHTS,
1296C  D = SQRT( (1/N) * SUM(V(I)*W(I))**2 ).
1297C VNORM IS CALLED WITH LV = N AND WITH W(I) = 1.0/EWT(I), WHERE
1298C EWT IS AS SET BY SUBROUTINE EWSET.
1299C
1300C IF THE USER SUPPLIES THIS FUNCTION, IT SHOULD RETURN A NON-NEGATIVE
1301C VALUE OF VNORM SUITABLE FOR USE IN THE ERROR CONTROL IN ODESSA.
1302C NONE OF THE ARGUMENTS SHOULD BE ALTERED BY VNORM.
1303C FOR EXAMPLE, A USER-SUPPLIED VNORM ROUTINE MIGHT..
1304C  -SUBSTITUTE A MAX-NORM OF (V(I)*W(I)) FOR THE RMS-NORM, OR
1305C  -IGNORE SOME COMPONENTS OF V IN THE NORM, WITH THE EFFECT OF
1306C   SUPPRESSING THE ERROR CONTROL ON THOSE COMPONENTS OF Y.
1307C----------------------------------------------------------------------
1308C OTHER ROUTINES IN THE ODESSA PACKAGE.
1309C
1310C IN ADDITION TO SUBROUTINE ODESSA, THE ODESSA PACKAGE INCLUDES THE
1311C FOLLOWING SUBROUTINES AND FUNCTION ROUTINES..
1312C  INTDY   COMPUTES AN INTERPOLATED VALUE OF THE Y VECTOR AT T = TOUT.
1313C  STODE   IS THE CORE INTEGRATOR, WHICH DOES ONE STEP OF THE
1314C          INTEGRATION AND THE ASSOCIATED ERROR CONTROL.
1315C  STESA   MANAGES THE SOLUTION OF THE SENSITIVITY FUNCTIONS.
1316C  CFODE   SETS ALL METHOD COEFFICIENTS AND TEST CONSTANTS.
1317C  PREPJ   COMPUTES AND PREPROCESSES THE JACOBIAN MATRIX J = DF/DY
1318C          AND THE NEWTON ITERATION MATRIX P = I - H*L0*J.
1319C          IT IS ALSO CALLED BY SPRIME (WITH JOPT = 1) TO JUST
1320C          COMPUTE THE JACOBIAN MATRIX.
1321C  PREPDF  COMPUTES THE INHOMOGENEITY MATRIX DF/DP.
1322C  SPRIME  DEFINES THE SYSTEM OF SENSITIVITY EQUATIONS.
1323C  SOLSY   MANAGES SOLUTION OF LINEAR SYSTEM IN CHORD ITERATION.
1324C  EWSET   SETS THE ERROR WEIGHT VECTOR EWT BEFORE EACH STEP.
1325C  VNORM   COMPUTES THE WEIGHTED R.M.S. NORM OF A VECTOR.
1326C  SVCOM AND RSCOM  ARE USER-CALLABLE ROUTINES TO SAVE AND RESTORE,
1327C          RESPECTIVELY, THE CONTENTS OF THE INTERNAL COMMON BLOCKS.
1328C  DGEFA AND DGESL  ARE ROUTINES FROM LINPACK FOR SOLVING FULL
1329C          SYSTEMS OF LINEAR ALGEBRAIC EQUATIONS.
1330C  DGBFA AND DGBSL  ARE ROUTINES FROM LINPACK FOR SOLVING BANDED
1331C          LINEAR SYSTEMS.
1332C  DAXPY, DSCAL, IDAMAX, AND DDOT  ARE BASIC LINEAR ALGEBRA MODULES
1333C          (BLAS) USED BY THE ABOVE LINPACK ROUTINES.
1334C  D1MACH  COMPUTES THE UNIT ROUNDOFF IN A MACHINE-INDEPENDENT MANNER.
1335C  XERR, XSETUN, AND XSETF  HANDLE THE PRINTING OF ALL ERROR
1336C          MESSAGES AND WARNINGS.
1337C NOTE..  VNORM, IDAMAX, DDOT, AND D1MACH ARE FUNCTION ROUTINES.
1338C ALL THE OTHERS ARE SUBROUTINES.
1339C
1340C THE FORTRAN GENERIC INTRINSIC FUNCTIONS USED BY ODESSA ARE..
1341C ABS, MAX, MIN, REAL, MOD, SIGN, SQRT, AND WRITE
1342C
1343C A BLOCK DATA SUBPROGRAM IS ALSO INCLUDED WITH THE PACKAGE,
1344C FOR LOADING SOME OF THE VARIABLES IN INTERNAL COMMON.
1345C
1346C----------------------------------------------------------------------
1347C PART V.  GENERAL REMARKS
1348C
1349C THIS SECTION HIGHLIGHTS THE BASIC DIFFERENCES BETWEEN THE ORIGINAL
1350C LSODE PACKAGE AND THE ODESSA MODIFICATION. THIS IS PROVIDED AS A
1351C SERVICE TO EXPERIENCED LSODE USERS TO EXPEDITE FAMILIARIZATION WITH
1352C ODESSA.
1353C
1354C (A). ORIGINAL SUBROUTINES AND FUNCTIONS.
1355C
1356C      OF THE ORIGINAL 22 SUBROUTINES AND FUNCTIONS USED IN THE LSODE
1357C      PACKAGE, ALL ARE USED BY ODESSA, WITH THE FOLLOWING HAVING BEEN
1358C      MODIFIED..
1359C
1360C      LSODE  THE ORIGINAL DRIVER SUBROUTINE FOR THE LSODE PACKAGE IS
1361C             EXTENSIVELY MODIFIED AND RENAMED ODESSA, WHICH NOW
1362C             CONTAINS A CALL TO SPRIME TO ESTABLISH INITIAL CONDITIONS
1363C             FOR THE SENSITIVITY CALCULATIONS.
1364C
1365C      STODE  THE ONE STEP INTEGRATOR IS SLIGHTLY MODIFIED AND RETAINS
1366C             ITS ORIGINAL NAME. IT NOW CONTAINS THE CALL TO STESA,
1367C             AND ALSO CALLS SPRIME IF KFLAG .LE. -3.
1368C
1369C      PREPJ  ALSO NAMED PREPJ IN ODESSA IS SLIGHTLY MODIFIED TO ALLOW
1370C             FOR THE CALCULATION OF JACOBIAN WITH NO PREPROCESSING
1371C             (JOPT = 1).
1372C
1373C (B). NEW SUBROUTINES.
1374C
1375C      IN ADDITION TO THE CHANGES NOTED ABOVE, THREE NEW SUBROUTINES
1376C      HAVE BEEN INTRODUCED (SEE STESA, SPRIME, AND PREPDF AS DESCRIBED
1377C      IN PART IV. ABOVE).
1378C
1379C (C). COMMON BLOCKS.
1380C
1381C      /LS0001/  RETAINS THE SAME LENGTH AND IS RENAMED /ODE001/;
1382C                HOWEVER THE REAL ARRAY ROWNS(209) IS SHORTENED TO A
1383C                LENGTH OF (173) REAL WORDS, ALLOWING THE REMOVAL OF
1384C                TESCO(3,12) WHICH IS NOW PASSED FROM STODE TO STESA.
1385C                IN ADDITION, THE INTEGER ARRAY IOWNS(6) IS SHORTENED
1386C                TO A LENGTH OF (4) INTEGER WORDS, ALLOWING THE REMOVAL
1387C                OF IALTH AND LMAX WHICH ARE NOW PASSED FROM STODE TO
1388C                STESA.
1389C
1390C      /ODE002/  ADDED COMMON BLOCK FOR VARIABLES IMPORTANT TO
1391C                SENSITIVITY ANALYSIS (SEE PART III. ABOVE). A BLOCK
1392C                DATA PROGRAM IS NOT REQUIRED FOR THIS COMMON BLOCK.
1393C
1394C      SVCOM,RSCOM  THESE TWO SUBROUTINES ARE MODIFIED TO HANDLE
1395C                   COMMON BLOCK /ODE002/ AS WELL.
1396C
1397C (D). OPTIONAL INPUTS.
1398C
1399C      THE FULL SET OF OPTIONAL INPUTS AVAILABLE IN LSODE IS ALSO
1400C      AVAILABLE IN ODESSA, WITH THE EXCEPTION THAT THE NUMBER OF ODE'S
1401C      IN THE MODEL (NEQ(1)), MAY NOT BE CHANGED DURING THE PROBLEM.
1402C      IN ODESSA, NYH NOW REFERS TO THE TOTAL NUMBER OF FIRST-ORDER
1403C      ODE'S (MODEL AND SENSITIVITY EQUATIONS) WHICH IS EQUAL TO
1404C      NEQ(1) IF ISOPT = 0, OR NEQ(1)*(NEQ(2)+1) IF ISOPT = 1.
1405C      NEQ(1), NEQ(2), AND NYH ARE NOT ALLOWED TO CHANGE DURING
1406C      THE COURSE OF AN INTEGRATION.
1407C
1408C (E). OPTIONAL OUTPUTS.
1409C
1410C      THE FULL SET OF OPTIONAL OUTPUTS AVAILABLE IN LSODE IS ALSO
1411C      AVAILABLE IN ODESSA. IN ADDITION, IWORK(19) AND IWORK(20) ARE
1412C      LOADED WITH NDFE AND NSPE, RESPECTIVELY, UPON OUTPUT. THE TOTAL
1413C      NUMBER OF LU DECOMPOSITIONS OF THE PROCESSED JACOBIAN IS EQUAL
1414C      TO NJE - NSPE.
1415C-----------------------------------------------------------------------
1416      SUBROUTINE KPP_ODESSA (F, DF, NEQ, Y, PAR, T, TOUT,
1417     1   ITOL, RTOL, ATOL,
1418     1   ITASK, ISTATE, IOPT, RWORK, LRW, IWORK, LIW, JAC, MF)
1419      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1420      LOGICAL IHIT
1421      EXTERNAL F, DF, JAC, PREPJ, SOLSY, PREPDF
1422      DIMENSION NEQ(*), Y(*), PAR(*), RTOL(*), ATOL(*), IOPT(*),
1423     1   RWORK(LRW), IWORK(LIW), MORD(2)
1424C-----------------------------------------------------------------------
1425C THIS IS THE SEPTEMBER 1, 1986 VERSION OF ODESSA..
1426C AN ORDINARY DIFFERENTIAL EQUATION KppSolveR WITH EXPLICIT SIMULTANEOUS
1427C SENSITIVITY ANALYSIS.
1428C
1429C THIS PACKAGE IS A MODIFICATION OF THE AUGUST 13, 1981 VERSION OF
1430C LSODE.. LIVERMORE KppSolveR FOR ORDINARY DIFFERENTIAL EQUATIONS.
1431C THIS VERSION IS IN DOUBLE PRECISION.
1432C
1433C ODESSA KppSolveS FOR THE FIRST-ORDER SENSITIVITY COEFFICIENTS..
1434C    DY(I)/DP, FOR A SINGLE PARAMETER, OR,
1435C    DY(I)/DP(J), FOR MULTIPLE PARAMETERS,
1436C ASSOCIATED WITH A SYSTEM OF ORDINARY DIFFERENTIAL EQUATIONS..
1437C    DY(T)/DT = F(Y,T;P).
1438C-----------------------------------------------------------------------
1439C REFERENCES...
1440C
1441C  1. JORGE R. LEIS AND MARK A. KRAMER, THE SIMULTANEOUS SOLUTION AND
1442C     EXPLICIT SENSITIVITY ANALYSIS OF SYSTEMS DESCRIBED BY ORDINARY
1443C     DIFFERENTIAL EQUATIONS, SUBMITTED TO ACM TRANS. MATH. SOFTWARE,
1444C     (1985).
1445C
1446C  2. JORGE R. LEIS AND MARK A. KRAMER, ODESSA - AN ORDINARY
1447C     DIFFERENTIAL EQUATION KppSolveR WITH EXPLICIT SIMULTANEOUS
1448C     SENSITIVITY ANALYSIS, SUBMITTED TO ACM TRANS. MATH. SOFTWARE.
1449C     (1985).
1450C
1451C  3. ALAN C. HINDMARSH,  LSODE AND LSODI,  TWO NEW INITIAL VALUE
1452C     ORDINARY DIFFERENTIAL EQUATION KppSolveRS, ACM-SIGNUM NEWSLETTER,
1453C     VOL. 15, NO. 4 (1980), PP. 10-11.
1454C-----------------------------------------------------------------------
1455C THE FOLLOWING INTERNAL COMMON BLOCKS CONTAIN
1456C (A) VARIABLES WHICH ARE LOCAL TO ANY SUBROUTINE BUT WHOSE VALUES MUST
1457C    BE PRESERVED BETWEEN CALLS TO THE ROUTINE (OWN VARIABLES), AND
1458C (B) VARIABLES WHICH ARE COMMUNICATED BETWEEN SUBROUTINES.
1459C THE STRUCTURE OF THE BLOCKS ARE AS FOLLOWS..  ALL REAL VARIABLES ARE
1460C LISTED FIRST, FOLLOWED BY ALL INTEGERS.  WITHIN EACH TYPE, THE
1461C VARIABLES ARE GROUPED WITH THOSE LOCAL TO SUBROUTINE ODESSA FIRST,
1462C THEN THOSE LOCAL TO SUBROUTINE STODE, AND FINALLY THOSE USED
1463C FOR COMMUNICATION.  THE BLOCKS ARE DECLARED IN SUBROUTINES ODESSA
1464C INTDY, STODE, STESA, PREPJ, PREPDF, AND SOLSY.  GROUPS OF VARIABLES
1465C ARE REPLACED BY DUMMY ARRAYS IN THE COMMON DECLARATIONS IN ROUTINES
1466C WHERE THOSE VARIABLES ARE NOT USED.
1467C-----------------------------------------------------------------------
1468      COMMON /ODE001/ TRET, ROWNS(173),
1469     1   TESCO(3,12), CCMAX, EL0, H, HMIN, HMXI, HU, RC, TN, UROUND,
1470     2   ILLIN, INIT, LYH, LEWT, LACOR, LSAVF, LWM, LIWM,
1471     3   MXSTEP, MXHNIL, NHNIL, NTREP, NSLAST, NYH, IOWNS(4),
1472     4   IALTH, LMAX, ICF, IERPJ, IERSL, JCUR, JSTART, KFLAG, L, METH,
1473     5   MITER, MAXORD, MAXCOR, MSBP, MXNCF, N, NQ, NST, NFE, NJE, NQU
1474      COMMON /ODE002/ DUPS, DSMS, DDNS,
1475     1   NPAR, LDFDP, LNRS,
1476     2   ISOPT, NSV, NDFE, NSPE, IDF, IERSP, JOPT, KFLAGS
1477      PARAMETER (ZERO=0.0D0,ONE=1.0D0,TWO=2.0D0,FOUR=4.0D0)
1478      DATA  MORD(1),MORD(2)/12,5/, MXSTP0/500/, MXHNL0/10/
1479C-----------------------------------------------------------------------
1480C BLOCK A.
1481C THIS CODE BLOCK IS EXECUTED ON EVERY CALL.
1482C IT TESTS ISTATE AND ITASK FOR LEGALITY AND BRANCHES APPROPIATELY.
1483C IF ISTATE .GT. 1 BUT THE FLAG INIT SHOWS THAT INITIALIZATION HAS
1484C NOT YET BEEN DONE, AN ERROR RETURN OCCURS.
1485C IF ISTATE = 1 AND TOUT = T, JUMP TO BLOCK G AND RETURN IMMEDIATELY.
1486C-----------------------------------------------------------------------
1487      IF (ISTATE .LT. 1 .OR. ISTATE .GT. 3) GO TO 601
1488      IF (ITASK .LT. 1 .OR. ITASK .GT. 5) GO TO 602
1489      IF (ISTATE .EQ. 1) GO TO 10
1490      IF (INIT .EQ. 0) GO TO 603
1491      IF (ISTATE .EQ. 2) GO TO 200
1492      GO TO 20
1493 10   INIT = 0
1494      IF (TOUT .EQ. T) GO TO 430
1495 20   NTREP = 0
1496C-----------------------------------------------------------------------
1497C BLOCK B.
1498C THE NEXT CODE BLOCK IS EXECUTED FOR THE INITIAL CALL (ISTATE = 1),
1499C OR FOR A CONTINUATION CALL WITH PARAMETER CHANGES (ISTATE = 3).
1500C IT CONTAINS CHECKING OF ALL INPUTS AND VARIOUS INITIALIZATIONS.
1501C
1502C FIRST CHECK LEGALITY OF THE NON-OPTIONAL INPUTS NEQ, ITOL, IOPT,
1503C MF, ML, AND MU.
1504C-----------------------------------------------------------------------
1505      IF (NEQ(1) .LE. 0) GO TO 604
1506      IF (ISTATE .EQ. 1) GO TO 25
1507      IF (NEQ(1) .NE. N) GO TO 605
1508 25   N = NEQ(1)
1509      IF (ITOL .LT. 1 .OR. ITOL .GT. 4) GO TO 606
1510      DO 26 I = 1,3
1511 26     IF (IOPT(I) .LT. 0 .OR. IOPT(I) .GT. 1) GO TO 607
1512      ISOPT = IOPT(2)
1513      IDF = IOPT(3)
1514      NYH = N
1515      NSV = 1
1516      METH = MF/10
1517      MITER = MF - 10*METH
1518      IF (METH .LT. 1 .OR. METH .GT. 2) GO TO 608
1519      IF (MITER .LT. 0 .OR. MITER .GT. 5) GO TO 608
1520      IF (MITER .LE. 3) GO TO 30
1521      ML = IWORK(1)
1522      MU = IWORK(2)
1523      IF (ML .LT. 0 .OR. ML .GE. N) GO TO 609
1524      IF (MU .LT. 0 .OR. MU .GE. N) GO TO 610
1525 30   IF (ISOPT .EQ. 0) GO TO 32
1526C CHECK LEGALITY OF THE NON-OPTIONAL INPUTS ISOPT, NPAR.
1527C COMPUTE NUMBER OF SOLUTION VECTORS AND TOTAL NUMBER OF EQUATIONS.
1528      IF (NEQ(2) .LE. 0) GO TO 628
1529      IF (ISTATE .EQ. 1) GO TO 31
1530      IF (NEQ(2) .NE. NPAR) GO TO 629
1531 31   NPAR = NEQ(2)
1532      NSV = NPAR + 1
1533      NYH = NSV * N
1534      IF (MITER .EQ. 0 .OR. MITER .EQ. 3) GO TO 630
1535C NEXT PROCESS AND CHECK THE OPTIONAL INPUTS. --------------------------
1536 32   IF (IOPT(1) .EQ. 1) GO TO 40
1537      MAXORD = MORD(METH)
1538      MXSTEP = MXSTP0
1539      MXHNIL = MXHNL0
1540      IF (ISTATE .EQ. 1) H0 = ZERO
1541      HMXI = ZERO
1542      HMIN = ZERO
1543      GO TO 60
1544 40   MAXORD = IWORK(5)
1545      IF (MAXORD .LT. 0) GO TO 611
1546      IF (MAXORD .EQ. 0) MAXORD = 100
1547      MAXORD = MIN(MAXORD,MORD(METH))
1548      MXSTEP = IWORK(6)
1549      IF (MXSTEP .LT. 0) GO TO 612
1550      IF (MXSTEP .EQ. 0) MXSTEP = MXSTP0
1551      MXHNIL = IWORK(7)
1552      IF (MXHNIL .LT. 0) GO TO 613
1553      IF (MXHNIL .EQ. 0) MXHNIL = MXHNL0
1554      IF (ISTATE .NE. 1) GO TO 50
1555      H0 = RWORK(5)
1556      IF ((TOUT - T)*H0 .LT. ZERO) GO TO 614
1557 50   HMAX = RWORK(6)
1558      IF (HMAX .LT. ZERO) GO TO 615
1559      HMXI = ZERO
1560      IF (HMAX .GT. ZERO) HMXI = ONE/HMAX
1561      HMIN = RWORK(7)
1562      IF (HMIN .LT. ZERO) GO TO 616
1563C-----------------------------------------------------------------------
1564C SET WORK ARRAY POINTERS AND CHECK LENGTHS LRW AND LIW.
1565C POINTERS TO SEGMENTS OF RWORK AND IWORK ARE NAMED BY PREFIXING L TO
1566C THE NAME OF THE SEGMENT.  E.G., THE SEGMENT YH STARTS AT RWORK(LYH).
1567C SEGMENTS OF RWORK (IN ORDER) ARE DENOTED  YH, WM, EWT, SAVF, ACOR.
1568C WORK SPACE FOR DFDP IS CONTAINED IN ACOR.
1569C-----------------------------------------------------------------------
1570 60   LYH = 21
1571      LWM = LYH + (MAXORD + 1)*NYH
1572      IF (MITER .EQ. 0) LENWM = 0
1573      IF (MITER .EQ. 1 .OR. MITER .EQ. 2) LENWM = N*N + 2
1574      IF (MITER .EQ. 3) LENWM = N + 2
1575      IF (MITER .GE. 4) LENWM = (2*ML + MU + 1)*N + 2
1576      LEWT = LWM + LENWM
1577      LSAVF = LEWT + NYH
1578      LACOR = LSAVF + N
1579      LDFDP = LACOR + N
1580      LENRW = LACOR + NYH - 1
1581      IWORK(17) = LENRW
1582      LIWM = 1
1583      LENIW = 20 + N
1584      IF (MITER .EQ. 0 .OR. MITER .EQ. 3) LENIW = 20
1585      LNRS = LENIW + LIWM
1586      IF (ISOPT .EQ. 1) LENIW = LNRS + NPAR
1587      IWORK(18) = LENIW
1588      IF (LENRW .GT. LRW) GO TO 617
1589      IF (LENIW .GT. LIW) GO TO 618
1590C CHECK RTOL AND ATOL FOR LEGALITY. ------------------------------------
1591      RTOLI = RTOL(1)
1592      ATOLI = ATOL(1)
1593      DO 70 I = 1,NYH
1594        IF (ITOL .GE. 3) RTOLI = RTOL(I)
1595        IF (ITOL .EQ. 2 .OR. ITOL .EQ. 4) ATOLI = ATOL(I)
1596        IF (RTOLI .LT. ZERO) GO TO 619
1597        IF (ATOLI .LT. ZERO) GO TO 620
1598 70     CONTINUE
1599      IF (ISTATE .EQ. 1) GO TO 100
1600C IF ISTATE = 3, SET FLAG TO SIGNAL PARAMETER CHANGES TO STODE. --------
1601      JSTART = -1
1602      IF (NQ .LE. MAXORD) GO TO 90
1603C MAXORD WAS REDUCED BELOW NQ.  COPY YH(*,MAXORD+2) INTO SAVF. ---------
1604      DO 80 I = 1,N
1605 80     RWORK(I+LSAVF-1) = RWORK(I+LWM-1)
1606C RELOAD WM(1) = RWORK(LWM), SINCE LWM MAY HAVE CHANGED. ---------------
1607 90   IF (MITER .GT. 0) RWORK(LWM) = SQRT(UROUND)
1608      GO TO 200
1609C-----------------------------------------------------------------------
1610C BLOCK C.
1611C THE NEXT BLOCK IS FOR THE INITIAL CALL ONLY (ISTATE = 1).
1612C IT CONTAINS ALL REMAINING INITIALIZATIONS, THE INITIAL CALL TO F,
1613C THE INITIAL CALL TO SPRIME IF ISOPT = 1,
1614C AND THE CALCULATION OF THE INITIAL STEP SIZE.
1615C THE ERROR WEIGHTS IN EWT ARE INVERTED AFTER BEING LOADED.
1616C-----------------------------------------------------------------------
1617 100  UROUND = D1MACH(4)
1618      TN = T
1619      IF (ITASK .NE. 4 .AND. ITASK .NE. 5) GO TO 105
1620      TCRIT = RWORK(1)
1621      IF ((TCRIT - TOUT)*(TOUT - T) .LT. ZERO) GO TO 625
1622      IF (H0 .NE. ZERO .AND. (T + H0 - TCRIT)*H0 .GT. ZERO)
1623     1   H0 = TCRIT - T
1624 105  JSTART = 0
1625      IF (MITER .GT. 0) RWORK(LWM) = SQRT(UROUND)
1626      NHNIL = 0
1627      NST = 0
1628      NJE = 0
1629      NSLAST = 0
1630      HU = ZERO
1631      NQU = 0
1632      CCMAX = 0.3D0
1633      MAXCOR = 3
1634      IF (ISOPT .EQ. 1) MAXCOR = 4
1635      MSBP = 20
1636      MXNCF = 10
1637C INITIAL CALL TO F.  (LF0 POINTS TO YH(1,2) AND LOADS IN VALUES).
1638      LF0 = LYH + NYH
1639      CALL F (NEQ, T, Y, PAR, RWORK(LF0))
1640      NFE = 1
1641      DUPS = ZERO
1642      DSMS = ZERO
1643      DDNS = ZERO
1644      NDFE = 0
1645      NSPE = 0
1646      IF (ISOPT .EQ. 0) GO TO 114
1647C INITIALIZE COUNTS FOR REPEATED STEPS DUE TO SENSITIVITY ANALYSIS.
1648      DO 110 J = 1,NSV
1649 110    IWORK(J + LNRS - 1) = 0
1650C LOAD THE INITIAL VALUE VECTOR IN YH. ---------------------------------
1651 114  DO 115 I = 1,NYH
1652 115    RWORK(I+LYH-1) = Y(I)
1653C LOAD AND INVERT THE EWT ARRAY.  (H IS TEMPORARILY SET TO ONE.) -------
1654      NQ = 1
1655      H = ONE
1656      CALL EWSET (NYH, ITOL, RTOL, ATOL, RWORK(LYH), RWORK(LEWT))
1657      DO 120 I = 1,NYH
1658        IF (RWORK(I+LEWT-1) .LE. ZERO) GO TO 621
1659 120    RWORK(I+LEWT-1) = ONE/RWORK(I+LEWT-1)
1660      IF (ISOPT .EQ. 0) GO TO 125
1661C CALL SPRIME TO LOAD FIRST-ORDER SENSITIVITY DERIVATIVES INTO
1662C REMAINING YH(*,2) POSITIONS.
1663      CALL SPRIME (NEQ, Y, RWORK(LYH), NYH, N, NSV, RWORK(LWM),
1664     1   IWORK(LIWM), RWORK(LEWT), RWORK(LF0), RWORK(LACOR),
1665     2   RWORK(LDFDP), PAR, F, JAC, DF, PREPJ, PREPDF)
1666      IF (IERSP .EQ. -1) GO TO 631
1667      IF (IERSP .EQ. -2) GO TO 632
1668C-----------------------------------------------------------------------
1669C THE CODING BELOW COMPUTES THE STEP SIZE, H0, TO BE ATTEMPTED ON THE
1670C FIRST STEP, UNLESS THE USER HAS SUPPLIED A VALUE FOR THIS.
1671C FIRST CHECK THAT TOUT - T DIFFERS SIGNIFICANTLY FROM ZERO.
1672C A SCALAR TOLERANCE QUANTITY TOL IS COMPUTED, AS MAX(RTOL(I))
1673C IF THIS IS POSITIVE, OR MAX(ATOL(I)/ABS(Y(I))) OTHERWISE, ADJUSTED
1674C SO AS TO BE BETWEEN 100*UROUND AND 1.0E-3. ONLY THE ORIGINAL
1675C SOLUTION VECTOR IS CONSIDERED IN THIS CALCULATION (ISOPT = 0 OR 1).
1676C THEN THE COMPUTED VALUE H0 IS GIVEN BY..
1677C                                     NEQ
1678C  H0**2 = TOL / ( W0**-2 + (1/NEQ) * SUM ( F(I)/YWT(I) )**2  )
1679C                                      1
1680C WHERE  W0     = MAX ( ABS(T), ABS(TOUT) ),
1681C        F(I)   = I-TH COMPONENT OF INITIAL VALUE OF F,
1682C        YWT(I) = EWT(I)/TOL  (A WEIGHT FOR Y(I)).
1683C THE SIGN OF H0 IS INFERRED FROM THE INITIAL VALUES OF TOUT AND T.
1684C-----------------------------------------------------------------------
1685 125  IF (H0 .NE. ZERO) GO TO 180
1686      TDIST = ABS(TOUT - T)
1687      W0 = MAX(ABS(T),ABS(TOUT))
1688      IF (TDIST .LT. TWO*UROUND*W0) GO TO 622
1689      TOL = RTOL(1)
1690      IF (ITOL .LE. 2) GO TO 140
1691      DO 130 I = 1,N
1692 130    TOL = MAX(TOL,RTOL(I))
1693 140   IF (TOL .GT. ZERO) GO TO 160
1694      ATOLI = ATOL(1)
1695      DO 150 I = 1,N
1696        IF (ITOL .EQ. 2 .OR. ITOL .EQ. 4) ATOLI = ATOL(I)
1697        AYI = ABS(Y(I))
1698        IF (AYI .NE. ZERO) TOL = MAX(TOL,ATOLI/AYI)
1699 150    CONTINUE
1700 160   TOL = MAX(TOL,100.0D0*UROUND)
1701      TOL = MIN(TOL,0.001D0)
1702      SUM = VNORM (N, RWORK(LF0), RWORK(LEWT))
1703      SUM = ONE/(TOL*W0*W0) + TOL*SUM**2
1704      H0 = ONE/SQRT(SUM)
1705      H0 = MIN(H0,TDIST)
1706      H0 = SIGN(H0,TOUT-T)
1707C ADJUST H0 IF NECESSARY TO MEET HMAX BOUND. ---------------------------
1708 180   RH = ABS(H0)*HMXI
1709      IF (RH .GT. ONE) H0 = H0/RH
1710C LOAD H WITH H0 AND SCALE YH(*,2) BY H0. ------------------------------
1711      H = H0
1712      DO 190 I = 1,NYH
1713 190    RWORK(I+LF0-1) = H0*RWORK(I+LF0-1)
1714      GO TO 270
1715C-----------------------------------------------------------------------
1716C BLOCK D.
1717C THE NEXT CODE BLOCK IS FOR CONTINUATION CALLS ONLY (ISTATE = 2 OR 3)
1718C AND IS TO CHECK STOP CONDITIONS BEFORE TAKING A STEP.
1719C-----------------------------------------------------------------------
1720 200   NSLAST = NST
1721      GO TO (210, 250, 220, 230, 240), ITASK
1722 210   IF ((TN - TOUT)*H .LT. ZERO) GO TO 250
1723      CALL INTDY (TOUT, 0, RWORK(LYH), NYH, Y, IFLAG)
1724      IF (IFLAG .NE. 0) GO TO 627
1725      T = TOUT
1726      GO TO 420
1727 220   TP = TN - HU*(ONE + 100.0D0*UROUND)
1728      IF ((TP - TOUT)*H .GT. ZERO) GO TO 623
1729      IF ((TN - TOUT)*H .LT. ZERO) GO TO 250
1730      GO TO 400
1731 230   TCRIT = RWORK(1)
1732      IF ((TN - TCRIT)*H .GT. ZERO) GO TO 624
1733      IF ((TCRIT - TOUT)*H .LT. ZERO) GO TO 625
1734      IF ((TN - TOUT)*H .LT. ZERO) GO TO 245
1735      CALL INTDY (TOUT, 0, RWORK(LYH), NYH, Y, IFLAG)
1736      IF (IFLAG .NE. 0) GO TO 627
1737      T = TOUT
1738      GO TO 420
1739 240   TCRIT = RWORK(1)
1740      IF ((TN - TCRIT)*H .GT. ZERO) GO TO 624
1741 245   HMX = ABS(TN) + ABS(H)
1742      IHIT = ABS(TN - TCRIT) .LE. 100.0D0*UROUND*HMX
1743      IF (IHIT) GO TO 400
1744      TNEXT = TN + H*(ONE + FOUR*UROUND)
1745      IF ((TNEXT - TCRIT)*H .LE. ZERO) GO TO 250
1746      H = (TCRIT - TN)*(ONE - FOUR*UROUND)
1747      IF (ISTATE .EQ. 2) JSTART = -2
1748C-----------------------------------------------------------------------
1749C BLOCK E.
1750C THE NEXT BLOCK IS NORMALLY EXECUTED FOR ALL CALLS AND CONTAINS
1751C THE CALL TO THE ONE-STEP CORE INTEGRATOR STODE.
1752C
1753C THIS IS A LOOPING POINT FOR THE INTEGRATION STEPS.
1754C
1755C FIRST CHECK FOR TOO MANY STEPS BEING TAKEN, UPDATE EWT (IF NOT AT
1756C START OF PROBLEM), CHECK FOR TOO MUCH ACCURACY BEING REQUESTED, AND
1757C CHECK FOR H BELOW THE ROUNDOFF LEVEL IN T.
1758C TOLSF IS CALCULATED CONSIDERING ALL SOLUTION VECTORS.
1759C-----------------------------------------------------------------------
1760 250   CONTINUE
1761      IF ((NST-NSLAST) .GE. MXSTEP) GO TO 500
1762      CALL EWSET (NYH, ITOL, RTOL, ATOL, RWORK(LYH), RWORK(LEWT))
1763      DO 260 I = 1,NYH
1764        IF (RWORK(I+LEWT-1) .LE. ZERO) GO TO 510
1765 260    RWORK(I+LEWT-1) = ONE/RWORK(I+LEWT-1)
1766 270   TOLSF = UROUND*VNORM (NYH, RWORK(LYH), RWORK(LEWT))
1767      IF (TOLSF .LE. ONE) GO TO 280
1768      TOLSF = TOLSF*2.0D0
1769      IF (NST .EQ. 0) GO TO 626
1770      GO TO 520
1771 280   IF (ADDX(TN,H) .NE. TN) GO TO 290
1772      NHNIL = NHNIL + 1
1773      IF (NHNIL .GT. MXHNIL) GO TO 290
1774      CALL XERR ('ODESSA - WARNING..INTERNAL T (=R1) AND H (=R2) ARE',
1775     1   101, 1, 0, 0, 0, 0, ZERO, ZERO)
1776      CALL XERR ('SUCH THAT IN THE MACHINE, T + H = T ON THE NEXT STEP',
1777     1   101, 1, 0, 0, 0, 0, ZERO, ZERO)
1778      CALL XERR ('(H = STEP SIZE). KppSolveR WILL CONTINUE ANYWAY',
1779     1   101, 1, 0, 0, 0, 2, TN, H)
1780      IF (NHNIL .LT. MXHNIL) GO TO 290
1781      CALL XERR ('ODESSA - ABOVE WARNING HAS BEEN ISSUED I1 TIMES.',
1782     1   102, 1, 0, 0, 0, 0, ZERO, ZERO)
1783      CALL XERR ('IT WILL NOT BE ISSUED AGAIN FOR THIS PROBLEM',
1784     1   102, 1, 1, MXHNIL, 0, 0, ZERO,ZERO)
1785 290   CONTINUE
1786C-----------------------------------------------------------------------
1787C     CALL STODE(NEQ,Y,YH,NYH,YH,WM,IWM,EWT,SAVF,ACOR,PAR,NRS,
1788C    1   F,JAC,DF,PREPJ,PREPDF,SOLSY)
1789C-----------------------------------------------------------------------
1790      CALL STODE (NEQ, Y, RWORK(LYH), NYH, RWORK(LYH), RWORK(LWM),
1791     1   IWORK(LIWM), RWORK(LEWT), RWORK(LSAVF), RWORK(LACOR),
1792     2   PAR, IWORK(LNRS), F, JAC, DF, PREPJ, PREPDF, SOLSY)
1793      KGO = 1 - KFLAG
1794      GO TO (300, 530, 540, 633), KGO
1795C-----------------------------------------------------------------------
1796C BLOCK F.
1797C THE FOLLOWING BLOCK HANDLES THE CASE OF A SUCCESSFUL RETURN FROM THE
1798C CORE INTEGRATOR (KFLAG = 0).  TEST FOR STOP CONDITIONS.
1799C-----------------------------------------------------------------------
1800 300   INIT = 1
1801      GO TO (310, 400, 330, 340, 350), ITASK
1802C ITASK = 1.  IF TOUT HAS BEEN REACHED, INTERPOLATE. -------------------
1803 310   IF ((TN - TOUT)*H .LT. ZERO) GO TO 250
1804      CALL INTDY (TOUT, 0, RWORK(LYH), NYH, Y, IFLAG)
1805      T = TOUT
1806      GO TO 420
1807C ITASK = 3.  JUMP TO EXIT IF TOUT WAS REACHED. ------------------------
1808 330   IF ((TN - TOUT)*H .GE. ZERO) GO TO 400
1809      GO TO 250
1810C ITASK = 4.  SEE IF TOUT OR TCRIT WAS REACHED.  ADJUST H IF NECESSARY.
1811 340   IF ((TN - TOUT)*H .LT. ZERO) GO TO 345
1812      CALL INTDY (TOUT, 0, RWORK(LYH), NYH, Y, IFLAG)
1813      T = TOUT
1814      GO TO 420
1815 345   HMX = ABS(TN) + ABS(H)
1816      IHIT = ABS(TN - TCRIT) .LE. 100.0D0*UROUND*HMX
1817      IF (IHIT) GO TO 400
1818      TNEXT = TN + H*(ONE + FOUR*UROUND)
1819      IF ((TNEXT - TCRIT)*H .LE. ZERO) GO TO 250
1820      H = (TCRIT - TN)*(ONE - FOUR*UROUND)
1821      JSTART = -2
1822      GO TO 250
1823C ITASK = 5.  SEE IF TCRIT WAS REACHED AND JUMP TO EXIT. ---------------
1824 350   HMX = ABS(TN) + ABS(H)
1825      IHIT = ABS(TN - TCRIT) .LE. 100.0D0*UROUND*HMX
1826C-----------------------------------------------------------------------
1827C BLOCK G.
1828C THE FOLLOWING BLOCK HANDLES ALL SUCCESSFUL RETURNS FROM ODESSA.
1829C IF ITASK .NE. 1, Y IS LOADED FROM YH AND T IS SET ACCORDINGLY.
1830C ISTATE IS SET TO 2, THE ILLEGAL INPUT COUNTER IS ZEROED, AND THE
1831C OPTIONAL OUTPUTS ARE LOADED INTO THE WORK ARRAYS BEFORE RETURNING.
1832C IF ISTATE = 1 AND TOUT = T, THERE IS A RETURN WITH NO ACTION TAKEN,
1833C EXCEPT THAT IF THIS HAS HAPPENED REPEATEDLY, THE RUN IS TERMINATED.
1834C-----------------------------------------------------------------------
1835 400  DO 410 I = 1,NYH
1836 410    Y(I) = RWORK(I+LYH-1)
1837      T = TN
1838      IF (ITASK .NE. 4 .AND. ITASK .NE. 5) GO TO 420
1839      IF (IHIT) T = TCRIT
1840 420   ISTATE = 2
1841      ILLIN = 0
1842      RWORK(11) = HU
1843      RWORK(12) = H
1844      RWORK(13) = TN
1845      IWORK(11) = NST
1846      IWORK(12) = NFE
1847      IWORK(13) = NJE
1848      IWORK(14) = NQU
1849      IWORK(15) = NQ
1850      IF (ISOPT .EQ. 0) RETURN
1851      IWORK(19) = NDFE
1852      IWORK(20) = NSPE
1853      RETURN
1854 430   NTREP = NTREP + 1
1855      IF (NTREP .LT. 5) RETURN
1856      CALL XERR ('ODESSA -- REPEATED CALLS WITH ISTATE = 1 AND
1857     1TOUT = T (=R1)', 301, 1, 0, 0, 0, 1, T, ZERO)
1858      GO TO 800
1859C-----------------------------------------------------------------------
1860C BLOCK H.
1861C THE FOLLOWING BLOCK HANDLES ALL UNSUCCESSFUL RETURNS OTHER THAN
1862C THOSE FOR ILLEGAL INPUT.  FIRST THE ERROR MESSAGE ROUTINE IS CALLED.
1863C IF THERE WAS AN ERROR TEST OR CONVERGENCE TEST FAILURE, IMXER IS SET.
1864C THEN Y IS LOADED FROM YH, T IS SET TO TN, AND THE ILLEGAL INPUT
1865C COUNTER ILLIN IS SET TO 0.  THE OPTIONAL OUTPUTS ARE LOADED INTO
1866C THE WORK ARRAYS BEFORE RETURNING.
1867C-----------------------------------------------------------------------
1868C THE MAXIMUM NUMBER OF STEPS WAS TAKEN BEFORE REACHING TOUT. ----------
1869 500  CALL XERR ('ODESSA - AT CURRENT T (=R1), MXSTEP (=I1) STEPS',
1870     1   201, 1, 0, 0, 0, 0, ZERO,ZERO)
1871      CALL XERR ('TAKEN ON THIS CALL BEFORE REACHING TOUT',
1872     1   201, 1, 1, MXSTEP, 0, 1, TN, ZERO)
1873      ISTATE = -1
1874      GO TO 580
1875C EWT(I) .LE. 0.0 FOR SOME I (NOT AT START OF PROBLEM). ----------------
1876 510   EWTI = RWORK(LEWT+I-1)
1877      CALL XERR ('ODESSA - AT T (=R1), EWT(I1) HAS BECOME R2 .LE. 0.',
1878     1   202, 1, 1, I, 0, 2, TN, EWTI)
1879      ISTATE = -6
1880      GO TO 580
1881C TOO MUCH ACCURACY REQUESTED FOR MACHINE PRECISION. -------------------
1882 520  CALL XERR ('ODESSA - AT T (=R1), TOO MUCH ACCURACY REQUESTED',
1883     1  203, 1, 0, 0, 0, 0, ZERO,ZERO)
1884      CALL XERR ('FOR PRECISION OF MACHINE..  SEE TOLSF (=R2)',
1885     1  203, 1, 0, 0, 0, 2, TN, TOLSF)
1886      RWORK(14) = TOLSF
1887      ISTATE = -2
1888      GO TO 580
1889C KFLAG = -1.  ERROR TEST FAILED REPEATEDLY OR WITH ABS(H) = HMIN. -----
1890 530  CALL XERR ('ODESSA - AT T(=R1) AND STEP SIZE H(=R2), THE ERROR',
1891     1  204, 1, 0, 0, 0, 0, ZERO, ZERO)
1892      CALL XERR ('TEST FAILED REPEATEDLY OR WITH ABS(H) = HMIN',
1893     1  204, 1, 0, 0, 0, 2, TN, H)
1894      ISTATE = -4
1895      GO TO 560
1896C KFLAG = -2.  CONVERGENCE FAILED REPEATEDLY OR WITH ABS(H) = HMIN. ----
1897 540  CALL XERR ('ODESSA - AT T (=R1) AND STEP SIZE H (=R2), THE',
1898     1  205, 1, 0, 0, 0, 0, ZERO,ZERO)
1899      CALL XERR ('CORRECTOR CONVERGENCE FAILED REPEATEDLY',
1900     1   205, 1, 0, 0, 0, 0, ZERO,ZERO)
1901      CALL XERR ('OR WITH ABS(H) = HMIN',
1902     1   205, 1, 0, 0, 0, 2, TN, H)
1903      ISTATE = -5
1904C COMPUTE IMXER IF RELEVANT. -------------------------------------------
1905 560   BIG = ZERO
1906      IMXER = 1
1907      DO 570 I = 1,NYH
1908        SIZE = ABS(RWORK(I+LACOR-1)*RWORK(I+LEWT-1))
1909        IF (BIG .GE. SIZE) GO TO 570
1910        BIG = SIZE
1911        IMXER = I
1912 570    CONTINUE
1913      IWORK(16) = IMXER
1914C SET Y VECTOR, T, ILLIN, AND OPTIONAL OUTPUTS. ------------------------
1915 580   DO 590 I = 1,NYH
1916 590    Y(I) = RWORK(I+LYH-1)
1917      T = TN
1918      ILLIN = 0
1919      RWORK(11) = HU
1920      RWORK(12) = H
1921      RWORK(13) = TN
1922      IWORK(11) = NST
1923      IWORK(12) = NFE
1924      IWORK(13) = NJE
1925      IWORK(14) = NQU
1926      IWORK(15) = NQ
1927      IF (ISOPT .EQ. 0) RETURN
1928      IWORK(19) = NDFE
1929      IWORK(20) = NSPE
1930      RETURN
1931C-----------------------------------------------------------------------
1932C BLOCK I.
1933C THE FOLLOWING BLOCK HANDLES ALL ERROR RETURNS DUE TO ILLEGAL INPUT
1934C (ISTATE = -3), AS DETECTED BEFORE CALLING THE CORE INTEGRATOR.
1935C FIRST THE ERROR MESSAGE ROUTINE IS CALLED.  THEN IF THERE HAVE BEEN
1936C 5 CONSECUTIVE SUCH RETURNS JUST BEFORE THIS CALL TO THE KppSolveR,
1937C THE RUN IS HALTED.
1938C-----------------------------------------------------------------------
1939 601   CALL XERR ('ODESSA - ISTATE (=I1) ILLEGAL',
1940     1  1, 1, 1, ISTATE, 0, 0, ZERO,ZERO)
1941      GO TO 700
1942 602   CALL XERR ('ODESSA - ITASK (=I1) ILLEGAL',
1943     1  2, 1, 1, ITASK, 0, 0, ZERO,ZERO)
1944      GO TO 700
1945 603  CALL XERR ('ODESSA - ISTATE .GT. 1 BUT ODESSA NOT INITIALIZED',
1946     1  3, 1, 0, 0, 0, 0, ZERO,ZERO)
1947      GO TO 700
1948 604   CALL XERR ('ODESSA - NEQ (=I1) .LT. 1',
1949     1  4, 1, 1, NEQ(1), 0, 0, ZERO,ZERO)
1950      GO TO 700
1951 605  CALL XERR ('ODESSA - ISTATE = 3 AND NEQ CHANGED.  (I1 TO I2)',
1952     1  5, 1, 2, N, NEQ(1), 0, ZERO,ZERO)
1953      GO TO 700
1954 606   CALL XERR ('ODESSA - ITOL (=I1) ILLEGAL',
1955     1  6, 1, 1, ITOL, 0, 0, ZERO,ZERO)
1956      GO TO 700
1957 607   CALL XERR ('ODESSA - IOPT (=I1) ILLEGAL',
1958     1   7, 1, 1, IOPT, 0, 0, ZERO,ZERO)
1959      GO TO 700
1960 608   CALL XERR('ODESSA - MF (=I1) ILLEGAL',
1961     1   8, 1, 1, MF, 0, 0, ZERO,ZERO)
1962      GO TO 700
1963 609  CALL XERR('ODESSA - ML (=I1) ILLEGAL.. .LT.0 OR .GE.NEQ (=I2)',
1964     1   9, 1, 2, ML, NEQ(1), 0, ZERO,ZERO)
1965      GO TO 700
1966 610  CALL XERR('ODESSA - MU (=I1) ILLEGAL.. .LT.0 OR .GE.NEQ (=I2)',
1967     1   10, 1, 2, MU, NEQ(1), 0, ZERO,ZERO)
1968      GO TO 700
1969 611   CALL XERR('ODESSA - MAXORD (=I1) .LT. 0',
1970     1   11, 1, 1, MAXORD, 0, 0, ZERO,ZERO)
1971      GO TO 700
1972 612   CALL XERR('ODESSA - MXSTEP (=I1) .LT. 0',
1973     1   12, 1, 1, MXSTEP, 0, 0, ZERO,ZERO)
1974      GO TO 700
1975 613   CALL XERR('ODESSA - MXHNIL (=I1) .LT. 0',
1976     1   13, 1, 1, MXHNIL, 0, 0, ZERO,ZERO)
1977      GO TO 700
1978 614   CALL XERR('ODESSA - TOUT (=R1) BEHIND T (=R2)',
1979     1   14, 1, 0, 0, 0, 2, TOUT, T)
1980      CALL XERR('INTEGRATION DIRECTION IS GIVEN BY H0 (=R1)',
1981     1   14, 1, 0, 0, 0, 1, H0, ZERO)
1982      GO TO 700
1983 615   CALL XERR('ODESSA - HMAX (=R1) .LT. 0.0',
1984     1   15, 1, 0, 0, 0, 1, HMAX, ZERO)
1985      GO TO 700
1986 616   CALL XERR('ODESSA - HMIN (=R1) .LT. 0.0',
1987     1   16, 1, 0, 0, 0, 1, HMIN, ZERO)
1988      GO TO 700
1989 617  CALL XERR('ODESSA - RWORK LENGTH NEEDED, LENRW (=I1), EXCEEDS
1990     1 LRW (=I2)', 17, 1, 2, LENRW, LRW, 0, ZERO,ZERO)
1991      GO TO 700
1992 618  CALL XERR('ODESSA - IWORK LENGTH NEEDED, LENIW (=I1), EXCEEDS
1993     1 LIW (=I2)', 18, 1, 2, LENIW, LIW, 0, ZERO,ZERO)
1994      GO TO 700
1995 619   CALL XERR('ODESSA - RTOL(I1) IS R1 .LT. 0.0',
1996     1   19, 1, 1, I, 0, 1, RTOLI, ZREO)
1997      GO TO 700
1998 620   CALL XERR('ODESSA - ATOL(I1) IS R1 .LT. 0.0',
1999     1   20, 1, 1, I, 0, 1, ATOLI, ZERO)
2000      GO TO 700
2001*
2002 621   EWTI = RWORK(LEWT+I-1)
2003      CALL XERR('ODESSA - EWT(I1) IS R1 .LE. 0.0',
2004     1   21, 1, 1, I, 0, 1, EWTI, ZERO)
2005      GO TO 700
2006 622  CALL XERR('ODESSA - TOUT (=R1) TOO CLOSE TO T(=R2) TO START
2007     1 INTEGRATION', 22, 1, 0, 0, 0, 2, TOUT, T)
2008      GO TO 700
2009 623  CALL XERR('ODESSA - ITASK = I1 AND TOUT (=R1) BEHIND TCUR - HU
2010     1 (= R2)', 23, 1, 1, ITASK, 0, 2, TOUT, TP)
2011      GO TO 700
2012 624  CALL XERR('ODESSA - ITASK = 4 OR 5 AND TCRIT (=R1) BEHIND TCUR
2013     1 (=R2)', 24, 1, 0, 0, 0, 2, TCRIT, TN)
2014      GO TO 700
2015 625   CALL XERR('ODESSA - ITASK = 4 OR 5 AND TCRIT (=R1) BEHIND TOUT
2016     1 (=R2)', 25, 1, 0, 0, 0, 2, TCRIT, TOUT)
2017      GO TO 700
2018 626  CALL XERR('ODESSA - AT START OF PROBLEM, TOO MUCH ACCURACY',
2019     1   26, 1, 0, 0, 0, 0, ZERO,ZERO)
2020      CALL XERR('REQUESTED FOR PRECISION OF MACHINE. SEE TOLSF (=R1)',
2021     1   26, 1, 0, 0, 0, 1, TOLSF, ZERO)
2022      RWORK(14) = TOLSF
2023      GO TO 700
2024 627  CALL XERR('ODESSA - TROUBLE FROM INTDY. ITASK = I1, TOUT = R1',
2025     1   27, 1, 1, ITASK, 0, 1, TOUT, ZERO)
2026      GO TO 700
2027C ERROR STATEMENTS ASSOCIATED WITH SENSITIVITY ANALYSIS.
2028 628  CALL XERR('ODESSA - NPAR (=I1) .LT. 1',
2029     1   28, 1, 1, NPAR, 0, 0, ZERO,ZERO)
2030      GO TO 700
2031 629  CALL XERR('ODESSA - ISTATE = 3 AND NPAR CHANGED (I1 TO I2)',
2032     1   29, 1, 2, NP, NPAR, 0, ZERO,ZERO)
2033      GO TO 700
2034 630  CALL XERR('ODESSA - MITER (=I1) ILLEGAL',
2035     1   30, 1, 1, MITER, 0, 0, ZERO,ZERO)
2036      GO TO 700
2037 631  CALL XERR('ODESSA - TROUBLE IN SPRIME (IERPJ)',
2038     1   31, 1, 0, 0, 0, 0, ZERO,ZERO)
2039      GO TO 700
2040 632  CALL XERR('ODESSA - TROUBLE IN SPRIME (MITER)',
2041     1   32, 1, 0, 0, 0, 0, ZERO,ZERO)
2042      GO TO 700
2043 633  CALL XERR('ODESSA - FATAL ERROR IN STODE (KFLAG = -3)',
2044     1   33, 2, 0, 0, 0, 0, ZERO,ZERO)
2045      GO TO 801
2046C
2047 700   IF (ILLIN .EQ. 5) GO TO 710
2048      ILLIN = ILLIN + 1
2049      ISTATE = -3
2050      RETURN
2051 710  CALL XERR('ODESSA - REPEATED OCCURRENCES OF ILLEGAL INPUT',
2052     1   302, 1, 0, 0, 0, 0, ZERO,ZERO)
2053C
2054 800  CALL XERR('ODESSA - RUN ABORTED.. APPARENT INFINITE LOOP',
2055     1   303, 2, 0, 0, 0, 0, ZERO,ZERO)
2056      RETURN
2057 801  CALL XERR('ODESSA - RUN ABORTED',
2058     1   304, 2, 0, 0, 0, 0, ZERO,ZERO)
2059      RETURN
2060C-------------------- END OF SUBROUTINE ODESSA -------------------------
2061      END
2062      DOUBLE PRECISION FUNCTION ADDX(A,B)
2063      DOUBLE PRECISION A,B
2064C
2065C  THIS FUNCTION IS NECESSARY TO FORCE OPTIMIZING COMPILERS TO
2066C  EXECUTE AND STORE A SUM, FOR SUCCESSFUL EXECUTION OF THE
2067C  TEST A + B = B.
2068C
2069      ADDX = A + B
2070      RETURN
2071C-------------------- END OF FUNCTION SUM ------------------------------
2072      END
2073      SUBROUTINE SPRIME (NEQ, Y, YH, NYH, NROW, NCOL, WM, IWM,
2074     1  EWT, SAVF, FTEM, DFDP, PAR, F, JAC, DF, PJAC, PDF)
2075      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2076      DIMENSION NEQ(*), Y(*), YH(NROW,NCOL,*), WM(*), IWM(*),
2077     1  EWT(*), SAVF(*), FTEM(*), DFDP(NROW,*), PAR(*)
2078      EXTERNAL F, JAC, DF, PJAC, PDF
2079      PARAMETER (ONE=1.0D0,ZERO=0.0D0)
2080      COMMON /ODE001/ ROWND, ROWNS(173),
2081     1  RDUM1(37),EL0, H, RDUM2(6),
2082     2  IOWND1(14), IOWNS(4),
2083     3  IDUM1(3), IERPJ, IDUM2(6),
2084     4  MITER, IDUM3(4), N, IDUM4(5)
2085      COMMON /ODE002/ RDUM3(3),
2086     1  IOWND2(3), IDUM5, NSV, IDUM6, NSPE, IDUM7, IERSP, JOPT, IDUM8
2087C-----------------------------------------------------------------------
2088C SPRIME IS CALLED BY ODESSA TO INITIALIZE THE YH ARRAY. IT IS ALSO
2089C CALLED BY STODE TO REEVALUATE FIRST ORDER DERIVATIVES WHEN KFLAG
2090C .LE. -3. SPRIME COMPUTES THE FIRST DERIVATIVES OF THE SENSITIVITY
2091C COEFFICIENTS WITH RESPECT TO THE INDEPENDENT VARIABLE T...
2092C
2093C        SPRIME = D(DY/DP)/DT = JAC*DY/DP + DF/DP
2094C                   WHERE JAC = JACOBIAN MATRIX
2095C                       DY/DP = SENSITIVITY MATRIX
2096C                       DF/DP = INHOMOGENEITY MATRIX
2097C THIS ROUTINE USES THE COMMON VARIABLES EL0, H, IERPJ, MITER, N,
2098C NSV, NSPE, IERSP, JOPT
2099C-----------------------------------------------------------------------
2100C CALL PREPJ WITH JOPT = 1.
2101C IF MITER = 2 OR 5, EL0 IS TEMPORARILY SET TO -1.0 AND H IS
2102C TEMPORARILY SET TO 1.0D0.
2103C-----------------------------------------------------------------------
2104      NSPE = NSPE + 1
2105      JOPT = 1
2106      IF (MITER .EQ. 1 .OR. MITER .EQ. 4) GO TO 10
2107      HTEMP = H
2108      ETEMP = EL0
2109      H = ONE
2110      EL0 = -ONE
2111 10   CALL PJAC (NEQ, Y, YH, NYH, WM, IWM, EWT, SAVF, FTEM,
2112     1   PAR, F, JAC, JOPT)
2113      IF (IERPJ .NE. 0) GO TO 300
2114      JOPT = 0
2115      IF (MITER .EQ. 1 .OR. MITER .EQ. 4) GO TO 20
2116      H = HTEMP
2117      EL0 = ETEMP
2118C-----------------------------------------------------------------------
2119C CALL PREPDF AND LOAD DFDP(*,JPAR).
2120C-----------------------------------------------------------------------
2121 20   DO 30 J = 2,NSV
2122        JPAR = J - 1
2123        CALL PDF (NEQ, Y, WM, SAVF, FTEM, DFDP(1,JPAR), PAR,
2124     1     F, DF, JPAR)
2125 30   CONTINUE
2126C-----------------------------------------------------------------------
2127C COMPUTE JAC*DY/DP AND STORE RESULTS IN YH(*,*,2).
2128C-----------------------------------------------------------------------
2129      GO TO (40,40,310,100,100) MITER
2130C THE JACOBIAN IS FULL.------------------------------------------------
2131C FOR EACH ROW OF THE JACOBIAN..
2132C 40   DO 70 IROW = 1,N
2133C AND EACH COLUMN OF THE SENSITIVITY MATRIX..
2134C        DO 60 J = 2,NSV
2135C          SUM = ZERO
2136C TAKE THE VECTOR DOT PRODUCT..
2137C          DO 50 I = 1,N
2138C            IPD = IROW + N*(I-1) + 2
2139C            SUM = SUM + WM(IPD)*YH(I,J,1)
2140C 50       CONTINUE
2141C          YH(IROW,J,2) = SUM
2142C 60     CONTINUE
2143C 70   CONTINUE
2144  40  CONTINUE
2145C FOR EACH COLUMN OF THE SENSITIVITY MATRIX..
2146      DO 60 J = 2,NSV
2147        CALL Jac_SP_Vec( WM(3), YH(1,J,1), YH(1,J,2) )
2148 60   CONTINUE
2149      GO TO 200
2150C THE JACOBIAN IS BANDED.-----------------------------------------------
2151 100  ML = IWM(1)
2152      MU = IWM(2)
2153      ICOUNT = 1
2154      MBAND = ML + MU + 1
2155      MEBAND = MBAND + ML
2156      NMU = N - MU
2157      ML1 = ML + 1
2158C FOR EACH ROW OF THE JACOBIAN..
2159      DO 160 IROW = 1,N
2160        IF (IROW .GT. ML1) GO TO 110
2161        IPD = MBAND + IROW + 1
2162        IYH = 1
2163        LBAND = MU + IROW
2164        GO TO 120
2165 110    ICOUNT = ICOUNT + 1
2166        IPD = ICOUNT*MEBAND + 2
2167        IYH = IYH + 1
2168        LBAND = LBAND - 1
2169        IF (IROW .LE. NMU) LBAND = MBAND
2170C AND EACH COLUMN OF THE SENSITIVITY MATRIX..
2171 120    DO 150 J = 2,NSV
2172          SUM = ZERO
2173          I1 = IPD
2174          I2 = IYH
2175C TAKE THE VECTOR DOT PRODUCT.
2176          DO 140 I = 1,LBAND
2177            SUM = SUM + WM(I1)*YH(I2,J,1)
2178            I1 = I1 + MEBAND - 1
2179            I2 = I2 + 1
2180 140      CONTINUE
2181          YH(IROW,J,2) = SUM
2182 150    CONTINUE
2183 160  CONTINUE
2184C-----------------------------------------------------------------------
2185C ADD THE INHOMOGENEITY TERM, I.E., ADD DFDP(*,JPAR) TO YH(*,JPAR+1,2).
2186C-----------------------------------------------------------------------
2187 200  DO 220 J = 2,NSV
2188        JPAR = J - 1
2189        DO 210 I = 1,N
2190          YH(I,J,2) = YH(I,J,2) + DFDP(I,JPAR)
2191 210    CONTINUE
2192 220  CONTINUE
2193      RETURN
2194C-----------------------------------------------------------------------
2195C ERROR RETURNS.
2196C-----------------------------------------------------------------------
2197 300  IERSP = -1
2198      RETURN
2199 310  IERSP = -2
2200      RETURN
2201C------------------------END OF SUBROUTINE SPRIME-----------------------
2202      END
2203      SUBROUTINE PREPJ (NEQ, Y, YH, NYH, WM, IWM, EWT, SAVF, FTEM,
2204     1   PAR, FUNC_CHEM, JAC, JOPT)
2205C      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2206      INCLUDE 'KPP_ROOT_Parameters.h'
2207      INCLUDE 'KPP_ROOT_Sparse.h'
2208      DIMENSION NEQ(*), Y(*), YH(NYH,*), WM(*), IWM(*), EWT(*),
2209     1   SAVF(*), FTEM(*), PAR(*)
2210      EXTERNAL FUNC_CHEM, JAC
2211      PARAMETER (ZERO=0.0D0,ONE=1.0D0)
2212      COMMON /ODE001/ ROWND, ROWNS(173),
2213     2   RDUM1(37), EL0, H, RDUM2(4), TN, UROUND,
2214     3   IOWND(14), IOWNS(4),
2215     4   IDUM1(3), IERPJ, IDUM2, JCUR, IDUM3(4),
2216     5   MITER, IDUM4(4), N, IDUM5(2), NFE, NJE, IDUM6
2217C-----------------------------------------------------------------------
2218C PREPJ IS CALLED BY STODE TO COMPUTE AND PROCESS THE MATRIX
2219C P = I - H*EL(1)*J , WHERE J IS AN APPROXIMATION TO THE JACOBIAN.
2220C IF ISOPT = 1, PREPJ IS ALSO CALLED BY SPRIME WITH JOPT = 1.
2221C HERE J IS COMPUTED BY THE USER-SUPPLIED ROUTINE JAC IF
2222C MITER = 1 OR 4, OR BY FINITE DIFFERENCING IF MITER = 2, 3, OR 5.
2223C IF MITER = 3, A DIAGONAL APPROXIMATION TO J IS USED.
2224C J IS STORED IN WM AND REPLACED BY P.  IF MITER .NE. 3, P IS THEN
2225C SUBJECTED TO LU DECOMPOSITION (JOPT = 0) IN PREPARATION FOR LATER
2226C SOLUTION OF LINEAR SYSTEMS WITH P AS COEFFICIENT MATRIX. THIS IS
2227C DONE BY DGEFA IF MITER = 1 OR 2, AND BY DGBFA IF MITER = 4 OR 5.
2228C
2229C IN ADDITION TO VARIABLES DESCRIBED PREVIOUSLY, COMMUNICATION
2230C WITH PREPJ USES THE FOLLOWING..
2231C Y     = ARRAY CONTAINING PREDICTED VALUES ON ENTRY.
2232C FTEM  = WORK ARRAY OF LENGTH N (ACOR IN STODE).
2233C SAVF  = ARRAY CONTAINING F EVALUATED AT PREDICTED Y.
2234C WM    = REAL WORK SPACE FOR MATRICES.  ON OUTPUT IT CONTAINS THE
2235C         INVERSE DIAGONAL MATRIX IF MITER = 3 AND THE LU DECOMPOSITION
2236C         OF P IF MITER IS 1, 2 , 4, OR 5.
2237C         STORAGE OF MATRIX ELEMENTS STARTS AT WM(3).
2238C         WM ALSO CONTAINS THE FOLLOWING MATRIX-RELATED DATA..
2239C         WM(1) = SQRT(UROUND), USED IN NUMERICAL JACOBIAN INCREMENTS.
2240C         WM(2) = H*EL0, SAVED FOR LATER USE IF MITER = 3.
2241C IWM   = INTEGER WORK SPACE CONTAINING PIVOT INFORMATION, STARTING AT
2242C         IWM(21), IF MITER IS 1, 2, 4, OR 5.  IWM ALSO CONTAINS BAND
2243C         PARAMETERS ML = IWM(1) AND MU = IWM(2) IF MITER IS 4 OR 5.
2244C EL0   = EL(1) (INPUT).
2245C IERPJ = OUTPUT ERROR FLAG,  = 0 IF NO TROUBLE, .GT. 0 IF
2246C         P MATRIX FOUND TO BE SINGULAR.
2247C JCUR  = OUTPUT FLAG = 1 TO INDICATE THAT THE JACOBIAN MATRIX
2248C         (OR APPROXIMATION) IS NOW CURRENT.
2249C JOPT  = INPUT JACOBIAN OPTION, = 1 IF JAC IS DESIRED ONLY.
2250C THIS ROUTINE ALSO USES THE COMMON VARIABLES EL0, H, TN, UROUND,
2251C IERPJ, JCUR, MITER, N, NFE, AND NJE.
2252C-----------------------------------------------------------------------
2253      NJE = NJE + 1
2254      IERPJ = 0
2255      JCUR = 1
2256      HL0 = H*EL0
2257      GO TO (100, 200, 300, 400, 500), MITER
2258C IF MITER = 1, CALL JAC AND MULTIPLY BY SCALAR. -----------------------
2259C 100   LENP = N*N
2260 100   LENP = LU_NONZERO
2261      DO 110 I = 1,LU_NONZERO
2262 110    WM(I+2) = ZERO
2263      CALL JAC (NEQ, TN, Y, PAR, 0, 0, WM(3), N)
2264      IF (JOPT .EQ. 1) RETURN
2265      CON = -HL0
2266      DO 120 I = 1,LU_NONZERO
2267 120    WM(I+2) = WM(I+2)*CON
2268      GO TO 240
2269C IF MITER = 2, MAKE N CALLS TO F TO APPROXIMATE J. --------------------
2270 200   FAC = VNORM (N, SAVF, EWT)
2271      R0 = 1000.0D0*ABS(H)*UROUND*REAL(N)*FAC
2272      IF (R0 .EQ. ZERO) R0 = ONE
2273      SRUR = WM(1)
2274      J1 = 2
2275      DO 230 J = 1,N
2276        YJ = Y(J)
2277        R = MAX(SRUR*ABS(YJ),R0/EWT(J))
2278        Y(J) = Y(J) + R
2279        FAC = -HL0/R
2280        CALL FUNC_CHEM (NEQ, TN, Y, PAR, FTEM)
2281        DO 220 I = 1,N
2282 220      WM(I+J1) = (FTEM(I) - SAVF(I))*FAC
2283        Y(J) = YJ
2284        J1 = J1 + N
2285 230    CONTINUE
2286      NFE = NFE + N
2287      IF (JOPT .EQ. 1) RETURN
2288C ADD IDENTITY MATRIX. -------------------------------------------------
2289 240   J = 3
2290C      DO 250 I = 1,N
2291C        WM(J) = WM(J) + ONE
2292C 250    J = J + (N + 1)
2293      DO 250 I = 1,NVAR
2294 250       WM(2+LU_DIAG(I)) = WM(2+LU_DIAG(I)) + ONE
2295C DO LU DECOMPOSITION ON P. --------------------------------------------
2296C      CALL DGEFA (WM(3), N, N, IWM(21), IER)
2297      CALL KppDecomp (WM(3), IER)
2298      IF (IER .NE. 0) THEN
2299           IERPJ = 1
2300           PRINT*,"Singular Matrix"
2301           STOP
2302      END IF
2303      RETURN
2304C IF MITER = 3, CONSTRUCT A DIAGONAL APPROXIMATION TO J AND P. ---------
2305 300   WM(2) = HL0
2306      R = EL0*0.1D0
2307      DO 310 I = 1,N
2308 310    Y(I) = Y(I) + R*(H*SAVF(I) - YH(I,2))
2309      CALL FUNC_CHEM (NEQ, TN, Y, PAR, WM(3))
2310      NFE = NFE + 1
2311      DO 320 I = 1,N
2312        R0 = H*SAVF(I) - YH(I,2)
2313        DI = 0.1D0*R0 - H*(WM(I+2) - SAVF(I))
2314        WM(I+2) = 1.0D0
2315        IF (ABS(R0) .LT. UROUND/EWT(I)) GO TO 320
2316        IF (ABS(DI) .EQ. ZERO) GO TO 330
2317        WM(I+2) = 0.1D0*R0/DI
2318 320    CONTINUE
2319      RETURN
2320 330   IERPJ = 1
2321      RETURN
2322C IF MITER = 4, CALL JAC AND MULTIPLY BY SCALAR. -----------------------
2323 400   ML = IWM(1)
2324      MU = IWM(2)
2325      ML3 = ML + 3
2326      MBAND = ML + MU + 1
2327      MEBAND = MBAND + ML
2328      LENP = MEBAND*N
2329      DO 410 I = 1,LENP
2330 410    WM(I+2) = ZERO
2331      CALL JAC (NEQ, TN, Y, PAR, ML, MU, WM(ML3), MEBAND)
2332      IF (JOPT .EQ. 1) RETURN
2333      CON = -HL0
2334      DO 420 I = 1,LENP
2335 420    WM(I+2) = WM(I+2)*CON
2336      GO TO 570
2337C IF MITER = 5, MAKE MBAND CALLS TO F TO APPROXIMATE J. ----------------
2338 500   ML = IWM(1)
2339      MU = IWM(2)
2340      MBAND = ML + MU + 1
2341      MBA = MIN(MBAND,N)
2342      MEBAND = MBAND + ML
2343      MEB1 = MEBAND - 1
2344      SRUR = WM(1)
2345      FAC = VNORM (N, SAVF, EWT)
2346      R0 = 1000.0D0*ABS(H)*UROUND*REAL(N)*FAC
2347      IF (R0 .EQ. ZERO) R0 = ONE
2348      DO 560 J = 1,MBA
2349        DO 530 I = J,N,MBAND
2350          YI = Y(I)
2351          R = MAX(SRUR*ABS(YI),R0/EWT(I))
2352 530      Y(I) = Y(I) + R
2353        CALL FUNC_CHEM (NEQ, TN, Y, PAR, FTEM)
2354        DO 550 JJ = J,N,MBAND
2355          Y(JJ) = YH(JJ,1)
2356          YJJ = Y(JJ)
2357          R = MAX(SRUR*ABS(YJJ),R0/EWT(JJ))
2358          FAC = -HL0/R
2359          I1 = MAX(JJ-MU,1)
2360          I2 = MIN(JJ+ML,N)
2361          II = JJ*MEB1 - ML + 2
2362          DO 540 I = I1,I2
2363 540        WM(II+I) = (FTEM(I) - SAVF(I))*FAC
2364 550      CONTINUE
2365 560    CONTINUE
2366      NFE = NFE + MBA
2367      IF (JOPT .EQ. 1) RETURN
2368C ADD IDENTITY MATRIX. -------------------------------------------------
2369 570   II = MBAND + 2
2370      DO 580 I = 1,N
2371        WM(II) = WM(II) + ONE
2372 580    II = II + MEBAND
2373C DO LU DECOMPOSITION OF P. --------------------------------------------
2374      CALL DGBFA (WM(3), MEBAND, N, ML, MU, IWM(21), IER)
2375      IF (IER .NE. 0) IERPJ = 1
2376      RETURN
2377C----------------------- END OF SUBROUTINE PREPJ -----------------------
2378      END
2379      SUBROUTINE PREPDF (NEQ, Y, SRUR, SAVF, FTEM, DFDP, PAR,
2380     1   F, DF, JPAR)
2381      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2382      EXTERNAL F, DF
2383      DIMENSION NEQ(*), Y(*), SAVF(*), FTEM(*), DFDP(*), PAR(*)
2384      COMMON /ODE001/ ROWND, ROWNS(173),
2385     1   RDUM1(43), TN, RDUM2,
2386     2   IOWND1(14), IOWNS(4),
2387     3   IDUM1(10), MITER, IDUM2(4), N, IDUM3(2), NFE, IDUM4(2)
2388      COMMON /ODE002/ RDUM3(3),
2389     1   IOWND2(3), IDUM5(2), NDFE, IDUM6, IDF, IDUM7(3)
2390C-----------------------------------------------------------------------
2391C PREPDF IS CALLED BY SPRIME AND STESA TO COMPUTE THE INHOMOGENEITY
2392C VECTORS DF(I)/DP(JPAR). HERE DF/DP IS COMPUTED BY THE USER-SUPPLIED
2393C ROUTINE DF IF IDF = 1, OR BY FINITE DIFFERENCING IF IDF = 0.
2394C
2395C IN ADDITION TO VARIABLES DESCRIBED PREVIOUSLY, COMMUNICATION WITH
2396C PREPDF USES THE FOLLOWING..
2397C Y     = REAL ARRAY OF LENGTH NYH CONTAINING DEPENDENT VARIABLES.
2398C         PREPDF USES ONLY THE FIRST N ENTRIES OF Y(*).
2399C SRUR  = SQRT(UROUND) (= WM(1)).
2400C SAVF  = REAL ARRAY OF LENGTH N CONTAINING DERIVATIVES DY/DT.
2401C FTEM  = REAL ARRAY OF LENGTH N USED TO TEMPORARILY STORE DY/DT FOR
2402C         NUMERICAL DIFFERENTIATION.
2403C DFDP  = REAL ARRAY OF LENGTH N USED TO STORE DF(I)/DP(JPAR), I = 1,N.
2404C PAR   = REAL ARRAY OF LENGTH NPAR CONTAINING EQUATION PARAMETERS
2405C         OF INTEREST.
2406C JPAR  = INPUT PARAMETER, 2 .LE. JPAR .LE. NSV, DESIGNATING THE
2407C         APPROPRIATE SOLUTION VECTOR CORRESPONDING TO PAR(JPAR).
2408C THIS ROUTINE ALSO USES THE COMMON VARIABLES TN, MITER, N, NFE, NDFE,
2409C AND IDF.
2410C-----------------------------------------------------------------------
2411      NDFE = NDFE + 1
2412      IDF1 = IDF + 1
2413      GO TO (100, 200), IDF1
2414C IDF = 0, CALL F TO APPROXIMATE DFDP. ---------------------------------
2415 100  RPAR = PAR(JPAR)
2416      R = MAX(SRUR*ABS(RPAR),SRUR)
2417      PAR(JPAR) = RPAR + R
2418      FAC = 1.0D0/R
2419      CALL F (NEQ, TN, Y, PAR, FTEM)
2420      DO 110 I = 1,N
2421 110    DFDP(I) = (FTEM(I) - SAVF(I))*FAC
2422      PAR(JPAR) = RPAR
2423      NFE = NFE + 1
2424      RETURN
2425C IDF = 1, CALL USER SUPPLIED DF. --------------------------------------
2426 200  DO 210 I = 1,N
2427 210    DFDP(I) = 0.0D0
2428      CALL DF (NEQ, TN, Y, PAR, DFDP, JPAR)
2429      RETURN
2430C -------------------- END OF SUBROUTINE PREPDF ------------------------
2431      END
2432      SUBROUTINE INTDY (T, K, YH, NYH, DKY, IFLAG)
2433      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2434      DIMENSION YH(NYH,1), DKY(1)
2435      COMMON /ODE001/ ROWND, ROWNS(173),
2436     2   RDUM1(38),H, RDUM2(2), HU, RDUM3, TN, UROUND,
2437     3   IOWND(14), IOWNS(4),
2438     4   IDUM1(8), L, IDUM2,
2439     5   IDUM3(5), N, NQ, IDUM4(4)
2440C-----------------------------------------------------------------------
2441C INTDY COMPUTES INTERPOLATED VALUES OF THE K-TH DERIVATIVE OF THE
2442C DEPENDENT VARIABLE VECTOR Y, AND STORES IT IN DKY.  THIS ROUTINE
2443C IS CALLED WITHIN THE PACKAGE WITH K = 0 AND T = TOUT, BUT MAY
2444C ALSO BE CALLED BY THE USER FOR ANY K UP TO THE CURRENT ORDER.
2445C (SEE DETAILED INSTRUCTIONS IN THE USAGE DOCUMENTATION.)
2446C-----------------------------------------------------------------------
2447C THE COMPUTED VALUES IN DKY ARE GOTTEN BY INTERPOLATION USING THE
2448C NORDSIECK HISTORY ARRAY YH.  THIS ARRAY CORRESPONDS UNIQUELY TO A
2449C VECTOR-VALUED POLYNOMIAL OF DEGREE NQCUR OR LESS, AND DKY IS SET
2450C TO THE K-TH DERIVATIVE OF THIS POLYNOMIAL AT T.
2451C THE FORMULA FOR DKY IS..
2452C             Q
2453C  DKY(I)  =  SUM  C(J,K) * (T - TN)**(J-K) * H**(-J) * YH(I,J+1)
2454C            J=K
2455C WHERE  C(J,K) = J*(J-1)*...*(J-K+1), Q = NQCUR, TN = TCUR, H = HCUR.
2456C THE QUANTITIES  NQ = NQCUR, L = NQ+1, N = NEQ, TN, AND H ARE
2457C COMMUNICATED BY COMMON.  THE ABOVE SUM IS DONE IN REVERSE ORDER.
2458C IFLAG IS RETURNED NEGATIVE IF EITHER K OR T IS OUT OF BOUNDS.
2459C-----------------------------------------------------------------------
2460      IFLAG = 0
2461      IF (K .LT. 0 .OR. K .GT. NQ) GO TO 80
2462      TP = TN - HU*(1.0D0 + 100.0D0*UROUND)
2463      IF ((T-TP)*(T-TN) .GT. 0.0D0) GO TO 90
2464C
2465      S = (T - TN)/H
2466      IC = 1
2467      IF (K .EQ. 0) GO TO 15
2468      JJ1 = L - K
2469      DO 10 JJ = JJ1,NQ
2470 10     IC = IC*JJ
2471 15   C = REAL(IC)
2472      DO 20 I = 1,NYH
2473 20     DKY(I) = C*YH(I,L)
2474      IF (K .EQ. NQ) GO TO 55
2475      JB2 = NQ - K
2476      DO 50 JB = 1,JB2
2477        J = NQ - JB
2478        JP1 = J + 1
2479        IC = 1
2480        IF (K .EQ. 0) GO TO 35
2481        JJ1 = JP1 - K
2482        DO 30 JJ = JJ1,J
2483 30       IC = IC*JJ
2484 35     C = REAL(IC)
2485        DO 40 I = 1,NYH
2486 40       DKY(I) = C*YH(I,JP1) + S*DKY(I)
2487 50     CONTINUE
2488      IF (K .EQ. 0) RETURN
2489 55   R = H**(-K)
2490      DO 60 I = 1,NYH
2491 60     DKY(I) = R*DKY(I)
2492      RETURN
2493C
2494 80   CALL XERR('INTDY--  K (=I1) ILLEGAL',
2495     1  51, 1, 1, K, 0, 0, ZERO,ZERO)
2496      IFLAG = -1
2497      RETURN
2498 90   CALL XERR ('INTDY--  T (=R1) ILLEGAL',
2499     1   52, 1, 0, 0, 0, 1, T, ZERO)
2500      CALL XERR('T NOT IN INTERVAL TCUR - HU (= R1) TO TCUR (=R2)',
2501     1   52, 1, 0, 0, 0, 2, TP, TN)
2502      IFLAG = -2
2503      RETURN
2504C----------------------- END OF SUBROUTINE INTDY -----------------------
2505      END
2506      SUBROUTINE STESA (NEQ, Y, NROW, NCOL, YH, WM, IWM, EWT, SAVF,
2507     1   ACOR, PAR, NRS, F, JAC, DF, PJAC, PDF, KppSolve)
2508      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2509      EXTERNAL F, JAC, DF, PJAC, PDF, KppSolve
2510      DIMENSION NEQ(*), Y(NROW,*), YH(NROW,NCOL,*), WM(*), IWM(*),
2511     1   EWT(NROW,*), SAVF(*), ACOR(NROW,*), PAR(*), NRS(*)
2512      PARAMETER (ONE=1.0D0,ZERO=0.0D0)
2513      COMMON /ODE001/ ROWND, ROWNS(173),
2514     1   TESCO(3,12), RDUM1, EL0, H, RDUM2(4), TN, RDUM3,
2515     2   IOWND1(14), IOWNS(4),
2516     3   IALTH, LMAX, IDUM1, IERPJ, IERSL, JCUR, IDUM2, KFLAG, L, IDUM3,
2517     4   MITER, IDUM4(4), N, NQ, IDUM5, NFE, IDUM6(2)
2518      COMMON /ODE002/ DUPS, DSMS, DDNS,
2519     1   IOWND2(3), IDUM7, NSV, IDUM8(2), IDF, IDUM9, JOPT, KFLAGS
2520C-----------------------------------------------------------------------
2521C STESA IS CALLED BY STODE TO PERFORM AN EXPLICIT CALCULATION FOR THE
2522C FIRST-ORDER SENSITIVITY COEFFICIENTS DY(I)/DP(J), I = 1,N; J = 1,NPAR.
2523C
2524C IN ADDITION TO THE VARIABLES DESCRIBED PREVIOUSLY, COMMUNICATION
2525C WITH STESA USES THE FOLLOWING..
2526C Y      = AN NROW (=N) BY NCOL (=NSV) REAL ARRAY CONTAINING THE
2527C          CORRECTED DEPENDENT VARIABLES ON OUTPUT..
2528C                  Y(I,1) , I = 1,N = STATE VARIABLES (INPUT);
2529C                  Y(I,J) , I = 1,N , J = 2,NSV ,
2530C                           = SENSITIVITY COEFFICIENTS, DY(I)/DP(J).
2531C YH     = AN N BY NSV BY LMAX REAL ARRAY CONTAINING THE PREDICTED
2532C          DEPENDENT VARIABLES AND THEIR APPROXIMATE SCALED DERIVATIVES.
2533C SAVF   = A REAL ARRAY OF LENGTH N USED TO STORE FIRST DERIVATIVES
2534C          OF DEPENDENT VARIABLES IF MITER = 2 OR 5.
2535C PAR    = A REAL ARRAY OF LENGTH NPAR CONTAINING THE EQUATION
2536C          PARAMETERS OF INTEREST.
2537C NRS    = AN INTEGER ARRAY OF LENGTH NPAR + 1 CONTAINING THE NUMBER
2538C          OF REPEATED STEPS (KFLAGS .LT. 0) DUE TO THE SENSITIVITY
2539C          CALCULATIONS..
2540C                  NRS(1) = TOTAL NUMBER OF REPEATED STEPS
2541C                  NRS(I) , I = 2,NPAR = NUMBER OF REPEATED STEPS DUE
2542C                                        TO PARAMETER I.
2543C NSV    = NUMBER OF SOLUTION VECTORS = NPAR + 1.
2544C KFLAGS = LOCAL ERROR TEST FLAG, = 0 IF TEST PASSES, .LT. 0 IF TEST
2545C          FAILS, AND STEP NEEDS TO BE REPEATED. ERROR TEST IS APPLIED
2546C          TO EACH SOLUTION VECTOR INDEPENDENTLY.
2547C DUPS, DSMS, DDNS = REAL SCALARS USED FOR COMPUTING RHUP, RHSM, RHDN,
2548C                    ON RETURN TO STODE (IALTH .EQ. 1).
2549C THIS ROUTINE ALSO USES THE COMMON VARIABLES EL0, H, TN, IALTH, LMAX,
2550C IERPJ, IERSL, JCUR, KFLAG, L, MITER, N, NQ, NFE, AND JOPT.
2551C-----------------------------------------------------------------------
2552      DUPS = ZERO
2553      DSMS = ZERO
2554      DDNS = ZERO
2555      HL0 = H*EL0
2556      EL0I = ONE/EL0
2557      TI2 = ONE/TESCO(2,NQ)
2558      TI3 = ONE/TESCO(3,NQ)
2559C IF MITER = 2 OR 5 (OR IDF = 0), SUPPLY DERIVATIVES AT CORRECTED
2560C Y(*,1) VALUES FOR NUMERICAL DIFFERENTIATION IN PJAC AND/OR PDF.
2561      IF (MITER .EQ. 2  .OR.  MITER .EQ. 5  .OR.  IDF .EQ. 0)  GO TO 10
2562      GO TO 15
2563 10   CALL F (NEQ, TN, Y, PAR, SAVF)
2564      NFE = NFE + 1
2565C IF JCUR = 0, UPDATE THE JACOBIAN MATRIX.
2566C IF MITER = 5, LOAD CORRECTED Y(*,1) VALUES INTO Y(*,2).
2567 15   IF (JCUR .EQ. 1) GO TO 30
2568      IF (MITER .NE. 5) GO TO 25
2569      DO 20 I = 1,N
2570 20     Y(I,2) = Y(I,1)
2571 25   CALL PJAC (NEQ, Y, Y(1,2), N, WM, IWM, EWT, SAVF, ACOR(1,2),
2572     1   PAR, F, JAC, JOPT)
2573      IF (IERPJ .NE. 0) RETURN
2574C-----------------------------------------------------------------------
2575C THIS IS A LOOPING POINT FOR THE SENSITIVITY CALCULATIONS.
2576C-----------------------------------------------------------------------
2577C FOR EACH PARAMETER PAR(*), A SENSITIVITY SOLUTION VECTOR IS COMPUTED
2578C USING THE SAME STEP SIZE (H) AND ORDER (NQ) AS IN STODE.
2579C A LOCAL ERROR TEST IS APPLIED INDEPENDENTLY TO EACH SOLUTION VECTOR.
2580C-----------------------------------------------------------------------
2581 30   DO 100 J = 2,NSV
2582        JPAR = J - 1
2583C EVALUATE INHOMOGENEITY TERM, TEMPORARILY LOAD INTO Y(*,JPAR+1). ------
2584        CALL PDF(NEQ, Y, WM, SAVF, ACOR(1,J), Y(1,J), PAR,
2585     1     F, DF, JPAR)
2586C-----------------------------------------------------------------------
2587C LOAD RHS OF SENSITIVITY SOLUTION (CORRECTOR) EQUATION..
2588C
2589C       RHS = DY/DP - EL(1)*H*D(DY/DP)/DT + EL(1)*H*DF/DP
2590C
2591C-----------------------------------------------------------------------
2592        DO 40 I = 1,N
2593 40       Y(I,J) = YH(I,J,1) - EL0*YH(I,J,2) + HL0*Y(I,J)
2594C-----------------------------------------------------------------------
2595C KppSolve CORRECTOR EQUATION: THE SOLUTIONS ARE LOCATED IN Y(*,JPAR+1).
2596C THE EXPLICIT FORMULA IS..
2597C
2598C       (I - EL(1)*H*JAC) * DY/DP(CORRECTED) = RHS
2599C
2600C-----------------------------------------------------------------------
2601        CALL KppSolve (WM, IWM, Y(1,J), DUM)
2602        IF (IERSL .NE. 0) RETURN
2603C ESTIMATE LOCAL TRUNCATION ERROR. -------------------------------------
2604        DO 50 I = 1,N
2605 50       ACOR(I,J) = (Y(I,J) - YH(I,J,1))*EL0I
2606        ERR = VNORM(N, ACOR(1,J), EWT(1,J))*TI2
2607        IF (ERR .GT. ONE) GO TO 200
2608C-----------------------------------------------------------------------
2609C LOCAL ERROR TEST PASSED. SET KFLAGS TO 0 TO INDICATE THIS.
2610C IF IALTH = 1, COMPUTE DSMS, DDNS, AND DUPS (IF L .LT. LMAX).
2611C-----------------------------------------------------------------------
2612        KFLAGS = 0
2613        IF (IALTH .GT. 1) GO TO 100
2614        IF (L .EQ. LMAX) GO TO 70
2615        DO 60 I= 1,N
2616 60       Y(I,J) = ACOR(I,J) - YH(I,J,LMAX)
2617        DUPS = MAX(DUPS,VNORM(N,Y(1,J),EWT(1,J))*TI3)
2618 70     DSMS = MAX(DSMS,ERR)
2619 100  CONTINUE
2620      RETURN
2621C-----------------------------------------------------------------------
2622C THIS SECTION IS REACHED IF THE ERROR TOLERANCE FOR SENSITIVITY
2623C SOLUTION VECTOR JPAR HAS BEEN VIOLATED. KFLAGS IS MADE NEGATIVE TO
2624C INDICATE THIS. IF KFLAGS = -1, SET KFLAG EQUAL TO ZERO SO THAT KFLAG
2625C IS SET TO -1 ON RETURN TO STODE BEFORE REPEATING THE STEP.
2626C INCREMENT NRS(1) (= TOTAL NUMBER OF REPEATED STEPS DUE TO ALL
2627C SENSITIVITY SOLUTION VECTORS) BY ONE.
2628C INCREMENT NRS(JPAR+1) (= TOTAL NUMBER OF REPEATED STEPS DUE TO
2629C SOLUTION VECTOR JPAR+1) BY ONE.
2630C LOAD DSMS FOR RH CALCULATION IN STODE.
2631C-----------------------------------------------------------------------
2632 200  KFLAGS = KFLAGS - 1
2633      IF (KFLAGS .EQ. -1) KFLAG = 0
2634      NRS(1) = NRS(1) + 1
2635      NRS(J) = NRS(J) + 1
2636      DSMS = ERR
2637      RETURN
2638C------------------------ END OF SUBROUTINE STESA ----------------------
2639      END
2640      SUBROUTINE STODE (NEQ, Y, YH, NYH, YH1, WM, IWM, EWT, SAVF, ACOR,
2641     1   PAR, NRS, F, JAC, DF, PJAC, PDF, SLVS)
2642      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2643      EXTERNAL F, JAC, DF, PJAC, PDF, SLVS
2644      DIMENSION NEQ(*), Y(*), YH(NYH,*), YH1(*), WM(*), IWM(*), EWT(*),
2645     1   SAVF(*), ACOR(*), PAR(*), NRS(*)
2646      PARAMETER (ONE=1.0D0,ZERO=0.0D0)
2647      COMMON /ODE001/ ROWND,
2648     1   CONIT, CRATE, EL(13), ELCO(13,12), HOLD, RMAX,
2649     2   TESCO(3,12), CCMAX, EL0, H, HMIN, HMXI, HU, RC, TN, UROUND,
2650     3   IOWND1(14), IPUP, MEO, NQNYH, NSLP,
2651     4   IALTH, LMAX, ICF, IERPJ, IERSL, JCUR, JSTART, KFLAG, L, METH,
2652     5   MITER, MAXORD, MAXCOR, MSBP, MXNCF, N, NQ, NST, NFE, NJE, NQU
2653      COMMON /ODE002/ DUPS, DSMS, DDNS,
2654     1   IOWND2(3), ISOPT, NSV, NDFE, NSPE, IDF, IERSP, JOPT, KFLAGS
2655C-----------------------------------------------------------------------
2656C STODE PERFORMS ONE STEP OF THE INTEGRATION OF AN INITIAL VALUE
2657C PROBLEM FOR A SYSTEM OF ORDINARY DIFFERENTIAL EQUATIONS.
2658C NOTE.. STODE IS INDEPENDENT OF THE VALUE OF THE ITERATION METHOD
2659C INDICATOR MITER, WHEN THIS IS .NE. 0, AND HENCE IS INDEPENDENT
2660C OF THE TYPE OF CHORD METHOD USED, OR THE JACOBIAN STRUCTURE.
2661C FOR ISOPT = 1, STODE CALLS STESA FOR SENSITIVITY CALCULATIONS.
2662C VARIABLES USED FOR COMMUNICATION WITH STESA ARE DESCRIBED IN STESA.
2663C COMMUNICATION WITH STODE IS DONE WITH THE FOLLOWING VARIABLES..
2664C
2665C NEQ   = INTEGER ARRAY CONTAINING PROBLEM SIZE IN NEQ(1), AND
2666C         NUMBER OF PARAMETERS TO BE CONSIDERED IN THE SENSITIVITY
2667C         ANALYSIS NEQ(2) (FOR ISOPT = 1), AND PASSED AS THE
2668C         NEQ ARGUMENT IN ALL CALLS TO F,  JAC, AND DF.
2669C Y     = AN ARRAY OF LENGTH .GE. N USED AS THE Y ARGUMENT IN
2670C         ALL CALLS TO F, JAC, AND DF.
2671C YH    = AN NYH BY LMAX ARRAY CONTAINING THE DEPENDENT VARIABLES
2672C         AND THEIR APPROXIMATE SCALED DERIVATIVES, WHERE
2673C         LMAX = MAXORD + 1.  YH(I,J+1) CONTAINS THE APPROXIMATE
2674C         J-TH DERIVATIVE OF Y(I), SCALED BY H**J/FACTORIAL(J)
2675C         (J = 0,1,...,NQ).  ON ENTRY FOR THE FIRST STEP, THE FIRST
2676C         TWO COLUMNS OF YH MUST BE SET FROM THE INITIAL VALUES.
2677C NYH   = A CONSTANT INTEGER .GE. N, THE FIRST DIMENSION OF YH.
2678C         THE TOTAL NUMBER OF FIRST-ORDER DIFFERENTIAL EQUATIONS..
2679C         NYH = N, ISOPT = 0,
2680C         NYH = N * (NPAR + 1), ISOPT = 1
2681C YH1   = A ONE-DIMENSIONAL ARRAY OCCUPYING THE SAME SPACE AS YH.
2682C EWT   = AN ARRAY OF LENGTH NYH CONTAINING MULTIPLICATIVE WEIGHTS
2683C         FOR LOCAL ERROR MEASUREMENTS.  LOCAL ERRORS IN Y(I) ARE
2684C         COMPARED TO 1.0/EWT(I) IN VARIOUS ERROR TESTS.
2685C SAVF  = AN ARRAY OF WORKING STORAGE, OF LENGTH N.
2686C         ALSO USED FOR INPUT OF YH(*,MAXORD+2) WHEN JSTART = -1
2687C         AND MAXORD .LT. THE CURRENT ORDER NQ.
2688C ACOR  = A WORK ARRAY OF LENGTH NYH, USED FOR THE ACCUMULATED
2689C         CORRECTIONS.  ON A SUCCESSFUL RETURN, ACOR(I) CONTAINS
2690C         THE ESTIMATED ONE-STEP LOCAL ERROR IN Y(I).
2691C WM,IWM = REAL AND INTEGER WORK ARRAYS ASSOCIATED WITH MATRIX
2692C         OPERATIONS IN CHORD ITERATION (MITER .NE. 0).
2693C PJAC  = NAME OF ROUTINE TO EVALUATE AND PREPROCESS JACOBIAN MATRIX
2694C         AND P = I - H*EL0*JAC, IF A CHORD METHOD IS BEING USED.
2695C         IF ISOPT = 1, PJAC CAN BE CALLED TO CALCULATE JAC BY
2696C         SETTING JOPT = 1.
2697C SLVS  = NAME OF ROUTINE TO KppSolve LINEAR SYSTEM IN CHORD ITERATION.
2698C CCMAX  = MAXIMUM RELATIVE CHANGE IN H*EL0 BEFORE PJAC IS CALLED.
2699C H     = THE STEP SIZE TO BE ATTEMPTED ON THE NEXT STEP.
2700C         H IS ALTERED BY THE ERROR CONTROL ALGORITHM DURING THE
2701C         PROBLEM.  H CAN BE EITHER POSITIVE OR NEGATIVE, BUT ITS
2702C         SIGN MUST REMAIN CONSTANT THROUGHOUT THE PROBLEM.
2703C HMIN  = THE MINIMUM ABSOLUTE VALUE OF THE STEP SIZE H TO BE USED.
2704C HMXI  = INVERSE OF THE MAXIMUM ABSOLUTE VALUE OF H TO BE USED.
2705C         HMXI = 0.0 IS ALLOWED AND CORRESPONDS TO AN INFINITE HMAX.
2706C         HMIN AND HMXI MAY BE CHANGED AT ANY TIME, BUT WILL NOT
2707C         TAKE EFFECT UNTIL THE NEXT CHANGE OF H IS CONSIDERED.
2708C TN    = THE INDEPENDENT VARIABLE. TN IS UPDATED ON EACH STEP TAKEN.
2709C JSTART = AN INTEGER USED FOR INPUT ONLY, WITH THE FOLLOWING
2710C         VALUES AND MEANINGS..
2711C              0  PERFORM THE FIRST STEP.
2712C          .GT.0  TAKE A NEW STEP CONTINUING FROM THE LAST.
2713C             -1  TAKE THE NEXT STEP WITH A NEW VALUE OF H, MAXORD,
2714C                   N, METH, OR MITER.
2715C             -2  TAKE THE NEXT STEP WITH A NEW VALUE OF H,
2716C                   BUT WITH OTHER INPUTS UNCHANGED.
2717C         ON RETURN, JSTART IS SET TO 1 TO FACILITATE CONTINUATION.
2718C KFLAG  = A COMPLETION CODE WITH THE FOLLOWING MEANINGS..
2719C              0  THE STEP WAS SUCCESFUL.
2720C             -1  THE REQUESTED ERROR COULD NOT BE ACHIEVED.
2721C             -2  CORRECTOR CONVERGENCE COULD NOT BE ACHIEVED.
2722C             -3  FATAL ERROR IN PJAC, OR SLVS, (OR STESA).
2723C         A RETURN WITH KFLAG = -1 OR -2 MEANS EITHER
2724C         ABS(H) = HMIN OR 10 CONSECUTIVE FAILURES OCCURRED.
2725C         ON A RETURN WITH KFLAG NEGATIVE, THE VALUES OF TN AND
2726C         THE YH ARRAY ARE AS OF THE BEGINNING OF THE LAST
2727C         STEP, AND H IS THE LAST STEP SIZE ATTEMPTED.
2728C MAXORD = THE MAXIMUM ORDER OF INTEGRATION METHOD TO BE ALLOWED.
2729C MAXCOR = THE MAXIMUM NUMBER OF CORRECTOR ITERATIONS ALLOWED.
2730C          (= 3, IF ISOPT = 0)
2731C          (= 4, IF ISOPT = 1)
2732C MSBP  = MAXIMUM NUMBER OF STEPS BETWEEN PJAC CALLS (MITER .GT. 0).
2733C         IF ISOPT = 1, PJAC IS CALLED AT LEAST ONCE EVERY STEP.
2734C MXNCF  = MAXIMUM NUMBER OF CONVERGENCE FAILURES ALLOWED.
2735C METH/MITER = THE METHOD FLAGS.  SEE DESCRIPTION IN DRIVER.
2736C N     = THE NUMBER OF FIRST-ORDER MODEL DIFFERENTIAL EQUATIONS.
2737C-----------------------------------------------------------------------
2738      KFLAG = 0
2739      KFLAGS = 0
2740      TOLD = TN
2741      NCF = 0
2742      IERPJ = 0
2743      IERSL = 0
2744      JCUR = 0
2745      ICF = 0
2746      IF (JSTART .GT. 0) GO TO 200
2747      IF (JSTART .EQ. -1) GO TO 100
2748      IF (JSTART .EQ. -2) GO TO 160
2749C-----------------------------------------------------------------------
2750C ON THE FIRST CALL, THE ORDER IS SET TO 1, AND OTHER VARIABLES ARE
2751C INITIALIZED.  RMAX IS THE MAXIMUM RATIO BY WHICH H CAN BE INCREASED
2752C IN A SINGLE STEP.  IT IS INITIALLY 1.E4 TO COMPENSATE FOR THE SMALL
2753C INITIAL H, BUT THEN IS NORMALLY EQUAL TO 10.  IF A FAILURE
2754C OCCURS (IN CORRECTOR CONVERGENCE OR ERROR TEST), RMAX IS SET AT 2
2755C FOR THE NEXT INCREASE.
2756C THESE COMPUTATIONS CONSIDER ONLY THE ORIGINAL SOLUTION VECTOR.
2757C THE SENSITIVITY SOLUTION VECTORS ARE CONSIDERED IN STESA (ISOPT = 1).
2758C-----------------------------------------------------------------------
2759      LMAX = MAXORD + 1
2760      NQ = 1
2761      L = 2
2762      IALTH = 2
2763      RMAX = 10000.0D0
2764      RC = ZERO
2765      EL0 = ONE
2766      CRATE = 0.7D0
2767      DELP = ZERO
2768      HOLD = H
2769      MEO = METH
2770      NSLP = 0
2771      IPUP = MITER
2772      IRET = 3
2773      GO TO 140
2774C-----------------------------------------------------------------------
2775C THE FOLLOWING BLOCK HANDLES PRELIMINARIES NEEDED WHEN JSTART = -1.
2776C IPUP IS SET TO MITER TO FORCE A MATRIX UPDATE.
2777C IF AN ORDER INCREASE IS ABOUT TO BE CONSIDERED (IALTH = 1),
2778C IALTH IS RESET TO 2 TO POSTPONE CONSIDERATION ONE MORE STEP.
2779C IF THE CALLER HAS CHANGED METH, CFODE IS CALLED TO RESET
2780C THE COEFFICIENTS OF THE METHOD.
2781C IF THE CALLER HAS CHANGED MAXORD TO A VALUE LESS THAN THE CURRENT
2782C ORDER NQ, NQ IS REDUCED TO MAXORD, AND A NEW H CHOSEN ACCORDINGLY.
2783C IF H IS TO BE CHANGED, YH MUST BE RESCALED.
2784C IF H OR METH IS BEING CHANGED, IALTH IS RESET TO L = NQ + 1
2785C TO PREVENT FURTHER CHANGES IN H FOR THAT MANY STEPS.
2786C-----------------------------------------------------------------------
2787 100   IPUP = MITER
2788      LMAX = MAXORD + 1
2789      IF (IALTH .EQ. 1) IALTH = 2
2790      IF (METH .EQ. MEO) GO TO 110
2791      CALL CFODE (METH, ELCO, TESCO)
2792      MEO = METH
2793      IF (NQ .GT. MAXORD) GO TO 120
2794      IALTH = L
2795      IRET = 1
2796      GO TO 150
2797 110   IF (NQ .LE. MAXORD) GO TO 160
2798 120   NQ = MAXORD
2799      L = LMAX
2800      DO 125 I = 1,L
2801 125    EL(I) = ELCO(I,NQ)
2802      NQNYH = NQ*NYH
2803      RC = RC*EL(1)/EL0
2804      EL0 = EL(1)
2805      CONIT = 0.5D0/REAL(NQ+2)
2806      DDN = VNORM (N, SAVF, EWT)/TESCO(1,L)
2807      EXDN = ONE/REAL(L)
2808      RHDN = ONE/(1.3D0*DDN**EXDN + 0.0000013D0)
2809      RH = MIN(RHDN,ONE)
2810      IREDO = 3
2811      IF (H .EQ. HOLD) GO TO 170
2812      RH = MIN(RH,ABS(H/HOLD))
2813      H = HOLD
2814      GO TO 175
2815C-----------------------------------------------------------------------
2816C CFODE IS CALLED TO GET ALL THE INTEGRATION COEFFICIENTS FOR THE
2817C CURRENT METH.  THEN THE EL VECTOR AND RELATED CONSTANTS ARE RESET
2818C WHENEVER THE ORDER NQ IS CHANGED, OR AT THE START OF THE PROBLEM.
2819C-----------------------------------------------------------------------
2820 140   CALL CFODE (METH, ELCO, TESCO)
2821 150   DO 155 I = 1,L
2822 155    EL(I) = ELCO(I,NQ)
2823      NQNYH = NQ*NYH
2824      RC = RC*EL(1)/EL0
2825      EL0 = EL(1)
2826      CONIT = 0.5D0/REAL(NQ+2)
2827      GO TO (160, 170, 200), IRET
2828C-----------------------------------------------------------------------
2829C IF H IS BEING CHANGED, THE H RATIO RH IS CHECKED AGAINST
2830C RMAX, HMIN, AND HMXI, AND THE YH ARRAY RESCALED.  IALTH IS SET TO
2831C L = NQ + 1 TO PREVENT A CHANGE OF H FOR THAT MANY STEPS, UNLESS
2832C FORCED BY A CONVERGENCE OR ERROR TEST FAILURE.
2833C-----------------------------------------------------------------------
2834 160  IF (H .EQ. HOLD) GO TO 200
2835      RH = H/HOLD
2836      H = HOLD
2837      IREDO = 3
2838      GO TO 175
2839 170   RH = MAX(RH,HMIN/ABS(H))
2840 175   RH = MIN(RH,RMAX)
2841      RH = RH/MAX(ONE,ABS(H)*HMXI*RH)
2842      R = ONE
2843      DO 180 J = 2,L
2844        R = R*RH
2845        DO 180 I = 1,NYH
2846 180      YH(I,J) = YH(I,J)*R
2847      H = H*RH
2848      RC = RC*RH
2849      IALTH = L
2850      IF (IREDO .EQ. 0) GO TO 690
2851C-----------------------------------------------------------------------
2852C THIS SECTION COMPUTES THE PREDICTED VALUES BY EFFECTIVELY
2853C MULTIPLYING THE YH ARRAY BY THE PASCAL TRIANGLE MATRIX.
2854C RC IS THE RATIO OF NEW TO OLD VALUES OF THE COEFFICIENT  H*EL(1).
2855C WHEN RC DIFFERS FROM 1 BY MORE THAN CCMAX, IPUP IS SET TO MITER
2856C TO FORCE PJAC TO BE CALLED, IF A JACOBIAN IS INVOLVED.
2857C IN ANY CASE, PJAC IS CALLED AT LEAST EVERY MSBP STEPS FOR ISOPT = 0,
2858C AND AT LEAST ONCE EVERY STEP FOR ISOPT = 1.
2859C-----------------------------------------------------------------------
2860 200  IF (ABS(RC-ONE) .GT. CCMAX) IPUP = MITER
2861      IF (NST .GE. NSLP+MSBP) IPUP = MITER
2862      TN = TN + H
2863      I1 = NQNYH + 1
2864      DO 215 JB = 1,NQ
2865        I1 = I1 - NYH
2866        DO 210 I = I1,NQNYH
2867 210      YH1(I) = YH1(I) + YH1(I+NYH)
2868 215    CONTINUE
2869C-----------------------------------------------------------------------
2870C UP TO MAXCOR CORRECTOR ITERATIONS ARE TAKEN.  (= 3, FOR ISOPT = 0;
2871C = 4, FOR ISOPT = 1).  A CONVERGENCE TEST IS MADE ON THE R.M.S. NORM
2872C OF EACH CORRECTION, WEIGHTED BY THE ERROR WEIGHT VECTOR EWT.  THE SUM
2873C OF THE CORRECTIONS IS ACCUMULATED IN THE VECTOR ACOR(I), I = 1,N.
2874C (ACOR(I), I = N+1,NYH IS LOADED IN SUBROUTINE STESA (ISOPT = 1).)
2875C THE YH ARRAY IS NOT ALTERED IN THE CORRECTOR LOOP.
2876C-----------------------------------------------------------------------
2877 220  M = 0
2878      DO 230 I = 1,N
2879 230    Y(I) = YH(I,1)
2880      CALL F (NEQ, TN, Y, PAR, SAVF)
2881      NFE = NFE + 1
2882      IF (IPUP .LE. 0) GO TO 250
2883C-----------------------------------------------------------------------
2884C IF INDICATED, THE MATRIX P = I - H*EL(1)*J IS REEVALUATED AND
2885C PREPROCESSED BEFORE STARTING THE CORRECTOR ITERATION.  IPUP IS SET
2886C TO 0 AS AN INDICATOR THAT THIS HAS BEEN DONE.
2887C-----------------------------------------------------------------------
2888      IPUP = 0
2889      RC = ONE
2890      NSLP = NST
2891      CRATE = 0.7D0
2892      CALL PJAC (NEQ, Y, YH, NYH, WM, IWM, EWT, SAVF, ACOR, PAR,
2893     1   F, JAC, JOPT)
2894      IF (IERPJ .NE. 0) GO TO 430
2895 250   DO 260 I = 1,N
2896 260    ACOR(I) = ZERO
2897 270   IF (MITER .NE. 0) GO TO 350
2898C-----------------------------------------------------------------------
2899C IN THE CASE OF FUNCTIONAL ITERATION, UPDATE Y DIRECTLY FROM
2900C THE RESULT OF THE LAST FUNCTION EVALUATION.
2901C (IF ISOPT = 1, FUNCTIONAL ITERATION IS NOT ALLOWED.)
2902C-----------------------------------------------------------------------
2903      DO 290 I = 1,N
2904        SAVF(I) = H*SAVF(I) - YH(I,2)
2905 290    Y(I) = SAVF(I) - ACOR(I)
2906      DEL = VNORM (N, Y, EWT)
2907      DO 300 I = 1,N
2908        Y(I) = YH(I,1) + EL(1)*SAVF(I)
2909 300    ACOR(I) = SAVF(I)
2910      GO TO 400
2911C-----------------------------------------------------------------------
2912C IN THE CASE OF THE CHORD METHOD, COMPUTE THE CORRECTOR ERROR,
2913C AND KppSolve THE LINEAR SYSTEM WITH THAT AS RIGHT-HAND SIDE AND
2914C P AS COEFFICIENT MATRIX.
2915C-----------------------------------------------------------------------
2916 350   DO 360 I = 1,N
2917 360    Y(I) = H*SAVF(I) - (YH(I,2) + ACOR(I))
2918      CALL SLVS (WM, IWM, Y, SAVF)
2919      IF (IERSL .LT. 0) GO TO 430
2920      IF (IERSL .GT. 0) GO TO 410
2921      DEL = VNORM (N, Y, EWT)
2922      DO 380 I = 1,N
2923        ACOR(I) = ACOR(I) + Y(I)
2924 380    Y(I) = YH(I,1) + EL(1)*ACOR(I)
2925C-----------------------------------------------------------------------
2926C TEST FOR CONVERGENCE.  IF M.GT.0, AN ESTIMATE OF THE CONVERGENCE
2927C RATE CONSTANT IS STORED IN CRATE, AND THIS IS USED IN THE TEST.
2928C-----------------------------------------------------------------------
2929 400   IF (M .NE. 0) CRATE = MAX(0.2D0*CRATE,DEL/DELP)
2930      DCON = DEL*MIN(ONE,1.5D0*CRATE)/(TESCO(2,NQ)*CONIT)
2931      IF (DCON .LE. ONE) GO TO 450
2932      M = M + 1
2933      IF (M .EQ. MAXCOR) GO TO 410
2934      IF (M .GE. 2 .AND. DEL .GT. 2.0D0*DELP) GO TO 410
2935      DELP = DEL
2936      CALL F (NEQ, TN, Y, PAR, SAVF)
2937      NFE = NFE + 1
2938      GO TO 270
2939C-----------------------------------------------------------------------
2940C THE CORRECTOR ITERATION FAILED TO CONVERGE IN MAXCOR TRIES.
2941C IF MITER .NE. 0 AND THE JACOBIAN IS OUT OF DATE, PJAC IS CALLED FOR
2942C THE NEXT TRY.  OTHERWISE THE YH ARRAY IS RETRACTED TO ITS VALUES
2943C BEFORE PREDICTION, AND H IS REDUCED, IF POSSIBLE.  IF H CANNOT BE
2944C REDUCED OR MXNCF FAILURES HAVE OCCURRED, EXIT WITH KFLAG = -2.
2945C-----------------------------------------------------------------------
2946 410   IF (MITER .EQ. 0 .OR. JCUR .EQ. 1) GO TO 430
2947      ICF = 1
2948      IPUP = MITER
2949      GO TO 220
2950 430   ICF = 2
2951      NCF = NCF + 1
2952      RMAX = 2.0D0
2953      TN = TOLD
2954      I1 = NQNYH + 1
2955      DO 445 JB = 1,NQ
2956        I1 = I1 - NYH
2957        DO 440 I = I1,NQNYH
2958 440      YH1(I) = YH1(I) - YH1(I+NYH)
2959 445    CONTINUE
2960      IF (IERPJ .LT. 0 .OR. IERSL .LT. 0) GO TO 680
2961      IF (ABS(H) .LE. HMIN*1.00001D0) GO TO 670
2962      IF (NCF .EQ. MXNCF) GO TO 670
2963      RH = 0.25D0
2964      IPUP = MITER
2965      IREDO = 1
2966      GO TO 170
2967C-----------------------------------------------------------------------
2968C THE CORRECTOR HAS CONVERGED.
2969C THE LOCAL ERROR TEST IS MADE AND CONTROL PASSES TO STATEMENT 500
2970C IF IT FAILS. OTHERWISE, STESA IS CALLED (ISOPT = 1) TO PERFORM
2971C SENSITIVITY CALCULATIONS AT CURRENT STEP SIZE AND ORDER.
2972C-----------------------------------------------------------------------
2973 450   CONTINUE
2974      IF (M .EQ. 0) DSM = DEL/TESCO(2,NQ)
2975      IF (M .GT. 0) DSM = VNORM (N, ACOR, EWT)/TESCO(2,NQ)
2976      IF (DSM .GT. ONE) GO TO 500
2977C
2978      IF (ISOPT .EQ. 0) GO TO 460
2979C-----------------------------------------------------------------------
2980C CALL STESA TO PERFORM EXPLICIT SENSITIVITY ANALYSIS.
2981C IF THE LOCAL ERROR TEST FAILS (WITHIN STESA) FOR ANY SOLUTION VECTOR,
2982C KFLAGS IS SET .LT. 0 AND CONTROL PASSES TO STATEMENT 500 UPON RETURN.
2983C IN EITHER CASE, JCUR IS SET TO ZERO TO SIGNAL THAT THE JACOBIAN MAY
2984C NEED UPDATING LATER.
2985C-----------------------------------------------------------------------
2986      CALL STESA (NEQ, Y, N, NSV, YH, WM, IWM, EWT, SAVF, ACOR,
2987     1   PAR, NRS, F, JAC, DF, PJAC, PDF, SLVS)
2988      IF (IERPJ .NE. 0 .OR. IERSL .NE. 0) GO TO 680
2989      IF (KFLAGS .LT. 0) GO TO 500
2990C-----------------------------------------------------------------------
2991C AFTER A SUCCESSFUL STEP, UPDATE THE YH ARRAY.
2992C CONSIDER CHANGING H IF IALTH = 1.  OTHERWISE DECREASE IALTH BY 1.
2993C IF IALTH IS THEN 1 AND NQ .LT. MAXORD, THEN ACOR IS SAVED FOR
2994C USE IN A POSSIBLE ORDER INCREASE ON THE NEXT STEP.
2995C IF A CHANGE IN H IS CONSIDERED, AN INCREASE OR DECREASE IN ORDER
2996C BY ONE IS CONSIDERED ALSO.  A CHANGE IN H IS MADE ONLY IF IT IS BY A
2997C FACTOR OF AT LEAST 1.1.  IF NOT, IALTH IS SET TO 3 TO PREVENT
2998C TESTING FOR THAT MANY STEPS.
2999C-----------------------------------------------------------------------
3000 460   JCUR = 0
3001      KFLAG = 0
3002      IREDO = 0
3003      NST = NST + 1
3004      HU = H
3005      NQU = NQ
3006      DO 470 J = 1,L
3007        DO 470 I = 1,NYH
3008 470      YH(I,J) = YH(I,J) + EL(J)*ACOR(I)
3009      IALTH = IALTH - 1
3010      IF (IALTH .EQ. 0) GO TO 520
3011      IF (IALTH .GT. 1) GO TO 700
3012      IF (L .EQ. LMAX) GO TO 700
3013      DO 490 I = 1,NYH
3014 490    YH(I,LMAX) = ACOR(I)
3015      GO TO 700
3016C-----------------------------------------------------------------------
3017C THE ERROR TEST FAILED IN EITHER STODE OR STESA.
3018C KFLAG KEEPS TRACK OF MULTIPLE FAILURES.
3019C RESTORE TN AND THE YH ARRAY TO THEIR PREVIOUS VALUES, AND PREPARE
3020C TO TRY THE STEP AGAIN.  COMPUTE THE OPTIMUM STEP SIZE FOR THIS OR
3021C ONE LOWER ORDER.  AFTER 2 OR MORE FAILURES, H IS FORCED TO DECREASE
3022C BY A FACTOR OF 0.2 OR LESS.
3023C-----------------------------------------------------------------------
3024 500  KFLAG = KFLAG - 1
3025      JCUR = 0
3026      TN = TOLD
3027      I1 = NQNYH + 1
3028      DO 515 JB = 1,NQ
3029        I1 = I1 - NYH
3030        DO 510 I = I1,NQNYH
3031 510      YH1(I) = YH1(I) - YH1(I+NYH)
3032 515    CONTINUE
3033      RMAX = 2.0D0
3034      IF (ABS(H) .LE. HMIN*1.00001D0) GO TO 660
3035      IF (KFLAG .LE. -3) GO TO 640
3036      IREDO = 2
3037      RHUP = ZERO
3038      GO TO 540
3039C-----------------------------------------------------------------------
3040*
3041C REGARDLESS OF THE SUCCESS OR FAILURE OF THE STEP, FACTORS
3042C RHDN, RHSM, AND RHUP ARE COMPUTED, BY WHICH H COULD BE MULTIPLIED
3043C AT ORDER NQ - 1, ORDER NQ, OR ORDER NQ + 1, RESPECTIVELY.
3044C IN THE CASE OF FAILURE, RHUP = 0.0 TO AVOID AN ORDER INCREASE.
3045C THE LARGEST OF THESE IS DETERMINED AND THE NEW ORDER CHOSEN
3046C ACCORDINGLY.  IF THE ORDER IS TO BE INCREASED, WE COMPUTE ONE
3047C ADDITIONAL SCALED DERIVATIVE.
3048C FOR ISOPT = 1, DUPS AND DSMS ARE LOADED WITH THE LARGEST RMS-NORMS
3049C OBTAINED BY CONSIDERING SEPARATELY THE SENSITIVITY SOLUTION VECTORS.
3050C-----------------------------------------------------------------------
3051 520   RHUP = ZERO
3052      IF (L .EQ. LMAX) GO TO 540
3053      DO 530 I = 1,N
3054 530    SAVF(I) = ACOR(I) - YH(I,LMAX)
3055      DUP = VNORM (N, SAVF, EWT)/TESCO(3,NQ)
3056      DUP = MAX(DUP,DUPS)
3057      EXUP = ONE/REAL(L+1)
3058      RHUP = ONE/(1.4D0*DUP**EXUP + 0.0000014D0)
3059 540   EXSM = ONE/REAL(L)
3060      DSM = MAX(DSM,DSMS)
3061      RHSM = ONE/(1.2D0*DSM**EXSM + 0.0000012D0)
3062      RHDN = ZERO
3063      IF (NQ .EQ. 1) GO TO 560
3064      JPOINT = 1
3065      DO 550 J = 1,NSV
3066        DDN = VNORM (N, YH(JPOINT,L), EWT(JPOINT))/TESCO(1,NQ)
3067        DDNS = MAX(DDNS,DDN)
3068        JPOINT = JPOINT + N
3069 550  CONTINUE
3070      DDN = DDNS
3071      DDNS = ZERO
3072      EXDN = ONE/REAL(NQ)
3073      RHDN = ONE/(1.3D0*DDN**EXDN + 0.0000013D0)
3074 560   IF (RHSM .GE. RHUP) GO TO 570
3075      IF (RHUP .GT. RHDN) GO TO 590
3076      GO TO 580
3077 570   IF (RHSM .LT. RHDN) GO TO 580
3078      NEWQ = NQ
3079      RH = RHSM
3080      GO TO 620
3081 580   NEWQ = NQ - 1
3082      RH = RHDN
3083      IF (KFLAG .LT. 0 .AND. RH .GT. ONE) RH = ONE
3084      GO TO 620
3085 590   NEWQ = L
3086      RH = RHUP
3087      IF (RH .LT. 1.1D0) GO TO 610
3088      R = EL(L)/REAL(L)
3089      DO 600 I = 1,NYH
3090 600    YH(I,NEWQ+1) = ACOR(I)*R
3091      GO TO 630
3092 610   IALTH = 3
3093      GO TO 700
3094 620   IF ((KFLAG .EQ. 0) .AND. (RH .LT. 1.1D0)) GO TO 610
3095      IF (KFLAG .LE. -2) RH = MIN(RH,0.2D0)
3096C-----------------------------------------------------------------------
3097C IF THERE IS A CHANGE OF ORDER, RESET NQ, L, AND THE COEFFICIENTS.
3098C IN ANY CASE H IS RESET ACCORDING TO RH AND THE YH ARRAY IS RESCALED.
3099C THEN EXIT FROM 690 IF THE STEP WAS OK, OR REDO THE STEP OTHERWISE.
3100C-----------------------------------------------------------------------
3101      IF (NEWQ .EQ. NQ) GO TO 170
3102 630   NQ = NEWQ
3103      L = NQ + 1
3104      IRET = 2
3105      GO TO 150
3106C-----------------------------------------------------------------------
3107C CONTROL REACHES THIS SECTION IF 3 OR MORE FAILURES HAVE OCCURED.
3108C IF 10 FAILURES HAVE OCCURRED, EXIT WITH KFLAG = -1.
3109C IT IS ASSUMED THAT THE DERIVATIVES THAT HAVE ACCUMULATED IN THE
3110C YH ARRAY HAVE ERRORS OF THE WRONG ORDER.  HENCE THE FIRST
3111C DERIVATIVE IS RECOMPUTED, AND THE ORDER IS SET TO 1.  THEN
3112C H IS REDUCED BY A FACTOR OF 10, AND THE STEP IS RETRIED,
3113C UNTIL IT SUCCEEDS OR H REACHES HMIN.
3114C-----------------------------------------------------------------------
3115 640   IF (KFLAG .EQ. -10) GO TO 660
3116      RH = 0.1D0
3117      RH = MAX(HMIN/ABS(H),RH)
3118      H = H*RH
3119      DO 645 I = 1,NYH
3120 645    Y(I) = YH(I,1)
3121      CALL F (NEQ, TN, Y, PAR, SAVF)
3122      NFE = NFE + 1
3123      IF (ISOPT .EQ. 0) GO TO 649
3124      CALL SPRIME (NEQ, Y, YH, NYH, N, NSV, WM, IWM, EWT, SAVF, ACOR,
3125     1   ACOR(N+1), PAR, F, JAC, DF, PJAC, PDF)
3126      IF (IERSP .LT. 0) GO TO 680
3127      DO 646 I = N+1,NYH
3128 646    YH(I,2) = H*YH(I,2)
3129 649  DO 650 I = 1,N
3130 650    YH(I,2) = H*SAVF(I)
3131      IPUP = MITER
3132      IALTH = 5
3133      IF (NQ .EQ. 1) GO TO 200
3134      NQ = 1
3135      L = 2
3136      IRET = 3
3137      GO TO 150
3138C-----------------------------------------------------------------------
3139C ALL RETURNS ARE MADE THROUGH THIS SECTION.  H IS SAVED IN HOLD
3140C TO ALLOW THE CALLER TO CHANGE H ON THE NEXT STEP.
3141C-----------------------------------------------------------------------
3142 660   KFLAG = -1
3143      GO TO 720
3144 670   KFLAG = -2
3145      GO TO 720
3146 680   KFLAG = -3
3147      GO TO 720
3148 690   RMAX = 10.0D0
3149 700   R = ONE/TESCO(2,NQU)
3150      DO 710 I = 1,NYH
3151 710    ACOR(I) = ACOR(I)*R
3152 720   HOLD = H
3153      JSTART = 1
3154      RETURN
3155C----------------------- END OF SUBROUTINE STODE -----------------------
3156      END
3157      SUBROUTINE CFODE (METH, ELCO, TESCO)
3158      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3159      DIMENSION ELCO(13,12), TESCO(3,12)
3160C-----------------------------------------------------------------------
3161C CFODE IS CALLED BY THE INTEGRATOR ROUTINE TO SET COEFFICIENTS
3162C NEEDED THERE.  THE COEFFICIENTS FOR THE CURRENT METHOD, AS
3163C GIVEN BY THE VALUE OF METH, ARE SET FOR ALL ORDERS AND SAVED.
3164C THE MAXIMUM ORDER ASSUMED HERE IS 12 IF METH = 1 AND 5 IF METH = 2.
3165C (A SMALLER VALUE OF THE MAXIMUM ORDER IS ALSO ALLOWED.)
3166C CFODE IS CALLED ONCE AT THE BEGINNING OF THE PROBLEM,
3167C AND IS NOT CALLED AGAIN UNLESS AND UNTIL METH IS CHANGED.
3168C
3169C THE ELCO ARRAY CONTAINS THE BASIC METHOD COEFFICIENTS.
3170C THE COEFFICIENTS EL(I), 1 .LE. I .LE. NQ+1, FOR THE METHOD OF
3171C ORDER NQ ARE STORED IN ELCO(I,NQ).  THEY ARE GIVEN BY A GENETRATING
3172C POLYNOMIAL, I.E.,
3173C    L(X) = EL(1) + EL(2)*X + ... + EL(NQ+1)*X**NQ.
3174C FOR THE IMPLICIT ADAMS METHODS, L(X) IS GIVEN BY
3175C    DL/DX = (X+1)*(X+2)*...*(X+NQ-1)/FACTORIAL(NQ-1),    L(-1) = 0.
3176C FOR THE BDF METHODS, L(X) IS GIVEN BY
3177C    L(X) = (X+1)*(X+2)* ... *(X+NQ)/K,
3178C WHERE        K = FACTORIAL(NQ)*(1 + 1/2 + ... + 1/NQ).
3179C
3180C THE TESCO ARRAY CONTAINS TEST CONSTANTS USED FOR THE
3181C LOCAL ERROR TEST AND THE SELECTION OF STEP SIZE AND/OR ORDER.
3182C AT ORDER NQ, TESCO(K,NQ) IS USED FOR THE SELECTION OF STEP
3183C SIZE AT ORDER NQ - 1 IF K = 1, AT ORDER NQ IF K = 2, AND AT ORDER
3184C NQ + 1 IF K = 3.
3185C-----------------------------------------------------------------------
3186      DIMENSION PC(12)
3187      PARAMETER (ONE=1.0D0,ZERO=0.0D0)
3188C
3189      GO TO (100, 200), METH
3190C
3191 100   ELCO(1,1) = ONE
3192      ELCO(2,1) = ONE
3193      TESCO(1,1) = ZERO
3194      TESCO(2,1) = 2.0D0
3195      TESCO(1,2) = ONE
3196      TESCO(3,12) = ZERO
3197      PC(1) = ONE
3198      RQFAC = ONE
3199      DO 140 NQ = 2,12
3200C-----------------------------------------------------------------------
3201C THE PC ARRAY WILL CONTAIN THE COEFFICIENTS OF THE POLYNOMIAL
3202C    P(X) = (X+1)*(X+2)*...*(X+NQ-1).
3203C INITIALLY, P(X) = 1.
3204C-----------------------------------------------------------------------
3205        RQ1FAC = RQFAC
3206        RQFAC = RQFAC/REAL(NQ)
3207        NQM1 = NQ - 1
3208        FNQM1 = REAL(NQM1)
3209        NQP1 = NQ + 1
3210C FORM COEFFICIENTS OF P(X)*(X+NQ-1). ----------------------------------
3211        PC(NQ) = ZERO
3212        DO 110 IB = 1,NQM1
3213          I = NQP1 - IB
3214 110      PC(I) = PC(I-1) + FNQM1*PC(I)
3215        PC(1) = FNQM1*PC(1)
3216C COMPUTE INTEGRAL, -1 TO 0, OF P(X) AND X*P(X). -----------------------
3217        PINT = PC(1)
3218        XPIN = PC(1)/2.0D0
3219        TSIGN = ONE
3220        DO 120 I = 2,NQ
3221          TSIGN = -TSIGN
3222          PINT = PINT + TSIGN*PC(I)/REAL(I)
3223 120      XPIN = XPIN + TSIGN*PC(I)/REAL(I+1)
3224C STORE COEFFICIENTS IN ELCO AND TESCO. --------------------------------
3225        ELCO(1,NQ) = PINT*RQ1FAC
3226        ELCO(2,NQ) = ONE
3227        DO 130 I = 2,NQ
3228 130      ELCO(I+1,NQ) = RQ1FAC*PC(I)/REAL(I)
3229        AGAMQ = RQFAC*XPIN
3230        RAGQ = ONE/AGAMQ
3231        TESCO(2,NQ) = RAGQ
3232        IF (NQ .LT. 12) TESCO(1,NQP1) = RAGQ*RQFAC/REAL(NQP1)
3233        TESCO(3,NQM1) = RAGQ
3234 140    CONTINUE
3235      RETURN
3236C
3237 200   PC(1) = ONE
3238      RQ1FAC = ONE
3239      DO 230 NQ = 1,5
3240C-----------------------------------------------------------------------
3241C THE PC ARRAY WILL CONTAIN THE COEFFICIENTS OF THE POLYNOMIAL
3242C    P(X) = (X+1)*(X+2)*...*(X+NQ).
3243C INITIALLY, P(X) = 1.
3244C-----------------------------------------------------------------------
3245        FNQ = REAL(NQ)
3246        NQP1 = NQ + 1
3247C FORM COEFFICIENTS OF P(X)*(X+NQ). ------------------------------------
3248        PC(NQP1) = ZERO
3249        DO 210 IB = 1,NQ
3250          I = NQ + 2 - IB
3251 210      PC(I) = PC(I-1) + FNQ*PC(I)
3252        PC(1) = FNQ*PC(1)
3253C STORE COEFFICIENTS IN ELCO AND TESCO. --------------------------------
3254        DO 220 I = 1,NQP1
3255 220      ELCO(I,NQ) = PC(I)/PC(2)
3256        ELCO(2,NQ) = ONE
3257        TESCO(1,NQ) = RQ1FAC
3258        TESCO(2,NQ) = REAL(NQP1)/ELCO(1,NQ)
3259        TESCO(3,NQ) = REAL(NQ+2)/ELCO(1,NQ)
3260        RQ1FAC = RQ1FAC/FNQ
3261 230    CONTINUE
3262      RETURN
3263C----------------------- END OF SUBROUTINE CFODE -----------------------
3264      END
3265      SUBROUTINE SOLSY (WM, IWM, X, TEM)
3266C      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3267      INCLUDE 'KPP_ROOT_Parameters.h'
3268      INCLUDE 'KPP_ROOT_Sparse.h'
3269      DIMENSION WM(*), IWM(*), X(*), TEM(*)
3270      PARAMETER (ZERO=0.0D0,ONE=1.0D0)
3271      COMMON /ODE001/ ROWND, ROWNS(173),
3272     2   RDUM1(37), EL0, H, RDUM2(6),
3273     3   IOWND(14), IOWNS(4),
3274     4   IDUM1(4), IERSL, IDUM2(5),
3275     5   MITER, IDUM3(4), N, IDUM4(5)
3276C-----------------------------------------------------------------------
3277C THIS ROUTINE MANAGES THE SOLUTION OF THE LINEAR SYSTEM ARISING FROM
3278C A CHORD ITERATION.  IT IS CALLED IF MITER .NE. 0.
3279C IF MITER IS 1 OR 2, IT CALLS DGESL TO ACCOMPLISH THIS.
3280C IF MITER = 3 IT UPDATES THE COEFFICIENT H*EL0 IN THE DIAGONAL
3281C MATRIX, AND THEN COMPUTES THE SOLUTION.
3282C IF MITER IS 4 OR 5, IT CALLS DGBSL.
3283C COMMUNICATION WITH SOLSY USES THE FOLLOWING VARIABLES..
3284C WM   = REAL WORK SPACE CONTAINING THE INVERSE DIAGONAL MATRIX IF
3285C        MITER = 3 AND THE LU DECOMPOSITION OF THE MATRIX OTHERWISE.
3286C        STORAGE OF MATRIX ELEMENTS STARTS AT WM(3).
3287C        WM ALSO CONTAINS THE FOLLOWING MATRIX-RELATED DATA..
3288C        WM(1) = SQRT(UROUND) (NOT USED HERE),
3289C        WM(2) = HL0, THE PREVIOUS VALUE OF H*EL0, USED IF MITER = 3.
3290C IWM  = INTEGER WORK SPACE CONTAINING PIVOT INFORMATION, STARTING AT
3291C        IWM(21), IF MITER IS 1, 2, 4, OR 5.  IWM ALSO CONTAINS BAND
3292C        PARAMETERS ML = IWM(1) AND MU = IWM(2) IF MITER IS 4 OR 5.
3293C X    = THE RIGHT-HAND SIDE VECTOR ON INPUT, AND THE SOLUTION VECTOR
3294C        ON OUTPUT, OF LENGTH N.
3295C TEM  = VECTOR OF WORK SPACE OF LENGTH N, NOT USED IN THIS VERSION.
3296C IERSL = OUTPUT FLAG (IN COMMON).  IERSL = 0 IF NO TROUBLE OCCURRED.
3297C        IERSL = 1 IF A SINGULAR MATRIX AROSE WITH MITER = 3.
3298C THIS ROUTINE ALSO USES THE COMMON VARIABLES EL0, H, MITER, AND N.
3299C-----------------------------------------------------------------------
3300      IERSL = 0
3301      GO TO (100, 100, 300, 400, 400), MITER
3302C 100   CALL DGESL (WM(3), N, N, IWM(21), X, 0)
3303 100   CALL KppSolve (WM(3), X)
3304      RETURN
3305C
3306 300   PHL0 = WM(2)
3307      HL0 = H*EL0
3308      WM(2) = HL0
3309      IF (HL0 .EQ. PHL0) GO TO 330
3310      R = HL0/PHL0
3311      DO 320 I = 1,N
3312        DI = ONE - R*(ONE - ONE/WM(I+2))
3313        IF (ABS(DI) .EQ. ZERO) GO TO 390
3314 320    WM(I+2) = ONE/DI
3315 330   DO 340 I = 1,N
3316 340    X(I) = WM(I+2)*X(I)
3317      RETURN
3318 390   IERSL = 1
3319      RETURN
3320C
3321 400   ML = IWM(1)
3322      MU = IWM(2)
3323      MEBAND = 2*ML + MU + 1
3324      CALL DGBSL (WM(3), MEBAND, N, ML, MU, IWM(21), X, 0)
3325      RETURN
3326C----------------------- END OF SUBROUTINE SOLSY -----------------------
3327      END
3328      SUBROUTINE EWSET (N, ITOL, RTOL, ATOL, YCUR, EWT)
3329C-----------------------------------------------------------------------
3330C THIS SUBROUTINE SETS THE ERROR WEIGHT VECTOR EWT ACCORDING TO
3331C    EWT(I) = RTOL(I)*ABS(YCUR(I)) + ATOL(I),  I = 1,...,N,
3332C WITH THE SUBSCRIPT ON RTOL AND/OR ATOL POSSIBLY REPLACED BY 1 ABOVE,
3333C DEPENDING ON THE VALUE OF ITOL.
3334C-----------------------------------------------------------------------
3335      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3336      DIMENSION RTOL(*), ATOL(*), YCUR(N), EWT(N)
3337      RTOLI = RTOL(1)
3338      ATOLI = ATOL(1)
3339      DO 10 I = 1,N
3340        IF (ITOL .GE. 3) RTOLI = RTOL(I)
3341        IF (ITOL .EQ. 2 .OR. ITOL .EQ. 4) ATOLI = ATOL(I)
3342        EWT(I) = RTOLI*ABS(YCUR(I)) + ATOLI
3343 10     CONTINUE
3344      RETURN
3345C----------------------- END OF SUBROUTINE EWSET -----------------------
3346      END
3347      DOUBLE PRECISION FUNCTION VNORM (N, V, W)
3348C-----------------------------------------------------------------------
3349C THIS FUNCTION ROUTINE COMPUTES THE WEIGHTED ROOT-MEAN-SQUARE NORM
3350C OF THE VECTOR OF LENGTH N CONTAINED IN THE ARRAY V, WITH WEIGHTS
3351C CONTAINED IN THE ARRAY W OF LENGTH N..
3352C  VNORM = SQRT( (1/N) * SUM( V(I)*W(I) )**2 )
3353C PROTECTION FOR UNDERFLOW/OVERFLOW IS ACCOMPLISHED USING TWO
3354C CONSTANTS WHICH ARE HOPEFULLY APPLICABLE FOR ALL MACHINES.
3355C THESE ARE:
3356C     CUTLO = maximum of SQRT(U/EPS)  over all known machines
3357C     CUTHI = minimum of SQRT(Z)      over all known machines
3358C WHERE
3359C     EPS = smallest number s.t. EPS + 1 .GT. 1
3360C     U   = smallest positive number (underflow limit)
3361C     Z   = largest number (overflow limit)
3362C
3363C DETAILS OF THE ALGORITHM AND OF VALUES OF CUTLO AND CUTHI ARE
3364C FOUND IN THE BLAS ROUTINE SNRM2 (SEE ALSO ALGORITHM 539, TRANS.
3365C MATH. SOFTWARE, VOL. 5 NO. 3, 1979, 308-323.
3366C FOR SINGLE PRECISION, THE FOLLOWING VALUES SHOULD BE UNIVERSAL:
3367C     DATA CUTLO,CUTHI /4.441E-16,1.304E19/
3368C FOR DOUBLE PRECISION, USE
3369C     DATA CUTLO,CUTHI /8.232D-11,1.304D19/
3370C
3371C-----------------------------------------------------------------------
3372      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3373      INTEGER NEXT,I,J,N
3374      DIMENSION V(N),W(N)
3375      DATA CUTLO,CUTHI /8.232D-11,1.304D19/
3376      DATA ZERO,ONE/0.0D0,1.0D0/
3377C  BLAS ALGORITHM
3378      NEXT = 1
3379      SUM = ZERO
3380      I = 1
338120    SX = V(I)*W(I)
3382      GO TO (30,40,70,80),NEXT
338330    IF (ABS(SX).GT.CUTLO) GO TO 110
3384      NEXT = 2
3385      XMAX = ZERO
338640    IF (SX.EQ.ZERO) GO TO 130
3387      IF (ABS(SX).GT.CUTLO) GO TO 110
3388      NEXT = 3
3389      GO TO 60
339050    I=J
3391      NEXT = 4
3392      SUM = (SUM/SX)/SX
339360    XMAX = ABS(SX)
3394      GO TO 90
339570    IF(ABS(SX).GT.CUTLO) GO TO 100
339680    IF(ABS(SX).LE.XMAX) GO TO 90
3397      SUM = ONE + SUM * (XMAX/SX)**2
3398      XMAX = ABS(SX)
3399      GO TO 130
340090    SUM = SUM + (SX/XMAX)**2
3401      GO TO 130
3402100   SUM = (SUM*XMAX)*XMAX
3403110   HITEST = CUTHI/REAL(N)
3404      DO 120 J = I,N
3405         SX = V(J)*W(J)
3406         IF(ABS(SX).GE.HITEST) GO TO 50
3407         SUM = SUM + SX**2
3408120   CONTINUE
3409      VNORM = SQRT(SUM)
3410      GO TO 140
3411130   CONTINUE
3412      I = I + 1
3413      IF (I.LE.N) GO TO 20
3414      VNORM = XMAX * SQRT(SUM)
3415140   CONTINUE
3416      RETURN
3417C----------------------- END OF FUNCTION VNORM -------------------------
3418      END
3419      SUBROUTINE SVCOM (RSAV, ISAV)
3420C-----------------------------------------------------------------------
3421C THIS ROUTINE STORES IN RSAV AND ISAV THE CONTENTS OF COMMON BLOCKS
3422C ODE001, ODE002 AND EH0001, WHICH ARE USED INTERNALLY IN THE ODESSA
3423C PACKAGE.
3424C RSAV = REAL ARRAY OF LENGTH 222 OR MORE.
3425C ISAV = INTEGER ARRAY OF LENGTH 52 OR MORE.
3426C-----------------------------------------------------------------------
3427      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3428      DIMENSION RSAV(*), ISAV(*)
3429      COMMON /ODE001/ RODE1(219), IODE1(39)
3430      COMMON /ODE002/ RODE2(3), IODE2(11)
3431      COMMON /EH0001/ IEH(2)
3432      DATA LRODE1/219/, LIODE1/39/, LRODE2/3/, LIODE2/11/
3433C
3434      DO 10 I = 1,LRODE1
3435 10     RSAV(I) = RODE1(I)
3436      DO 20 I = 1,LRODE2
3437        J = LRODE1 + I
3438 20     RSAV(J) = RODE2(I)
3439      DO 30 I = 1,LIODE1
3440 30     ISAV(I) = IODE1(I)
3441      DO 40 I = 1,LIODE2
3442        J = LIODE1 + I
3443 40     ISAV(J) = IODE2(I)
3444      ISAV(LIODE1+LIODE2+1) = IEH(1)
3445      ISAV(LIODE1+LIODE2+2) = IEH(2)
3446      RETURN
3447C----------------------- END OF SUBROUTINE SVCOM -----------------------
3448      END
3449      SUBROUTINE RSCOM (RSAV, ISAV)
3450C-----------------------------------------------------------------------
3451C THIS ROUTINE RESTORES FROM RSAV AND ISAV THE CONTENTS OF COMMON BLOCKS
3452C ODE001, ODE002 AND EH0001, WHICH ARE USED INTERNALLY IN THE ODESSSA
3453C PACKAGE.  THIS PRESUMES THAT RSAV AND ISAV WERE LOADED BY MEANS
3454C OF SUBROUTINE SVCOM OR THE EQUIVALENT.
3455C-----------------------------------------------------------------------
3456      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3457      DIMENSION RSAV(*), ISAV(*)
3458      COMMON /ODE001/ RODE1(219), IODE1(39)
3459      COMMON /ODE002/ RODE2(3), IODE2(11)
3460      COMMON /EH0001/ IEH(2)
3461      DATA LRODE1/219/, LIODE1/39/, LRODE2/3/, LIODE2/11/
3462C
3463      DO 10 I = 1,LRODE1
3464 10     RODE1(I) = RSAV(I)
3465      DO 20 I = 1,LRODE2
3466        J = LRODE1 + I
3467 20     RODE2(I) = RSAV(J)
3468      DO 30 I = 1,LIODE1
3469 30     IODE1(I) = ISAV(I)
3470      DO 40 I = 1,LODE2
3471        J = LIODE1 + I
3472 40     IODE2(I) = ISAV(J)
3473      IEH(1) = ISAV(LIODE1+LIODE2+1)
3474      IEH(2) = ISAV(LIODE1+LIODE2+2)
3475      RETURN
3476C----------------------- END OF SUBROUTINE RSCOM -----------------------
3477      END
3478      SUBROUTINE DGEFA(A,LDA,N,IPVT,INFO)
3479      INTEGER LDA,N,IPVT(*),INFO
3480      DOUBLE PRECISION A(LDA,*)
3481C
3482C    DGEFA FACTORS A DOUBLE PRECISION MATRIX BY GAUSSIAN ELIMINATION.
3483C
3484C    DGEFA IS USUALLY CALLED BY DGECO, BUT IT CAN BE CALLED
3485C    DIRECTLY WITH A SAVING IN TIME IF  RCOND  IS NOT NEEDED.
3486C    (TIME FOR DGECO) = (1 + 9/N)*(TIME FOR DGEFA) .
3487C
3488C    ON ENTRY
3489C
3490C       A       DOUBLE PRECISION(LDA, N)
3491C               THE MATRIX TO BE FACTORED.
3492C
3493C       LDA     INTEGER
3494C               THE LEADING DIMENSION OF THE ARRAY  A .
3495C
3496C       N       INTEGER
3497C               THE ORDER OF THE MATRIX  A .
3498C
3499C    ON RETURN
3500C
3501C       A       AN UPPER TRIANGULAR MATRIX AND THE MULTIPLIERS
3502C               WHICH WERE USED TO OBTAIN IT.
3503C               THE FACTORIZATION CAN BE WRITTEN  A = L*U  WHERE
3504C               L  IS A PRODUCT OF PERMUTATION AND UNIT LOWER
3505C               TRIANGULAR MATRICES AND  U  IS UPPER TRIANGULAR.
3506C
3507C       IPVT    INTEGER(N)
3508C               AN INTEGER VECTOR OF PIVOT INDICES.
3509C
3510C       INFO    INTEGER
3511C               = 0  NORMAL VALUE.
3512C               = K  IF  U(K,K) .EQ. 0.0 .  THIS IS NOT AN ERROR
3513C                    CONDITION FOR THIS SUBROUTINE, BUT IT DOES
3514C                    INDICATE THAT DGESL OR DGEDI WILL DIVIDE BY ZERO
3515C                    IF CALLED.  USE  RCOND  IN DGECO FOR A RELIABLE
3516C                    INDICATION OF SINGULARITY.
3517C
3518C    LINPACK. THIS VERSION DATED 08/14/78 .
3519C    CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.
3520C
3521C    SUBROUTINES AND FUNCTIONS
3522C
3523C    BLAS DAXPY,DSCAL,IDAMAX
3524C
3525C    INTERNAL VARIABLES
3526C
3527      DOUBLE PRECISION T
3528      INTEGER IDAMAX,J,K,KP1,L,NM1
3529C
3530C
3531C     GAUSSIAN ELIMINATION WITH PARTIAL PIVOTING
3532C
3533      INFO = 0
3534      NM1 = N - 1
3535      IF (NM1 .LT. 1) GO TO 70
3536      DO 60 K = 1, NM1
3537         KP1 = K + 1
3538C
3539C        FIND L = PIVOT INDEX
3540C
3541         L = IDAMAX(N-K+1,A(K,K),1) + K - 1
3542         IPVT(K) = L
3543C
3544C        ZERO PIVOT IMPLIES THIS COLUMN ALREADY TRIANGULARIZED
3545C
3546         IF (A(L,K) .EQ. 0.0D0) GO TO 40
3547C
3548C           INTERCHANGE IF NECESSARY
3549C
3550            IF (L .EQ. K) GO TO 10
3551               T = A(L,K)
3552               A(L,K) = A(K,K)
3553               A(K,K) = T
3554  10        CONTINUE
3555C
3556C           COMPUTE MULTIPLIERS
3557C
3558            T  = -1.0D0/A(K,K)
3559            CALL DSCAL(N-K,T,A(K+1,K),1)
3560C
3561C           ROW ELIMINATION WITH COLUMN INDEXING
3562C
3563            DO 30 J = KP1, N
3564               T = A(L,J)
3565               IF (L .EQ. K) GO TO 20
3566                  A(L,J) = A(K,J)
3567                  A(K,J) = T
3568  20           CONTINUE
3569               CALL DAXPY(N-K,T,A(K+1,K),1,A(K+1,J),1)
3570  30        CONTINUE
3571         GO TO 50
3572  40     CONTINUE
3573            INFO = K
3574  50     CONTINUE
3575  60  CONTINUE
3576  70  CONTINUE
3577      IPVT(N) = N
3578      IF (A(N,N) .EQ. 0.0D0) INFO = N
3579      RETURN
3580      END
3581      SUBROUTINE DGESL(A,LDA,N,IPVT,B,JOB)
3582      INTEGER LDA,N,IPVT(*),JOB
3583      DOUBLE PRECISION A(LDA,*),B(*)
3584C
3585C     DGESL KppSolveS THE DOUBLE PRECISION SYSTEM
3586C     A * X = B  OR  TRANS(A) * X = B
3587C    USING THE FACTORS COMPUTED BY DGECO OR DGEFA.
3588C
3589C    ON ENTRY
3590C
3591C       A       DOUBLE PRECISION(LDA, N)
3592C               THE OUTPUT FROM DGECO OR DGEFA.
3593C
3594C       LDA     INTEGER
3595C               THE LEADING DIMENSION OF THE ARRAY  A .
3596C
3597C       N       INTEGER
3598C               THE ORDER OF THE MATRIX  A .
3599C
3600C       IPVT    INTEGER(N)
3601C               THE PIVOT VECTOR FROM DGECO OR DGEFA.
3602C
3603C       B       DOUBLE PRECISION(N)
3604C               THE RIGHT HAND SIDE VECTOR.
3605C
3606C       JOB     INTEGER
3607C               = 0         TO KppSolve  A*X = B ,
3608C               = NONZERO   TO KppSolve  TRANS(A)*X = B  WHERE
3609C                           TRANS(A)  IS THE TRANSPOSE.
3610C
3611C    ON RETURN
3612C
3613C       B       THE SOLUTION VECTOR  X .
3614C
3615C    ERROR CONDITION
3616C
3617C       A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS A
3618C       ZERO ON THE DIAGONAL.  TECHNICALLY THIS INDICATES SINGULARITY
3619C       BUT IT IS OFTEN CAUSED BY IMPROPER ARGUMENTS OR IMPROPER
3620C       SETTING OF LDA .  IT WILL NOT OCCUR IF THE SUBROUTINES ARE
3621C       CALLED CORRECTLY AND IF DGECO HAS SET RCOND .GT. 0.0
3622C       OR DGEFA HAS SET INFO .EQ. 0 .
3623C
3624C    TO COMPUTE  INVERSE(A) * C  WHERE  C  IS A MATRIX
3625C    WITH  P  COLUMNS
3626C          CALL DGECO(A,LDA,N,IPVT,RCOND,Z)
3627C          IF (RCOND IS TOO SMALL) GO TO ...
3628C          DO 10 J = 1, P
3629C             CALL DGESL(A,LDA,N,IPVT,C(1,J),0)
3630C       10 CONTINUE
3631C
3632C    LINPACK. THIS VERSION DATED 08/14/78 .
3633C    CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.
3634C
3635C    SUBROUTINES AND FUNCTIONS
3636C
3637C    BLAS DAXPY,DDOT
3638C
3639C    INTERNAL VARIABLES
3640C
3641      DOUBLE PRECISION DDOT,T
3642      INTEGER K,KB,L,NM1
3643C
3644      NM1 = N - 1
3645      IF (JOB .NE. 0) GO TO 50
3646C
3647C        JOB = 0 , KppSolve  A * X = B
3648C        FIRST KppSolve  L*Y = B
3649C
3650         IF (NM1 .LT. 1) GO TO 30
3651         DO 20 K = 1, NM1
3652            L = IPVT(K)
3653            T = B(L)
3654            IF (L .EQ. K) GO TO 10
3655               B(L) = B(K)
3656               B(K) = T
3657  10        CONTINUE
3658            CALL DAXPY(N-K,T,A(K+1,K),1,B(K+1),1)
3659  20     CONTINUE
3660  30     CONTINUE
3661C
3662C        NOW KppSolve  U*X = Y
3663C
3664         DO 40 KB = 1, N
3665            K = N + 1 - KB
3666            B(K) = B(K)/A(K,K)
3667            T = -B(K)
3668            CALL DAXPY(K-1,T,A(1,K),1,B(1),1)
3669  40     CONTINUE
3670      GO TO 100
3671  50  CONTINUE
3672C
3673C        JOB = NONZERO, KppSolve  TRANS(A) * X = B
3674C        FIRST KppSolve  TRANS(U)*Y = B
3675C
3676         DO 60 K = 1, N
3677            T = DDOT(K-1,A(1,K),1,B(1),1)
3678            B(K) = (B(K) - T)/A(K,K)
3679  60     CONTINUE
3680C
3681C        NOW KppSolve TRANS(L)*X = Y
3682C
3683         IF (NM1 .LT. 1) GO TO 90
3684         DO 80 KB = 1, NM1
3685            K = N - KB
3686            B(K) = B(K) + DDOT(N-K,A(K+1,K),1,B(K+1),1)
3687            L = IPVT(K)
3688            IF (L .EQ. K) GO TO 70
3689               T = B(L)
3690               B(L) = B(K)
3691               B(K) = T
3692  70        CONTINUE
3693  80     CONTINUE
3694  90     CONTINUE
3695  100  CONTINUE
3696      RETURN
3697      END
3698      SUBROUTINE DGBFA(ABD,LDA,N,ML,MU,IPVT,INFO)
3699      INTEGER LDA,N,ML,MU,IPVT(*),INFO
3700      DOUBLE PRECISION ABD(LDA,*)
3701C
3702C    DGBFA FACTORS A DOUBLE PRECISION BAND MATRIX BY ELIMINATION.
3703C
3704C    DGBFA IS USUALLY CALLED BY DGBCO, BUT IT CAN BE CALLED
3705C    DIRECTLY WITH A SAVING IN TIME IF  RCOND  IS NOT NEEDED.
3706C
3707C    ON ENTRY
3708C
3709C       ABD     DOUBLE PRECISION(LDA, N)
3710C               CONTAINS THE MATRIX IN BAND STORAGE.  THE COLUMNS
3711C               OF THE MATRIX ARE STORED IN THE COLUMNS OF  ABD  AND
3712C               THE DIAGONALS OF THE MATRIX ARE STORED IN ROWS
3713C               ML+1 THROUGH 2*ML+MU+1 OF  ABD .
3714C               SEE THE COMMENTS BELOW FOR DETAILS.
3715C
3716C       LDA     INTEGER
3717C               THE LEADING DIMENSION OF THE ARRAY  ABD .
3718C               LDA MUST BE .GE. 2*ML + MU + 1 .
3719C
3720C       N       INTEGER
3721C               THE ORDER OF THE ORIGINAL MATRIX.
3722C
3723C       ML      INTEGER
3724C               NUMBER OF DIAGONALS BELOW THE MAIN DIAGONAL.
3725C               0 .LE. ML .LT. N .
3726C
3727C       MU      INTEGER
3728C               NUMBER OF DIAGONALS ABOVE THE MAIN DIAGONAL.
3729C               0 .LE. MU .LT. N .
3730C               MORE EFFICIENT IF  ML .LE. MU .
3731C    ON RETURN
3732C
3733C       ABD     AN UPPER TRIANGULAR MATRIX IN BAND STORAGE AND
3734C               THE MULTIPLIERS WHICH WERE USED TO OBTAIN IT.
3735C               THE FACTORIZATION CAN BE WRITTEN  A = L*U  WHERE
3736C               L  IS A PRODUCT OF PERMUTATION AND UNIT LOWER
3737C               TRIANGULAR MATRICES AND  U  IS UPPER TRIANGULAR.
3738C
3739C       IPVT    INTEGER(N)
3740C               AN INTEGER VECTOR OF PIVOT INDICES.
3741C
3742C       INFO    INTEGER
3743C               = 0  NORMAL VALUE.
3744C               = K  IF  U(K,K) .EQ. 0.0 .  THIS IS NOT AN ERROR
3745C                    CONDITION FOR THIS SUBROUTINE, BUT IT DOES
3746C                    INDICATE THAT DGBSL WILL DIVIDE BY ZERO IF
3747C                    CALLED.  USE  RCOND  IN DGBCO FOR A RELIABLE
3748C                    INDICATION OF SINGULARITY.
3749C
3750C    BAND STORAGE
3751C
3752C          IF  A  IS A BAND MATRIX, THE FOLLOWING PROGRAM SEGMENT
3753C          WILL SET UP THE INPUT.
3754C
3755C                  ML = (BAND WIDTH BELOW THE DIAGONAL)
3756C                  MU = (BAND WIDTH ABOVE THE DIAGONAL)
3757C                  M = ML + MU + 1
3758C                  DO 20 J = 1, N
3759C                     I1 = MAX0(1, J-MU)
3760C                     I2 = MIN0(N, J+ML)
3761C                     DO 10 I = I1, I2
3762C                        K = I - J + M
3763C                        ABD(K,J) = A(I,J)
3764C               10    CONTINUE
3765C               20 CONTINUE
3766C
3767C          THIS USES ROWS  ML+1  THROUGH  2*ML+MU+1  OF  ABD .
3768C          IN ADDITION, THE FIRST  ML  ROWS IN  ABD  ARE USED FOR
3769C          ELEMENTS GENERATED DURING THE TRIANGULARIZATION.
3770C          THE TOTAL NUMBER OF ROWS NEEDED IN  ABD  IS  2*ML+MU+1 .
3771C          THE  ML+MU BY ML+MU  UPPER LEFT TRIANGLE AND THE
3772C          ML BY ML  LOWER RIGHT TRIANGLE ARE NOT REFERENCED.
3773C
3774C    LINPACK. THIS VERSION DATED 08/14/78 .
3775C    CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.
3776C
3777C    SUBROUTINES AND FUNCTIONS
3778C
3779C    BLAS DAXPY,DSCAL,IDAMAX
3780C    FORTRAN MAX0,MIN0
3781C
3782C    INTERNAL VARIABLES
3783C
3784      DOUBLE PRECISION T
3785      INTEGER I,IDAMAX,I0,J,JU,JZ,J0,J1,K,KP1,L,LM,M,MM,NM1
3786C
3787C
3788      M = ML + MU + 1
3789      INFO = 0
3790C
3791C     ZERO INITIAL FILL-IN COLUMNS
3792C
3793      J0 = MU + 2
3794      J1 = MIN0(N,M) - 1
3795      IF (J1 .LT. J0) GO TO 30
3796      DO 20 JZ = J0, J1
3797         I0 = M + 1 - JZ
3798         DO 10 I = I0, ML
3799            ABD(I,JZ) = 0.0D0
3800  10     CONTINUE
3801  20  CONTINUE
3802  30  CONTINUE
3803      JZ = J1
3804      JU = 0
3805C
3806C     GAUSSIAN ELIMINATION WITH PARTIAL PIVOTING
3807C
3808      NM1 = N - 1
3809      IF (NM1 .LT. 1) GO TO 130
3810      DO 120 K = 1, NM1
3811         KP1 = K + 1
3812C
3813C        ZERO NEXT FILL-IN COLUMN
3814C
3815         JZ = JZ + 1
3816         IF (JZ .GT. N) GO TO 50
3817         IF (ML .LT. 1) GO TO 50
3818            DO 40 I = 1, ML
3819               ABD(I,JZ) = 0.0D0
3820  40        CONTINUE
3821  50     CONTINUE
3822C
3823C        FIND L = PIVOT INDEX
3824C
3825         LM = MIN0(ML,N-K)
3826         L = IDAMAX(LM+1,ABD(M,K),1) + M - 1
3827         IPVT(K) = L + K - M
3828C
3829C        ZERO PIVOT IMPLIES THIS COLUMN ALREADY TRIANGULARIZED
3830C
3831         IF (ABD(L,K) .EQ. 0.0D0) GO TO 100
3832C
3833C           INTERCHANGE IF NECESSARY
3834C
3835            IF (L .EQ. M) GO TO 60
3836               T = ABD(L,K)
3837               ABD(L,K) = ABD(M,K)
3838               ABD(M,K) = T
3839  60        CONTINUE
3840C
3841C           COMPUTE MULTIPLIERS
3842C
3843            T = -1.0D0/ABD(M,K)
3844            CALL DSCAL(LM,T,ABD(M+1,K),1)
3845C
3846C           ROW ELIMINATION WITH COLUMN INDEXING
3847C
3848            JU = MIN0(MAX0(JU,MU+IPVT(K)),N)
3849            MM = M
3850            IF (JU .LT. KP1) GO TO 90
3851            DO 80 J = KP1, JU
3852               L = L - 1
3853               MM = MM - 1
3854               T = ABD(L,J)
3855               IF (L .EQ. MM) GO TO 70
3856                  ABD(L,J) = ABD(MM,J)
3857                  ABD(MM,J) = T
3858  70           CONTINUE
3859               CALL DAXPY(LM,T,ABD(M+1,K),1,ABD(MM+1,J),1)
3860  80        CONTINUE
3861  90        CONTINUE
3862         GO TO 110
3863  100    CONTINUE
3864            INFO = K
3865  110    CONTINUE
3866  120  CONTINUE
3867  130  CONTINUE
3868      IPVT(N) = N
3869      IF (ABD(M,N) .EQ. 0.0D0) INFO = N
3870      RETURN
3871      END
3872      SUBROUTINE DGBSL(ABD,LDA,N,ML,MU,IPVT,B,JOB)
3873      INTEGER LDA,N,ML,MU,IPVT(*),JOB
3874      DOUBLE PRECISION ABD(LDA,*),B(*)
3875C
3876C    DGBSL KppSolveS THE DOUBLE PRECISION BAND SYSTEM
3877C    A * X = B  OR  TRANS(A) * X = B
3878C    USING THE FACTORS COMPUTED BY DGBCO OR DGBFA.
3879C
3880C    ON ENTRY
3881C
3882C       ABD     DOUBLE PRECISION(LDA, N)
3883C               THE OUTPUT FROM DGBCO OR DGBFA.
3884C
3885C       LDA     INTEGER
3886C               THE LEADING DIMENSION OF THE ARRAY  ABD .
3887C
3888C       N       INTEGER
3889C               THE ORDER OF THE ORIGINAL MATRIX.
3890C
3891C       ML      INTEGER
3892C               NUMBER OF DIAGONALS BELOW THE MAIN DIAGONAL.
3893C
3894C       MU      INTEGER
3895C               NUMBER OF DIAGONALS ABOVE THE MAIN DIAGONAL.
3896C
3897C       IPVT    INTEGER(N)
3898C               THE PIVOT VECTOR FROM DGBCO OR DGBFA.
3899C
3900C       B       DOUBLE PRECISION(N)
3901C               THE RIGHT HAND SIDE VECTOR.
3902C
3903C       JOB     INTEGER
3904C               = 0         TO KppSolve  A*X = B ,
3905C               = NONZERO   TO KppSolve  TRANS(A)*X = B , WHERE
3906C                           TRANS(A)  IS THE TRANSPOSE.
3907C
3908C    ON RETURN
3909C
3910C       B       THE SOLUTION VECTOR  X .
3911C
3912C    ERROR CONDITION
3913C
3914C       A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS A
3915C       ZERO ON THE DIAGONAL.  TECHNICALLY THIS INDICATES SINGULARITY
3916C       BUT IT IS OFTEN CAUSED BY IMPROPER ARGUMENTS OR IMPROPER
3917C       SETTING OF LDA .  IT WILL NOT OCCUR IF THE SUBROUTINES ARE
3918C       CALLED CORRECTLY AND IF DGBCO HAS SET RCOND .GT. 0.0
3919C       OR DGBFA HAS SET INFO .EQ. 0 .
3920C
3921C    TO COMPUTE  INVERSE(A) * C  WHERE  C  IS A MATRIX
3922C    WITH  P  COLUMNS
3923C          CALL DGBCO(ABD,LDA,N,ML,MU,IPVT,RCOND,Z)
3924C          IF (RCOND IS TOO SMALL) GO TO ...
3925C          DO 10 J = 1, P
3926C             CALL DGBSL(ABD,LDA,N,ML,MU,IPVT,C(1,J),0)
3927C       10 CONTINUE
3928C
3929C    LINPACK. THIS VERSION DATED 08/14/78 .
3930C    CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.
3931C
3932C    SUBROUTINES AND FUNCTIONS
3933C
3934C    BLAS DAXPY,DDOT
3935C    FORTRAN MIN0
3936C
3937C    INTERNAL VARIABLES
3938C
3939      DOUBLE PRECISION DDOT,T
3940      INTEGER K,KB,L,LA,LB,LM,M,NM1
3941C
3942      M = MU + ML + 1
3943      NM1 = N - 1
3944      IF (JOB .NE. 0) GO TO 50
3945C
3946C        JOB = 0 , KppSolve  A * X = B
3947C        FIRST KppSolve L*Y = B
3948C
3949         IF (ML .EQ. 0) GO TO 30
3950         IF (NM1 .LT. 1) GO TO 30
3951            DO 20 K = 1, NM1
3952               LM = MIN0(ML,N-K)
3953               L = IPVT(K)
3954               T = B(L)
3955               IF (L .EQ. K) GO TO 10
3956                  B(L) = B(K)
3957                  B(K) = T
3958  10           CONTINUE
3959               CALL DAXPY(LM,T,ABD(M+1,K),1,B(K+1),1)
3960  20        CONTINUE
3961  30     CONTINUE
3962C
3963C        NOW KppSolve  U*X = Y
3964C
3965         DO 40 KB = 1, N
3966            K = N + 1 - KB
3967            B(K) = B(K)/ABD(M,K)
3968            LM = MIN0(K,M) - 1
3969            LA = M - LM
3970            LB = K - LM
3971            T = -B(K)
3972            CALL DAXPY(LM,T,ABD(LA,K),1,B(LB),1)
3973  40     CONTINUE
3974      GO TO 100
3975  50  CONTINUE
3976C
3977C        JOB = NONZERO, KppSolve  TRANS(A) * X = B
3978C        FIRST KppSolve  TRANS(U)*Y = B
3979C
3980         DO 60 K = 1, N
3981            LM = MIN0(K,M) - 1
3982            LA = M - LM
3983            LB = K - LM
3984            T = DDOT(LM,ABD(LA,K),1,B(LB),1)
3985            B(K) = (B(K) - T)/ABD(M,K)
3986  60     CONTINUE
3987C
3988C        NOW KppSolve TRANS(L)*X = Y
3989C
3990         IF (ML .EQ. 0) GO TO 90
3991         IF (NM1 .LT. 1) GO TO 90
3992            DO 80 KB = 1, NM1
3993               K = N - KB
3994               LM = MIN0(ML,N-K)
3995               B(K) = B(K) + DDOT(LM,ABD(M+1,K),1,B(K+1),1)
3996               L = IPVT(K)
3997               IF (L .EQ. K) GO TO 70
3998                  T = B(L)
3999                  B(L) = B(K)
4000                  B(K) = T
4001  70           CONTINUE
4002  80        CONTINUE
4003  90     CONTINUE
4004  100  CONTINUE
4005      RETURN
4006      END
4007      SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY)
4008C
4009C     CONSTANT TIMES A VECTOR PLUS A VECTOR.
4010C     USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE.
4011C     JACK DONGARRA, LINPACK, 3/11/78.
4012C
4013      DOUBLE PRECISION DX(*),DY(*),DA
4014      INTEGER I,INCX,INCY,IX,IY,M,MP1,N
4015C
4016      IF(N.LE.0)RETURN
4017      IF (DA .EQ. 0.0D0) RETURN
4018      IF(INCX.EQ.1.AND.INCY.EQ.1)GO TO 20
4019C
4020C        CODE FOR UNEQUAL INCREMENTS OR EQUAL INCREMENTS
4021C          NOT EQUAL TO 1
4022C
4023      IX = 1
4024      IY = 1
4025      IF(INCX.LT.0)IX = (-N+1)*INCX + 1
4026      IF(INCY.LT.0)IY = (-N+1)*INCY + 1
4027      DO 10 I = 1,N
4028        DY(IY) = DY(IY) + DA*DX(IX)
4029        IX = IX + INCX
4030        IY = IY + INCY
4031  10  CONTINUE
4032      RETURN
4033C
4034C        CODE FOR BOTH INCREMENTS EQUAL TO 1
4035C
4036C
4037C        CLEAN-UP LOOP
4038C
4039  20  M = MOD(N,4)
4040      IF( M .EQ. 0 ) GO TO 40
4041      DO 30 I = 1,M
4042        DY(I) = DY(I) + DA*DX(I)
4043  30  CONTINUE
4044      IF( N .LT. 4 ) RETURN
4045  40  MP1 = M + 1
4046      DO 50 I = MP1,N,4
4047        DY(I) = DY(I) + DA*DX(I)
4048        DY(I + 1) = DY(I + 1) + DA*DX(I + 1)
4049        DY(I + 2) = DY(I + 2) + DA*DX(I + 2)
4050        DY(I + 3) = DY(I + 3) + DA*DX(I + 3)
4051  50  CONTINUE
4052      RETURN
4053      END
4054      SUBROUTINE DSCAL(N,DA,DX,INCX)
4055C
4056C     SCALES A VECTOR BY A CONSTANT.
4057C     USES UNROLLED LOOPS FOR INCREMENT EQUAL TO ONE.
4058C     JACK DONGARRA, LINPACK, 3/11/78.
4059C
4060      DOUBLE PRECISION DA,DX(*)
4061      INTEGER I,INCX,M,MP1,N,NINCX
4062C
4063      IF(N.LE.0)RETURN
4064      IF(INCX.EQ.1)GO TO 20
4065C
4066C        CODE FOR INCREMENT NOT EQUAL TO 1
4067*
4068C
4069      NINCX = N*INCX
4070      DO 10 I = 1,NINCX,INCX
4071        DX(I) = DA*DX(I)
4072  10  CONTINUE
4073      RETURN
4074C
4075C        CODE FOR INCREMENT EQUAL TO 1
4076C
4077C
4078C        CLEAN-UP LOOP
4079C
4080  20  M = MOD(N,5)
4081      IF( M .EQ. 0 ) GO TO 40
4082      DO 30 I = 1,M
4083        DX(I) = DA*DX(I)
4084  30  CONTINUE
4085      IF( N .LT. 5 ) RETURN
4086  40  MP1 = M + 1
4087      DO 50 I = MP1,N,5
4088        DX(I) = DA*DX(I)
4089        DX(I + 1) = DA*DX(I + 1)
4090        DX(I + 2) = DA*DX(I + 2)
4091        DX(I + 3) = DA*DX(I + 3)
4092        DX(I + 4) = DA*DX(I + 4)
4093  50  CONTINUE
4094      RETURN
4095      END
4096      DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY)
4097C
4098C     FORMS THE DOT PRODUCT OF TWO VECTORS.
4099C     USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE.
4100C     JACK DONGARRA, LINPACK, 3/11/78.
4101C
4102      DOUBLE PRECISION DX(*),DY(*),DTEMP
4103      INTEGER I,INCX,INCY,IX,IY,M,MP1,N
4104C
4105      DDOT = 0.0D0
4106      DTEMP = 0.0D0
4107      IF(N.LE.0)RETURN
4108      IF(INCX.EQ.1.AND.INCY.EQ.1)GO TO 20
4109C
4110C        CODE FOR UNEQUAL INCREMENTS OR EQUAL INCREMENTS
4111C          NOT EQUAL TO 1
4112C
4113      IX = 1
4114      IY = 1
4115      IF(INCX.LT.0)IX = (-N+1)*INCX + 1
4116      IF(INCY.LT.0)IY = (-N+1)*INCY + 1
4117      DO 10 I = 1,N
4118        DTEMP = DTEMP + DX(IX)*DY(IY)
4119        IX = IX + INCX
4120        IY = IY + INCY
4121  10  CONTINUE
4122      DDOT = DTEMP
4123      RETURN
4124C
4125C        CODE FOR BOTH INCREMENTS EQUAL TO 1
4126C
4127C
4128C        CLEAN-UP LOOP
4129C
4130  20  M = MOD(N,5)
4131      IF( M .EQ. 0 ) GO TO 40
4132      DO 30 I = 1,M
4133        DTEMP = DTEMP + DX(I)*DY(I)
4134  30  CONTINUE
4135      IF( N .LT. 5 ) GO TO 60
4136  40  MP1 = M + 1
4137      DO 50 I = MP1,N,5
4138        DTEMP = DTEMP + DX(I)*DY(I) + DX(I + 1)*DY(I + 1) +
4139     *   DX(I + 2)*DY(I + 2) + DX(I + 3)*DY(I + 3) + DX(I + 4)*DY(I + 4)
4140  50  CONTINUE
4141  60  DDOT = DTEMP
4142      RETURN
4143      END
4144      INTEGER FUNCTION IDAMAX(N,DX,INCX)
4145C
4146C     FINDS THE INDEX OF ELEMENT HAVING MAX. ABSOLUTE VALUE.
4147C     JACK DONGARRA, LINPACK, 3/11/78.
4148C
4149      DOUBLE PRECISION DX(*),DMAX
4150      INTEGER I,INCX,IX,N
4151C
4152      IDAMAX = 0
4153      IF( N .LT. 1 ) RETURN
4154      IDAMAX = 1
4155      IF(N.EQ.1)RETURN
4156      IF(INCX.EQ.1)GO TO 20
4157C
4158C        CODE FOR INCREMENT NOT EQUAL TO 1
4159C
4160      IX = 1
4161      DMAX = DABS(DX(1))
4162      IX = IX + INCX
4163      DO 10 I = 2,N
4164         IF(DABS(DX(IX)).LE.DMAX) GO TO 5
4165         IDAMAX = I
4166         DMAX = DABS(DX(IX))
4167   5     IX = IX + INCX
4168  10  CONTINUE
4169      RETURN
4170C
4171C        CODE FOR INCREMENT EQUAL TO 1
4172C
4173  20  DMAX = DABS(DX(1))
4174      DO 30 I = 2,N
4175         IF(DABS(DX(I)).LE.DMAX) GO TO 30
4176         IDAMAX = I
4177         DMAX = DABS(DX(I))
4178  30  CONTINUE
4179      RETURN
4180      END
4181      DOUBLE PRECISION FUNCTION D1MACH (IDUM)
4182      INTEGER IDUM
4183C-----------------------------------------------------------------------
4184C THIS ROUTINE COMPUTES THE UNIT ROUNDOFF OF THE MACHINE IN DOUBLE
4185C PRECISION.  THIS IS DEFINED AS THE SMALLEST POSITIVE MACHINE NUMBER
4186C U SUCH THAT  1.0D0 + U .NE. 1.0D0 (IN DOUBLE PRECISION).
4187C-----------------------------------------------------------------------
4188      DOUBLE PRECISION U, COMP
4189      U = 1.0D0
4190 10   U = U*0.5D0
4191      COMP = 1.0D0 + U
4192      IF (COMP .NE. 1.0D0) GO TO 10
4193      D1MACH = U*2.0D0
4194      RETURN
4195C----------------------- END OF FUNCTION D1MACH ------------------------
4196      END
4197      SUBROUTINE XERR (MSG, NERR, IERT, NI, I1, I2, NR, R1, R2)
4198      INTEGER NERR, IERT, NI, I1, I2, NR,
4199     1   LUN, LUNIT, MESFLG
4200      DOUBLE PRECISION R1, R2
4201      CHARACTER*(*) MSG
4202C-------------------------------------------------------------------
4203C
4204C ALL ARGUMENTS ARE INPUT ARGUMENTS.
4205C
4206C MSG   = THE MESSAGE (CHARACTER VARIABLE)
4207C NERR  = THE ERROR NUMBER (NOT USED).
4208C IERT  = THE ERROR TYPE..
4209C         1 MEANS RECOVERABLE (CONTROL RETURNS TO CALLER).
4210C         2 MEANS FATAL (RUN IS ABORTED--SEE NOTE BELOW).
4211C NI    = NUMBER OF INTEGERS (0, 1, OR 2) TO BE PRINTED WITH MESSAGE.
4212C I1,I2  = INTEGERS TO BE PRINTED, DEPENDING ON NI.
4213C NR    = NUMBER OF REALS (0, 1, OR 2) TO BE PRINTED WITH MESSAGE.
4214C R1,R2  = REALS TO BE PRINTED, DEPENDING ON NR.
4215C
4216C  NOTES:
4217C 1. THE DIMENSION OF MSG IS ASSUMED TO BE AT MOST 60.
4218C   (MULTI-LINE MESSAGES ARE GENERATED BY REPEATED CALLS.)
4219C 2. IF IERT = 2, CONTROL PASSES TO THE STATEMENT  STOP
4220C   TO ABORT THE RUN.  THIS STATEMENT MAY BE MACHINE-DEPENDENT.
4221C 3. R1 AND R2 ARE ASSUMED TO BE IN DOUBLE PRECISION AND ARE PRINTED
4222C   IN D21.13 FORMAT.
4223C 4. THE COMMON BLOCK /EH0001/ BELOW IS DATA-LOADED (A MACHINE-
4224C   DEPENDENT FEATURE) WITH DEFAULT VALUES.
4225C   THIS BLOCK IS NEEDED FOR PROPER RETENTION OF PARAMETERS USED BY
4226C   THIS ROUTINE WHICH THE USER CAN RESET BY CALLING XSETF OR XSETUN.
4227C   THE VARIABLES IN THIS BLOCK ARE AS FOLLOWS..
4228C      MESFLG = PRINT CONTROL FLAG..
4229C               1 MEANS PRINT ALL MESSAGES (THE DEFAULT).
4230C               0 MEANS NO PRINTING.
4231C      LUNIT  = LOGICAL UNIT NUMBER FOR MESSAGES.
4232C               THE DEFAULT IS 6 (MACHINE-DEPENDENT).
4233C 5. TO CHANGE THE DEFAULT OUTPUT UNIT, CHANGE THE DATA STATEMENT
4234C  IN THE BLOCK DATA SUBPROGRAM BELOW.
4235C
4236C FOR A DIFFERENT RUN-ABORT COMMAND, CHANGE THE STATEMENT FOLLOWING
4237C STATEMENT 100 AT THE END.
4238C-----------------------------------------------------------------------
4239      COMMON /EH0001/ MESFLG, LUNIT
4240      IF (MESFLG .EQ. 0) GO TO 100
4241C GET LOGICAL UNIT NUMBER. ---------------------------------------------
4242      LUN = LUNIT
4243C WRITE THE MESSAGE. ---------------------------------------------------
4244      WRITE (LUN, 10) MSG
4245 10   FORMAT(1X,A)
4246C-----------------------------------------------------------------------
4247      IF (NI .EQ. 1) WRITE (LUN, 20) I1
4248 20   FORMAT(6X,'IN ABOVE MESSAGE,  I1 = ',I10)
4249      IF (NI .EQ. 2) WRITE (LUN, 30) I1,I2
4250 30   FORMAT(6X,'IN ABOVE MESSAGE,  I1 = ',I10,3X,'I2 = ',I10)
4251      IF (NR .EQ. 1) WRITE (LUN, 40) R1
4252 40   FORMAT(6X,'IN ABOVE MESSAGE,  R1 = ',D21.13)
4253      IF (NR .EQ. 2) WRITE (LUN, 50) R1,R2
4254 50   FORMAT(6X,'IN ABOVE,  R1 = ',D21.13,3X,'R2 = ',D21.13)
4255C ABORT THE RUN IF IERT = 2. -------------------------------------------
4256 100   IF (IERT .NE. 2) RETURN
4257      STOP
4258C----------------------- END OF SUBROUTINE XERR ----------------------
4259      END
4260      SUBROUTINE XSETF (MFLAG)
4261C
4262C THIS ROUTINE RESETS THE PRINT CONTROL FLAG MFLAG.
4263C
4264      INTEGER MFLAG, MESFLG, LUNIT
4265      COMMON /EH0001/ MESFLG, LUNIT
4266C
4267      IF (MFLAG .EQ. 0 .OR. MFLAG .EQ. 1) MESFLG = MFLAG
4268      RETURN
4269C----------------------- END OF SUBROUTINE XSETF -----------------------
4270      END
4271      SUBROUTINE XSETUN (LUN)
4272C
4273C THIS ROUTINE RESETS THE LOGICAL UNIT NUMBER FOR MESSAGES.
4274C
4275      INTEGER LUN, MESFLG, LUNIT
4276      COMMON /EH0001/ MESFLG, LUNIT
4277C
4278      IF (LUN .GT. 0) LUNIT = LUN
4279      RETURN
4280C----------------------- END OF SUBROUTINE XSETUN ----------------------
4281      END
4282      BLOCK DATA
4283C-----------------------------------------------------------------------
4284C THIS DATA SUBPROGRAM LOADS VARIABLES INTO THE INTERNAL COMMON
4285C BLOCKS USED BY ODESSA AND ITS VARIANTS.  THE VARIABLES ARE
4286C DEFINED AS FOLLOWS..
4287C  ILLIN  = COUNTER FOR THE NUMBER OF CONSECUTIVE TIMES THE PACKAGE
4288C           WAS CALLED WITH ILLEGAL INPUT.  THE RUN IS STOPPED WHEN
4289C           ILLIN REACHES 5.
4290C  NTREP  = COUNTER FOR THE NUMBER OF CONSECUTIVE TIMES THE PACKAGE
4291C           WAS CALLED WITH ISTATE = 1 AND TOUT = T.  THE RUN IS
4292C           STOPPED WHEN NTREP REACHES 5.
4293C  MESFLG = FLAG TO CONTROL PRINTING OF ERROR MESSAGES.  1 MEANS PRINT,
4294C           0 MEANS NO PRINTING.
4295C  LUNIT  = DEFAULT VALUE OF LOGICAL UNIT NUMBER FOR PRINTING OF ERROR
4296C           MESSAGES.
4297C-----------------------------------------------------------------------
4298      INTEGER ILLIN, IDUMA, NTREP, IDUMB, IOWNS, ICOMM, MESFLG, LUNIT
4299      DOUBLE PRECISION ROWND, ROWNS, RCOMM
4300      COMMON /ODE001/ ROWND, ROWNS(173), RCOMM(45),
4301     1   ILLIN, IDUMA(10), NTREP, IDUMB(2), IOWNS(4), ICOMM(21)
4302      COMMON /EH0001/ MESFLG, LUNIT
4303      DATA ILLIN/0/, NTREP/0/
4304      DATA MESFLG/1/, LUNIT/6/
4305C
4306C------------------------ END OF BLOCK DATA ----------------------------
4307      END
4308C-----------------------------------------------------------------------
4309C INSTRUCTIONS FOR INSTALLING THE ODESSA PACKAGE. (see @ below.)
4310C
4311C ODESSA is an enhanced version of the widely disseminated ODE solver
4312C LSODE, and as such retains the same properties regarding portability.
4313C The notes below, adapted from the installation instructions for LSODE,
4314C are intended to facilitate the installation of the ODESSA package in
4315C the user's software library.
4316C
4317C 1. Both a single and a double precision version of ODESSA are
4318C provided in this release.  It is expected that most users will
4319C utilize the double precision version, except in the case of
4320C extended word-length computers. Most routines used by ODESSA
4321C are named the same regardless of whether they are single or
4322C double precision.  The exceptions are the LINPAK and BLAS
4323C routines that follow the LINPAK/BLAS naming conventions, i.e.
4324C D--- for a double precision routine, and S--- for a single
4325C precision routine.  Thus, care should be taken if both single
4326C and double precision versions are stored in the same library.
4327C
4328C 2. Several routines in ODESSA have the same names as the LSODE
4329C routines from which they were derived, although they contain
4330C different code.  These are: INTDY, STODE, PREPJ, SVCOM, and
4331C RSCOM.  If ODESSA is added to a subroutine library of which
4332C LSODE is already a member, these routine names must be changed
4333C in one of the two programs.  Also see the note regarding BLOCK
4334C DATA subroutines below.
4335C
4336C 3.  In many cases, ODESSA uses unaltered LSODE routines and
4337C common library routines that may already reside on your system.
4338C The installation of ODESSA should be done so that identical routines
4339C are shared rather than kept as duplicate copies.
4340C a.  Normally, the user calls only subroutine ODESSA, but for optional
4341C     capabilities the user may also CALL XSETUN, XSETF, SVCOM, RSCOM,
4342C     or INTDY, as described in Part II of the Full Description in the
4343C     User Documentation (ODESSA.DOC, see below).  Except for INTDY,
4344C     none of these are called from within the package.
4345C b.  Two routines, EWSET and VNORM, are optionally replaceable by the
4346C     user if the package version is unsuitable.  Hence, the install-
4347C     ation of the package should be done so that the user's version
4348C     for either routine overrides the package version.
4349C c.  The function routine D1MACH is provided to compute the unit
4350C     roundoff of the machine and precision in use, in a manner com-
4351C     patible with machine parameter routines developed at Bell Lab-
4352C     oratories.  If such a routine has already been installed on
4353C     your system, the version supplied here may be discarded.
4354C d.  Linear algebraic systems are solved with routines from the
4355C     LINPACK collection, in conjunction with routines from the Basic
4356C     Linear Algebra module collection (BLAS).  In double precision,
4357C     the names are DGEFA, DGESL, DGBFA, and DGBSL (from LINPACK), and
4358C     DAXPY, DSCAL, IDAMAX, and DDOT (from BLAS). If these routines
4359C     have already been installed on your system, copies supplied with
4360C     ODESSA may be discarded.  The single precision versions of these
4361C     routines are used in the single precision version.
4362C
4363C 4. There are four integer variables, in the two labeled COMMON
4364C blocks /ODE001/ and /EH0001/, which need to be loaded with DATA
4365C statements.  They can vary during execution, and are in common to
4366C assure their retention between calls.  This is legal in ANSI Fortran
4367C only if done in a BLOCK DATA subprogram, and this package has a
4368C BLOCK DATA for this purpose.  However, BLOCK DATA subprograms can be
4369C difficult to install in libraries, and many compilers allow such DATA
4370C statements in subroutines.  If your system allows this, the location
4371C of the DATA statements are just after the initial type and common
4372C declarations in subroutines ODESSA and XERR.  In ODESSA, ILLIN and
4373C NTREP are DATA-loaded as 0.  In XERR, MESFLG is loaded as 1 and
4374C LUNIT is loaded as the appropriate default logical unit number.
4375C
4376C 5. The ODESSA package contains subscript expressions which may not
4377C be accepted by some compilers.  Subscripts of the form I + J, I - J,
4378C etc., occur in various routines.  If any of these forms are
4379C unacceptable to your compiler, an extra line of code setting the
4380C subscript to a dummy integer value should be added for each subscipt.
4381C
4382C 6. User documentation is provided in a two-level structure
4383C to accommmodate both the casual and serious user.  The novice or
4384C casual user should need to read only the Summary of Usage and the
4385C Example Problem located at the beginning of the documentation.  More
4386C experienced users, requiring the full set of available options,
4387C should read the Full Description which follows the Example Problem.
4388C
4389C 7. The user documentation may need corrections in the following ways:
4390C a.  If subroutine names have been changed to avoid conflicts between
4391C     the LSODE and ODESSA packages, the corresponding name changes
4392C     should be made in the documentation.
4393C b.  In the Summary of Usage, and in the description of XSETUN under
4394C     Part II of the Full Description, the default logical unit number
4395C     should be corrected if it is not 6.
4396C c.  In the Summary of Usage, users should be instructed to execute
4397C     CALL XSETF(1) before the first CALL to ODESSA, if this is neces-
4398C     sary for proper error message handling.  (see note 2(e) above.)
4399C d.  In the description of the subroutines DF and JAC in the Summary
4400C     of Usage and in Part I of the Full Description, it is stated
4401C     that dummy names may be passed if these two routines are not user
4402C     supplied.  Your system may require the user to supply a dummy
4403C     subroutine instead.
4404C e.  The ODESSA package treats the arguments NEQ, RTOL, and ATOL as
4405C     arrays (possibly of length 1), while the usage documentation
4406C     states that these arguments may be either arrays or scalars.
4407C     If your system does not allow such a mismatch, then the
4408C     documentation should be changed to reflect this.
4409C 8.  A demonstration program is provided with the package for
4410C     verification.
4411C
4412C
4413C     Jorge R. Leis and Mark A. Kramer
4414C     Department of Chemical Engineering
4415C     Massachusetts Institute of Technology
4416C     Cambridge, Massachusetts  02139
4417C     U.S.A.
4418C
4419C     Current address of J.R. Leis (Jan. 1988):
4420C
4421C     Shell Development Company
4422C     Westhollow Research Center
4423C     Houston, TX
4424C
4425C  @ Adapted from 'Instructions for Installing LSODE', written by
4426C    Alan C. Hindmarsh, Mathematics & Statistics Division, L-316,
4427C    Lawrence Livermore National Laboratory, Livermore, CA. 94550
Note: See TracBrowser for help on using the repository browser.