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