00001 #ifndef INCLUDE_SOURCECALC_CC
00002 #define INCLUDE_SOURCECALC_CC
00003 using namespace std;
00004
00005 #include "constants.h"
00006 #include "sourcecalc.h"
00007
00008 CSourceCalc::CSourceCalc(){
00009 randy=new CRandom(-1234);
00010 }
00011
00012 void CSourceCalc::CalcS(CCHArray *A){
00013 printf("i'm a dummy CalcS(CCHArray)\n");
00014
00015 }
00016
00017 void CSourceCalc::CalcS(C3DArray *threed){
00018 printf("i'm a dummy CalcS(C3DArray)\n");
00019
00020 }
00021
00022 void CSourceCalc::GaussCFCalc(C3DArray *cf3d){
00023 printf("i'm a dummy CalcS(C3DArray *)\n");
00024
00025 }
00026
00027 void CSourceCalc::CalcS(int lx,int ly,int lz,CCHArray *A){
00028 printf("i'm a dummy CalcS(int,int,int,CCHArray *)\n");
00029
00030 }
00031
00032 void CSourceCalc::CalcS(CMCList *&lista,CMCList *&listb){
00033 printf("i'm a dummy CalcS(CMCList *a,CMCList *b)\n");
00034
00035 }
00036
00037 void CSourceCalc::CombineMCLists(CMCList *lista,CMCList *listb,CCHArray *A){
00038 A->ZeroArray();
00039 double rcm[4];
00040 int icalc=0,ncalc,icount=0,ia,ib,nbmax,ir,na=lista->GetNMC(),nb=listb->GetNMC(),nrmax=A->GetNRADIAL();
00041 double *ra,*rb;
00042 double r,volume,delr=A->GetRADSTEP(),snorm;
00043 bool AEQUALB;
00044 if(lista==listb){
00045 AEQUALB=true;
00046 ncalc=na*(na-1)/2;
00047 }
00048 else{
00049 AEQUALB=false;
00050 ncalc=na*nb;
00051 }
00052 rcm[0]=0.0;
00053 printf("_______ In CombineMCLists: na=%d, nb=%d, AEQUALB=%d ______\n",na,nb,int(AEQUALB));
00054 A->ZeroArray();
00055 for(ia=0;ia<na;ia++){
00056 ra=lista->GetR(ia);
00057 if(AEQUALB) nbmax=ia-1;
00058 else nbmax=nb;
00059 for(ib=0;ib<=nbmax;ib++){
00060 rb=listb->GetR(ib);
00061 rcm[1]=ra[1]-rb[1];
00062 rcm[2]=ra[2]-rb[2];
00063 rcm[3]=ra[3]-rb[3];
00064 r=sqrt(rcm[1]*rcm[1]+rcm[2]*rcm[2]+rcm[3]*rcm[3]);
00065 if(r<nrmax*delr){
00066 ir=int(floor(r/delr));
00067 if(ir<nrmax){
00068 A->IncrementAExpArrayFromE(rcm[1]/r,rcm[2]/r,rcm[3]/r,1.0,ir);
00069 }
00070 }
00071 icalc+=1;
00072 icount+=1;
00073 if(icount*10>=ncalc){
00074 printf("finished %4.1f percent\n",100.0*double(icalc)/double(ncalc));
00075 icount=0;
00076 }
00077 }
00078 }
00079 A->FillRemainderX();
00080
00081 if(AEQUALB) snorm=2.0/(double(na)*double(na-1));
00082 else snorm=1.0/(double(na)*double(nb));
00083
00084 for(ir=0;ir<nrmax;ir++){
00085 volume=(4.0*PI/3)*(pow((ir+1)*delr,3)-pow(double(ir)*delr,3));
00086 A->ScaleArray(snorm/volume,ir);
00087 }
00088 }
00089
00090 void CSourceCalc::CombineMCLists(CMCList *lista,CMCList *listb,CCHArray *A,int NMC){
00091 A->ZeroArray();
00092 double rcm[4];
00093 int icalc=0,icount=0,ia,ib,imc,nbmax,ir,na=lista->GetNMC(),nb=listb->GetNMC(),nrmax=A->GetNRADIAL();
00094 double *ra,*rb;
00095 double r,volume,delr=A->GetRADSTEP(),snorm;
00096 bool AEQUALB;
00097 if(lista==listb){
00098 AEQUALB=true;
00099 }
00100 else{
00101 AEQUALB=false;
00102 }
00103 rcm[0]=0.0;
00104 printf("_______ In CombineMCLists: na=%d, nb=%d, AEQUALB=%d ______\n",na,nb,int(AEQUALB));
00105 A->ZeroArray();
00106 for(imc=0;imc<NMC;imc++){
00107 ia=rint(floor(randy->ran()*na));
00108 do{
00109 ib=rint(floor(randy->ran()*na));
00110 }while(AEQUALB && ia==ib);
00111 printf("ia=%d, ib=%d\n",ia,ib);
00112 ra=lista->GetR(ia);
00113 rb=listb->GetR(ib);
00114 rcm[1]=ra[1]-rb[1];
00115 rcm[2]=ra[2]-rb[2];
00116 rcm[3]=ra[3]-rb[3];
00117 r=sqrt(rcm[1]*rcm[1]+rcm[2]*rcm[2]+rcm[3]*rcm[3]);
00118 if(r<nrmax*delr){
00119 ir=int(floor(r/delr));
00120 if(ir<nrmax){
00121 A->IncrementAExpArrayFromE(rcm[1]/r,rcm[2]/r,rcm[3]/r,1.0,ir);
00122 }
00123 }
00124 icalc+=1;
00125 icount+=1;
00126 if(icount*10>=NMC){
00127 printf("finished %4.1f percent\n",100.0*double(icalc)/double(NMC));
00128 icount=0;
00129
00130 }
00131 }
00132 A->FillRemainderX();
00133 snorm=1.0/double(NMC);
00134
00135 for(ir=0;ir<nrmax;ir++){
00136 volume=(4.0*PI/3)*(pow((ir+1)*delr,3)-pow(double(ir)*delr,3));
00137 A->ScaleArray(snorm/volume,ir);
00138 }
00139 }
00140
00141 void CSourceCalc::CombineMCLists(CMCList *lista,CMCList *listb,C3DArray *threed){
00142 threed->ZeroArray();
00143 double rcm[4];
00144 int ia,ib,nbmax,na=lista->GetNMC(),nb=listb->GetNMC();
00145 double *ra,*rb;
00146 double volume,snorm;
00147 bool AEQUALB=false;
00148 if(lista==listb) AEQUALB=true;
00149 rcm[0]=0.0;
00150 for(ia=0;ia<na;ia++){
00151 ra=lista->GetR(ia);
00152 if(AEQUALB) nbmax=ia-1;
00153 else nbmax=nb;
00154 for(ib=0;ib<nbmax;ib++){
00155 rb=listb->GetR(ib);
00156 rcm[1]=ra[1]-rb[1];
00157 rcm[2]=ra[2]-rb[2];
00158 rcm[3]=ra[3]-rb[3];
00159 threed->IncrementElement(rcm[1],rcm[2],rcm[3],1.0);
00160 }
00161 if(10*(ia+1)%(10*int(na/10))==0)
00162 printf("finished %g percent\n",100*double(ia+1)/(10*int(na/10)));
00163 }
00164
00165 if(AEQUALB) snorm=2.0/double(na*(na-1));
00166 else snorm=1.0/double(na*nb);
00167
00168 volume=threed->GetDELX()*threed->GetDELY()*threed->GetDELZ();
00169 threed->ScaleArray(snorm/volume);
00170 }
00171
00172 void CSourceCalc::ReadSPars(char *sparsfilename){
00173 parameter::ReadParsFromFile(spars,sparsfilename);
00174 }
00175
00176 void CSourceCalc::NormCheck(CCHArray *A){
00177 double check,delr,volume;
00178 int ir,NRMAX;
00179 NRMAX=A->GetNRADIAL();
00180 delr=A->GetRADSTEP();
00181 check=0;
00182 for(ir=0;ir<NRMAX;ir++){
00183 volume=4.0*PI*(pow(delr*(ir+1.0),3)-pow(delr*ir,3))/3.0;
00184 check+=volume*A->GetElement(0,0,0,ir);
00185 }
00186 printf("normalization check = %g\n",check);
00187 }
00188
00189 void CSourceCalc::CalcEffGaussPars(CCHArray *A){
00190 double Rx,Ry,Rz,Xoff,Yoff,Zoff;
00191 CalcEffGaussPars(A,Rx,Ry,Rz,Xoff,Yoff,Zoff);
00192 }
00193
00194 void CSourceCalc::CalcEffGaussPars(CCHArray *A,double &Rx,double &Ry,double &Rz,double &Xoff,double &Yoff,double &Zoff){
00195 double xbar,ybar,zbar,x2bar,y2bar,z2bar,r2bar,r,r2,r3,r4,DELR;
00196 int ir,NRMAX;
00197 bool XSYM,YSYM,ZSYM;
00198 NRMAX=A->GetNRADIAL();
00199 DELR=A->GetRADSTEP();
00200 XSYM=A->GetXSYM();
00201 YSYM=A->GetYSYM();
00202 ZSYM=A->GetZSYM();
00203 const double PI=4.0*atan(1.0);
00204 xbar=ybar=zbar=x2bar=y2bar=z2bar=r2bar=0.0;
00205 for(ir=0;ir<NRMAX;ir++){
00206 r=(0.5+ir)*DELR;
00207 r2=r*r;
00208 r3=r2*r;
00209 r4=r2*r2;
00210 if(!XSYM) xbar+=r3*A->GetElement(1,0,0,ir);
00211 if(!YSYM) ybar+=r3*A->GetElement(0,1,0,ir);
00212 if(!ZSYM) zbar+=r3*A->GetElement(0,0,1,ir);
00213 x2bar+=r4*A->GetElement(2,0,0,ir);
00214 y2bar+=r4*A->GetElement(0,2,0,ir);
00215 z2bar+=r4*A->GetElement(0,0,2,ir);
00216 r2bar+=r4*A->GetElement(0,0,0,ir);
00217 }
00218 xbar*=4.0*PI*DELR/3.0;
00219 ybar*=4.0*PI*DELR/3.0;
00220 zbar*=4.0*PI*DELR/3.0;
00221 printf("__________ EFFECTIVE GAUSSIAN PARAMETERS ____________\n");
00222 printf("Rinv=%g\n",sqrt(2.0*PI*DELR*r2bar/3.0));
00223 x2bar=4.0*PI*DELR*(2.0*x2bar/15.0+(r2bar/3.0))-xbar*xbar;
00224 y2bar=4.0*PI*DELR*(2.0*y2bar/15.0+(r2bar/3.0))-ybar*ybar;
00225 z2bar=4.0*PI*DELR*(2.0*z2bar/15.0+(r2bar/3.0))-zbar*zbar;
00226 printf("Gaussian distribution with same offsets and 1-part. radii\n");
00227 printf("offset_xyz=(%g,%g,%g), R_xyz=(%g,%g,%g)\n",
00228 xbar,ybar,zbar,
00229 sqrt(fabs(0.5*x2bar)),sqrt(fabs(0.5*y2bar)),sqrt(fabs(0.5*z2bar)));
00230 printf("______________________________________________________\n");
00231
00232 Xoff=xbar;
00233 Yoff=ybar;
00234 Zoff=zbar;
00235 Rx=sqrt(fabs(0.5*x2bar));
00236 Ry=sqrt(fabs(0.5*y2bar));
00237 Rz=sqrt(fabs(0.5*z2bar));
00238
00239 }
00240
00241 void CSourceCalc::NormCheck(C3DArray *threed){
00242 int nsx,nsy,nsz,isx,isy,isz,ix,iy,iz;
00243 int nxmax=threed->GetNXMAX();
00244 int nymax=threed->GetNYMAX();
00245 int nzmax=threed->GetNZMAX();
00246 double prefactor=threed->GetDELX()*threed->GetDELY()*threed->GetDELZ();
00247 double norm=0.0;
00248 nsx=nsy=nsz=2;
00249 if(threed->GetXSYM()) nsx=1;
00250 if(threed->GetYSYM()) nsy=1;
00251 if(threed->GetZSYM()) nsz=1;
00252 if(nsx==1) prefactor*=2.0;
00253 if(nsy==1) prefactor*=2.0;
00254 if(nsz==1) prefactor*=2.0;
00255 for(ix=0;ix<nxmax;ix++){
00256 for(iy=0;iy<nymax;iy++){
00257 for(iz=0;iz<nzmax;iz++){
00258 for(isz=0;isz<nsz;isz++){
00259 for(isy=0;isy<nsy;isy++){
00260 for(isx=0;isx<nsx;isx++){
00261 norm+=threed->GetElement(isx,ix,isy,iy,isz,iz)*prefactor;
00262 }
00263 }
00264 }
00265 }
00266 }
00267 }
00268 printf("Norm Check of 3DArray = %g\n",norm);
00269 }
00270
00271 #endif