SUBROUTINE INTEGRATE( TIN, TOUT ) IMPLICIT KPP_REAL (A-H,O-Z) INCLUDE 'KPP_ROOT_params.h' INCLUDE 'KPP_ROOT_global.h' C TIN - Start Time KPP_REAL TIN C TOUT - End Time KPP_REAL TOUT INTEGER i PARAMETER (LWORK=2*NVAR*NVAR+14*NVAR+20,LIWORK=NVAR+20) KPP_REAL WORK(LWORK) INTEGER IWORK(LIWORK) EXTERNAL FUNC_CHEM,JAC_CHEM,SOLOUT ITOL=1 ! --- VECTOR TOLERANCES IJAC=1 ! --- COMPUTE THE JACOBIAN ANALYTICALLY MLJAC=NVAR ! --- JACOBIAN IS A FULL MATRIX MUJAC=NVAR ! --- JACOBIAN IS A FULL MATRIX IMAS=0 ! --- DIFFERENTIAL EQUATION IS IN EXPLICIT FORM IOUT=0 ! --- OUTPUT ROUTINE IS NOT USED DURING INTEGRATION IDFX=0 ! --- INTERNAL TIME DERIVATIVE DO i=1,20 IWORK(i) = 0 WORK(i) = 0.D0 ENDDO IWORK(2) = 6 CALL KPP_ROS4(NVAR,FUNC_CHEM,Autonomous,TIN,VAR,TOUT, & STEPMIN,RTOL,ATOL,ITOL, & JAC_CHEM,IJAC,MLJAC,MUJAC,FUNC_CHEM,IDFX, & FUNC_CHEM,IMAS,MLJAC,MUJAC, & SOLOUT,IOUT, & WORK,LWORK,IWORK,LIWORK,IDID) IF (IDID.LT.0) THEN print *,'KPP_ROS4: Unsucessful step at T=', & TIN,' (IDID=',IDID,')' ENDIF RETURN END SUBROUTINE KPP_ROS4(N,FCN,IFCN,X,Y,XEND,H, & RelTol,AbsTol,ITOL, & JAC ,IJAC,MLJAC,MUJAC,DFX,IDFX, & MAS ,IMAS,MLMAS,MUMAS, & SOLOUT,IOUT, & WORK,LWORK,IWORK,LIWORK,IDID) C ---------------------------------------------------------- C NUMERICAL SOLUTION OF A STIFF (OR DIFFERENTIAL ALGEBRAIC) C SYSTEM OF FIRST 0RDER ORDINARY DIFFERENTIAL EQUATIONS MY'=F(X,Y). C THIS IS AN EMBEDDED ROSENBROCK METHOD OF ORDER (3)4 C (WITH STEP SIZE CONTROL). C C.F. SECTION IV.7 C C AUTHORS: E. HAIRER AND G. WANNER C UNIVERSITE DE GENEVE, DEPT. DE MATHEMATIQUES C CH-1211 GENEVE 24, SWITZERLAND C E-MAIL: HAIRER@CGEUGE51.BITNET, WANNER@CGEUGE51.BITNET C C THIS CODE IS PART OF THE BOOK: C E. HAIRER AND G. WANNER, SOLVING ORDINARY DIFFERENTIAL C EQUATIONS II. STIFF AND DIFFERENTIAL-ALGEBRAIC PROBLEMS. C SPRINGER SERIES IN COMPUTATIONAL MATHEMATICS, C SPRINGER-VERLAG (1990) C C VERSION OF NOVEMBER 17, 1992 C C INPUT PARAMETERS C ---------------- C N DIMENSION OF THE SYSTEM C C FCN NAME (EXTERNAL) OF SUBROUTINE COMPUTING THE C VALUE OF F(X,Y): C SUBROUTINE FCN(N,X,Y,F) C KPP_REAL X,Y(N),F(N) C F(1)=... ETC. C C IFCN GIVES INFORMATION ON FCN: C IFCN=0: F(X,Y) INDEPENDENT OF X (AUTONOMOUS) C IFCN=1: F(X,Y) MAY DEPEND ON X (NON-AUTONOMOUS) C C X INITIAL X-VALUE C C Y(N) INITIAL VALUES FOR Y C C XEND FINAL X-VALUE (XEND-X MAY BE POSITIVE OR NEGATIVE) C C H INITIAL STEP SIZE GUESS; C FOR STIFF EQUATIONS WITH INITIAL TRANSIENT, C H=1.D0/(NORM OF F'), USUALLY 1.D-2 OR 1.D-3, IS GOOD. C THIS CHOICE IS NOT VERY IMPORTANT, THE CODE QUICKLY C ADAPTS ITS STEP SIZE. STUDY THE CHOSEN VALUES FOR A FEW C STEPS IN SUBROUTINE "SOLOUT", WHEN YOU ARE NOT SURE. C (IF H=0.D0, THE CODE PUTS H=1.D-6). C C RelTol,AbsTol RELATIVE AND ABSOLUTE ERROR TOLERANCES. THEY C CAN BE BOTH SCALARS OR ELSE BOTH VECTORS OF LENGTH N. C C ITOL SWITCH FOR RelTol AND AbsTol: C ITOL=0: BOTH RelTol AND AbsTol ARE SCALARS. C THE CODE KEEPS, ROUGHLY, THE LOCAL ERROR OF C Y(I) BELOW RelTol*ABS(Y(I))+AbsTol C ITOL=1: BOTH RelTol AND AbsTol ARE VECTORS. C THE CODE KEEPS THE LOCAL ERROR OF Y(I) BELOW C RelTol(I)*ABS(Y(I))+AbsTol(I). C C JAC NAME (EXTERNAL) OF THE SUBROUTINE WHICH COMPUTES C THE PARTIAL DERIVATIVES OF F(X,Y) WITH RESPECT TO Y C (THIS ROUTINE IS ONLY CALLED IF IJAC=1; SUPPLY C A DUMMY SUBROUTINE IN THE CASE IJAC=0). C FOR IJAC=1, THIS SUBROUTINE MUST HAVE THE FORM C SUBROUTINE JAC(N,X,Y,DFY,LDFY) C KPP_REAL X,Y(N),DFY(LDFY,N) C DFY(1,1)= ... C LDFY, THE COLOMN-LENGTH OF THE ARRAY, IS C FURNISHED BY THE CALLING PROGRAM. C IF (MLJAC.EQ.N) THE JACOBIAN IS SUPPOSED TO C BE FULL AND THE PARTIAL DERIVATIVES ARE C STORED IN DFY AS C DFY(I,J) = PARTIAL F(I) / PARTIAL Y(J) C ELSE, THE JACOBIAN IS TAKEN AS BANDED AND C THE PARTIAL DERIVATIVES ARE STORED C DIAGONAL-WISE AS C DFY(I-J+MUJAC+1,J) = PARTIAL F(I) / PARTIAL Y(J). C C IJAC SWITCH FOR THE COMPUTATION OF THE JACOBIAN: C IJAC=0: JACOBIAN IS COMPUTED INTERNALLY BY FINITE C DIFFERENCES, SUBROUTINE "JAC" IS NEVER CALLED. C IJAC=1: JACOBIAN IS SUPPLIED BY SUBROUTINE JAC. C C MLJAC SWITCH FOR THE BANDED STRUCTURE OF THE JACOBIAN: C MLJAC=N: JACOBIAN IS A FULL MATRIX. THE LINEAR C ALGEBRA IS DONE BY FULL-MATRIX GAUSS-ELIMINATION. C 0<=MLJAC= NUMBER OF NON-ZERO DIAGONALS BELOW C THE MAIN DIAGONAL). C C MUJAC UPPER BANDWITH OF JACOBIAN MATRIX (>= NUMBER OF NON- C ZERO DIAGONALS ABOVE THE MAIN DIAGONAL). C NEED NOT BE DEFINED IF MLJAC=N. C C DFX NAME (EXTERNAL) OF THE SUBROUTINE WHICH COMPUTES C THE PARTIAL DERIVATIVES OF F(X,Y) WITH RESPECT TO X C (THIS ROUTINE IS ONLY CALLED IF IDFX=1 AND IFCN=1; C SUPPLY A DUMMY SUBROUTINE IN THE CASE IDFX=0 OR IFCN=0). C OTHERWISE, THIS SUBROUTINE MUST HAVE THE FORM C SUBROUTINE DFX(N,X,Y,FX) C KPP_REAL X,Y(N),FX(N) C FX(1)= ... C C IDFX SWITCH FOR THE COMPUTATION OF THE DF/DX: C IDFX=0: DF/DX IS COMPUTED INTERNALLY BY FINITE C DIFFERENCES, SUBROUTINE "DFX" IS NEVER CALLED. C IDFX=1: DF/DX IS SUPPLIED BY SUBROUTINE DFX. C C ---- MAS,IMAS,MLMAS, AND MUMAS HAVE ANALOG MEANINGS ----- C ---- FOR THE "MASS MATRIX" (THE MATRIX "M" OF SECTION IV.8): - C C MAS NAME (EXTERNAL) OF SUBROUTINE COMPUTING THE MASS- C MATRIX M. C IF IMAS=0, THIS MATRIX IS ASSUMED TO BE THE IDENTITY C MATRIX AND NEEDS NOT TO BE DEFINED; C SUPPLY A DUMMY SUBROUTINE IN THIS CASE. C IF IMAS=1, THE SUBROUTINE MAS IS OF THE FORM C SUBROUTINE MAS(N,AM,LMAS) C KPP_REAL AM(LMAS,N) C AM(1,1)= .... C IF (MLMAS.EQ.N) THE MASS-MATRIX IS STORED C AS FULL MATRIX LIKE C AM(I,J) = M(I,J) C ELSE, THE MATRIX IS TAKEN AS BANDED AND STORED C DIAGONAL-WISE AS C AM(I-J+MUMAS+1,J) = M(I,J). C C IMAS GIVES INFORMATION ON THE MASS-MATRIX: C IMAS=0: M IS SUPPOSED TO BE THE IDENTITY C MATRIX, MAS IS NEVER CALLED. C IMAS=1: MASS-MATRIX IS SUPPLIED. C C MLMAS SWITCH FOR THE BANDED STRUCTURE OF THE MASS-MATRIX: C MLMAS=N: THE FULL MATRIX CASE. THE LINEAR C ALGEBRA IS DONE BY FULL-MATRIX GAUSS-ELIMINATION. C 0<=MLMAS= NUMBER OF NON-ZERO DIAGONALS BELOW C THE MAIN DIAGONAL). C MLMAS IS SUPPOSED TO BE .LE. MLJAC. C C MUMAS UPPER BANDWITH OF MASS-MATRIX (>= NUMBER OF NON- C ZERO DIAGONALS ABOVE THE MAIN DIAGONAL). C NEED NOT BE DEFINED IF MLMAS=N. C MUMAS IS SUPPOSED TO BE .LE. MUJAC. C C SOLOUT NAME (EXTERNAL) OF SUBROUTINE PROVIDING THE C NUMERICAL SOLUTION DURING INTEGRATION. C IF IOUT=1, IT IS CALLED AFTER EVERY SUCCESSFUL STEP. C SUPPLY A DUMMY SUBROUTINE IF IOUT=0. C IT MUST HAVE THE FORM C SUBROUTINE SOLOUT (NR,XOLD,X,Y,N,IRTRN) C KPP_REAL X,Y(N) C .... C SOLOUT FURNISHES THE SOLUTION "Y" AT THE NR-TH C GRID-POINT "X" (THEREBY THE INITIAL VALUE IS C THE FIRST GRID-POINT). C "IRTRN" SERVES TO INTERRUPT THE INTEGRATION. IF IRTRN C IS SET <0, ROS4 RETURNS TO THE CALLING PROGRAM. C C IOUT GIVES INFORMATION ON THE SUBROUTINE SOLOUT: C IOUT=0: SUBROUTINE IS NEVER CALLED C IOUT=1: SUBROUTINE IS USED FOR OUTPUT C C WORK ARRAY OF WORKING SPACE OF LENGTH "LWORK". C SERVES AS WORKING SPACE FOR ALL VECTORS AND MATRICES. C "LWORK" MUST BE AT LEAST C N*(LJAC+LMAS+LE1+8)+5 C WHERE C LJAC=N IF MLJAC=N (FULL JACOBIAN) C LJAC=MLJAC+MUJAC+1 IF MLJAC