home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / fortran / library / ssp / orddifeq / drkgs.for < prev    next >
Text File  |  1985-11-29  |  9KB  |  264 lines

  1. C
  2. C     ..................................................................
  3. C
  4. C        SUBROUTINE DRKGS
  5. C
  6. C        PURPOSE
  7. C           TO SOLVE A SYSTEM OF FIRST ORDER ORDINARY DIFFERENTIAL
  8. C           EQUATIONS WITH GIVEN INITIAL VALUES.
  9. C
  10. C        USAGE
  11. C           CALL DRKGS (PRMT,Y,DERY,NDIM,IHLF,FCT,OUTP,AUX)
  12. C           PARAMETERS FCT AND OUTP REQUIRE AN EXTERNAL STATEMENT.
  13. C
  14. C        DESCRIPTION OF PARAMETERS
  15. C           PRMT   - DOUBLE PRECISION INPUT AND OUTPUT VECTOR WITH
  16. C                    DIMENSION GREATER THAN OR EQUAL TO 5, WHICH
  17. C                    SPECIFIES THE PARAMETERS OF THE INTERVAL AND OF
  18. C                    ACCURACY AND WHICH SERVES FOR COMMUNICATION BETWEEN
  19. C                    OUTPUT SUBROUTINE (FURNISHED BY THE USER) AND
  20. C                    SUBROUTINE DRKGS. EXCEPT PRMT(5) THE COMPONENTS
  21. C                    ARE NOT DESTROYED BY SUBROUTINE DRKGS AND THEY ARE
  22. C           PRMT(1)- LOWER BOUND OF THE INTERVAL (INPUT),
  23. C           PRMT(2)- UPPER BOUND OF THE INTERVAL (INPUT),
  24. C           PRMT(3)- INITIAL INCREMENT OF THE INDEPENDENT VARIABLE
  25. C                    (INPUT),
  26. C           PRMT(4)- UPPER ERROR BOUND (INPUT). IF ABSOLUTE ERROR IS
  27. C                    GREATER THAN PRMT(4), INCREMENT GETS HALVED.
  28. C                    IF INCREMENT IS LESS THAN PRMT(3) AND ABSOLUTE
  29. C                    ERROR LESS THAN PRMT(4)/50, INCREMENT GETS DOUBLED.
  30. C                    THE USER MAY CHANGE PRMT(4) BY MEANS OF HIS
  31. C                    OUTPUT SUBROUTINE.
  32. C           PRMT(5)- NO INPUT PARAMETER. SUBROUTINE DRKGS INITIALIZES
  33. C                    PRMT(5)=0. IF THE USER WANTS TO TERMINATE
  34. C                    SUBROUTINE DRKGS AT ANY OUTPUT POINT, HE HAS TO
  35. C                    CHANGE PRMT(5) TO NON-ZERO BY MEANS OF SUBROUTINE
  36. C                    OUTP. FURTHER COMPONENTS OF VECTOR PRMT ARE
  37. C                    FEASIBLE IF ITS DIMENSION IS DEFINED GREATER
  38. C                    THAN 5. HOWEVER SUBROUTINE DRKGS DOES NOT REQUIRE
  39. C                    AND CHANGE THEM. NEVERTHELESS THEY MAY BE USEFUL
  40. C                    FOR HANDING RESULT VALUES TO THE MAIN PROGRAM
  41. C                    (CALLING DRKGS) WHICH ARE OBTAINED BY SPECIAL
  42. C                    MANIPULATIONS WITH OUTPUT DATA IN SUBROUTINE OUTP.
  43. C           Y      - DOUBLE PRECISION INPUT VECTOR OF INITIAL VALUES
  44. C                    (DESTROYED). LATERON Y IS THE RESULTING VECTOR OF
  45. C                    DEPENDENT VARIABLES COMPUTED AT INTERMEDIATE
  46. C                    POINTS X.
  47. C           DERY   - DOUBLE PRECISION INPUT VECTOR OF ERROR WEIGHTS
  48. C                    (DESTROYED). THE SUM OF ITS COMPONENTS MUST BE
  49. C                    EQUAL TO 1. LATERON DERY IS THE VECTOR OF
  50. C                    DERIVATIVES, WHICH BELONG TO FUNCTION VALUES Y AT
  51. C                    INTERMEDIATE POINTS X.
  52. C           NDIM   - AN INPUT VALUE, WHICH SPECIFIES THE NUMBER OF
  53. C                    EQUATIONS IN THE SYSTEM.
  54. C           IHLF   - AN OUTPUT VALUE, WHICH SPECIFIES THE NUMBER OF
  55. C                    BISECTIONS OF THE INITIAL INCREMENT. IF IHLF GETS
  56. C                    GREATER THAN 10, SUBROUTINE DRKGS RETURNS WITH
  57. C                    ERROR MESSAGE IHLF=11 INTO MAIN PROGRAM. ERROR
  58. C                    MESSAGE IHLF=12 OR IHLF=13 APPEARS IN CASE
  59. C                    PRMT(3)=0 OR IN CASE SIGN(PRMT(3)).NE.SIGN(PRMT(2)-
  60. C                    PRMT(1)) RESPECTIVELY.
  61. C           FCT    - THE NAME OF AN EXTERNAL SUBROUTINE USED. THIS
  62. C                    SUBROUTINE COMPUTES THE RIGHT HAND SIDES DERY OF
  63. C                    THE SYSTEM TO GIVEN VALUES X AND Y. ITS PARAMETER
  64. C                    LIST MUST BE X,Y,DERY. SUBROUTINE FCT SHOULD
  65. C                    NOT DESTROY X AND Y.
  66. C           OUTP   - THE NAME OF AN EXTERNAL OUTPUT SUBROUTINE USED.
  67. C                    ITS PARAMETER LIST MUST BE X,Y,DERY,IHLF,NDIM,PRMT.
  68. C                    NONE OF THESE PARAMETERS (EXCEPT, IF NECESSARY,
  69. C                    PRMT(4),PRMT(5),...) SHOULD BE CHANGED BY
  70. C                    SUBROUTINE OUTP. IF PRMT(5) IS CHANGED TO NON-ZERO,
  71. C                    SUBROUTINE DRKGS IS TERMINATED.
  72. C           AUX    - DOUBLE PRECISION AUXILIARY STORAGE ARRAY WITH 8
  73. C                    ROWS AND NDIM COLUMNS.
  74. C
  75. C        REMARKS
  76. C           THE PROCEDURE TERMINATES AND RETURNS TO CALLING PROGRAM, IF
  77. C           (1) MORE THAN 10 BISECTIONS OF THE INITIAL INCREMENT ARE
  78. C               NECESSARY TO GET SATISFACTORY ACCURACY (ERROR MESSAGE
  79. C               IHLF=11),
  80. C           (2) INITIAL INCREMENT IS EQUAL TO 0 OR HAS WRONG SIGN
  81. C               (ERROR MESSAGES IHLF=12 OR IHLF=13),
  82. C           (3) THE WHOLE INTEGRATION INTERVAL IS WORKED THROUGH,
  83. C           (4) SUBROUTINE OUTP HAS CHANGED PRMT(5) TO NON-ZERO.
  84. C
  85. C        SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED
  86. C           THE EXTERNAL SUBROUTINES FCT(X,Y,DERY) AND
  87. C           OUTP(X,Y,DERY,IHLF,NDIM,PRMT) MUST BE FURNISHED BY THE USER.
  88. C
  89. C        METHOD
  90. C           EVALUATION IS DONE BY MEANS OF FOURTH ORDER RUNGE-KUTTA
  91. C           FORMULAE IN THE MODIFICATION DUE TO GILL. ACCURACY IS
  92. C           TESTED COMPARING THE RESULTS OF THE PROCEDURE WITH SINGLE
  93. C           AND DOUBLE INCREMENT.
  94. C           SUBROUTINE DRKGS AUTOMATICALLY ADJUSTS THE INCREMENT DURING
  95. C           THE WHOLE COMPUTATION BY HALVING OR DOUBLING. IF MORE THAN
  96. C           10 BISECTIONS OF THE INCREMENT ARE NECESSARY TO GET
  97. C           SATISFACTORY ACCURACY, THE SUBROUTINE RETURNS WITH
  98. C           ERROR MESSAGE IHLF=11 INTO MAIN PROGRAM.
  99. C           TO GET FULL FLEXIBILITY IN OUTPUT, AN OUTPUT SUBROUTINE
  100. C           MUST BE FURNISHED BY THE USER.
  101. C           FOR REFERENCE, SEE
  102. C           RALSTON/WILF, MATHEMATICAL METHODS FOR DIGITAL COMPUTERS,
  103. C           WILEY, NEW YORK/LONDON, 1960, PP.110-120.
  104. C
  105. C     ..................................................................
  106. C
  107.       SUBROUTINE DRKGS(PRMT,Y,DERY,NDIM,IHLF,FCT,OUTP,AUX)
  108. C
  109. C
  110.       DIMENSION Y(1),DERY(1),AUX(8,1),A(4),B(4),C(4),PRMT(1)
  111.       DOUBLE PRECISION PRMT,Y,DERY,AUX,A,B,C,X,XEND,H,AJ,BJ,CJ,R1,R2,
  112.      1DELT
  113.       DO 1 I=1,NDIM
  114.     1 AUX(8,I)=.066666666666666667D0*DERY(I)
  115.       X=PRMT(1)
  116.       XEND=PRMT(2)
  117.       H=PRMT(3)
  118.       PRMT(5)=0.D0
  119.       CALL FCT(X,Y,DERY)
  120. C
  121. C     ERROR TEST
  122.       IF(H*(XEND-X))38,37,2
  123. C
  124. C     PREPARATIONS FOR RUNGE-KUTTA METHOD
  125.     2 A(1)=.5D0
  126.       A(2)=.29289321881345248D0
  127.       A(3)=1.7071067811865475D0
  128.       A(4)=.16666666666666667D0
  129.       B(1)=2.D0
  130.       B(2)=1.D0
  131.       B(3)=1.D0
  132.       B(4)=2.D0
  133.       C(1)=.5D0
  134.       C(2)=.29289321881345248D0
  135.       C(3)=1.7071067811865475D0
  136.       C(4)=.5D0
  137. C
  138. C     PREPARATIONS OF FIRST RUNGE-KUTTA STEP
  139.       DO 3 I=1,NDIM
  140.       AUX(1,I)=Y(I)
  141.       AUX(2,I)=DERY(I)
  142.       AUX(3,I)=0.D0
  143.     3 AUX(6,I)=0.D0
  144.       IREC=0
  145.       H=H+H
  146.       IHLF=-1
  147.       ISTEP=0
  148.       IEND=0
  149. C
  150. C
  151. C     START OF A RUNGE-KUTTA STEP
  152.     4 IF((X+H-XEND)*H)7,6,5
  153.     5 H=XEND-X
  154.     6 IEND=1
  155. C
  156. C     RECORDING OF INITIAL VALUES OF THIS STEP
  157.     7 CALL OUTP(X,Y,DERY,IREC,NDIM,PRMT)
  158.       IF(PRMT(5))40,8,40
  159.     8 ITEST=0
  160.     9 ISTEP=ISTEP+1
  161. C
  162. C
  163. C     START OF INNERMOST RUNGE-KUTTA LOOP
  164.       J=1
  165.    10 AJ=A(J)
  166.       BJ=B(J)
  167.       CJ=C(J)
  168.       DO 11 I=1,NDIM
  169.       R1=H*DERY(I)
  170.       R2=AJ*(R1-BJ*AUX(6,I))
  171.       Y(I)=Y(I)+R2
  172.       R2=R2+R2+R2
  173.    11 AUX(6,I)=AUX(6,I)+R2-CJ*R1
  174.       IF(J-4)12,15,15
  175.    12 J=J+1
  176.       IF(J-3)13,14,13
  177.    13 X=X+.5D0*H
  178.    14 CALL FCT(X,Y,DERY)
  179.       GOTO 10
  180. C     END OF INNERMOST RUNGE-KUTTA LOOP
  181. C
  182. C
  183. C     TEST OF ACCURACY
  184.    15 IF(ITEST)16,16,20
  185. C
  186. C     IN CASE ITEST=0 THERE IS NO POSSIBILITY FOR TESTING OF ACCURACY
  187.    16 DO 17 I=1,NDIM
  188.    17 AUX(4,I)=Y(I)
  189.       ITEST=1
  190.       ISTEP=ISTEP+ISTEP-2
  191.    18 IHLF=IHLF+1
  192.       X=X-H
  193.       H=.5D0*H
  194.       DO 19 I=1,NDIM
  195.       Y(I)=AUX(1,I)
  196.       DERY(I)=AUX(2,I)
  197.    19 AUX(6,I)=AUX(3,I)
  198.       GOTO 9
  199. C
  200. C     IN CASE ITEST=1 TESTING OF ACCURACY IS POSSIBLE
  201.    20 IMOD=ISTEP/2
  202.       IF(ISTEP-IMOD-IMOD)21,23,21
  203.    21 CALL FCT(X,Y,DERY)
  204.       DO 22 I=1,NDIM
  205.       AUX(5,I)=Y(I)
  206.    22 AUX(7,I)=DERY(I)
  207.       GOTO 9
  208. C
  209. C     COMPUTATION OF TEST VALUE DELT
  210.    23 DELT=0.D0
  211.       DO 24 I=1,NDIM
  212.    24 DELT=DELT+AUX(8,I)*DABS(AUX(4,I)-Y(I))
  213.       IF(DELT-PRMT(4))28,28,25
  214. C
  215. C     ERROR IS TOO GREAT
  216.    25 IF(IHLF-10)26,36,36
  217.    26 DO 27 I=1,NDIM
  218.    27 AUX(4,I)=AUX(5,I)
  219.       ISTEP=ISTEP+ISTEP-4
  220.       X=X-H
  221.       IEND=0
  222.       GOTO 18
  223. C
  224. C     RESULT VALUES ARE GOOD
  225.    28 CALL FCT(X,Y,DERY)
  226.       DO 29 I=1,NDIM
  227.       AUX(1,I)=Y(I)
  228.       AUX(2,I)=DERY(I)
  229.       AUX(3,I)=AUX(6,I)
  230.       Y(I)=AUX(5,I)
  231.    29 DERY(I)=AUX(7,I)
  232.       CALL OUTP(X-H,Y,DERY,IHLF,NDIM,PRMT)
  233.       IF(PRMT(5))40,30,40
  234.    30 DO 31 I=1,NDIM
  235.       Y(I)=AUX(1,I)
  236.    31 DERY(I)=AUX(2,I)
  237.       IREC=IHLF
  238.       IF(IEND)32,32,39
  239. C
  240. C     INCREMENT GETS DOUBLED
  241.    32 IHLF=IHLF-1
  242.       ISTEP=ISTEP/2
  243.       H=H+H
  244.       IF(IHLF)4,33,33
  245.    33 IMOD=ISTEP/2
  246.       IF(ISTEP-IMOD-IMOD)4,34,4
  247.    34 IF(DELT-.02D0*PRMT(4))35,35,4
  248.    35 IHLF=IHLF-1
  249.       ISTEP=ISTEP/2
  250.       H=H+H
  251.       GOTO 4
  252. C
  253. C
  254. C     RETURNS TO CALLING PROGRAM
  255.    36 IHLF=11
  256.       CALL FCT(X,Y,DERY)
  257.       GOTO 39
  258.    37 IHLF=12
  259.       GOTO 39
  260.    38 IHLF=13
  261.    39 CALL OUTP(X,Y,DERY,IHLF,NDIM,PRMT)
  262.    40 RETURN
  263.       END
  264.