00001 #ifndef __CWAVEFUNCTION_WF_PN_PHASESHIFT_CC__
00002 #define __CWAVEFUNCTION_WF_PN_PHASESHIFT_CC__
00003 #include "wavefunction.h"
00004
00005 CWaveFunction_pn_phaseshift::CWaveFunction_pn_phaseshift(string parsfilename) : CWaveFunction() {
00006 int iq,ichannel;
00007 double q;
00008 ParsInit(parsfilename);
00009 m1=MPROTON;
00010 m2=MNEUTRON;
00011 IDENTICAL=0;
00012 q1q2=0;
00013 COULOMB=0;
00014 nchannels=6;
00015
00016 ellmax=1;
00017 InitArrays();
00018 printf("Arrays Initialized\n");
00019
00020 ell[0]=ell[1]=0;
00021 ell[2]=ell[3]=ell[4]=ell[5]=1;
00022
00023 InitWaves();
00024 printf("Partial Waves Initialized\n");
00025
00026
00027 channelweight[0]=0.25;
00028 channelweight[1]=0.75;
00029 channelweight[2]=0.25;
00030 channelweight[3]=0.75;
00031 channelweight[4]=0.75;
00032 channelweight[5]=1.25;
00033 read_phaseshifts();
00034 EffectiveRange(0,-16.75,2.7);
00035 EffectiveRange(1,5.36,1.81);
00036 for(iq=0;iq<nqmax;iq++) delta[1][iq]+=PI;
00037
00038 for(ichannel=0;ichannel<nchannels;ichannel++){
00039 for(iq=0;iq<nqmax;iq++){
00040 q=qarray[iq];
00041
00042
00043
00044 Wepsilon[ichannel][iq]=ddeltadq[ichannel][iq]
00045 -GetIW(ell[ichannel],epsilon,q,q1q2,eta[iq],delta[ichannel][iq])
00046 +GetIW(ell[ichannel],epsilon,q,q1q2,eta[iq],0.0);
00047 Wepsilon[ichannel][iq]=3.0*Wepsilon[ichannel][iq]
00048 /(4.0*PI*pow(epsilon,3));
00049 }
00050 }
00051 printf("Initialization finished\n");
00052 }
00053
00054 double CWaveFunction_pn_phaseshift::CalcPsiSquared(int iq,double r,double ctheta){
00055 double psisquared,x,dpsi2,q,theta;
00056 double delta_1s0,delta_3s1,delta_3p0,delta_1p1,delta_3p1,delta_3p2;
00057 complex<double> psi,psia,hstar0,hstar1,psi0;
00058 complex<double> Xlm00,Xlm10,Xlm11;
00059 int ichannel;
00060
00061 q=qarray[iq];
00062 if(iq>=nqmax){
00063 printf("iq too large!\n");
00064 exit(1);
00065 }
00066 psi0=planewave[iq]->planewave(r,ctheta);
00067
00068 if(STRONG==1){
00069 if(r<epsilon){
00070 psisquared=real(psi0*conj(psi0));
00071 for(ichannel=0;ichannel<nchannels;ichannel++){
00072 dpsi2=channelweight[ichannel]*2.0*PI*Wepsilon[ichannel][iq]
00073 *pow(HBARC,3)/(q*q);
00074 psisquared+=dpsi2;
00075 }
00076 }
00077 else{
00078 theta=acos(ctheta);
00079 x=q*r/HBARC;
00080
00081 delta_1s0=delta[0][iq];
00082 delta_3s1=delta[1][iq];
00083 delta_3p0=delta[2][iq];
00084 delta_1p1=delta[3][iq];
00085 delta_3p1=delta[4][iq];
00086 delta_3p2=delta[5][iq];
00087 hstar0=partwave[0][iq]->GetPhiIncoming(r)/x;
00088 hstar1=partwave[1][iq]->GetPhiIncoming(r)/x;
00089
00090 Xlm00=0.5*sqrt(4.0*PI)*SpherHarmonics::Ylm(0,0,theta,0.0)*hstar0;
00091 Xlm10=ci*0.5*sqrt(12.0*PI)*SpherHarmonics::Ylm(1,0,theta,0.0)*hstar1;
00092 Xlm11=ci*0.5*sqrt(12.0*PI)*SpherHarmonics::Ylm(1,1,theta,0.0)*hstar1;
00093
00094
00095 psi=psi0;
00096
00097 psi+=Xlm00*(Misc::ceiphi(-2.0*delta_1s0)-1.0);
00098
00099 psi+=Xlm10*(Misc::ceiphi(-2.0*delta_1p1)-1.0);
00100 psisquared=0.25*real(psi*conj(psi));
00101
00102
00103 psia=0.0;
00104 psi=psi0;
00105
00106 psi+=Xlm00*(Misc::ceiphi(-2.0*delta_3s1)-1.0);
00107
00108 psi+=Xlm10*(0.5*Misc::ceiphi(-2.0*delta_3p1)
00109 +0.5*Misc::ceiphi(-2.0*delta_3p2)-1.0);
00110 psia=Xlm11*0.5*(Misc::ceiphi(-2.0*delta_3p1)-Misc::ceiphi(-2.0*delta_3p2));
00111 psisquared+=0.5*real(psi*conj(psi)+psia*conj(psia));
00112
00113
00114
00115 psia=0.0;
00116 psi=psi0;
00117
00118 psi+=Xlm00*(Misc::ceiphi(-2.0*delta_3s1)-1.0);
00119
00120 psi+=Xlm10*((2.0/3.0)*Misc::ceiphi(-2.0*delta_3p2)
00121 +(1.0/3.0)*Misc::ceiphi(-2.0*delta_3p0)-1.0);
00122 psia=Xlm11*(Misc::ceiphi(-2.0*delta_3p2)-Misc::ceiphi(-2.0*delta_3p0))/3.0;
00123 psisquared+=0.25*real(psi*conj(psi)+2.0*psia*conj(psia));
00124
00125 }
00126 }
00127 else psisquared=real(psi0*conj(psi0));
00128 if(psisquared<0 && r>epsilon){
00129 printf("psisquared<0, = %g, r=%g, q=%g\n",
00130 psisquared,r,q);
00131 }
00132 psisquared*=RelativisticCorrection(r,iq);
00133 return psisquared;
00134
00135 }
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 void CWaveFunction_pn_phaseshift::read_phaseshifts(){
00163 int iq,iread,iqsmooth,ichannel;
00164 const int NREAD=35;
00165 double qsmooth,q,tlab,elab,plab,roots;
00166 double deltaread[6][NREAD],qread[NREAD];
00167 double delta_1s0,delta_3s1,delta_3p0,delta_1p1,delta_3p1,delta_3p2;
00168 double eps1,delta_1d2,delta_3d1,delta_3d2,delta_3d3;
00169 double delta_presmooth,ddeltadq_presmooth;
00170 char dummy[200];
00171 FILE *fptr;
00172
00173 iqsmooth=1;
00174 qsmooth=25.0;
00175 printf("BEWARE, MAKE SURE YOU HAVE MOVED COPY OF NN_phaseshifts.dat to run directory\n");
00176 fptr=fopen("NN_phaseshifts.dat\0","r");
00177 fgets(dummy,200,fptr);
00178 for(iread=0;iread<NREAD;iread++){
00179 fscanf(fptr,"%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",
00180 &tlab,&delta_1s0,&delta_3s1,&delta_3d1,&eps1,&delta_3p0,
00181 &delta_1p1,&delta_3p1,&delta_3p2,&delta_1d2,&delta_3d2,&delta_3d3);
00182 deltaread[0][iread]=delta_1s0;
00183 deltaread[1][iread]=delta_3s1;
00184 deltaread[2][iread]=delta_3p0;
00185 deltaread[3][iread]=delta_1p1;
00186 deltaread[4][iread]=delta_3p1;
00187 deltaread[5][iread]=delta_3p2;
00188 if(iread>0){
00189 elab=MPROTON+tlab;
00190 plab=sqrt(elab*elab-MPROTON*MPROTON);
00191 roots=sqrt((elab+MNEUTRON)*(elab+MNEUTRON)-plab*plab);
00192 qread[iread]=sqrt(Misc::triangle(roots,MPROTON,MNEUTRON));
00193 }
00194 else qread[iread]=0.0;
00195 for(ichannel=0;ichannel<6;ichannel++)
00196 deltaread[ichannel][iread]=deltaread[ichannel][iread]*PI/180.0;
00197 }
00198 fclose(fptr);
00199
00200 for(iq=0;iq<nqmax;iq++){
00201 q=qarray[iq];
00202 if(q<=qread[NREAD-1]){
00203 iread=0;
00204 while(q>qread[iread]){
00205 iread+=1;
00206 }
00207 for(ichannel=0;ichannel<6;ichannel++){
00208 delta[ichannel][iq]=(qread[iread]-q)*deltaread[ichannel][iread-1]
00209 +(q-qread[iread-1])*deltaread[ichannel][iread];
00210 delta[ichannel][iq]=delta[ichannel][iq]/(qread[iread]-qread[iread-1]);
00211 ddeltadq[ichannel][iq]=(deltaread[ichannel][iread]
00212 -deltaread[ichannel][iread-1])
00213 /(qread[iread]-qread[iread-1]);
00214 }
00215
00216 }
00217 else{
00218 delta[0][iq]=0.0;
00219 ddeltadq[0][iq]=0.0;
00220 printf("Warning: qarray goes beyond max. for phaseshift data =%g\n",
00221 qread[NREAD-1]);
00222
00223 }
00224
00225
00226 iqsmooth=6;
00227 qsmooth=qread[iqsmooth];
00228 if(iread<iqsmooth){
00229 for(ichannel=2;ichannel<6;ichannel++){
00230 delta_presmooth=delta[ichannel][iq];
00231 ddeltadq_presmooth=ddeltadq[ichannel][iq];
00232 delta[ichannel][iq]=deltaread[ichannel][iqsmooth]
00233 *(q*q*q/(qsmooth*qsmooth*qsmooth));
00234 ddeltadq[ichannel][iq]=3.0*delta[ichannel][iq]/q;
00235
00236
00237
00238 }
00239 }
00240 }
00241
00242
00243
00244
00245
00246
00247 }
00248
00249 #endif