00001 #ifndef __INCLUDE_PARTWAVE_CC__ 00002 #define __INCLUDE_PARTWAVE_CC__ 00003 #include "wavefunction.h" 00004 00005 CPartWave::CPartWave(double etaset,int q1q2set,double qset,int ellset, 00006 double epsilonset){ 00007 epsilon=epsilonset; 00008 delr=0.01; 00009 nrmax=3000; 00010 complex<double> cg; 00011 ci=complex<double>(0.0,1.0); 00012 q=qset; 00013 q1q2=q1q2set; 00014 eta=etaset; 00015 ell=ellset; 00016 sigma=0.0; 00017 if(q1q2!=0){ 00018 cg=CoulWave::cgamma(ell+1.0+ci*eta); 00019 sigma=atan2(imag(cg),real(cg)); 00020 } 00021 phi_init(); 00022 } 00023 00024 CPartWave::CPartWave(double etaset,int q1q2set,double qset,int ellset, 00025 double epsilonset,int nrmaxset,double delrset){ 00026 epsilon=epsilonset; 00027 nrmax=nrmaxset; 00028 complex<double> cg; 00029 ci=complex<double>(0.0,1.0); 00030 q=qset; 00031 q1q2=q1q2set; 00032 eta=etaset; 00033 ell=ellset; 00034 sigma=0.0; 00035 if(q1q2!=0){ 00036 cg=CoulWave::cgamma(ell+1.0+ci*eta); 00037 sigma=atan2(imag(cg),real(cg)); 00038 } 00039 phi_init(); 00040 } 00041 00042 CPartWave::~CPartWave(){ 00043 delete [] phi; 00044 }; 00045 00046 void CPartWave::phi_init(){ 00047 complex<double> phi0,phi1,phi2,phitest; 00048 int ir; 00049 double x,r; 00050 00051 phi=new complex<double> [nrmax+1]; 00052 00053 if(q1q2!=0){ 00054 for(ir=0;ir<nrmax;ir++){ 00055 r=(0.5+ir)*delr; 00056 x=q*r/HBARC; 00057 phi[ir]=CoulWave::CWincoming(ell,x,eta)*Misc::ceiphi(-sigma); 00058 } 00059 00060 } 00061 else{ 00062 for(ir=0;ir<nrmax;ir++){ 00063 r=(0.5+ir)*delr; 00064 x=q*r/HBARC; 00065 phi[ir]=x*Bessel::hstarn(ell,x); 00066 } 00067 } 00068 00069 } 00070 00071 complex<double> CPartWave::GetPhiIncoming(double r){ 00072 double x,a; 00073 complex<double> answer; 00074 int ir; 00075 ir=int(floor(r/delr)); 00076 if(ir<nrmax){ 00077 a=(r-delr*(ir+0.5))/delr; 00078 if(a>0.0 || ir==0){ 00079 answer=(1.0-a)*phi[ir]+a*phi[ir+1]; 00080 } 00081 else{ 00082 answer=(1.0+a)*phi[ir]-a*phi[ir-1]; 00083 } 00084 } 00085 else{ 00086 x=q*r/HBARC; 00087 if(q1q2!=0){ 00088 answer=CoulWave::CWincoming(ell,x,eta); 00089 answer=answer*Misc::ceiphi(-sigma); 00090 } 00091 else 00092 answer=x*Bessel::hstarn(ell,x); 00093 } 00094 return answer; 00095 } 00096 00097 complex<double> CPartWave::GetPhiOutgoing(double r){ 00098 complex<double> answer; 00099 answer=conj(GetPhiIncoming(r)); 00100 if(q1q2!=0) answer=answer*Misc::ceiphi(-2.0*sigma); 00101 return answer; 00102 } 00103 00104 #endif