00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00067 #include <stdio.h>
00068 #include <stdlib.h>
00069 #include <math.h>     
00070 #include "stop96.h"  
00071 #include "compilopt.h"
00072 
00073 
00074 void readstopcoef(char *afilename, char *bfilename)
00075 {
00076 
00077 
00078 
00079 
00080 FILE *afile, *bfile;
00081 int i,j;
00082 char stemp[300];
00083 
00084 
00085 if (!(afile=fopen(afilename, "r"))){fprintf(stderr, "\ncannot open '%s' for read\n",afilename);exit(1);}
00086 if (!(bfile=fopen(bfilename, "r"))){fprintf(stderr, "\ncannot open '%s' for read\n",bfilename);exit(1);}
00087 
00088 
00089 for(i=0;i<2;i++) fgets(stemp,300,afile) ;  
00090 for(i=0;i<2;i++) fgets(stemp,300,bfile) ;  
00091 
00092 
00093 for(i=1;i<=93;i++) for(j=1;j<=16;j++)fscanf(afile,"%f",&scoef[i][j]);
00094 for(i=1;i<=93;i++) for(j=17;j<=54;j++)fscanf(bfile,"%f",&scoef[i][j]);
00095 
00096 
00097 
00098 fclose(afile);
00099 fclose(bfile);
00100 }
00101 
00102 float pstop(int Z2, float E)
00103 {
00104 
00105 
00106 float X,SL,SH,ppower,Sproton;
00107 float PE0;
00108 PE0=10;
00109 
00110 if(E>1e4){
00111   X=logf(E)/E;
00112   Sproton=scoef[Z2][17]+(scoef[Z2][18]*X)+(scoef[Z2][19]*X*X)+(scoef[Z2][20]/X);
00113   }
00114 
00115 else if (E>PE0){
00116   SL=scoef[Z2][9]*powf(E,scoef[Z2][10])+scoef[Z2][11]*powf(E,scoef[Z2][12]);
00117   SH=scoef[Z2][13]/powf(E,scoef[Z2][14])*logf((scoef[Z2][15]/E)+scoef[Z2][16]*E);
00118   Sproton=SL*SH/(SL+SH);
00119   }
00120 
00121 else if(E>0){
00122   if(Z2<7)ppower=0.35; else ppower=0.45;
00123   SL=scoef[Z2][9]*powf(PE0,scoef[Z2][10])+scoef[Z2][11]*powf(PE0,scoef[Z2][12]);
00124   SH=scoef[Z2][13]/powf(PE0,scoef[Z2][14])*logf((scoef[Z2][15]/PE0)+scoef[Z2][16]*PE0);
00125   Sproton=(SL*SH/(SL+SH))*powf(E/PE0,ppower);
00126   }
00127 else Sproton=0.;
00128 
00129 return(Sproton);
00130 }
00131 
00132 
00133 float pstop_fit(int Z2,float E,float P0,float P1,float P2,float P3,float P4,float P5,float P6,float P7,float HE0,float HE1,float HE2,float HE3)
00134 {
00135 
00136 float X,SL,SH,ppower,Sproton;
00137 float PE0;
00138 PE0=10;
00139 
00140 if(E>1e4){
00141   X=logf(E)/E;
00142   Sproton=HE0+(HE1*X)+(HE2*X*X)+(HE3/X);
00143   }
00144 
00145 else if (E>PE0){
00146   SL=P0*powf(E,P1)+P2*powf(E,P3);
00147   SH=P4/powf(E,P5)*logf((P6/E)+P7*E);
00148   Sproton=SL*SH/(SL+SH);
00149   }
00150 
00151 else if(E>0){
00152   if(Z2<7)ppower=0.35; else ppower=0.45;
00153   SL=P0*powf(PE0,P1)+P2*powf(PE0,P3);
00154   SH=P4/powf(PE0,P5)*logf((P6/PE0)+P7*PE0);
00155   Sproton=(SL*SH/(SL+SH))*powf(E/PE0,ppower);
00156   }
00157 else Sproton=0.;
00158 
00159 return(Sproton);
00160 }
00161 
00162 void stop96(int Z1, int Z2,float Ionweight, float *Ener, int nEner, float *SE){
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 float M1,tempf,VFERMI,E,HE0,HE,B,HEH,YRMIN,VRMIN,V,VR,YR,Q,LAMBDA0,LAMBDA1,L,ZETA0,ZETA,VMIN,EEE,Sproton,EION,VFCORR0,VFCORR1,HIPOWER;
00175 int i,j;
00176 
00177 
00178 if(Z1<1 || Z1>92) {fprintf(stderr, "\nError: Z1 must be between 1 and 92 \n");exit(1);}
00179 if(Z2<1 || Z2>92) {fprintf(stderr, "\nError: Z2 must be between 1 and 92 \n");exit(1);}
00180 if(nEner<1){fprintf(stderr, "\nError: I need at least one energy  \n");exit(1);}
00181 
00182 
00183 
00184 VFERMI= scoef[Z2][7];       
00185 if(Ionweight<1)M1=scoef[Z1][3]; else M1=Ionweight;    
00186 
00187 
00188 for(i=0;i<nEner;i++){
00189   E=Ener[i]/M1;
00190 
00191   if(Z1==1){ 
00192     SE[i]=pstop(Z2,E);
00193     }
00194 
00195 
00196   else if(Z1==2){ 
00197     HE0=1;                            
00198     if(HE0>E)HE=HE0;else HE=E;        
00199     B=logf(HE);
00200     tempf=.2865+.1266*B-.001429*B*B+.02402*B*B*B-.01135*powf(B,4)+.001475*powf(B,5);
00201     if(tempf>30) tempf=30;
00202     HEH=1.-expf(-tempf);
00203     
00204     if(HE<1)HE=1;  
00205     tempf=(1.+(.007+.00005*Z2)*expf(-powf(7.6-logf(HE),2)));
00206     HEH*=(tempf*tempf);
00207     SE[i]=pstop(Z2,HE)*HEH*4.;
00208     
00209     if(HE0>E)SE[i]*=sqrtf(E/HE0);
00210     }
00211 
00212 
00213   else if(Z1>2){ 
00214     
00215     YRMIN=0.13;   
00216     VRMIN=1.0;    
00217     V=sqrtf(E/25.)/VFERMI;  
00218     if(V<1) VR=(3.*VFERMI/4.)*(1+(2.*V*V/3.)-powf(V,4.)/15.);
00219     else VR=V*VFERMI*(1.+1./(5.*V*V));
00220     
00221     if(VR<VRMIN)VR=VRMIN;
00222     
00223     YR=VR/powf(Z1,.6667);
00224     if(YR<YRMIN)YR=YRMIN;
00225     
00226     tempf=-.803*powf(YR,0.3)+1.3167*powf(YR,0.6)+.38157*YR+.008983*YR*YR;
00227     if(tempf>50.)Q=1; else if(tempf<=0)Q=0; else  Q=1.-expf(-tempf);    
00228     
00229 
00230     for(j=22; j<=39 && scoef[93][j]<Q ;j++);j-=1;  
00231     if(j<22)j=22;else if(j>38)j=38; 
00232     LAMBDA0=scoef[Z1][j];
00233     LAMBDA1=(Q-scoef[93][j])*(scoef[Z1][j+1]-scoef[Z1][j])/(scoef[93][j+1]-scoef[93][j]);
00234     L=(LAMBDA0+LAMBDA1)/powf(Z1,.33333);
00235     ZETA0=Q+(1./(2.*VFERMI*VFERMI))*(1.-Q)*logf(1+powf((4.*L*VFERMI/1.919),2));
00236     if(E>1)tempf=logf(E);else tempf=0;
00237     ZETA=ZETA0*(1.+(1./(Z1*Z1))*(.08+.0015*Z2)*expf(-powf((7.6-tempf),2)));
00238     
00239     tempf=VRMIN/powf(Z1,.6667); if(tempf<YRMIN)tempf=YRMIN;
00240     if(YR<=tempf){
00241       tempf=YRMIN*powf(Z1,.6667);if(VRMIN<tempf)VRMIN=tempf; 
00242       tempf=VRMIN*VRMIN-0.8*VFERMI*VFERMI; if(tempf<0)tempf=0;
00243       VMIN=.5*(VRMIN+sqrtf(tempf));
00244       EEE=25*VMIN*VMIN;
00245       Sproton=pstop(Z2,EEE);
00246       
00247       if(EEE<=9999)EION=EEE;else EION=9999; 
00248       for(j=41;j<=53 && scoef[93][j]<EION ;j++);j-=1;  
00249       if(j<41)j=41;else if(j>53)j=53; 
00250       VFCORR0=scoef[Z2][j];
00251       VFCORR1=(EION-scoef[93][j])*(scoef[Z2][j+1]-scoef[Z2][j])/(scoef[93][j+1]-scoef[93][j]);
00252       
00253 
00254 
00255 
00256 
00257 
00258       if(Z1==3)HIPOWER= 0.55;
00259       else if(Z2<7)HIPOWER= 0.375;
00260       else if(Z1<18 && (Z2==14 || Z2==32))HIPOWER= 0.375;
00261       else HIPOWER=.47; 
00262       SE[i]=Sproton*powf(ZETA*Z1,2)*(VFCORR0+VFCORR1)*powf((E/EEE),HIPOWER);
00263       }
00264     
00265     else{
00266       Sproton=pstop(Z2,E);
00267       
00268       if(E<=9999)EION=E;else EION=9999; 
00269       for(j=41;j<=53 && scoef[93][j]<EION ;j++);j-=1;  
00270       if(j<41)j=41;else if(j>53)j=53; 
00271       VFCORR0=scoef[Z2][j];
00272       VFCORR1=(EION-scoef[93][j])*(scoef[Z2][j+1]-scoef[Z2][j])/(scoef[93][j+1]-scoef[93][j]);
00273       SE[i]=Sproton*powf(ZETA*Z1,2)*(VFCORR0+VFCORR1);
00274       }
00275  
00276 
00277 
00278     }
00279   
00280   }
00281 
00282 }
00283 
00284 
00285 void stop96d(int Z1, int Z2,double Ionweight, double *Ener, int nEner, double *SE){
00286 
00287 
00288 
00289 
00290 
00291 
00292 
00293 
00294 
00295 
00296 
00297 
00298 float tempf,VFERMI,E,HE0,HE,B,HEH,YRMIN,VRMIN,V,VR,YR,Q,LAMBDA0,LAMBDA1,L,ZETA0,ZETA,VMIN,EEE,Sproton,EION,VFCORR0,VFCORR1,HIPOWER,M1;
00299 int i,j;
00300 
00301 
00302 if(Z1<1 || Z1>92) {fprintf(stderr, "\nError: Z1 must be between 1 and 92 (%d)\n",Z1);exit(1);}
00303 if(Z2<1 || Z2>92) {fprintf(stderr, "\nError: Z2 must be between 1 and 92 (%d)\n",Z2);exit(1);}
00304 if(nEner<1){fprintf(stderr, "\nError: I need at least one energy  \n");exit(1);}
00305 
00306 
00307 VFERMI= scoef[Z2][7];       
00308 if(Ionweight<1.)M1=scoef[Z1][3] ;else M1=(float)Ionweight;    
00309 
00310 
00311 
00312 for(i=0;i<nEner;i++){
00313   E=(float)(Ener[i]/M1);
00314 
00315   if(Z1==1){ 
00316     SE[i]=(double)pstop(Z2,E);
00317     }
00318 
00319 
00320   else if(Z1==2){ 
00321     HE0=1;                            
00322     if(HE0>E)HE=HE0;else HE=E;        
00323     B=logf(HE);
00324     tempf=.2865+.1266*B-.001429*B*B+.02402*B*B*B-.01135*powf(B,4)+.001475*powf(B,5);
00325     if(tempf>30) tempf=30;
00326     HEH=1.-expf(-tempf);
00327     
00328     if(HE<1)HE=1;  
00329     tempf=(1.+(.007+.00005*Z2)*expf(-powf(7.6-logf(HE),2)));
00330     HEH*=(tempf*tempf);
00331     SE[i]=(double)(pstop(Z2,HE)*HEH*4.);
00332     
00333     if(HE0>E)SE[i]*=(double)sqrtf(E/HE0);
00334     }
00335 
00336 
00337   else if(Z1>2){ 
00338     
00339     YRMIN=0.13;   
00340     VRMIN=1.0;    
00341     V=sqrtf(E/25.)/VFERMI;  
00342     if(V<1) VR=(3.*VFERMI/4.)*(1+(2.*V*V/3.)-powf(V,4.)/15.);
00343     else VR=V*VFERMI*(1.+1./(5.*V*V));
00344     
00345     if(VR<VRMIN)VR=VRMIN;
00346     
00347     YR=VR/powf(Z1,.6667);
00348     if(YR<YRMIN)YR=YRMIN;
00349     
00350     tempf=-.803*powf(YR,0.3)+1.3167*powf(YR,0.6)+.38157*YR+.008983*YR*YR;
00351     if(tempf>50.)Q=1; else if(tempf<=0)Q=0; else  Q=1.-expf(-tempf);    
00352     
00353 
00354     for(j=22; j<=39 && scoef[93][j]<Q ;j++);j-=1;  
00355     if(j<22)j=22;else if(j>38)j=38; 
00356     LAMBDA0=scoef[Z1][j];
00357     LAMBDA1=(Q-scoef[93][j])*(scoef[Z1][j+1]-scoef[Z1][j])/(scoef[93][j+1]-scoef[93][j]);
00358     L=(LAMBDA0+LAMBDA1)/powf(Z1,.33333);
00359     ZETA0=Q+(1./(2.*VFERMI*VFERMI))*(1.-Q)*logf(1+powf((4.*L*VFERMI/1.919),2));
00360     if(E>1)tempf=logf(E);else tempf=0;
00361     ZETA=ZETA0*(1.+(1./(Z1*Z1))*(.08+.0015*Z2)*expf(-powf((7.6-tempf),2)));
00362     
00363     tempf=VRMIN/powf(Z1,.6667); if(tempf<YRMIN)tempf=YRMIN;
00364     if(YR<=tempf){
00365       tempf=YRMIN*powf(Z1,.6667);if(VRMIN<tempf)VRMIN=tempf; 
00366       tempf=VRMIN*VRMIN-0.8*VFERMI*VFERMI; if(tempf<0)tempf=0;
00367       VMIN=.5*(VRMIN+sqrtf(tempf));
00368       EEE=25*VMIN*VMIN;
00369       Sproton=pstop(Z2,EEE);
00370       
00371       if(EEE<=9999)EION=EEE;else EION=9999; 
00372       for(j=41;j<=53 && scoef[93][j]<EION ;j++);j-=1;  
00373       if(j<41)j=41;else if(j>53)j=53; 
00374       VFCORR0=scoef[Z2][j];
00375       VFCORR1=(EION-scoef[93][j])*(scoef[Z2][j+1]-scoef[Z2][j])/(scoef[93][j+1]-scoef[93][j]);
00376       
00377 
00378 
00379 
00380 
00381 
00382       if(Z1==3)HIPOWER= 0.55;
00383       else if(Z2<7)HIPOWER= 0.375;
00384       else if(Z1<18 && (Z2==14 || Z2==32))HIPOWER= 0.375;
00385       else HIPOWER=.47; 
00386       SE[i]=(double)(Sproton*powf(ZETA*Z1,2)*(VFCORR0+VFCORR1)*powf((E/EEE),HIPOWER));
00387       }
00388     
00389     else{
00390       Sproton=pstop(Z2,E);
00391       
00392       if(E<=9999)EION=E;else EION=9999; 
00393       for(j=41;j<=53 && scoef[93][j]<EION ;j++);j-=1;  
00394       if(j<41)j=41;else if(j>53)j=53; 
00395       VFCORR0=scoef[Z2][j];
00396       VFCORR1=(EION-scoef[93][j])*(scoef[Z2][j+1]-scoef[Z2][j])/(scoef[93][j+1]-scoef[93][j]);
00397       SE[i]=(double)(Sproton*powf(ZETA*Z1,2)*(VFCORR0+VFCORR1));
00398       }
00399  
00400 
00401 
00402     }
00403   
00404   }
00405 
00406 }
00407 
00408 double nuclearstopping_ZBL(int Z1, int Z2,double Ionweight, double trgtweight, double *Ener, int nEner, double *SN)
00409 {
00410 
00411 
00412 
00413 
00414 
00415 
00416 
00417 
00418 
00419 
00420 
00421 
00422 
00423 
00424 
00425 
00426 double M1,M2,EPSIL,temp,spmax;
00427 int i;
00428 
00429 
00430 if(trgtweight<1.)M2=(double)scoef[Z2][3] ;else M2=(double)trgtweight;    
00431 if(Ionweight<1.)M1=(double)scoef[Z1][3] ;else M1=(double)Ionweight;    
00432 
00433 for(i=0,spmax=0;i<nEner;i++){
00434   
00435   temp=(M1+M2)*(pow(Z1,0.23)+pow(Z2,0.23));
00436   EPSIL=32.53*M2*Ener[i]/(Z1*Z2*temp);
00437   if(EPSIL==0)SN[i]=0;
00438   else if(EPSIL>=30) SN[i]=log(EPSIL)/(2*EPSIL);
00439   else SN[i]=.5*log(1+1.1383*EPSIL)/(EPSIL+(.01321*pow(EPSIL,.21226))+(.19593*sqrt(EPSIL)));
00440   
00441   SN[i]*=Z1*Z2*M1*8.462/temp;
00442   
00443   if(SN[i]>spmax)spmax=SN[i];
00444   }
00445 return(spmax);
00446 }
00447 
00448 
00449 
00450 
00451 
00452 
00453 
00454 
00455 
00456 
00457 
00458 
00459 
00460 
00461 
00462