00001 #ifndef __INCLUDE_SOURCECALC_BLAST__
00002 #define __INCLUDE_SOURCECALC_BLAST__
00003 #include "sourcecalc.h"
00004
00005 using namespace std;
00006
00007 CSourceCalc_Blast::CSourceCalc_Blast(){
00008 InitSPars();
00009 randy=new CRandom(-1234);
00010 }
00011
00012 void CSourceCalc_Blast::InitSPars(){
00013
00014 parameter::set(spars,"lambda",0.5);
00015 parameter::set(spars,"R",13.0);
00016 parameter::set(spars,"Tau",12.0);
00017 parameter::set(spars,"DelTau",3.0);
00018 parameter::set(spars,"Beta",0.7);
00019 parameter::set(spars,"T",110.0);
00020 parameter::set(spars,"Pt",600.0);
00021 parameter::set(spars,"Phi",0.0);
00022 parameter::set(spars,"EtaG",1.5);
00023 parameter::set(spars,"Ma",938.28);
00024 parameter::set(spars,"Mb",139.58);
00025 parameter::set(spars,"Nsample",1000);
00026 }
00027
00028 void CSourceCalc_Blast::SetSPars(double lambdaset,
00029 double Rset,double Tauset,double DelTauset,
00030 double Betaset,double Tset,double Ptset,
00031 double EtaGset,double Maset,double Mbset){
00032 InitSPars();
00033 parameter::set(spars,"lambda",lambdaset);
00034 parameter::set(spars,"R",Rset);
00035 parameter::set(spars,"Tau",Tauset);
00036 parameter::set(spars,"Beta",Betaset);
00037 parameter::set(spars,"DelTau",DelTauset);
00038 parameter::set(spars,"T",Tset);
00039 parameter::set(spars,"Pt",Ptset);
00040 parameter::set(spars,"EtaG",EtaGset);
00041 parameter::set(spars,"Ma",Maset);
00042 parameter::set(spars,"Mb",Mbset);
00043
00044 }
00045
00046 void CSourceCalc_Blast::SetSPars(double lambdaset,
00047 double Rset,double Tauset,double DelTauset){
00048
00049 InitSPars();
00050 parameter::set(spars,"lambda",lambdaset);
00051 parameter::set(spars,"R",Rset);
00052 parameter::set(spars,"Tau",Tauset);
00053 parameter::set(spars,"DelTau",DelTauset);
00054 }
00055
00056 void CSourceCalc_Blast::CalcS(CCHArray *A){
00057 int nsample;
00058 double rcm[4],*ra,*rb;
00059 double delr,ma,mb,volume;
00060 int ir,ia,ib,nbmax,nrmax;
00061 double x,y,z,xbar,ybar,zbar,x2bar,y2bar,z2bar,ex,ey,ez,snorm,r,lambda;
00062 bool SameMass;
00063 CMCList *lista,*listb;
00064 delr=A->GetRADSTEP();
00065 nrmax=A->GetNRADIAL();
00066
00067 ma=parameter::getD(spars,"Ma",-999);
00068 mb=parameter::getD(spars,"Mb",-999);
00069 nsample=parameter::getI(spars,"Nsample",1000);
00070 lambda=parameter::getD(spars,"lambda",-999);
00071 SameMass=0;
00072 if(fabs(ma-mb)<1.0) SameMass=1;
00073
00074 lista=new CMCList(nsample);
00075 if(!SameMass) listb=new CMCList(nsample);
00076 else listb=lista;
00077 CalcS(lista,listb);
00078
00079 rcm[0]=0.0;
00080 xbar=ybar=zbar=x2bar=y2bar=z2bar=0.0;
00081 for(ia=0;ia<nsample;ia++){
00082 nbmax=nsample;
00083 if(SameMass) nbmax=ia-1;
00084 for(ib=0;ib<nbmax;ib++){
00085 ra=lista->GetR(ia);
00086 rb=listb->GetR(ib);
00087
00088 rcm[1]=ra[1]-rb[1];
00089 rcm[2]=ra[2]-rb[2];
00090 rcm[3]=ra[3]-rb[3];
00091 r=sqrt(rcm[1]*rcm[1]+rcm[2]*rcm[2]+rcm[3]*rcm[3]);
00092 x=rcm[1];
00093 y=rcm[2];
00094 z=rcm[3];
00095 #ifdef __CALC_SCBLAST_GAUSSPARS__
00096 xbar+=x;
00097 x2bar+=x*x;
00098 ybar+=y;
00099 y2bar+=y*y;
00100 zbar+=z;
00101 z2bar+=z*z;
00102 #endif
00103 ir=int(floor(r/delr));
00104 if(ir<nrmax){
00105 ex=x/r; ey=y/r; ez=z/r;
00106 A->IncrementAExpArrayFromE(ex,ey,ez,lambda,ir);
00107 }
00108 }
00109
00110
00111 }
00112 A->FillRemainderX();
00113 if(SameMass) snorm=2.0/double(nsample*(nsample-1));
00114 else snorm=1.0/double(nsample*nsample);
00115
00116 #ifdef __CALC_SCBLAST_GAUSSPARS__
00117 xbar*=snorm;
00118 x2bar*=snorm;
00119 ybar*=snorm;
00120 y2bar*=snorm;
00121 zbar*=snorm;
00122 z2bar*=snorm;
00123 x2bar=x2bar-xbar*xbar;
00124 y2bar=y2bar-ybar*ybar;
00125 z2bar=z2bar-zbar*zbar;
00126 printf("xbar=%g, ybar=%g, zbar=%g\n",xbar,ybar,zbar);
00127 printf("Effective Gaussian Radii: Rout=%g, Rside=%g, Rlong=%g\n",
00128 sqrt(0.5*x2bar),sqrt(0.5*y2bar),sqrt(0.5*z2bar));
00129 #endif
00130
00131 for(ir=0;ir<nrmax;ir++){
00132 volume=(4.0*PI/3)*(pow((ir+1)*delr,3)
00133 -pow(double(ir)*delr,3));
00134 A->ScaleArray(snorm/volume,ir);
00135 }
00136
00137 delete lista;
00138 if(!SameMass) delete listb;
00139
00140 }
00141
00142 void CSourceCalc_Blast::CalcS(CMCList *lista,CMCList *listb){
00143 double pa[4],pb[4];
00144 double ma,mb,Pt,lambda;
00145 int nsample;
00146
00147 lambda=parameter::getD(spars,"lambda",1.0);
00148 lista->SetNorm(sqrt(lambda));
00149 listb->SetNorm(sqrt(lambda));
00150 nsample=parameter::getI(spars,"Nsample",1000);
00151 ma=parameter::getD(spars,"Ma",-999);
00152 mb=parameter::getD(spars,"Mb",-999);
00153 pa[3]=pb[3]=0.0;
00154 Pt=parameter::getD(spars,"Pt",-999);
00155 pa[1]=Pt*ma/(ma+mb);
00156 pb[1]=Pt*mb/(ma+mb);
00157 pa[2]=pa[3]=0.0;
00158 pb[2]=pb[3]=0.0;
00159 pa[0]=sqrt(ma*ma+pa[1]*pa[1]);
00160 pb[0]=sqrt(mb*mb+pb[1]*pb[1]);
00161
00162 if(lista->GetNMC()!=nsample) lista->Resize(nsample);
00163 GetMCList(pa,lista);
00164
00165 if(lista!=listb){
00166 if(listb->GetNMC()!=nsample) listb->Resize(nsample);
00167 GetMCList(pb,listb);
00168 }
00169
00170 }
00171
00172 void CSourceCalc_Blast::GetMCList(double *p,CMCList *mclist){
00173 double eta,etaG,u[4],x,y,z,t,tt,R,weight;
00174 double umax,betamax,eprime,eu,eumin,T,tau,tau0,deltau;
00175 double pt,gamma,gammav;
00176 int imc,nsample;
00177 double m=sqrt(p[0]*p[0]-p[1]*p[1]);
00178 etaG=parameter::getD(spars,"EtaG",-999);
00179 R=parameter::getD(spars,"R",-999);
00180 T=parameter::getD(spars,"T",-999);
00181 tau0=parameter::getD(spars,"Tau",-999);
00182 betamax=parameter::getD(spars,"Beta",-999);
00183 deltau=parameter::getD(spars,"DelTau",-999);
00184 nsample=parameter::getI(spars,"Nsample",-999);
00185 umax=betamax/sqrt(1.0-betamax*betamax);
00186 pt=fabs(p[1]);
00187 gammav=pt/m;
00188 gamma=sqrt(1.0+gammav*gammav);
00189 if(gammav<umax) eumin=m;
00190 else eumin=sqrt(1.0+umax*umax)*p[0]-umax*p[1];
00191
00192 for(imc=0;imc<nsample;imc++){
00193 do{
00194 eta=etaG*randy->gauss();
00195 TRY_AGAIN:
00196 x=(1.0-2.0*randy->ran());
00197 y=(1.0-2.0*randy->ran());
00198 if(x*x+y*y>1.0) goto TRY_AGAIN;
00199 u[1]=umax*x;
00200 u[2]=umax*y;
00201 x=x*R;
00202 y=y*R;
00203 u[3]=sinh(eta);
00204 u[0]=sqrt(1.0+u[1]*u[1]+u[3]*u[3]);
00205
00206 eprime=p[0]*cosh(eta);
00207 eu=u[0]*p[0]-u[1]*p[1];
00208
00209 weight=(eprime/p[0])*exp(-(eu-eumin)/T);
00210 if(weight>1.0){
00211 printf("DISASTER! weight=%g which is > 1.0, eu=%g, eumin=%g\n",weight,eu,eumin);
00212 exit(1);
00213 }
00214 } while(weight<randy->ran());
00215
00216 tau=GetTau(tau0,deltau);
00217 z=tau*sinh(eta);
00218 t=tau*cosh(eta);
00219
00220 tt=gamma*t-gammav*x;
00221 x=gamma*x-gammav*t;
00222 t=tt;
00223 mclist->SetR(imc,t,x,y,z);
00224 }
00225 }
00226
00227 double CSourceCalc_Blast::GetTau(double tau0,double deltau){
00228 double tau;
00229 do{
00230 tau=tau0+deltau*randy->gauss();
00231 }while(tau<0.0);
00232
00233 return tau;
00234 }
00235
00236 #endif