00001 #ifndef __INCLUDE_PP_SCHROD_CC__
00002 #define __INCLUDE_PP_SCHROD_CC__
00003 #include "wavefunction.h"
00004 using namespace std;
00005
00006 CWaveFunction_pp_schrod::CWaveFunction_pp_schrod(string parsfilename) : CWaveFunction(){
00007 int ichannel,iq;
00008 ParsInit(parsfilename);
00009 m1=MPROTON;
00010 m2=m1;
00011 IDENTICAL=1;
00012 q1q2=1;
00013
00014 nchannels=4;
00015 ellmax=1;
00016 InitArrays();
00017 printf("Arrays Initialized\n");
00018 ell[0]=0;
00019 ell[1]=ell[2]=ell[3]=1;
00020
00021 InitWaves();
00022 printf("Partial Waves Initialized\n");
00023
00024 rmax_schrod=6.0;
00025 nrmax_schrod=600;
00026 delpsi=new complex<double> **[nchannels];
00027 for(ichannel=0;ichannel<nchannels;ichannel++){
00028 delpsi[ichannel]=new complex<double> *[nqmax];
00029 for(iq=0;iq<nqmax;iq++){
00030 delpsi[ichannel][iq]=new complex<double>[nrmax_schrod+1];
00031 schrodinger(ichannel,iq);
00032 }
00033 }
00034 }
00035
00036
00037 CWaveFunction_pp_schrod::~CWaveFunction_pp_schrod(){
00038 int ichannel,iq;
00039 for(ichannel=0;ichannel<nchannels;ichannel++){
00040 for(iq=0;iq<nqmax;iq++){
00041 delete [] delpsi[ichannel][iq];
00042 }
00043 delete [] delpsi[ichannel];
00044 }
00045 delete [] delpsi;
00046 }
00047
00048 double CWaveFunction_pp_schrod::CalcPsiSquared(int iq,double r,double ctheta){
00049 int ir1,ir2;
00050 double w1,w2,psisquared,theta,x,delr,q;
00051 const double ROOT2=sqrt(2.0);
00052 complex<double> delpsiS0=0.0,delpsiS1J0=0.0,delpsiS1J1=0.0,delpsiS1J2=0.0;
00053 complex<double> psia,psib,psisymm,psianti,Xlm00,Xlm10,Xlm11;
00054 complex<double> psi_samespin,psi_diffspin;
00055 q=(0.5+iq)*delq;
00056 delr=rmax_schrod/double(nrmax_schrod);
00057 if(r<rmax_schrod){
00058 ir1=lrint(floor(r/delr));
00059 ir2=ir1+1;
00060 w2=(r-ir1*delr)/delr;
00061 w1=1.0-w2;
00062 delpsiS0=w1*delpsi[0][iq][ir1]+w2*delpsi[0][iq][ir2];
00063 delpsiS1J0=w1*delpsi[1][iq][ir1]+w2*delpsi[1][iq][ir2];
00064 delpsiS1J1=w1*delpsi[2][iq][ir1]+w2*delpsi[2][iq][ir2];
00065 delpsiS1J2=w1*delpsi[3][iq][ir1]+w2*delpsi[3][iq][ir2];
00066 }
00067 else{
00068 delpsiS0=(exp(-2.0*ci*delta[0][iq])-1.0)*partwave[0][iq]->GetPhiIncoming(r);
00069 delpsiS1J0=(exp(-2.0*ci*delta[1][iq])-1.0)*partwave[1][iq]->GetPhiIncoming(r);
00070 delpsiS1J1=(exp(-2.0*ci*delta[2][iq])-1.0)*partwave[1][iq]->GetPhiIncoming(r);
00071 delpsiS1J2=(exp(-2.0*ci*delta[3][iq])-1.0)*partwave[1][iq]->GetPhiIncoming(r);
00072 }
00073 theta=acos(ctheta);
00074 x=q*r/HBARC;
00075
00076
00077 Xlm00=0.5*ROOT2*sqrt(4.0*PI)*SpherHarmonics::Ylm(0,0,theta,0.0)/x;
00078 Xlm10=0.5*ROOT2*ci*sqrt(12.0*PI)*SpherHarmonics::Ylm(1,0,theta,0.0)/x;
00079 Xlm11=0.5*ROOT2*ci*sqrt(12.0*PI)*SpherHarmonics::Ylm(1,1,theta,0.0)/x;
00080 psia=planewave[iq]->planewave(r,ctheta);
00081 psib=planewave[iq]->planewave(r,-ctheta);
00082 psisymm=(1.0/ROOT2)*(psia+psib);
00083 psianti=(1.0/ROOT2)*(psia-psib);
00084
00085 psisquared=0.0;
00086
00087 psi_samespin=psisymm;
00088 psi_samespin+=delpsiS0*Xlm00;
00089 psisquared+=0.25*real(psi_samespin*conj(psi_samespin));
00090
00091 psi_samespin=psianti;
00092 psi_samespin+=(0.5*delpsiS1J2+0.5*delpsiS1J1)*Xlm10;
00093 psi_diffspin=(0.5*delpsiS1J2-0.5*delpsiS1J1)*Xlm11;
00094 psisquared+=0.5*real(psi_samespin*conj(psi_samespin)
00095 +psi_diffspin*conj(psi_diffspin));
00096
00097 psi_samespin=psianti;
00098 psi_samespin+=((2.0/3.0)*delpsiS1J2+(1.0/3.0)*delpsiS1J0)*Xlm10;
00099 psi_diffspin=((1.0/3.0)*delpsiS1J2-(1.0/3.0)*delpsiS1J0)*Xlm11;
00100 psisquared+=0.25*real(psi_samespin*conj(psi_samespin))
00101 +0.5*real(psi_diffspin*conj(psi_diffspin));
00102
00103 psisquared*=RelativisticCorrection(r,iq);
00104 return psisquared;
00105 }
00106
00107 void CWaveFunction_pp_schrod::schrodinger(int ichannel,int iq){
00108 char type[10];
00109 char pname[10];
00110
00111 double q=(iq+0.5)*delq,q2,r;
00112 double delr=0.001;
00113 double x1,mu,E,delx2,r0,r1,r2,vr,v12,v22,v11,phase,phase0,sigma;
00114 double phaseb,phaseb0;
00115 complex<double> cg;
00116 int nr=lrint(rmax_schrod/delr);
00117 int ir,J,S,L=ell[ichannel];
00118 complex<double> *psiout,*psiout0;
00119 sprintf(type,"PP");
00120 if(ichannel==0){
00121 J=0; S=0; L=0;
00122 sprintf(pname,"1S0");
00123 }
00124 else{
00125 S=1; L=1;
00126 if(ichannel==1){
00127 J=0;
00128 sprintf(pname,"3P0");
00129 }
00130 else if(ichannel==2){
00131 J=1;
00132 sprintf(pname,"3P1");
00133 }
00134 else{
00135 J=2;
00136 sprintf(pname,"3C2");
00137 }
00138 }
00139 E=2.0*sqrt(q*q+m1*m1);
00140 mu=0.25*E;
00141 q2=q*q;
00142 delx2=q2*delr*delr/(HBARC*HBARC);
00143 cg=CoulWave::cgamma(L+1.0+ci*eta[iq]);
00144 sigma=atan2(imag(cg),real(cg));
00145 psiout=new complex<double> [nr+1];
00146 psiout0=new complex<double> [nr+1];
00147 complex<double>psi2,psi1,psi0;
00148
00149 r2=nr*delr;
00150 r1=(nr-1)*delr;
00151 r0=(nr-2)*delr;
00152 psiout[nr]=CoulWave::CWoutgoing(L,r2*q/HBARC,eta[iq])*exp(-ci*sigma);
00153 psiout[nr-1]=CoulWave::CWoutgoing(L,r1*q/HBARC,eta[iq])*exp(-ci*sigma);
00154 psiout0[nr]=psiout[nr];
00155 psiout0[nr-1]=psiout[nr-1];
00156
00157 for(ir=nr-2;ir>=1;ir--){
00158 r1=(ir+1)*delr;
00159 WaveFunctionRoutines::creid93(&r1,pname,type,&v11,&v12,&v22);
00160
00161 vr=2.0*mu*v11/q2;
00162 x1=r1*q/HBARC;
00163 psiout0[ir]=2.0*psiout0[ir+1]-psiout0[ir+2]
00164 +delx2*(-1.0+(2.0*eta[iq]/x1)+double(L)*double(L+1)/(x1*x1))
00165 *psiout0[ir+1];
00166 psiout[ir]=2.0*psiout[ir+1]-psiout[ir+2]
00167 +delx2*(-1.0+vr+(2.0*eta[iq]/x1)+double(L)*double(L+1)/(x1*x1))
00168 *psiout[ir+1];
00169
00170
00171
00172
00173
00174 }
00175 phase=atan2(imag(psiout[1]),real(psiout[1]))+0.5*PI;
00176 phase0=atan2(imag(psiout0[1]),real(psiout0[1]))+0.5*PI;
00177 phaseb=atan2(imag(psiout[2]),real(psiout[2]))+0.5*PI;
00178 phaseb0=atan2(imag(psiout0[2]),real(psiout0[2]))+0.5*PI;
00179 phase=2.0*phase-phaseb;
00180 phase0=2.0*phase0-phaseb0;
00181 delta[ichannel][iq]=-phase+phase0;
00182
00183
00184
00185 int ir1,ir2,ir_schrod;
00186 double w1,w2;
00187 delpsi[ichannel][iq][0]=0.0;
00188 for(ir_schrod=1;ir_schrod<=nrmax_schrod;ir_schrod++){
00189 r=rmax_schrod*ir_schrod/double(nrmax_schrod);
00190 ir1=lrint(floor(r/delr));
00191 ir2=ir1+1;
00192 if(ir2<=nr){
00193 w1=(ir2*delr-r)/delr;
00194 w2=1.0-w1;
00195 delpsi[ichannel][iq][ir_schrod]
00196 =w2*((psiout[ir2]-psiout0[ir2])
00197 +conj(exp(-2.0*ci*phase)*psiout[ir2]
00198 -exp(-2.0*ci*phase0)*psiout0[ir2]));
00199 delpsi[ichannel][iq][ir_schrod]
00200 +=w1*((psiout[ir1]-psiout0[ir1])
00201 +conj(exp(-2.0*ci*phase)*psiout[ir1]
00202 -exp(-2.0*ci*phase0)*psiout0[ir1]));
00203 }
00204 else if(ir1==nr)
00205 delpsi[ichannel][iq][ir_schrod]
00206 =((psiout[ir1]-psiout0[ir1])
00207 +conj(exp(-2.0*ci*phase)*psiout[ir1]
00208 -exp(-2.0*ci*phase0)*psiout0[ir1]));
00209 else{
00210 printf("OOPS, out of bounds, shouldn't be here, ir1=%d, nr=%d\n",ir1,nr);
00211 exit(1);
00212 }
00213
00214
00215
00216
00217
00218
00219
00220 }
00221
00222 delete [] psiout;
00223 delete [] psiout0;
00224
00225 }
00226
00227 double CWaveFunction_pp_schrod::Vreid(double r,int ipart){
00228 double pmux,f1,f2,f4,f6,f7,vr=0.0;
00229
00230
00231 if(ipart==0){
00232
00233 pmux=r*0.7;
00234 f1=exp(-pmux);
00235 f4=(f1*f1*f1*f1);
00236 f7=f4*(f1*f1*f1);
00237 vr=-10.463*f1/pmux-1650.6*f4/pmux+6484.2*f7/pmux;
00238 }
00239 if(ipart>0){
00240
00241 pmux=r*0.7;
00242 f1=exp(-pmux);
00243 f2=f1*f1;
00244 f4=f2*f2;
00245 f6=f4*f2;
00246 vr=((-10.463/3.0)*f1-933.48*f4+4152.1*f6)/pmux;
00247 }
00248 return vr;
00249 }
00250
00251 #endif