-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutilmod.f
More file actions
183 lines (181 loc) · 4.97 KB
/
utilmod.f
File metadata and controls
183 lines (181 loc) · 4.97 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
FUNCTION DFN01(Z)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
REAL*4 SRW,SRV,ERFREC
SRW=DABS(Z)/DSQRT(2.D0)
SRV=DBLE(ERFREC(SRW))
DFN01=.5D0+.5D0*SRV*Z/DABS(Z)
RETURN
END
C************************* ERFREC RECIPES
FUNCTION ERFREC(X)
IF(X.LT.0.)THEN
ERFREC=-GAMMP(.5,X**2)
ELSE
ERFREC=GAMMP(.5,X**2)
ENDIF
RETURN
END
C************************* GAMMP
FUNCTION GAMMP(A,X)
IF(X.LT.0..OR.A.LE.0.)PAUSE
IF(X.LT.A+1.)THEN
CALL GSER(GAMSER,A,X,GLN)
GAMMP=GAMSER
ELSE
CALL GCF(GAMMCF,A,X,GLN)
GAMMP=1.-GAMMCF
ENDIF
RETURN
END
C************************* GSER
SUBROUTINE GSER(GAMSER,A,X,GLN)
PARAMETER (ITMAX=100,EPS=3.E-7)
GLN=GAMMLN(A)
IF(X.LE.0.)THEN
IF(X.LT.0.)PAUSE
GAMSER=0.
RETURN
ENDIF
AP=A
SUM=1./A
DEL=SUM
DO 11 N=1,ITMAX
AP=AP+1.
DEL=DEL*X/AP
SUM=SUM+DEL
IF(ABS(DEL).LT.ABS(SUM)*EPS)GO TO 1
11 CONTINUE
PAUSE 'A too large, ITMAX too small'
1 GAMSER=SUM*EXP(-X+A*LOG(X)-GLN)
RETURN
END
C************************* GCF
SUBROUTINE GCF(GAMMCF,A,X,GLN)
PARAMETER (ITMAX=100,EPS=3.E-7)
GLN=GAMMLN(A)
GOLD=0.
A0=1.
A1=X
B0=0.
B1=1.
FAC=1.
DO 11 N=1,ITMAX
AN=FLOAT(N)
ANA=AN-A
A0=(A1+A0*ANA)*FAC
B0=(B1+B0*ANA)*FAC
ANF=AN*FAC
A1=X*A0+ANF*A1
B1=X*B0+ANF*B1
IF(A1.NE.0.)THEN
FAC=1./A1
G=B1*FAC
IF(ABS((G-GOLD)/G).LT.EPS)GO TO 1
GOLD=G
ENDIF
11 CONTINUE
PAUSE 'A too large, ITMAX too small'
1 GAMMCF=EXP(-X+A*ALOG(X)-GLN)*G
RETURN
END
C************************* GAMMLN
FUNCTION GAMMLN(XX)
REAL*8 COF(6),STP,HALF,ONE,FPF,X,TMP,SER
DATA COF,STP/76.18009173D0,-86.50532033D0,24.01409822D0,
* -1.231739516D0,.120858003D-2,-.536382D-5,2.50662827465D0/
DATA HALF,ONE,FPF/0.5D0,1.0D0,5.5D0/
X=XX-ONE
TMP=X+FPF
TMP=(X+HALF)*LOG(TMP)-TMP
SER=ONE
DO 11 J=1,6
X=X+ONE
SER=SER+COF(J)/X
11 CONTINUE
GAMMLN=TMP+LOG(STP*SER)
RETURN
END
C************************* BESSJ0
FUNCTION DFJ0(X)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
REAL*4 SRW,SRV,BESSJ0
SRW=X
SRV=BESSJ0(SRW)
DFJ0=DBLE(SRV)
RETURN
END
C
FUNCTION BESSJ0(X)
REAL*8 Y,P1,P2,P3,P4,P5,Q1,Q2,Q3,Q4,Q5,R1,R2,R3,R4,R5,R6,
* S1,S2,S3,S4,S5,S6
DATA P1,P2,P3,P4,P5/1.D0,-.1098628627D-2,.2734510407D-4,
* -.2073370639D-5,.2093887211D-6/, Q1,Q2,Q3,Q4,Q5/-.1562499995D-
*1,
* .1430488765D-3,-.6911147651D-5,.7621095161D-6,-.934945152D-7/
DATA R1,R2,R3,R4,R5,R6/57568490574.D0,-13362590354.D0,651619640.7D
*0,
* -11214424.18D0,77392.33017D0,-184.9052456D0/,
* S1,S2,S3,S4,S5,S6/57568490411.D0,1029532985.D0,
* 9494680.718D0,59272.64853D0,267.8532712D0,1.D0/
IF(ABS(X).LT.8.)THEN
Y=X**2
BESSJ0=(R1+Y*(R2+Y*(R3+Y*(R4+Y*(R5+Y*R6)))))
* /(S1+Y*(S2+Y*(S3+Y*(S4+Y*(S5+Y*S6)))))
ELSE
AX=ABS(X)
Z=8./AX
Y=Z**2
XX=AX-.785398164
BESSJ0=SQRT(.636619772/AX)*(COS(XX)*(P1+Y*(P2+Y*(P3+Y*(P4+Y
* *P5))))-Z*SIN(XX)*(Q1+Y*(Q2+Y*(Q3+Y*(Q4+Y*Q5)))))
ENDIF
RETURN
END
C************************* BESSJ1
FUNCTION DFJ1(X)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
REAL*4 SRV,SRW,BESSJ1
SRV=X
SRW=BESSJ1(SRV)
DFJ1=2.D0*DBLE(SRW)
RETURN
END
C
FUNCTION BESSJ1(X)
REAL*8 Y,P1,P2,P3,P4,P5,Q1,Q2,Q3,Q4,Q5,R1,R2,R3,R4,R5,R6,
* S1,S2,S3,S4,S5,S6
DATA R1,R2,R3,R4,R5,R6/72362614232.D0,-7895059235.D0,242396853.1D0
*,
* -2972611.439D0,15704.48260D0,-30.16036606D0/,
* S1,S2,S3,S4,S5,S6/144725228442.D0,2300535178.D0,
* 18583304.74D0,99447.43394D0,376.9991397D0,1.D0/
DATA P1,P2,P3,P4,P5/1.D0,.183105D-2,-.3516396496D-4,.2457520174D-5
*,
* -.240337019D-6/, Q1,Q2,Q3,Q4,Q5/.04687499995D0,-.2002690873D-3
*,
* .8449199096D-5,-.88228987D-6,.105787412D-6/
IF(ABS(X).LT.8.)THEN
Y=X**2
BESSJ1=X*(R1+Y*(R2+Y*(R3+Y*(R4+Y*(R5+Y*R6)))))
* /(S1+Y*(S2+Y*(S3+Y*(S4+Y*(S5+Y*S6)))))
ELSE
AX=ABS(X)
Z=8./AX
Y=Z**2
XX=AX-2.356194491
BESSJ1=SQRT(.636619772/AX)*(COS(XX)*(P1+Y*(P2+Y*(P3+Y*(P4+Y
* *P5))))-Z*SIN(XX)*(Q1+Y*(Q2+Y*(Q3+Y*(Q4+Y*Q5)))))
* *SIGN(1.,X)
ENDIF
RETURN
END
C************************* LUNG
INTEGER FUNCTION LUNG(A)
CHARACTER*1 A
DIMENSION A(1)
DO 5 I=60,1,-1
IF(A(I).NE.' ') GOTO 10
5 CONTINUE
10 LUNG=I
RETURN
END