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