cjylv Subroutine

public subroutine cjylv(v, z, Cbjv, Cdjv, Cbyv, Cdyv)

Compute Bessel functions Jv(z) and Yv(z) and their derivatives with a complex argument and a large order

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: v

Order of Jv(z) and Yv(z)

complex(kind=wp), intent(in) :: z

Complex argument

real(kind=wp), intent(out) :: Cbjv

Jv(z)

real(kind=wp), intent(out) :: Cdjv

Jv'(z)

real(kind=wp), intent(out) :: Cbyv

Yv(z)

real(kind=wp), intent(out) :: Cdyv

Yv'(z)


Calls

proc~~cjylv~~CallsGraph proc~cjylv specfun_module::cjylv proc~cjk specfun_module::cjk proc~cjylv->proc~cjk

Source Code

   subroutine cjylv(v,z,Cbjv,Cdjv,Cbyv,Cdyv)

      real(wp),intent(in) :: v !! Order of Jv(z) and Yv(z)
      complex(wp),intent(in) :: z !! Complex argument
      real(wp),intent(out) :: Cbjv !! Jv(z)
      real(wp),intent(out) :: Cdjv !! Jv'(z)
      real(wp),intent(out) :: Cbyv !! Yv(z)
      real(wp),intent(out) :: Cdyv !! Yv'(z)

      real(wp) :: a(91) , v0 , vr
      complex(wp) :: ceta , cf(12) , cfj , cfy , csj , csy , ct , ct2 , cws
      integer :: i , k , km , l , l0 , lf

      km = 12
      call cjk(km,a)
      do l = 1 , 0 , -1
         v0 = v - l
         cws = sqrt(1.0_wp-(z/v0)*(z/v0))
         ceta = cws + log(z/v0/(1.0_wp+cws))
         ct = 1.0_wp/cws
         ct2 = ct*ct
         do k = 1 , km
            l0 = k*(k+1)/2 + 1
            lf = l0 + k
            cf(k) = a(lf)
            do i = lf - 1 , l0 , -1
               cf(k) = cf(k)*ct2 + a(i)
            enddo
            cf(k) = cf(k)*ct**k
         enddo
         vr = 1.0_wp/v0
         csj = (1.0_wp,0.0_wp)
         do k = 1 , km
            csj = csj + cf(k)*vr**k
         enddo
         Cbjv = sqrt(ct/(twopi*v0))*exp(v0*ceta)*csj
         if ( l==1 ) cfj = Cbjv
         csy = (1.0_wp,0.0_wp)
         do k = 1 , km
            csy = csy + (-1)**k*cf(k)*vr**k
         enddo
         Cbyv = -sqrt(2.0_wp*ct/(pi*v0))*exp(-v0*ceta)*csy
         if ( l==1 ) cfy = Cbyv
      enddo
      Cdjv = -v/z*Cbjv + cfj
      Cdyv = -v/z*Cbyv + cfy

   end subroutine cjylv