/* Author:  G. Jungman
 * RCS:     $Id: bessel.h,v 1.14 1999/02/11 01:09:22 jungman Exp $
 */
#ifndef _BESSEL_H_
#define _BESSEL_H_

#include "gsl_sf_result.h"


/* Taylor expansion for J_nu(x) or I_nu(x)
 *   sign = -1  ==> Jnu
 *   sign = +1  ==> Inu
 */
int gsl_sf_bessel_IJ_taylor_impl(double nu, double x,
                                 int sign,
                                 int kmax,
				 double threshold,
                                 gsl_sf_result * result
                                 );

int gsl_sf_bessel_Jnu_asympx_impl(double nu, double x, gsl_sf_result * result);
int gsl_sf_bessel_Ynu_asympx_impl(double nu, double x, gsl_sf_result * result);

int gsl_sf_bessel_Inu_scaled_asympx_impl(double nu, double x, gsl_sf_result * result);
int gsl_sf_bessel_Knu_scaled_asympx_impl(double nu, double x, gsl_sf_result * result);

int gsl_sf_bessel_Inu_scaled_asymp_unif_impl(double nu, double x, gsl_sf_result * result);
int gsl_sf_bessel_Knu_scaled_asymp_unif_impl(double nu, double x, gsl_sf_result * result);


/* ratio = J_{nu+1}(x) / J_nu(x)
 * sgn   = sgn(J_nu(x))
 */
int
gsl_sf_bessel_J_CF1(double nu, double x, double * ratio, double * sgn);


/* ratio = I_{nu+1}(x) / I_nu(x)
 */
int
gsl_sf_bessel_I_CF1_ser(double nu, double x, double * ratio);


/* Evaluate the Steed method continued fraction CF2 for
 *
 * (J' + i Y')/(J + i Y) := P + i Q
 */
int
gsl_sf_bessel_JY_steed_CF2(double nu, double x,
                           double * P, double * Q);


int
gsl_sf_bessel_JY_mu_restricted(double mu, double x,
                               gsl_sf_result * Jmu, gsl_sf_result * Jmup1,
                               gsl_sf_result * Ymu, gsl_sf_result * Ymup1);


int
gsl_sf_bessel_K_scaled_steed_temme_CF2(const double nu, const double x,
                                       double * K_nu, double * K_nup1,
				       double * Kp_nu);


/* These are of use in calculating the oscillating
 * Bessel functions.
 *   cos(y - pi/4 + eps)
 *   sin(y - pi/4 + eps)
 */
int gsl_sf_bessel_cos_pi4_impl(double y, double eps, gsl_sf_result * result);
int gsl_sf_bessel_sin_pi4_impl(double y, double eps, gsl_sf_result * result);


#endif /* !_BESSEL_H_ */
