You are on page 1of 8

C

C SUBROUTINE RKI36(F,NEQN,Y,T,TOUT,HMAX,RELERR,ABSERR,IFLAG,WORK,IWORK)
C
C
C ***********************************************************
C * LOBATTO THIRD-SIXTH ORDER IMPLICIT RUNGE-KUTTA METHOD *
C ***********************************************************
C * WITH STEPSIZE CONTROL *
C ***********************************************************
C
C
C ELABORATED BY: ANDRES L. GRANADOS M.
C UNIVERSIDAD SIMON BOLIVAR
C CARACAS, VENEZUELA
C 1988
C
C
C VERSION JULY/92
C ***************
C
C
C ABSTRACT
C ********
C
C RKI36 IS PRIMARILY DESIGNED TO SOLVE MILDLY STIFF AND HIGH STIFF
C DIFFERENTIAL EQUATIONS WHEN DERIVATIVE EVALUATIONS ARE INEXPENSIVE
C
C RKI36 SHOULD GENERALLY BE USED WHEN THE USER IS DEMANDING HIGH
C ACCURACY.
C
C SUBROUTINE RKI36 INTEGRATES A SYSTEM OF NEQN FIRST ORDER
C ORDINARY DIFFERENTIAL EQUATIONS OF THE FORM
C
C DY(I)/DT = F(T,Y(1),Y(2),...,Y(NEQN))
C
C WHERE THE Y(I) ARE GIVEN AT T.
C
C TYPICALLY THE SUBROUTINE IS USED TO INTEGRATE FROM T TO TOUT BUT
C IT CAN BE USED AS A ONE-STEP INTEGRATOR TO ADVANCE THE SOLUTION A
C SINGLE STEP IN THE DIRECTION OF TOUT. ON RETURN THE PARAMETERS IN
C THE CALL LIST ARE SET FOR CONTINUING THE INTEGRATION. THE USER HAS
C ONLY TO CALL RKI36 AGAIN (AND PERHAPS DEFINE A NEW VALUE FOR TOUT)
C ACTUALLY, RKI36 IS AN INTERFACING ROUTINE WHICH CALLS SUBROUTINE
C RKIM FOR THE SOLUTION. RKIM IN TURN CALLS SUBROUTINE RLOB WHICH
C COMPUTES AN APPROXIMATE SOLUTION OVER ONE STEP.
C
C THE RKI36 ALGORITHM WAS INITIALLY DEVELOPED AS A PART OF THE
C MASTER THESIS:
C GRANADOS M., ANDRES L., "CONVECCION FORZADA TURBULENTA EN TUBERIAS
C VERTICALES EXPUESTAS A CONVECCION NATURAL", UNIVERSIDAD SIMON
C BOLIVAR. CARACAS, VENEZUELA. 1988.
C
C AFTER THIS, THE ALGORITHM RKI36 HAS BEEN IMPROVED IN INTEVEP, S.A.
C THE GOVERNMENT RESEARCH FACILITY FOR PETROLEUM INDUSTRY.
C LOS TEQUES, EDO. MIRANDA. VENEZUELA. SEE FOR EXAMPLE:
C LOBATTO IMPLICIT SIXTH ORDER RUNGE-KUTTA METHOD FOR SOLVING ORDINARY
C DIFFERENTIAL EQUATIONS WITH STEPSIZE CONTROL. V CONGRESO ARGENTINO
C DE MECANICA COMPUTACIONAL, MECOM'96, AT SAN MIGUEL DE TUCUMAN, Vol.V
C SEPT. 1996.
C
C RKI36 USES THE THIRD-SIXTH ORDER IMPLICIT RUNGE-KUTTA METHOD BASED
C ON LOBATTO CUADRATURE DESCRIBED IN THE REFERENCE:
C LAPIDUS, L. AND SEINFELD, J. H., "NUMERICAL SOLUTION OF ORDINARY
C DIFFERENCIAL EQUATIONS", ACADEMIC PRESS, 1971.
C
C THE AUXILIAR EXPLICIT RUNGE-KUTTA METHOD FOR INICIAL ITERATIVE
C APROXIMATION IS BASED ON RALSTON (1965) PROCEDURE FOR FOURTH ORDER
C RUNGE KUTTA METHOD AND IS DESCRIBED IN THE REFERENCE :
C GEAR, C.W., "NUMERICAL INITIAL VALUE PROBLEMS IN ORDINARY DIFFE-
C RENTIAL EQUATIONS", PRENTICE-HALL, 1971.
C
C THE PERFORMANCE OF RKI36 IS SIMILAR TO RKF45 WHICH IS ILLUSTRATED
C IN THE REFERENCE :
C SHAMPINE, L.F., WATTS, H.A. AND DAVENPORT, S. M., "SOLVING NON-STIFF
C ORDINARY DIFFERENTIAL EQUATIONS - THE STATE OF THE ART", SANDIA
C LABORATORIES REPORT SAND75-0182, 1975. SIAM REVIEW, VOL.18, NO.3,
C 1976, PP.376-411.
C
C THE STEPSIZE CONTROL IS SIMILAR TO THAT USED IN THE PROGRAM
C RKF45 FOR THE RUNGE-KUTTA-FEHLBERG (4,5), WHICH IS DESCRIBED
C IN THE REFERENCE:
C E.FEHLBERG , LOW-ORDER CLASSICAL RUNGE-KUTTA FORMULAS WITH
C STEPSIZE CONTROL, NASA REPORT No. TR R-315, (1971).
C
C
C THE PARAMETERS REPRESENT
C ************************
C
C F -- SUBROUTINE F(T,Y,YP) TO EVALUATE DERIVATIVES YP(I)=DY(I)/DT
C NEQN -- NUMBER OF EQUATIONS TO BE INTEGRATED
C Y(*) -- SOLUTION VECTOR AT T
C T -- INDEPENDENT VARIABLE
C TOUT -- OUTPUT POINT AT WHICH SOLUTION IS DESIRED
C HMAX -- GREATEST STEPSIZE FROM T TO TOUT
C RELERR,ABSERR -- RELATIVE AND ABSOLUTE ERROR TOLERANCES FOR
C LOCAL ERROR TEST. AT EACH STEP THE CODE REQUIRES THAT
C ABS(LOCAL ERROR) .LE. RELERR * ABS(Y) + ABSERR
C FOR EACH COMPONENT OF THE LOCAL ERROR AND SOLUTION VECTORS
C IFLAG -- INDICATOR FOR STATUS OF INTEGRATION
C WORK(*) -- ARRAY TO HOLD INFORMATION INTERNAL TO RKI36 WHICH IS
C NECESSARY FOR SUBSEQUENT CALLS. MUST BE DIMENSIONED
C AT LEAST 5*NEQN+3
C IWORK(*) -- INTEGER ARRAY USED TO HOLD INFORMATION INTERNAL TO
C RKI36 WHICH IS NECESSARY FOR SUBSEQUENT CALLS. MUST BE
C DIMENSIONED AT LEAST 5
C
C
C FIRST CALL TO RKI36
C *******************
C
C THE USER MUST PROVIDE STORAGE IN HIS CALLING PROGRAM FOR THE ARRAY
C IN THE CALL LIST - Y(NEQN) , WORK(5*NEQN+3) , IWORK(5) ,
C DECLARE F IN AN EXTERNAL STATEMENT, SUPPLY SUBROUTINE F(T,Y,YP)
C AND INITIALIZE THE FOLLOWING PARAMETERS :
C
C NEQN -- NUMBER OF EQUATIONS TO BE INTEGRATED. (NEQN .GE. 1)
C Y(*) -- VECTOR OF INITIAL CONDITIONS
C T -- STARTING POINT OF INTEGRATION , MUST BE A VARIABLE
C TOUT -- OUTPUT POINT AT WHICH SOLUTION IS DESIRED.
C T=TOUT IS ALLOWED ON THE FIRST CALL ONLY, IN WHICH CASE
C RKI36 RETURNS WITH IFLAG=2 IF CONTINUATION IS POSSIBLE.
C HMAX -- GREATEST STEPSIZE H FROM T TO TOUT. WHEN IFLAG = +1
C OR -1, HMAX INITIATE CERO, OTHERWISE IT ASSUME THE LAST
C INTEGRATION VALUE WHICH CAN BE CHANGED TO CERO AGAIN BY
C THE USER OUTSIDE RKI36 IF DESIRE.
C RELERR,ABSERR -- RELATIVE AND ABSOLUTE LOCAL ERROR TOLERANCES
C WHICH MUST BE POSSITIVE. RELERR MUST BE A VARIABLE WHILE
C ABSERR MAY BE A CONSTANT. THE CODE SHOULD NORMALLY NOT BE
C USED WITH RELATIVE ERROR CONTROL SMALLER THAN ABOUT 1.E-8
C TO AVOID LIMITING PRECISION DIFFICULTIES THE CODE REQUIRES
C RELERR TO BE LARGER THAN AN INTERNALLY COMPUTED RELATIVE
C ERROR PARAMETER WHICH IS MACHINE DEPENDENT. IN PARTICULAR,
C PURE ABSOLUTE ERROR IS NOT PERMITTED. IF A SMALLER THAN
C ALLOWABLE VALUE OF RELERR IS ATTEMPTED, RKI36 INCREASES
C RELERR APPROPRIATELY AND RETURNS CONTROL TO THE USER
C BEFORE CONTINUING THE INTEGRATION.
C IFLAG -- +1,-1 INDICATOR TO INITIALIZE THE CODE FOR EACH NEW
C PROBLEM. NORMAL INPUT IS +1. THE USER SHOULD SET IFLAG=-1
C ONLY WHEN ONE-STEP INTEGRATOR CONTROL IS ESSENTIAL. IN
C THIS CASE, RKI36 ATTEMPTS TO ADVANCE THE SOLUTION A SINGLE
C STEP IN THE DIRECTION OF TOUT, EACH TIME IT IS CALLED.
C SINCE THIS MODE OF OPERATION RESULTS IN EXTRA COMPUTING
C OVERHEAD, IT SHOULD BE AVOIDED UNLESS NEEDED.
C
C
C OUTPUT FROM RKI36
C *****************
C
C Y(*) -- SOLUTION AT T
C T -- LAST POINT REACHED IN INTEGRATION.
C IFLAG = 2 -- INTEGRATION REACHED TOUT. INDICATES SUCCESSFUL
C RETURN AND IS THE NORMAL MODE FOR CONTINUING
C INTEGRATION.
C =-2 -- A SINGLE SUCCESSFUL STEP IN THE DIRECTION OF TOUT
C HAS BEEN TAKEN. NORMAL MODE FOR CONTINUING
C INTEGRATION ONE STEP AT A TIME.
C = 3 -- INTEGRATION WAS NOT COMPLETED BECAUSE RELATIVE
C ERROR TOLERANCE WAS TOO SMALL. RELERR HAS BEEN
C INCREASED APPROPRIATELY FOR CONTINUING.
C = 4 -- INTEGRATION WAS NOT COMPLETED BECAUSE MORE THAN
C 100000 DERIVATIVE EVALUATIONS WERE NEEDED. THIS
C OCCUR FRECUENTLY WHEN THE ORDINARY DIFFERENCIAL
C EQUATIONS SYSTEM IS HIGHLY STIFF.
C = 5 -- INTEGRATION WAS NOT COMPLETED BECAUSE SOLUTION
C VANISHED MAKING A PURE RELATIVE ERROR TEST
C IMPOSSIBLE. MUST USE NON-ZERO ABSERR TO CONTINUE.
C USING THE ONE-STEP INTEGRATION MODE FOR ONE STEP
C IS A GOOD WAY TO PROCEED.
C = 6 -- INTEGRATION WAS NOT COMPLETED BECAUSE REQUESTED
C ACCURACY COULD NOT BE ACHIEVED USING SMALLEST
C ALLOWABLE STEPSIZE. USER MUST INCREASE THE ERROR
C TOLERANCE BEFORE CONTINUED INTEGRATION CAN BE
C ATTEMPTED.
C = 7 -- IT IS LIKELY THAT RKI36 IS INEFFICIENT FOR SOLVING
C THIS PROBLEM. TOO MUCH OUTPUT IS RESTRICTING THE
C NATURAL STEPSIZE CHOICE. USE THE ONE-STEP
C INTEGRATOR MODE.
C = 8 -- INVALID INPUT PARAMETERS
C THIS INDICATOR OCCURS IF ANY OF THE FOLLOWING IS
C SATISFIED - NEQN .LE. 0
C T=TOUT AND IFLAG .NE. +1 OR -1
C RELERR OR ABSERR .LT. 0.
C IFLAG .EQ. 0 OR .LT. -2 OR .GT. 8
C WORK(*),IWORK(*) -- INFORMATION WHICH IS USUALLY OF NO INTEREST
C TO THE USER BUT NECESSARY FOR SUBSEQUENT CALLS.
C WORK(1),..,WORK(NEQN) CONTAIN THE FIRST DERIVATIVES
C OF THE SOLUTION VECTOR Y AT T.
C WORK(NEQN+1) CONTAINS THE STEPSIZE H TO BE ATTEMPTED
C ON THE NEXT STEP.
C IWORK(1) CONTAINS THE DERIVATIVE EVALUATION
C COUNTER
C
C
C SUBSEQUENT CALLS TO RKI36
C *************************
C
C SUBROUTINE RKI36 RETURNS WITH ALL INFORMATION NEEDED TO CONTINUE
C THE INTEGRATION. IF THE VALUE T REACHED TOUT, THE USER NEED ONLY
C DEFINE A NEW TOUT AND CALL RKI36 AGAIN. IN THE ONE-STEP INTEGRATOR
C MODE (IFLAG=-2) THE USER MUST KEEP IN MIND THAT EACH STEP TAKEN
C IS IN THE DIRECTION OF THE CURRENT TOUT. UPON REACHING TOUT (INDI-
C CATE BY CHANGING IFLAG TO 2),THE USER MUST THEN DEFINE A NEW TOUT
C AND RESET IFLAG TO -2 TO CONTINUE IN THE ONE-STEP INTEGRATOR MODE.
C
C IF THE INTEGRATION WAS NOT COMPLETED BUT THE USER STILL WANTS TO
C CONTINUE (IFLAG=3,4 CASES), HE JUST CALLS RKI36 AGAIN. WITH
C IFLAG=3 THE RELERR PARAMETER HAS BEEN ADJUSTED APPROPRIATELY FOR
C CONTINUING THE INTEGRATION. IN THE CASE OF IFLAG=4 THE FUNCTION
C COUNTER WILL BE RESET TO 0 AND ANOTHER 100000 FUNCTION EVALUA-
C TIONS ARE ALLOWED.
C
C HOWEVER,IN THE CASE IFLAG=5, THE USER MUST FIRST ALTER THE ERROR
C CRITERION TO USE A POSITIVE VALUE OF ABSERR BEFORE INTEGRATION CAN
C PROCEED. IF HE DOES NOT,EXECUTION IS TERMINATED.
C
C ALSO,IN THE CASE IFLAG=6, IT IS NECESSARY FOR THE USER TO RESET
C IFLAG TO 2 (OR -2 WHEN ONE-STEP INTEGRATION MODE IS BEING USED)
C AS WELL AS INCREASING EITHER ABSERR,RELERR OR BOTH BEFORE THE
C INTEGRATION CAN BE CONTINUED. IF THIS IS NOT DONE, EXECUTION WILL
C BE TERMINATED. THE OCCURRENCE OF IFLAG=6 INDICATES A TROUBLE SPOT
C (SOLUTION IS CHANGING RAPIDLY,SINGULARITY MAY BE PRESENT) AND IT
C OFTEN IS INADVISABLE TO CONTINUE.
C
C IF IFLAG=7 IS ENCOUNTERED, THE USER SHOULD USE THE ONE-STEP
C INTEGRATION MODE WITH THE STEPSIZE DETERMINED BY THE CODE OR
C CONSIDER SWITCHING TO THE ADAMS CODES DE/STEP,INTRP. IF THE USER
C INSISTS UPON CONTINUING THE INTEGRATION WITH RKI36, HE MUST RESET
C IFLAG TO 2 BEFORE CALLING RKI36 AGAIN. OTHERWISE,EXECUTION WILL BE
C TERMINATED.
C
C IF IFLAG=8 IS OBTAINED, INTEGRATION CAN NOT BE CONTINUED UNLESS
C THE INVALID INPUT PARAMETERS ARE CORRECTED.
C
C IT SHOULD BE NOTED THAT THE ARRAYS WORK,IWORK CONTAIN INFORMATION
C REQUIRED FOR SUBSEQUENT INTEGRATION. ACCORDINGLY, WORK AND IWORK
C SHOULD NOT BE ALTERED.
C
C
C
SUBROUTINE RKI36(F,NEQN,Y,T,TOUT,HMAX,RELERR,
* ABSERR,IFLAG,WORK,IWORK)
IMPLICIT INTEGER (I-N)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION Y(NEQN),IWORK(5),WORK(5*NEQN+3)
EXTERNAL F
K1M=NEQN+1
K1=K1M+1
K2=K1+NEQN
K3=K2+NEQN
K4=K3+NEQN
K5=K4+NEQN
CALL RKIM(F,NEQN,Y,T,TOUT,HMAX,RELERR,ABSERR,IFLAG,WORK(1),
* WORK(K1M),WORK(K1),WORK(K2),WORK(K3),WORK(K4),
* WORK(K5),WORK(K5+1),IWORK(1),IWORK(2),IWORK(3),
* IWORK(4),IWORK(5))
C
RETURN
END
C
C
C
C
SUBROUTINE RKIM(F,NEQN,Y,T,TOUT,HMAX,RELERR,ABSERR,IFLAG,
* DY,H,F2,F3,F4,YY,SAVRE,SAVAE,NFE,KOP,INIT,
* JFLAG,KFLAG)
IMPLICIT INTEGER (I-N)
IMPLICIT REAL*8 (A-H,O-Z)
LOGICAL LFAIL,LOUT
DIMENSION Y(NEQN),DY(NEQN),F2(NEQN),F3(NEQN),F4(NEQN),YY(NEQN)
COMMON/CONST/C1,C2,C3,C4,C5,C6,C7
EXTERNAL F
DATA REMIN/1.0D-12/
DATA MAXNFE/100000/
DATA ITMAX/300/
C
C1=DSQRT(5.0D+00)
C2=5.0D+00-C1
C3=5.0D+00+C1
C4=15.0D+00-7.0D+00*C1
C5=15.0D+00+7.0D+00*C1
C6=5.0D+00+3.0D+00*C1
C7=15.0D+00+5.0D+00*C1
C8=(0.9D+00/5.0D+00)**4
IF(NEQN.LT.1) GOTO 10
IF((RELERR.LT.0.0D+00).OR.(ABSERR.LT.0.0D+00)) GOTO 10
MFLAG=IABS(IFLAG)
IF((MFLAG.EQ.0).OR.(MFLAG.GT.8)) GOTO 10
IF(MFLAG.NE.1) GOTO 20
HMAX=0.0D+00
EPS=1.0D+00
5 EPS=EPS/2.0D+00
EPS1=EPS+1.0D+00
IF(EPS1.GT.1.0D+00) GOTO 5
U26=26.0D+00*EPS
GOTO 50
10 IFLAG=8
RETURN
20 IF((T.EQ.TOUT).AND.(KFLAG.NE.3)) GOTO 10
IF(MFLAG.NE.2) GOTO 25
IF((KFLAG.EQ.3).OR.(INIT.EQ.0)) GOTO 45
IF(KFLAG.EQ.4) GOTO 40
IF((KFLAG.EQ.5).AND.(ABSERR.EQ.0.0D+00)) GOTO 30
IF((KFLAG.EQ.6).AND.(RELERR.LE.SAVRE).AND.
* (ABSERR.LE.SAVAE)) GOTO 30
GOTO 50
25 IF(IFLAG.EQ.3) GOTO 45
IF(IFLAG.EQ.4) GOTO 40
IF((IFLAG.EQ.5).AND.(ABSERR.GT.0.0D+00)) GOTO 45
30 STOP
40 NFE=0
IF(MFLAG.EQ.2) GOTO 50
45 IFLAG=JFLAG
IF(KFLAG.EQ.3) MFLAG=IABS(IFLAG)
50 JFLAG=IFLAG
KFLAG=0
SAVRE=RELERR
SAVAE=ABSERR
RER=2.0D+00*EPS+REMIN
IF(RELERR.GE.RER) GOTO 55
RELERR=RER
IFLAG=3
KFLAG=3
RETURN
55 DT=TOUT-T
IF(MFLAG.EQ.1) GOTO 60
IF(INIT.EQ.0) GOTO 65
GOTO 80
60 INIT=0
KOP=0
A=T
CALL F(A,Y,DY)
NFE=1
IF(T.NE.TOUT) GOTO 65
IFLAG=2
RETURN
65 INIT=1
H=DABS(DT)
TOLN=0.0D+00
DO 70 K=1,NEQN
TOL=RELERR*DABS(Y(K))+ABSERR
IF(TOL.LE.0.0D+00) GOTO 70
TOLN=TOL
DYK=DABS(DY(K))
IF(DYK*H**2.GT.TOL/H**2) H=(TOL/DYK)**0.25D+00
70 CONTINUE
IF(TOLN.LE.0.0D+00) H=0.0D+00
HMIN=U26*DMAX1(DABS(T),DABS(DT))
H=DMAX1(H,HMIN)
JFLAG=ISIGN(2,IFLAG)
80 H=DSIGN(H,DT)
IF(DABS(H).GE.2.0D+00*DABS(DT)) KOP=KOP+1
IF(KOP.NE.100) GOTO 85
KOP=0
IFLAG=7
RETURN
85 IF(DABS(DT).GT.U26*DABS(T)) GOTO 95
DO 90 K=1,NEQN
90 Y(K)=Y(K)+DT*DY(K)
A=TOUT
CALL F(A,Y,DY)
NFE=NFE+1
GOTO 300
95 LOUT=.FALSE.
SCALE=2.0D+00/RELERR
AE=SCALE*ABSERR
100 LFAIL=.FALSE.
HMIN=U26*DABS(T)
DT=TOUT-T
IF(DABS(DT).GE.2.0D+00*DABS(H)) GOTO 200
IF(DABS(DT).GT.DABS(H)) GOTO 150
LOUT=.TRUE.
H=DT
GOTO 200
150 H=0.5D+00*DT
200 IF(NFE.LE.MAXNFE) GOTO 220
IFLAG=4
KFLAG=4
RETURN
220 CALL RLOB(F,NEQN,RELERR,ABSERR,ITMAX,ITM,
* Y,T,H,DY,F2,F3,F4,YY)
NFE=NFE+2*ITM+3
EEOET=0.0D+00
DO 250 K=1,NEQN
ET=DABS(Y(K))+DABS(YY(K))+AE
IF(ET.GT.0.0D+00) GOTO 240
IFLAG=5
RETURN
240 EE=DABS(-DY(K)+C1*(F2(K)-F3(K))+F4(K))
250 EEOET=DMAX1(EEOET,EE/ET)
ESTTOL=DABS(H)*EEOET*SCALE/12.0D+00
IF(ESTTOL.LE.1.0D+00) GOTO 260
LFAIL=.TRUE.
LOUT=.FALSE.
S=0.1D+00
IF(ESTTOL.LT.6561.0D+00) S=0.9D+00/ESTTOL**0.25D+00
H=S*H
IF(DABS(H).GT.HMIN) GOTO 200
IFLAG=6
KFLAG=6
RETURN
260 T=T+H
HMAX=DMAX1(DABS(H),HMAX)
DO 270 K=1,NEQN
DY(K)=F4(K)
270 Y(K)=YY(K)
A=T
CALL F(A,Y,DY)
NFE=NFE+1
S=5.0D+00
IF(ESTTOL.GT.C8) S=0.9D+00/ESTTOL**0.25D+00
IF(LFAIL) S=DMIN1(S,1.0D+00)
H=DSIGN(DMAX1(S*DABS(H),HMIN),H)
IF(LOUT) GOTO 300
IF(IFLAG.GT.0) GOTO 100
IFLAG=-2
RETURN
300 T=TOUT
IFLAG=2
C
RETURN
END
C
C
C
C
SUBROUTINE RLOB(F,NEQN,RELERR,ABSERR,ITMAX,ITM,
* Y,T,H,DY,F2,F3,F4,YY)
IMPLICIT INTEGER (I-N)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION Y(NEQN),DY(NEQN),F2(NEQN),F3(NEQN),F4(NEQN),YY(NEQN)
COMMON/CONST/C1,C2,C3,C4,C5,C6,C7
EXTERNAL F
C
CH2=C2*H/10.0D+00
DO 221 K=1,NEQN
F2(K)=DY(K)
221 F4(K)=Y(K)+CH2*DY(K)
CALL F(T+CH2,F4,F2)
C
CH3=C3*H/10.0D+00
DO 222 K=1,NEQN
F3(K)=(-(1.0D+00+C1)*DY(K)+(3.0D+00+C1)*F2(K))/2.0D+00
222 YY(K)=Y(K)+H*(-C6*DY(K)+C7*F2(K))/20.0D+00
CALL F(T+CH3,YY,F3)
C
ERMAX=1.0D+00
C
DO 225 IT=1,ITMAX
C
ITM=IT
ERM=ERMAX
ERMAX=0.0D+00
DO 223 K=1,NEQN
FK=F4(K)
F4(K)=Y(K)+H*(C3*DY(K)+10.0D+00*F2(K)+C4*F3(K))/60.0D+00
ERK=DABS(F4(K)-FK)/DMAX1(DABS(F4(K)),DABS(FK),ABSERR)
223 ERMAX=DMAX1(ERK,ERMAX)
CALL F(T+CH2,F4,F2)
C
DO 224 K=1,NEQN
FK=YY(K)
YY(K)=Y(K)+H*(C2*DY(K)+C5*F2(K)+10.0D+00*F3(K))/60.0D+00
ERK=DABS(YY(K)-FK)/DMAX1(DABS(YY(K)),DABS(FK),ABSERR)
224 ERMAX=DMAX1(ERK,ERMAX)
CALL F(T+CH3,YY,F3)
C
IF(ERMAX.LE.RELERR.OR.ERMAX.GE.ERM) GOTO 226
C
225 CONTINUE
C
226 DO 227 K=1,NEQN
F4(K)=DY(K)-C1*(F2(K)-F3(K))
227 YY(K)=Y(K)+H*(2.0D+00*DY(K)+C2*F2(K)+C3*F3(K))/12.0D+00
CALL F(T+H,YY,F4)
C
DO 228 K=1,NEQN
228 YY(K)=Y(K)+H*(DY(K)+5.0D+00*(F2(K)+F3(K))+F4(K))/12.0D+00
C
RETURN
END

You might also like