Blame view

fvn_fnlib/d9knus.f 9.21 KB
38581db0c   daniau   git-svn-id: https...
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
        subroutine d9knus (xnu, x, bknu, bknu1, iswtch)
  c june 1977 edition.   w. fullerton, c3, los alamos scientific lab.
  c
  c compute bessel functions exp(x) * k-sub-xnu (x)  and
  c exp(x) * k-sub-xnu+1 (x) for 0.0 .le. xnu .lt. 1.0 .
  c
        double precision xnu, x, bknu, bknu1, alpha(32), beta(32), a(32),
       1  c0kcs(29), znu1cs(20), alnz, aln2, a0, bknud, bknu0,
       2  b0, c0, euler, expx, p1, p2, p3, qq, result, sqpi2, sqrtx, v,
       3  vlnz, xi, xmu, xnusml, xsml, x2n, x2tov, z, ztov, alnsml,
       4  alnbig
        real alneps, an, bn
        double precision d1mach, dcsevl, dexp, dgamma, dlog, dsqrt
        external d1mach, dcsevl, dgamma, initds
  c
  c series for c0k        on the interval  0.          to  2.50000e-01
  c                                        with weighted error   2.16e-32
  c                                         log weighted error  31.67
  c                               significant figures required  30.86
  c                                    decimal places required  32.40
  c
        data c0k cs(  1) / +.6018305724 2626108387 5774451803 29 d-1     /
        data c0k cs(  2) / -.1536487143 3017286092 9597559431 24 d+0     /
        data c0k cs(  3) / -.1175117600 8210492040 0682292262 13 d-1     /
        data c0k cs(  4) / -.8524878889 1979509827 0484015509 87 d-3     /
        data c0k cs(  5) / -.6132983876 7496791874 0981769221 11 d-4     /
        data c0k cs(  6) / -.4405228124 5510444562 6798895485 05 d-5     /
        data c0k cs(  7) / -.3163124672 8384488192 9154458921 99 d-6     /
        data c0k cs(  8) / -.2271071938 2899588330 6737717933 96 d-7     /
        data c0k cs(  9) / -.1630564460 8077609552 2746205153 60 d-8     /
        data c0k cs( 10) / -.1170693929 9414776568 7560440431 30 d-9     /
        data c0k cs( 11) / -.8405206378 6464437174 5465934137 92 d-11    /
        data c0k cs( 12) / -.6034667011 8979991487 0960507371 98 d-12    /
        data c0k cs( 13) / -.4332696033 5681371952 0459973669 03 d-13    /
        data c0k cs( 14) / -.3110735803 0203546214 6346977722 37 d-14    /
        data c0k cs( 15) / -.2233407822 6736982254 4861334098 40 d-15    /
        data c0k cs( 16) / -.1603514671 6864226300 6357915286 10 d-16    /
        data c0k cs( 17) / -.1151271736 3666556196 0356977053 05 d-17    /
        data c0k cs( 18) / -.8265759174 6836959105 1694790892 58 d-19    /
        data c0k cs( 19) / -.5934548080 6383948172 3334366959 84 d-20    /
        data c0k cs( 20) / -.4260813819 6467143926 4996130239 76 d-21    /
        data c0k cs( 21) / -.3059126686 4812876299 2636983705 42 d-22    /
        data c0k cs( 22) / -.2196354142 6734575224 9755018155 16 d-23    /
        data c0k cs( 23) / -.1576911326 1495836071 1057506847 60 d-24    /
        data c0k cs( 24) / -.1132171393 5950320948 7577310480 56 d-25    /
        data c0k cs( 25) / -.8128624883 4598404082 7923497144 33 d-27    /
        data c0k cs( 26) / -.5836090089 3453226552 8293493159 49 d-28    /
        data c0k cs( 27) / -.4190124162 3610922519 4523377809 05 d-29    /
        data c0k cs( 28) / -.3008373796 0206435069 5305042128 62 d-30    /
        data c0k cs( 29) / -.2159915206 7808647728 3421680898 32 d-31    /
  c
  c series for znu1       on the interval -7.00000e-01 to  0.
  c                                        with weighted error   2.45e-33
  c                                         log weighted error  32.61
  c                               significant figures required  31.85
  c                                    decimal places required  33.26
  c
        data znu1cs(  1) / +.2033067569 9419172967 4444001216 911 d+0    /
        data znu1cs(  2) / +.1400779334 1321977106 2943670790 563 d+0    /
        data znu1cs(  3) / +.7916796961 0016135284 0972241972 320 d-2    /
        data znu1cs(  4) / +.3398011825 3210404535 2930092205 750 d-3    /
        data znu1cs(  5) / +.1174197568 8989336666 4507228352 690 d-4    /
        data znu1cs(  6) / +.3393575706 1226168033 3825865475 121 d-6    /
        data znu1cs(  7) / +.8425941769 7621991019 4629891264 803 d-8    /
        data znu1cs(  8) / +.1833366770 2485008918 4748150900 090 d-9    /
        data znu1cs(  9) / +.3549698447 0441631086 3007064469 557 d-11   /
        data znu1cs( 10) / +.6190324964 6988733220 5244342078 407 d-13   /
        data znu1cs( 11) / +.9819645356 8043942496 0346115456 527 d-15   /
        data znu1cs( 12) / +.1428513143 9649047421 1473563005 985 d-16   /
        data znu1cs( 13) / +.1918949218 8782529896 6162467488 436 d-18   /
        data znu1cs( 14) / +.2394309797 3949891416 2313140597 128 d-20   /
        data znu1cs( 15) / +.2788902468 1534735483 5870465474 995 d-22   /
        data znu1cs( 16) / +.3046066506 3303344258 2845214092 865 d-24   /
        data znu1cs( 17) / +.3131732370 4219181577 1564260932 089 d-26   /
        data znu1cs( 18) / +.3041330989 8785495164 5174908005 034 d-28   /
        data znu1cs( 19) / +.2798403846 3683308434 3185097659 733 d-30   /
        data znu1cs( 20) / +.2446371862 7449759648 5238794922 666 d-32   /
  c
        data euler / 0.5772156649 0153286060 6512090082 40d0 /
        data sqpi2 / +1.253314137 3155002512 0788264240 55 d0      /
        data aln2 / 0.6931471805 5994530941 7232121458 18d0 /
        data ntc0k, ntznu1 / 2*0 /
        data xnusml, xsml, alnsml, alnbig, alneps / 4*0.d0, 0.0 /
  c
        if (ntc0k.ne.0) go to 10
        eta = 0.1d0*d1mach(3)
        ntc0k = initds (c0kcs, 29, eta)
        ntznu1 = initds (znu1cs, 20, eta)
  c
        xnusml = dsqrt (d1mach(3)/8.d0)
        xsml = 0.1d0*d1mach(3)
        alnsml = dlog (d1mach(1))
        alnbig = dlog (d1mach(2))
        alneps = dlog (0.1d0*d1mach(3))
  c
   10   if (xnu.lt.0.d0 .or. xnu.ge.1.d0) call seteru (
       1  33hd9knus  xnu must be ge 0 and lt 1, 33, 1, 2)
        if (x.le.0.) call seteru (22hd9knus  x must be gt 0, 22, 2, 2)
  c
        iswtch = 0
        if (x.gt.2.0d0) go to 50
  c
  c x is small.  compute k-sub-xnu (x) and the derivative of k-sub-xnu (x)
  c then find k-sub-xnu+1 (x).  xnu is reduced to the interval (-.5,+.5)
  c then to (0., .5), because k of negative order (-nu) = k of positive
  c order (+nu).
  c
        v = xnu
        if (xnu.gt.0.5d0) v = 1.0d0 - xnu
  c
  c carefully find (x/2)**xnu and z**xnu where z = x*x/4.
        alnz = 2.d0 * (dlog(x) - aln2)
  c
        if (x.gt.xnu) go to 20
        if (-0.5d0*xnu*alnz-aln2-dlog(xnu).gt.alnbig) call seteru (
       1  45hd9knus  x so small bessel k-sub-xnu overflows, 45, 3, 2)
  c
   20   vlnz = v*alnz
        x2tov = dexp (0.5d0*vlnz)
        ztov = 0.0d0
        if (vlnz.gt.alnsml) ztov = x2tov**2
  c
        a0 = 0.5d0*dgamma(1.0d0+v)
        b0 = 0.5d0*dgamma(1.0d0-v)
        c0 = -euler
        if (ztov.gt.0.5d0 .and. v.gt.xnusml) c0 = -0.75d0 +
       1  dcsevl ((8.0d0*v)*v-1.0d0, c0kcs, ntc0k)
  c
        if (ztov.le.0.5d0) alpha(1) = (a0-ztov*b0)/v
        if (ztov.gt.0.5d0) alpha(1) = c0 - alnz*(0.75d0 +
       1  dcsevl (vlnz/0.35d0+1.0d0, znu1cs, ntznu1))*b0
        beta(1) = -0.5d0*(a0+ztov*b0)
  c
        z = 0.0d0
        if (x.gt.xsml) z = 0.25d0*x*x
        nterms = max1 (2.0, 11.0+(8.*sngl(alnz)-25.19-alneps)
       1  /(4.28-sngl(alnz)))
        do 30 i=2,nterms
          xi = i - 1
          a0 = a0/(xi*(xi-v))
          b0 = b0/(xi*(xi+v))
          alpha(i) = (alpha(i-1)+2.0d0*xi*a0)/(xi*(xi+v))
          beta(i) = (xi-0.5d0*v)*alpha(i) - ztov*b0
   30   continue
  c
        bknu = alpha(nterms)
        bknud = beta(nterms)
        do 40 ii=2,nterms
          i = nterms + 1 - ii
          bknu = alpha(i) + bknu*z
          bknud = beta(i) + bknud*z
   40   continue
  c
        expx = dexp(x)
        bknu = expx*bknu/x2tov
  c
        if (-0.5d0*(xnu+1.d0)*alnz-2.0d0*aln2.gt.alnbig) iswtch = 1
        if (iswtch.eq.1) return
        bknud = expx*bknud*2.0d0/(x2tov*x)
  c
        if (xnu.le.0.5d0) bknu1 = v*bknu/x - bknud
        if (xnu.le.0.5d0) return
  c
        bknu0 = bknu
        bknu = -v*bknu/x - bknud
        bknu1 = 2.0d0*xnu*bknu/x + bknu0
        return
  c
  c x is large.  find k-sub-xnu (x) and k-sub-xnu+1 (x) with y. l. luke-s
  c rational expansion.
  c
   50   sqrtx = dsqrt(x)
        if (x.gt.1.0d0/xsml) go to 90
        an = -0.60 - 1.02/sngl(x)
        bn = -0.27 - 0.53/sngl(x)
        nterms = min0 (32, max1 (3.0, an+bn*alneps))
  c
        do 80 inu=1,2
          xmu = 0.d0
          if (inu.eq.1 .and. xnu.gt.xnusml) xmu = (4.0d0*xnu)*xnu
          if (inu.eq.2) xmu = 4.0d0*(dabs(xnu)+1.d0)**2
  c
          a(1) = 1.0d0 - xmu
          a(2) = 9.0d0 - xmu
          a(3) = 25.0d0 - xmu
          if (a(2).eq.0.d0) result = sqpi2*(16.d0*x+xmu+7.d0) /
       1    (16.d0*x*sqrtx)
          if (a(2).eq.0.d0) go to 70
  c
          alpha(1) = 1.0d0
          alpha(2) = (16.d0*x+a(2))/a(2)
          alpha(3) = ((768.d0*x+48.d0*a(3))*x + a(2)*a(3))/(a(2)*a(3))
  c
          beta(1) = 1.0d0
          beta(2) = (16.d0*x+(xmu+7.d0))/a(2)
          beta(3) = ((768.d0*x+48.d0*(xmu+23.d0))*x +
       1    ((xmu+62.d0)*xmu+129.d0))/(a(2)*a(3))
  c
          if (nterms.lt.4) go to 65
          do 60 i=4,nterms
            n = i - 1
            x2n = 2*n - 1
  c
            a(i) = (x2n+2.d0)**2 - xmu
            qq = 16.d0*x2n/a(i)
            p1 = -x2n*(dble(float(12*n*n-20*n))-a(1))/((x2n-2.d0)*a(i))
       1      - qq*x
            p2 = (dble(float(12*n*n-28*n+8))-a(1))/a(i) - qq*x
            p3 = -x2n*a(i-3)/((x2n-2.d0)*a(i))
  c
            alpha(i) = -p1*alpha(i-1) - p2*alpha(i-2) - p3*alpha(i-3)
            beta(i) = -p1*beta(i-1) - p2*beta(i-2) - p3*beta(i-3)
   60     continue
  c
   65     result = sqpi2*beta(nterms)/(sqrtx*alpha(nterms))
  c
   70     if (inu.eq.1) bknu = result
          if (inu.eq.2) bknu1 = result
   80   continue
        return
  c
   90   bknu = sqpi2/sqrtx
        bknu1 = bknu
        return
  c
        end