# HG changeset patch # User jwe # Date 1109727511 0 # Node ID 1278a2bc1527ebe1026fad61e819dd6e1a9b5de8 # Parent 9d9bbda4f00c806a752b6239ceb658b4ffb10338 [project @ 2005-03-02 01:33:37 by jwe] diff -r 9d9bbda4f00c -r 1278a2bc1527 ChangeLog --- a/ChangeLog Tue Mar 01 18:26:20 2005 +0000 +++ b/ChangeLog Wed Mar 02 01:38:31 2005 +0000 @@ -1,3 +1,8 @@ +2005-03-01 John W. Eaton + + * configure.in (AC_CONFIG_FILES): Remove libcruft/odessa/Makefile + from the list. + 2005-03-01 Todd Neal * examples/make_int.cc: DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA now diff -r 9d9bbda4f00c -r 1278a2bc1527 configure.in --- a/configure.in Tue Mar 01 18:26:20 2005 +0000 +++ b/configure.in Wed Mar 02 01:38:31 2005 +0000 @@ -29,7 +29,7 @@ EXTERN_CXXFLAGS="$CXXFLAGS" AC_INIT -AC_REVISION($Revision: 1.461 $) +AC_REVISION($Revision: 1.462 $) AC_PREREQ(2.57) AC_CONFIG_SRCDIR([src/octave.cc]) AC_CONFIG_HEADER(config.h) @@ -1439,7 +1439,7 @@ libcruft/dasrt/Makefile libcruft/dassl/Makefile \ libcruft/fftpack/Makefile libcruft/lapack/Makefile \ libcruft/minpack/Makefile libcruft/misc/Makefile \ - libcruft/odepack/Makefile libcruft/odessa/Makefile \ + libcruft/odepack/Makefile \ libcruft/ordered-qz/Makefile libcruft/quadpack/Makefile \ libcruft/ranlib/Makefile libcruft/slatec-fn/Makefile \ libcruft/slatec-err/Makefile libcruft/villad/Makefile \ diff -r 9d9bbda4f00c -r 1278a2bc1527 doc/interpreter/diffeq.txi --- a/doc/interpreter/diffeq.txi Tue Mar 01 18:26:20 2005 +0000 +++ b/doc/interpreter/diffeq.txi Wed Mar 02 01:38:31 2005 +0000 @@ -87,14 +87,6 @@ @end group @end example -Octave also includes @sc{Odessa}, a modification of @sc{Lsode} that -allows for the computation of parametric sensitivity information -simultaneously with the solution of the set of ODEs. - -@DOCSTRING(odessa) - -@DOCSTRING(odessa_options) - See Alan C. Hindmarsh, @cite{ODEPACK, A Systematized Collection of ODE Solvers}, in Scientific Computing, R. S. Stepleman, editor, (1983) for more information about the inner workings of @code{lsode}. diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/ChangeLog --- a/libcruft/ChangeLog Tue Mar 01 18:26:20 2005 +0000 +++ b/libcruft/ChangeLog Wed Mar 02 01:38:31 2005 +0000 @@ -1,5 +1,8 @@ 2005-03-01 John W. Eaton + * Makefile.in (CRUFT_DIRS): Remove it from the list. + * odessa: Delete directory. + * misc/machar.c (rmachar): Declare local REAL variables volatile. 2005-02-25 John W. Eaton diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/Makefile.in --- a/libcruft/Makefile.in Tue Mar 01 18:26:20 2005 +0000 +++ b/libcruft/Makefile.in Wed Mar 02 01:38:31 2005 +0000 @@ -30,7 +30,7 @@ CRUFT_DIRS = amos @BLAS_DIR@ blas-xtra daspk dasrt dassl \ @FFT_DIR@ @LAPACK_DIR@ lapack-xtra minpack \ - misc odepack odessa ordered-qz quadpack ranlib \ + misc odepack ordered-qz quadpack ranlib \ slatec-err slatec-fn villad SUBDIRS = $(CRUFT_DIRS) diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/Makefile.in --- a/libcruft/odessa/Makefile.in Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -# -# Makefile for octave's libcruft/odessa directory -# -# John W. Eaton -# jwe@bevo.che.wisc.edu -# University of Wisconsin-Madison -# Department of Chemical Engineering - -TOPDIR = ../.. - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -EXTERNAL_DISTFILES = $(DISTFILES) - -include $(TOPDIR)/Makeconf - -include ../Makerules diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/dodessa.f --- a/libcruft/odessa/dodessa.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1910 +0,0 @@ -C----------------------------------------------------------------------- -C----------------------------------------------------------------------- -C THIS IS THE SEPTEMBER 1, 1986 VERSION OF ODESSA.. -C AN ORDINARY DIFFERENTIAL EQUATION SOLVER WITH EXPLICIT SIMULTANEOUS -C SENSITIVITY ANALYSIS. -C -C THIS PACKAGE IS A MODIFICATION OF THE AUGUST 13, 1981 VERSION OF -C LSODE.. LIVERMORE SOLVER FOR ORDINARY DIFFERENTIAL EQUATIONS. -C THIS VERSION IS IN DOUBLE PRECISION. -C -C ODESSA SOLVES FOR THE FIRST-ORDER SENSITIVITY COEFFICIENTS.. -C DY(I)/DP, FOR A SINGLE PARAMETER, OR, -C DY(I)/DP(J), FOR MULTIPLE PARAMETERS, -C ASSOCIATED WITH A SYSTEM OF ORDINARY DIFFERENTIAL EQUATIONS.. -C DY/DT = F(Y,T;P). -C----------------------------------------------------------------------- -C REFERENCES... -C -C 1. JORGE R. LEIS AND MARK A. KRAMER, THE SIMULTANEOUS SOLUTION AND -C EXPLICIT SENSITIVITY ANALYSIS OF SYSTEMS DESCRIBED BY ORDINARY -C DIFFERENTIAL EQUATIONS. SUBMITTED TO ACM TRANS. MATH. SOFTWARE, -C (1985). -C -C 2. JORGE R. LEIS AND MARK A. KRAMER, ODESSA - AN ORDINARY DIFFERENTIA -C EQUATION SOLVER WITH EXPLICIT SIMULTANEOUS SENSITIVITY ANALYSIS. -C SUBMITTED TO ACM TRANS. MATH. SOFTWARE, (1985). -C -C 3. ALAN C. HINDMARSH, LSODE AND LSODI, TWO NEW INITIAL VALUE -C ORDINARY DIFFERENTIAL EQUATION SOLVERS, ACM-SIGNUM NEWSLETTER, -C VOL. 15, NO. 4 (1980), PP. 10-11. -C----------------------------------------------------------------------- -C PROBLEM STATEMENT.. -C -C THE ODESSA MODIFICATION OF THE LSODE PACKAGE PROVIDES THE OPTION TO -C CALCULATE FIRST-ORDER SENSITIVITY COEFFICIENTS FOR A SYSTEM OF STIFF -C OR NON-STIFF EXPLICIT ORDINARY DIFFERENTIAL EQUATIONS OF THE GENERAL -C FORM : -C -C DY/DT = F(Y,T;P) (1) -C -C WHERE Y IS AN N-DIMENSIONAL DEPENDENT VARIABLE VECTOR, T IS THE -C INDEPENDENT INTEGRATION VARIABLE, AND P IS AN NPAR-DIMENSIONAL -C CONSTANT VECTOR. THE GOVERNING EQUATIONS FOR THE FIRST-ORDER -C SENSITIVITY COEFFICIENTS ARE GIVEN BY : -C -C S'(T) = J(T)*S(T) + DF/DP (2) -C -C WHERE -C -C S(T) = DY(T)/DP (= SENSITIVITY FUNCTIONS) -C S'(T) = D(DY(T)/DP)/DT -C J(T) = DF(Y,T;P)/DY(T) (= JACOBIAN MATRIX) -C AND DF/DP = DF(Y,T;P)/DP (= INHOMOGENEITY MATRIX) -C -C SOLUTION OF EQUATIONS (1) AND (2) PROCEEDS SIMULTANEOUSLY VIA AN -C EXTENSION OF THE LSODE PACKAGE AS DESCRIBED IN [1]. -C---------------------------------------------------------------------- -C ACKNOWLEDGEMENT : THE FOLLOWING ODESSA PACKAGE DOCUMENTATION IS A -C MODIFICATION OF THE LSODE DOCUMENTATION WHICH -C ACCOMPANIES THE LSODE PACKAGE CODE. -C---------------------------------------------------------------------- -C SUMMARY OF USAGE. -C -C COMMUNICATION BETWEEN THE USER AND THE ODESSA PACKAGE, FOR NORMAL -C SITUATIONS, IS SUMMARIZED HERE. THIS SUMMARY DESCRIBES ONLY A SUBSET -C OF THE FULL SET OF OPTIONS AVAILABLE. SEE THE FULL DESCRIPTION FOR -C DETAILS, INCLUDING OPTIONAL COMMUNICATION, NONSTANDARD OPTIONS, -C AND INSTRUCTIONS FOR SPECIAL SITUATIONS. SEE ALSO THE EXAMPLE -C PROBLEM (WITH PROGRAM AND OUTPUT) FOLLOWING THIS SUMMARY. -C -C A. FIRST PROVIDE A SUBROUTINE OF THE FORM.. -C SUBROUTINE F (N, T, Y, PAR, YDOT) -C DOUBLE PRECISION T, Y, PAR, YDOT -C DIMENSION Y(N), YDOT(N), PAR(NPAR) -C WHICH SUPPLIES THE VECTOR FUNCTION F BY LOADING YDOT(I) WITH F(I). -C N IS THE NUMBER OF FIRST-ORDER DIFFERENTIAL EQUATIONS IN THE -C ABOVE MODEL. NPAR IS THE NUMBER OF MODEL PARAMETERS FOR WHICH -C VECTOR SENSITIVITY FUNCTIONS ARE DESIRED. YOU ARE ALSO ENCOURAGED -C TO PROVIDE A SUBROUTINE OF THE FORM.. -C SUBROUTINE DF (N, T, Y, PAR, DFDP, JPAR) -C DOUBLE PRECISION T, Y, PAR, DFDP -C DIMENSION Y(N), PAR(NPAR), DFDP(N) -C GO TO (1,...,NPAR) JPAR -C 1 DFDP(1) = DF(1)/DP(1) -C . -C DFDP(I) = DF(I)/DP(1) -C . -C DFDP(N) = DF(N)/DP(1) -C RETURN -C 2 DFDP(1) = DF(1)/DP(2) -C . -C DFDP(I) = DF(I)/DP(2) -C . -C DFDP(N) = DF(N)/DP(2) -C RETURN -C . . -C . . -C RETURN -C NPAR DFDP(1) = DF(1)/DP(NPAR) -C . -C DFDP(I) = DF(I)/DP(NPAR) -C . -C DFDP(N) = DF(N)/DP(NPAR) -C RETURN -C END -C ONLY NONZERO ELEMENTS NEED BE LOADED. IF THIS IS NOT FEASIBLE, -C ODESSA WILL GENERATE THIS MATRIX INTERNALLY BY DIFFERENCE QUOTIENTS. -C -C B. NEXT DETERMINE (OR GUESS) WHETHER OR NOT THE PROBLEM IS STIFF. -C STIFFNESS OCCURS WHEN THE JACOBIAN MATRIX DF/DY HAS AN EIGENVALUE -C WHOSE REAL PART IS NEGATIVE AND LARGE IN MAGNITUDE, COMPARED TO THE -C RECIPROCAL OF THE T SPAN OF INTEREST. IF THE PROBLEM IS NONSTIFF, -C USE METH = 10. IF IT IS STIFF, USE METH = 20. THE USER IS REQUIRED -C TO INPUT THE METHOD FLAG MF = 10*METH + MITER. THERE ARE FOUR -C STANDARD CHOICES FOR MITER WHEN A SENSITIVITY ANALYSIS IS DESIRED, -C AND ODESSA REQUIRES THE JACOBIAN MATRIX IN SOME FORM. -C THIS MATRIX IS REGARDED EITHER AS FULL (MITER = 1 OR 2), -C OR BANDED (MITER = 4 OR 5). IN THE BANDED CASE, ODESSA REQUIRES TWO -C HALF-BANDWIDTH PARAMETERS ML AND MU. THESE ARE, RESPECTIVELY, THE -C WIDTHS OF THE LOWER AND UPPER PARTS OF THE BAND, EXCLUDING THE MAIN -C DIAGONAL. THUS THE BAND CONSISTS OF THE LOCATIONS (I,J) WITH -C I-ML .LE. J .LE. I+MU, AND THE FULL BANDWIDTH IS ML+MU+1. -C -C C. YOU ARE ENCOURAGED TO SUPPLY THE JACOBIAN DIRECTLY (MF = 11, 14, -C 21, OR 24), BUT IF THIS IS NOT FEASIBLE, ODESSA WILL COMPUTE IT -C INTERNALLY BY DIFFERENCE QUOTIENTS (MF = 12, 15, 22, OR 25). IF YOU -C ARE SUPPLYING THE JACOBIAN, PROVIDE A SUBROUTINE OF THE FORM.. -C SUBROUTINE JAC (NEQ, T, Y, PAR, ML, MU, PD, NROWPD) -C DOUBLE PRECISION T, Y, PAR, PD -C DIMENSION Y(N), PD(NROWPD,N), PAR(NPAR) -C WHICH SUPPLIES DF/DY BY LOADING PD AS FOLLOWS.. -C FOR A FULL JACOBIAN (MF = 11, OR 21), LOAD PD(I,J) WITH DF(I)/DY(J), -C THE PARTIAL DERIVATIVE OF F(I) WITH RESPECT TO Y(J). (IGNORE THE -C ML AND MU ARGUMENTS IN THIS CASE.) -C FOR A BANDED JACOBIAN (MF = 14, OR 24), LOAD PD(I-J+MU+1,J) WITH -C DF(I)/DY(J), I.E. LOAD THE DIAGONAL LINES OF DF/DY INTO THE ROWS OF -C PD FROM THE TOP DOWN. -C IN EITHER CASE, ONLY NONZERO ELEMENTS NEED BE LOADED. -C -C D. WRITE A MAIN PROGRAM WHICH CALLS SUBROUTINE ODESSA ONCE FOR -C EACH POINT AT WHICH ANSWERS ARE DESIRED. THIS SHOULD ALSO PROVIDE -C FOR POSSIBLE USE OF LOGICAL UNIT 6 FOR OUTPUT OF ERROR MESSAGES BY -C ODESSA. ON THE FIRST CALL TO ODESSA, SUPPLY ARGUMENTS AS FOLLOWS.. -C F = NAME OF SUBROUTINE FOR RIGHT-HAND SIDE VECTOR F (MODEL). -C THIS NAME MUST BE DECLARED EXTERNAL IN CALLING PROGRAM. -C DF = NAME OF SUBROUTINE FOR INHOMOGENEITY MATRIX DF/DP. -C IF USED (IDF = 1), THIS NAME MUST BE DECLARED EXTERNAL IN -C CALLING PROGRAM. IF NOT USED (IDF = 0), PASS A DUMMY NAME. -C N = NUMBER OF FIRST ORDER ODE-S IN MODEL; LOAD INTO NEQ(1). -C NPAR = NUMBER OF MODEL PARAMETERS OF INTEREST; LOAD INTO NEQ(2). -C Y = AN (N) BY (NPAR+1) REAL ARRAY OF INITIAL VALUES.. -C Y(I,1) , I = 1,N , CONTAIN THE STATE, OR MODEL, DEPENDENT -C VARIABLES, -C Y(I,J) , J = 2,NPAR , CONTAIN THE DEPENDENT SENSITIVITY -C COEFFICIENTS. -C PAR = A REAL ARRAY OF LENGTH NPAR CONTAINING MODEL PARAMETERS -C OF INTEREST. -C T = THE INITIAL VALUE OF THE INDEPENDENT VARIABLE. -C TOUT = FIRST POINT WHERE OUTPUT IS DESIRED (.NE. T). -C ITOL = 1, 2, 3, OR 4 ACCORDING AS RTOL, ATOL (BELOW) ARE SCALARS -C OR ARRAYS. -C RTOL = RELATIVE TOLERANCE PARAMETER (SCALAR OR (N) BY (NPAR+1) -C ARRAY). -C ATOL = ABSOLUTE TOLERANCE PARAMETER (SCALAR OR (N) BY (NPAR+1) -C ARRAY). -C THE ESTIMATED LOCAL ERROR IN Y(I,J) WILL BE CONTROLLED SO AS -C TO BE ROUGHLY LESS (IN MAGNITUDE) THAN -C EWT(I,J) = RTOL*ABS(Y(I,J)) + ATOL IF ITOL = 1, -C EWT(I,J) = RTOL*ABS(Y(I,J)) + ATOL(I,J) IF ITOL = 2, -C EWT(I,J) = RTOL(I,J)*ABS(Y(I,J) + ATOL IF ITOL = 3, OR -C EWT(I,J) = RTOL(I,J)*ABS(Y(I,J) + ATOL(I,J) IF ITOL = 4. -C THUS THE LOCAL ERROR TEST PASSES IF, IN EACH COMPONENT, -C EITHER THE ABSOLUTE ERROR IS LESS THAN ATOL (OR ATOL(I,J)), -C OR THE RELATIVE ERROR IS LESS THAN RTOL (OR RTOL(I,J)). -C USE RTOL = 0.0 FOR PURE ABSOLUTE ERROR CONTROL, AND -C USE ATOL = 0.0 FOR PURE RELATIVE ERROR CONTROL. -C CAUTION.. ACTUAL (GLOBAL) ERRORS MAY EXCEED THESE LOCAL -C TOLERANCES, SO CHOOSE THEM CONSERVATIVELY. -C ITASK = 1 FOR NORMAL COMPUTATION OF OUTPUT VALUES OF Y AT T = TOUT. -C ISTATE = INTEGER FLAG (INPUT AND OUTPUT). SET ISTATE = 1. -C IOPT = 0, TO INDICATE NO OPTIONAL INPUTS FOR INTEGRATION; -C LOAD INTO IOPT(1). -C ISOPT = 1, TO INDICATE SENSITIVITY ANALYSIS, = 0, TO INDICATE -C NO SENSITIVITY ANALYSIS; LOAD INTO IOPT(2). -C IDF = 1, IF SUBROUTINE DF (ABOVE) IS SUPPLIED BY THE USER, -C = 0, OTHERWISE; LOAD INTO IOPT(3). -C RWORK = REAL WORK ARRAY OF LENGTH AT LEAST.. -C 22 + 16*N + N**2 FOR MF = 11 OR 12, -C 22 + 17*N + (2*ML + MU)*N FOR MF = 14 OR 15, -C 22 + 9*N + N**2 FOR MF = 21 OR 22, -C 22 + 10*N + (2*ML + MU)*N FOR MF = 24 OR 25, -C IF ISOPT = 0, OR.. -C 22 + 15*(NPAR+1)*N + N**2 + N FOR MF = 11 OR 12, -C 24 + 15*(NPAR+1)*N + (2*ML+MU+2)*N + N FOR MF = 14 OR 15, -C 22 + 8*(NPAR+1)*N + N**2 + N FOR MF = 21 OR 22, -C 24 + 8*(NPAR+1)*N + (2*ML+MU+2)*N + N FOR MF = 24 OR 25, -C IF ISOPT = 1. -C LRW = DECLARED LENGTH OF RWORK (IN USER-S DIMENSION STATEMENT). -C IWORK = INTEGER WORK ARRAY OF LENGTH AT LEAST.. -C 20 + N IF ISOPT = 0, -C 21 + N + NPAR IF ISOPT = 1. -C IF MITER = 4 OR 5, INPUT IN IWORK(1),IWORK(2) THE LOWER -C AND UPPER HALF-BANDWIDTHS ML,MU (EXCLUDING MAIN DIAGONAL). -C LIW = DECLARED LENGTH OF IWORK (IN USER-S DIMENSION STATEMENT). -C JAC = NAME OF SUBROUTINE FOR JACOBIAN MATRIX. -C IF USED, THIS NAME MUST BE DECLARED EXTERNAL IN CALLING -C PROGRAM. IF NOT USED, PASS A DUMMY NAME. -C MF = METHOD FLAG. STANDARD VALUES FOR ISOPT = 0 ARE.. -C 10 FOR NONSTIFF (ADAMS) METHOD, NO JACOBIAN USED. -C 21 FOR STIFF (BDF) METHOD, USER-SUPPLIED FULL JACOBIAN. -C 22 FOR STIFF METHOD, INTERNALLY GENERATED FULL JACOBIAN. -C 24 FOR STIFF METHOD, USER-SUPPLIED BANDED JACOBIAN. -C 25 FOR STIFF METHOD, INTERNALLY GENERATED BANDED JACOBIAN. -C IF ISOPT = 1, MF = 10 IS ILLEGAL AND CAN BE REPLACED BY.. -C 11 FOR NONSTIFF METHOD, USER-SUPPLIED FULL JACOBIAN. -C 12 FOR NONSTIFF METHOD, INTERNALLY GENERATED FULL JACOBIAN. -C 14 FOR NONSTIFF METHOD, USER-SUPPLIED BANDED JACOBIAN. -C 15 FOR NONSTIFF METHOD, INTERNALLY GENERATED BANDED JACOBIAN. -C NOTE THAT THE MAIN PROGRAM MUST DECLARE ARRAYS Y, RWORK, IWORK, AND -C POSSIBLY ATOL AND RTOL, AS WELL AS NEQ, IOPT, AND PAR IF ISOPT = 1. -C -C E. THE OUTPUT FROM THE FIRST CALL (OR ANY CALL) IS.. -C Y = ARRAY OF COMPUTED VALUES OF Y(T) VECTOR. -C T = CORRESPONDING VALUE OF INDEPENDENT VARIABLE (NORMALLY TOUT). -C ISTATE = 2 IF ODESSA WAS SUCCESSFUL, NEGATIVE OTHERWISE. -C -1 MEANS EXCESS WORK DONE ON THIS CALL (PERHAPS WRONG MF). -C -2 MEANS EXCESS ACCURACY REQUESTED (TOLERANCES TOO SMALL). -C -3 MEANS ILLEGAL INPUT DETECTED (SEE PRINTED MESSAGE). -C -4 MEANS REPEATED ERROR TEST FAILURES (CHECK ALL INPUTS). -C -5 MEANS REPEATED CONVERGENCE FAILURES (PERHAPS BAD JACOBIAN -C SUPPLIED OR WRONG CHOICE OF MF OR TOLERANCES). -C -6 MEANS ERROR WEIGHT BECAME ZERO DURING PROBLEM. (SOLUTION -C COMPONENT I,J VANISHED, AND ATOL OR ATOL(I,J) = 0.0) -C -C F. TO CONTINUE THE INTEGRATION AFTER A SUCCESSFUL RETURN, SIMPLY -C RESET TOUT AND CALL ODESSA AGAIN. NO OTHER PARAMETERS NEED BE RESET. -C---------------------------------------------------------------------- -C EXAMPLE PROBLEM. -C -C THE FOLLOWING IS A SIMPLE EXAMPLE PROBLEM, WITH THE CODING -C NEEDED FOR ITS SOLUTION BY ODESSA. THE PROBLEM IS FROM CHEMICAL -C KINETICS, AND CONSISTS OF THE FOLLOWING THREE RATE EQUATIONS.. -C DY1/DT = -PAR(1)*Y1 + PAR(2)*Y2*Y3 ; PAR(1) = .04, PAR(2) = 1.E4 -C DY2/DT = PAR(1)*Y1 - PAR(2)*Y2*Y3 - PAR(3)*Y2**2 ; PAR(3) = 3.E7 -C DY3/DT = PAR(3)*Y2**2 -C ON THE INTERVAL FROM T = 0.0 TO T = 4.E10, WITH INITIAL CONDITIONS -C Y1 = 1.0, Y2 = Y3 = 0, AND S(I,J) = 0, I = 1,3, J = 1,3. -C THE PROBLEM IS STIFF. -C -C THE FOLLOWING CODING SOLVES THIS PROBLEM WITH ODESSA, USING -C MF = 21 AND PRINTING RESULTS AT T = .4, 4., ..., 4.E10. -C IT USES ITOL = 4 AND ATOL MUCH SMALLER FOR Y2 THAN Y1 OR Y3, -C BECAUSE Y2 HAS MUCH SMALLER VALUES. LESS STRINGENT TOLERANCES -C ARE ASSIGNED FOR THE SENSITIVITIES TO ACHIEVE GREATER EFFICIENCY. -C AT THE END OF THE RUN, STATISTICAL QUANTITIES OF INTEREST ARE -C PRINTED (SEE OPTIONAL OUTPUTS IN THE FULL DESCRIPTION BELOW). -C -C DOUBLE PRECISION ATOL, RWORK, RTOL, T, TOUT, Y, PAR -C EXTERNAL FEX, JEX, DFEX -C DIMENSION Y(3,4), PAR(3), ATOL(3,4), RTOL(3,4), RWORK(130), -C 1 IWORK(27), NEQ(2), IOPT(3) -C N = 3 -C NPAR = 3 -C NEQ(1) = N -C NEQ(2) = NPAR -C NSV = NPAR+1 -C DO 10 I = 1,N -C DO 10 J = 1,NSV -C 10 Y(I,J) = 0.0D0 -C Y(1,1) = 1.0D0 -C PAR(1) = 0.04D0 -C PAR(2) = 1.0D4 -C PAR(3) = 3.0D7 -C T = 0.D0 -C TOUT = .4D0 -C ITOL = 4 -C ATOL(1,1) = 1.D-6 -C ATOL(2,1) = 1.D-10 -C ATOL(3,1) = 1.D-6 -C DO 20 I = 1,N -C RTOL(I,1) = 1.D-4 -C DO 15 J = 2,NSV -C RTOL(I,J) = 1.D-3 -C 15 ATOL(I,J) = 1.D2 * ATOL(I,1) -C 20 CONTINUE -C ITASK = 1 -C ISTATE = 1 -C IOPT(1) = 0 -C IOPT(2) = 1 -C IOPT(3) = 1 -C LRW = 130 -C LIW = 27 -C MF = 21 -C DO 60 IOUT = 1,12 -C CALL ODESSA(FEX,DFEX,NEQ,Y,PAR,T,TOUT,ITOL,RTOL,ATOL, -C 1 ITASK,ISTATE, IOPT,RWORK,LRW,IWORK,LIW,JEX,MF) -C WRITE(6,30)T,Y(1,1),Y(2,1),Y(3,1) -C 30 FORMAT(1X,7H AT T =,E12.4,6H Y =,3E14.6) -C DO 50 J = 2,NSV -C JPAR = J-1 -C WRITE(6,40)JPAR,Y(1,J),Y(2,J),Y(3,J) -C 40 FORMAT(20X,2HS(,I1,3H) =,3E14.6) -C 50 CONTINUE -C IF (ISTATE .LT. 0) GO TO 80 -C 60 TOUT = TOUT*10.D0 -C WRITE(6,70)IWORK(11),IWORK(12),IWORK(13),IWORK(19) -C 70 FORMAT(1X,/,12H NO. STEPS =,I4,11H NO. F-S =,I4,11H NO. J-S =, -C 1 I4,12H NO. DF-S =,I4) -C STOP -C 80 WRITE(6,90)ISTATE -C 90 FORMAT(///22H ERROR HALT.. ISTATE =,I3) -C STOP -C END -C -C SUBROUTINE FEX (NEQ, T, Y, PAR, YDOT) -C DOUBLE PRECISION T, Y, YDOT, PAR -C DIMENSION Y(3), YDOT(3), PAR(3) -C YDOT(1) = -PAR(1)*Y(1) + PAR(2)*Y(2)*Y(3) -C YDOT(3) = PAR(3)*Y(2)*Y(2) -C YDOT(2) = -YDOT(1) - YDOT(3) -C RETURN -C END -C -C SUBROUTINE JEX (NEQ, T, Y, PAR, ML, MU, PD, NRPD) -C DOUBLE PRECISION PD, T, Y, PAR -C DIMENSION Y(3), PD(NRPD,3), PAR(3) -C PD(1,1) = -PAR(1) -C PD(1,2) = PAR(2)*Y(3) -C PD(1,3) = PAR(2)*Y(2) -C PD(2,1) = PAR(1) -C PD(2,3) = -PD(1,3) -C PD(3,2) = 2.D0*PAR(3)*Y(2) -C PD(2,2) = -PD(1,2) - PD(3,2) -C RETURN -C END -C -C SUBROUTINE DFEX (NEQ, T, Y, PAR, DFDP, JPAR) -C DOUBLE PRECISION T, Y, PAR, DFDP -C DIMENSION Y(3), PAR(3), DFDP(3) -C GO TO (1,2,3), JPAR -C 1 DFDP(1) = -Y(1) -C DFDP(2) = Y(1) -C RETURN -C 2 DFDP(1) = Y(2)*Y(3) -C DFDP(2) = -Y(2)*Y(3) -C RETURN -C 3 DFDP(2) = -Y(2)*Y(2) -C DFDP(3) = Y(2)*Y(2) -C RETURN -C END -C -C THE OUTPUT OF THIS PROGRAM (ON A DATA GENERAL MV-8000 IN -C DOUBLE PRECISION IS AS FOLLOWS: -C -C AT T = .4000E+00 Y = .985173E+00 .338641E-04 .147930E-01 -C S(1) = -.355914E+00 .390261E-03 .355524E+00 -C S(2) = .955150E-07 -.213065E-09 -.953019E-07 -C S(3) = -.158466E-10 -.529012E-12 .163756E-10 -C AT T = .4000E+01 Y = .905516E+00 .224044E-04 .944615E-01 -C S(1) = -.187621E+01 .179197E-03 .187603E+01 -C S(2) = .296093E-05 -.583104E-09 -.296034E-05 -C S(3) = -.493267E-09 -.276246E-12 .493544E-09 -C AT T = .4000E+02 Y = .715848E+00 .918628E-05 .284143E+00 -C S(1) = -.424730E+01 .459360E-04 .424726E+01 -C S(2) = .137294E-04 -.235815E-09 -.137291E-04 -C S(3) = -.228818E-08 -.113803E-12 .228829E-08 -C AT T = .4000E+03 Y = .450526E+00 .322299E-05 .549471E+00 -C S(1) = -.595837E+01 .354310E-05 .595836E+01 -C S(2) = .227380E-04 -.226041E-10 -.227380E-04 -C S(3) = -.378971E-08 -.499501E-13 .378976E-08 -C AT T = .4000E+04 Y = .183185E+00 .894131E-06 .816814E+00 -C S(1) = -.475006E+01 -.599504E-05 .475007E+01 -C S(2) = .188089E-04 .231330E-10 -.188089E-04 -C S(3) = -.313478E-08 -.187575E-13 .313480E-08 -C AT T = .4000E+05 Y = .389733E-01 .162133E-06 .961027E+00 -C S(1) = -.157477E+01 -.276199E-05 .157477E+01 -C S(2) = .628668E-05 .110026E-10 -.628670E-05 -C S(3) = -.104776E-08 -.453588E-14 .104776E-08 -C AT T = .4000E+06 Y = .493609E-02 .198411E-07 .995064E+00 -C S(1) = -.236244E+00 -.458262E-06 .236244E+00 -C S(2) = .944669E-06 .183193E-11 -.944671E-06 -C S(3) = -.157441E-09 -.635990E-15 .157442E-09 -C AT T = .4000E+07 Y = .516087E-03 .206540E-08 .999484E+00 -C S(1) = -.256277E-01 -.509808E-07 .256278E-01 -C S(2) = .102506E-06 .203905E-12 -.102506E-06 -C S(3) = -.170825E-10 -.684002E-16 .170826E-10 -C AT T = .4000E+08 Y = .519314E-04 .207736E-09 .999948E+00 -C S(1) = -.259316E-02 -.518029E-08 .259316E-02 -C S(2) = .103726E-07 .207209E-13 -.103726E-07 -C S(3) = -.172845E-11 -.691450E-17 .172845E-11 -C AT T = .4000E+09 Y = .544710E-05 .217885E-10 .999995E+00 -C S(1) = -.271637E-03 -.541849E-09 .271638E-03 -C S(2) = .108655E-08 .216739E-14 -.108655E-08 -C S(3) = -.180902E-12 -.723615E-18 .180902E-12 -C AT T = .4000E+10 Y = .446748E-06 .178699E-11 .100000E+01 -C S(1) = -.322322E-04 -.842541E-10 .322323E-04 -C S(2) = .128929E-09 .337016E-15 -.128929E-09 -C S(3) = -.209715E-13 -.838859E-19 .209715E-13 -C AT T = .4000E+11 Y = -.363960E-07 -.145584E-12 .100000E+01 -C S(1) = -.164109E-06 -.429604E-11 .164113E-06 -C S(2) = .656436E-12 .171842E-16 -.656451E-12 -C S(3) = -.689361E-15 -.275745E-20 .689363E-15 -C -C NO. STEPS = 340 NO. F-S = 412 NO. J-S = 343 NO. DF-S =1023 -C---------------------------------------------------------------------- -C FULL DESCRIPTION OF USER INTERFACE TO ODESSA. -C -C THE USER INTERFACE TO ODESSA CONSISTS OF THE FOLLOWING PARTS. -C -C I. THE CALL SEQUENCE TO SUBROUTINE ODESSA, WHICH IS A DRIVER -C ROUTINE FOR THE SOLVER. THIS INCLUDES DESCRIPTIONS OF BOTH -C THE CALL SEQUENCE ARGUMENTS AND OF USER-SUPPLIED ROUTINES. -C FOLLOWING THESE DESCRIPTIONS IS A DESCRIPTION OF -C OPTIONAL INPUTS AVAILABLE THROUGH THE CALL SEQUENCE, AND THEN -C A DESCRIPTION OF OPTIONAL OUTPUTS (IN THE WORK ARRAYS). -C -C II. DESCRIPTIONS OF OTHER ROUTINES IN THE ODESSA PACKAGE THAT MAY -C BE (OPTIONALLY) CALLED BY THE USER. THESE PROVIDE THE ABILITY -C TO ALTER ERROR MESSAGE HANDLING, SAVE AND RESTORE THE INTERNAL -C COMMON, AND OBTAIN SPECIFIED DERIVATIVES OF THE SOLUTION Y(T). -C -C III. DESCRIPTIONS OF COMMON BLOCKS TO BE DECLARED IN OVERLAY -C OR SIMILAR ENVIRONMENTS, OR TO BE SAVED WHEN DOING AN INTERRUPT -C OF THE PROBLEM AND CONTINUED SOLUTION LATER. -C -C IV. DESCRIPTION OF TWO SUBROUTINES IN THE ODESSA PACKAGE, EITHER OF -C WHICH THE USER MAY REPLACE WITH HIS OWN VERSION, IF DESIRED. -C THESE RELATE TO THE MEASUREMENT OF ERRORS. -C -C V. GENERAL REMARKS WHICH HIGHLIGHT DIFFERENCES BETWEEN THE LSODE -C PACKAGE AND THE ODESSA PACKAGE. -C---------------------------------------------------------------------- -C PART I. CALL SEQUENCE. -C -C THE CALL SEQUENCE PARAMETERS USED FOR INPUT ONLY ARE.. -C F, DF, NEQ, PAR, TOUT, ITOL, RTOL, ATOL, ITASK, IOPT, LRW, LIW, -C JAC, MF, -C AND THOSE USED FOR BOTH INPUT AND OUTPUT ARE -C Y, T, ISTATE. -C THE WORK ARRAYS RWORK AND IWORK ARE ALSO USED FOR CONDITIONAL AND -C OPTIONAL INPUTS AND OPTIONAL OUTPUTS. (THE TERM OUTPUT HERE REFERS -C TO THE RETURN FROM SUBROUTINE ODESSA TO THE USER-S CALLING PROGRAM.) -C -C THE LEGALITY OF INPUT PARAMETERS WILL BE THOROUGHLY CHECKED ON THE -C INITIAL CALL FOR THE PROBLEM, BUT NOT CHECKED THEREAFTER UNLESS A -C CHANGE IN INPUT PARAMETERS IS FLAGGED BY ISTATE = 3 ON INPUT. -C -C THE DESCRIPTIONS OF THE CALL ARGUMENTS ARE AS FOLLOWS. -C -C F = THE NAME OF THE USER-SUPPLIED SUBROUTINE DEFINING THE -C ODE MODEL. THIS SYSTEM MUST BE PUT IN THE FIRST-ORDER -C FORM DY/DT = F(Y,T;P), WHERE F IS A VECTOR-VALUED FUNCTION -C OF THE SCALAR T AND VECTORS Y, AND PAR. SUBROUTINE F IS TO -C COMPUTE THE FUNCTION F. IT IS TO HAVE THE FORM.. -C SUBROUTINE F (NEQ, T, Y, PAR, YDOT) -C DOUBLE PRECISION T, Y, PAR, YDOT -C DIMENSION Y(1), PAR(1), YDOT(1) -C WHERE NEQ, T, Y, AND PAR ARE INPUT, AND YDOT = F(Y,T;P) -C IS OUTPUT. Y AND YDOT ARE ARRAYS OF LENGTH N (= NEQ(1)). -C (IN THE DIMENSION STATEMENT ABOVE, 1 IS A DUMMY -C DIMENSION.. IT CAN BE REPLACED BY ANY VALUE.) -C F SHOULD NOT ALTER ARRAY Y, OR PAR(1),...,PAR(NPAR). -C F MUST BE DECLARED EXTERNAL IN THE CALLING PROGRAM. -C -C SUBROUTINE F MAY ACCESS USER-DEFINED QUANTITIES IN -C NEQ(2),... AND PAR(NPAR+1),... IF NEQ IS AN ARRAY -C (DIMENSIONED IN F) AND PAR HAS LENGTH EXCEEDING NPAR. -C SEE THE DESCRIPTIONS OF NEQ AND PAR BELOW. -C -C DF = THE NAME OF THE USER-SUPPLIED ROUTINE (IDF = 1) TO COMPUTE -C THE INHOMOGENEITY MATRIX, DF/DP, AS A FUNCTION OF THE SCALAR -C T, AND THE VECTORS Y, AND PAR. IT IS TO HAVE THE FORM -C SUBROUTINE DF (NEQ, T, Y, PAR, DFDP, JPAR) -C DOUBLE PRECISION T, Y, PAR, DFDP -C DIMENSION Y(1), PAR(1), DFDP(1) -C GO TO (1,2,...,NPAR) JPAR -C 1 DFDP(1) = DF(1)/DP(1) -C . -C DFDP(I) = DF(I)/DP(1) -C . -C DFDP(N) = DF(N)/DP(1) -C RETURN -C 2 DFDP(1) = DF(1)/DP(2) -C . -C DFDP(I) = DF(I)/DP(2) -C . -C DFDP(N) = DF(N)/DP(2) -C . -C RETURN -C . . -C . . -C NPAR DFDP(1) = DF(1)/DP(NPAR) -C . -C DFDP(I) = DF(I)/DP(NPAR) -C . -C DFDP(N) = DF(N)/DP(NPAR) -C RETURN -C END -C WHERE NEQ, T, Y, PAR, AND JPAR ARE INPUT AND THE VECTOR -C DFDP(*,JPAR) IS TO BE LOADED WITH THE PARTIAL DERIVATIVES -C DF(Y,T;PAR)/DP(JPAR) ON OUTPUT. ONLY NONZERO ELEMENTS NEED -C BE LOADED. T, Y, AND PAR HAVE THE SAME MEANING AS IN -C SUBROUTINE F. (IN THE DIMENSION STATEMENT ABOVE, 1 IS A DUMMY -C DIMENSION.. IT CAN BE REPLACED BY ANY VALUE). -C -C DFDP(*,JPAR) IS PRESET TO ZERO BY THE SOLVER, SO THAT ONLY -C THE NONZERO ELEMENTS NEED BE LOADED BY DF. SUBROUTINE DF -C MUST BE DECLARED EXTERNAL IN THE CALLING PROGRAM IF USED. -C IF IDF = 0 (OR ISOPT = 0), A DUMMY ARGUMENT CAN BE USED. -C -C SUBROUTINE DF MAY ACCESS USER-DEFINED QUANTITIES IN -C NEQ(2),... AND PAR(NPAR+1),... IF NEQ IS AN ARRAY -C (DIMENSIONED IN DF) AND PAR HAS A LENGTH EXCEEDING NPAR. -C SEE THE DESCRIPTIONS OF NEQ AND PAR (BELOW). -C -C NEQ = THE SIZE OF THE ODE SYSTEM (NUMBER OF FIRST ORDER ORDINARY -C DIFFERENTIAL EQUATIONS (N) IN THE MODEL). USED ONLY FOR -C INPUT. NEQ MAY NOT BE CHANGED DURING THE PROBLEM. -C -C FOR ISOPT = 0, NEQ IS NORMALLY A SCALAR. HOWEVER, NEQ MAY -C BE AN ARRAY, WITH NEQ(1) SET TO THE SYSTEM SIZE (N), IN WHICH -C CASE THE ODESSA PACKAGE ACCESSES ONLY NEQ(1). HOWEVER, -C THIS PARAMETER IS PASSED AS THE NEQ ARGUMENT IN ALL CALLS -C TO F, DF, AND JAC. HENCE, IF IT IS AN ARRAY, LOCATIONS -C NEQ(2),... MAY BE USED TO STORE OTHER INTEGER DATA AND PASS -C IT TO F, DF, AND/OR JAC. FOR ISOPT = 1, NPAR MUST BE LOADED -C INTO NEQ(2), AND IS NOT ALLOWED TO CHANGE DURING THE PROBLEM. -C IN THESE CASES, SUBROUTINES F, DF, AND/OR JAC MUST INCLUDE -C NEQ IN A DIMENSION STATEMENT. -C -C Y = A REAL ARRAY FOR THE VECTOR OF DEPENDENT VARIABLES, OF -C DIMENSION (N) BY (NPAR+1). USED FOR BOTH INPUT AND -C OUTPUT ON THE FIRST CALL (ISTATE = 1), AND ONLY FOR -C OUTPUT ON OTHER CALLS. ON THE FIRST CALL, Y MUST CONTAIN -C THE VECTORS OF INITIAL VALUES. ON OUTPUT, Y CONTAINS THE -C COMPUTED SOLUTION VECTORS, EVALUATED AT T. -C -C PAR = A REAL ARRAY FOR THE VECTOR OF CONSTANT MODEL PARAMETERS -C OF INTEREST IN THE SENSITIVITY ANALYSIS, OF LENGTH NPAR -C OR MORE. PAR IS PASSED AS AN ARGUMENT IN ALL CALLS TO F, -C DF, AND JAC. HENCE LOCATIONS PAR(NPAR+1),... MAY BE USED -C TO STORE OTHER REAL DATA AND PASS IT TO F, DF, AND/OR JAC. -C LOCATIONS PAR(1),...,PAR(NPAR) ARE USED AS INPUT ONLY, -C AND MUST NOT BE CHANGED DURING THE PROBLEM. -C -C T = THE INDEPENDENT VARIABLE. ON INPUT, T IS USED ONLY ON THE -C FIRST CALL, AS THE INITIAL POINT OF THE INTEGRATION. -C ON OUTPUT, AFTER EACH CALL, T IS THE VALUE AT WHICH A -C COMPUTED SOLUTION Y IS EVALUATED (USUALLY THE SAME AS TOUT). -C ON AN ERROR RETURN, T IS THE FARTHEST POINT REACHED. -C -C TOUT = THE NEXT VALUE OF T AT WHICH A COMPUTED SOLUTION IS DESIRED. -C USED ONLY FOR INPUT. -C -C WHEN STARTING THE PROBLEM (ISTATE = 1), TOUT MAY BE EQUAL -C TO T FOR ONE CALL, THEN SHOULD .NE. T FOR THE NEXT CALL. -C FOR THE INITIAL T, AN INPUT VALUE OF TOUT .NE. T IS USED -C IN ORDER TO DETERMINE THE DIRECTION OF THE INTEGRATION -C (I.E. THE ALGEBRAIC SIGN OF THE STEP SIZES) AND THE ROUGH -C SCALE OF THE PROBLEM. INTEGRATION IN EITHER DIRECTION -C (FORWARD OR BACKWARD IN T) IS PERMITTED. -C -C IF ITASK = 2 OR 5 (ONE-STEP MODES), TOUT IS IGNORED AFTER -C THE FIRST CALL (I.E. THE FIRST CALL WITH TOUT .NE. T). -C OTHERWISE, TOUT IS REQUIRED ON EVERY CALL. -C -C IF ITASK = 1, 3, OR 4, THE VALUES OF TOUT NEED NOT BE -C MONOTONE, BUT A VALUE OF TOUT WHICH BACKS UP IS LIMITED -C TO THE CURRENT INTERNAL T INTERVAL, WHOSE ENDPOINTS ARE -C TCUR - HU AND TCUR (SEE OPTIONAL OUTPUTS, BELOW, FOR -C TCUR AND HU). -C -C ITOL = AN INDICATOR FOR THE TYPE OF ERROR CONTROL. SEE -C DESCRIPTION BELOW UNDER ATOL. USED ONLY FOR INPUT. -C -C RTOL = A RELATIVE ERROR TOLERANCE PARAMETER, EITHER A SCALAR OR -C AN ARRAY OF SPACE (N) BY (NPAR+1). SEE DESCRIPTION BELOW -C UNDER ATOL. INPUT ONLY. -C -C ATOL = AN ABSOLUTE ERROR TOLERANCE PARAMETER, EITHER A SCALAR OR -C AN ARRAY OF SPACE (N) BY (NPAR+1). INPUT ONLY. -C -C THE INPUT PARAMETERS ITOL, RTOL, AND ATOL DETERMINE -C THE ERROR CONTROL PERFORMED BY THE SOLVER. THE SOLVER WILL -C CONTROL THE VECTOR E = (E(I,J)) OF ESTIMATED LOCAL ERRORS -C IN Y, ACCORDING TO AN INEQUALITY OF THE FORM -C RMS-NORM OF ( E(I,J)/EWT(I,J) ) .LE. 1, -C WHERE EWT(I,J) = RTOL(I,J)*ABS(Y(I,J)) + ATOL(I,J), -C AND THE RMS-NORM (ROOT-MEAN-SQUARE NORM) HERE IS -C RMS-NORM(V) = SQRT ( (1/N) * SUM (V(I,J)**2) ); I =1,...,N. -C HERE EWT = (EWT(I,J)) IS A VECTOR OF WEIGHTS WHICH MUST -C ALWAYS BE POSITIVE, AND THE VALUES OF RTOL AND ATOL SHOULD -C ALL BE NON-NEGATIVE. THE FOLLOWING TABLE GIVES THE TYPES -C (SCALAR/ARRAY) OF RTOL AND ATOL, AND THE CORRESPONDING FORM -C OF EWT(I,J). -C -C ITOL RTOL ATOL EWT(I,J) -C 1 SCALAR SCALAR RTOL*ABS(Y(I,J)) + ATOL -C 2 SCALAR ARRAY RTOL*ABS(Y(I,J)) + ATOL(I,J) -C 3 ARRAY SCALAR RTOL(I,J)*ABS(Y(I,J)) + ATOL -C 4 ARRAY ARRAY RTOL(I,J)*ABS(Y(I,J)) + ATOL(I,J) -C -C WHEN EITHER OF THESE PARAMETERS IS A SCALAR, IT NEED NOT -C BE DIMENSIONED IN THE USER-S CALLING PROGRAM. -C -C THE TOTAL NUMBER OF ERROR TEST FAILURES DUE TO THE SENSITIVITY -C ANALYSIS, AND WHICH REQUIRE AN INTEGRATION STEP TO BE -C REPEATED, ARE ACCUMULATED IN THE LAST NPAR+1 LOCATIONS OF THE -C INTEGER WORK ARRAY IWORK (SEE OPTIONAL OUTPUTS BELOW). -C THIS INFORMATION MAY BE OF VALUE IN DETERMINING APPROPRIATE -C ERROR TOLERANCES TO BE APPLIED TO THE SENSITIVITY FUNCTIONS. -C -C IF NONE OF THE ABOVE CHOICES (WITH ITOL, RTOL, AND ATOL -C FIXED THROUGHOUT THE PROBLEM) IS SUITABLE, MORE GENERAL -C ERROR CONTROLS CAN BE OBTAINED BY SUBSTITUTING -C USER-SUPPLIED ROUTINES FOR THE SETTING OF EWT AND/OR FOR -C THE NORM CALCULATION. SEE PART IV BELOW. -C -C IF GLOBAL ERRORS ARE TO BE ESTIMATED BY MAKING A REPEATED -C RUN ON THE SAME PROBLEM WITH SMALLER TOLERANCES, THEN ALL -C COMPONENTS OF RTOL AND ATOL (I.E. OF EWT) SHOULD BE SCALED -C DOWN UNIFORMLY. -C -C ITASK = AN INDEX SPECIFYING THE TASK TO BE PERFORMED. -C INPUT ONLY. ITASK HAS THE FOLLOWING VALUES AND MEANINGS. -C 1 MEANS NORMAL COMPUTATION OF OUTPUT VALUES OF Y(T) AT -C T = TOUT (BY OVERSHOOTING AND INTERPOLATING). -C 2 MEANS TAKE ONE STEP ONLY AND RETURN. -C 3 MEANS STOP AT THE FIRST INTERNAL MESH POINT AT OR -C BEYOND T = TOUT AND RETURN. -C 4 MEANS NORMAL COMPUTATION OF OUTPUT VALUES OF Y(T) AT -C T = TOUT BUT WITHOUT OVERSHOOTING T = TCRIT. -C TCRIT MUST BE INPUT AS RWORK(1). TCRIT MAY BE EQUAL TO -C OR BEYOND TOUT, BUT NOT BEHIND IT IN THE DIRECTION OF -C INTEGRATION. THIS OPTION IS USEFUL IF THE PROBLEM -C HAS A SINGULARITY AT OR BEYOND T = TCRIT. -C 5 MEANS TAKE ONE STEP, WITHOUT PASSING TCRIT, AND RETURN. -C TCRIT MUST BE INPUT AS RWORK(1). -C -C NOTE.. IF ITASK = 4 OR 5 AND THE SOLVER REACHES TCRIT -C (WITHIN ROUNDOFF), IT WILL RETURN T = TCRIT (EXACTLY) TO -C INDICATE THIS (UNLESS ITASK = 4 AND TOUT COMES BEFORE TCRIT, -C IN WHICH CASE ANSWERS AT T = TOUT ARE RETURNED FIRST). -C -C ISTATE = AN INDEX USED FOR INPUT AND OUTPUT TO SPECIFY THE -C THE STATE OF THE CALCULATION. -C -C ON INPUT, THE VALUES OF ISTATE ARE AS FOLLOWS. -C 1 MEANS THIS IS THE FIRST CALL FOR THE PROBLEM -C (INITIALIZATIONS WILL BE DONE). SEE NOTE BELOW. -C 2 MEANS THIS IS NOT THE FIRST CALL, AND THE CALCULATION -C IS TO CONTINUE NORMALLY, WITH NO CHANGE IN ANY INPUT -C PARAMETERS EXCEPT POSSIBLY TOUT AND ITASK. -C (IF ITOL, RTOL, AND/OR ATOL ARE CHANGED BETWEEN CALLS -C WITH ISTATE = 2, THE NEW VALUES WILL BE USED BUT NOT -C TESTED FOR LEGALITY.) -C 3 MEANS THIS IS NOT THE FIRST CALL, AND THE -C CALCULATION IS TO CONTINUE NORMALLY, BUT WITH -C A CHANGE IN INPUT PARAMETERS OTHER THAN -C TOUT AND ITASK. CHANGES ARE ALLOWED IN -C ITOL, RTOL, ATOL, IOPT, LRW, LIW, MF, ML, MU, -C AND ANY OF THE OPTIONAL INPUTS EXCEPT H0. -C (SEE IWORK DESCRIPTION FOR ML AND MU.) -C NOTE.. A PRELIMINARY CALL WITH TOUT = T IS NOT COUNTED -C AS A FIRST CALL HERE, AS NO INITIALIZATION OR CHECKING OF -C INPUT IS DONE. (SUCH A CALL IS SOMETIMES USEFUL FOR THE -C PURPOSE OF OUTPUTTING THE INITIAL CONDITIONS.) -C THUS THE FIRST CALL FOR WHICH TOUT .NE. T REQUIRES -C ISTATE = 1 ON INPUT. -C -C ON OUTPUT, ISTATE HAS THE FOLLOWING VALUES AND MEANINGS. -C 1 MEANS NOTHING WAS DONE, AS TOUT WAS EQUAL TO T WITH -C ISTATE = 1 ON INPUT. (HOWEVER, AN INTERNAL COUNTER WAS -C SET TO DETECT AND PREVENT REPEATED CALLS OF THIS TYPE.) -C 2 MEANS THE INTEGRATION WAS PERFORMED SUCCESSFULLY. -C -1 MEANS AN EXCESSIVE AMOUNT OF WORK (MORE THAN MXSTEP -C STEPS) WAS DONE ON THIS CALL, BEFORE COMPLETING THE -C REQUESTED TASK, BUT THE INTEGRATION WAS OTHERWISE -C SUCCESSFUL AS FAR AS T. (MXSTEP IS AN OPTIONAL INPUT -C AND IS NORMALLY 500.) TO CONTINUE, THE USER MAY -C SIMPLY RESET ISTATE TO A VALUE .GT. 1 AND CALL AGAIN -C (THE EXCESS WORK STEP COUNTER WILL BE RESET TO 0). -C IN ADDITION, THE USER MAY INCREASE MXSTEP TO AVOID -C THIS ERROR RETURN (SEE BELOW ON OPTIONAL INPUTS). -C -2 MEANS TOO MUCH ACCURACY WAS REQUESTED FOR THE PRECISION -C OF THE MACHINE BEING USED. THIS WAS DETECTED BEFORE -C COMPLETING THE REQUESTED TASK, BUT THE INTEGRATION -C WAS SUCCESSFUL AS FAR AS T. TO CONTINUE, THE TOLERANCE -C PARAMETERS MUST BE RESET, AND ISTATE MUST BE SET -C TO 3. THE OPTIONAL OUTPUT TOLSF MAY BE USED FOR THIS -C PURPOSE. (NOTE.. IF THIS CONDITION IS DETECTED BEFORE -C TAKING ANY STEPS, THEN AN ILLEGAL INPUT RETURN -C (ISTATE = -3) OCCURS INSTEAD.) -C -3 MEANS ILLEGAL INPUT WAS DETECTED, BEFORE TAKING ANY -C INTEGRATION STEPS. SEE WRITTEN MESSAGE FOR DETAILS. -C NOTE.. IF THE SOLVER DETECTS AN INFINITE LOOP OF CALLS -C TO THE SOLVER WITH ILLEGAL INPUT, IT WILL CAUSE -C THE RUN TO STOP. -C -4 MEANS THERE WERE REPEATED ERROR TEST FAILURES ON -C ONE ATTEMPTED STEP, BEFORE COMPLETING THE REQUESTED -C TASK, BUT THE INTEGRATION WAS SUCCESSFUL AS FAR AS T. -C THE PROBLEM MAY HAVE A SINGULARITY, OR THE INPUT -C MAY BE INAPPROPRIATE. -C -5 MEANS THERE WERE REPEATED CONVERGENCE TEST FAILURES ON -C ONE ATTEMPTED STEP, BEFORE COMPLETING THE REQUESTED -C TASK, BUT THE INTEGRATION WAS SUCCESSFUL AS FAR AS T. -C THIS MAY BE CAUSED BY AN INACCURATE JACOBIAN MATRIX, -C IF ONE IS BEING USED. -C -6 MEANS EWT(I,J) BECAME ZERO FOR SOME I,J DURING THE -C INTEGRATION. PURE RELATIVE ERROR CONTROL (ATOL(I,J)=0.0) -C WAS REQUESTED ON A VARIABLE WHICH HAS NOW VANISHED. -C THE INTEGRATION WAS SUCCESSFUL AS FAR AS T. -C -C NOTE.. SINCE THE NORMAL OUTPUT VALUE OF ISTATE IS 2, -C IT DOES NOT NEED TO BE RESET FOR NORMAL CONTINUATION. -C ALSO, SINCE A NEGATIVE INPUT VALUE OF ISTATE WILL BE -C REGARDED AS ILLEGAL, A NEGATIVE OUTPUT VALUE REQUIRES THE -C USER TO CHANGE IT, AND POSSIBLY OTHER INPUTS, BEFORE -C CALLING THE SOLVER AGAIN. -C -C IOPT = AN INTEGER ARRAY FLAG TO SPECIFY WHETHER OR NOT ANY OPTIONAL -C INPUTS ARE BEING USED ON THIS CALL. INPUT ONLY. -C THE OPTIONAL INPUTS ARE LISTED SEPARATELY BELOW. -C IOPT(1) = 0 MEANS NO OPTIONAL INPUTS FOR THE SOLVER WILL BE -C USED. DEFAULT VALUES WILL BE USED IN ALL CASES. -C = 1 MEANS ONE OR MORE OPTIONAL INPUTS FOR THE -C SOLVER ARE BEING USED. -C NOTE : IOPT(1) IS INDEPENDENT OF ISOPT AND IDF. -C IOPT(2) = 0 MEANS NO SENSITIVITY ANALYSIS WILL BE PERFORMED. -C = 1 MEANS A SENSITIVITY ANALYSIS WILL BE PERFORMED. -C NOTE : IOPT(2) IS RENAMED TO ISOPT IN ODESSA. -C = 0 MEANS DF/DP WILL BE CALCULATED BY FINITE -C DIFFERENCE WITHIN ODESSA. -C IOPT(3) = 1 MEANS DF/DP WILL BE CALCULATED BY A USER-SUPPLIED -C ROUTINE. -C NOTE : IOPT(3) IS RENAMED TO IDF IN ODESSA. -C IF IDF = 1, THE USER MUST SUPPLY A -C SUBROUTINE DF (THE NAME IS ARBITRARY) AS -C DESCRIBED BELOW UNDER DF. FOR IDF = 0, -C A DUMMY ARGUMENT CAN BE USED. -C -C RWORK = A REAL WORKING ARRAY (DOUBLE PRECISION). -C FOR ISOPT = 0, THE LENGTH OF RWORK MUST BE AT LEAST.. -C 20 + NYH*(MAXORD + 1) + 3*NEQ + LWM -C FOR ISOPT = 1, THE LENGTH OF RWORK MUST BE AT LEAST.. -C 20 + NYH*(MAXORD + 1) + 2*NYH + LWM + N -C WHERE.. -C NYH = THE TOTAL NUMBER OF DEPENDENT VARIABLES; -C (= N IF ISOPT = 0, AND N*(NPAR+1) IF ISOPT = 1). -C MAXORD = 12 (IF METH = 1) OR 5 (IF METH = 2) (UNLESS A -C SMALLER VALUE IS GIVEN AS AN OPTIONAL INPUT), -C LWM = 0 IF MITER = 0, -C LWM = N**2 + 2 IF MITER IS 1 OR 2, -C LWM = N + 2 IF MITER = 3, AND -C LWM = (2*ML+MU+1)*N + 2 IF MITER IS 4 OR 5. -C (SEE THE MF DESCRIPTION FOR METH AND MITER.) -C -C THE FIRST 20 WORDS OF RWORK ARE RESERVED FOR CONDITIONAL -C AND OPTIONAL INPUTS AND OPTIONAL OUTPUTS. -C -C THE FOLLOWING WORD IN RWORK IS A CONDITIONAL INPUT.. -C RWORK(1) = TCRIT = CRITICAL VALUE OF T WHICH THE SOLVER -C IS NOT TO OVERSHOOT. REQUIRED IF ITASK IS -C 4 OR 5, AND IGNORED OTHERWISE. (SEE ITASK.) -C -C LRW = THE LENGTH OF THE ARRAY RWORK, AS DECLARED BY THE USER. -C (THIS WILL BE CHECKED BY THE SOLVER.) -C -C IWORK = AN INTEGER WORK ARRAY. THE LENGTH MUST BE AT LEAST.. -C 20 IF MITER = 0 OR 3 (MF = 10, 13, 20, 23), OR -C 20 + N OTHERWISE (MF = 11, 12, 14, 15, 21, 22, 24, 25). -C FOR ISOPT = 0, OR.. -C 21 + N + NPAR -C FOR ISOPT = 1. -C THE FIRST FEW WORDS OF IWORK ARE USED FOR CONDITIONAL AND -C OPTIONAL INPUTS AND OPTIONAL OUTPUTS. -C -C THE FOLLOWING 2 WORDS IN IWORK ARE CONDITIONAL INPUTS.. -C IWORK(1) = ML THESE ARE THE LOWER AND UPPER -C IWORK(2) = MU HALF-BANDWIDTHS, RESPECTIVELY, OF THE -C BANDED JACOBIAN, EXCLUDING THE MAIN DIAGONAL. -C THE BAND IS DEFINED BY THE MATRIX LOCATIONS -C (I,J) WITH I-ML .LE. J .LE. I+MU. ML AND MU -C MUST SATISFY 0 .LE. ML,MU .LE. NEQ-1. -C THESE ARE REQUIRED IF MITER IS 4 OR 5, AND -C IGNORED OTHERWISE. ML AND MU MAY IN FACT BE -C THE BAND PARAMETERS FOR A MATRIX TO WHICH -C DF/DY IS ONLY APPROXIMATELY EQUAL. -* -C -C LIW = THE LENGTH OF THE ARRAY IWORK, AS DECLARED BY THE USER. -C (THIS WILL BE CHECKED BY THE SOLVER.) -C -C NOTE.. THE WORK ARRAYS MUST NOT BE ALTERED BETWEEN CALLS TO ODESSA -C FOR THE SAME PROBLEM, EXCEPT POSSIBLY FOR THE CONDITIONAL AND -C OPTIONAL INPUTS, AND EXCEPT FOR THE LAST 2*NYH + N WORDS OF RWORK. -C THE LATTER SPACE IS USED FOR INTERNAL SCRATCH SPACE, AND SO IS -C AVAILABLE FOR USE BY THE USER OUTSIDE ODESSA BETWEEN CALLS, IF -C DESIRED (BUT NOT FOR USE BY F, DF, OR JAC). -C -C JAC = THE NAME OF THE USER-SUPPLIED ROUTINE (MITER = 1 OR 4) TO -C COMPUTE THE JACOBIAN MATRIX, DF/DY, AS A FUNCTION OF THE -C SCALAR T AND THE VECTORS Y, AND PAR. IT IS TO HAVE THE FORM -C SUBROUTINE JAC (NEQ, T, Y, PAR, ML, MU, PD, NROWPD) -C DOUBLE PRECISION T, Y, PAR, PD -C DIMENSION Y(1), PAR(1), PD(NROWPD,1) -C WHERE NEQ, T, Y, PAR, ML, MU, AND NROWPD ARE INPUT AND THE -C ARRAY PD IS TO BE LOADED WITH PARTIAL DERIVATIVES (ELEMENTS -C OF THE JACOBIAN MATRIX) ON OUTPUT. PD MUST BE GIVEN A FIRST -C DIMENSION OF NROWPD. T, Y, AND PAR HAVE THE SAME MEANING AS -C IN SUBROUTINE F. (IN THE DIMENSION STATEMENT ABOVE, 1 IS A -C DUMMY DIMENSION.. IT CAN BE REPLACED BY ANY VALUE.) -C IN THE FULL MATRIX CASE (MITER = 1), ML AND MU ARE -C IGNORED, AND THE JACOBIAN IS TO BE LOADED INTO PD IN -C COLUMNWISE MANNER, WITH DF(I)/DY(J) LOADED INTO PD(I,J). -C IN THE BAND MATRIX CASE (MITER = 4), THE ELEMENTS -C WITHIN THE BAND ARE TO BE LOADED INTO PD IN COLUMNWISE -C MANNER, WITH DIAGONAL LINES OF DF/DY LOADED INTO THE ROWS -C OF PD. THUS DF(I)/DY(J) IS TO BE LOADED INTO PD(I-J+MU+1,J). -C ML AND MU ARE THE HALF-BANDWIDTH PARAMETERS (SEE IWORK). -C THE LOCATIONS IN PD IN THE TWO TRIANGULAR AREAS WHICH -C CORRESPOND TO NONEXISTENT MATRIX ELEMENTS CAN BE IGNORED -C OR LOADED ARBITRARILY, AS THEY ARE OVERWRITTEN BY ODESSA. -C PD IS PRESET TO ZERO BY THE SOLVER, SO THAT ONLY THE -C NONZERO ELEMENTS NEED BE LOADED BY JAC. EACH CALL TO JAC IS -C PRECEDED BY A CALL TO F WITH THE SAME ARGUMENTS NEQ, T, Y, -C AND PAR. THUS TO GAIN SOME EFFICIENCY, INTERMEDIATE -C QUANTITIES SHARED BY BOTH CALCULATIONS MAY BE SAVED IN A -C USER COMMON BLOCK BY F AND NOT RECOMPUTED BY JAC, IF -C DESIRED. ALSO, JAC MAY ALTER THE Y ARRAY, IF DESIRED. -C JAC MUST BE DECLARED EXTERNAL IN THE CALLING PROGRAM. -C SUBROUTINE JAC MAY ACCESS USER-DEFINED QUANTITIES IN -C NEQ(2),... AND PAR(NPAR+1),.... SEE THE DESCRIPTIONS OF -C NEQ (ABOVE) AND PAR (BELOW). -C -C MF = THE METHOD FLAG. USED ONLY FOR INPUT. THE LEGAL VALUES OF -C MF ARE 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, AND 25. -C MF HAS DECIMAL DIGITS METH AND MITER.. MF = 10*METH + MITER. -C METH INDICATES THE BASIC LINEAR MULTISTEP METHOD.. -C METH = 1 MEANS THE IMPLICIT ADAMS METHOD. -* -C METH = 2 MEANS THE METHOD BASED ON BACKWARD -C DIFFERENTIATION FORMULAS (BDF-S). -C MITER INDICATES THE CORRECTOR ITERATION METHOD.. -C MITER = 0 MEANS FUNCTIONAL ITERATION (NO JACOBIAN MATRIX -C IS INVOLVED). -C MITER = 1 MEANS CHORD ITERATION WITH A USER-SUPPLIED -C FULL (NEQ BY NEQ) JACOBIAN. -C MITER = 2 MEANS CHORD ITERATION WITH AN INTERNALLY -C GENERATED (DIFFERENCE QUOTIENT) FULL JACOBIAN -C (USING NEQ EXTRA CALLS TO F PER DF/DY VALUE). -C MITER = 3 MEANS CHORD ITERATION WITH AN INTERNALLY -C GENERATED DIAGONAL JACOBIAN APPROXIMATION. -C (USING 1 EXTRA CALL TO F PER DF/DY EVALUATION). -C MITER = 4 MEANS CHORD ITERATION WITH A USER-SUPPLIED -C BANDED JACOBIAN. -C MITER = 5 MEANS CHORD ITERATION WITH AN INTERNALLY -C GENERATED BANDED JACOBIAN (USING ML+MU+1 EXTRA -C CALLS TO F PER DF/DY EVALUATION). -C IF MITER = 1 OR 4, THE USER MUST SUPPLY A SUBROUTINE JAC -C (THE NAME IS ARBITRARY) AS DESCRIBED ABOVE UNDER JAC. -C FOR OTHER VALUES OF MITER, A DUMMY ARGUMENT CAN BE USED. -C -C IF A SENSITIVITY ANLYSIS IS DESIRED (ISOPT = 1), MITER = 0 -C AND 3 ARE DISALLOWED. IN THESE CASES, THE USER IS RECOMMENDED -C TO SUPPLY AN ANALYTICAL JACOBIAN (MITER = 1 OR 4) AND AN -C ANALYTICAL INHOMOGENEITY MATRIX (IDF = 1). -C---------------------------------------------------------------------- -C OPTIONAL INPUTS. -C -C THE FOLLOWING IS A LIST OF THE OPTIONAL INPUTS PROVIDED FOR IN THE -C CALL SEQUENCE. (SEE ALSO PART II.) FOR EACH SUCH INPUT VARIABLE, -C THIS TABLE LISTS ITS NAME AS USED IN THIS DOCUMENTATION, ITS -C LOCATION IN THE CALL SEQUENCE, ITS MEANING, AND THE DEFAULT VALUE. -C THE USE OF ANY OF THESE INPUTS REQUIRES IOPT(1) = 1, AND IN THAT -C CASE ALL OF THESE INPUTS ARE EXAMINED. A VALUE OF ZERO FOR ANY -C OF THESE OPTIONAL INPUTS WILL CAUSE THE DEFAULT VALUE TO BE USED. -C THUS TO USE A SUBSET OF THE OPTIONAL INPUTS, SIMPLY PRELOAD -C LOCATIONS 5 TO 10 IN RWORK AND IWORK TO 0.0 AND 0 RESPECTIVELY, AND -C THEN SET THOSE OF INTEREST TO NONZERO VALUES. -C -C NAME LOCATION MEANING AND DEFAULT VALUE -C -C H0 RWORK(5) THE STEP SIZE TO BE ATTEMPTED ON THE FIRST STEP. -C THE DEFAULT VALUE IS DETERMINED BY THE SOLVER. -C -C HMAX RWORK(6) THE MAXIMUM ABSOLUTE STEP SIZE ALLOWED. -C THE DEFAULT VALUE IS INFINITE. -C -C HMIN RWORK(7) THE MINIMUM ABSOLUTE STEP SIZE ALLOWED. -C THE DEFAULT VALUE IS 0. (THIS LOWER BOUND IS NOT -C ENFORCED ON THE FINAL STEP BEFORE REACHING TCRIT -C WHEN ITASK = 4 OR 5.) -C -C MAXORD IWORK(5) THE MAXIMUM ORDER TO BE ALLOWED. THE DEFAULT -C VALUE IS 12 IF METH = 1, AND 5 IF METH = 2. -C IF MAXORD EXCEEDS THE DEFAULT VALUE, IT WILL -C BE REDUCED TO THE DEFAULT VALUE. -C IF MAXORD IS CHANGED DURING THE PROBLEM, IT MAY -C CAUSE THE CURRENT ORDER TO BE REDUCED. -C -C MXSTEP IWORK(6) MAXIMUM NUMBER OF (INTERNALLY DEFINED) STEPS -C ALLOWED DURING ONE CALL TO THE SOLVER. -C THE DEFAULT VALUE IS 500. -C -C MXHNIL IWORK(7) MAXIMUM NUMBER OF MESSAGES PRINTED (PER PROBLEM) -C WARNING THAT T + H = T ON A STEP (H = STEP SIZE). -C THIS MUST BE POSITIVE TO RESULT IN A NON-DEFAULT -C VALUE. THE DEFAULT VALUE IS 10. -C---------------------------------------------------------------------- -C OPTIONAL OUTPUTS. -C -C AS OPTIONAL ADDITIONAL OUTPUT FROM ODESSA, THE VARIABLES LISTED -C BELOW ARE QUANTITIES RELATED TO THE PERFORMANCE OF ODESSA -C WHICH ARE AVAILABLE TO THE USER. THESE ARE COMMUNICATED BY WAY OF -C THE WORK ARRAYS, BUT ALSO HAVE INTERNAL MNEMONIC NAMES AS SHOWN. -C EXCEPT WHERE STATED OTHERWISE, ALL OF THESE OUTPUTS ARE DEFINED -C ON ANY SUCCESSFUL RETURN FROM ODESSA, AND ON ANY RETURN WITH -C ISTATE = -1, -2, -4, -5, OR -6. ON AN ILLEGAL INPUT RETURN -C (ISTATE = -3), THEY WILL BE UNCHANGED FROM THEIR EXISTING VALUES -C (IF ANY), EXCEPT POSSIBLY FOR TOLSF, LENRW, AND LENIW. -C ON ANY ERROR RETURN, OUTPUTS RELEVANT TO THE ERROR WILL BE DEFINED, -C AS NOTED BELOW. -C -C NAME LOCATION MEANING -C -C HU RWORK(11) THE STEP SIZE IN T LAST USED (SUCCESSFULLY). -C -C HCUR RWORK(12) THE STEP SIZE TO BE ATTEMPTED ON THE NEXT STEP. -C -C TCUR RWORK(13) THE CURRENT VALUE OF THE INDEPENDENT VARIABLE -C WHICH THE SOLVER HAS ACTUALLY REACHED, I.E. THE -C CURRENT INTERNAL MESH POINT IN T. ON OUTPUT, TCUR -C WILL ALWAYS BE AT LEAST AS FAR AS THE ARGUMENT -C T, BUT MAY BE FARTHER (IF INTERPOLATION WAS DONE). -C -C TOLSF RWORK(14) A TOLERANCE SCALE FACTOR, GREATER THAN 1.0, -C COMPUTED WHEN A REQUEST FOR TOO MUCH ACCURACY WAS -C DETECTED (ISTATE = -3 IF DETECTED AT THE START OF -C THE PROBLEM, ISTATE = -2 OTHERWISE). IF ITOL IS -C LEFT UNALTERED BUT RTOL AND ATOL ARE UNIFORMLY -C SCALED UP BY A FACTOR OF TOLSF FOR THE NEXT CALL, -C THEN THE SOLVER IS DEEMED LIKELY TO SUCCEED. -C (THE USER MAY ALSO IGNORE TOLSF AND ALTER THE -C TOLERANCE PARAMETERS IN ANY OTHER WAY APPROPRIATE.) -C -C NST IWORK(11) THE NUMBER OF STEPS TAKEN FOR THE PROBLEM SO FAR. -C -C NFE IWORK(12) THE NUMBER OF F EVALUATIONS FOR THE PROBLEM SO FAR. -C -C NJE IWORK(13) THE NUMBER OF JACOBIAN EVALUATIONS (AND OF MATRIX -C LU DECOMPOSITIONS IF ISOPT = 0) FOR THE PROBLEM SO -C FAR. IF ISOPT = 1, THE NUMBER OF LU DECOMPOSITIONS -C IS EQUAL TO NJE - NSPE (SEE BELOW). -C -C NQU IWORK(14) THE METHOD ORDER LAST USED (SUCCESSFULLY). -C -C NQCUR IWORK(15) THE ORDER TO BE ATTEMPTED ON THE NEXT STEP. -C -C IMXER IWORK(16) THE INDEX OF THE COMPONENT OF LARGEST MAGNITUDE IN -C THE WEIGHTED LOCAL ERROR VECTOR (E(I,J)/EWT(I,J)), -C ON AN ERROR RETURN WITH ISTATE = -4 OR -5. -C -C LENRW IWORK(17) THE LENGTH OF RWORK ACTUALLY REQUIRED. -C THIS IS DEFINED ON NORMAL RETURNS AND ON AN ILLEGAL -C INPUT RETURN FOR INSUFFICIENT STORAGE. -C -C LENIW IWORK(18) THE LENGTH OF IWORK ACTUALLY REQUIRED. -C THIS IS DEFINED ON NORMAL RETURNS AND ON AN ILLEGAL -C INPUT RETURN FOR INSUFFICIENT STORAGE. -C -C NDFE IWORK(19) THE NUMBER OF DF/DP (VECTOR) EVALUATIONS. -C -C NSPE IWORK(20) THE NUMBER OF CALLS TO SUBROUTINE ODESSA_SPRIME. EACH CALL -C TO ODESSA_SPRIME REQUIRES A JACOBIAN EVALUATION, BUT NOT -C AN LU DECOMPOSITION. -C -C THE FOLLOWING ARRAYS ARE SEGMENTS OF THE RWORK AND IWORK ARRAYS -C WHICH MAY ALSO BE OF INTEREST TO THE USER AS OPTIONAL OUTPUTS. -C FOR EACH ARRAY, THE TABLE BELOW GIVES ITS INTERNAL NAME, ITS BASE -C ADDRESS IN RWORK OR IWORK, AND ITS DESCRIPTION. -C -C NAME BASE ADDRESS DESCRIPTION -C -C YH 21 IN RWORK THE NORDSIECK HISTORY ARRAY, OF SIZE NYH BY -C (NQCUR + 1). FOR J = 0,1,...,NQCUR, COLUMN J+1 -C OF YH CONTAINS HCUR**J/FACTORIAL(J) TIMES -C THE J-TH DERIVATIVE OF THE INTERPOLATING -C POLYNOMIAL CURRENTLY REPRESENTING THE SOLUTION, -C EVALUATED AT T = TCUR. -C -C ACOR LENRW-NYH+1 ARRAY OF SIZE NYH USED FOR THE ACCUMULATED -C IN RWORK CORRECTIONS ON EACH STEP, SCALED ON OUTPUT -C TO REPRESENT THE ESTIMATED LOCAL ERROR IN Y -C ON THE LAST STEP. THIS IS THE VECTOR E IN -C THE DESCRIPTION OF THE ERROR CONTROL. -C IT IS DEFINED ONLY ON A SUCCESSFUL RETURN -C FROM ODESSA. -C NRS LENIW-NPAR ARRAY OF SIZE NPAR+1, USED TO STORE THE -C IN IWORK ACCUMULATED NUMBER OF REPEATED STEPS DUE TO -C THE SENSITIVITY ANALYSIS.. -C NRS(1) = TOTAL NUMBER OF REPEATED STEPS, -C NRS(2),... = NUMBER OF REPEATED STEPS DUE TO -C MODEL PARAMETER 1,... -C -C---------------------------------------------------------------------- -C PART II. OTHER ROUTINES CALLABLE. -C -C THE FOLLOWING ARE OPTIONAL CALLS WHICH THE USER MAY MAKE TO -C GAIN ADDITIONAL CAPABILITIES IN CONJUNCTION WITH ODESSA. -C -C CALL ODESSA_SVCOM (RSAV, ISAV) STORE IN RSAV AND ISAV THE CONTENTS -C OF THE INTERNAL COMMON BLOCKS USED BY -C ODESSA (SEE PART III BELOW). -C RSAV MUST BE A REAL ARRAY OF LENGTH 222 -C OR MORE, AND ISAV MUST BE AN INTEGER -C ARRAY OF LENGTH 54 OR MORE. -C -C CALL ODESSA_RSCOM (RSAV, ISAV) RESTORE, FROM RSAV AND ISAV, THE CONTENTS -C OF THE INTERNAL COMMON BLOCKS USED BY -C ODESSA. PRESUMES A PRIOR CALL TO ODESSA_SVCOM -C WITH THE SAME ARGUMENTS. -C -C ODESSA_SVCOM AND ODESSA_RSCOM ARE USEFUL IF -C INTERRUPTING A RUN AND RESTARTING -C LATER, OR ALTERNATING BETWEEN TWO OR -C MORE PROBLEMS SOLVED WITH ODESSA. -C -C CALL ODESSA_INTDY(,,,,,) PROVIDE DERIVATIVES OF Y, OF VARIOUS -C (SEE BELOW) ORDERS, AT A SPECIFIED POINT T, IF -C DESIRED. IT MAY BE CALLED ONLY AFTER -C A SUCCESSFUL RETURN FROM ODESSA. -C -C THE DETAILED INSTRUCTIONS FOR USING ODESSA_INTDY ARE AS FOLLOWS. -C THE FORM OF THE CALL IS.. -C -C CALL ODESSA_INTDY (T, K, RWORK(21), NYH, DKY, IFLAG) -C -C THE INPUT PARAMETERS ARE.. -C -C T = VALUE OF INDEPENDENT VARIABLE WHERE ANSWERS ARE DESIRED -C (NORMALLY THE SAME AS THE T LAST RETURNED BY ODESSA). -C FOR VALID RESULTS, T MUST LIE BETWEEN TCUR - HU AND TCUR. -C (SEE OPTIONAL OUTPUTS FOR TCUR AND HU.) -C K = INTEGER ORDER OF THE DERIVATIVE DESIRED. K MUST SATISFY -C 0 .LE. K .LE. NQCUR, WHERE NQCUR IS THE CURRENT ORDER -C (SEE OPTIONAL OUTPUTS). THE CAPABILITY CORRESPONDING -C TO K = 0, I.E. COMPUTING Y(T), IS ALREADY PROVIDED -C BY ODESSA DIRECTLY. SINCE NQCUR .GE. 1, THE FIRST -C DERIVATIVE DY/DT IS ALWAYS AVAILABLE WITH ODESSA_INTDY. -C RWORK(21) = THE BASE ADDRESS OF THE HISTORY ARRAY YH. -C NYH = COLUMN LENGTH OF YH, EQUAL TO THE TOTAL NUMBER OF -C DEPENDENT VARIABLES. IF ISOPT = 0, NYH = N. IF ISOPT = 1, -C NYH = N * (NPAR + 1). -C -C THE OUTPUT PARAMETERS ARE.. -C -C DKY = A REAL ARRAY OF LENGTH NYH CONTAINING THE COMPUTED VALUE -C OF THE K-TH DERIVATIVE OF Y(T). -C IFLAG = INTEGER FLAG, RETURNED AS 0 IF K AND T WERE LEGAL, -C -1 IF K WAS ILLEGAL, AND -2 IF T WAS ILLEGAL. -C ON AN ERROR RETURN, A MESSAGE IS ALSO WRITTEN. -C---------------------------------------------------------------------- -C PART III. COMMON BLOCKS. -C -C IF ODESSA IS TO BE USED IN AN OVERLAY SITUATION, THE USER -C MUST DECLARE, IN THE PRIMARY OVERLAY, THE VARIABLES IN.. -C (1) THE CALL SEQUENCE TO ODESSA, -C (2) THE THREE INTERNAL COMMON BLOCKS -C /ODE001/ OF LENGTH 258 (219 DOUBLE PRECISION WORDS -C FOLLOWED BY 39 INTEGER WORDS), -C /ODE002/ OF LENGTH 14 (3 DOUBLE PRECISION WORDS FOLLOWED -C BY 11 INTEGER WORDS), -C -C IF ODESSA IS USED ON A SYSTEM IN WHICH THE CONTENTS OF INTERNAL -C COMMON BLOCKS ARE NOT PRESERVED BETWEEN CALLS, THE USER SHOULD -C DECLARE THE ABOVE THREE COMMON BLOCKS IN HIS MAIN PROGRAM TO INSURE -C THAT THEIR CONTENTS ARE PRESERVED. -C -C IF THE SOLUTION OF A GIVEN PROBLEM BY ODESSA IS TO BE INTERRUPTED -C AND THEN LATER CONTINUED, SUCH AS WHEN RESTARTING AN INTERRUPTED RUN -C OR ALTERNATING BETWEEN TWO OR MORE PROBLEMS, THE USER SHOULD SAVE, -C FOLLOWING THE RETURN FROM THE LAST ODESSA CALL PRIOR TO THE -C INTERRUPTION, THE CONTENTS OF THE CALL SEQUENCE VARIABLES AND THE -C INTERNAL COMMON BLOCKS, AND LATER RESTORE THESE VALUES BEFORE THE -C NEXT ODESSA CALL FOR THAT PROBLEM. TO SAVE AND RESTORE THE COMMON -C BLOCKS, USE SUBROUTINES ODESSA_SVCOM AND ODESSA_RSCOM (SEE PART II ABOVE). -C -C---------------------------------------------------------------------- -C PART IV. OPTIONALLY REPLACEABLE SOLVER ROUTINES. -C -C BELOW ARE DESCRIPTIONS OF TWO ROUTINES IN THE ODESSA PACKAGE WHICH -C RELATE TO THE MEASUREMENT OF ERRORS. EITHER ROUTINE CAN BE -C REPLACED BY A USER-SUPPLIED VERSION, IF DESIRED. HOWEVER, SINCE SUCH -C A REPLACEMENT MAY HAVE A MAJOR IMPACT ON PERFORMANCE, IT SHOULD BE -C DONE ONLY WHEN ABSOLUTELY NECESSARY, AND ONLY WITH GREAT CAUTION. -C (NOTE.. THE MEANS BY WHICH THE PACKAGE VERSION OF A ROUTINE IS -C SUPERSEDED BY THE USER-S VERSION MAY BE SYSTEM-DEPENDENT.) -C -C (A) ODESSA_EWSET. -C THE FOLLOWING SUBROUTINE IS CALLED JUST BEFORE EACH INTERNAL -C INTEGRATION STEP, AND SETS THE ARRAY OF ERROR WEIGHTS, EWT, AS -C DESCRIBED UNDER ITOL/RTOL/ATOL ABOVE.. -C SUBROUTINE ODESSA_EWSET (NYH, ITOL, RTOL, ATOL, YCUR, EWT) -C WHERE NEQ, ITOL, RTOL, AND ATOL ARE AS IN THE ODESSA CALL SEQUENCE, -C YCUR CONTAINS THE CURRENT DEPENDENT VARIABLE VECTOR, AND -C EWT IS THE ARRAY OF WEIGHTS SET BY ODESSA_EWSET. -C -C IF THE USER SUPPLIES THIS SUBROUTINE, IT MUST RETURN IN EWT(I) -C (I = 1,...,NYH) A POSITIVE QUANTITY SUITABLE FOR COMPARING ERRORS -C IN Y(I) TO. THE EWT ARRAY RETURNED BY ODESSA_EWSET IS PASSED TO THE -C ODESSA_VNORM ROUTINE (SEE BELOW), AND ALSO USED BY ODESSA IN THE COMPUTATION -C OF THE OPTIONAL OUTPUT IMXER, THE DIAGONAL JACOBIAN APPROXIMATION, -C AND THE INCREMENTS FOR DIFFERENCE QUOTIENT JACOBIANS. -C -C IN THE USER-SUPPLIED VERSION OF ODESSA_EWSET, IT MAY BE DESIRABLE TO USE -C THE CURRENT VALUES OF DERIVATIVES OF Y. DERIVATIVES UP TO ORDER NQ -C ARE AVAILABLE FROM THE HISTORY ARRAY YH, DESCRIBED ABOVE UNDER -C OPTIONAL OUTPUTS. IN ODESSA_EWSET, YH IS IDENTICAL TO THE YCUR ARRAY, -C EXTENDED TO NQ + 1 COLUMNS WITH A COLUMN LENGTH OF NYH AND SCALE -C FACTORS OF H**J/FACTORIAL(J). ON THE FIRST CALL FOR THE PROBLEM, -C GIVEN BY NST = 0, NQ IS 1 AND H IS TEMPORARILY SET TO 1.0. -C THE QUANTITIES NQ, NYH, H, AND NST CAN BE OBTAINED BY INCLUDING -C IN ODESSA_EWSET THE STATEMENTS.. -C DOUBLE PRECISION H, RLS -C COMMON /ODE001/ RLS(219),ILS(39) -C NQ = ILS(35) -C NYH = ILS(14) -C NST = ILS(36) -C H = RLS(213) -C THUS, FOR EXAMPLE, THE CURRENT VALUE OF DY/DT CAN BE OBTAINED AS -C YCUR(NYH+I)/H (I=1,...,N) (AND THE DIVISION BY H IS -C UNNECESSARY WHEN NST = 0). -C -C (B) ODESSA_VNORM. -C THE FOLLOWING IS A REAL FUNCTION ROUTINE WHICH COMPUTES THE WEIGHTED -C ROOT-MEAN-SQUARE NORM OF A VECTOR V.. -C D = ODESSA_VNORM (LV, V, W) -C WHERE.. -C LV = THE LENGTH OF THE VECTOR, -C V = REAL ARRAY OF LENGTH N CONTAINING THE VECTOR, -C W = REAL ARRAY OF LENGTH N CONTAINING WEIGHTS, -C D = SQRT( (1/N) * SUM(V(I)*W(I))**2 ). -C ODESSA_VNORM IS CALLED WITH LV = N AND WITH W(I) = 1.0/EWT(I), WHERE -C EWT IS AS SET BY SUBROUTINE ODESSA_EWSET. -C -C IF THE USER SUPPLIES THIS FUNCTION, IT SHOULD RETURN A NON-NEGATIVE -C VALUE OF ODESSA_VNORM SUITABLE FOR USE IN THE ERROR CONTROL IN ODESSA. -C NONE OF THE ARGUMENTS SHOULD BE ALTERED BY ODESSA_VNORM. -C FOR EXAMPLE, A USER-SUPPLIED ODESSA_VNORM ROUTINE MIGHT.. -C -SUBSTITUTE A MAX-NORM OF (V(I)*W(I)) FOR THE RMS-NORM, OR -C -IGNORE SOME COMPONENTS OF V IN THE NORM, WITH THE EFFECT OF -C SUPPRESSING THE ERROR CONTROL ON THOSE COMPONENTS OF Y. -C---------------------------------------------------------------------- -C OTHER ROUTINES IN THE ODESSA PACKAGE. -C -C IN ADDITION TO SUBROUTINE ODESSA, THE ODESSA PACKAGE INCLUDES THE -C FOLLOWING SUBROUTINES AND FUNCTION ROUTINES.. -C ODESSA_INTDY COMPUTES AN INTERPOLATED VALUE OF THE Y VECTOR AT T = TOUT. -C ODESSA_STODE IS THE CORE INTEGRATOR, WHICH DOES ONE STEP OF THE -C INTEGRATION AND THE ASSOCIATED ERROR CONTROL. -C ODESSA_STESA MANAGES THE SOLUTION OF THE SENSITIVITY FUNCTIONS. -C ODESSA_CFODE SETS ALL METHOD COEFFICIENTS AND TEST CONSTANTS. -C ODESSA_PREPJ COMPUTES AND PREPROCESSES THE JACOBIAN MATRIX J = DF/DY -C AND THE NEWTON ITERATION MATRIX P = I - H*L0*J. -C IT IS ALSO CALLED BY ODESSA_SPRIME (WITH JOPT = 1) TO JUST -C COMPUTE THE JACOBIAN MATRIX. -C ODESSA_PREPDF COMPUTES THE INHOMOGENEITY MATRIX DF/DP. -C ODESSA_SPRIME DEFINES THE SYSTEM OF SENSITIVITY EQUATIONS. -C ODESSA_SOLSY MANAGES SOLUTION OF LINEAR SYSTEM IN CHORD ITERATION. -C ODESSA_EWSET SETS THE ERROR WEIGHT VECTOR EWT BEFORE EACH STEP. -C ODESSA_VNORM COMPUTES THE WEIGHTED R.M.S. NORM OF A VECTOR. -C ODESSA_SVCOM AND ODESSA_RSCOM ARE USER-CALLABLE ROUTINES TO SAVE AND RESTORE, -C RESPECTIVELY, THE CONTENTS OF THE INTERNAL COMMON BLOCKS. -C DGETRF AND DGETRS ARE ROUTINES FROM LAPACK FOR SOLVING FULL -C SYSTEMS OF LINEAR ALGEBRAIC EQUATIONS. -C DGBTRF AND DGBTRS ARE ROUTINES FROM LAPACK FOR SOLVING BANDED -C LINEAR SYSTEMS. -C DAXPY, DSCAL, IDAMAX, AND DDOT ARE BASIC LINEAR ALGEBRA MODULES -C (BLAS) USED BY THE ABOVE LINPACK ROUTINES. -C D1MACH COMPUTES THE UNIT ROUNDOFF IN A MACHINE-INDEPENDENT MANNER. -C XERRWD, XSETUN, AND ODESSA_XSETF HANDLE THE PRINTING OF ALL ERROR -C MESSAGES AND WARNINGS. -C NOTE.. ODESSA_VNORM, IDAMAX, DDOT, AND D1MACH ARE FUNCTION ROUTINES. -C ALL THE OTHERS ARE SUBROUTINES. -C -C THE FORTRAN GENERIC INTRINSIC FUNCTIONS USED BY ODESSA ARE.. -C ABS, MAX, MIN, REAL, MOD, SIGN, SQRT, AND WRITE -C -C A BLOCK DATA SUBPROGRAM IS ALSO INCLUDED WITH THE PACKAGE, -C FOR LOADING SOME OF THE VARIABLES IN INTERNAL COMMON. -C -C---------------------------------------------------------------------- -C PART V. GENERAL REMARKS -C -C THIS SECTION HIGHLIGHTS THE BASIC DIFFERENCES BETWEEN THE ORIGINAL -C LSODE PACKAGE AND THE ODESSA MODIFICATION. THIS IS PROVIDED AS A -C SERVICE TO EXPERIENCED LSODE USERS TO EXPEDITE FAMILIARIZATION WITH -C ODESSA. -C -C (A). ORIGINAL SUBROUTINES AND FUNCTIONS. -C -C OF THE ORIGINAL 22 SUBROUTINES AND FUNCTIONS USED IN THE LSODE -C PACKAGE, ALL ARE USED BY ODESSA, WITH THE FOLLOWING HAVING BEEN -C MODIFIED.. -C -C LSODE THE ORIGINAL DRIVER SUBROUTINE FOR THE LSODE PACKAGE IS -C EXTENSIVELY MODIFIED AND RENAMED ODESSA, WHICH NOW -C CONTAINS A CALL TO ODESSA_SPRIME TO ESTABLISH INITIAL CONDITIONS -C FOR THE SENSITIVITY CALCULATIONS. -C -C ODESSA_STODE THE ONE STEP INTEGRATOR IS SLIGHTLY MODIFIED AND RETAINS -C ITS ORIGINAL NAME. IT NOW CONTAINS THE CALL TO ODESSA_STESA, -C AND ALSO CALLS ODESSA_SPRIME IF KFLAG .LE. -3. -C -C ODESSA_PREPJ ALSO NAMED ODESSA_PREPJ IN ODESSA IS SLIGHTLY MODIFIED TO ALLOW -C FOR THE CALCULATION OF JACOBIAN WITH NO PREPROCESSING -C (JOPT = 1). -C -C (B). NEW SUBROUTINES. -C -C IN ADDITION TO THE CHANGES NOTED ABOVE, THREE NEW SUBROUTINES -C HAVE BEEN INTRODUCED (SEE ODESSA_STESA, ODESSA_SPRIME, AND ODESSA_PREPDF AS DESCRIBED -C IN PART IV. ABOVE). -C -C (C). COMMON BLOCKS. -C -C /LS0001/ RETAINS THE SAME LENGTH AND IS RENAMED /ODE001/; -C HOWEVER THE REAL ARRAY ROWNS(209) IS SHORTENED TO A -C LENGTH OF (173) REAL WORDS, ALLOWING THE REMOVAL OF -C TESCO(3,12) WHICH IS NOW PASSED FROM ODESSA_STODE TO ODESSA_STESA. -C IN ADDITION, THE INTEGER ARRAY IOWNS(6) IS SHORTENED -C TO A LENGTH OF (4) INTEGER WORDS, ALLOWING THE REMOVAL -C OF IALTH AND LMAX WHICH ARE NOW PASSED FROM ODESSA_STODE TO -C ODESSA_STESA. -C -C /ODE002/ ADDED COMMON BLOCK FOR VARIABLES IMPORTANT TO -C SENSITIVITY ANALYSIS (SEE PART III. ABOVE). A BLOCK -C DATA PROGRAM IS NOT REQUIRED FOR THIS COMMON BLOCK. -C -C ODESSA_SVCOM,ODESSA_RSCOM THESE TWO SUBROUTINES ARE MODIFIED TO HANDLE -C COMMON BLOCK /ODE002/ AS WELL. -C -C (D). OPTIONAL INPUTS. -C -C THE FULL SET OF OPTIONAL INPUTS AVAILABLE IN LSODE IS ALSO -C AVAILABLE IN ODESSA, WITH THE EXCEPTION THAT THE NUMBER OF ODE'S -C IN THE MODEL (NEQ(1)), MAY NOT BE CHANGED DURING THE PROBLEM. -C IN ODESSA, NYH NOW REFERS TO THE TOTAL NUMBER OF FIRST-ORDER -C ODE'S (MODEL AND SENSITIVITY EQUATIONS) WHICH IS EQUAL TO -C NEQ(1) IF ISOPT = 0, OR NEQ(1)*(NEQ(2)+1) IF ISOPT = 1. -C NEQ(1), NEQ(2), AND NYH ARE NOT ALLOWED TO CHANGE DURING -C THE COURSE OF AN INTEGRATION. -C -C (E). OPTIONAL OUTPUTS. -C -C THE FULL SET OF OPTIONAL OUTPUTS AVAILABLE IN LSODE IS ALSO -C AVAILABLE IN ODESSA. IN ADDITION, IWORK(19) AND IWORK(20) ARE -C LOADED WITH NDFE AND NSPE, RESPECTIVELY, UPON OUTPUT. THE TOTAL -C NUMBER OF LU DECOMPOSITIONS OF THE PROCESSED JACOBIAN IS EQUAL -C TO NJE - NSPE. -C----------------------------------------------------------------------- - SUBROUTINE DODESSA (F, DF, NEQ, Y, PAR, T, TOUT, ITOL, RTOL, ATOL, - 1 ITASK, ISTATE, IOPT, RWORK, LRW, IWORK, LIW, JAC, MF) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - LOGICAL IHIT - EXTERNAL F, DF, JAC, ODESSA_PREPJ, ODESSA_SOLSY, ODESSA_PREPDF - DIMENSION NEQ(*), Y(*), PAR(*), RTOL(*), ATOL(*), IOPT(*), - 1 RWORK(LRW), IWORK(LIW), MORD(2) -C----------------------------------------------------------------------- -C THIS IS THE SEPTEMBER 1, 1986 VERSION OF ODESSA.. -C AN ORDINARY DIFFERENTIAL EQUATION SOLVER WITH EXPLICIT SIMULTANEOUS -C SENSITIVITY ANALYSIS. -C -C THIS PACKAGE IS A MODIFICATION OF THE AUGUST 13, 1981 VERSION OF -C LSODE.. LIVERMORE SOLVER FOR ORDINARY DIFFERENTIAL EQUATIONS. -C THIS VERSION IS IN DOUBLE PRECISION. -C -C ODESSA SOLVES FOR THE FIRST-ORDER SENSITIVITY COEFFICIENTS.. -C DY(I)/DP, FOR A SINGLE PARAMETER, OR, -C DY(I)/DP(J), FOR MULTIPLE PARAMETERS, -C ASSOCIATED WITH A SYSTEM OF ORDINARY DIFFERENTIAL EQUATIONS.. -C DY(T)/DT = F(Y,T;P). -C----------------------------------------------------------------------- -C REFERENCES... -C -C 1. JORGE R. LEIS AND MARK A. KRAMER, THE SIMULTANEOUS SOLUTION AND -C EXPLICIT SENSITIVITY ANALYSIS OF SYSTEMS DESCRIBED BY ORDINARY -C DIFFERENTIAL EQUATIONS, SUBMITTED TO ACM TRANS. MATH. SOFTWARE, -C (1985). -C -C 2. JORGE R. LEIS AND MARK A. KRAMER, ODESSA - AN ORDINARY -C DIFFERENTIAL EQUATION SOLVER WITH EXPLICIT SIMULTANEOUS -C SENSITIVITY ANALYSIS, SUBMITTED TO ACM TRANS. MATH. SOFTWARE. -C (1985). -C -C 3. ALAN C. HINDMARSH, LSODE AND LSODI, TWO NEW INITIAL VALUE -C ORDINARY DIFFERENTIAL EQUATION SOLVERS, ACM-SIGNUM NEWSLETTER, -C VOL. 15, NO. 4 (1980), PP. 10-11. -C----------------------------------------------------------------------- -C THE FOLLOWING INTERNAL COMMON BLOCKS CONTAIN -C (A) VARIABLES WHICH ARE LOCAL TO ANY SUBROUTINE BUT WHOSE VALUES MUST -C BE PRESERVED BETWEEN CALLS TO THE ROUTINE (OWN VARIABLES), AND -C (B) VARIABLES WHICH ARE COMMUNICATED BETWEEN SUBROUTINES. -C THE STRUCTURE OF THE BLOCKS ARE AS FOLLOWS.. ALL REAL VARIABLES ARE -C LISTED FIRST, FOLLOWED BY ALL INTEGERS. WITHIN EACH TYPE, THE -C VARIABLES ARE GROUPED WITH THOSE LOCAL TO SUBROUTINE ODESSA FIRST, -C THEN THOSE LOCAL TO SUBROUTINE ODESSA_STODE, AND FINALLY THOSE USED -C FOR COMMUNICATION. THE BLOCKS ARE DECLARED IN SUBROUTINES ODESSA -C ODESSA_INTDY, ODESSA_STODE, ODESSA_STESA, ODESSA_PREPJ, ODESSA_PREPDF, -C AND ODESSA_SOLSY. GROUPS OF VARIABLES ARE REPLACED BY DUMMY ARRAYS IN -C THE COMMON DECLARATIONS IN ROUTINES WHERE THOSE VARIABLES ARE NOT USED. -C----------------------------------------------------------------------- - COMMON /ODE001/ TRET, ROWNS(173), - 1 TESCO(3,12), CCMAX, EL0, H, HMIN, HMXI, HU, RC, TN, UROUND, - 2 ILLIN, INIT, LYH, LEWT, LACOR, LSAVF, LWM, LIWM, - 3 MXSTEP, MXHNIL, NHNIL, NTREP, NSLAST, NYH, IOWNS(4), - 4 IALTH, LMAX, ICF, IERPJ, IERSL, JCUR, JSTART, KFLAG, L, METH, - 5 MITER, MAXORD, MAXCOR, MSBP, MXNCF, N, NQ, NST, NFE, NJE, NQU - COMMON /ODE002/ DUPS, DSMS, DDNS, - 1 NPAR, LDFDP, LNRS, - 2 ISOPT, NSV, NDFE, NSPE, IDF, IERSP, JOPT, KFLAGS - PARAMETER (ZERO=0.0D0,ONE=1.0D0,TWO=2.0D0,FOUR=4.0D0) - DATA MORD(1),MORD(2)/12,5/, MXSTP0/500/, MXHNL0/10/ -C----------------------------------------------------------------------- -C BLOCK A. -C THIS CODE BLOCK IS EXECUTED ON EVERY CALL. -C IT TESTS ISTATE AND ITASK FOR LEGALITY AND BRANCHES APPROPIATELY. -C IF ISTATE .GT. 1 BUT THE FLAG INIT SHOWS THAT INITIALIZATION HAS -C NOT YET BEEN DONE, AN ERROR RETURN OCCURS. -C IF ISTATE = 1 AND TOUT = T, JUMP TO BLOCK G AND RETURN IMMEDIATELY. -C----------------------------------------------------------------------- - IF (ISTATE .LT. 1 .OR. ISTATE .GT. 3) GO TO 601 - IF (ITASK .LT. 1 .OR. ITASK .GT. 5) GO TO 602 - IF (ISTATE .EQ. 1) GO TO 10 - IF (INIT .EQ. 0) GO TO 603 - IF (ISTATE .EQ. 2) GO TO 200 - GO TO 20 - 10 INIT = 0 - IF (TOUT .EQ. T) GO TO 430 - 20 NTREP = 0 -C----------------------------------------------------------------------- -C BLOCK B. -C THE NEXT CODE BLOCK IS EXECUTED FOR THE INITIAL CALL (ISTATE = 1), -C OR FOR A CONTINUATION CALL WITH PARAMETER CHANGES (ISTATE = 3). -C IT CONTAINS CHECKING OF ALL INPUTS AND VARIOUS INITIALIZATIONS. -C -C FIRST CHECK LEGALITY OF THE NON-OPTIONAL INPUTS NEQ, ITOL, IOPT, -C MF, ML, AND MU. -C----------------------------------------------------------------------- - IF (NEQ(1) .LE. 0) GO TO 604 - IF (ISTATE .EQ. 1) GO TO 25 - IF (NEQ(1) .NE. N) GO TO 605 - 25 N = NEQ(1) - IF (ITOL .LT. 1 .OR. ITOL .GT. 4) GO TO 606 - DO 26 I = 1,3 - 26 IF (IOPT(I) .LT. 0 .OR. IOPT(I) .GT. 1) GO TO 607 - ISOPT = IOPT(2) - IDF = IOPT(3) - NYH = N - NSV = 1 - METH = MF/10 - MITER = MF - 10*METH - IF (METH .LT. 1 .OR. METH .GT. 2) GO TO 608 - IF (MITER .LT. 0 .OR. MITER .GT. 5) GO TO 608 - IF (MITER .LE. 3) GO TO 30 - ML = IWORK(1) - MU = IWORK(2) - IF (ML .LT. 0 .OR. ML .GE. N) GO TO 609 - IF (MU .LT. 0 .OR. MU .GE. N) GO TO 610 - 30 IF (ISOPT .EQ. 0) GO TO 32 -C CHECK LEGALITY OF THE NON-OPTIONAL INPUTS ISOPT, NPAR. -C COMPUTE NUMBER OF SOLUTION VECTORS AND TOTAL NUMBER OF EQUATIONS. - IF (NEQ(2) .LE. 0) GO TO 628 - IF (ISTATE .EQ. 1) GO TO 31 - IF (NEQ(2) .NE. NPAR) GO TO 629 - 31 NPAR = NEQ(2) - NSV = NPAR + 1 - NYH = NSV * N - IF (MITER .EQ. 0 .OR. MITER .EQ. 3) GO TO 630 -C NEXT PROCESS AND CHECK THE OPTIONAL INPUTS. -------------------------- - 32 IF (IOPT(1) .EQ. 1) GO TO 40 - MAXORD = MORD(METH) - MXSTEP = MXSTP0 - MXHNIL = MXHNL0 - IF (ISTATE .EQ. 1) H0 = ZERO - HMXI = ZERO - HMIN = ZERO - GO TO 60 - 40 MAXORD = IWORK(5) - IF (MAXORD .LT. 0) GO TO 611 - IF (MAXORD .EQ. 0) MAXORD = 100 - MAXORD = MIN(MAXORD,MORD(METH)) - MXSTEP = IWORK(6) - IF (MXSTEP .LT. 0) GO TO 612 - IF (MXSTEP .EQ. 0) MXSTEP = MXSTP0 - MXHNIL = IWORK(7) - IF (MXHNIL .LT. 0) GO TO 613 - IF (MXHNIL .EQ. 0) MXHNIL = MXHNL0 - IF (ISTATE .NE. 1) GO TO 50 - H0 = RWORK(5) - IF ((TOUT - T)*H0 .LT. ZERO) GO TO 614 - 50 HMAX = RWORK(6) - IF (HMAX .LT. ZERO) GO TO 615 - HMXI = ZERO - IF (HMAX .GT. ZERO) HMXI = ONE/HMAX - HMIN = RWORK(7) - IF (HMIN .LT. ZERO) GO TO 616 -C----------------------------------------------------------------------- -C SET WORK ARRAY POINTERS AND CHECK LENGTHS LRW AND LIW. -C POINTERS TO SEGMENTS OF RWORK AND IWORK ARE NAMED BY PREFIXING L TO -C THE NAME OF THE SEGMENT. E.G., THE SEGMENT YH STARTS AT RWORK(LYH). -C SEGMENTS OF RWORK (IN ORDER) ARE DENOTED YH, WM, EWT, SAVF, ACOR. -C WORK SPACE FOR DFDP IS CONTAINED IN ACOR. -C----------------------------------------------------------------------- - 60 LYH = 21 - LWM = LYH + (MAXORD + 1)*NYH - IF (MITER .EQ. 0) LENWM = 0 - IF (MITER .EQ. 1 .OR. MITER .EQ. 2) LENWM = N*N + 2 - IF (MITER .EQ. 3) LENWM = N + 2 - IF (MITER .GE. 4) LENWM = (2*ML + MU + 1)*N + 2 - LEWT = LWM + LENWM - LSAVF = LEWT + NYH - LACOR = LSAVF + N - LDFDP = LACOR + N - LENRW = LACOR + NYH - 1 - IWORK(17) = LENRW - LIWM = 1 - LENIW = 20 + N - IF (MITER .EQ. 0 .OR. MITER .EQ. 3) LENIW = 20 - LNRS = LENIW + LIWM - IF (ISOPT .EQ. 1) LENIW = LNRS + NPAR - IWORK(18) = LENIW - IF (LENRW .GT. LRW) GO TO 617 - IF (LENIW .GT. LIW) GO TO 618 -C CHECK RTOL AND ATOL FOR LEGALITY. ------------------------------------ - RTOLI = RTOL(1) - ATOLI = ATOL(1) - DO 70 I = 1,NYH - IF (ITOL .GE. 3) RTOLI = RTOL(I) - IF (ITOL .EQ. 2 .OR. ITOL .EQ. 4) ATOLI = ATOL(I) - IF (RTOLI .LT. ZERO) GO TO 619 - IF (ATOLI .LT. ZERO) GO TO 620 - 70 CONTINUE - IF (ISTATE .EQ. 1) GO TO 100 -C IF ISTATE = 3, SET FLAG TO SIGNAL PARAMETER CHANGES TO ODESSA_STODE. - - JSTART = -1 - IF (NQ .LE. MAXORD) GO TO 90 -C MAXORD WAS REDUCED BELOW NQ. COPY YH(*,MAXORD+2) INTO SAVF. --------- - DO 80 I = 1,N - 80 RWORK(I+LSAVF-1) = RWORK(I+LWM-1) -C RELOAD WM(1) = RWORK(LWM), SINCE LWM MAY HAVE CHANGED. --------------- - 90 IF (MITER .GT. 0) RWORK(LWM) = DSQRT(UROUND) - GO TO 200 -C----------------------------------------------------------------------- -C BLOCK C. -C THE NEXT BLOCK IS FOR THE INITIAL CALL ONLY (ISTATE = 1). -C IT CONTAINS ALL REMAINING INITIALIZATIONS, THE INITIAL CALL TO F, -C THE INITIAL CALL TO ODESSA_SPRIME IF ISOPT = 1, -C AND THE CALCULATION OF THE INITIAL STEP SIZE. -C THE ERROR WEIGHTS IN EWT ARE INVERTED AFTER BEING LOADED. -C----------------------------------------------------------------------- - 100 UROUND = D1MACH(4) - TN = T - IF (ITASK .NE. 4 .AND. ITASK .NE. 5) GO TO 105 - TCRIT = RWORK(1) - IF ((TCRIT - TOUT)*(TOUT - T) .LT. ZERO) GO TO 625 - IF (H0 .NE. ZERO .AND. (T + H0 - TCRIT)*H0 .GT. ZERO) - 1 H0 = TCRIT - T - 105 JSTART = 0 - IF (MITER .GT. 0) RWORK(LWM) = DSQRT(UROUND) - NHNIL = 0 - NST = 0 - NJE = 0 - NSLAST = 0 - HU = ZERO - NQU = 0 - CCMAX = 0.3D0 - MAXCOR = 3 - IF (ISOPT .EQ. 1) MAXCOR = 4 - MSBP = 20 - MXNCF = 10 -C INITIAL CALL TO F. (LF0 POINTS TO YH(1,2) AND LOADS IN VALUES). - LF0 = LYH + NYH - CALL F (NEQ, T, Y, PAR, RWORK(LF0)) - NFE = 1 - DUPS = ZERO - DSMS = ZERO - DDNS = ZERO - NDFE = 0 - NSPE = 0 - IF (ISOPT .EQ. 0) GO TO 114 -C INITIALIZE COUNTS FOR REPEATED STEPS DUE TO SENSITIVITY ANALYSIS. - DO 110 J = 1,NSV - 110 IWORK(J + LNRS - 1) = 0 -C LOAD THE INITIAL VALUE VECTOR IN YH. --------------------------------- - 114 DO 115 I = 1,NYH - 115 RWORK(I+LYH-1) = Y(I) -C LOAD AND INVERT THE EWT ARRAY. (H IS TEMPORARILY SET TO ONE.) ------- - NQ = 1 - H = ONE - CALL ODESSA_EWSET (NYH, ITOL, RTOL, ATOL, RWORK(LYH), RWORK(LEWT)) - DO 120 I = 1,NYH - IF (RWORK(I+LEWT-1) .LE. ZERO) GO TO 621 - 120 RWORK(I+LEWT-1) = ONE/RWORK(I+LEWT-1) - IF (ISOPT .EQ. 0) GO TO 125 -C CALL ODESSA_SPRIME TO LOAD FIRST-ORDER SENSITIVITY DERIVATIVES INTO -C REMAINING YH(*,2) POSITIONS. - CALL ODESSA_SPRIME (NEQ, Y, RWORK(LYH), NYH, N, NSV, RWORK(LWM), - 1 IWORK(LIWM), RWORK(LEWT), RWORK(LF0), RWORK(LACOR), - 2 RWORK(LDFDP), PAR, F, JAC, DF, ODESSA_PREPJ, ODESSA_PREPDF) - IF (IERSP .EQ. -1) GO TO 631 - IF (IERSP .EQ. -2) GO TO 632 -C----------------------------------------------------------------------- -C THE CODING BELOW COMPUTES THE STEP SIZE, H0, TO BE ATTEMPTED ON THE -C FIRST STEP, UNLESS THE USER HAS SUPPLIED A VALUE FOR THIS. -C FIRST CHECK THAT TOUT - T DIFFERS SIGNIFICANTLY FROM ZERO. -C A SCALAR TOLERANCE QUANTITY TOL IS COMPUTED, AS MAX(RTOL(I)) -C IF THIS IS POSITIVE, OR MAX(ATOL(I)/ABS(Y(I))) OTHERWISE, ADJUSTED -C SO AS TO BE BETWEEN 100*UROUND AND 1.0E-3. ONLY THE ORIGINAL -C SOLUTION VECTOR IS CONSIDERED IN THIS CALCULATION (ISOPT = 0 OR 1). -C THEN THE COMPUTED VALUE H0 IS GIVEN BY.. -C NEQ -C H0**2 = TOL / ( W0**-2 + (1/NEQ) * SUM ( F(I)/YWT(I) )**2 ) -C 1 -C WHERE W0 = MAX ( ABS(T), ABS(TOUT) ), -C F(I) = I-TH COMPONENT OF INITIAL VALUE OF F, -C YWT(I) = EWT(I)/TOL (A WEIGHT FOR Y(I)). -C THE SIGN OF H0 IS INFERRED FROM THE INITIAL VALUES OF TOUT AND T. -C----------------------------------------------------------------------- - 125 IF (H0 .NE. ZERO) GO TO 180 - TDIST = DABS(TOUT - T) - W0 = DMAX1(DABS(T),DABS(TOUT)) - IF (TDIST .LT. TWO*UROUND*W0) GO TO 622 - TOL = RTOL(1) - IF (ITOL .LE. 2) GO TO 140 - DO 130 I = 1,N - 130 TOL = DMAX1(TOL,RTOL(I)) - 140 IF (TOL .GT. ZERO) GO TO 160 - ATOLI = ATOL(1) - DO 150 I = 1,N - IF (ITOL .EQ. 2 .OR. ITOL .EQ. 4) ATOLI = ATOL(I) - AYI = DABS(Y(I)) - IF (AYI .NE. ZERO) TOL = DMAX1(TOL,ATOLI/AYI) - 150 CONTINUE - 160 TOL = DMAX1(TOL,100.0D0*UROUND) - TOL = DMIN1(TOL,0.001D0) - SUM = ODESSA_VNORM (N, RWORK(LF0), RWORK(LEWT)) - SUM = ONE/(TOL*W0*W0) + TOL*SUM**2 - H0 = ONE/DSQRT(SUM) - H0 = MIN(H0,TDIST) - H0 = DSIGN(H0,TOUT-T) -C ADJUST H0 IF NECESSARY TO MEET HMAX BOUND. --------------------------- - 180 RH = DABS(H0)*HMXI - IF (RH .GT. ONE) H0 = H0/RH -C LOAD H WITH H0 AND SCALE YH(*,2) BY H0. ------------------------------ - H = H0 - DO 190 I = 1,NYH - 190 RWORK(I+LF0-1) = H0*RWORK(I+LF0-1) - GO TO 270 -C----------------------------------------------------------------------- -C BLOCK D. -C THE NEXT CODE BLOCK IS FOR CONTINUATION CALLS ONLY (ISTATE = 2 OR 3) -C AND IS TO CHECK STOP CONDITIONS BEFORE TAKING A STEP. -C----------------------------------------------------------------------- - 200 NSLAST = NST - GO TO (210, 250, 220, 230, 240), ITASK - 210 IF ((TN - TOUT)*H .LT. ZERO) GO TO 250 - CALL ODESSA_INTDY (TOUT, 0, RWORK(LYH), NYH, Y, IFLAG) - IF (IFLAG .NE. 0) GO TO 627 - T = TOUT - GO TO 420 - 220 TP = TN - HU*(ONE + 100.0D0*UROUND) - IF ((TP - TOUT)*H .GT. ZERO) GO TO 623 - IF ((TN - TOUT)*H .LT. ZERO) GO TO 250 - GO TO 400 - 230 TCRIT = RWORK(1) - IF ((TN - TCRIT)*H .GT. ZERO) GO TO 624 - IF ((TCRIT - TOUT)*H .LT. ZERO) GO TO 625 - IF ((TN - TOUT)*H .LT. ZERO) GO TO 245 - CALL ODESSA_INTDY (TOUT, 0, RWORK(LYH), NYH, Y, IFLAG) - IF (IFLAG .NE. 0) GO TO 627 - T = TOUT - GO TO 420 - 240 TCRIT = RWORK(1) - IF ((TN - TCRIT)*H .GT. ZERO) GO TO 624 - 245 HMX = DABS(TN) + DABS(H) - IHIT = DABS(TN - TCRIT) .LE. 100.0D0*UROUND*HMX - IF (IHIT) GO TO 400 - TNEXT = TN + H*(ONE + FOUR*UROUND) - IF ((TNEXT - TCRIT)*H .LE. ZERO) GO TO 250 - H = (TCRIT - TN)*(ONE - FOUR*UROUND) - IF (ISTATE .EQ. 2) JSTART = -2 -C----------------------------------------------------------------------- -C BLOCK E. -C THE NEXT BLOCK IS NORMALLY EXECUTED FOR ALL CALLS AND CONTAINS -C THE CALL TO THE ONE-STEP CORE INTEGRATOR ODESSA_STODE. -C -C THIS IS A LOOPING POINT FOR THE INTEGRATION STEPS. -C -C FIRST CHECK FOR TOO MANY STEPS BEING TAKEN, UPDATE EWT (IF NOT AT -C START OF PROBLEM), CHECK FOR TOO MUCH ACCURACY BEING REQUESTED, AND -C CHECK FOR H BELOW THE ROUNDOFF LEVEL IN T. -C TOLSF IS CALCULATED CONSIDERING ALL SOLUTION VECTORS. -C----------------------------------------------------------------------- - 250 CONTINUE - IF ((NST-NSLAST) .GE. MXSTEP) GO TO 500 - CALL ODESSA_EWSET (NYH, ITOL, RTOL, ATOL, RWORK(LYH), RWORK(LEWT)) - DO 260 I = 1,NYH - IF (RWORK(I+LEWT-1) .LE. ZERO) GO TO 510 - 260 RWORK(I+LEWT-1) = ONE/RWORK(I+LEWT-1) - 270 TOLSF = UROUND*ODESSA_VNORM (NYH, RWORK(LYH), RWORK(LEWT)) - IF (TOLSF .LE. ONE) GO TO 280 - TOLSF = TOLSF*2.0D0 - IF (NST .EQ. 0) GO TO 626 - GO TO 520 - 280 IF (ODESSA_ADDX(TN,H) .NE. TN) GO TO 290 - NHNIL = NHNIL + 1 - IF (NHNIL .GT. MXHNIL) GO TO 290 - CALL XERRWD ('ODESSA - WARNING..INTERNAL T (=R1) AND H (=R2) ARE', - 1 50, 101, 1, 0, 0, 0, 0, ZERO, ZERO) - CALL XERRWD - 1 ('SUCH THAT IN THE MACHINE, T + H = T ON THE NEXT STEP', - 1 52, 101, 1, 0, 0, 0, 0, ZERO, ZERO) - CALL XERRWD ('(H = STEP SIZE). SOLVER WILL CONTINUE ANYWAY', - 1 44, 101, 1, 0, 0, 0, 2, TN, H) - IF (NHNIL .LT. MXHNIL) GO TO 290 - CALL XERRWD ('ODESSA - ABOVE WARNING HAS BEEN ISSUED I1 TIMES.', - 1 48, 102, 1, 0, 0, 0, 0, ZERO, ZERO) - CALL XERRWD ('IT WILL NOT BE ISSUED AGAIN FOR THIS PROBLEM', - 1 44, 102, 1, 1, MXHNIL, 0, 0, ZERO,ZERO) - 290 CONTINUE -C----------------------------------------------------------------------- -C CALL ODESSA_STODE(NEQ,Y,YH,NYH,YH,WM,IWM,EWT,SAVF,ACOR,PAR,NRS, -C 1 F,JAC,DF,ODESSA_PREPJ,ODESSA_PREPDF,ODESSA_SOLSY) -C----------------------------------------------------------------------- - CALL ODESSA_STODE (NEQ, Y, RWORK(LYH), NYH, RWORK(LYH), - 1 RWORK(LWM), IWORK(LIWM), RWORK(LEWT), RWORK(LSAVF), - 2 RWORK(LACOR), PAR, IWORK(LNRS), F, JAC, DF, ODESSA_PREPJ, - 3 ODESSA_PREPDF, ODESSA_SOLSY) - KGO = 1 - KFLAG - GO TO (300, 530, 540, 633), KGO -C----------------------------------------------------------------------- -C BLOCK F. -C THE FOLLOWING BLOCK HANDLES THE CASE OF A SUCCESSFUL RETURN FROM THE -C CORE INTEGRATOR (KFLAG = 0). TEST FOR STOP CONDITIONS. -C----------------------------------------------------------------------- - 300 INIT = 1 - GO TO (310, 400, 330, 340, 350), ITASK -C ITASK = 1. IF TOUT HAS BEEN REACHED, INTERPOLATE. ------------------- - 310 IF ((TN - TOUT)*H .LT. ZERO) GO TO 250 - CALL ODESSA_INTDY (TOUT, 0, RWORK(LYH), NYH, Y, IFLAG) - T = TOUT - GO TO 420 -C ITASK = 3. JUMP TO EXIT IF TOUT WAS REACHED. ------------------------ - 330 IF ((TN - TOUT)*H .GE. ZERO) GO TO 400 - GO TO 250 -C ITASK = 4. SEE IF TOUT OR TCRIT WAS REACHED. ADJUST H IF NECESSARY. - 340 IF ((TN - TOUT)*H .LT. ZERO) GO TO 345 - CALL ODESSA_INTDY (TOUT, 0, RWORK(LYH), NYH, Y, IFLAG) - T = TOUT - GO TO 420 - 345 HMX = DABS(TN) + DABS(H) - IHIT = DABS(TN - TCRIT) .LE. 100.0D0*UROUND*HMX - IF (IHIT) GO TO 400 - TNEXT = TN + H*(ONE + FOUR*UROUND) - IF ((TNEXT - TCRIT)*H .LE. ZERO) GO TO 250 - H = (TCRIT - TN)*(ONE - FOUR*UROUND) - JSTART = -2 - GO TO 250 -C ITASK = 5. SEE IF TCRIT WAS REACHED AND JUMP TO EXIT. --------------- - 350 HMX = DABS(TN) + DABS(H) - IHIT = DABS(TN - TCRIT) .LE. 100.0D0*UROUND*HMX -C----------------------------------------------------------------------- -C BLOCK G. -C THE FOLLOWING BLOCK HANDLES ALL SUCCESSFUL RETURNS FROM ODESSA. -C IF ITASK .NE. 1, Y IS LOADED FROM YH AND T IS SET ACCORDINGLY. -C ISTATE IS SET TO 2, THE ILLEGAL INPUT COUNTER IS ZEROED, AND THE -C OPTIONAL OUTPUTS ARE LOADED INTO THE WORK ARRAYS BEFORE RETURNING. -C IF ISTATE = 1 AND TOUT = T, THERE IS A RETURN WITH NO ACTION TAKEN, -C EXCEPT THAT IF THIS HAS HAPPENED REPEATEDLY, THE RUN IS TERMINATED. -C----------------------------------------------------------------------- - 400 DO 410 I = 1,NYH - 410 Y(I) = RWORK(I+LYH-1) - T = TN - IF (ITASK .NE. 4 .AND. ITASK .NE. 5) GO TO 420 - IF (IHIT) T = TCRIT - 420 ISTATE = 2 - ILLIN = 0 - RWORK(11) = HU - RWORK(12) = H - RWORK(13) = TN - IWORK(11) = NST - IWORK(12) = NFE - IWORK(13) = NJE - IWORK(14) = NQU - IWORK(15) = NQ - IF (ISOPT .EQ. 0) RETURN - IWORK(19) = NDFE - IWORK(20) = NSPE - RETURN - 430 NTREP = NTREP + 1 - IF (NTREP .LT. 5) RETURN - CALL XERRWD ('ODESSA -- REPEATED CALLS WITH ISTATE = 1 AND - 1 TOUT = T (=R1)', 59, 301, 1, 0, 0, 0, 1, T, ZERO) - GO TO 800 -C----------------------------------------------------------------------- -C BLOCK H. -C THE FOLLOWING BLOCK HANDLES ALL UNSUCCESSFUL RETURNS OTHER THAN -C THOSE FOR ILLEGAL INPUT. FIRST THE ERROR MESSAGE ROUTINE IS CALLED. -C IF THERE WAS AN ERROR TEST OR CONVERGENCE TEST FAILURE, IMXER IS SET. -C THEN Y IS LOADED FROM YH, T IS SET TO TN, AND THE ILLEGAL INPUT -C COUNTER ILLIN IS SET TO 0. THE OPTIONAL OUTPUTS ARE LOADED INTO -C THE WORK ARRAYS BEFORE RETURNING. -C----------------------------------------------------------------------- -C THE MAXIMUM NUMBER OF STEPS WAS TAKEN BEFORE REACHING TOUT. ---------- - 500 CALL XERRWD ('ODESSA - AT CURRENT T (=R1), MXSTEP (=I1) STEPS', - 1 47, 201, 1, 0, 0, 0, 0, ZERO,ZERO) - CALL XERRWD ('TAKEN ON THIS CALL BEFORE REACHING TOUT', - 1 39, 201, 1, 1, MXSTEP, 0, 1, TN, ZERO) - ISTATE = -1 - GO TO 580 -C EWT(I) .LE. 0.0 FOR SOME I (NOT AT START OF PROBLEM). ---------------- - 510 EWTI = RWORK(LEWT+I-1) - CALL XERRWD ('ODESSA - AT T (=R1), EWT(I1) HAS BECOME R2 .LE. 0.', - 1 50, 202, 1, 1, I, 0, 2, TN, EWTI) - ISTATE = -6 - GO TO 580 -C TOO MUCH ACCURACY REQUESTED FOR MACHINE PRECISION. ------------------- - 520 CALL XERRWD ('ODESSA - AT T (=R1), TOO MUCH ACCURACY REQUESTED', - 1 48, 203, 1, 0, 0, 0, 0, ZERO,ZERO) - CALL XERRWD ('FOR PRECISION OF MACHINE.. SEE TOLSF (=R2)', - 1 43, 203, 1, 0, 0, 0, 2, TN, TOLSF) - RWORK(14) = TOLSF - ISTATE = -2 - GO TO 580 -C KFLAG = -1. ERROR TEST FAILED REPEATEDLY OR WITH ABS(H) = HMIN. ----- - 530 CALL XERRWD ('ODESSA - AT T(=R1) AND STEP SIZE H(=R2), THE ERROR', - 1 50, 204, 1, 0, 0, 0, 0, ZERO, ZERO) - CALL XERRWD ('TEST FAILED REPEATEDLY OR WITH ABS(H) = HMIN', - 1 44, 204, 1, 0, 0, 0, 2, TN, H) - ISTATE = -4 - GO TO 560 -C KFLAG = -2. CONVERGENCE FAILED REPEATEDLY OR WITH ABS(H) = HMIN. ---- - 540 CALL XERRWD ('ODESSA - AT T (=R1) AND STEP SIZE H (=R2), THE', - 1 46, 205, 1, 0, 0, 0, 0, ZERO,ZERO) - CALL XERRWD ('CORRECTOR CONVERGENCE FAILED REPEATEDLY', - 1 39, 205, 1, 0, 0, 0, 0, ZERO,ZERO) - CALL XERRWD ('OR WITH ABS(H) = HMIN', - 1 21, 0, 1, 0, 0, 0, 2, TN, H) - ISTATE = -5 -C COMPUTE IMXER IF RELEVANT. ------------------------------------------- - 560 BIG = ZERO - IMXER = 1 - DO 570 I = 1,NYH - SIZE = DABS(RWORK(I+LACOR-1)*RWORK(I+LEWT-1)) - IF (BIG .GE. SIZE) GO TO 570 - BIG = SIZE - IMXER = I - 570 CONTINUE - IWORK(16) = IMXER -C SET Y VECTOR, T, ILLIN, AND OPTIONAL OUTPUTS. ------------------------ - 580 DO 590 I = 1,NYH - 590 Y(I) = RWORK(I+LYH-1) - T = TN - ILLIN = 0 - RWORK(11) = HU - RWORK(12) = H - RWORK(13) = TN - IWORK(11) = NST - IWORK(12) = NFE - IWORK(13) = NJE - IWORK(14) = NQU - IWORK(15) = NQ - IF (ISOPT .EQ. 0) RETURN - IWORK(19) = NDFE - IWORK(20) = NSPE - RETURN -C----------------------------------------------------------------------- -C BLOCK I. -C THE FOLLOWING BLOCK HANDLES ALL ERROR RETURNS DUE TO ILLEGAL INPUT -C (ISTATE = -3), AS DETECTED BEFORE CALLING THE CORE INTEGRATOR. -C FIRST THE ERROR MESSAGE ROUTINE IS CALLED. THEN IF THERE HAVE BEEN -C 5 CONSECUTIVE SUCH RETURNS JUST BEFORE THIS CALL TO THE SOLVER, -C THE RUN IS HALTED. -C----------------------------------------------------------------------- - 601 CALL XERRWD ('ODESSA - ISTATE (=I1) ILLEGAL', - 1 29, 1, 1, 1, ISTATE, 0, 0, ZERO,ZERO) - GO TO 700 - 602 CALL XERRWD ('ODESSA - ITASK (=I1) ILLEGAL', - 1 28, 2, 1, 1, ITASK, 0, 0, ZERO,ZERO) - GO TO 700 - 603 CALL XERRWD ('ODESSA - ISTATE .GT. 1 BUT ODESSA NOT INITIALIZED', - 1 49, 3, 1, 0, 0, 0, 0, ZERO,ZERO) - GO TO 700 - 604 CALL XERRWD ('ODESSA - NEQ (=I1) .LT. 1', - 1 25, 4, 1, 1, NEQ(1), 0, 0, ZERO,ZERO) - GO TO 700 - 605 CALL XERRWD ('ODESSA - ISTATE = 3 AND NEQ CHANGED. (I1 TO I2)', - 1 48, 5, 1, 2, N, NEQ(1), 0, ZERO,ZERO) - GO TO 700 - 606 CALL XERRWD ('ODESSA - ITOL (=I1) ILLEGAL', - 1 27, 6, 1, 1, ITOL, 0, 0, ZERO,ZERO) - GO TO 700 - 607 CALL XERRWD ('ODESSA - IOPT (=I1) ILLEGAL', - 1 27, 7, 1, 1, IOPT, 0, 0, ZERO,ZERO) - GO TO 700 - 608 CALL XERRWD('ODESSA - MF (=I1) ILLEGAL', - 1 25, 8, 1, 1, MF, 0, 0, ZERO,ZERO) - GO TO 700 - 609 CALL XERRWD('ODESSA - ML (=I1) ILLEGAL.. .LT.0 OR .GE.NEQ (=I2)', - 1 50, 9, 1, 2, ML, NEQ(1), 0, ZERO,ZERO) - GO TO 700 - 610 CALL XERRWD('ODESSA - MU (=I1) ILLEGAL.. .LT.0 OR .GE.NEQ (=I2)', - 1 50, 10, 1, 2, MU, NEQ(1), 0, ZERO,ZERO) - GO TO 700 - 611 CALL XERRWD('ODESSA - MAXORD (=I1) .LT. 0', - 1 28, 11, 1, 1, MAXORD, 0, 0, ZERO,ZERO) - GO TO 700 - 612 CALL XERRWD('ODESSA - MXSTEP (=I1) .LT. 0', - 1 28, 12, 1, 1, MXSTEP, 0, 0, ZERO,ZERO) - GO TO 700 - 613 CALL XERRWD('ODESSA - MXHNIL (=I1) .LT. 0', - 1 28, 13, 1, 1, MXHNIL, 0, 0, ZERO,ZERO) - GO TO 700 - 614 CALL XERRWD('ODESSA - TOUT (=R1) BEHIND T (=R2)', - 1 34, 14, 1, 0, 0, 0, 2, TOUT, T) - CALL XERRWD('INTEGRATION DIRECTION IS GIVEN BY H0 (=R1)', - 1 42, 14, 1, 0, 0, 0, 1, H0, ZERO) - GO TO 700 - 615 CALL XERRWD('ODESSA - HMAX (=R1) .LT. 0.0', - 1 28, 15, 1, 0, 0, 0, 1, HMAX, ZERO) - GO TO 700 - 616 CALL XERRWD('ODESSA - HMIN (=R1) .LT. 0.0', - 1 28, 16, 1, 0, 0, 0, 1, HMIN, ZERO) - GO TO 700 - 617 CALL XERRWD('ODESSA - RWORK LENGTH NEEDED, LENRW (=I1), EXCEEDS - 1 LRW (=I2)', 60, 17, 1, 2, LENRW, LRW, 0, ZERO,ZERO) - GO TO 700 - 618 CALL XERRWD('ODESSA - IWORK LENGTH NEEDED, LENIW (=I1), EXCEEDS - 1 LIW (=I2)', 60, 18, 1, 2, LENIW, LIW, 0, ZERO,ZERO) - GO TO 700 - 619 CALL XERRWD('ODESSA - RTOL(I1) IS R1 .LT. 0.0', - 1 32, 19, 1, 1, I, 0, 1, RTOLI, ZREO) - GO TO 700 - 620 CALL XERRWD('ODESSA - ATOL(I1) IS R1 .LT. 0.0', - 1 32, 20, 1, 1, I, 0, 1, ATOLI, ZERO) - GO TO 700 -* - 621 EWTI = RWORK(LEWT+I-1) - CALL XERRWD('ODESSA - EWT(I1) IS R1 .LE. 0.0', - 1 31, 21, 1, 1, I, 0, 1, EWTI, ZERO) - GO TO 700 - 622 CALL XERRWD('ODESSA - TOUT (=R1) TOO CLOSE TO T(=R2) TO START - 1 INTEGRATION', 60, 22, 1, 0, 0, 0, 2, TOUT, T) - GO TO 700 - 623 CALL XERRWD('ODESSA - ITASK = I1 AND TOUT (=R1) BEHIND TCUR - HU - 1 (= R2)', 58, 23, 1, 1, ITASK, 0, 2, TOUT, TP) - GO TO 700 - 624 CALL XERRWD('ODESSA - ITASK = 4 OR 5 AND TCRIT (=R1) BEHIND TCUR - 1 (=R2)', 57, 24, 1, 0, 0, 0, 2, TCRIT, TN) - GO TO 700 - 625 CALL XERRWD('ODESSA - ITASK = 4 OR 5 AND TCRIT (=R1) BEHIND TOUT - 1 (=R2)', 57, 25, 1, 0, 0, 0, 2, TCRIT, TOUT) - GO TO 700 - 626 CALL XERRWD('ODESSA - AT START OF PROBLEM, TOO MUCH ACCURACY', - 1 47, 26, 1, 0, 0, 0, 0, ZERO,ZERO) - CALL XERRWD('REQUESTED FOR PRECISION OF MACHINE. SEE TOLSF (=R1)', - 1 51, 26, 1, 0, 0, 0, 1, TOLSF, ZERO) - RWORK(14) = TOLSF - GO TO 700 - 627 CALL XERRWD - 1 ('ODESSA - TROUBLE FROM ODESSA_INTDY. ITASK = I1, TOUT = R1', - 1 57, 27, 1, 1, ITASK, 0, 1, TOUT, ZERO) - GO TO 700 -C ERROR STATEMENTS ASSOCIATED WITH SENSITIVITY ANALYSIS. - 628 CALL XERRWD('ODESSA - NPAR (=I1) .LT. 1', - 1 26, 28, 1, 1, NPAR, 0, 0, ZERO,ZERO) - GO TO 700 - 629 CALL XERRWD('ODESSA - ISTATE = 3 AND NPAR CHANGED (I1 TO I2)', - 1 47, 29, 1, 2, NP, NPAR, 0, ZERO,ZERO) - GO TO 700 - 630 CALL XERRWD('ODESSA - MITER (=I1) ILLEGAL', - 1 28, 30, 1, 1, MITER, 0, 0, ZERO,ZERO) - GO TO 700 - 631 CALL XERRWD('ODESSA - TROUBLE IN ODESSA_SPRIME (IERPJ)', - 1 41, 31, 1, 0, 0, 0, 0, ZERO,ZERO) - GO TO 700 - 632 CALL XERRWD('ODESSA - TROUBLE IN ODESSA_SPRIME (MITER)', - 1 41, 32, 1, 0, 0, 0, 0, ZERO,ZERO) - GO TO 700 - 633 CALL XERRWD('ODESSA - FATAL ERROR IN ODESSA_STODE (KFLAG = -3)', - 1 49, 33, 2, 0, 0, 0, 0, ZERO,ZERO) - GO TO 801 -C - 700 IF (ILLIN .EQ. 5) GO TO 710 - ILLIN = ILLIN + 1 - ISTATE = -3 - RETURN - 710 CALL XERRWD('ODESSA - REPEATED OCCURRENCES OF ILLEGAL INPUT', - 1 46, 302, 1, 0, 0, 0, 0, ZERO,ZERO) -C - 800 CALL XERRWD('ODESSA - RUN ABORTED.. APPARENT INFINITE LOOP', - 1 45, 303, 2, 0, 0, 0, 0, ZERO,ZERO) - RETURN - 801 CALL XERRWD('ODESSA - RUN ABORTED', - 1 20, 304, 2, 0, 0, 0, 0, ZERO,ZERO) - RETURN -C-------------------- END OF SUBROUTINE ODESSA ------------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_addx.f --- a/libcruft/odessa/odessa_addx.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ - DOUBLE PRECISION FUNCTION ODESSA_ADDX(A,B) - DOUBLE PRECISION A,B -C -C THIS FUNCTION IS NECESSARY TO FORCE OPTIMIZING COMPILERS TO -C EXECUTE AND STORE A SUM, FOR SUCCESSFUL EXECUTION OF THE -C TEST A + B = B. -C - ODESSA_ADDX = A + B - RETURN -C-------------------- END OF FUNCTION SUM ------------------------------ - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_cfode.f --- a/libcruft/odessa/odessa_cfode.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ - SUBROUTINE ODESSA_CFODE (METH, ELCO, TESCO) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION ELCO(13,12), TESCO(3,12) -C----------------------------------------------------------------------- -C ODESSA_CFODE IS CALLED BY THE INTEGRATOR ROUTINE TO SET COEFFICIENTS -C NEEDED THERE. THE COEFFICIENTS FOR THE CURRENT METHOD, AS -C GIVEN BY THE VALUE OF METH, ARE SET FOR ALL ORDERS AND SAVED. -C THE MAXIMUM ORDER ASSUMED HERE IS 12 IF METH = 1 AND 5 IF METH = 2. -C (A SMALLER VALUE OF THE MAXIMUM ORDER IS ALSO ALLOWED.) -C ODESSA_CFODE IS CALLED ONCE AT THE BEGINNING OF THE PROBLEM, -C AND IS NOT CALLED AGAIN UNLESS AND UNTIL METH IS CHANGED. -C -C THE ELCO ARRAY CONTAINS THE BASIC METHOD COEFFICIENTS. -C THE COEFFICIENTS EL(I), 1 .LE. I .LE. NQ+1, FOR THE METHOD OF -C ORDER NQ ARE STORED IN ELCO(I,NQ). THEY ARE GIVEN BY A GENETRATING -C POLYNOMIAL, I.E., -C L(X) = EL(1) + EL(2)*X + ... + EL(NQ+1)*X**NQ. -C FOR THE IMPLICIT ADAMS METHODS, L(X) IS GIVEN BY -C DL/DX = (X+1)*(X+2)*...*(X+NQ-1)/FACTORIAL(NQ-1), L(-1) = 0. -C FOR THE BDF METHODS, L(X) IS GIVEN BY -C L(X) = (X+1)*(X+2)* ... *(X+NQ)/K, -C WHERE K = FACTORIAL(NQ)*(1 + 1/2 + ... + 1/NQ). -C -C THE TESCO ARRAY CONTAINS TEST CONSTANTS USED FOR THE -C LOCAL ERROR TEST AND THE SELECTION OF STEP SIZE AND/OR ORDER. -C AT ORDER NQ, TESCO(K,NQ) IS USED FOR THE SELECTION OF STEP -C SIZE AT ORDER NQ - 1 IF K = 1, AT ORDER NQ IF K = 2, AND AT ORDER -C NQ + 1 IF K = 3. -C----------------------------------------------------------------------- - DIMENSION PC(12) - PARAMETER (ONE=1.0D0,ZERO=0.0D0) -C - GO TO (100, 200), METH -C - 100 ELCO(1,1) = ONE - ELCO(2,1) = ONE - TESCO(1,1) = ZERO - TESCO(2,1) = 2.0D0 - TESCO(1,2) = ONE - TESCO(3,12) = ZERO - PC(1) = ONE - RQFAC = ONE - DO 140 NQ = 2,12 -C----------------------------------------------------------------------- -C THE PC ARRAY WILL CONTAIN THE COEFFICIENTS OF THE POLYNOMIAL -C P(X) = (X+1)*(X+2)*...*(X+NQ-1). -C INITIALLY, P(X) = 1. -C----------------------------------------------------------------------- - RQ1FAC = RQFAC - RQFAC = RQFAC/DBLE(NQ) - NQM1 = NQ - 1 - FNQM1 = DBLE(NQM1) - NQP1 = NQ + 1 -C FORM COEFFICIENTS OF P(X)*(X+NQ-1). ---------------------------------- - PC(NQ) = ZERO - DO 110 IB = 1,NQM1 - I = NQP1 - IB - 110 PC(I) = PC(I-1) + FNQM1*PC(I) - PC(1) = FNQM1*PC(1) -C COMPUTE INTEGRAL, -1 TO 0, OF P(X) AND X*P(X). ----------------------- - PINT = PC(1) - XPIN = PC(1)/2.0D0 - TSIGN = ONE - DO 120 I = 2,NQ - TSIGN = -TSIGN - PINT = PINT + TSIGN*PC(I)/DBLE(I) - 120 XPIN = XPIN + TSIGN*PC(I)/DBLE(I+1) -C STORE COEFFICIENTS IN ELCO AND TESCO. -------------------------------- - ELCO(1,NQ) = PINT*RQ1FAC - ELCO(2,NQ) = ONE - DO 130 I = 2,NQ - 130 ELCO(I+1,NQ) = RQ1FAC*PC(I)/DBLE(I) - AGAMQ = RQFAC*XPIN - RAGQ = ONE/AGAMQ - TESCO(2,NQ) = RAGQ - IF (NQ .LT. 12) TESCO(1,NQP1) = RAGQ*RQFAC/DBLE(NQP1) - TESCO(3,NQM1) = RAGQ - 140 CONTINUE - RETURN -C - 200 PC(1) = ONE - RQ1FAC = ONE - DO 230 NQ = 1,5 -C----------------------------------------------------------------------- -C THE PC ARRAY WILL CONTAIN THE COEFFICIENTS OF THE POLYNOMIAL -C P(X) = (X+1)*(X+2)*...*(X+NQ). -C INITIALLY, P(X) = 1. -C----------------------------------------------------------------------- - FNQ = DBLE(NQ) - NQP1 = NQ + 1 -C FORM COEFFICIENTS OF P(X)*(X+NQ). ------------------------------------ - PC(NQP1) = ZERO - DO 210 IB = 1,NQ - I = NQ + 2 - IB - 210 PC(I) = PC(I-1) + FNQ*PC(I) - PC(1) = FNQ*PC(1) -C STORE COEFFICIENTS IN ELCO AND TESCO. -------------------------------- - DO 220 I = 1,NQP1 - 220 ELCO(I,NQ) = PC(I)/PC(2) - ELCO(2,NQ) = ONE - TESCO(1,NQ) = RQ1FAC - TESCO(2,NQ) = DBLE(NQP1)/ELCO(1,NQ) - TESCO(3,NQ) = DBLE(NQ+2)/ELCO(1,NQ) - RQ1FAC = RQ1FAC/FNQ - 230 CONTINUE - RETURN -C----------------------- END OF SUBROUTINE ODESSA_CFODE ----------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_ewset.f --- a/libcruft/odessa/odessa_ewset.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ - SUBROUTINE ODESSA_EWSET (N, ITOL, RTOL, ATOL, YCUR, EWT) -C----------------------------------------------------------------------- -C THIS SUBROUTINE SETS THE ERROR WEIGHT VECTOR EWT ACCORDING TO -C EWT(I) = RTOL(I)*ABS(YCUR(I)) + ATOL(I), I = 1,...,N, -C WITH THE SUBSCRIPT ON RTOL AND/OR ATOL POSSIBLY REPLACED BY 1 ABOVE, -C DEPENDING ON THE VALUE OF ITOL. -C----------------------------------------------------------------------- - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION RTOL(*), ATOL(*), YCUR(N), EWT(N) - RTOLI = RTOL(1) - ATOLI = ATOL(1) - DO 10 I = 1,N - IF (ITOL .GE. 3) RTOLI = RTOL(I) - IF (ITOL .EQ. 2 .OR. ITOL .EQ. 4) ATOLI = ATOL(I) - EWT(I) = RTOLI*DABS(YCUR(I)) + ATOLI - 10 CONTINUE - RETURN -C----------------------- END OF SUBROUTINE ODESSA_EWSET ----------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_intdy.f --- a/libcruft/odessa/odessa_intdy.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ - SUBROUTINE ODESSA_INTDY (T, K, YH, NYH, DKY, IFLAG) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION YH(NYH,1), DKY(1) - COMMON /ODE001/ ROWND, ROWNS(173), - 2 RDUM1(38),H, RDUM2(2), HU, RDUM3, TN, UROUND, - 3 IOWND(14), IOWNS(4), - 4 IDUM1(8), L, IDUM2, - 5 IDUM3(5), N, NQ, IDUM4(4) -C----------------------------------------------------------------------- -C ODESSA_INTDY COMPUTES INTERPOLATED VALUES OF THE K-TH DERIVATIVE OF THE -C DEPENDENT VARIABLE VECTOR Y, AND STORES IT IN DKY. THIS ROUTINE -C IS CALLED WITHIN THE PACKAGE WITH K = 0 AND T = TOUT, BUT MAY -C ALSO BE CALLED BY THE USER FOR ANY K UP TO THE CURRENT ORDER. -C (SEE DETAILED INSTRUCTIONS IN THE USAGE DOCUMENTATION.) -C----------------------------------------------------------------------- -C THE COMPUTED VALUES IN DKY ARE GOTTEN BY INTERPOLATION USING THE -C NORDSIECK HISTORY ARRAY YH. THIS ARRAY CORRESPONDS UNIQUELY TO A -C VECTOR-VALUED POLYNOMIAL OF DEGREE NQCUR OR LESS, AND DKY IS SET -C TO THE K-TH DERIVATIVE OF THIS POLYNOMIAL AT T. -C THE FORMULA FOR DKY IS.. -C Q -C DKY(I) = SUM C(J,K) * (T - TN)**(J-K) * H**(-J) * YH(I,J+1) -C J=K -C WHERE C(J,K) = J*(J-1)*...*(J-K+1), Q = NQCUR, TN = TCUR, H = HCUR. -C THE QUANTITIES NQ = NQCUR, L = NQ+1, N = NEQ, TN, AND H ARE -C COMMUNICATED BY COMMON. THE ABOVE SUM IS DONE IN REVERSE ORDER. -C IFLAG IS RETURNED NEGATIVE IF EITHER K OR T IS OUT OF BOUNDS. -C----------------------------------------------------------------------- - IFLAG = 0 - IF (K .LT. 0 .OR. K .GT. NQ) GO TO 80 - TP = TN - HU*(1.0D0 + 100.0D0*UROUND) - IF ((T-TP)*(T-TN) .GT. 0.0D0) GO TO 90 -C - S = (T - TN)/H - IC = 1 - IF (K .EQ. 0) GO TO 15 - JJ1 = L - K - DO 10 JJ = JJ1,NQ - 10 IC = IC*JJ - 15 C = DBLE(IC) - DO 20 I = 1,NYH - 20 DKY(I) = C*YH(I,L) - IF (K .EQ. NQ) GO TO 55 - JB2 = NQ - K - DO 50 JB = 1,JB2 - J = NQ - JB - JP1 = J + 1 - IC = 1 - IF (K .EQ. 0) GO TO 35 - JJ1 = JP1 - K - DO 30 JJ = JJ1,J - 30 IC = IC*JJ - 35 C = DBLE(IC) - DO 40 I = 1,NYH - 40 DKY(I) = C*YH(I,JP1) + S*DKY(I) - 50 CONTINUE - IF (K .EQ. 0) RETURN - 55 R = H**(-K) - DO 60 I = 1,NYH - 60 DKY(I) = R*DKY(I) - RETURN -C - 80 CALL XERRWD('ODESSA_INTDY-- K (=I1) ILLEGAL', - 1 31, 51, 1, 1, K, 0, 0, ZERO,ZERO) - IFLAG = -1 - RETURN - 90 CALL XERRWD ('ODESSA_INTDY-- T (=R1) ILLEGAL', - 1 31, 52, 1, 0, 0, 0, 1, T, ZERO) - CALL XERRWD('T NOT IN INTERVAL TCUR - HU (= R1) TO TCUR (=R2)', - 1 48, 52, 1, 0, 0, 0, 2, TP, TN) - IFLAG = -2 - RETURN -C------------------ END OF SUBROUTINE ODESSA_INTDY ----------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_prepd.f --- a/libcruft/odessa/odessa_prepd.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ - SUBROUTINE ODESSA_PREPDF (NEQ, Y, SRUR, SAVF, FTEM, DFDP, PAR, - 1 F, DF, JPAR) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - EXTERNAL F, DF - DIMENSION NEQ(*), Y(*), SAVF(*), FTEM(*), DFDP(*), PAR(*) - COMMON /ODE001/ ROWND, ROWNS(173), - 1 RDUM1(43), TN, RDUM2, - 2 IOWND1(14), IOWNS(4), - 3 IDUM1(10), MITER, IDUM2(4), N, IDUM3(2), NFE, IDUM4(2) - COMMON /ODE002/ RDUM3(3), - 1 IOWND2(3), IDUM5(2), NDFE, IDUM6, IDF, IDUM7(3) -C----------------------------------------------------------------------- -C ODESSA_PREPDF IS CALLED BY ODESSA_SPRIME AND ODESSA_STESA TO COMPUTE -C THE INHOMOGENEITY VECTORS DF(I)/DP(JPAR). HERE DF/DP IS COMPUTED BY -C THE USER-SUPPLIED ROUTINE DF IF IDF = 1, OR BY FINITE DIFFERENCING IF -C IDF = 0. -C -C IN ADDITION TO VARIABLES DESCRIBED PREVIOUSLY, COMMUNICATION WITH -C ODESSA_PREPDF USES THE FOLLOWING.. -C Y = REAL ARRAY OF LENGTH NYH CONTAINING DEPENDENT VARIABLES. -C ODESSA_PREPDF USES ONLY THE FIRST N ENTRIES OF Y(*). -C SRUR = SQRT(UROUND) (= WM(1)). -C SAVF = REAL ARRAY OF LENGTH N CONTAINING DERIVATIVES DY/DT. -C FTEM = REAL ARRAY OF LENGTH N USED TO TEMPORARILY STORE DY/DT FOR -C NUMERICAL DIFFERENTIATION. -C DFDP = REAL ARRAY OF LENGTH N USED TO STORE DF(I)/DP(JPAR), I = 1,N. -C PAR = REAL ARRAY OF LENGTH NPAR CONTAINING EQUATION PARAMETERS -C OF INTEREST. -C JPAR = INPUT PARAMETER, 2 .LE. JPAR .LE. NSV, DESIGNATING THE -C APPROPRIATE SOLUTION VECTOR CORRESPONDING TO PAR(JPAR). -C THIS ROUTINE ALSO USES THE COMMON VARIABLES TN, MITER, N, NFE, NDFE, -C AND IDF. -C----------------------------------------------------------------------- - NDFE = NDFE + 1 - IDF1 = IDF + 1 - GO TO (100, 200), IDF1 -C IDF = 0, CALL F TO APPROXIMATE DFDP. --------------------------------- - 100 RPAR = PAR(JPAR) - R = DMAX1(SRUR*DABS(RPAR),SRUR) - PAR(JPAR) = RPAR + R - FAC = 1.0D0/R - CALL F (NEQ, TN, Y, PAR, FTEM) - DO 110 I = 1,N - 110 DFDP(I) = (FTEM(I) - SAVF(I))*FAC - PAR(JPAR) = RPAR - NFE = NFE + 1 - RETURN -C IDF = 1, CALL USER SUPPLIED DF. -------------------------------------- - 200 DO 210 I = 1,N - 210 DFDP(I) = 0.0D0 - CALL DF (NEQ, TN, Y, PAR, DFDP, JPAR) - RETURN -C -------------------- END OF SUBROUTINE ODESSA_PREPDF ------------------------ - END - - - - - - - - - diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_prepj.f --- a/libcruft/odessa/odessa_prepj.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,166 +0,0 @@ - SUBROUTINE ODESSA_PREPJ (NEQ, Y, YH, NYH, WM, IWM, EWT, SAVF, - 1 FTEM, PAR, F, JAC, JOPT) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION NEQ(*), Y(*), YH(NYH,*), WM(*), IWM(*), EWT(*), - 1 SAVF(*), FTEM(*), PAR(*) - EXTERNAL F, JAC - PARAMETER (ZERO=0.0D0,ONE=1.0D0) - COMMON /ODE001/ ROWND, ROWNS(173), - 2 RDUM1(37), EL0, H, RDUM2(4), TN, UROUND, - 3 IOWND(14), IOWNS(4), - 4 IDUM1(3), IERPJ, IDUM2, JCUR, IDUM3(4), - 5 MITER, IDUM4(4), N, IDUM5(2), NFE, NJE, IDUM6 -C----------------------------------------------------------------------- -C ODESSA_PREPJ IS CALLED BY ODESSA_STODE TO COMPUTE AND PROCESS THE MATRIX -C P = I - H*EL(1)*J , WHERE J IS AN APPROXIMATION TO THE JACOBIAN. -C IF ISOPT = 1, ODESSA_PREPJ IS ALSO CALLED BY ODESSA_SPRIME WITH JOPT = 1. -C HERE J IS COMPUTED BY THE USER-SUPPLIED ROUTINE JAC IF -C MITER = 1 OR 4, OR BY FINITE DIFFERENCING IF MITER = 2, 3, OR 5. -C IF MITER = 3, A DIAGONAL APPROXIMATION TO J IS USED. -C J IS STORED IN WM AND REPLACED BY P. IF MITER .NE. 3, P IS THEN -C SUBJECTED TO LU DECOMPOSITION (JOPT = 0) IN PREPARATION FOR LATER -C SOLUTION OF LINEAR SYSTEMS WITH P AS COEFFICIENT MATRIX. THIS IS -C DONE BY DGETRF IF MITER = 1 OR 2, AND BY DGBTRF IF MITER = 4 OR 5. -C -C IN ADDITION TO VARIABLES DESCRIBED PREVIOUSLY, COMMUNICATION -C WITH ODESSA_PREPJ USES THE FOLLOWING.. -C Y = ARRAY CONTAINING PREDICTED VALUES ON ENTRY. -C FTEM = WORK ARRAY OF LENGTH N (ACOR IN ODESSA_STODE). -C SAVF = ARRAY CONTAINING F EVALUATED AT PREDICTED Y. -C WM = REAL WORK SPACE FOR MATRICES. ON OUTPUT IT CONTAINS THE -C INVERSE DIAGONAL MATRIX IF MITER = 3 AND THE LU DECOMPOSITION -C OF P IF MITER IS 1, 2 , 4, OR 5. -C STORAGE OF MATRIX ELEMENTS STARTS AT WM(3). -C WM ALSO CONTAINS THE FOLLOWING MATRIX-RELATED DATA.. -C WM(1) = SQRT(UROUND), USED IN NUMERICAL JACOBIAN INCREMENTS. -C WM(2) = H*EL0, SAVED FOR LATER USE IF MITER = 3. -C IWM = INTEGER WORK SPACE CONTAINING PIVOT INFORMATION, STARTING AT -C IWM(21), IF MITER IS 1, 2, 4, OR 5. IWM ALSO CONTAINS BAND -C PARAMETERS ML = IWM(1) AND MU = IWM(2) IF MITER IS 4 OR 5. -C EL0 = EL(1) (INPUT). -C IERPJ = OUTPUT ERROR FLAG, = 0 IF NO TROUBLE, .GT. 0 IF -C P MATRIX FOUND TO BE SINGULAR. -C JCUR = OUTPUT FLAG = 1 TO INDICATE THAT THE JACOBIAN MATRIX -C (OR APPROXIMATION) IS NOW CURRENT. -C JOPT = INPUT JACOBIAN OPTION, = 1 IF JAC IS DESIRED ONLY. -C THIS ROUTINE ALSO USES THE COMMON VARIABLES EL0, H, TN, UROUND, -C IERPJ, JCUR, MITER, N, NFE, AND NJE. -C----------------------------------------------------------------------- - NJE = NJE + 1 - IERPJ = 0 - JCUR = 1 - HL0 = H*EL0 - GO TO (100, 200, 300, 400, 500), MITER -C IF MITER = 1, CALL JAC AND MULTIPLY BY SCALAR. ----------------------- - 100 LENP = N*N - DO 110 I = 1,LENP - 110 WM(I+2) = ZERO - CALL JAC (NEQ, TN, Y, PAR, 0, 0, WM(3), N) - IF (JOPT .EQ. 1) RETURN - CON = -HL0 - DO 120 I = 1,LENP - 120 WM(I+2) = WM(I+2)*CON - GO TO 240 -C IF MITER = 2, MAKE N CALLS TO F TO APPROXIMATE J. -------------------- - 200 FAC = ODESSA_VNORM (N, SAVF, EWT) - R0 = 1000.0D0*DABS(H)*UROUND*DBLE(N)*FAC - IF (R0 .EQ. ZERO) R0 = ONE - SRUR = WM(1) - J1 = 2 - DO 230 J = 1,N - YJ = Y(J) - R = DMAX1(SRUR*DABS(YJ),R0/EWT(J)) - Y(J) = Y(J) + R - FAC = -HL0/R - CALL F (NEQ, TN, Y, PAR, FTEM) - DO 220 I = 1,N - 220 WM(I+J1) = (FTEM(I) - SAVF(I))*FAC - Y(J) = YJ - J1 = J1 + N - 230 CONTINUE - NFE = NFE + N - IF (JOPT .EQ. 1) RETURN -C ADD IDENTITY MATRIX. ------------------------------------------------- - 240 J = 3 - DO 250 I = 1,N - WM(J) = WM(J) + ONE - 250 J = J + (N + 1) -C DO LU DECOMPOSITION ON P. -------------------------------------------- - CALL DGETRF ( N, N, WM(3), N, IWM(21), IER) - IF (IER .NE. 0) IERPJ = 1 - RETURN -C IF MITER = 3, CONSTRUCT A DIAGONAL APPROXIMATION TO J AND P. --------- - 300 WM(2) = HL0 - R = EL0*0.1D0 - DO 310 I = 1,N - 310 Y(I) = Y(I) + R*(H*SAVF(I) - YH(I,2)) - CALL F (NEQ, TN, Y, PAR, WM(3)) - NFE = NFE + 1 - DO 320 I = 1,N - R0 = H*SAVF(I) - YH(I,2) - DI = 0.1D0*R0 - H*(WM(I+2) - SAVF(I)) - WM(I+2) = 1.0D0 - IF (DABS(R0) .LT. UROUND/EWT(I)) GO TO 320 - IF (DABS(DI) .EQ. ZERO) GO TO 330 - WM(I+2) = 0.1D0*R0/DI - 320 CONTINUE - RETURN - 330 IERPJ = 1 - RETURN -C IF MITER = 4, CALL JAC AND MULTIPLY BY SCALAR. ----------------------- - 400 ML = IWM(1) - MU = IWM(2) - ML3 = ML + 3 - MBAND = ML + MU + 1 - MEBAND = MBAND + ML - LENP = MEBAND*N - DO 410 I = 1,LENP - 410 WM(I+2) = ZERO - CALL JAC (NEQ, TN, Y, PAR, ML, MU, WM(ML3), MEBAND) - IF (JOPT .EQ. 1) RETURN - CON = -HL0 - DO 420 I = 1,LENP - 420 WM(I+2) = WM(I+2)*CON - GO TO 570 -C IF MITER = 5, MAKE MBAND CALLS TO F TO APPROXIMATE J. ---------------- - 500 ML = IWM(1) - MU = IWM(2) - MBAND = ML + MU + 1 - MBA = MIN0(MBAND,N) - MEBAND = MBAND + ML - MEB1 = MEBAND - 1 - SRUR = WM(1) - FAC = ODESSA_VNORM (N, SAVF, EWT) - R0 = 1000.0D0*DABS(H)*UROUND*DBLE(N)*FAC - IF (R0 .EQ. ZERO) R0 = ONE - DO 560 J = 1,MBA - DO 530 I = J,N,MBAND - YI = Y(I) - R = DMAX1(SRUR*DABS(YI),R0/EWT(I)) - 530 Y(I) = Y(I) + R - CALL F (NEQ, TN, Y, PAR, FTEM) - DO 550 JJ = J,N,MBAND - Y(JJ) = YH(JJ,1) - YJJ = Y(JJ) - R = DMAX1(SRUR*DABS(YJJ),R0/EWT(JJ)) - FAC = -HL0/R - I1 = MAX0(JJ-MU,1) - I2 = MIN0(JJ+ML,N) - II = JJ*MEB1 - ML + 2 - DO 540 I = I1,I2 - 540 WM(II+I) = (FTEM(I) - SAVF(I))*FAC - 550 CONTINUE - 560 CONTINUE - NFE = NFE + MBA - IF (JOPT .EQ. 1) RETURN -C ADD IDENTITY MATRIX. ------------------------------------------------- - 570 II = MBAND + 2 - DO 580 I = 1,N - WM(II) = WM(II) + ONE - 580 II = II + MEBAND -C DO LU DECOMPOSITION OF P. -------------------------------------------- - CALL DGBTRF ( N, N, ML, MU, WM(3), MEBAND, IWM(21), IER) - IF (IER .NE. 0) IERPJ = 1 - RETURN -C---------------- END OF SUBROUTINE ODESSA_PREPJ ----------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_rscom.f --- a/libcruft/odessa/odessa_rscom.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ - SUBROUTINE ODESSA_RSCOM (RSAV, ISAV) -C----------------------------------------------------------------------- -C THIS ROUTINE RESTORES FROM RSAV AND ISAV THE CONTENTS OF COMMON BLOCKS -C ODE001 AND ODE002, WHICH ARE USED INTERNALLY IN THE ODESSSA -C PACKAGE. THIS PRESUMES THAT RSAV AND ISAV WERE LOADED BY MEANS -C OF SUBROUTINE ODESSA_SVCOM OR THE EQUIVALENT. -C----------------------------------------------------------------------- - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION RSAV(*), ISAV(*) - COMMON /ODE001/ RODE1(219), IODE1(39) - COMMON /ODE002/ RODE2(3), IODE2(11) - DATA LRODE1/219/, LIODE1/39/, LRODE2/3/, LIODE2/11/ -C - DO 10 I = 1,LRODE1 - 10 RODE1(I) = RSAV(I) - DO 20 I = 1,LRODE2 - J = LRODE1 + I - 20 RODE2(I) = RSAV(J) - DO 30 I = 1,LIODE1 - 30 IODE1(I) = ISAV(I) - DO 40 I = 1,LIODE2 - J = LIODE1 + I - 40 IODE2(I) = ISAV(J) - RETURN -C----------------------- END OF SUBROUTINE ODESSA_RSCOM ----------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_solsy.f --- a/libcruft/odessa/odessa_solsy.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ - SUBROUTINE ODESSA_SOLSY (WM, IWM, X, TEM) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION WM(*), IWM(*), X(*), TEM(*) - PARAMETER (ZERO=0.0D0,ONE=1.0D0) - COMMON /ODE001/ ROWND, ROWNS(173), - 2 RDUM1(37), EL0, H, RDUM2(6), - 3 IOWND(14), IOWNS(4), - 4 IDUM1(4), IERSL, IDUM2(5), - 5 MITER, IDUM3(4), N, IDUM4(5) -C----------------------------------------------------------------------- -C THIS ROUTINE MANAGES THE SOLUTION OF THE LINEAR SYSTEM ARISING FROM -C A CHORD ITERATION. IT IS CALLED IF MITER .NE. 0. -C IF MITER IS 1 OR 2, IT CALLS DGETRS TO ACCOMPLISH THIS. -C IF MITER = 3 IT UPDATES THE COEFFICIENT H*EL0 IN THE DIAGONAL -C MATRIX, AND THEN COMPUTES THE SOLUTION. -C IF MITER IS 4 OR 5, IT CALLS DGBTRS. -C COMMUNICATION WITH ODESSA_SOLSY USES THE FOLLOWING VARIABLES.. -C WM = REAL WORK SPACE CONTAINING THE INVERSE DIAGONAL MATRIX IF -C MITER = 3 AND THE LU DECOMPOSITION OF THE MATRIX OTHERWISE. -C STORAGE OF MATRIX ELEMENTS STARTS AT WM(3). -C WM ALSO CONTAINS THE FOLLOWING MATRIX-RELATED DATA.. -C WM(1) = SQRT(UROUND) (NOT USED HERE), -C WM(2) = HL0, THE PREVIOUS VALUE OF H*EL0, USED IF MITER = 3. -C IWM = INTEGER WORK SPACE CONTAINING PIVOT INFORMATION, STARTING AT -C IWM(21), IF MITER IS 1, 2, 4, OR 5. IWM ALSO CONTAINS BAND -C PARAMETERS ML = IWM(1) AND MU = IWM(2) IF MITER IS 4 OR 5. -C X = THE RIGHT-HAND SIDE VECTOR ON INPUT, AND THE SOLUTION VECTOR -C ON OUTPUT, OF LENGTH N. -C TEM = VECTOR OF WORK SPACE OF LENGTH N, NOT USED IN THIS VERSION. -C IERSL = OUTPUT FLAG (IN COMMON). IERSL = 0 IF NO TROUBLE OCCURRED. -C IERSL = 1 IF A SINGULAR MATRIX AROSE WITH MITER = 3. -C THIS ROUTINE ALSO USES THE COMMON VARIABLES EL0, H, MITER, AND N. -C----------------------------------------------------------------------- - IERSL = 0 - GO TO (100, 100, 300, 400, 400), MITER - 100 CALL DGETRS ( 'N', N, 1, WM(3), N, IWM(21), X, N, INLPCK) - RETURN -C - 300 PHL0 = WM(2) - HL0 = H*EL0 - WM(2) = HL0 - IF (HL0 .EQ. PHL0) GO TO 330 - R = HL0/PHL0 - DO 320 I = 1,N - DI = ONE - R*(ONE - ONE/WM(I+2)) - IF (DABS(DI) .EQ. ZERO) GO TO 390 - 320 WM(I+2) = ONE/DI - 330 DO 340 I = 1,N - 340 X(I) = WM(I+2)*X(I) - RETURN - 390 IERSL = 1 - RETURN -C - 400 ML = IWM(1) - MU = IWM(2) - MEBAND = 2*ML + MU + 1 - CALL DGBTRS ( 'N', N, ML, MU, 1, WM(3), MEBAND, IWM(21), X, N, - * INLPCK) - RETURN -C----------------------- END OF SUBROUTINE ODESSA_SOLSY ----------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_sprim.f --- a/libcruft/odessa/odessa_sprim.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ - SUBROUTINE ODESSA_SPRIME (NEQ, Y, YH, NYH, NROW, NCOL, WM, IWM, - 1 EWT, SAVF, FTEM, DFDP, PAR, F, JAC, DF, PJAC, PDF) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION NEQ(*), Y(*), YH(NROW,NCOL,*), WM(*), IWM(*), - 1 EWT(*), SAVF(*), FTEM(*), DFDP(NROW,*), PAR(*) - EXTERNAL F, JAC, DF, PJAC, PDF - PARAMETER (ONE=1.0D0,ZERO=0.0D0) - COMMON /ODE001/ ROWND, ROWNS(173), - 1 RDUM1(37),EL0, H, RDUM2(6), - 2 IOWND1(14), IOWNS(4), - 3 IDUM1(3), IERPJ, IDUM2(6), - 4 MITER, IDUM3(4), N, IDUM4(5) - COMMON /ODE002/ RDUM3(3), - 1 IOWND2(3), IDUM5, NSV, IDUM6, NSPE, IDUM7, IERSP, JOPT, IDUM8 -C----------------------------------------------------------------------- -C ODESSA_SPRIME IS CALLED BY ODESSA TO INITIALIZE THE YH ARRAY. IT IS ALSO -C CALLED BY ODESSA_STODE TO REEVALUATE FIRST ORDER DERIVATIVES WHEN KFLAG -C .LE. -3. ODESSA_SPRIME COMPUTES THE FIRST DERIVATIVES OF THE SENSITIVITY -C COEFFICIENTS WITH RESPECT TO THE INDEPENDENT VARIABLE T... -C -C ODESSA_SPRIME = D(DY/DP)/DT = JAC*DY/DP + DF/DP -C WHERE JAC = JACOBIAN MATRIX -C DY/DP = SENSITIVITY MATRIX -C DF/DP = INHOMOGENEITY MATRIX -C THIS ROUTINE USES THE COMMON VARIABLES EL0, H, IERPJ, MITER, N, -C NSV, NSPE, IERSP, JOPT -C----------------------------------------------------------------------- -C CALL ODESSA_PREPJ WITH JOPT = 1. -C IF MITER = 2 OR 5, EL0 IS TEMPORARILY SET TO -1.0 AND H IS -C TEMPORARILY SET TO 1.0D0. -C----------------------------------------------------------------------- - NSPE = NSPE + 1 - JOPT = 1 - IF (MITER .EQ. 1 .OR. MITER .EQ. 4) GO TO 10 - HTEMP = H - ETEMP = EL0 - H = ONE - EL0 = -ONE - 10 CALL PJAC (NEQ, Y, YH, NYH, WM, IWM, EWT, SAVF, FTEM, - 1 PAR, F, JAC, JOPT) - IF (IERPJ .NE. 0) GO TO 300 - JOPT = 0 - IF (MITER .EQ. 1 .OR. MITER .EQ. 4) GO TO 20 - H = HTEMP - EL0 = ETEMP -C----------------------------------------------------------------------- -C CALL ODESSA_PREPDF AND LOAD DFDP(*,JPAR). -C----------------------------------------------------------------------- - 20 DO 30 J = 2,NSV - JPAR = J - 1 - CALL PDF (NEQ, Y, WM, SAVF, FTEM, DFDP(1,JPAR), PAR, - 1 F, DF, JPAR) - 30 CONTINUE -C----------------------------------------------------------------------- -C COMPUTE JAC*DY/DP AND STORE RESULTS IN YH(*,*,2). -C----------------------------------------------------------------------- - GO TO (40,40,310,100,100) MITER -C THE JACOBIAN IS FULL.------------------------------------------------ -C FOR EACH ROW OF THE JACOBIAN.. - 40 DO 70 IROW = 1,N -C AND EACH COLUMN OF THE SENSITIVITY MATRIX.. - DO 60 J = 2,NSV - SUM = ZERO -C TAKE THE VECTOR DOT PRODUCT.. - DO 50 I = 1,N - IPD = IROW + N*(I-1) + 2 - SUM = SUM + WM(IPD)*YH(I,J,1) - 50 CONTINUE - YH(IROW,J,2) = SUM - 60 CONTINUE - 70 CONTINUE - GO TO 200 -C THE JACOBIAN IS BANDED.----------------------------------------------- - 100 ML = IWM(1) - MU = IWM(2) - ICOUNT = 1 - MBAND = ML + MU + 1 - MEBAND = MBAND + ML - NMU = N - MU - ML1 = ML + 1 -C FOR EACH ROW OF THE JACOBIAN.. - DO 160 IROW = 1,N - IF (IROW .GT. ML1) GO TO 110 - IPD = MBAND + IROW + 1 - IYH = 1 - LBAND = MU + IROW - GO TO 120 - 110 ICOUNT = ICOUNT + 1 - IPD = ICOUNT*MEBAND + 2 - IYH = IYH + 1 - LBAND = LBAND - 1 - IF (IROW .LE. NMU) LBAND = MBAND -C AND EACH COLUMN OF THE SENSITIVITY MATRIX.. - 120 DO 150 J = 2,NSV - SUM = ZERO - I1 = IPD - I2 = IYH -C TAKE THE VECTOR DOT PRODUCT. - DO 140 I = 1,LBAND - SUM = SUM + WM(I1)*YH(I2,J,1) - I1 = I1 + MEBAND - 1 - I2 = I2 + 1 - 140 CONTINUE - YH(IROW,J,2) = SUM - 150 CONTINUE - 160 CONTINUE -C----------------------------------------------------------------------- -C ADD THE INHOMOGENEITY TERM, I.E., ADD DFDP(*,JPAR) TO YH(*,JPAR+1,2). -C----------------------------------------------------------------------- - 200 DO 220 J = 2,NSV - JPAR = J - 1 - DO 210 I = 1,N - YH(I,J,2) = YH(I,J,2) + DFDP(I,JPAR) - 210 CONTINUE - 220 CONTINUE - RETURN -C----------------------------------------------------------------------- -C ERROR RETURNS. -C----------------------------------------------------------------------- - 300 IERSP = -1 - RETURN - 310 IERSP = -2 - RETURN -C------------------------END OF SUBROUTINE ODESSA_SPRIME----------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_stesa.f --- a/libcruft/odessa/odessa_stesa.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,135 +0,0 @@ - SUBROUTINE ODESSA_STESA (NEQ, Y, NROW, NCOL, YH, WM, IWM, EWT, - 1 SAVF, ACOR, PAR, NRS, F, JAC, DF, PJAC, PDF, SOLVE) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - EXTERNAL F, JAC, DF, PJAC, PDF, SOLVE - DIMENSION NEQ(*), Y(NROW,*), YH(NROW,NCOL,*), WM(*), IWM(*), - 1 EWT(NROW,*), SAVF(*), ACOR(NROW,*), PAR(*), NRS(*) - PARAMETER (ONE=1.0D0,ZERO=0.0D0) - COMMON /ODE001/ ROWND, ROWNS(173), - 1 TESCO(3,12), RDUM1, EL0, H, RDUM2(4), TN, RDUM3, - 2 IOWND1(14), IOWNS(4), - 3 IALTH, LMAX, IDUM1, IERPJ, IERSL, JCUR, IDUM2, KFLAG, L, IDUM3, - 4 MITER, IDUM4(4), N, NQ, IDUM5, NFE, IDUM6(2) - COMMON /ODE002/ DUPS, DSMS, DDNS, - 1 IOWND2(3), IDUM7, NSV, IDUM8(2), IDF, IDUM9, JOPT, KFLAGS -C----------------------------------------------------------------------- -C ODESSA_STESA IS CALLED BY ODESSA_STODE TO PERFORM AN EXPLICIT -C CALCULATION FOR THE FIRST-ORDER SENSITIVITY COEFFICIENTS DY(I)/DP(J), -C I = 1,N; J = 1,NPAR. -C -C IN ADDITION TO THE VARIABLES DESCRIBED PREVIOUSLY, COMMUNICATION -C WITH ODESSA_STESA USES THE FOLLOWING.. -C Y = AN NROW (=N) BY NCOL (=NSV) REAL ARRAY CONTAINING THE -C CORRECTED DEPENDENT VARIABLES ON OUTPUT.. -C Y(I,1) , I = 1,N = STATE VARIABLES (INPUT); -C Y(I,J) , I = 1,N , J = 2,NSV , -C = SENSITIVITY COEFFICIENTS, DY(I)/DP(J). -C YH = AN N BY NSV BY LMAX REAL ARRAY CONTAINING THE PREDICTED -C DEPENDENT VARIABLES AND THEIR APPROXIMATE SCALED DERIVATIVES. -C SAVF = A REAL ARRAY OF LENGTH N USED TO STORE FIRST DERIVATIVES -C OF DEPENDENT VARIABLES IF MITER = 2 OR 5. -C PAR = A REAL ARRAY OF LENGTH NPAR CONTAINING THE EQUATION -C PARAMETERS OF INTEREST. -C NRS = AN INTEGER ARRAY OF LENGTH NPAR + 1 CONTAINING THE NUMBER -C OF REPEATED STEPS (KFLAGS .LT. 0) DUE TO THE SENSITIVITY -C CALCULATIONS.. -C NRS(1) = TOTAL NUMBER OF REPEATED STEPS -C NRS(I) , I = 2,NPAR = NUMBER OF REPEATED STEPS DUE -C TO PARAMETER I. -C NSV = NUMBER OF SOLUTION VECTORS = NPAR + 1. -C KFLAGS = LOCAL ERROR TEST FLAG, = 0 IF TEST PASSES, .LT. 0 IF TEST -C FAILS, AND STEP NEEDS TO BE REPEATED. ERROR TEST IS APPLIED -C TO EACH SOLUTION VECTOR INDEPENDENTLY. -C DUPS, DSMS, DDNS = REAL SCALARS USED FOR COMPUTING RHUP, RHSM, RHDN, -C ON RETURN TO ODESSA_STODE (IALTH .EQ. 1). -C THIS ROUTINE ALSO USES THE COMMON VARIABLES EL0, H, TN, IALTH, LMAX, -C IERPJ, IERSL, JCUR, KFLAG, L, MITER, N, NQ, NFE, AND JOPT. -C----------------------------------------------------------------------- - DUPS = ZERO - DSMS = ZERO - DDNS = ZERO - HL0 = H*EL0 - EL0I = ONE/EL0 - TI2 = ONE/TESCO(2,NQ) - TI3 = ONE/TESCO(3,NQ) -C IF MITER = 2 OR 5 (OR IDF = 0), SUPPLY DERIVATIVES AT CORRECTED -C Y(*,1) VALUES FOR NUMERICAL DIFFERENTIATION IN PJAC AND/OR PDF. - IF (MITER .EQ. 2 .OR. MITER .EQ. 5 .OR. IDF .EQ. 0) GO TO 10 - GO TO 15 - 10 CALL F (NEQ, TN, Y, PAR, SAVF) - NFE = NFE + 1 -C IF JCUR = 0, UPDATE THE JACOBIAN MATRIX. -C IF MITER = 5, LOAD CORRECTED Y(*,1) VALUES INTO Y(*,2). - 15 IF (JCUR .EQ. 1) GO TO 30 - IF (MITER .NE. 5) GO TO 25 - DO 20 I = 1,N - 20 Y(I,2) = Y(I,1) - 25 CALL PJAC (NEQ, Y, Y(1,2), N, WM, IWM, EWT, SAVF, ACOR(1,2), - 1 PAR, F, JAC, JOPT) - IF (IERPJ .NE. 0) RETURN -C----------------------------------------------------------------------- -C THIS IS A LOOPING POINT FOR THE SENSITIVITY CALCULATIONS. -C----------------------------------------------------------------------- -C FOR EACH PARAMETER PAR(*), A SENSITIVITY SOLUTION VECTOR IS COMPUTED -C USING THE SAME STEP SIZE (H) AND ORDER (NQ) AS IN ODESSA_STODE. -C A LOCAL ERROR TEST IS APPLIED INDEPENDENTLY TO EACH SOLUTION VECTOR. -C----------------------------------------------------------------------- - 30 DO 100 J = 2,NSV - JPAR = J - 1 -C EVALUATE INHOMOGENEITY TERM, TEMPORARILY LOAD INTO Y(*,JPAR+1). ------ - CALL PDF(NEQ, Y, WM, SAVF, ACOR(1,J), Y(1,J), PAR, - 1 F, DF, JPAR) -C----------------------------------------------------------------------- -C LOAD RHS OF SENSITIVITY SOLUTION (CORRECTOR) EQUATION.. -C -C RHS = DY/DP - EL(1)*H*D(DY/DP)/DT + EL(1)*H*DF/DP -C -C----------------------------------------------------------------------- - DO 40 I = 1,N - 40 Y(I,J) = YH(I,J,1) - EL0*YH(I,J,2) + HL0*Y(I,J) -C----------------------------------------------------------------------- -C SOLVE CORRECTOR EQUATION: THE SOLUTIONS ARE LOCATED IN Y(*,JPAR+1). -C THE EXPLICIT FORMULA IS.. -C -C (I - EL(1)*H*JAC) * DY/DP(CORRECTED) = RHS -C -C----------------------------------------------------------------------- - CALL SOLVE (WM, IWM, Y(1,J), DUM) - IF (IERSL .NE. 0) RETURN -C ESTIMATE LOCAL TRUNCATION ERROR. ------------------------------------- - DO 50 I = 1,N - 50 ACOR(I,J) = (Y(I,J) - YH(I,J,1))*EL0I - ERR = ODESSA_VNORM(N, ACOR(1,J), EWT(1,J))*TI2 - IF (ERR .GT. ONE) GO TO 200 -C----------------------------------------------------------------------- -C LOCAL ERROR TEST PASSED. SET KFLAGS TO 0 TO INDICATE THIS. -C IF IALTH = 1, COMPUTE DSMS, DDNS, AND DUPS (IF L .LT. LMAX). -C----------------------------------------------------------------------- - KFLAGS = 0 - IF (IALTH .GT. 1) GO TO 100 - IF (L .EQ. LMAX) GO TO 70 - DO 60 I= 1,N - 60 Y(I,J) = ACOR(I,J) - YH(I,J,LMAX) - DUPS = DMAX1(DUPS,ODESSA_VNORM(N,Y(1,J),EWT(1,J))*TI3) - 70 DSMS = DMAX1(DSMS,ERR) - 100 CONTINUE - RETURN -C----------------------------------------------------------------------- -C THIS SECTION IS REACHED IF THE ERROR TOLERANCE FOR SENSITIVITY -C SOLUTION VECTOR JPAR HAS BEEN VIOLATED. KFLAGS IS MADE NEGATIVE TO -C INDICATE THIS. IF KFLAGS = -1, SET KFLAG EQUAL TO ZERO SO THAT KFLAG -C IS SET TO -1 ON RETURN TO ODESSA_STODE BEFORE REPEATING THE STEP. -C INCREMENT NRS(1) (= TOTAL NUMBER OF REPEATED STEPS DUE TO ALL -C SENSITIVITY SOLUTION VECTORS) BY ONE. -C INCREMENT NRS(JPAR+1) (= TOTAL NUMBER OF REPEATED STEPS DUE TO -C SOLUTION VECTOR JPAR+1) BY ONE. -C LOAD DSMS FOR RH CALCULATION IN ODESSA_STODE. -C----------------------------------------------------------------------- - 200 KFLAGS = KFLAGS - 1 - IF (KFLAGS .EQ. -1) KFLAG = 0 - NRS(1) = NRS(1) + 1 - NRS(J) = NRS(J) + 1 - DSMS = ERR - RETURN -C-------------------- END OF SUBROUTINE ODESSA_STESA ---------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_stode.f --- a/libcruft/odessa/odessa_stode.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,518 +0,0 @@ - SUBROUTINE ODESSA_STODE (NEQ, Y, YH, NYH, YH1, WM, IWM, EWT, SAVF, - 1 ACOR, PAR, NRS, F, JAC, DF, PJAC, PDF, SLVS) - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - EXTERNAL F, JAC, DF, PJAC, PDF, SLVS - DIMENSION NEQ(*), Y(*), YH(NYH,*), YH1(*), WM(*), IWM(*), EWT(*), - 1 SAVF(*), ACOR(*), PAR(*), NRS(*) - PARAMETER (ONE=1.0D0,ZERO=0.0D0) - COMMON /ODE001/ ROWND, - 1 CONIT, CRATE, EL(13), ELCO(13,12), HOLD, RMAX, - 2 TESCO(3,12), CCMAX, EL0, H, HMIN, HMXI, HU, RC, TN, UROUND, - 3 IOWND1(14), IPUP, MEO, NQNYH, NSLP, - 4 IALTH, LMAX, ICF, IERPJ, IERSL, JCUR, JSTART, KFLAG, L, METH, - 5 MITER, MAXORD, MAXCOR, MSBP, MXNCF, N, NQ, NST, NFE, NJE, NQU - COMMON /ODE002/ DUPS, DSMS, DDNS, - 1 IOWND2(3), ISOPT, NSV, NDFE, NSPE, IDF, IERSP, JOPT, KFLAGS -C----------------------------------------------------------------------- -C ODESSA_STODE PERFORMS ONE STEP OF THE INTEGRATION OF AN INITIAL VALUE -C PROBLEM FOR A SYSTEM OF ORDINARY DIFFERENTIAL EQUATIONS. -C NOTE.. ODESSA_STODE IS INDEPENDENT OF THE VALUE OF THE ITERATION METHOD -C INDICATOR MITER, WHEN THIS IS .NE. 0, AND HENCE IS INDEPENDENT -C OF THE TYPE OF CHORD METHOD USED, OR THE JACOBIAN STRUCTURE. -C FOR ISOPT = 1, ODESSA_STODE CALLS ODESSA_STESA FOR SENSITIVITY CALCULATIONS. -C VARIABLES USED FOR COMMUNICATION WITH ODESSA_STESA ARE DESCRIBED IN -C ODESSA_STESA. COMMUNICATION WITH ODESSA_STODE IS DONE WITH THE -C FOLLOWING VARIABLES.. -C -C NEQ = INTEGER ARRAY CONTAINING PROBLEM SIZE IN NEQ(1), AND -C NUMBER OF PARAMETERS TO BE CONSIDERED IN THE SENSITIVITY -C ANALYSIS NEQ(2) (FOR ISOPT = 1), AND PASSED AS THE -C NEQ ARGUMENT IN ALL CALLS TO F, JAC, AND DF. -C Y = AN ARRAY OF LENGTH .GE. N USED AS THE Y ARGUMENT IN -C ALL CALLS TO F, JAC, AND DF. -C YH = AN NYH BY LMAX ARRAY CONTAINING THE DEPENDENT VARIABLES -C AND THEIR APPROXIMATE SCALED DERIVATIVES, WHERE -C LMAX = MAXORD + 1. YH(I,J+1) CONTAINS THE APPROXIMATE -C J-TH DERIVATIVE OF Y(I), SCALED BY H**J/FACTORIAL(J) -C (J = 0,1,...,NQ). ON ENTRY FOR THE FIRST STEP, THE FIRST -C TWO COLUMNS OF YH MUST BE SET FROM THE INITIAL VALUES. -C NYH = A CONSTANT INTEGER .GE. N, THE FIRST DIMENSION OF YH. -C THE TOTAL NUMBER OF FIRST-ORDER DIFFERENTIAL EQUATIONS.. -C NYH = N, ISOPT = 0, -C NYH = N * (NPAR + 1), ISOPT = 1 -C YH1 = A ONE-DIMENSIONAL ARRAY OCCUPYING THE SAME SPACE AS YH. -C EWT = AN ARRAY OF LENGTH NYH CONTAINING MULTIPLICATIVE WEIGHTS -C FOR LOCAL ERROR MEASUREMENTS. LOCAL ERRORS IN Y(I) ARE -C COMPARED TO 1.0/EWT(I) IN VARIOUS ERROR TESTS. -C SAVF = AN ARRAY OF WORKING STORAGE, OF LENGTH N. -C ALSO USED FOR INPUT OF YH(*,MAXORD+2) WHEN JSTART = -1 -C AND MAXORD .LT. THE CURRENT ORDER NQ. -C ACOR = A WORK ARRAY OF LENGTH NYH, USED FOR THE ACCUMULATED -C CORRECTIONS. ON A SUCCESSFUL RETURN, ACOR(I) CONTAINS -C THE ESTIMATED ONE-STEP LOCAL ERROR IN Y(I). -C WM,IWM = REAL AND INTEGER WORK ARRAYS ASSOCIATED WITH MATRIX -C OPERATIONS IN CHORD ITERATION (MITER .NE. 0). -C PJAC = NAME OF ROUTINE TO EVALUATE AND PREPROCESS JACOBIAN MATRIX -C AND P = I - H*EL0*JAC, IF A CHORD METHOD IS BEING USED. -C IF ISOPT = 1, PJAC CAN BE CALLED TO CALCULATE JAC BY -C SETTING JOPT = 1. -C SLVS = NAME OF ROUTINE TO SOLVE LINEAR SYSTEM IN CHORD ITERATION. -C CCMAX = MAXIMUM RELATIVE CHANGE IN H*EL0 BEFORE PJAC IS CALLED. -C H = THE STEP SIZE TO BE ATTEMPTED ON THE NEXT STEP. -C H IS ALTERED BY THE ERROR CONTROL ALGORITHM DURING THE -C PROBLEM. H CAN BE EITHER POSITIVE OR NEGATIVE, BUT ITS -C SIGN MUST REMAIN CONSTANT THROUGHOUT THE PROBLEM. -C HMIN = THE MINIMUM ABSOLUTE VALUE OF THE STEP SIZE H TO BE USED. -C HMXI = INVERSE OF THE MAXIMUM ABSOLUTE VALUE OF H TO BE USED. -C HMXI = 0.0 IS ALLOWED AND CORRESPONDS TO AN INFINITE HMAX. -C HMIN AND HMXI MAY BE CHANGED AT ANY TIME, BUT WILL NOT -C TAKE EFFECT UNTIL THE NEXT CHANGE OF H IS CONSIDERED. -C TN = THE INDEPENDENT VARIABLE. TN IS UPDATED ON EACH STEP TAKEN. -C JSTART = AN INTEGER USED FOR INPUT ONLY, WITH THE FOLLOWING -C VALUES AND MEANINGS.. -C 0 PERFORM THE FIRST STEP. -C .GT.0 TAKE A NEW STEP CONTINUING FROM THE LAST. -C -1 TAKE THE NEXT STEP WITH A NEW VALUE OF H, MAXORD, -C N, METH, OR MITER. -C -2 TAKE THE NEXT STEP WITH A NEW VALUE OF H, -C BUT WITH OTHER INPUTS UNCHANGED. -C ON RETURN, JSTART IS SET TO 1 TO FACILITATE CONTINUATION. -C KFLAG = A COMPLETION CODE WITH THE FOLLOWING MEANINGS.. -C 0 THE STEP WAS SUCCESFUL. -C -1 THE REQUESTED ERROR COULD NOT BE ACHIEVED. -C -2 CORRECTOR CONVERGENCE COULD NOT BE ACHIEVED. -C -3 FATAL ERROR IN PJAC, OR SLVS, (OR ODESSA_STESA). -C A RETURN WITH KFLAG = -1 OR -2 MEANS EITHER -C ABS(H) = HMIN OR 10 CONSECUTIVE FAILURES OCCURRED. -C ON A RETURN WITH KFLAG NEGATIVE, THE VALUES OF TN AND -C THE YH ARRAY ARE AS OF THE BEGINNING OF THE LAST -C STEP, AND H IS THE LAST STEP SIZE ATTEMPTED. -C MAXORD = THE MAXIMUM ORDER OF INTEGRATION METHOD TO BE ALLOWED. -C MAXCOR = THE MAXIMUM NUMBER OF CORRECTOR ITERATIONS ALLOWED. -C (= 3, IF ISOPT = 0) -C (= 4, IF ISOPT = 1) -C MSBP = MAXIMUM NUMBER OF STEPS BETWEEN PJAC CALLS (MITER .GT. 0). -C IF ISOPT = 1, PJAC IS CALLED AT LEAST ONCE EVERY STEP. -C MXNCF = MAXIMUM NUMBER OF CONVERGENCE FAILURES ALLOWED. -C METH/MITER = THE METHOD FLAGS. SEE DESCRIPTION IN DRIVER. -C N = THE NUMBER OF FIRST-ORDER MODEL DIFFERENTIAL EQUATIONS. -C----------------------------------------------------------------------- - KFLAG = 0 - KFLAGS = 0 - TOLD = TN - NCF = 0 - IERPJ = 0 - IERSL = 0 - JCUR = 0 - ICF = 0 - IF (JSTART .GT. 0) GO TO 200 - IF (JSTART .EQ. -1) GO TO 100 - IF (JSTART .EQ. -2) GO TO 160 -C----------------------------------------------------------------------- -C ON THE FIRST CALL, THE ORDER IS SET TO 1, AND OTHER VARIABLES ARE -C INITIALIZED. RMAX IS THE MAXIMUM RATIO BY WHICH H CAN BE INCREASED -C IN A SINGLE STEP. IT IS INITIALLY 1.E4 TO COMPENSATE FOR THE SMALL -C INITIAL H, BUT THEN IS NORMALLY EQUAL TO 10. IF A FAILURE -C OCCURS (IN CORRECTOR CONVERGENCE OR ERROR TEST), RMAX IS SET AT 2 -C FOR THE NEXT INCREASE. -C THESE COMPUTATIONS CONSIDER ONLY THE ORIGINAL SOLUTION VECTOR. -C THE SENSITIVITY SOLUTION VECTORS ARE CONSIDERED IN ODESSA_STESA (ISOPT = 1). -C----------------------------------------------------------------------- - LMAX = MAXORD + 1 - NQ = 1 - L = 2 - IALTH = 2 - RMAX = 10000.0D0 - RC = ZERO - EL0 = ONE - CRATE = 0.7D0 - DELP = ZERO - HOLD = H - MEO = METH - NSLP = 0 - IPUP = MITER - IRET = 3 - GO TO 140 -C----------------------------------------------------------------------- -C THE FOLLOWING BLOCK HANDLES PRELIMINARIES NEEDED WHEN JSTART = -1. -C IPUP IS SET TO MITER TO FORCE A MATRIX UPDATE. -C IF AN ORDER INCREASE IS ABOUT TO BE CONSIDERED (IALTH = 1), -C IALTH IS RESET TO 2 TO POSTPONE CONSIDERATION ONE MORE STEP. -C IF THE CALLER HAS CHANGED METH, ODESSA_CFODE IS CALLED TO RESET -C THE COEFFICIENTS OF THE METHOD. -C IF THE CALLER HAS CHANGED MAXORD TO A VALUE LESS THAN THE CURRENT -C ORDER NQ, NQ IS REDUCED TO MAXORD, AND A NEW H CHOSEN ACCORDINGLY. -C IF H IS TO BE CHANGED, YH MUST BE RESCALED. -C IF H OR METH IS BEING CHANGED, IALTH IS RESET TO L = NQ + 1 -C TO PREVENT FURTHER CHANGES IN H FOR THAT MANY STEPS. -C----------------------------------------------------------------------- - 100 IPUP = MITER - LMAX = MAXORD + 1 - IF (IALTH .EQ. 1) IALTH = 2 - IF (METH .EQ. MEO) GO TO 110 - CALL ODESSA_CFODE (METH, ELCO, TESCO) - MEO = METH - IF (NQ .GT. MAXORD) GO TO 120 - IALTH = L - IRET = 1 - GO TO 150 - 110 IF (NQ .LE. MAXORD) GO TO 160 - 120 NQ = MAXORD - L = LMAX - DO 125 I = 1,L - 125 EL(I) = ELCO(I,NQ) - NQNYH = NQ*NYH - RC = RC*EL(1)/EL0 - EL0 = EL(1) - CONIT = 0.5D0/DBLE(NQ+2) - DDN = ODESSA_VNORM (N, SAVF, EWT)/TESCO(1,L) - EXDN = ONE/DBLE(L) - RHDN = ONE/(1.3D0*DDN**EXDN + 0.0000013D0) - RH = DMIN1(RHDN,ONE) - IREDO = 3 - IF (H .EQ. HOLD) GO TO 170 - RH = DMIN1(RH,DABS(H/HOLD)) - H = HOLD - GO TO 175 -C----------------------------------------------------------------------- -C ODESSA_CFODE IS CALLED TO GET ALL THE INTEGRATION COEFFICIENTS FOR THE -C CURRENT METH. THEN THE EL VECTOR AND RELATED CONSTANTS ARE RESET -C WHENEVER THE ORDER NQ IS CHANGED, OR AT THE START OF THE PROBLEM. -C----------------------------------------------------------------------- - 140 CALL ODESSA_CFODE (METH, ELCO, TESCO) - 150 DO 155 I = 1,L - 155 EL(I) = ELCO(I,NQ) - NQNYH = NQ*NYH - RC = RC*EL(1)/EL0 - EL0 = EL(1) - CONIT = 0.5D0/DBLE(NQ+2) - GO TO (160, 170, 200), IRET -C----------------------------------------------------------------------- -C IF H IS BEING CHANGED, THE H RATIO RH IS CHECKED AGAINST -C RMAX, HMIN, AND HMXI, AND THE YH ARRAY RESCALED. IALTH IS SET TO -C L = NQ + 1 TO PREVENT A CHANGE OF H FOR THAT MANY STEPS, UNLESS -C FORCED BY A CONVERGENCE OR ERROR TEST FAILURE. -C----------------------------------------------------------------------- - 160 IF (H .EQ. HOLD) GO TO 200 - RH = H/HOLD - H = HOLD - IREDO = 3 - GO TO 175 - 170 RH = DMAX1(RH,HMIN/DABS(H)) - 175 RH = DMIN1(RH,RMAX) - RH = RH/DMAX1(ONE,DABS(H)*HMXI*RH) - R = ONE - DO 180 J = 2,L - R = R*RH - DO 180 I = 1,NYH - 180 YH(I,J) = YH(I,J)*R - H = H*RH - RC = RC*RH - IALTH = L - IF (IREDO .EQ. 0) GO TO 690 -C----------------------------------------------------------------------- -C THIS SECTION COMPUTES THE PREDICTED VALUES BY EFFECTIVELY -C MULTIPLYING THE YH ARRAY BY THE PASCAL TRIANGLE MATRIX. -C RC IS THE RATIO OF NEW TO OLD VALUES OF THE COEFFICIENT H*EL(1). -C WHEN RC DIFFERS FROM 1 BY MORE THAN CCMAX, IPUP IS SET TO MITER -C TO FORCE PJAC TO BE CALLED, IF A JACOBIAN IS INVOLVED. -C IN ANY CASE, PJAC IS CALLED AT LEAST EVERY MSBP STEPS FOR ISOPT = 0, -C AND AT LEAST ONCE EVERY STEP FOR ISOPT = 1. -C----------------------------------------------------------------------- - 200 IF (DABS(RC-ONE) .GT. CCMAX) IPUP = MITER - IF (NST .GE. NSLP+MSBP) IPUP = MITER - TN = TN + H - I1 = NQNYH + 1 - DO 215 JB = 1,NQ - I1 = I1 - NYH - DO 210 I = I1,NQNYH - 210 YH1(I) = YH1(I) + YH1(I+NYH) - 215 CONTINUE -C----------------------------------------------------------------------- -C UP TO MAXCOR CORRECTOR ITERATIONS ARE TAKEN. (= 3, FOR ISOPT = 0; -C = 4, FOR ISOPT = 1). A CONVERGENCE TEST IS MADE ON THE R.M.S. NORM -C OF EACH CORRECTION, WEIGHTED BY THE ERROR WEIGHT VECTOR EWT. THE SUM -C OF THE CORRECTIONS IS ACCUMULATED IN THE VECTOR ACOR(I), I = 1,N. -C (ACOR(I), I = N+1,NYH IS LOADED IN SUBROUTINE ODESSA_STESA (ISOPT = 1).) -C THE YH ARRAY IS NOT ALTERED IN THE CORRECTOR LOOP. -C----------------------------------------------------------------------- - 220 M = 0 - DO 230 I = 1,N - 230 Y(I) = YH(I,1) - CALL F (NEQ, TN, Y, PAR, SAVF) - NFE = NFE + 1 - IF (IPUP .LE. 0) GO TO 250 -C----------------------------------------------------------------------- -C IF INDICATED, THE MATRIX P = I - H*EL(1)*J IS REEVALUATED AND -C PREPROCESSED BEFORE STARTING THE CORRECTOR ITERATION. IPUP IS SET -C TO 0 AS AN INDICATOR THAT THIS HAS BEEN DONE. -C----------------------------------------------------------------------- - IPUP = 0 - RC = ONE - NSLP = NST - CRATE = 0.7D0 - CALL PJAC (NEQ, Y, YH, NYH, WM, IWM, EWT, SAVF, ACOR, PAR, - 1 F, JAC, JOPT) - IF (IERPJ .NE. 0) GO TO 430 - 250 DO 260 I = 1,N - 260 ACOR(I) = ZERO - 270 IF (MITER .NE. 0) GO TO 350 -C----------------------------------------------------------------------- -C IN THE CASE OF FUNCTIONAL ITERATION, UPDATE Y DIRECTLY FROM -C THE RESULT OF THE LAST FUNCTION EVALUATION. -C (IF ISOPT = 1, FUNCTIONAL ITERATION IS NOT ALLOWED.) -C----------------------------------------------------------------------- - DO 290 I = 1,N - SAVF(I) = H*SAVF(I) - YH(I,2) - 290 Y(I) = SAVF(I) - ACOR(I) - DEL = ODESSA_VNORM (N, Y, EWT) - DO 300 I = 1,N - Y(I) = YH(I,1) + EL(1)*SAVF(I) - 300 ACOR(I) = SAVF(I) - GO TO 400 -C----------------------------------------------------------------------- -C IN THE CASE OF THE CHORD METHOD, COMPUTE THE CORRECTOR ERROR, -C AND SOLVE THE LINEAR SYSTEM WITH THAT AS RIGHT-HAND SIDE AND -C P AS COEFFICIENT MATRIX. -C----------------------------------------------------------------------- - 350 DO 360 I = 1,N - 360 Y(I) = H*SAVF(I) - (YH(I,2) + ACOR(I)) - CALL SLVS (WM, IWM, Y, SAVF) - IF (IERSL .LT. 0) GO TO 430 - IF (IERSL .GT. 0) GO TO 410 - DEL = ODESSA_VNORM (N, Y, EWT) - DO 380 I = 1,N - ACOR(I) = ACOR(I) + Y(I) - 380 Y(I) = YH(I,1) + EL(1)*ACOR(I) -C----------------------------------------------------------------------- -C TEST FOR CONVERGENCE. IF M.GT.0, AN ESTIMATE OF THE CONVERGENCE -C RATE CONSTANT IS STORED IN CRATE, AND THIS IS USED IN THE TEST. -C----------------------------------------------------------------------- - 400 IF (M .NE. 0) CRATE = DMAX1(0.2D0*CRATE,DEL/DELP) - DCON = DEL*DMIN1(ONE,1.5D0*CRATE)/(TESCO(2,NQ)*CONIT) - IF (DCON .LE. ONE) GO TO 450 - M = M + 1 - IF (M .EQ. MAXCOR) GO TO 410 - IF (M .GE. 2 .AND. DEL .GT. 2.0D0*DELP) GO TO 410 - DELP = DEL - CALL F (NEQ, TN, Y, PAR, SAVF) - NFE = NFE + 1 - GO TO 270 -C----------------------------------------------------------------------- -C THE CORRECTOR ITERATION FAILED TO CONVERGE IN MAXCOR TRIES. -C IF MITER .NE. 0 AND THE JACOBIAN IS OUT OF DATE, PJAC IS CALLED FOR -C THE NEXT TRY. OTHERWISE THE YH ARRAY IS RETRACTED TO ITS VALUES -C BEFORE PREDICTION, AND H IS REDUCED, IF POSSIBLE. IF H CANNOT BE -C REDUCED OR MXNCF FAILURES HAVE OCCURRED, EXIT WITH KFLAG = -2. -C----------------------------------------------------------------------- - 410 IF (MITER .EQ. 0 .OR. JCUR .EQ. 1) GO TO 430 - ICF = 1 - IPUP = MITER - GO TO 220 - 430 ICF = 2 - NCF = NCF + 1 - RMAX = 2.0D0 - TN = TOLD - I1 = NQNYH + 1 - DO 445 JB = 1,NQ - I1 = I1 - NYH - DO 440 I = I1,NQNYH - 440 YH1(I) = YH1(I) - YH1(I+NYH) - 445 CONTINUE - IF (IERPJ .LT. 0 .OR. IERSL .LT. 0) GO TO 680 - IF (DABS(H) .LE. HMIN*1.00001D0) GO TO 670 - IF (NCF .EQ. MXNCF) GO TO 670 - RH = 0.25D0 - IPUP = MITER - IREDO = 1 - GO TO 170 -C----------------------------------------------------------------------- -C THE CORRECTOR HAS CONVERGED. -C THE LOCAL ERROR TEST IS MADE AND CONTROL PASSES TO STATEMENT 500 -C IF IT FAILS. OTHERWISE, ODESSA_STESA IS CALLED (ISOPT = 1) TO PERFORM -C SENSITIVITY CALCULATIONS AT CURRENT STEP SIZE AND ORDER. -C----------------------------------------------------------------------- - 450 CONTINUE - IF (M .EQ. 0) DSM = DEL/TESCO(2,NQ) - IF (M .GT. 0) DSM = ODESSA_VNORM (N, ACOR, EWT)/TESCO(2,NQ) - IF (DSM .GT. ONE) GO TO 500 -C - IF (ISOPT .EQ. 0) GO TO 460 -C----------------------------------------------------------------------- -C CALL ODESSA_STESA TO PERFORM EXPLICIT SENSITIVITY ANALYSIS. -C IF THE LOCAL ERROR TEST FAILS (WITHIN ODESSA_STESA) FOR ANY SOLUTION -C VECTOR, KFLAGS IS SET .LT. 0 AND CONTROL PASSES TO STATEMENT 500 UPON -C RETURN. IN EITHER CASE, JCUR IS SET TO ZERO TO SIGNAL THAT THE -C JACOBIAN MAY NEED UPDATING LATER. -C----------------------------------------------------------------------- - CALL ODESSA_STESA (NEQ, Y, N, NSV, YH, WM, IWM, EWT, SAVF, ACOR, - 1 PAR, NRS, F, JAC, DF, PJAC, PDF, SLVS) - IF (IERPJ .NE. 0 .OR. IERSL .NE. 0) GO TO 680 - IF (KFLAGS .LT. 0) GO TO 500 -C----------------------------------------------------------------------- -C AFTER A SUCCESSFUL STEP, UPDATE THE YH ARRAY. -C CONSIDER CHANGING H IF IALTH = 1. OTHERWISE DECREASE IALTH BY 1. -C IF IALTH IS THEN 1 AND NQ .LT. MAXORD, THEN ACOR IS SAVED FOR -C USE IN A POSSIBLE ORDER INCREASE ON THE NEXT STEP. -C IF A CHANGE IN H IS CONSIDERED, AN INCREASE OR DECREASE IN ORDER -C BY ONE IS CONSIDERED ALSO. A CHANGE IN H IS MADE ONLY IF IT IS BY A -C FACTOR OF AT LEAST 1.1. IF NOT, IALTH IS SET TO 3 TO PREVENT -C TESTING FOR THAT MANY STEPS. -C----------------------------------------------------------------------- - 460 JCUR = 0 - KFLAG = 0 - IREDO = 0 - NST = NST + 1 - HU = H - NQU = NQ - DO 470 J = 1,L - DO 470 I = 1,NYH - 470 YH(I,J) = YH(I,J) + EL(J)*ACOR(I) - IALTH = IALTH - 1 - IF (IALTH .EQ. 0) GO TO 520 - IF (IALTH .GT. 1) GO TO 700 - IF (L .EQ. LMAX) GO TO 700 - DO 490 I = 1,NYH - 490 YH(I,LMAX) = ACOR(I) - GO TO 700 -C----------------------------------------------------------------------- -C THE ERROR TEST FAILED IN EITHER ODESSA_STODE OR ODESSA_STESA. -C KFLAG KEEPS TRACK OF MULTIPLE FAILURES. -C RESTORE TN AND THE YH ARRAY TO THEIR PREVIOUS VALUES, AND PREPARE -C TO TRY THE STEP AGAIN. COMPUTE THE OPTIMUM STEP SIZE FOR THIS OR -C ONE LOWER ORDER. AFTER 2 OR MORE FAILURES, H IS FORCED TO DECREASE -C BY A FACTOR OF 0.2 OR LESS. -C----------------------------------------------------------------------- - 500 KFLAG = KFLAG - 1 - JCUR = 0 - TN = TOLD - I1 = NQNYH + 1 - DO 515 JB = 1,NQ - I1 = I1 - NYH - DO 510 I = I1,NQNYH - 510 YH1(I) = YH1(I) - YH1(I+NYH) - 515 CONTINUE - RMAX = 2.0D0 - IF (DABS(H) .LE. HMIN*1.00001D0) GO TO 660 - IF (KFLAG .LE. -3) GO TO 640 - IREDO = 2 - RHUP = ZERO - GO TO 540 -C----------------------------------------------------------------------- -* -C REGARDLESS OF THE SUCCESS OR FAILURE OF THE STEP, FACTORS -C RHDN, RHSM, AND RHUP ARE COMPUTED, BY WHICH H COULD BE MULTIPLIED -C AT ORDER NQ - 1, ORDER NQ, OR ORDER NQ + 1, RESPECTIVELY. -C IN THE CASE OF FAILURE, RHUP = 0.0 TO AVOID AN ORDER INCREASE. -C THE LARGEST OF THESE IS DETERMINED AND THE NEW ORDER CHOSEN -C ACCORDINGLY. IF THE ORDER IS TO BE INCREASED, WE COMPUTE ONE -C ADDITIONAL SCALED DERIVATIVE. -C FOR ISOPT = 1, DUPS AND DSMS ARE LOADED WITH THE LARGEST RMS-NORMS -C OBTAINED BY CONSIDERING SEPARATELY THE SENSITIVITY SOLUTION VECTORS. -C----------------------------------------------------------------------- - 520 RHUP = ZERO - IF (L .EQ. LMAX) GO TO 540 - DO 530 I = 1,N - 530 SAVF(I) = ACOR(I) - YH(I,LMAX) - DUP = ODESSA_VNORM (N, SAVF, EWT)/TESCO(3,NQ) - DUP = DMAX1(DUP,DUPS) - EXUP = ONE/DBLE(L+1) - RHUP = ONE/(1.4D0*DUP**EXUP + 0.0000014D0) - 540 EXSM = ONE/DBLE(L) - DSM = DMAX1(DSM,DSMS) - RHSM = ONE/(1.2D0*DSM**EXSM + 0.0000012D0) - RHDN = ZERO - IF (NQ .EQ. 1) GO TO 560 - JPOINT = 1 - DO 550 J = 1,NSV - DDN = ODESSA_VNORM (N, YH(JPOINT,L), EWT(JPOINT))/TESCO(1,NQ) - DDNS = DMAX1(DDNS,DDN) - JPOINT = JPOINT + N - 550 CONTINUE - DDN = DDNS - DDNS = ZERO - EXDN = ONE/DBLE(NQ) - RHDN = ONE/(1.3D0*DDN**EXDN + 0.0000013D0) - 560 IF (RHSM .GE. RHUP) GO TO 570 - IF (RHUP .GT. RHDN) GO TO 590 - GO TO 580 - 570 IF (RHSM .LT. RHDN) GO TO 580 - NEWQ = NQ - RH = RHSM - GO TO 620 - 580 NEWQ = NQ - 1 - RH = RHDN - IF (KFLAG .LT. 0 .AND. RH .GT. ONE) RH = ONE - GO TO 620 - 590 NEWQ = L - RH = RHUP - IF (RH .LT. 1.1D0) GO TO 610 - R = EL(L)/DBLE(L) - DO 600 I = 1,NYH - 600 YH(I,NEWQ+1) = ACOR(I)*R - GO TO 630 - 610 IALTH = 3 - GO TO 700 - 620 IF ((KFLAG .EQ. 0) .AND. (RH .LT. 1.1D0)) GO TO 610 - IF (KFLAG .LE. -2) RH = DMIN1(RH,0.2D0) -C----------------------------------------------------------------------- -C IF THERE IS A CHANGE OF ORDER, RESET NQ, L, AND THE COEFFICIENTS. -C IN ANY CASE H IS RESET ACCORDING TO RH AND THE YH ARRAY IS RESCALED. -C THEN EXIT FROM 690 IF THE STEP WAS OK, OR REDO THE STEP OTHERWISE. -C----------------------------------------------------------------------- - IF (NEWQ .EQ. NQ) GO TO 170 - 630 NQ = NEWQ - L = NQ + 1 - IRET = 2 - GO TO 150 -C----------------------------------------------------------------------- -C CONTROL REACHES THIS SECTION IF 3 OR MORE FAILURES HAVE OCCURED. -C IF 10 FAILURES HAVE OCCURRED, EXIT WITH KFLAG = -1. -C IT IS ASSUMED THAT THE DERIVATIVES THAT HAVE ACCUMULATED IN THE -C YH ARRAY HAVE ERRORS OF THE WRONG ORDER. HENCE THE FIRST -C DERIVATIVE IS RECOMPUTED, AND THE ORDER IS SET TO 1. THEN -C H IS REDUCED BY A FACTOR OF 10, AND THE STEP IS RETRIED, -C UNTIL IT SUCCEEDS OR H REACHES HMIN. -C----------------------------------------------------------------------- - 640 IF (KFLAG .EQ. -10) GO TO 660 - RH = 0.1D0 - RH = DMAX1(HMIN/DABS(H),RH) - H = H*RH - DO 645 I = 1,NYH - 645 Y(I) = YH(I,1) - CALL F (NEQ, TN, Y, PAR, SAVF) - NFE = NFE + 1 - IF (ISOPT .EQ. 0) GO TO 649 - CALL ODESSA_SPRIME (NEQ, Y, YH, NYH, N, NSV, WM, IWM, EWT, SAVF, - 1 ACOR, ACOR(N+1), PAR, F, JAC, DF, PJAC, PDF) - IF (IERSP .LT. 0) GO TO 680 - DO 646 I = N+1,NYH - 646 YH(I,2) = H*YH(I,2) - 649 DO 650 I = 1,N - 650 YH(I,2) = H*SAVF(I) - IPUP = MITER - IALTH = 5 - IF (NQ .EQ. 1) GO TO 200 - NQ = 1 - L = 2 - IRET = 3 - GO TO 150 -C----------------------------------------------------------------------- -C ALL RETURNS ARE MADE THROUGH THIS SECTION. H IS SAVED IN HOLD -C TO ALLOW THE CALLER TO CHANGE H ON THE NEXT STEP. -C----------------------------------------------------------------------- - 660 KFLAG = -1 - GO TO 720 - 670 KFLAG = -2 - GO TO 720 - 680 KFLAG = -3 - GO TO 720 - 690 RMAX = 10.0D0 - 700 R = ONE/TESCO(2,NQU) - DO 710 I = 1,NYH - 710 ACOR(I) = ACOR(I)*R - 720 HOLD = H - JSTART = 1 - RETURN -C----------------------- END OF SUBROUTINE ODESSA_STODE ----------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_svcom.f --- a/libcruft/odessa/odessa_svcom.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ - SUBROUTINE ODESSA_SVCOM (RSAV, ISAV) -C----------------------------------------------------------------------- -C THIS ROUTINE STORES IN RSAV AND ISAV THE CONTENTS OF COMMON BLOCKS -C ODE001 AND ODE002, WHICH ARE USED INTERNALLY IN THE ODESSA -C PACKAGE. -C RSAV = REAL ARRAY OF LENGTH 222 OR MORE. -C ISAV = INTEGER ARRAY OF LENGTH 52 OR MORE. -C----------------------------------------------------------------------- - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION RSAV(*), ISAV(*) - COMMON /ODE001/ RODE1(219), IODE1(39) - COMMON /ODE002/ RODE2(3), IODE2(11) - DATA LRODE1/219/, LIODE1/39/, LRODE2/3/, LIODE2/11/ -C - DO 10 I = 1,LRODE1 - 10 RSAV(I) = RODE1(I) - DO 20 I = 1,LRODE2 - J = LRODE1 + I - 20 RSAV(J) = RODE2(I) - DO 30 I = 1,LIODE1 - 30 ISAV(I) = IODE1(I) - DO 40 I = 1,LIODE2 - J = LIODE1 + I - 40 ISAV(J) = IODE2(I) - RETURN -C----------------------- END OF SUBROUTINE ODESSA_SVCOM ----------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 libcruft/odessa/odessa_vnorm.f --- a/libcruft/odessa/odessa_vnorm.f Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ - DOUBLE PRECISION FUNCTION ODESSA_VNORM (N, V, W) -C----------------------------------------------------------------------- -C THIS FUNCTION ROUTINE COMPUTES THE WEIGHTED ROOT-MEAN-SQUARE NORM -C OF THE VECTOR OF LENGTH N CONTAINED IN THE ARRAY V, WITH WEIGHTS -C CONTAINED IN THE ARRAY W OF LENGTH N.. -C ODESSA_VNORM = SQRT( (1/N) * SUM( V(I)*W(I) )**2 ) -C PROTECTION FOR UNDERFLOW/OVERFLOW IS ACCOMPLISHED USING TWO -C CONSTANTS WHICH ARE HOPEFULLY APPLICABLE FOR ALL MACHINES. -C THESE ARE: -C CUTLO = maximum of SQRT(U/EPS) over all known machines -C CUTHI = minimum of SQRT(Z) over all known machines -C WHERE -C EPS = smallest number s.t. EPS + 1 .GT. 1 -C U = smallest positive number (underflow limit) -C Z = largest number (overflow limit) -C -C DETAILS OF THE ALGORITHM AND OF VALUES OF CUTLO AND CUTHI ARE -C FOUND IN THE BLAS ROUTINE SNRM2 (SEE ALSO ALGORITHM 539, TRANS. -C MATH. SOFTWARE, VOL. 5 NO. 3, 1979, 308-323. -C FOR SINGLE PRECISION, THE FOLLOWING VALUES SHOULD BE UNIVERSAL: -C DATA CUTLO,CUTHI /4.441E-16,1.304E19/ -C FOR DOUBLE PRECISION, USE -C DATA CUTLO,CUTHI /8.232D-11,1.304D19/ -C -C----------------------------------------------------------------------- - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - INTEGER NEXT,I,J,N - DIMENSION V(N),W(N) - DATA CUTLO,CUTHI /8.232D-11,1.304D19/ - DATA ZERO,ONE/0.0D0,1.0D0/ -C BLAS ALGORITHM - NEXT = 1 - SUM = ZERO - I = 1 -20 SX = V(I)*W(I) - GO TO (30,40,70,80),NEXT -30 IF (DABS(SX).GT.CUTLO) GO TO 110 - NEXT = 2 - XMAX = ZERO -40 IF (SX.EQ.ZERO) GO TO 130 - IF (DABS(SX).GT.CUTLO) GO TO 110 - NEXT = 3 - GO TO 60 -50 I=J - NEXT = 4 - SUM = (SUM/SX)/SX -60 XMAX = DABS(SX) - GO TO 90 -70 IF(DABS(SX).GT.CUTLO) GO TO 100 -80 IF(DABS(SX).LE.XMAX) GO TO 90 - SUM = ONE + SUM * (XMAX/SX)**2 - XMAX = DABS(SX) - GO TO 130 -90 SUM = SUM + (SX/XMAX)**2 - GO TO 130 -100 SUM = (SUM*XMAX)*XMAX -110 HITEST = CUTHI/DBLE(N) - DO 120 J = I,N - SX = V(J)*W(J) - IF(DABS(SX).GE.HITEST) GO TO 50 - SUM = SUM + SX**2 -120 CONTINUE - ODESSA_VNORM = DSQRT(SUM) - GO TO 140 -130 CONTINUE - I = I + 1 - IF (I.LE.N) GO TO 20 - ODESSA_VNORM = XMAX * DSQRT(SUM) -140 CONTINUE - RETURN -C----------------------- END OF FUNCTION ODESSA_VNORM ------------------------- - END diff -r 9d9bbda4f00c -r 1278a2bc1527 liboctave/ChangeLog --- a/liboctave/ChangeLog Tue Mar 01 18:26:20 2005 +0000 +++ b/liboctave/ChangeLog Wed Mar 02 01:38:31 2005 +0000 @@ -1,3 +1,8 @@ +2005-03-01 John W. Eaton + + * ODESSA.h, ODESSA.cc, ODESSA-opts.in: Delete. + * Makefile.in: Remove them from the lists. + 2005-02-28 John W. Eaton * Makefile.in (LINK_DEPS): Remove -lglob from the list. diff -r 9d9bbda4f00c -r 1278a2bc1527 liboctave/Makefile.in --- a/liboctave/Makefile.in Tue Mar 01 18:26:20 2005 +0000 +++ b/liboctave/Makefile.in Wed Mar 02 01:38:31 2005 +0000 @@ -51,7 +51,7 @@ SPARSE_MX_OP_INC := $(shell $(AWK) -f $(srcdir)/sparse-mk-ops.awk prefix=smx list_h_files=1 $(srcdir)/sparse-mx-ops) OPTS_INC_DATA := DASPK-opts.in DASRT-opts.in DASSL-opts.in \ - LSODE-opts.in NLEqn-opts.in ODESSA-opts.in Quad-opts.in + LSODE-opts.in NLEqn-opts.in Quad-opts.in OPTS_INC := $(OPTS_INC_DATA:.in=.h) @@ -59,7 +59,7 @@ DAERTFunc.h DASPK.h DASRT.h DASSL.h FEGrid.h \ LinConst.h LP.h LPsolve.h LSODE.h NLConst.h NLEqn.h \ NLFunc.h NLP.h ODE.h ODEFunc.h ODES.h ODESFunc.h \ - ODESSA.h Objective.h QP.h Quad.h Range.h base-dae.h \ + Objective.h QP.h Quad.h Range.h base-dae.h \ base-de.h base-min.h byte-swap.h cmd-edit.h cmd-hist.h \ data-conv.h dir-ops.h file-ops.h file-stat.h getopt.h \ glob-match.h idx-vector.h kpse-xfns.h \ @@ -109,7 +109,7 @@ LIBOCTAVE_CXX_SOURCES := Bounds.cc CollocWt.cc \ DASPK.cc DASRT.cc DASSL.cc FEGrid.cc LinConst.cc \ - LPsolve.cc LSODE.cc NLEqn.cc ODES.cc ODESSA.cc \ + LPsolve.cc LSODE.cc NLEqn.cc ODES.cc \ Quad.cc Range.cc data-conv.cc dir-ops.cc \ file-ops.cc file-stat.cc glob-match.cc idx-vector.cc \ lo-ieee.cc lo-mappers.cc lo-specfun.cc lo-sysdep.cc \ diff -r 9d9bbda4f00c -r 1278a2bc1527 liboctave/ODESSA-opts.in --- a/liboctave/ODESSA-opts.in Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ -CLASS = "ODESSA" - -INCLUDE = "ODES.h" - -OPTION - NAME = "absolute tolerance" - DOC_ITEM -Absolute tolerance. May be either vector or scalar. If a vector, it -must match the dimension of the state vector. - END_DOC_ITEM - TYPE = "Array" - SET_ARG_TYPE = "const $TYPE&" - INIT_BODY - $OPTVAR.resize (1); - $OPTVAR(0) = ::sqrt (DBL_EPSILON); - END_INIT_BODY - SET_CODE - void set_$OPT (double val) - { - $OPTVAR.resize (1); - $OPTVAR(0) = (val > 0.0) ? val : ::sqrt (DBL_EPSILON); - reset = true; - } - - void set_$OPT (const $TYPE& val) - { $OPTVAR = val; reset = true; } - END_SET_CODE -END_OPTION - -OPTION - NAME = "relative tolerance" - DOC_ITEM -Relative tolerance parameter. Unlike the absolute tolerance, this -parameter may only be a scalar. - -The local error test applied at each integration step is - -@example - abs (local error in x(i)) - <= rtol * abs (y(i)) + atol(i) -@end example - END_DOC_ITEM - TYPE = "double" - INIT_VALUE = "::sqrt (DBL_EPSILON)" - SET_EXPR = "(val > 0.0) ? val : ::sqrt (DBL_EPSILON)" -END_OPTION - -OPTION - NAME = "integration method" - DOC_ITEM -A string specifing the method of integration to use to solve the ODE -system. Valid values are - -@table @asis -@item \"adams\" -@itemx \"non-stiff\" -No Jacobian used (even if it is available). -@item \"bdf\" -@item \"stiff\" -Use stiff backward differentiation formula (BDF) method. If a -function to compute the Jacobian is not supplied, @code{lsode} will -compute a finite difference approximation of the Jacobian matrix. -@end table - END_DOC_ITEM - TYPE = "std::string" - SET_ARG_TYPE = "const $TYPE&" - INIT_VALUE = {"stiff"} - SET_BODY - if (val == "stiff" || val == "bdf") - $OPTVAR = "stiff"; - else if (val == "non-stiff" || val == "adams") - $OPTVAR = "non-stiff"; - else - (*current_liboctave_error_handler) - ("lsode_options: method must be \"stiff\", \"bdf\", \"non-stiff\", or \"adams\""); - END_SET_BODY -END_OPTION - -OPTION - NAME = "initial step size" - DOC_ITEM -The step size to be attempted on the first step (default is determined -automatically). - END_DOC_ITEM - TYPE = "double" - INIT_VALUE = "-1.0" - SET_EXPR = "(val >= 0.0) ? val : -1.0" -END_OPTION - -OPTION - NAME = "maximum order" - DOC_ITEM -Restrict the maximum order of the solution method. If using the Adams -method, this option must be between 1 and 12. Otherwise, it must be -between 1 and 5, inclusive. - END_DOC_ITEM - TYPE = "int" - INIT_VALUE = "-1" - SET_EXPR = "val" -END_OPTION - -OPTION - NAME = "maximum step size" - DOC_ITEM -Setting the maximum stepsize will avoid passing over very large -regions (default is not specified). - END_DOC_ITEM - TYPE = "double" - INIT_VALUE = "-1.0" - SET_EXPR = "(val >= 0.0) ? val : -1.0" -END_OPTION - -OPTION - NAME = "minimum step size" - DOC_ITEM -The minimum absolute step size allowed (default is 0). - END_DOC_ITEM - TYPE = "double" - INIT_VALUE = "0.0" - SET_EXPR = "(val >= 0.0) ? val : 0.0" -END_OPTION - -OPTION - NAME = "step limit" - DOC_ITEM -Maximum number of steps allowed (default is 100000). - END_DOC_ITEM - TYPE = "int" - INIT_VALUE = "100000" - SET_EXPR = "val" -END_OPTION - diff -r 9d9bbda4f00c -r 1278a2bc1527 liboctave/ODESSA.cc --- a/liboctave/ODESSA.cc Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,720 +0,0 @@ -/* - -Copyright (C) 2002 John W. Eaton - -This file is part of Octave. - -Octave is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. - -Octave is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with Octave; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -// For instantiating the Array object. -#include "Array.h" -#include "Array.cc" - -#include "ODESSA.h" -#include "f77-fcn.h" -#include "lo-error.h" -#include "lo-sstream.h" -#include "quit.h" - -typedef int (*odessa_fcn_ptr) (int*, const double&, double*, - double*, double*); - -typedef int (*odessa_jac_ptr) (int*, const double&, double*, - double*, const int&, const int&, - double*, const int&); - -typedef int (*odessa_dfdp_ptr) (int*, const double&, double*, - double*, double*, const int&); - - -extern "C" -{ - F77_RET_T - F77_FUNC (dodessa, DODESSA) (odessa_fcn_ptr, odessa_dfdp_ptr, int*, - double*, double*, double&, double&, - int&, double&, const double*, int&, - int&, int*, double*, int&, int*, int&, - odessa_jac_ptr, int&); -} - -INSTANTIATE_ARRAY (Matrix); - -static ODESFunc::ODES_fsub user_fsub; -static ODESFunc::ODES_bsub user_bsub; -static ODESFunc::ODES_jsub user_jsub; - - -static int -odessa_f (int* neq, const double& t, double *state, - double *par, double *fval) -{ - BEGIN_INTERRUPT_WITH_EXCEPTIONS; - - int n = neq[0]; - int n_par = neq[1]; - - // Load the state and parameter arrays as Octave objects - - ColumnVector tmp_state (n); - for (int i = 0; i < n; i++) - tmp_state(i) = state[i]; - - ColumnVector tmp_param (n_par); - for (int i = 0; i < n_par; i++) - tmp_param(i) = par[i]; - - ColumnVector tmp_fval = user_fsub (tmp_state, t, tmp_param); - - if (tmp_fval.length () == 0) - octave_jump_to_enclosing_context (); - else - { - for (int i = 0; i < n; i++) - fval[i] = tmp_fval(i); - } - - END_INTERRUPT_WITH_EXCEPTIONS; - - return 0; -} - -static int -odessa_j (int* neq, const double& t, double *state, - double *par, const int& /* ml */, const int& /* mu */, - double *pd, const int& nrowpd) -{ - BEGIN_INTERRUPT_WITH_EXCEPTIONS; - - int n = neq[0]; - int n_par = neq[1]; - - // Load the state and parameter arrays as Octave objects - ColumnVector tmp_state (n); - for (int i = 0; i < n; i++) - tmp_state(i) = state[i]; - - ColumnVector tmp_param (n_par); - for (int i = 0; i < n_par; i++) - tmp_param(i) = par[i]; - - Matrix tmp_fval = user_jsub (tmp_state, t, tmp_param); - - if (tmp_fval.length () == 0) - octave_jump_to_enclosing_context (); - else - { - for (int j = 0; j < n; j++) - for (int i = 0; i < nrowpd; i++) - pd[nrowpd*j+i] = tmp_fval(i,j); - } - - END_INTERRUPT_WITH_EXCEPTIONS; - - return 0; -} - -static int -odessa_b (int* neq, const double& t, double *state, - double *par, double *dfdp, const int& jpar) - -{ - BEGIN_INTERRUPT_WITH_EXCEPTIONS; - - int n = neq[0]; - int n_par = neq[1]; - - // Load the state and parameter arrays as Octave objects - ColumnVector tmp_state (n); - for (int i = 0; i < n; i++) - tmp_state(i) = state[i]; - - ColumnVector tmp_param (n_par); - for (int i = 0; i < n_par; i++) - tmp_param(i) = par[i]; - - ColumnVector tmp_fval = user_bsub (tmp_state, t, tmp_param, jpar); - - if (tmp_fval.length () == 0) - octave_jump_to_enclosing_context (); - else - { - for (int i = 0; i < n; i++) - dfdp[i] = tmp_fval(i); - } - - END_INTERRUPT_WITH_EXCEPTIONS; - - return 0; -} - -ODESSA::ODESSA (void) : ODES (), ODESSA_options () -{ - initialized = false; - - neq.resize(2); - n = size (); - - iopt.resize(4); - - itask = 1; - iopt(0) = 0; - isopt = 0; - iopt(1) = isopt; - npar = 0; - neq(0) = n; - neq(1) = npar; - - sanity_checked = false; -} - -ODESSA::ODESSA (const ColumnVector& s, double tm, ODESFunc& f) - : ODES (s, tm, f), ODESSA_options () -{ - initialized = false; - - neq.resize(2); - n = size (); - - iopt.resize(4); - itask = 1; - iopt(0) = 0; - isopt = 0; - iopt(1) = isopt; - - sanity_checked = false; - - npar = 0; - neq(0) = n; - neq(1) = npar; - - y.resize (n, 1, 0.0); -} - -ODESSA::ODESSA (const ColumnVector& s, const ColumnVector& xtheta, - const Matrix& sensitivity_guess, double tm, ODESFunc& f) - : ODES (s, xtheta, tm, f) -{ - initialized = false; - - neq.resize(2); - n = s.length(); - npar = xtheta.length(); - - neq(0) = n; - neq(1) = npar; - - sx0 = sensitivity_guess; - par.resize (npar); - - for (int i = 0; i < npar; i++) - { - par(i) = xtheta(i); - } - - sanity_checked = false; - - npar = xtheta.length (); - - iopt.resize(4); - itask = 1; - iopt(0) = 0; - isopt = 1; - iopt(1) = isopt; - - y.resize (n, npar+1, 0.0); -} - -void -ODESSA::integrate (double tout) -{ - ODESSA_result retval; - - if (! initialized) - { - - for (int i = 0; i < n; i++) - y(i,0) = x(i); - - if (npar > 0) - { - for (int j = 0; j < npar; j++) - for (int i = 0; i < n; i++) - y(i,j+1) = sx0(i,j); - } - - integration_error = false; - - user_fsub = ODESFunc::fsub_function (); - user_bsub = ODESFunc::bsub_function (); - user_jsub = ODESFunc::jsub_function (); - - int idf; - - if (user_bsub) - idf = 1; - else - idf = 0; - - iopt(2) = idf; - - if (restart) - { - restart = false; - istate = 1; - } - - int max_maxord = 0; - - if (integration_method () == "stiff") - { - if (user_jsub) - method_flag = 21; - else - method_flag = 22; - - max_maxord = 5; - - if (isopt) - { - liw = 21 + n + npar; - lrw = 22 + 8*(npar+1)*n + n*n + n; - } - else - { - liw = 20 + n; - lrw = 22 + 9*n + n*n; - } - } - else - { - max_maxord = 12; - - if (isopt) - { - if (user_jsub) - method_flag = 11; - else - method_flag = 12; - liw = 21 + n + npar; - lrw = 22 + 15*(npar+1)*n + n*n + n; - } - else - { - method_flag = 10; - liw = 20 + n; - lrw = 22 + 16 * n; - } - } - - if (iwork.length () != liw) - { - iwork.resize (liw); - - for (int i = 4; i < 10; i++) - iwork.elem (i) = 0; - } - - if (rwork.length () != lrw) - { - rwork.resize (lrw); - - for (int i = 4; i < 10; i++) - rwork.elem (i) = 0.0; - } - - maxord = maximum_order (); - - if (maxord >= 0) - { - if (maxord > 0 && maxord <= max_maxord) - { - iwork(4) = maxord; - iopt(0) = 1; - } - else - { - (*current_liboctave_error_handler) - ("odessa: invalid value for maximum order"); - integration_error = true; - return; - } - } - - initialized = true; - } - - integration_error = false; - - // NOTE: this won't work if LSODE passes copies of the state vector. - // In that case we have to create a temporary vector object - // and copy. - - - if (! sanity_checked) - { - ColumnVector fval = user_fsub (x, t, theta); - - if (fval.length () != x.length ()) - { - (*current_liboctave_error_handler) - ("odessa: inconsistent sizes for state and residual vectors"); - - integration_error = true; - return; - } - - sanity_checked = true; - } - - if (stop_time_set) - { - itask = 4; - rwork.elem (0) = stop_time; - iopt(0) = 1; - } - else - { - itask = 1; - } - - double rel_tol = relative_tolerance (); - - Array abs_tol = absolute_tolerance (); //note; this should - // be a matrix, not a vector - - int abs_tol_len = abs_tol.length (); - - int itol; - - if (abs_tol_len == 1) - itol = 1; - else if (abs_tol_len == n) - itol = 2; - else - { - (*current_liboctave_error_handler) - ("odessa: inconsistent sizes for state and absolute tolerance vectors"); - - integration_error = 1; - return; - } - - if (initial_step_size () >= 0.0) - { - rwork.elem (4) = initial_step_size (); - iopt(0) = 1; - } - - if (maximum_step_size () >= 0.0) - { - rwork.elem (5) = maximum_step_size (); - iopt(0) = 1; - } - - if (minimum_step_size () >= 0.0) - { - rwork.elem (6) = minimum_step_size (); - iopt(0) = 1; - } - - if (step_limit () > 0) - { - iwork.elem (5) = step_limit (); - iopt(0) = 1; - } - - py = y.fortran_vec (); - piwork = iwork.fortran_vec (); - prwork = rwork.fortran_vec (); - ppar = par.fortran_vec (); - piopt = iopt.fortran_vec (); - pneq = neq.fortran_vec (); - - const double *pabs_tol = abs_tol.fortran_vec (); - - F77_XFCN (dodessa, DODESSA, (odessa_f, odessa_b, pneq, py, ppar, t, - tout, itol, rel_tol, pabs_tol, itask, - istate, piopt, prwork, lrw, piwork, liw, - odessa_j, method_flag)); - - if (f77_exception_encountered) - { - integration_error = true; - (*current_liboctave_error_handler) ("unrecoverable error in odessa"); - } - else - { - switch (istate) - { - case 1: // prior to initial integration step. - case 2: // odessa was successful. - t = tout; - break; - - case -1: // excess work done on this call (perhaps wrong mf). - case -2: // excess accuracy requested (tolerances too small). - case -3: // illegal input detected (see printed message). - case -4: // repeated error test failures (check all inputs). - case -5: // repeated convergence failures (perhaps bad jacobian - // supplied or wrong choice of mf or tolerances). - case -6: // error weight became zero during problem. (solution - // component i vanished, and atol or atol(i) = 0.) - case -13: // Return requested in user-supplied function. - integration_error = 1; - break; - - default: - integration_error = 1; - (*current_liboctave_error_handler) - ("unrecognized value of istate (= %d) returned from odessa", - istate); - break; - } - } -} - -std::string -ODESSA::error_message (void) const -{ - std::string retval; - - OSSTREAM buf; - buf << t << OSSTREAM_ENDS; - std::string t_curr = OSSTREAM_STR (buf); - OSSTREAM_FREEZE (buf); - - switch (istate) - { - case 1: - retval = "prior to initial integration step"; - break; - - case 2: - retval = "successful exit"; - break; - - case 3: - retval = "prior to continuation call with modified parameters"; - break; - - case -1: - retval = std::string ("excess work on this call (t = ") - + t_curr + "; perhaps wrong integration method)"; - break; - - case -2: - retval = "excess accuracy requested (tolerances too small)"; - break; - - case -3: - retval = "invalid input detected (see printed message)"; - break; - - case -4: - retval = std::string ("repeated error test failures (t = ") - + t_curr + "check all inputs)"; - break; - - case -5: - retval = std::string ("repeated convergence failures (t = ") - + t_curr - + "perhaps bad jacobian supplied or wrong choice of integration method or tolerances)"; - break; - - case -6: - retval = std::string ("error weight became zero during problem. (t = ") - + t_curr - + "; solution component i vanished, and atol or atol(i) == 0)"; - break; - - case -13: - retval = "return requested in user-supplied function (t = " - + t_curr + ")"; - break; - - default: - retval = "unknown error state"; - break; - } - - return retval; -} - - -ODESSA_result -ODESSA::integrate (const ColumnVector& tout) -{ - ODESSA_result retval; - - Matrix x_out; - - Array x_s_out; - - int n_out = tout.capacity (); - - if (n_out > 0 && n > 0) - { - x_out.resize (n_out, n); - - x_s_out.resize (npar, Matrix (n_out, n, 0.0)); - - for (int j = 0; j < n_out; j++) - { - integrate (tout(j)); - - if (integration_error) - { - retval = ODESSA_result (x_out, x_s_out); - return retval; - } - - for (int i = 0; i < n; i++) - { - x_out(j,i) = y(i,0); - - for (int k = 0; k < npar; k++) - { - x_s_out(k)(j,i) = y(i,k+1); - } - } - } - } - - retval = ODESSA_result (x_out, x_s_out); - - return retval; -} - -ODESSA_result -ODESSA::integrate (const ColumnVector& tout, const ColumnVector& tcrit) -{ - ODESSA_result retval; - - Matrix x_out; - - Array x_s_out; - - int n_out = tout.capacity (); - - if (n_out > 0 && n > 0) - { - x_out.resize (n_out, n); - - x_s_out.resize (npar, Matrix (n_out, n, 0.0)); - - int n_crit = tcrit.capacity (); - - if (n_crit > 0) - { - int i_crit = 0; - int i_out = 0; - double next_crit = tcrit(0); - double next_out; - while (i_out < n_out) - { - bool do_restart = false; - - next_out = tout(i_out); - if (i_crit < n_crit) - next_crit = tcrit(i_crit); - - int save_output; - double t_out; - - if (next_crit == next_out) - { - set_stop_time (next_crit); - t_out = next_out; - save_output = true; - i_out++; - i_crit++; - do_restart = true; - } - else if (next_crit < next_out) - { - if (i_crit < n_crit) - { - set_stop_time (next_crit); - t_out = next_crit; - save_output = false; - i_crit++; - do_restart = true; - } - else - { - clear_stop_time (); - t_out = next_out; - save_output = true; - i_out++; - } - } - else - { - set_stop_time (next_crit); - t_out = next_out; - save_output = true; - i_out++; - } - integrate (t_out); - if (integration_error) - { - retval = ODESSA_result (x_out, x_s_out); - return retval; - } - if (save_output) - { - for (int i = 0; i < n; i++) - { - x_out(i_out-1,i) = y(i,0); - - for (int k = 0; k < npar; k++) - { - x_s_out(k)(i_out-1,i) = y(i,k+1); - } - } - } - - if (do_restart) - force_restart (); - } - - retval = ODESSA_result (x_out, x_s_out); - } - else - { - retval = integrate (tout); - - if (integration_error) - return retval; - } - } - - return retval; -} - -/* -;;; Local Variables: *** -;;; mode: C++ *** -;;; End: *** -*/ diff -r 9d9bbda4f00c -r 1278a2bc1527 liboctave/ODESSA.h --- a/liboctave/ODESSA.h Tue Mar 01 18:26:20 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +0,0 @@ -/* - -Copyright (C) 2002 John W. Eaton - -This file is part of Octave. - -Octave is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. - -Octave is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with Octave; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ - -#if !defined (octave_ODESSA_h) -#define octave_ODESSA_h 1 - -#include -#include - -#include "ODESSA-opts.h" - -class -ODESSA_result -{ -public: - - ODESSA_result (void) { } - - ODESSA_result (const Matrix& xx, - const Array& xx_s) - - : x (xx), x_s (xx_s) { } - - ODESSA_result (const ODESSA_result& r) - : x (r.x), x_s (r.x_s) { } - - ODESSA_result& operator = (const ODESSA_result& r) - { - if (this != &r) - { - x = r.x; - x_s = r.x_s; - } - return *this; - } - - ~ODESSA_result (void) { } - - Matrix state (void) const { return x; } - Array state_sensitivity (void) const { return x_s; } - -private: - - Matrix x; - Array x_s; -}; - -class -ODESSA : public ODES, public ODESSA_options -{ -public: - - ODESSA (void); - - ODESSA (const ColumnVector& x, double time, ODESFunc& f); - - ODESSA (const ColumnVector& x, const ColumnVector& theta, - const Matrix& sensitivity_guess, double time, ODESFunc& f); - - ~ODESSA (void) { } - - ODESSA_result integrate (const ColumnVector& tout); - - ODESSA_result integrate (const ColumnVector& tout, - const ColumnVector& tcrit); - - std::string error_message (void) const; - -private: - - bool initialized; - - bool sanity_checked; - - int liw; - int lrw; - int method_flag; - int maxord; - Array iwork; - Array rwork; - int itask; - Array iopt; - int isopt; - - Array neq; - - int n; - int npar; - - // XXX FIXME XXX -- ??? - Array par; - - Matrix sx0; - - Matrix y; - - double *py; - double *ppar; - int *piwork; - int *piopt; - int *pneq; - double *prwork; - - void init_work_size (int); - - void integrate (double t); -}; - -#endif - -/* -;;; Local Variables: *** -;;; mode: C++ *** -;;; End: *** -*/ diff -r 9d9bbda4f00c -r 1278a2bc1527 src/ChangeLog --- a/src/ChangeLog Tue Mar 01 18:26:20 2005 +0000 +++ b/src/ChangeLog Wed Mar 02 01:38:31 2005 +0000 @@ -1,3 +1,9 @@ +2005-03-01 John W. Eaton + + * DLD-FUNCTIONS/odessa.cc: Delete. + * Makefile.in (DLD_XSRC): Remove it from the list. + (OPT_HANDLERS): Remove ODESSA-opts.cc from the list. + 2005-02-28 John W. Eaton * toplev.cc (octave_config_info): Remove LIBGLOB and GLOB_INCFLAGS diff -r 9d9bbda4f00c -r 1278a2bc1527 src/Makefile.in --- a/src/Makefile.in Tue Mar 01 18:26:20 2005 +0000 +++ b/src/Makefile.in Wed Mar 02 01:38:31 2005 +0000 @@ -40,14 +40,14 @@ endif OPT_HANDLERS := DASPK-opts.cc DASRT-opts.cc DASSL-opts.cc \ - LSODE-opts.cc NLEqn-opts.cc ODESSA-opts.cc Quad-opts.cc + LSODE-opts.cc NLEqn-opts.cc Quad-opts.cc DLD_XSRC := balance.cc besselj.cc betainc.cc chol.cc colamd.cc \ colloc.cc daspk.cc dasrt.cc dassl.cc det.cc dispatch.cc \ eig.cc expm.cc fft.cc fft2.cc fftn.cc fftw_wisdom.cc \ filter.cc find.cc fsolve.cc gammainc.cc gcd.cc getgrent.cc \ getpwent.cc getrusage.cc givens.cc hess.cc inv.cc kron.cc \ - lpsolve.cc lsode.cc lu.cc minmax.cc odessa.cc pinv.cc qr.cc \ + lpsolve.cc lsode.cc lu.cc minmax.cc pinv.cc qr.cc \ quad.cc qz.cc rand.cc schur.cc sort.cc sparse.cc spdet.cc \ splu.cc spparms.cc sqrtm.cc svd.cc syl.cc time.cc gplot.l