home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / fortran / library / ssp / orddifeq / dhpcg.for next >
Text File  |  1985-11-29  |  13KB  |  365 lines

  1. C
  2. C     ..................................................................
  3. C
  4. C        SUBROUTINE DHPCG
  5. C
  6. C        PURPOSE
  7. C           TO SOLVE A SYSTEM OF FIRST ORDER ORDINARY GENERAL
  8. C           DIFFERENTIAL EQUATIONS WITH GIVEN INITIAL VALUES.
  9. C
  10. C        USAGE
  11. C           CALL DHPCG (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 DHPCG. EXCEPT PRMT(5) THE COMPONENTS
  21. C                    ARE NOT DESTROYED BY SUBROUTINE DHPCG 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 DHPCG INITIALIZES
  33. C                    PRMT(5)=0. IF THE USER WANTS TO TERMINATE
  34. C                    SUBROUTINE DHPCG 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 DHPCG 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 DHPCG) 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 DHPCG RETURNS WITH
  57. C                    ERROR MESSAGE IHLF=11 INTO MAIN PROGRAM.
  58. C                    ERROR 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. IT
  62. C                    COMPUTES THE RIGHT HAND SIDES DERY OF THE SYSTEM
  63. C                    TO GIVEN VALUES OF X AND Y. ITS PARAMETER LIST
  64. C                    MUST BE X,Y,DERY. THE SUBROUTINE SHOULD NOT
  65. C                    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 DHPCG IS TERMINATED.
  72. C           AUX    - DOUBLE PRECISION AUXILIARY STORAGE ARRAY WITH 16
  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 HAMMINGS MODIFIED PREDICTOR-
  91. C           CORRECTOR METHOD. IT IS A FOURTH ORDER METHOD, USING 4
  92. C           PRECEEDING POINTS FOR COMPUTATION OF A NEW VECTOR Y OF THE
  93. C           DEPENDENT VARIABLES.
  94. C           FOURTH ORDER RUNGE-KUTTA METHOD SUGGESTED BY RALSTON IS
  95. C           USED FOR ADJUSTMENT OF THE INITIAL INCREMENT AND FOR
  96. C           COMPUTATION OF STARTING VALUES.
  97. C           SUBROUTINE DHPCG AUTOMATICALLY ADJUSTS THE INCREMENT DURING
  98. C           THE WHOLE COMPUTATION BY HALVING OR DOUBLING.
  99. C           TO GET FULL FLEXIBILITY IN OUTPUT, AN OUTPUT SUBROUTINE
  100. C           MUST BE CODED BY THE USER.
  101. C           FOR REFERENCE, SEE
  102. C           (1)  RALSTON/WILF, MATHEMATICAL METHODS FOR DIGITAL
  103. C                COMPUTERS, WILEY, NEW YORK/LONDON, 1960, PP.95-109.
  104. C           (2)  RALSTON, RUNGE-KUTTA METHODS WITH MINIMUM ERROR BOUNDS,
  105. C                MTAC, VOL.16, ISS.80 (1962), PP.431-437.
  106. C
  107. C     ..................................................................
  108. C
  109.       SUBROUTINE DHPCG(PRMT,Y,DERY,NDIM,IHLF,FCT,OUTP,AUX)
  110. C
  111. C
  112.       DIMENSION PRMT(1),Y(1),DERY(1),AUX(16,1)
  113.       DOUBLE PRECISION Y,DERY,AUX,PRMT,X,H,Z,DELT
  114.       N=1
  115.       IHLF=0
  116.       X=PRMT(1)
  117.       H=PRMT(3)
  118.       PRMT(5)=0.D0
  119.       DO 1 I=1,NDIM
  120.       AUX(16,I)=0.D0
  121.       AUX(15,I)=DERY(I)
  122.     1 AUX(1,I)=Y(I)
  123.       IF(H*(PRMT(2)-X))3,2,4
  124. C
  125. C     ERROR RETURNS
  126.     2 IHLF=12
  127.       GOTO 4
  128.     3 IHLF=13
  129. C
  130. C     COMPUTATION OF DERY FOR STARTING VALUES
  131.     4 CALL FCT(X,Y,DERY)
  132. C
  133. C     RECORDING OF STARTING VALUES
  134.       CALL OUTP(X,Y,DERY,IHLF,NDIM,PRMT)
  135.       IF(PRMT(5))6,5,6
  136.     5 IF(IHLF)7,7,6
  137.     6 RETURN
  138.     7 DO 8 I=1,NDIM
  139.     8 AUX(8,I)=DERY(I)
  140. C
  141. C     COMPUTATION OF AUX(2,I)
  142.       ISW=1
  143.       GOTO 100
  144. C
  145.     9 X=X+H
  146.       DO 10 I=1,NDIM
  147.    10 AUX(2,I)=Y(I)
  148. C
  149. C     INCREMENT H IS TESTED BY MEANS OF BISECTION
  150.    11 IHLF=IHLF+1
  151.       X=X-H
  152.       DO 12 I=1,NDIM
  153.    12 AUX(4,I)=AUX(2,I)
  154.       H=.5D0*H
  155.       N=1
  156.       ISW=2
  157.       GOTO 100
  158. C
  159.    13 X=X+H
  160.       CALL FCT(X,Y,DERY)
  161.       N=2
  162.       DO 14 I=1,NDIM
  163.       AUX(2,I)=Y(I)
  164.    14 AUX(9,I)=DERY(I)
  165.       ISW=3
  166.       GOTO 100
  167. C
  168. C     COMPUTATION OF TEST VALUE DELT
  169.    15 DELT=0.D0
  170.       DO 16 I=1,NDIM
  171.    16 DELT=DELT+AUX(15,I)*DABS(Y(I)-AUX(4,I))
  172.       DELT=.066666666666666667D0*DELT
  173.       IF(DELT-PRMT(4))19,19,17
  174.    17 IF(IHLF-10)11,18,18
  175. C
  176. C     NO SATISFACTORY ACCURACY AFTER 10 BISECTIONS. ERROR MESSAGE.
  177.    18 IHLF=11
  178.       X=X+H
  179.       GOTO 4
  180. C
  181. C     THERE IS SATISFACTORY ACCURACY AFTER LESS THAN 11 BISECTIONS.
  182.    19 X=X+H
  183.       CALL FCT(X,Y,DERY)
  184.       DO 20 I=1,NDIM
  185.       AUX(3,I)=Y(I)
  186.    20 AUX(10,I)=DERY(I)
  187.       N=3
  188.       ISW=4
  189.       GOTO 100
  190. C
  191.    21 N=1
  192.       X=X+H
  193.       CALL FCT(X,Y,DERY)
  194.       X=PRMT(1)
  195.       DO 22 I=1,NDIM
  196.       AUX(11,I)=DERY(I)
  197.    220Y(I)=AUX(1,I)+H*(.375D0*AUX(8,I)+.7916666666666667D0*AUX(9,I)
  198.      1-.20833333333333333D0*AUX(10,I)+.041666666666666667D0*DERY(I))
  199.    23 X=X+H
  200.       N=N+1
  201.       CALL FCT(X,Y,DERY)
  202.       CALL OUTP(X,Y,DERY,IHLF,NDIM,PRMT)
  203.       IF(PRMT(5))6,24,6
  204.    24 IF(N-4)25,200,200
  205.    25 DO 26 I=1,NDIM
  206.       AUX(N,I)=Y(I)
  207.    26 AUX(N+7,I)=DERY(I)
  208.       IF(N-3)27,29,200
  209. C
  210.    27 DO 28 I=1,NDIM
  211.       DELT=AUX(9,I)+AUX(9,I)
  212.       DELT=DELT+DELT
  213.    28 Y(I)=AUX(1,I)+.33333333333333333D0*H*(AUX(8,I)+DELT+AUX(10,I))
  214.       GOTO 23
  215. C
  216.    29 DO 30 I=1,NDIM
  217.       DELT=AUX(9,I)+AUX(10,I)
  218.       DELT=DELT+DELT+DELT
  219.    30 Y(I)=AUX(1,I)+.375D0*H*(AUX(8,I)+DELT+AUX(11,I))
  220.       GOTO 23
  221. C
  222. C     THE FOLLOWING PART OF SUBROUTINE DHPCG COMPUTES BY MEANS OF
  223. C     RUNGE-KUTTA METHOD STARTING VALUES FOR THE NOT SELF-STARTING
  224. C     PREDICTOR-CORRECTOR METHOD.
  225.   100 DO 101 I=1,NDIM
  226.       Z=H*AUX(N+7,I)
  227.       AUX(5,I)=Z
  228.   101 Y(I)=AUX(N,I)+.4D0*Z
  229. C     Z IS AN AUXILIARY STORAGE LOCATION
  230. C
  231.       Z=X+.4D0*H
  232.       CALL FCT(Z,Y,DERY)
  233.       DO 102 I=1,NDIM
  234.       Z=H*DERY(I)
  235.       AUX(6,I)=Z
  236.   102 Y(I)=AUX(N,I)+.29697760924775360D0*AUX(5,I)+.15875964497103583D0*Z
  237. C
  238.       Z=X+.45573725421878943D0*H
  239.       CALL FCT(Z,Y,DERY)
  240.       DO 103 I=1,NDIM
  241.       Z=H*DERY(I)
  242.       AUX(7,I)=Z
  243.   103 Y(I)=AUX(N,I)+.21810038822592047D0*AUX(5,I)-3.0509651486929308D0*
  244.      1AUX(6,I)+3.8328647604670103D0*Z
  245. C
  246.       Z=X+H
  247.       CALL FCT(Z,Y,DERY)
  248.       DO 104 I=1,NDIM
  249.   1040Y(I)=AUX(N,I)+.17476028226269037D0*AUX(5,I)-.55148066287873294D0*
  250.      1AUX(6,I)+1.2055355993965235D0*AUX(7,I)+.17118478121951903D0*
  251.      2H*DERY(I)
  252.       GOTO(9,13,15,21),ISW
  253. C
  254. C     POSSIBLE BREAK-POINT FOR LINKAGE
  255. C
  256. C     STARTING VALUES ARE COMPUTED.
  257. C     NOW START HAMMINGS MODIFIED PREDICTOR-CORRECTOR METHOD.
  258.   200 ISTEP=3
  259.   201 IF(N-8)204,202,204
  260. C
  261. C     N=8 CAUSES THE ROWS OF AUX TO CHANGE THEIR STORAGE LOCATIONS
  262.   202 DO 203 N=2,7
  263.       DO 203 I=1,NDIM
  264.       AUX(N-1,I)=AUX(N,I)
  265.   203 AUX(N+6,I)=AUX(N+7,I)
  266.       N=7
  267. C
  268. C     N LESS THAN 8 CAUSES N+1 TO GET N
  269.   204 N=N+1
  270. C
  271. C     COMPUTATION OF NEXT VECTOR Y
  272.       DO 205 I=1,NDIM
  273.       AUX(N-1,I)=Y(I)
  274.   205 AUX(N+6,I)=DERY(I)
  275.       X=X+H
  276.   206 ISTEP=ISTEP+1
  277.       DO 207 I=1,NDIM
  278.      0DELT=AUX(N-4,I)+1.3333333333333333D0*H*(AUX(N+6,I)+AUX(N+6,I)-
  279.      1AUX(N+5,I)+AUX(N+4,I)+AUX(N+4,I))
  280.       Y(I)=DELT-.9256198347107438D0*AUX(16,I)
  281.   207 AUX(16,I)=DELT
  282. C     PREDICTOR IS NOW GENERATED IN ROW 16 OF AUX, MODIFIED PREDICTOR
  283. C     IS GENERATED IN Y. DELT MEANS AN AUXILIARY STORAGE.
  284. C
  285.       CALL FCT(X,Y,DERY)
  286. C     DERIVATIVE OF MODIFIED PREDICTOR IS GENERATED IN DERY
  287. C
  288.       DO 208 I=1,NDIM
  289.      0DELT=.125D0*(9.D0*AUX(N-1,I)-AUX(N-3,I)+3.D0*H*(DERY(I)+AUX(N+6,I)
  290.      1+AUX(N+6,I)-AUX(N+5,I)))
  291.       AUX(16,I)=AUX(16,I)-DELT
  292.   208 Y(I)=DELT+.07438016528925620D0*AUX(16,I)
  293. C
  294. C     TEST WHETHER H MUST BE HALVED OR DOUBLED
  295.       DELT=0.D0
  296.       DO 209 I=1,NDIM
  297.   209 DELT=DELT+AUX(15,I)*DABS(AUX(16,I))
  298.       IF(DELT-PRMT(4))210,222,222
  299. C
  300. C     H MUST NOT BE HALVED. THAT MEANS Y(I) ARE GOOD.
  301.   210 CALL FCT(X,Y,DERY)
  302.       CALL OUTP(X,Y,DERY,IHLF,NDIM,PRMT)
  303.       IF(PRMT(5))212,211,212
  304.   211 IF(IHLF-11)213,212,212
  305.   212 RETURN
  306.   213 IF(H*(X-PRMT(2)))214,212,212
  307.   214 IF(DABS(X-PRMT(2))-.1D0*DABS(H))212,215,215
  308.   215 IF(DELT-.02D0*PRMT(4))216,216,201
  309. C
  310. C
  311. C     H COULD BE DOUBLED IF ALL NECESSARY PRECEEDING VALUES ARE
  312. C     AVAILABLE
  313.   216 IF(IHLF)201,201,217
  314.   217 IF(N-7)201,218,218
  315.   218 IF(ISTEP-4)201,219,219
  316.   219 IMOD=ISTEP/2
  317.       IF(ISTEP-IMOD-IMOD)201,220,201
  318.   220 H=H+H
  319.       IHLF=IHLF-1
  320.       ISTEP=0
  321.       DO 221 I=1,NDIM
  322.       AUX(N-1,I)=AUX(N-2,I)
  323.       AUX(N-2,I)=AUX(N-4,I)
  324.       AUX(N-3,I)=AUX(N-6,I)
  325.       AUX(N+6,I)=AUX(N+5,I)
  326.       AUX(N+5,I)=AUX(N+3,I)
  327.       AUX(N+4,I)=AUX(N+1,I)
  328.       DELT=AUX(N+6,I)+AUX(N+5,I)
  329.       DELT=DELT+DELT+DELT
  330.   2210AUX(16,I)=8.962962962962963D0*(Y(I)-AUX(N-3,I))
  331.      1-3.3611111111111111D0*H*(DERY(I)+DELT+AUX(N+4,I))
  332.       GOTO 201
  333. C
  334. C
  335. C     H MUST BE HALVED
  336.   222 IHLF=IHLF+1
  337.       IF(IHLF-10)223,223,210
  338.   223 H=.5D0*H
  339.       ISTEP=0
  340.       DO 224 I=1,NDIM
  341.      0Y(I)=.390625D-2*(8.D1*AUX(N-1,I)+135.D0*AUX(N-2,I)+4.D1*AUX(N-3,I)
  342.      1+AUX(N-4,I))-.1171875D0*(AUX(N+6,I)-6.D0*AUX(N+5,I)-AUX(N+4,I))*H
  343.      0AUX(N-4,I)=.390625D-2*(12.D0*AUX(N-1,I)+135.D0*AUX(N-2,I)+
  344.      1108.D0*AUX(N-3,I)+AUX(N-4,I))-.0234375D0*(AUX(N+6,I)+
  345.      218.D0*AUX(N+5,I)-9.D0*AUX(N+4,I))*H
  346.       AUX(N-3,I)=AUX(N-2,I)
  347.   224 AUX(N+4,I)=AUX(N+5,I)
  348.       X=X-H
  349.       DELT=X-(H+H)
  350.       CALL FCT(DELT,Y,DERY)
  351.       DO 225 I=1,NDIM
  352.       AUX(N-2,I)=Y(I)
  353.       AUX(N+5,I)=DERY(I)
  354.   225 Y(I)=AUX(N-4,I)
  355.       DELT=DELT-(H+H)
  356.       CALL FCT(DELT,Y,DERY)
  357.       DO 226 I=1,NDIM
  358.       DELT=AUX(N+5,I)+AUX(N+4,I)
  359.       DELT=DELT+DELT+DELT
  360.      0AUX(16,I)=8.962962962962963D0*(AUX(N-1,I)-Y(I))
  361.      1-3.3611111111111111D0*H*(AUX(N+6,I)+DELT+DERY(I))
  362.   226 AUX(N+3,I)=DERY(I)
  363.       GOTO 206
  364.       END
  365.