00001
00005
00006
00007
00008
00009 #include "specfun_stdcplx.h"
00010 #include "constants.h"
00011 #include <stdio.h>
00012 #include "prototypes2.h"
00013
00014 NAMESPACE_TBCI
00015
00016 CPLX__ complex<double> HypergeometricU(const CPLX__ complex<double>& a,
00017 const CPLX__ complex<double>& b,
00018 const CPLX__ complex<double>& z)
00019 {
00020 printf ("????\n");
00021 doublecomplex sin_erg;
00022 doublecomplex pow_erg;
00023 doublecomplex temp;
00024 CPLX__ complex<double> res;
00025
00026 temp.r = pi*b.real(); temp.i = pi*b.imag();
00027 z_sin(&sin_erg, &temp);
00028
00029 temp.r = -b.real() + 1.0; temp.i = -b.imag();
00030 pow_zz(&pow_erg, (doublecomplex*)&z, &temp);
00031
00032 res = pi/CPLX__ complex<double>(sin_erg.r, sin_erg.i)
00033 *(HypergeometricM(a,b,z)/(gamma(a-b+1.0)*gamma(b))
00034 -CPLX__ complex<double>(pow_erg.r, pow_erg.i)
00035 *HypergeometricM(a-b+1.0,-b+2.0,z)/(gamma(a)*gamma(-b+2.0))
00036 );
00037
00038 return res;
00039 }
00040
00041
00042 CPLX__ complex<double> gamma(const CPLX__ complex<double>& z)
00043 {
00044 floatcomplex arg = {(float)z.real(), (float)z.imag()};
00045 floatcomplex erg;
00046 cgamma_(&erg, &arg);
00047
00048 return CPLX__ complex<double>(erg.r, erg.i);
00049 }
00050
00051
00052 CPLX__ complex<double> HypergeometricM(const CPLX__ complex<double>& a,
00053 const CPLX__ complex<double>& b,
00054 const CPLX__ complex<double>& z)
00055 {
00056 doublecomplex erg = {0, 0};
00057 const LONG_ int lnchf = 0;
00058 const LONG_ int ip = 10;
00059
00060 conhyp_(&erg, (doublecomplex*)&a, (doublecomplex*)&b,
00061 (doublecomplex*)&z, &lnchf, &ip);
00062
00063 return CPLX__ complex<double>(erg.r, erg.i);
00064 }
00065
00066 CPLX__ complex<double> besselh1(double order, const CPLX__ complex<double>& z)
00067 {
00068 double zr, zi, fnu;
00069 LONG_ int kode, m, n;
00070 double cyr[1], cyi[1];
00071 LONG_ int nz, ierr;
00072
00073 zr = z.real(); zi = z.imag();
00074
00075 kode = 1;
00076 m = 1;
00077 n = 1;
00078 fnu = MATH__ fabs(order);
00079 zbesh_(&zr, &zi, &fnu, &kode, &m, &n, cyr, cyi, &nz, &ierr);
00080 if (ierr || nz)
00081 fprintf (stderr, "Error computing Hankel function\n");
00082 if (order >= 0.0)
00083 return CPLX__ complex<double> (cyr[0], cyi[0]);
00084
00085 static const CPLX__ complex<double> I(0,1);
00086 return CPLX__ complex<double>(cyr[0], cyi[0])* MATH__ exp(pi*fnu*I);
00087 }
00088
00089
00090 CPLX__ complex<double> besselh2(double order, const CPLX__ complex<double>& z)
00091 {
00092 double zr, zi, fnu;
00093 LONG_ int kode, m, n;
00094 double cyr[1], cyi[1];
00095 LONG_ int nz, ierr;
00096
00097 zr = z.real(); zi = z.imag();
00098
00099 kode = 1;
00100 m = 2;
00101 n = 1;
00102 fnu = MATH__ fabs(order);
00103 zbesh_(&zr, &zi, &fnu, &kode, &m, &n, cyr, cyi, &nz, &ierr);
00104 if (ierr || nz)
00105 fprintf (stderr, "Error computing Hankel function\n");
00106 if (order >= 0.0)
00107 return CPLX__ complex<double> (cyr[0], cyi[0]);
00108
00109 static const CPLX__ complex<double> I(0,1);
00110 return CPLX__ complex<double> (cyr[0], cyi[0]) * MATH__ exp(-pi*fnu*I);
00111 }
00112
00113
00114 CPLX__ complex<double> besselj(double order, const CPLX__ complex<double>& z)
00115 {
00116 double zr, zi, fnu;
00117 LONG_ int kode, n;
00118 double cyr[1], cyi[1];
00119 LONG_ int nz, ierr;
00120
00121 zr = z.real(); zi = z.imag();
00122
00123 kode = 1;
00124 n = 1;
00125 fnu = MATH__ fabs(order);
00126 zbesj_(&zr, &zi, &fnu, &kode, &n, cyr, cyi, &nz, &ierr);
00127 if (ierr || nz)
00128 fprintf (stderr, "Error computing Hankel function\n");
00129 if (order >= 0.0)
00130 return CPLX__ complex<double> (cyr[0], cyi[0]);
00131
00132
00133 return CPLX__ complex<double>(cyr[0], cyi[0])* MATH__ cos(pi*fnu)
00134 - bessely(fnu, z)* MATH__ sin(pi*fnu);
00135 }
00136
00137
00138
00139 CPLX__ complex<double> besseli(double order, const CPLX__ complex<double>& z)
00140 {
00141 double zr, zi, fnu;
00142 LONG_ int kode, n;
00143 double cyr[1], cyi[1];
00144 LONG_ int nz, ierr;
00145
00146 zr = z.real(); zi = z.imag();
00147
00148 kode = 1;
00149 n = 1;
00150 fnu = MATH__ fabs(order);
00151 zbesi_(&zr, &zi, &fnu, &kode, &n, cyr, cyi, &nz, &ierr);
00152 if (ierr || nz)
00153 fprintf (stderr, "Error computing Hankel function\n");
00154 if (order >= 0.0)
00155 return CPLX__ complex<double> (cyr[0], cyi[0]);
00156
00157
00158 return CPLX__ complex<double> (cyr[0], cyi[0])
00159 + 2.0/pi*MATH__ sin(pi*fnu)*besselk(fnu,z);
00160 }
00161
00162
00163
00164 CPLX__ complex<double> besselk(double order, const CPLX__ complex<double>& z)
00165 {
00166 double zr, zi, fnu;
00167 LONG_ int kode, n;
00168 double cyr[1], cyi[1];
00169 LONG_ int nz, ierr;
00170
00171 zr = z.real(); zi = z.imag();
00172
00173 kode = 1;
00174 n = 1;
00175 fnu = MATH__ fabs(order);
00176 zbesk_(&zr, &zi, &fnu, &kode, &n, cyr, cyi, &nz, &ierr);
00177 if (ierr || nz)
00178 fprintf (stderr, "Error computing Hankel function\n");
00179 if (order >= 0.0)
00180 return CPLX__ complex<double> (cyr[0], cyi[0]);
00181
00182
00183 return CPLX__ complex<double> (cyr[0], cyi[0]);
00184 }
00185
00186
00187 CPLX__ complex<double> bessely(double order, const CPLX__ complex<double>& z)
00188 {
00189 double zr, zi, fnu;
00190 LONG_ int kode, n;
00191 double cyr[1], cyi[1];
00192 double wcyr[1], wcyi[1];
00193 LONG_ int nz, ierr;
00194
00195 zr = z.real(); zi = z.imag();
00196
00197 kode = 1;
00198 n = 1;
00199 fnu = MATH__ fabs(order);
00200 zbesy_(&zr, &zi, &fnu, &kode, &n, cyr, cyi, &nz, wcyr, wcyi, &ierr);
00201 if (ierr || nz)
00202 fprintf (stderr, "Error computing Hankel function\n");
00203 if (order >= 0.0)
00204 return CPLX__ complex<double> (cyr[0], cyi[0]);
00205
00206
00207 return CPLX__ complex<double> (cyr[0], cyi[0])*MATH__ cos(pi*fnu)
00208 + besselj(fnu,z)*MATH__ sin(pi*fnu);
00209 }
00210
00211 NAMESPACE_END