2
c $Id: nwpw_SpecialKummer.F 21176 2011-10-10 06:35:49Z d3y133 $
5
* ******************************************************
7
* * nwpw_SpecialKummer *
9
* ******************************************************
11
* Calculates a special case of the Kummer confluent hypergeometric
12
* function, M(n+1/2,l+3/2,z) for z .LE. 0
14
* This function was created by Marat Valiev, and modified by Eric Bylaska.
15
* See Abramowitz and Stegun for the formulas used in this function.
17
real*8 function nwpw_SpecialKummer(n,l,z)
22
* *** local variables ***
24
parameter (eps=1.0d-16)
29
* **** external functions ****
30
real*8 util_gamma,util_gammp
31
external util_gamma,util_gammp
33
nwpw_SpecialKummer = 0.0d0
35
* *** cannot handle positive z ***
37
call errquit('nwpw_SpecialKummer:invalid parameter, z>0',0,1)
41
* *** solution for z==0 ***
43
nwpw_SpecialKummer = 1.0d0
47
* ***** M(a,a+1,z) = a * (-z)**(-a) * igamma(a,-z) = a * (-z)**(-a) * P(a,-z) *Gamma(a) where z is real and a = (n+0.5) ****
49
nwpw_SpecialKummer = util_gammp(n+0.5d0,(-z))
51
> *((-z)**((-n)- 0.5d0))
52
> *util_gamma(n+0.5d0)
55
* ***** M(a,a,z) = exp(z) where a = (n+0.5) ****
56
else if (n.eq.(l+1)) then
57
nwpw_SpecialKummer = dexp(z)
61
! *** do inifinite series for small z
62
if (dabs(z).le.1.0d0) then
64
nwpw_SpecialKummer = 1.0d0
69
s = s*(a+i-1)*z/((b+i-1)*i)
70
nwpw_SpecialKummer = nwpw_SpecialKummer + s
71
if (dabs(s).lt.eps) return
73
call errquit("nwpw_SpecialKummer:cannot converge",0,1)
79
!*** starting point n=l or b=a+1***
83
!*** m1 = M(a,b-1) ***
84
!*** m2 = M(a,b,z) ***
86
nwpw_SpecialKummer = util_gammp(a,(-z))*a/(-z)**a*util_gamma(a)
88
!**********************************************
89
! using recursion formula
90
! z(a-b)M(a,b+1,z)=b(b-1)M(a,b-1,z)+b(1-b-z)M(a,b,z)
91
! obtain M(1/2,3/2+l ,z) --> m2
92
! M(1/2,3/2+l-1,z) --> m2
93
!**********************************************
95
m3=(b*(b-1.0d0)*m1+b*(1.0d0-b-z)*nwpw_SpecialKummer)
98
m1 = nwpw_SpecialKummer
99
nwpw_SpecialKummer = m3
102
else if (n.gt.(l+1)) then
104
!*** starting point n=l+1 or b=a ***
108
!*** m1 = M(a-1,b) ***
109
!*** m2 = M(a,a,z) ***
110
m1 = util_gammp(a-1.0d0,(-z))*(a-1.0d0)/(-z)**(a-1.0d0)*
111
> util_gamma(a-1.0d0)
112
nwpw_SpecialKummer = dexp(z)
114
!**********************************************
115
! using recursion formula
116
! aM(a+1,b,z)=(b-a)M(a-1,b,z)+(2a-b+z)M(a,b,z)
117
! obtain M(n+1/2-1,3/2,z) --> m1
118
! M(n+1/2 ,3/2,z) --> m2
119
!**********************************************
121
m3 = ((b-a)*m1+(2*a-b+z)*nwpw_SpecialKummer)/a
122
m1 = nwpw_SpecialKummer
123
nwpw_SpecialKummer = m3