@cindex Coulomb wave functions
@cindex hydrogen atom

The prototypes of the Coulomb functions are declared in the header file
@file{gsl_sf_coulomb.h}.  Both bound state and scattering solutions are
available.

@menu
* Normalized Hydrogenic Bound States::  
* Coulomb Wave Functions::      
* Coulomb Wave Function Normalization Constant::  
@end menu

@node Normalized Hydrogenic Bound States
@subsection Normalized Hydrogenic Bound States

@deftypefun double gsl_sf_hydrogenicR_1 (double @var{Z}, double @var{r})
@deftypefunx int gsl_sf_hydrogenicR_1_e (double @var{Z}, double @var{r}, gsl_sf_result * @var{result})
These routines compute the lowest-order normalized hydrogenic bound
state radial wavefunction @c{$R_1 := 2Z \sqrt{Z} \exp(-Z r)$}
@math{R_1 := 2Z \sqrt@{Z@} \exp(-Z r)}.
@end deftypefun

@deftypefun double gsl_sf_hydrogenicR (int @var{n}, int @var{l}, double @var{Z}, double @var{r})
@deftypefunx int gsl_sf_hydrogenicR_e (int @var{n}, int @var{l}, double @var{Z}, double @var{r}, gsl_sf_result * @var{result})
These routines compute the @var{n}-th normalized hydrogenic bound state
radial wavefunction,
@comment
@tex
\beforedisplay
$$
R_n := {2 Z^{3/2} \over n^2}  \left({2Z r \over n}\right)^l  \sqrt{(n-l-1)! \over (n+l)!} \exp(-Z r/n) L^{2l+1}_{n-l-1}(2Z r / n).
$$
\afterdisplay
@end tex
@ifinfo

@example
R_n := 2 (Z^@{3/2@}/n^2) \sqrt@{(n-l-1)!/(n+l)!@} \exp(-Z r/n) (2Zr/n)^l
          L^@{2l+1@}_@{n-l-1@}(2Zr/n).  
@end example

@end ifinfo
@noindent
where @math{L^a_b(x)} is the generalized Laguerre polynomial (@pxref{Laguerre Functions}).
The normalization is chosen such that the wavefunction @math{\psi} is
given by 
@c{$\psi(n,l,r) = R_n Y_{lm}$}
@math{\psi(n,l,r) = R_n Y_@{lm@}}.   
@end deftypefun

@node Coulomb Wave Functions
@subsection Coulomb Wave Functions

The Coulomb wave functions @math{F_L(\eta,x)}, @math{G_L(\eta,x)} are
described in Abramowitz & Stegun, Chapter 14.  Because there can be a
large dynamic range of values for these functions, overflows are handled
gracefully.  If an overflow occurs, @code{GSL_EOVRFLW} is signalled and
exponent(s) are returned through the modifiable parameters @var{exp_F},
@var{exp_G}. The full solution can be reconstructed from the following
relations,
@tex
\beforedisplay
$$
\eqalign{
  F_L(\eta,x)  &=  fc[k_L] * \exp(exp_F)\cr
  G_L(\eta,x)  &=  gc[k_L] * \exp(exp_G)\cr
\cr
  F_L'(\eta,x) &= fcp[k_L] * \exp(exp_F)\cr
  G_L'(\eta,x) &= gcp[k_L] * \exp(exp_G)
}
$$
\afterdisplay
@end tex
@ifinfo

@example
F_L(eta,x)  =  fc[k_L] * exp(exp_F)
G_L(eta,x)  =  gc[k_L] * exp(exp_G)

F_L'(eta,x) = fcp[k_L] * exp(exp_F)
G_L'(eta,x) = gcp[k_L] * exp(exp_G)
@end example

@end ifinfo
@noindent

