00001 #ifndef __INCLUDE_S2C_CC
00002 #define __INCLUDE_S2C_CC
00003
00004 #include "source2CF.h"
00005
00006 using namespace std;
00007
00008 void S2CF::s2c(int lx,int ly,int lz,CCHArray *S,CKernel *kernel,CCHArray *CF){
00009 int lmax=kernel->GetLMAX();
00010 if(lmax>CF->GetLMAX() || lmax>S->GetLMAX()){
00011 printf("FATAL: Kernel LMAX=%d larger than either S LMAX=%d or CF LMAX=%d\n",
00012 lmax,S->GetLMAX(),CF->GetLMAX());
00013 exit(1);
00014 }
00015 if( (CF->GetLMAX()!=lmax) ){
00016 printf("WARNING: Array parameters for kernel calculations don't match\n");
00017 printf("___ CORRELATION FUNCTION PARAMETERS ___\n");
00018 CF->PrintPars();
00019 printf("_____ SOURCE FUNCTION PARAMETERS _____\n");
00020 S->PrintPars();
00021 printf("For kernel, LMAX=%d\n",kernel->GetLMAX());
00022 }
00023 if(kernel->GetIDENTICAL() && (!CF->GetXSYM() || !CF->GetYSYM() || !CF->GetZSYM())){
00024 printf("FATAL: kernel has no odd L components, but CF wants them\n");
00025 printf("Make sure CF array has XSYM=YSYM=ZSYM='true'\n");
00026 exit(1);
00027 }
00028 int iq,ir,nqmax,nrmax,L;
00029 double r,delr,q,delq,norm;
00030 const double PI=4.0*atan(1.0);
00031 bool match=0;
00032 delr=S->GetRADSTEP();
00033 nrmax=S->GetNRADIAL();
00034 delq=CF->GetRADSTEP();
00035 nqmax=CF->GetNRADIAL();
00036 if(fabs(delr-kernel->GetDELR())<1.0E-5
00037 && fabs(delq-kernel->GetDELQ())<1.0E-5
00038 && nrmax==kernel->GetNRMAX()
00039 && nqmax==kernel->GetNQMAX()) match=1;
00040 CF->ZeroArray(lx,ly,lz);
00041 L=lx+ly+lz;
00042 for(iq=0;iq<nqmax;iq++){
00043 q=(0.5+iq)*delq;
00044 for(ir=0;ir<nrmax;ir++){
00045 r=(0.5+ir)*delr;
00046 norm=4.0*PI*r*r*delr;
00047 if(match) CF->IncrementElement(lx,ly,lz,iq,kernel->GetValue(L,iq,ir)*norm*S->GetElement(lx,ly,lz,ir));
00048 else CF->IncrementElement(lx,ly,lz,iq,kernel->GetValue(L,q,r)*norm*S->GetElement(lx,ly,lz,r));
00049 }
00050 }
00051 }
00052
00053 void S2CF::s2c(CCHArray *S,CKernel *kernel,CCHArray *CF){
00054 int lmax=kernel->GetLMAX();
00055 if(lmax>CF->GetLMAX() || lmax>S->GetLMAX()){
00056 printf("FATAL: Kernel LMAX=%d larger than either S LMAX=%d or CF LMAX=%d\n",
00057 lmax,S->GetLMAX(),CF->GetLMAX());
00058 exit(1);
00059 }
00060 if( (CF->GetLMAX()!=lmax) ){
00061 printf("WARNING: Array parameters for kernel calculations don't match\n");
00062 printf("___ CORRELATION FUNCTION PARAMETERS ___\n");
00063 CF->PrintPars();
00064 printf("_____ SOURCE FUNCTION PARAMETERS _____\n");
00065 S->PrintPars();
00066 printf("For kernel, LMAX=%d\n",kernel->GetLMAX());
00067 }
00068 if(kernel->GetIDENTICAL() && (!CF->GetXSYM() || !CF->GetYSYM() || !CF->GetZSYM())){
00069 printf("FATAL: kernel has no odd L components, but CF wants them\n");
00070 printf("Make sure CF array has XSYM=YSYM=ZSYM='true'\n");
00071 exit(1);
00072 }
00073 int iq,ir,nqmax,nrmax,L,lx,ly,lz,dlx,dly,dlz;
00074 double r,delr,q,delq,norm;
00075 const double PI=4.0*atan(1.0);
00076 bool match=0;
00077 delr=S->GetRADSTEP();
00078 nrmax=S->GetNRADIAL();
00079 delq=CF->GetRADSTEP();
00080 nqmax=CF->GetNRADIAL();
00081 dlx=dly=dlz=1;
00082 if(CF->GetXSYM()) dlx=2;
00083 if(CF->GetYSYM()) dly=2;
00084 if(CF->GetZSYM()) dlz=2;
00085 if(fabs(delr-kernel->GetDELR())<1.0E-5
00086 && fabs(delq-kernel->GetDELQ())<1.0E-5
00087 && nrmax==kernel->GetNRMAX()
00088 && nqmax==kernel->GetNQMAX()) match=1;
00089 CF->ZeroArray();
00090 for(iq=0;iq<nqmax;iq++){
00091 q=(0.5+iq)*delq;
00092 for(lx=0;lx<2;lx+=dlx){
00093 for(ly=0;ly<=lmax-lx;ly+=dly){
00094 for(lz=0;lz<=lmax-lx-ly;lz+=dlz){
00095 L=lx+ly+lz;
00096 for(ir=0;ir<nrmax;ir++){
00097 r=(0.5+ir)*delr;
00098 norm=4.0*PI*r*r*delr;
00099 if(match) CF->IncrementElement(lx,ly,lz,iq,kernel->GetValue(L,iq,ir)
00100 *norm*S->GetElement(lx,ly,lz,ir));
00101 else CF->IncrementElement(lx,ly,lz,iq,kernel->GetValue(L,q,r)
00102 *norm*S->GetElement(lx,ly,lz,r));
00103 }
00104 }
00105 }
00106 }
00107 }
00108 }
00109
00110 void S2CF::s2c(C3DArray *S,CKernelWF *kernel,C3DArray *CF){
00111 int ix,iy,iz,isx,isy,isz,jx,jy,jz,jsx,jsy,jsz;
00112 int nsx,nsy,nsz;
00113 long long int icalc,ncalc;
00114 int nxmax=S->GetNXMAX();
00115 int nymax=S->GetNYMAX();
00116 int nzmax=S->GetNZMAX();
00117 double delx=S->GetDELX();
00118 double dely=S->GetDELY();
00119 double delz=S->GetDELZ();
00120 int nqxmax=CF->GetNXMAX();
00121 int nqymax=CF->GetNYMAX();
00122 int nqzmax=CF->GetNZMAX();
00123 double delqx=CF->GetDELX();
00124 double delqy=CF->GetDELY();
00125 double delqz=CF->GetDELZ();
00126 double x,y,z,qx,qy,qz,norm,q,r,ctheta,wf2,svalue;
00127 bool IDENTICAL=kernel->GetIDENTICAL();
00128 bool XSYM=S->GetXSYM();
00129 bool YSYM=S->GetYSYM();
00130 bool ZSYM=S->GetZSYM();
00131 if(IDENTICAL&&!(XSYM&&YSYM&&ZSYM)){
00132 printf("S2CF::s2c, kernel says particles are identical, but symmetries are not all even\n");
00133 printf("XSYM=%d, YSYM=%d, ZSYM=%d\n",int(XSYM),int(YSYM),int(ZSYM));
00134 exit(1);
00135 }
00136
00137 norm=delx*dely*delz;
00138 nsx=nsy=nsz=2;
00139 if(XSYM){
00140 nsx=1;
00141 norm*=2.0;
00142 }
00143 if(YSYM){
00144 nsy=1;
00145 norm*=2.0;
00146 }
00147 if(ZSYM){
00148 nsz=1;
00149 norm*=2.0;
00150 }
00151 CF->ZeroArray();
00152 ncalc=nxmax*nymax*nzmax*nsx*nsy*nsz;
00153 ncalc=ncalc/10;
00154 icalc=0;
00155
00156 for(isx=0;isx<nsx;isx++){
00157 for(ix=0;ix<nxmax;ix++){
00158 x=(0.5+ix)*delx;
00159 if(isx==1) x=-x;
00160
00161 for(isy=0;isy<nsy;isy++){
00162 for(iy=0;iy<nymax;iy++){
00163 y=(0.5+iy)*dely;
00164 if(isy==1) y=-y;
00165
00166 for(isz=0;isz<nsz;isz++){
00167 for(iz=0;iz<nzmax;iz++){
00168 z=(0.5+iz)*delz;
00169 if(isz==1) z=-z;
00170
00171 r=sqrt(x*x+y*y+z*z);
00172 svalue=S->GetElement(isx,ix,isy,iy,isz,iz);
00173
00174
00175
00176 for(jsx=0;jsx<nsx;jsx++){
00177 for(jx=0;jx<nqxmax;jx++){
00178 qx=(0.5+jx)*delqx;
00179 if(jsx==1) qx=-qx;
00180
00181 for(jsy=0;jsy<nsy;jsy++){
00182 for(jy=0;jy<nqymax;jy++){
00183 qy=(0.5+jy)*delqy;
00184 if(jsy==1) qy=-qy;
00185
00186 for(jsz=0;jsz<nsz;jsz++){
00187 for(jz=0;jz<nqzmax;jz++){
00188 qz=(0.5+jz)*delqz;
00189 if(jsz==1) qz=-qz;
00190 q=sqrt(qx*qx+qy*qy+qz*qz);
00191 wf2=0.0;
00192
00193 if(XSYM&YSYM&&ZSYM){
00194 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00195 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00196 if(!IDENTICAL) wf2+=0.25*kernel->GetPsiSquared(q,r,-ctheta);
00197 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00198 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00199 if(!IDENTICAL) wf2+=0.25*kernel->GetPsiSquared(q,r,-ctheta);
00200 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00201 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00202 if(!IDENTICAL) wf2+=0.25*kernel->GetPsiSquared(q,r,-ctheta);
00203 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00204 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00205 if(!IDENTICAL) wf2+=0.25*kernel->GetPsiSquared(q,r,-ctheta);
00206 if(!IDENTICAL) wf2=0.5*wf2;
00207 }
00208 else if(!XSYM && YSYM && ZSYM){
00209 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00210 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00211 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00212 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00213 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00214 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00215 ctheta=(qx*x-qy*y-qz*z)/(q*r);
00216 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00217 }
00218 else if(XSYM && !YSYM && ZSYM){
00219 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00220 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00221 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00222 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00223 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00224 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00225 ctheta=(-qx*x+qy*y-qz*z)/(q*r);
00226 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00227 }
00228 else if(XSYM && YSYM && !ZSYM){
00229 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00230 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00231 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00232 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00233 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00234 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00235 ctheta=(-qx*x-qy*y+qz*z)/(q*r);
00236 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00237 }
00238 else if(XSYM && !YSYM && !ZSYM){
00239 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00240 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00241 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00242 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00243 }
00244 else if(!XSYM && YSYM && !ZSYM){
00245 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00246 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00247 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00248 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00249 }
00250 else if(!XSYM && !YSYM && ZSYM){
00251 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00252 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00253 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00254 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00255 }
00256 else{
00257 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00258 wf2+=kernel->GetPsiSquared(q,r,ctheta);
00259 }
00260 CF->IncrementElement(jsx,jx,jsy,jy,jsz,jz,
00261 norm*(wf2-1.0)*svalue);
00262 }
00263 }
00264 }
00265 }
00266 }
00267 }
00268 icalc+=1;
00269 if(icalc%ncalc==0) printf("s2c, finished %g percent\n",10*double(icalc)/double(ncalc));
00270 }
00271 }
00272 }
00273 }
00274 }
00275 }
00276 }
00277
00278 void S2CF::s2c(C3DArray *S,CWaveFunction *wf,C3DArray *CF){
00279 int ix,iy,iz,isx,isy,isz,jx,jy,jz,jsx,jsy,jsz;
00280 int nsx,nsy,nsz;
00281 int nxmax=S->GetNXMAX();
00282 int nymax=S->GetNYMAX();
00283 int nzmax=S->GetNZMAX();
00284 double delx=S->GetDELX();
00285 double dely=S->GetDELY();
00286 double delz=S->GetDELZ();
00287 int nqxmax=CF->GetNXMAX();
00288 int nqymax=CF->GetNYMAX();
00289 int nqzmax=CF->GetNZMAX();
00290 double delqx=CF->GetDELX();
00291 double delqy=CF->GetDELY();
00292 double delqz=CF->GetDELZ();
00293 double x,y,z,qx,qy,qz,norm,q,r,ctheta,wf2,svalue;
00294 bool IDENTICAL=wf->GetIDENTICAL();
00295 bool XSYM=S->GetXSYM();
00296 bool YSYM=S->GetYSYM();
00297 bool ZSYM=S->GetZSYM();
00298 if(IDENTICAL&&!(XSYM&&YSYM&&ZSYM)){
00299 printf("S2CF::s2c, wf says particles are identical, but symmetries are not all even\n");
00300 printf("XSYM=%d, YSYM=%d, ZSYM=%d\n",int(XSYM),int(YSYM),int(ZSYM));
00301 exit(1);
00302 }
00303
00304 norm=delx*dely*delz;
00305 nsx=nsy=nsz=2;
00306 if(XSYM){
00307 nsx=1;
00308 norm*=2.0;
00309 }
00310 if(YSYM){
00311 nsy=1;
00312 norm*=2.0;
00313 }
00314 if(ZSYM){
00315 nsz=1;
00316 norm*=2.0;
00317 }
00318 CF->ZeroArray();
00319
00320 for(isx=0;isx<nsx;isx++){
00321 for(ix=0;ix<nxmax;ix++){
00322 x=(0.5+ix)*delx;
00323 if(isx==1) x=-x;
00324
00325 for(isy=0;isy<nsy;isy++){
00326 for(iy=0;iy<nymax;iy++){
00327 y=(0.5+iy)*dely;
00328 if(isy==1) y=-y;
00329
00330 for(isz=0;isz<nsz;isz++){
00331 for(iz=0;iz<nzmax;iz++){
00332 z=(0.5+iz)*delz;
00333 if(isz==1) z=-z;
00334
00335 r=sqrt(x*x+y*y+z*z);
00336
00337 svalue=exp(-0.25*((x*x/9.0)+(y*y/25.0)+(z*z/49.0)));
00338 svalue=svalue/(3.0*5.0*7.0*pow(4.0*PI,1.5));
00339
00340 for(jsx=0;jsx<nsx;jsx++){
00341 for(jx=0;jx<nqxmax;jx++){
00342 qx=(0.5+jx)*delqx;
00343 if(jsx==1) qx=-qx;
00344
00345 for(jsy=0;jsy<nsy;jsy++){
00346 for(jy=0;jy<nqymax;jy++){
00347 qy=(0.5+jy)*delqy;
00348 if(jsy==1) qy=-qy;
00349
00350 for(jsz=0;jsz<nsz;jsz++){
00351 for(jz=0;jz<nqzmax;jz++){
00352 qz=(0.5+jz)*delqz;
00353 if(jsz==1) qz=-qz;
00354 q=sqrt(qx*qx+qy*qy+qz*qz);
00355 wf2=0.0;
00356
00357 if(XSYM&YSYM&&ZSYM){
00358 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00359 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00360 if(!IDENTICAL) wf2+=0.25*wf->GetPsiSquared(q,r,-ctheta);
00361 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00362 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00363 if(!IDENTICAL) wf2+=0.25*wf->GetPsiSquared(q,r,-ctheta);
00364 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00365 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00366 if(!IDENTICAL) wf2+=0.25*wf->GetPsiSquared(q,r,-ctheta);
00367 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00368 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00369 if(!IDENTICAL) wf2+=0.25*wf->GetPsiSquared(q,r,-ctheta);
00370 if(!IDENTICAL) wf2=0.5*wf2;
00371 }
00372 else if(!XSYM && YSYM && ZSYM){
00373 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00374 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00375 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00376 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00377 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00378 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00379 ctheta=(qx*x-qy*y-qz*z)/(q*r);
00380 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00381 }
00382 else if(XSYM && !YSYM && ZSYM){
00383 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00384 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00385 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00386 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00387 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00388 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00389 ctheta=(-qx*x+qy*y-qz*z)/(q*r);
00390 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00391 }
00392 else if(XSYM && YSYM && !ZSYM){
00393 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00394 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00395 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00396 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00397 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00398 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00399 ctheta=(-qx*x-qy*y+qz*z)/(q*r);
00400 wf2+=0.25*wf->GetPsiSquared(q,r,ctheta);
00401 }
00402 else if(XSYM && !YSYM && !ZSYM){
00403 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00404 wf2+=0.5*wf->GetPsiSquared(q,r,ctheta);
00405 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00406 wf2+=0.5*wf->GetPsiSquared(q,r,ctheta);
00407 }
00408 else if(!XSYM && YSYM && !ZSYM){
00409 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00410 wf2+=0.5*wf->GetPsiSquared(q,r,ctheta);
00411 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00412 wf2+=0.5*wf->GetPsiSquared(q,r,ctheta);
00413 }
00414 else if(!XSYM && !YSYM && ZSYM){
00415 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00416 wf2+=0.5*wf->GetPsiSquared(q,r,ctheta);
00417 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00418 wf2+=0.5*wf->GetPsiSquared(q,r,ctheta);
00419 }
00420 else{
00421 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00422 wf2+=wf->GetPsiSquared(q,r,ctheta);
00423 }
00424 CF->IncrementElement(jsx,jx,jsy,jy,jsz,jz,
00425 norm*(wf2-1.0)*svalue);
00426 }
00427 }
00428 }
00429 }
00430 }
00431 }
00432 }
00433 }
00434 }
00435 }
00436 }
00437 }
00438 }
00439
00440 void S2CF::s2c(CMCList *lista,CMCList *listb,CKernelWF *kernel,C3DArray *cf){
00441 bool samelists;
00442 int ia,ib,na,nb,jx,jy,jz,jsx,jsy,jsz;
00443 int nsx,nsy,nsz;
00444 int nqxmax=cf->GetNXMAX();
00445 int nqymax=cf->GetNYMAX();
00446 int nqzmax=cf->GetNZMAX();
00447 int npairs,ipair,jpair;
00448 double delqx=cf->GetDELX();
00449 double delqy=cf->GetDELY();
00450 double delqz=cf->GetDELZ();
00451 double x,y,z,qx,qy,qz,norm,q,r,ctheta,wf2,*ra,*rb;
00452 double rmax=kernel->GetNRMAX()*kernel->GetDELR();
00453 if(lista==listb){
00454 npairs=lista->GetNMC()*(lista->GetNMC()-1)/2;
00455 samelists=true;
00456 }
00457 else{
00458 npairs=lista->GetNMC()*listb->GetNMC();
00459 samelists=false;
00460 }
00461 norm=lista->GetNorm()*listb->GetNorm()/double(npairs);
00462 if(samelists && !kernel->GetIDENTICAL()) norm=0.5*norm;
00463
00464 nsx=nsy=nsz=2;
00465 if(cf->GetXSYM()){
00466 nsx=1;
00467 }
00468 if(cf->GetYSYM()){
00469 nsy=1;
00470 }
00471 if(cf->GetZSYM()){
00472 nsz=1;
00473 }
00474 cf->ZeroArray();
00475
00476 na=lista->GetNMC();
00477 nb=lista->GetNMC();
00478 ipair=jpair=0;
00479
00480 for(ia=0;ia<na;ia++){
00481 ra=lista->GetR(ia);
00482 if(samelists) nb=ia-1;
00483 for(ib=0;ib<nb;ib++){
00484 rb=listb->GetR(ib);
00485 x=ra[1]-rb[1];
00486 y=ra[2]-rb[2];
00487 z=ra[3]-rb[3];
00488 r=sqrt(x*x+y*y+z*z);
00489 if(r<rmax){
00490 for(jsx=0;jsx<nsx;jsx++){
00491 for(jx=0;jx<nqxmax;jx++){
00492 qx=(0.5+jx)*delqx;
00493 if(jsx==1) qx=-qx;
00494 for(jsy=0;jsy<nsy;jsy++){
00495 for(jy=0;jy<nqymax;jy++){
00496 qy=(0.5+jy)*delqy;
00497 if(jsy==1) qy=-qy;
00498 for(jsz=0;jsz<nsz;jsz++){
00499 for(jz=0;jz<nqzmax;jz++){
00500 qz=(0.5+jz)*delqz;
00501 if(jsz==1) qz=-qz;
00502 q=sqrt(qx*qx+qy*qy+qz*qz);
00503 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00504 wf2=kernel->GetPsiSquared(q,r,ctheta);
00505 cf->IncrementElement(jsx,jx,jsy,jy,jsz,jz,norm*(wf2-1.0));
00506 if(samelists && !kernel->GetIDENTICAL()){
00507 wf2=kernel->GetPsiSquared(q,r,-ctheta);
00508 cf->IncrementElement(jsx,jx,jsy,jy,jsz,jz,norm*(wf2-1.0));
00509 }
00510
00511 }
00512 }
00513 }
00514 }
00515 }
00516 }
00517 ipair+=1;
00518 if(ipair>=npairs/10){
00519 jpair+=1;
00520 printf("Finished %d percent\n",jpair*10);
00521 ipair=0;
00522 }
00523 }
00524 }
00525 }
00526
00527 }
00528
00529 void S2CF::s2c(CMCList *lista,CMCList *listb,CKernel *kernel,C3DArray *cf){
00530 bool samelists;
00531 int ia,ib,na,nb,npairs,jx,jy,jz,jsx,jsy,jsz,ipair,jpair;
00532 int nsx,nsy,nsz;
00533 int nqxmax=cf->GetNXMAX();
00534 int nqymax=cf->GetNYMAX();
00535 int nqzmax=cf->GetNZMAX();
00536 double delqx=cf->GetDELX();
00537 double delqy=cf->GetDELY();
00538 double delqz=cf->GetDELZ();
00539 double x,y,z,qx,qy,qz,norm,q,r,ctheta,wf2,*ra,*rb;
00540 double rmax=kernel->GetDELR()*kernel->GetNRMAX();
00541 if(lista==listb){
00542 npairs=lista->GetNMC()*(lista->GetNMC()-1)/2;
00543 samelists=true;
00544 }
00545 else{
00546 npairs=lista->GetNMC()*listb->GetNMC();
00547 samelists=false;
00548 }
00549 norm=lista->GetNorm()*listb->GetNorm()/double(npairs);
00550 if(samelists && !kernel->GetIDENTICAL()) norm=0.5*norm;
00551
00552 nsx=nsy=nsz=2;
00553 if(cf->GetXSYM()){
00554 nsx=1;
00555 }
00556 if(cf->GetYSYM()){
00557 nsy=1;
00558 }
00559 if(cf->GetZSYM()){
00560 nsz=1;
00561 }
00562 cf->ZeroArray();
00563
00564
00565 na=lista->GetNMC();
00566 nb=listb->GetNMC();
00567 ipair=jpair=0;
00568 for(ia=0;ia<na;ia++){
00569 ra=lista->GetR(ia);
00570 if(samelists) nb=ia-1;
00571 for(ib=0;ib<nb;ib++){
00572 rb=listb->GetR(ib);
00573 x=ra[1]-rb[1];
00574 y=ra[2]-rb[2];
00575 z=ra[3]-rb[3];
00576 r=sqrt(x*x+y*y+z*z);
00577 if(r<rmax){
00578 for(jsx=0;jsx<nsx;jsx++){
00579 for(jx=0;jx<nqxmax;jx++){
00580 qx=(0.5+jx)*delqx;
00581 if(jsx==1) qx=-qx;
00582 for(jsy=0;jsy<nsy;jsy++){
00583 for(jy=0;jy<nqymax;jy++){
00584 qy=(0.5+jy)*delqy;
00585 if(jsy==1) qy=-qy;
00586 for(jsz=0;jsz<nsz;jsz++){
00587 for(jz=0;jz<nqzmax;jz++){
00588 qz=(0.5+jz)*delqz;
00589 if(jsz==1) qz=-qz;
00590 q=sqrt(qx*qx+qy*qy+qz*qz);
00591 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00592 wf2=kernel->GetPsiSquared(q,r,ctheta);
00593 cf->IncrementElement(jsx,jx,jsy,jy,jsz,jz,norm*(wf2-1.0));
00594 if(samelists && !kernel->GetIDENTICAL()){
00595 wf2=kernel->GetPsiSquared(q,r,-ctheta);
00596 cf->IncrementElement(jsx,jx,jsy,jy,jsz,jz,norm*(wf2-1.0));
00597 }
00598
00599 }
00600 }
00601 }
00602 }
00603 }
00604 }
00605 }
00606 ipair+=1;
00607 if(ipair==npairs/10){
00608 jpair+=1;
00609 printf("Finished %d percent\n",jpair*10);
00610 ipair=0;
00611 }
00612 }
00613 }
00614
00615 }
00616
00617 void S2CF::s2c(CMCList *lista,CMCList *listb,CKernelWF *kernel,C3DArray *cf,int NMC){
00618 CRandom randy(-time(NULL));
00619 bool samelists;
00620 int ia,ib,na,nb,jx,jy,jz,jsx,jsy,jsz,imc,jmc,npairs;
00621 int nsx,nsy,nsz;
00622 int nqxmax=cf->GetNXMAX();
00623 int nqymax=cf->GetNYMAX();
00624 int nqzmax=cf->GetNZMAX();
00625 double delqx=cf->GetDELX();
00626 double delqy=cf->GetDELY();
00627 double delqz=cf->GetDELZ();
00628 double x,y,z,qx,qy,qz,norm,q,r,ctheta,wf2,*ra,*rb;
00629 double rmax=kernel->GetDELR()*kernel->GetNRMAX();
00630 if(lista==listb){
00631 npairs=lista->GetNMC()*(lista->GetNMC()-1)/2;
00632 samelists=true;
00633 }
00634 else{
00635 npairs=lista->GetNMC()*listb->GetNMC();
00636 samelists=false;
00637 }
00638 norm=lista->GetNorm()*listb->GetNorm()/double(NMC);
00639
00640 nsx=nsy=nsz=2;
00641 if(cf->GetXSYM()){
00642 nsx=1;
00643 }
00644 if(cf->GetYSYM()){
00645 nsy=1;
00646 }
00647 if(cf->GetZSYM()){
00648 nsz=1;
00649 }
00650 cf->ZeroArray();
00651 na=lista->GetNMC();
00652 nb=listb->GetNMC();
00653
00654 for(jsx=0;jsx<nsx;jsx++){
00655 for(jx=0;jx<nqxmax;jx++){
00656 qx=(0.5+jx)*delqx;
00657 if(jsx==1) qx=-qx;
00658 for(jsy=0;jsy<nsy;jsy++){
00659 for(jy=0;jy<nqymax;jy++){
00660 qy=(0.5+jy)*delqy;
00661 if(jsy==1) qy=-qy;
00662 for(jsz=0;jsz<nsz;jsz++){
00663 for(jz=0;jz<nqzmax;jz++){
00664 qz=(0.5+jz)*delqz;
00665 if(jsz==1) qz=-qz;
00666 q=sqrt(qx*qx+qy*qy+qz*qz);
00667 imc=jmc=0;
00668 for(imc=0;imc<NMC;imc++){
00669 jmc+=1;
00670 ia=rint(floor(randy.ran()*na));
00671 do{
00672 ib=rint(floor(randy.ran()*na));
00673 } while(ia==ib && samelists);
00674 ra=lista->GetR(ia);
00675 rb=listb->GetR(ib);
00676 x=ra[1]-rb[1];
00677 y=ra[2]-rb[2];
00678 z=ra[3]-rb[3];
00679 r=sqrt(x*x+y*y+z*z);
00680 if(r<rmax){
00681 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00682 wf2=kernel->GetPsiSquared(q,r,ctheta);
00683 cf->IncrementElement(jsx,jx,jsy,jy,jsz,jz,norm*(wf2-1.0));
00684 if(samelists && !kernel->GetIDENTICAL()){
00685 wf2=kernel->GetPsiSquared(q,r,-ctheta);
00686 cf->IncrementElement(jsx,jx,jsy,jy,jsz,jz,norm*(wf2-1.0));
00687 }
00688
00689 }
00690 }
00691 }
00692 }
00693 }
00694 }
00695 }
00696 if(jmc==NMC/10){
00697 printf("finished %g percent\n",double(imc+1)*100/double(NMC));
00698 jmc=0;
00699 }
00700 }
00701 }
00702
00703 void S2CF::s2c(CMCList *lista,CMCList *listb,CWaveFunction *wf,C3DArray *cf){
00704 bool samelists;
00705 int ia,ib,na,nb,npairs,ipair,jpair,jx,jy,jz,jsx,jsy,jsz;
00706 int nsx,nsy,nsz;
00707 int nqxmax=cf->GetNXMAX();
00708 int nqymax=cf->GetNYMAX();
00709 int nqzmax=cf->GetNZMAX();
00710 double delqx=cf->GetDELX();
00711 double delqy=cf->GetDELY();
00712 double delqz=cf->GetDELZ();
00713 double x,y,z,qx,qy,qz,norm,q,r,ctheta,wf2,*ra,*rb;
00714 if(lista==listb){
00715 npairs=lista->GetNMC()*(lista->GetNMC()-1)/2;
00716 samelists=true;
00717 }
00718 else{
00719 npairs=lista->GetNMC()*listb->GetNMC();
00720 samelists=false;
00721 }
00722 norm=lista->GetNorm()*listb->GetNorm()/double(npairs);
00723 if(samelists && !wf->GetIDENTICAL()) norm=0.5*norm;
00724
00725 nsx=nsy=nsz=2;
00726 if(cf->GetXSYM()){
00727 nsx=1;
00728 }
00729 if(cf->GetYSYM()){
00730 nsy=1;
00731 }
00732 if(cf->GetZSYM()){
00733 nsz=1;
00734 }
00735 cf->ZeroArray();
00736
00737
00738 na=lista->GetNMC();
00739 nb=listb->GetNMC();
00740 ipair=jpair=0;
00741 for(ia=0;ia<na;ia++){
00742 ra=lista->GetR(ia);
00743 if(samelists) nb=ia-1;
00744 for(ib=0;ib<nb;ib++){
00745 rb=listb->GetR(ib);
00746 x=ra[1]-rb[1];
00747 y=ra[2]-rb[2];
00748 z=ra[3]-rb[3];
00749 r=sqrt(x*x+y*y+z*z);
00750 for(jsx=0;jsx<nsx;jsx++){
00751 for(jx=0;jx<nqxmax;jx++){
00752 qx=(0.5+jx)*delqx;
00753 if(jsx==1) qx=-qx;
00754 for(jsy=0;jsy<nsy;jsy++){
00755 for(jy=0;jy<nqymax;jy++){
00756 qy=(0.5+jy)*delqy;
00757 if(jsy==1) qy=-qy;
00758 for(jsz=0;jsz<nsz;jsz++){
00759 for(jz=0;jz<nqzmax;jz++){
00760 qz=(0.5+jz)*delqz;
00761 if(jsz==1) qz=-qz;
00762 q=sqrt(qx*qx+qy*qy+qz*qz);
00763 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00764 wf2=wf->GetPsiSquared(q,r,ctheta);
00765 cf->IncrementElement(jsx,jx,jsy,jy,jsz,jz,norm*(wf2-1.0));
00766 if(samelists && !wf->GetIDENTICAL()){
00767 wf2=wf->GetPsiSquared(q,r,-ctheta);
00768 cf->IncrementElement(jsx,jx,jsy,jy,jsz,jz,norm*(wf2-1.0));
00769 }
00770
00771 }
00772 }
00773 }
00774 }
00775 }
00776 }
00777 ipair+=1;
00778 if(ipair>=npairs/10){
00779 jpair+=1;
00780 printf("Finished %d percent\n",jpair*10);
00781 ipair=0;
00782 }
00783 }
00784 }
00785
00786
00787 }
00788
00789 void S2CF::s2c_bosons(CMCList *list,C3DArray *cf){
00790 int i,n,jx,jy,jz;
00791 int nqxmax=cf->GetNXMAX();
00792 int nqymax=cf->GetNYMAX();
00793 int nqzmax=cf->GetNZMAX();
00794 double delqx=cf->GetDELX();
00795 double delqy=cf->GetDELY();
00796 double delqz=cf->GetDELZ();
00797 double c,r2,norm,arg,qx,qy,qz,*r;
00798 complex<double> alpha,ci(0.0,1.0);
00799 n=list->GetNMC();
00800 norm=list->GetNorm()*list->GetNorm();
00801
00802 cf->ZeroArray();
00803 for(jx=0;jx<nqxmax;jx++){
00804 qx=(0.5+jx)*delqx;
00805 for(jy=0;jy<nqymax;jy++){
00806 qy=(0.5+jy)*delqy;
00807 for(jz=0;jz<nqzmax;jz++){
00808 qz=(0.5+jz)*delqz;
00809 alpha=0.0;
00810 for(i=0;i<n;i++){
00811 r=list->GetR(i);
00812 r2=r[1]*r[1]+r[2]*r[2]+r[3]*r[3];
00813 arg=2.0*(r[1]*qx+r[2]*qy+r[3]*qz)/HBARC;
00814 if(arg>2.0*PI) arg=arg-2.0*PI*floor(arg/(2.0*PI));
00815 if(arg<0.0) arg=arg+2.0*PI*floor(fabs(arg/(2.0*PI)));
00816 if(r2<1.0E10) alpha+=exp(ci*arg);
00817 }
00818 c=abs(alpha*conj(alpha))-double(n);
00819 c=c/(double(n)*double(n-1));
00820 cf->IncrementElement(0,jx,0,jy,0,jz,norm*c);
00821 }
00822 }
00823 }
00824 }
00825
00826 void S2CF::s2c_gauss(CSourceCalc *sourcecalc,CKernelWF *kernel,C3DArray *cf){
00827 int imc;
00828 double root2=sqrt(2.0);
00829 double Rx=parameter::getD(sourcecalc->spars,"Rx",4.0);
00830 double Ry=parameter::getD(sourcecalc->spars,"Ry",4.0);
00831 double Rz=parameter::getD(sourcecalc->spars,"Rz",4.0);
00832 int NMC=parameter::getI(sourcecalc->spars,"NMC",500);
00833 double lambda=parameter::getD(sourcecalc->spars,"lambda",1.0);
00834 double Xoff=parameter::getD(sourcecalc->spars,"Xoff",0.0);
00835 double Yoff=parameter::getD(sourcecalc->spars,"Yoff",0.0);
00836 double Zoff=parameter::getD(sourcecalc->spars,"Zoff",0.0);
00837
00838
00839
00840 CRandom *randy=sourcecalc->randy;
00841 double x,y,z,r,q,ctheta,qx,qy,qz,wf2,xarray[3],gauss[2];
00842 int igauss=2,ix;
00843
00844 bool IDENTICAL=kernel->GetIDENTICAL();
00845 bool XSYM=cf->GetXSYM();
00846 bool YSYM=cf->GetYSYM();
00847 bool ZSYM=cf->GetZSYM();
00848 if(IDENTICAL&&!(XSYM&&YSYM&&ZSYM)){
00849 printf("S2CF::s2c, kernel says particles are identical, but symmetries are not all even\n");
00850 printf("XSYM=%d, YSYM=%d, ZSYM=%d\n",int(XSYM),int(YSYM),int(ZSYM));
00851 exit(1);
00852 }
00853 int jsx,jsy,jsz,jx,jy,jz;
00854 int nsx=2,nsy=2,nsz=2;
00855 if(XSYM) nsx=1;
00856 if(YSYM) nsy=1;
00857 if(ZSYM) nsz=1;
00858 int nqxmax=cf->GetNXMAX();
00859 int nqymax=cf->GetNYMAX();
00860 int nqzmax=cf->GetNZMAX();
00861 double delqx=cf->GetDELX();
00862 double delqy=cf->GetDELY();
00863 double delqz=cf->GetDELZ();
00864 double norm=lambda/double(NMC);
00865 cf->ZeroArray();
00866
00867 for(jsx=0;jsx<nsx;jsx++){
00868 for(jx=0;jx<nqxmax;jx++){
00869 qx=(0.5+jx)*delqx;
00870 if(jsx==1) qx=-qx;
00871
00872 for(jsy=0;jsy<nsy;jsy++){
00873 for(jy=0;jy<nqymax;jy++){
00874 qy=(0.5+jy)*delqy;
00875 if(jsy==1) qy=-qy;
00876
00877 for(jsz=0;jsz<nsz;jsz++){
00878 for(jz=0;jz<nqzmax;jz++){
00879 qz=(0.5+jz)*delqz;
00880 if(jsz==1) qz=-qz;
00881 q=sqrt(qx*qx+qy*qy+qz*qz);
00882
00883 for(imc=0;imc<NMC;imc++){
00884 for(ix=0;ix<3;ix++){
00885 if(igauss==2){
00886 randy->gauss2(&gauss[0],&gauss[1]);
00887 igauss=0;
00888 }
00889 xarray[ix]=gauss[igauss]; igauss++;
00890 }
00891 x=root2*Rx*xarray[0]+Xoff;
00892 y=root2*Ry*xarray[1]+Yoff;
00893 z=root2*Rz*xarray[2]+Zoff;
00894 r=sqrt(x*x+y*y+z*z);
00895 wf2=0.0;
00896
00897 if(XSYM&YSYM&&ZSYM){
00898 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00899 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00900 if(!IDENTICAL) wf2+=0.25*kernel->GetPsiSquared(q,r,-ctheta);
00901 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00902 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00903 if(!IDENTICAL) wf2+=0.25*kernel->GetPsiSquared(q,r,-ctheta);
00904 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00905 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00906 if(!IDENTICAL) wf2+=0.25*kernel->GetPsiSquared(q,r,-ctheta);
00907 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00908 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00909 if(!IDENTICAL) wf2+=0.25*kernel->GetPsiSquared(q,r,-ctheta);
00910 if(!IDENTICAL) wf2=0.5*wf2;
00911 }
00912 else if(!XSYM && YSYM && ZSYM){
00913 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00914 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00915 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00916 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00917 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00918 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00919 ctheta=(qx*x-qy*y-qz*z)/(q*r);
00920 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00921 }
00922 else if(XSYM && !YSYM && ZSYM){
00923 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00924 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00925 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00926 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00927 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00928 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00929 ctheta=(-qx*x+qy*y-qz*z)/(q*r);
00930 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00931 }
00932 else if(XSYM && YSYM && !ZSYM){
00933 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00934 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00935 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00936 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00937 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00938 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00939 ctheta=(-qx*x-qy*y+qz*z)/(q*r);
00940 wf2+=0.25*kernel->GetPsiSquared(q,r,ctheta);
00941 }
00942 else if(XSYM && !YSYM && !ZSYM){
00943 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00944 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00945 ctheta=(-qx*x+qy*y+qz*z)/(q*r);
00946 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00947 }
00948 else if(!XSYM && YSYM && !ZSYM){
00949 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00950 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00951 ctheta=(qx*x-qy*y+qz*z)/(q*r);
00952 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00953 }
00954 else if(!XSYM && !YSYM && ZSYM){
00955 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00956 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00957 ctheta=(qx*x+qy*y-qz*z)/(q*r);
00958 wf2+=0.5*kernel->GetPsiSquared(q,r,ctheta);
00959 }
00960 else{
00961 ctheta=(qx*x+qy*y+qz*z)/(q*r);
00962 wf2+=kernel->GetPsiSquared(q,r,ctheta);
00963 }
00964 cf->IncrementElement(jsx,jx,jsy,jy,jsz,jz,
00965 norm*(wf2-1.0));
00966 }
00967 }
00968 }
00969 }
00970 }
00971 }
00972 }
00973 }
00974
00975 #endif