00001 #ifndef __INCLUDE_WFSQUAREWELL_CC__
00002 #define __INCLUDE_WFSQUAREWELL_CC__
00003
00004 #include "wavefunction.h"
00005
00006 using namespace std;
00007
00008 void CWaveFunction::SquareWell_Init(){
00009
00010 CGSLMatrix_Complex *cmatrix;
00011 const double ALPHA=1.0/137.036;
00012 double q,mu,mu_coulomb,E;
00013 double beta;
00014 double F1b,G1b,F1bprime,G1bprime;
00015 double F2a,G2a,F2aprime,G2aprime;
00016 double F2b,G2b,F2bprime,G2bprime;
00017 double F3a,G3a,F3aprime,G3aprime;
00018 double F3b,G3b,F3bprime,G3bprime;
00019 double F,G,Fprime,Gprime;
00020 double F1,G1,F1prime,G1prime;
00021
00022 complex<double> eta,eta1,eta2,eta3;
00023 complex<double> x1b,x2a,x2b,x3a,x3b,x,q1,q2,q3;
00024 complex<double> U1b,U2a,U2b,U3a,U3b,U;
00025 complex<double> U1bprime,U2aprime,U2bprime,U3aprime,U3bprime,Uprime;
00026 complex<double> **M,*Y;
00027 complex<double> x1,x2;
00028 double F2,G2,F2prime,G2prime,qsquared,r;
00029 int i,j,iq,ir,ichannel;
00030 mu=m1*m2/(m1+m2);
00031
00032 for(ichannel=0;ichannel<nchannels;ichannel++){
00033 if(nwells[ichannel]==1){
00034 for(iq=0;iq<nqmax;iq++){
00035 q=GetQ(iq);
00036 E=sqrt(q*q+m1*m1)+sqrt(q*q+m2*m2);
00037 mu_coulomb=0.25*(E-pow(m1*m1-m2*m2,2)/pow(E,3));
00038 eta=q1q2*mu_coulomb*ALPHA/q;
00039
00040 qsquared=q*q-2.0*mu*V0[ichannel][0];
00041 if(qsquared>0) q1=sqrt(qsquared);
00042 else q1=ci*sqrt(abs(qsquared));
00043 x1=q1*a[ichannel][0]/HBARC;
00044 eta1=q1q2*mu_coulomb*ALPHA/q1;
00045 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x1,eta1,&F1,&G1,&F1prime,&G1prime);
00046 x2=q*a[ichannel][0]/HBARC;
00047 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x2,eta,&F2,&G2,&F2prime,&G2prime);
00048 beta=(abs(q1)/q)*F1prime/F1;
00049 delta[ichannel][iq]=-atan2(beta*F2-F2prime,beta*G2-G2prime);
00050 A[ichannel][iq][0]=0.5*(exp(-2.0*ci*delta[ichannel][iq])
00051 *(F2+ci*G2)+(F2-ci*G2))/F1;
00052 A[ichannel][iq][1]=exp(-2.0*ci*delta[ichannel][iq]);
00053
00054 }
00055 }
00056 else if(nwells[ichannel]==2){
00057 cmatrix=new CGSLMatrix_Complex(4);
00058 Y=new complex<double>[4];
00059 M=new complex<double> *[4];
00060 for(i=0;i<4;i++) M[i]=new complex<double>[4];
00061
00062 for(iq=0;iq<nqmax;iq++){
00063 q=GetQ(iq);
00064 E=sqrt(q*q+m1*m1)+sqrt(q*q+m2*m2);
00065 mu_coulomb=0.25*(E-pow(m1*m1-m2*m2,2)/pow(E,3));
00066
00067 q1=sqrt(abs(q*q-2.0*mu*V0[ichannel][0]));
00068 if(q*q-2.0*mu*V0[ichannel][0]<0.0) q1=ci*q1;
00069 q2=sqrt(abs(q*q-2.0*mu*V0[ichannel][1]));
00070 if(q*q-2.0*mu*V0[ichannel][1]<0.0) q2=ci*q2;
00071 x1b=a[ichannel][0]*q1/HBARC;
00072 x2a=a[ichannel][0]*q2/HBARC;
00073 x2b=a[ichannel][1]*q2/HBARC;
00074 x=a[ichannel][1]*q/HBARC;
00075 eta1=q1q2*mu_coulomb*ALPHA/q1;
00076 eta2=q1q2*mu_coulomb*ALPHA/q2;
00077 eta=q1q2*mu_coulomb*ALPHA/q;
00078 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x1b,eta1,&F1b,&G1b,&F1bprime,&G1bprime);
00079 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x2a,eta2,&F2a,&G2a,&F2aprime,&G2aprime);
00080 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x2b,eta2,&F2b,&G2b,&F2bprime,&G2bprime);
00081 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x,eta,&F,&G,&Fprime,&Gprime);
00082
00083 for(i=0;i<4;i++){
00084 Y[i]=0.0;
00085 for(j=0;j<4;j++) M[i][j]=0.0;
00086 }
00087 M[0][0]=F1b; M[0][1]=-F2a; M[0][2]=-G2a;
00088 M[1][0]=abs(q1)*F1bprime; M[1][1]=-abs(q2)*F2aprime; M[1][2]=-abs(q2)*G2aprime;
00089 M[2][1]=F2b; M[2][2]=G2b; M[2][3]=-0.5*(F+ci*G);
00090 M[3][1]=abs(q2)*F2bprime; M[3][2]=abs(q2)*G2bprime; M[3][3]=-0.5*q*(Fprime+ci*Gprime);
00091
00092 Y[2]=0.5*(F-ci*G); Y[3]=0.5*q*(Fprime-ci*Gprime);
00093 cmatrix->SolveLinearEqs(Y,M,A[ichannel][iq]);
00094
00095 delta[ichannel][iq]=-0.5*atan2(imag(A[ichannel][iq][3]),real(A[ichannel][iq][3]));
00096 if(delta[ichannel][iq]<0.0) delta[ichannel][iq]=delta[ichannel][iq]+PI;
00097
00098 }
00099 delete(cmatrix);
00100 delete [] Y;
00101 for(i=0;i<4;i++) delete [] M[i];
00102 delete [] M;
00103 }
00104 else if(nwells[ichannel]==3){
00105 cmatrix=new CGSLMatrix_Complex(6);
00106 Y=new complex<double>[6];
00107 M=new complex<double> *[6];
00108 for(i=0;i<6;i++) M[i]=new complex<double>[6];
00109
00110 for(iq=0;iq<nqmax;iq++){
00111 q=GetQ(iq);
00112 E=sqrt(q*q+m1*m1)+sqrt(q*q+m2*m2);
00113 mu_coulomb=0.25*(E-pow(m1*m1-m2*m2,2)/pow(E,3));
00114
00115 q1=sqrt(abs(q*q-2.0*mu*V0[ichannel][0]));
00116 if(q*q-2.0*mu*V0[ichannel][0]<0.0) q1=ci*q1;
00117 q2=sqrt(abs(q*q-2.0*mu*V0[ichannel][1]));
00118 if(q*q-2.0*mu*V0[ichannel][1]<0.0) q2=ci*q2;
00119 q3=sqrt(abs(q*q-2.0*mu*V0[ichannel][2]));
00120 if(q*q-2.0*mu*V0[ichannel][2]<0.0) q3=ci*q3;
00121 x1b=a[ichannel][0]*q1/HBARC;
00122 x2a=a[ichannel][0]*q2/HBARC;
00123 x2b=a[ichannel][1]*q2/HBARC;
00124 x3a=a[ichannel][1]*q3/HBARC;
00125 x3b=a[ichannel][2]*q3/HBARC;
00126 x=a[ichannel][2]*q/HBARC;
00127 eta1=q1q2*mu_coulomb*ALPHA/q1;
00128 eta2=q1q2*mu_coulomb*ALPHA/q2;
00129 eta3=q1q2*mu_coulomb*ALPHA/q3;
00130 eta=q1q2*mu_coulomb*ALPHA/q;
00131 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x1b,eta1,&F1b,&G1b,&F1bprime,&G1bprime);
00132 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x2a,eta2,&F2a,&G2a,&F2aprime,&G2aprime);
00133 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x2b,eta2,&F2b,&G2b,&F2bprime,&G2bprime);
00134 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x3a,eta3,&F3a,&G3a,&F3aprime,&G3aprime);
00135 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x3b,eta3,&F3b,&G3b,&F3bprime,&G3bprime);
00136 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x,eta,&F,&G,&Fprime,&Gprime);
00137
00138 for(i=0;i<6;i++){
00139 Y[i]=0.0;
00140 for(j=0;j<6;j++) M[i][j]=0.0;
00141 }
00142 M[0][0]=F1b; M[0][1]=-F2a; M[0][2]=-G2a;
00143 M[1][0]=abs(q1)*F1bprime; M[1][1]=-abs(q2)*F2aprime; M[1][2]=-abs(q2)*G2aprime;
00144 M[2][1]=F2b; M[2][2]=G2b; M[2][3]=-F3a; M[2][4]=-G3a;
00145 M[3][1]=abs(q2)*F2bprime; M[3][2]=abs(q2)*G2bprime; M[3][3]=-abs(q3)*F3aprime; M[3][4]=-abs(q3)*G3aprime;
00146 M[4][3]=F3b; M[4][4]=G3b; M[4][5]=-0.5*(F+ci*G);
00147 M[5][3]=abs(q3)*F3bprime; M[5][4]=abs(q3)*G3bprime; M[5][5]=-0.5*q*(Fprime+ci*Gprime);
00148
00149 Y[4]=0.5*(F-ci*G); Y[5]=0.5*q*(Fprime-ci*Gprime);
00150 cmatrix->SolveLinearEqs(Y,M,A[ichannel][iq]);
00151
00152
00153
00154
00155
00156 delta[ichannel][iq]=-0.5*atan2(imag(A[ichannel][iq][5]),real(A[ichannel][iq][5]));
00157 if(delta[ichannel][iq]<0.0) delta[ichannel][iq]=delta[ichannel][iq]+PI;
00158 }
00159 delete(cmatrix);
00160 delete [] Y;
00161 for(i=0;i<6;i++) delete [] M[i];
00162 delete [] M;
00163 }
00164 else{
00165 printf("nwells[%d] not equal to 1, 2 or 3??? =%d\n",ichannel,nwells[ichannel]);
00166 exit(1);
00167 }
00168 }
00169
00170 for(iq=0;iq<nqmax;iq++){
00171 for(ichannel=0;ichannel<nchannels;ichannel++) DelPhiArray[iq][0][ichannel]=0.0;
00172 for(ir=1;ir<=DelPhiArray_NRMAX;ir++){
00173 r=ir*DelPhiArray_DELR;
00174 SquareWell_CalcDelPhi(iq,r,DelPhiArray[iq][ir]);
00175 }
00176 }
00177 printf("FINISHED INITIALIZATION OF WAVEFUNCTIONS FOR PARTIAL WAVES\n");
00178
00179 }
00180
00181 void CWaveFunction::SquareWell_GetDelPhi(int iq,double r,complex<double> *DelPhi){
00182 double wa,wb;
00183 int ichannel;
00184 int ir=int(floor(r/DelPhiArray_DELR));
00185 if(ir<DelPhiArray_NRMAX){
00186 wb=(r-ir*DelPhiArray_DELR)/DelPhiArray_DELR;
00187 wa=1.0-wb;
00188 for(ichannel=0;ichannel<nchannels;ichannel++){
00189 DelPhi[ichannel]=wa*DelPhiArray[iq][ir][ichannel]+wb*DelPhiArray[iq][ir+1][ichannel];
00190 }
00191 }
00192 else SquareWell_CalcDelPhi(iq,r,DelPhi);
00193 }
00194
00195 void CWaveFunction::SquareWell_CalcDelPhi(int iq,double r,complex<double> *DelPhi){
00196 complex<double> psi,q1;
00197 const double ALPHA=1.0/137.036;
00198 double mu,mu_coulomb,E,qsquared,eta;
00199 complex<double> x1, eta1;
00200 complex<double> cx1, ceta1;
00201 double F,G,Fprime,Gprime;
00202 double F0[5],G0[5];
00203 int lexist[5]={0};
00204 int ichannel,iwell,l;
00205 double q=GetQ(iq);
00206
00207 E=sqrt(q*q+m1*m1)+sqrt(q*q+m2*m2);
00208 mu_coulomb=0.25*(E-(m1*m1-m2*m2)*(m1*m1-m2*m2)/(E*E*E));
00209 mu=m1*m2/(m1+m2);
00210 eta=q1q2*mu_coulomb*ALPHA/q;
00211 for(ichannel=0;ichannel<nchannels;ichannel++){
00212 if(lexist[ell[ichannel]]==0){
00213 l=ell[ichannel];
00214 CoulWave::GetFGprime_ComplexQ(l,0.0*ci+q*r/HBARC,0.0*ci+eta,&F0[l],&G0[l],&Fprime,&Gprime);
00215 lexist[l]=1;
00216 }
00217 }
00218
00219 for(ichannel=0;ichannel<nchannels;ichannel++){
00220 if(r>a[ichannel][nwells[ichannel]-1]){
00221 DelPhi[ichannel]=0.5*(A[ichannel][iq][2*nwells[ichannel]-1]-1.0) *(F0[ell[ichannel]]+ci*G0[ell[ichannel]]);
00222 }
00223 else{
00224 iwell=0;
00225 while(r>a[ichannel][iwell]) iwell+=1;
00226 qsquared=q*q-2.0*mu*V0[ichannel][iwell];
00227 if(qsquared > 0.0) q1=sqrt(qsquared);
00228 else q1=ci*sqrt(abs(qsquared));
00229 eta1=q1q2*mu_coulomb*ALPHA/q1;
00230 x1=q1*r/HBARC;
00231 CoulWave::GetFGprime_ComplexQ(ell[ichannel],x1,eta1,&F,&G,&Fprime, &Gprime);
00232 if(iwell==0){
00233 DelPhi[ichannel]=(A[ichannel][iq][0]*F-F0[ell[ichannel]])*cg[iq][ell[ichannel]];
00234 }
00235 else{
00236 DelPhi[ichannel]=(A[ichannel][iq][2*iwell-1]*F+A[ichannel][iq][2*iwell]*G
00237 -F0[ell[ichannel]]);
00238 }
00239 }
00240 DelPhi[ichannel]*=cg[iq][ell[ichannel]];
00241 }
00242
00243
00244 }
00245
00246 void CWaveFunction::SquareWell_MakeArrays(){
00247 int ichannel,iq,ir,l;
00248 double q,E,mu,mu_coulomb,eta;
00249 int *lexist;
00250 const double ALPHA=1.0/137.036;
00251 V0=new double *[nchannels];
00252 a=new double *[nchannels];
00253 A=new complex<double> **[nchannels];
00254 lexist=new int[ellmax+1];
00255 for(l=0;l<=ellmax;l++) lexist[l]=0;
00256
00257 for(ichannel=0;ichannel<nchannels;ichannel++){
00258 if(lexist[ell[ichannel]]==0) lexist[ell[ichannel]]=1;
00259 V0[ichannel]=new double[nwells[ichannel]];
00260 a[ichannel]=new double[nwells[ichannel]];
00261 A[ichannel]=new complex<double> *[nqmax];
00262 for(iq=0;iq<nqmax;iq++){
00263 A[ichannel][iq]=new complex<double>[2*nwells[ichannel]];
00264 }
00265 }
00266
00267 cg=new complex<double> *[nqmax];
00268 for(iq=0;iq<nqmax;iq++){
00269 cg[iq]=new complex<double>[ellmax+1];
00270 q=GetQ(iq);
00271 E=sqrt(q*q+m1*m1)+sqrt(q*q+m2*m2);
00272 mu_coulomb=0.25*(E-(m1*m1-m2*m2)*(m1*m1-m2*m2)/(E*E*E));
00273 mu=m1*m2/(m1+m2);
00274 eta=q1q2*mu_coulomb*ALPHA/q;
00275 for(l=0;l<=ellmax;l++){
00276 if(lexist[l]==1){
00277 cg[iq][l]=CoulWave::cgamma(l+1.0+ci*eta);
00278 cg[iq][l]=conj(cg[iq][l]/abs(cg[iq][l]));
00279 }
00280 }
00281 }
00282 delete [] lexist;
00283
00284 DelPhiArray_NRMAX=400;
00285 DelPhiArray_DELR=0.1;
00286 DelPhiArray=new complex<double> **[nqmax];
00287 for(iq=0;iq<nqmax;iq++){
00288 DelPhiArray[iq]=new complex<double> *[DelPhiArray_NRMAX+1];
00289 for(ir=0;ir<=DelPhiArray_NRMAX;ir++){
00290 DelPhiArray[iq][ir]=new complex<double>[nchannels];
00291 for(ichannel=0;ichannel<nchannels;ichannel++) DelPhiArray[iq][ir][ichannel]=0.0;
00292 }
00293 }
00294 }
00295
00296 void CWaveFunction::SquareWell_DeleteArrays(){
00297 int ichannel,iq,ir;
00298 for(ichannel=0;ichannel<nchannels;ichannel++){
00299 for(iq=0;iq<nqmax;iq++) delete [] A[ichannel][iq];
00300 delete [] A[ichannel];
00301 delete [] a[ichannel];
00302 delete [] V0[ichannel];
00303 }
00304 delete [] A;
00305 delete [] a;
00306 delete [] V0;
00307 delete [] nwells;
00308
00309 for(iq=0;iq<nqmax;iq++){
00310 delete [] cg[iq];
00311 }
00312 delete [] cg;
00313
00314 for(iq=0;iq<nqmax;iq++){
00315 for(ir=0;ir<=DelPhiArray_NRMAX;ir++) delete [] DelPhiArray[iq][ir];
00316 delete [] DelPhiArray[iq];
00317 }
00318 delete [] DelPhiArray;
00319
00320 }
00321 #endif