@deftypefun int gsl_sf_coulomb_wave_FG_e (double @var{eta}, double @var{x}, double @var{L_F}, int @var{k}, gsl_sf_result * @var{F}, gsl_sf_result * @var{Fp}, gsl_sf_result * @var{G}, gsl_sf_result * @var{Gp}, double * @var{exp_F}, double * @var{exp_G})
This function computes the Coulomb wave functions @math{F_L(\eta,x)},
@c{$G_{L-k}(\eta,x)$} 
@math{G_@{L-k@}(\eta,x)} and their derivatives 
@math{F'_L(\eta,x)}, 
@c{$G'_{L-k}(\eta,x)$}
@math{G'_@{L-k@}(\eta,x)}
with respect to @math{x}.  The parameters are restricted to @math{L,
L-k > -1/2}, @math{x > 0} and integer @math{k}.  Note that @math{L}
itself is not restricted to being an integer. The results are stored in
the parameters @var{F}, @var{G} for the function values and @var{Fp},
@var{Gp} for the derivative values.  If an overflow occurs,
@code{GSL_EOVRFLW} is returned and scaling exponents are stored in
the modifiable parameters @var{exp_F}, @var{exp_G}.
@end deftypefun

@deftypefun int gsl_sf_coulomb_wave_F_array (double @var{L_min}, int @var{kmax}, double @var{eta}, double @var{x}, double @var{fc_array}[], double * @var{F_exponent})
This function computes the Coulomb wave function @math{F_L(\eta,x)} for
@math{L = Lmin \dots Lmin + kmax}, storing the results in @var{fc_array}.
In the case of overflow the exponent is stored in @var{F_exponent}.
@end deftypefun

@deftypefun int gsl_sf_coulomb_wave_FG_array (double @var{L_min}, int @var{kmax}, double @var{eta}, double @var{x}, double @var{fc_array}[], double @var{gc_array}[], double * @var{F_exponent}, double * @var{G_exponent})
This function computes the functions @math{F_L(\eta,x)},
@math{G_L(\eta,x)} for @math{L = Lmin \dots Lmin + kmax} storing the
results in @var{fc_array} and @var{gc_array}.  In the case of overflow the
exponents are stored in @var{F_exponent} and @var{G_exponent}.
@end deftypefun

@deftypefun int gsl_sf_coulomb_wave_FGp_array (double @var{L_min}, int @var{kmax}, double @var{eta}, double @var{x}, double @var{fc_array}[], double @var{fcp_array}[], double @var{gc_array}[], double @var{gcp_array}[], double * @var{F_exponent}, double * @var{G_exponent})
This function computes the functions @math{F_L(\eta,x)},
@math{G_L(\eta,x)} and their derivatives @math{F'_L(\eta,x)},
@math{G'_L(\eta,x)} for @math{L = Lmin \dots Lmin + kmax} storing the
results in @var{fc_array}, @var{gc_array}, @var{fcp_array} and @var{gcp_array}.
In the case of overflow the exponents are stored in @var{F_exponent} 
and @var{G_exponent}.
@end deftypefun

@deftypefun int gsl_sf_coulomb_wave_sphF_array (double @var{L_min}, int @var{kmax}, double @var{eta}, double @var{x}, double @var{fc_array}[], double @var{F_exponent}[])
This function computes the Coulomb wave function divided by the argument
@math{F_L(\eta, x)/x} for @math{L = Lmin \dots Lmin + kmax}, storing the
results in @var{fc_array}.  In the case of overflow the exponent is
stored in @var{F_exponent}. This function reduces to spherical Bessel
functions in the limit @math{\eta \to 0}.
@end deftypefun

@node Coulomb Wave Function Normalization Constant
@subsection Coulomb Wave Function Normalization Constant

The Coulomb wave function normalization constant is defined in
Abramowitz 14.1.7.

@deftypefun int gsl_sf_coulomb_CL_e (double @var{L}, double @var{eta}, gsl_sf_result * @var{result})
This function computes the Coulomb wave function normalization constant
@math{C_L(\eta)} for @math{L > -1}.
@end deftypefun

@deftypefun int gsl_sf_coulomb_CL_array (double @var{Lmin}, int @var{kmax}, double @var{eta}, double @var{cl}[])
This function computes the Coulomb wave function normalization constant
@math{C_L(\eta)} for @math{L = Lmin \dots Lmin + kmax}, @math{Lmin > -1}.
@end deftypefun



