00001 #ifndef __INCLUDE_GSLBESS_CC__
00002 #define __INCLUDE_GSLBESS_CC__
00003 #include "sf.h"
00004
00005 using namespace std;
00006
00007 double Bessel::J0(double x){
00008 return gsl_sf_bessel_J0(x);
00009 }
00010
00011 double Bessel::J1(double x){
00012 return gsl_sf_bessel_J1(x);
00013 }
00014
00015 double Bessel::Jn(int n,double x){
00016 return gsl_sf_bessel_Jn(n,x);
00017 }
00018
00019 double Bessel::Y0(double x){
00020 return gsl_sf_bessel_Y0(x);
00021 }
00022
00023 double Bessel::Y1(double x){
00024 return gsl_sf_bessel_Y1(x);
00025 }
00026
00027 double Bessel::Yn(int n,double x){
00028 return gsl_sf_bessel_Yn(n,x);
00029 }
00030
00031 double Bessel::K0(double x){
00032 return gsl_sf_bessel_K0(x);
00033 }
00034
00035 double Bessel::K1(double x){
00036 return gsl_sf_bessel_K1(x);
00037 }
00038
00039 double Bessel::Kn(int n,double x){
00040 return gsl_sf_bessel_Kn(n,x);
00041 }
00042
00043 double Bessel::I0(double x){
00044 return gsl_sf_bessel_K0(x);
00045 }
00046
00047 double Bessel::I1(double x){
00048 return gsl_sf_bessel_K1(x);
00049 }
00050
00051 double Bessel::In(int n,double x){
00052 return gsl_sf_bessel_Kn(n,x);
00053 }
00054
00055 double Bessel::j0(double x){
00056 return gsl_sf_bessel_j0(x);
00057 }
00058
00059 double Bessel::j1(double x){
00060 return gsl_sf_bessel_j1(x);
00061 }
00062
00063 double Bessel::jn(int n,double x){
00064 double answer,oldanswer,tempanswer;
00065 int L;
00066 if(n==0) answer=j0(x);
00067 else{
00068 answer=j1(x);
00069 if(n>1){
00070 oldanswer=j0(x);
00071 for(L=2;L<=n;L++){
00072 tempanswer=answer;
00073 answer=-oldanswer+(2.0*L-1)*answer/x;
00074 oldanswer=tempanswer;
00075 }
00076 }
00077 }
00078 return answer;
00079 }
00080
00081 double Bessel::y0(double x){
00082 return gsl_sf_bessel_y0(x);
00083 }
00084
00085 double Bessel::y1(double x){
00086 return gsl_sf_bessel_y1(x);
00087 }
00088
00089 double Bessel::yn(int n,double x){
00090 double answer,oldanswer,tempanswer;
00091 int L;
00092
00093 if(n==0) answer=y0(x);
00094 else{
00095 answer=y1(x);
00096 if(n>1){
00097 oldanswer=y0(x);
00098 for(L=2;L<=n;L++){
00099 tempanswer=answer;
00100 answer=-oldanswer+(2.0*L-1)*answer/x;
00101 oldanswer=tempanswer;
00102 }
00103 }
00104 }
00105 return answer;
00106
00107 }
00108
00109 complex<double> Bessel::h0(double x){
00110 complex<double> ci(0.0,1.0);
00111 return (gsl_sf_bessel_j0(x)+ci*gsl_sf_bessel_y0(x));
00112 }
00113
00114 complex<double> Bessel::h1(double x){
00115 complex<double> ci(0.0,1.0);
00116 return (gsl_sf_bessel_j1(x)+ci*gsl_sf_bessel_y1(x));
00117 }
00118
00119 complex<double> Bessel::hn(int n,double x){
00120 complex<double> ci(0.0,1.0);
00121 return (jn(n,x)+ci*yn(n,x));
00122 }
00123
00124 complex<double> Bessel::hstar0(double x){
00125 complex<double> ci(0.0,1.0);
00126 return (gsl_sf_bessel_j0(x)-ci*gsl_sf_bessel_y0(x));
00127 }
00128
00129 complex<double> Bessel::hstar1(double x){
00130 complex<double> ci(0.0,1.0);
00131 return (gsl_sf_bessel_j1(x)-ci*gsl_sf_bessel_y1(x));
00132 }
00133
00134 complex<double> Bessel::hstarn(int n,double x){
00135 complex<double> ci(0.0,1.0);
00136 return (jn(n,x)-ci*yn(n,x));
00137 }
00138
00139 void Bessel::CalcJN_real(int ell,double x,double &jl,double &nl,double &jlprime,double &nlprime){
00140 int l=0;
00141 double j[4],n[4],jprime[4],nprime[4];
00142 double s=sin(x);
00143 double c=cos(x);
00144 if(ell>3){
00145 printf("increase array size in CalcJN_real\n");
00146 exit(1);
00147 }
00148 j[0]=s;
00149 n[0]=c;
00150 jprime[0]=c;
00151 nprime[0]=-s;
00152 while(l<ell){
00153 l+=1;
00154 j[l]=(double(l)/x)*j[l-1]-jprime[l-1];
00155 n[l]=(double(l)/x)*n[l-1]-nprime[l-1];
00156 jprime[l]=j[l-1]-(double(l)/x)*j[l];
00157 nprime[l]=n[l-1]-(double(l)/x)*n[l];
00158 };
00159 jl=j[ell];
00160 nl=n[ell];
00161 jlprime=jprime[ell];
00162 nlprime=nprime[ell];
00163 }
00164
00165 void Bessel::CalcJN_imag(int ell,double x,double &jl,double &nl,double &jlprime,double &nlprime){
00166 int l=0;
00167 double j[4],n[4],jprime[4],nprime[4];
00168 double s=sinh(x);
00169 double c=cosh(x);
00170 if(ell>3){
00171 printf("increase array size in CalcJN_imag\n");
00172 exit(1);
00173 }
00174 j[0]=s;
00175 n[0]=c;
00176 jprime[0]=c;
00177 nprime[0]=s;
00178 while(l<ell){
00179 l+=1;
00180 j[l]=(double(l)/x)*j[l-1]-jprime[l-1];
00181 n[l]=(double(l)/x)*n[l-1]-nprime[l-1];
00182 jprime[l]=-j[l-1]-(double(l)/x)*j[l];
00183 nprime[l]=-n[l-1]-(double(l)/x)*n[l];
00184 };
00185 jl=j[ell];
00186 nl=n[ell];
00187 jlprime=jprime[ell];
00188 nlprime=nprime[ell];
00189 }
00190
00191 #endif