-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathshoot.for
More file actions
290 lines (290 loc) · 8.55 KB
/
Copy pathshoot.for
File metadata and controls
290 lines (290 loc) · 8.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
C
C***************************** ABSTRACT *******************************
C
C THIS PROGRAM SOLVES THE BVP POSED IN EXAMPLE 5.6 USING THE SHOOTING
C METHOD. THE BLACK BOX FUNCTION CREATED BY THE INTEGRATION OF THE BVP
C TRANSFORMED INTO AN IVP IS SOLVED USING THE SECANT METHOD.
C
C
C**************************** NOMENCLATURE ****************************
C
C DXMAX- THE MAXIMUM ALLOWED CHANGE IN X BETWEEN ITERATIONS
C ERLIM- CONVERGENCE CRITERIA
C F- THE NAME OF THE SUBROUTINE THAT CALCULATES THE VALUE OF THE BLACK
C FUNCTION
C ICMAX- THE MAXIMUM NUMBER OF ITERATIONS ALLOWED
C IPRINT- PRINT FLAG =1 PRINT INTERMEDIATE VALUES; =0 NO PRINT
C X1- THE INITIAL VALUE THE ROOT OF THE NONLINEAR EQUATION
C
C************************************************************************
C
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION Y(2),CAY(2),Y1(2),DYDX(2)
COMMON /ONE/RCAY,D
EXTERNAL F
C
C SET SECANT PARAMETERS
C
ERLIM=1.D-6
ICMAX=50
DXMAX=2.
IPRINT=1
C
C SET INITIAL GUESS FOR DY/DX AT X=0
C
X1=1.
C
C CALL SECANT METHOD
C
CALL SECANT(F,ERLIM,ICMAX,DXMAX,IPRINT,X1)
STOP
END
C
C***************************** ABSTRACT *****************************
C
C THIS SUBROUTINE CALLS SUBROUTINE RKUTTA TO INTEGRATE THE BVP
C WHICH HAS BEEN TRANSFORMED INTO AN IVP.
C
C**************************** NOMENCLATURE **************************
C
C DXPNT- THE PRINT INTERVAL
C FUNCT- THE NAME OF THE SUBROUTINE THAT CALCULATES F(X,Y)
C IPNT- PRINT FLAG (=0 NO PRINT; =1 PRINT)
C N- THE NUMBER OF DEPENDENT VARIABLES
C P- THE MAXIMUM PERCENTAGE CHANGE IN A DEPENDENT VARIABLE
C X- THE INDEPENDENT VARIABLE
C XMAX- THE FINAL VALUE OF X
C Y(I)- THE ITH DEPENDENT VARIABLE
C
C**********************************************************************
C
SUBROUTINE F(XV,FV)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION Y(2),Y1(2),CAY(2),DYDX(2)
EXTERNAL FUNCT
C
C SPECIFY INPUT DATA FOR RUNGE-KUTTA INTEGRATOR
C
N=2
XMAX=1.
DXPNT=.1
IPNT=1
P=10.
C SET INITIAL CONDITIONS
X=0.0
Y(1)=0.0
Y(2)=XV
C
C CALL RUNGE-KUTTA INTEGRATOR
C
CALL RKUTTA(FUNCT,N,P,X,Y,XMAX,DXPNT,IPNT,CAY,Y1,DYDX)
C
C SET FUNCTION VALUE AS VALUE OF DYDX AT X=1
C
FV=Y(1)-1.
RETURN
END
C
C************************* ABSTRACT ********************************
C
C THIS SUBROUTINE CALCULATES THE DERIVATIVE OF Y(I) WITH RESPECT TO
C X, DYDX(I). THE USER SUPPLIES THE EQUATIONS FOR DYDX(I).
C
C*********************************************************************
C
C
SUBROUTINE FUNCT(X,Y,DYDX)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION Y(2),DYDX(2)
COMMON /ONE/RCAY,D
DYDX(2)=-Y(1)*Y(2)-5.
10 DYDX(1)=Y(2)
RETURN
END
C
C***************************** ABSTRACT *****************************
C
C THIS SUBROUTINE CALLS SUBROUTINE RK1 AT EACH PRINT INTERVAL
C AND PRINTS OUT THE INTERMEDIATE RESULTS IF IPNT=1.
C
C**************************** NOMENCLATURE **************************
C
C DXPNT- THE PRINT INTERVAL
C DXP- THE INTERNALLY CALCULATED PRINT INTERVAL
C F- THE NAME OF THE SUBROUTINE THAT CALCULATES F(X,Y)
C IPNT- PRINT FLAG (=0 NO PRINT; =1 PRINT)
C N- THE NUMBER OF DEPENDENT VARIABLES
C NS- THE NUMBER OF PRINT INTERVAL STEPS
C PRO- THE PRINT INTERVAL NEAR XMAX
C X- THE INDEPENDENT VARIABLE
C XF- THE VALUE OF X AT THE END OF THE PRINT INTERVAL
C XO- THE VALUE OF X AT THE BEGINNING OF THE PRINT INTERVAL
C XMAX- THE FINAL VALUE OF X
C Y(I)- THE ITH DEPENDENT VARIABLE
C
C**********************************************************************
C
SUBROUTINE RKUTTA(F,N,P,X,Y,XMAX,DXPNT,IPNT,CAY,Y1,DYDX)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION Y(1),DYDX(1),CAY(1),Y1(1)
EXTERNAL F
C PRINT INITIAL CONDITIONS IF IPNT = 1
IF(IPNT.EQ.1)WRITE(6,10)X,(Y(J),J=1,N)
C CALCULATE THE NUMBER OF STEPS PER DXPNT
DXP=DXPNT
NS=IFIX(XMAX/DXPNT)+1
XO=X
PRO=XMAX-DXPNT*DFLOAT(NS-1)
C
C CALL SUBROUTINE RK TIL X=XMAX
C
DO 1000 I=1,NS
IF(I.EQ.NS)DXP=PRO
IF((I.EQ.NS).AND.(PRO.LT.1.E-6))GO TO 1000
XF=XO+DXP
C CALL SUBROUTINE RK
CALL RK(F,N,P,XO,XF,Y,CAY,Y1,DYDX)
C PRINT INTERMEDIATE RESULTS IF IPNT=1
IF(IPNT.EQ.1)WRITE(6,10)XF,(Y(J),J=1,N)
10 FORMAT( 10X,3H X=,D12.5,3X,3H Y=,5(D14.7,3X))
C INCREMENT X
1000 XO=XO+DXP
RETURN
END
C
C************************* ABSTRACT ********************************
C
C THIS APPLIES A FOURTH ORDER RUNGE-KUTTA METHOD FOR THE INTEGRATION
C OF A SYSTEM OF ODE'S FROM X=XO TO X=XF.
C
C**************************** NOMENCLATURE **************************
C
C CAY(I)- A VECTOR USED TO STORE THE SLOPES OF DEPENDENT VARIABLE I
C AT THE BEGINNING, MIDDLE AND END OF A STEP DX
C DX- THE STEP SIZE FOR X
X DXM- THE MINIMUM STEP SIZE DX
C DYDX(I)- THE DERIVATIVE OF Y(I) WITH RESPECT TO X
C F- THE NAME OF THE SUBROUTINE THAT CALCULATES F(X,Y)
C IPNT- PRINT FLAG (=0 NO PRINT; =1 PRINT)
C N- THE NUMBER OF DEPENDENT VARIABLES
C NS- THE NUMBER OF PRINT INTERVAL STEPS
C PRO- THE PRINT INTERVAL NEAR XMAX
C X- THE INDEPENDENT VARIABLE
C XF- THE VALUE OF X AT THE END OF THE PRINT INTERVAL
C XO- THE VALUE OF X AT THE BEGINNING OF THE PRINT INTERVAL
C Y(I)- THE ITH DEPENDENT VARIABLE
C Y1(I)- AN INTERNALLY USED VALUE OF THE ITH DEPENDENT VARIABLE
C
C**********************************************************************
C
SUBROUTINE RK(F,N,P,XO,XF,Y,CAY,Y1,DYDX)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION Y(1),DYDX(1),CAY(1),Y1(1)
EXTERNAL F
X=XO
C
C BEGIN ITERATIVE CALCULATION LOOP
C
1 CALL F(N,X,Y,DYDX)
C
C STEP SIZE CALCULATION
C
DDD=DYDX(1)
IF(DABS(DYDX(1)).LT.1.E-10)DDD=1.E-10
DXM=DABS(P*Y(1)/DDD/100.)
C DETERMINE THE MINIMUM STEP SIZE DX BASED UPON A P% CHANGE
DO 2 I=2,N
IF(DYDX(I).LT.1.E-10)GO TO 2
TEST=DABS(P*Y(I)/DYDX(I)/100.)
IF(TEST.LT.DXM)DXM=TEST
2 CONTINUE
C MAKE SURE THAT X DOES NOT EXCEED XF
IF(DXM.LT.1.E-4)DXM=1.E-4
DX=DXM
XT=X+DX
IF(XT.GT.XF)DX=XF-X
C SET K1
DO 33 I=1,N
CAY(I)=DYDX(I)
33 Y1(I)=Y(I)+DYDX(I)*DX/2.
X1=X+DX/2.
CALL F(N,X1,Y1,DYDX)
C SET K2
DO 34 I=1,N
CAY(I)=CAY(I)+2.*DYDX(I)
34 Y1(I)=Y(I)+DYDX(I)*DX/2.
CALL F(N,X1,Y1,DYDX)
C SET K3
DO 35 I=1,N
CAY(I)=CAY(I)+2.*DYDX(I)
35 Y1(I)=Y(I)+DYDX(I)*DX
X1=X+DX
CALL F(N,X1,Y1,DYDX)
C SET K4 AND CALCULATE NEW VALUES OF Y(I)
DO 36 I=1,N
CAY(I)=CAY(I)+DYDX(I)
36 Y(I)=Y(I)+DX*CAY(I)/6.
C INCREMENT X
100 X=X+DX
IF(X.LT.XF)GO TO 1
RETURN
END
C
C***************************** ABSTRACT *******************************
C
C THIS SUBROUTINE APPLIES THE SECANT METHOD FOR THE SOLUTION OF A
C SINGLE NONLINEAR EQUATION.
C
C**************************** NOMENCLATURE ****************************
C
C DX- THE CALCULATED CHANGE IN THE VALUE OF X
C DXMAX- THE MAXIMUM ALLOWED CHANGE IN X BETWEEN ITERATIONS
C (USER SPECIFIED)
C ERLIM- CONVERGENCE CRITERIA
C FO- THE NEXT TO THE LATEST FUNCTION VALUE
C F1- THE LATEST FUNCTION VALUE
C FV- THE FUNCTION VALUE
C IC- THE ITERATION COUNTER
C ICMAX- THE MAXIMUM NUMBER OF ITERATIONS ALLOWED
C IPRINT- PRINT FLAG =1 PRINT INTERMEDIATE VALUES; =0 NO PRINT
C X1- THE LATEST VALUE THE ROOT OF THE NONLINEAR EQUATION
C XO- THE NEXT TO THE LATEST VALUE THE ROOT OF THE NONLINEAR EQUATION
C
C************************************************************************
C
SUBROUTINE SECANT(F,ERLIM,ICMAX,DXMAX,IPRINT,X1)
IMPLICIT REAL*8(A-H,O-Z)
EXTERNAL F
IC=0
C
C BEGIN ITERATIVE LOOP
C
10 IC=IC+1
C CALL SUBRUTINE F
CALL F(X1,F1)
C INITIALIZE SECANT METHOD
IF(IC.EQ.1)XO=X1*.95
IF(IC.EQ.1)CALL F(XO,FO)
C APPLY SECANT APPROXIATION
DX=-F1*(X1-XO)/(F1-FO)
IF(ABS(DX).GT.DXMAX)DX=DXMAX*ABS(DX)/DX
XC=X1+DX
C TRANSFER X1,F1 TO XO,FO
XO=X1
FO=F1
X1=XC
C PRINT OUT INTERMEDIATE RESULTS
IF(IPRINT.EQ.1)WRITE(6,11)IC,XC,F1
11 FORMAT( 5X,' IC=',I3,5X,' X=',F7.5,5X,' F(X)=',D10.3)
C CHECK FOR EXCESSIVE ITERATIONS
IF(IC.GT.ICMAX)WRITE(6,22)
22 FORMAT( ' SECANT METHOD DID NOT CONVERGE')
IF(IC.GT.ICMAX)STOP
C CHECK FOR CONVERGENCE
IF(ABS(DX).GT.ERLIM)GO TO 10
C
C CONVERGED SOLUTION OBTAINED; RETURNING TO CALLING PROGRAM
C
CALL F(XC,FV)
RETURN
END