Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ecpssrBaseLixsModel Class Reference

#include <G4ecpssrBaseLixsModel.hh>

+ Inheritance diagram for G4ecpssrBaseLixsModel:

Public Member Functions

 G4ecpssrBaseLixsModel ()
 
 ~G4ecpssrBaseLixsModel ()
 
G4double CalculateL1CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident) override
 
G4double CalculateL2CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident) override
 
G4double CalculateL3CrossSection (G4int zTarget, G4double massIncident, G4double energyIncident) override
 
G4double CalculateVelocity (G4int subShell, G4int zTarget, G4double massIncident, G4double energyIncident)
 
G4double ExpIntFunction (G4int n, G4double x)
 
 G4ecpssrBaseLixsModel (const G4ecpssrBaseLixsModel &)=delete
 
G4ecpssrBaseLixsModeloperator= (const G4ecpssrBaseLixsModel &right)=delete
 
- Public Member Functions inherited from G4VecpssrLiModel
 G4VecpssrLiModel ()
 
virtual ~G4VecpssrLiModel ()
 
 G4VecpssrLiModel (const G4VecpssrLiModel &)=delete
 
G4VecpssrLiModeloperator= (const G4VecpssrLiModel &right)=delete
 

Detailed Description

Definition at line 52 of file G4ecpssrBaseLixsModel.hh.

Constructor & Destructor Documentation

◆ G4ecpssrBaseLixsModel() [1/2]

G4ecpssrBaseLixsModel::G4ecpssrBaseLixsModel ( )
explicit

Definition at line 41 of file G4ecpssrBaseLixsModel.cc.

42{
43 verboseLevel=0;
44
45 // Storing FLi data needed for 0.2 to 3.0 velocities region
46 const char* path = G4FindDataDir("G4LEDATA");
47
48 if (!path) {
49 G4Exception("G4ecpssrLCrossSection::G4ecpssrBaseLixsModel()","em0006", FatalException ,"G4LEDATA environment variable not set");
50 return;
51 }
52 std::ostringstream fileName1;
53 std::ostringstream fileName2;
54
55 fileName1 << path << "/pixe/uf/FL1.dat";
56 fileName2 << path << "/pixe/uf/FL2.dat";
57
58 // Reading of FL1.dat
59 std::ifstream FL1(fileName1.str().c_str());
60 if (!FL1) G4Exception("G4ecpssrLCrossSection::G4ecpssrBaseLixsModel()","em0003",FatalException, "error opening FL1 data file");
61
62 dummyVec1.push_back(0.);
63
64 while(!FL1.eof())
65 {
66 double x1;
67 double y1;
68
69 FL1>>x1>>y1;
70
71 // Mandatory vector initialization
72 if (x1 != dummyVec1.back())
73 {
74 dummyVec1.push_back(x1);
75 aVecMap1[x1].push_back(-1.);
76 }
77
78 FL1>>FL1Data[x1][y1];
79
80 if (y1 != aVecMap1[x1].back()) aVecMap1[x1].push_back(y1);
81 }
82
83 // Reading of FL2.dat
84
85 std::ifstream FL2(fileName2.str().c_str());
86 if (!FL2) G4Exception("G4ecpssrLCrossSection::G4ecpssrBaseLixsModel()","em0003", FatalException," error opening FL2 data file");
87
88 dummyVec2.push_back(0.);
89
90 while(!FL2.eof())
91 {
92 double x2;
93 double y2;
94
95 FL2>>x2>>y2;
96
97 // Mandatory vector initialization
98 if (x2 != dummyVec2.back())
99 {
100 dummyVec2.push_back(x2);
101 aVecMap2[x2].push_back(-1.);
102 }
103
104 FL2>>FL2Data[x2][y2];
105
106 if (y2 != aVecMap2[x2].back()) aVecMap2[x2].push_back(y2);
107 }
108}
const char * G4FindDataDir(const char *)
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)

◆ ~G4ecpssrBaseLixsModel()

G4ecpssrBaseLixsModel::~G4ecpssrBaseLixsModel ( )

Definition at line 112 of file G4ecpssrBaseLixsModel.cc.

113{}

◆ G4ecpssrBaseLixsModel() [2/2]

G4ecpssrBaseLixsModel::G4ecpssrBaseLixsModel ( const G4ecpssrBaseLixsModel & )
delete

Member Function Documentation

◆ CalculateL1CrossSection()

G4double G4ecpssrBaseLixsModel::CalculateL1CrossSection ( G4int zTarget,
G4double massIncident,
G4double energyIncident )
overridevirtual

Implements G4VecpssrLiModel.

Definition at line 186 of file G4ecpssrBaseLixsModel.cc.

187{
188
189 if (zTarget <=4) return 0.;
190
191 //this L1-CrossSection calculation method is done according to Werner Brandt and Grzegorz Lapicki, Phys.Rev.A20 N2 (1979),
192 //and using data tables of O. Benka et al. At.Data Nucl.Data Tables Vol.22 No.3 (1978).
193
194 G4NistManager* massManager = G4NistManager::Instance();
195
197
198 G4double zIncident = 0;
199 G4Proton* aProtone = G4Proton::Proton();
200 G4Alpha* aAlpha = G4Alpha::Alpha();
201
202 if (massIncident == aProtone->GetPDGMass() )
203 {
204 zIncident = (aProtone->GetPDGCharge())/eplus;
205 }
206 else
207 {
208 if (massIncident == aAlpha->GetPDGMass())
209 {
210 zIncident = (aAlpha->GetPDGCharge())/eplus;
211 }
212 else
213 {
214 G4cout << "*** WARNING in G4ecpssrBaseLixsModel::CalculateL1CrossSection : Proton or Alpha incident particles only. " << G4endl;
215 G4cout << massIncident << ", " << aAlpha->GetPDGMass() << " (alpha)" << aProtone->GetPDGMass() << " (proton)" << G4endl;
216 return 0;
217 }
218 }
219
220 G4double l1BindingEnergy = transitionManager->Shell(zTarget,1)->BindingEnergy(); //Observed binding energy of L1-subshell
221 G4double massTarget = (massManager->GetAtomicMassAmu(zTarget))*amu_c2;
222 G4double systemMass =((massIncident*massTarget)/(massIncident+massTarget))/electron_mass_c2; //Mass of the system (projectile, target)
223 static const G4double zlshell= 4.15;
224 // *** see Benka, ADANDT 22, p 223
225 G4double screenedzTarget = zTarget-zlshell; //Effective nuclear charge as seen by electrons in L1-sub shell
226 static const G4double rydbergMeV= 13.6056923e-6;
227
228 static const G4double nl= 2.;
229 // *** see Benka, ADANDT 22, p 220, f3
230 G4double tetal1 = (l1BindingEnergy*nl*nl)/((screenedzTarget*screenedzTarget)*rydbergMeV); //Screening parameter
231 // *** see Benka, ADANDT 22, p 220, f3
232
233 if (verboseLevel>0) G4cout << " tetal1=" << tetal1<< G4endl;
234
235 G4double reducedEnergy = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget);
236 // *** also called etaS
237 // *** see Benka, ADANDT 22, p 220, f3
238
239 static const G4double bohrPow2Barn=(Bohr_radius*Bohr_radius)/barn ; //Bohr radius of hydrogen
240
241 G4double sigma0 = 8.*pi*(zIncident*zIncident)*bohrPow2Barn*std::pow(screenedzTarget,-4.);
242 // *** see Benka, ADANDT 22, p 220, f2, for protons
243 // *** see Basbas, Phys Rev A7, p 1000
244
245 G4double velocityl1 = CalculateVelocity(1, zTarget, massIncident, energyIncident); // Scaled velocity
246
247 if (verboseLevel>0) G4cout << " velocityl1=" << velocityl1<< G4endl;
248
249 static const G4double l1AnalyticalApproximation= 1.5;
250 G4double x1 =(nl*l1AnalyticalApproximation)/velocityl1;
251 // *** 1.5 is cK = cL1 (it is 1.25 for L2 & L3)
252 // *** see Brandt, Phys Rev A20, p 469, f16 in expression of h
253
254 if (verboseLevel>0) G4cout << " x1=" << x1<< G4endl;
255
256 G4double electrIonizationEnergyl1=0.;
257 // *** see Basbas, Phys Rev A17, p1665, f27
258 // *** see Brandt, Phys Rev A20, p469
259 // *** see Liu, Comp Phys Comm 97, p325, f A5
260
261 if ( x1<=0.035) electrIonizationEnergyl1= 0.75*pi*(std::log(1./(x1*x1))-1.);
262 else
263 {
264 if ( x1<=3.)
265 electrIonizationEnergyl1 =G4Exp(-2.*x1)/(0.031+(0.213*std::pow(x1,0.5))+(0.005*x1)-(0.069*std::pow(x1,3./2.))+(0.324*x1*x1));
266 else
267 {if ( x1<=11.) electrIonizationEnergyl1 =2.*G4Exp(-2.*x1)/std::pow(x1,1.6);}
268 }
269
270 G4double hFunctionl1 =(electrIonizationEnergyl1*2.*nl)/(tetal1*std::pow(velocityl1,3)); //takes into account the polarization effect
271 // *** see Brandt, Phys Rev A20, p 469, f16
272
273 if (verboseLevel>0) G4cout << " hFunctionl1=" << hFunctionl1<< G4endl;
274
275 G4double gFunctionl1 = (1.+(9.*velocityl1)+(31.*velocityl1*velocityl1)+(49.*std::pow(velocityl1,3.))+(162.*std::pow(velocityl1,4.))+(63.*std::pow(velocityl1,5.))+(18.*std::pow(velocityl1,6.))+(1.97*std::pow(velocityl1,7.)))/std::pow(1.+velocityl1,9.);//takes into account the reduced binding effect
276 // *** see Brandt, Phys Rev A20, p 469, f19
277
278 if (verboseLevel>0) G4cout << " gFunctionl1=" << gFunctionl1<< G4endl;
279
280 G4double sigmaPSS_l1 = 1.+(((2.*zIncident)/(screenedzTarget*tetal1))*(gFunctionl1-hFunctionl1)); //Binding-polarization factor
281 // *** also called dzeta
282 // *** also called epsilon
283 // *** see Basbas, Phys Rev A17, p1667, f45
284
285 if (verboseLevel>0) G4cout << "sigmaPSS_l1 =" << sigmaPSS_l1<< G4endl;
286
287 const G4double cNaturalUnit= 137.;
288
289 G4double yl1Formula=0.4*(screenedzTarget/cNaturalUnit)*(screenedzTarget/cNaturalUnit)/(nl*velocityl1/sigmaPSS_l1);
290 // *** also called yS
291 // *** see Brandt, Phys Rev A20, p467, f6
292 // *** see Brandt, Phys Rev A23, p1728
293
294 G4double l1relativityCorrection = std::pow((1.+(1.1*yl1Formula*yl1Formula)),0.5)+yl1Formula; // Relativistic correction parameter
295 // *** also called mRS
296 // *** see Brandt, Phys Rev A20, p467, f6
297
298 //G4double reducedVelocity_l1 = velocityl1*std::pow(l1relativityCorrection,0.5); //Reduced velocity parameter
299
300 G4double L1etaOverTheta2;
301
302 G4double universalFunction_l1 = 0.;
303
304 G4double sigmaPSSR_l1;
305
306 // low velocity formula
307 // *****************
308 if ( velocityl1 <20. )
309 {
310
311 L1etaOverTheta2 =(reducedEnergy* l1relativityCorrection)/((tetal1*sigmaPSS_l1)*(tetal1*sigmaPSS_l1));
312 // *** 1) RELATIVISTIC CORRECTION ADDED
313 // *** 2) sigma_PSS_l1 ADDED
314 // *** reducedEnergy is etaS, l1relativityCorrection is mRS
315 // *** see Phys Rev A20, p468, top
316
317 if ( ((tetal1*sigmaPSS_l1) >=0.2) && ((tetal1*sigmaPSS_l1) <=2.6670) && (L1etaOverTheta2>=0.1e-3) && (L1etaOverTheta2<=0.866e2) )
318 universalFunction_l1 = FunctionFL1((tetal1*sigmaPSS_l1),L1etaOverTheta2);
319
320 if (verboseLevel>0) G4cout << "at low velocity range, universalFunction_l1 =" << universalFunction_l1 << G4endl;
321
322 sigmaPSSR_l1 = (sigma0/(tetal1*sigmaPSS_l1))*universalFunction_l1;// Plane-wave Born -Aproximation L1-subshell ionisation Cross Section
323 // *** see Benka, ADANDT 22, p220, f1
324
325 if (verboseLevel>0) G4cout << " at low velocity range, sigma PWBA L1 CS = " << sigmaPSSR_l1<< G4endl;
326 }
327 else
328 {
329 L1etaOverTheta2 = reducedEnergy/(tetal1*tetal1);
330 // Medium & high velocity
331 // *** 1) NO RELATIVISTIC CORRECTION
332 // *** 2) NO sigma_PSS_l1
333 // *** see Benka, ADANDT 22, p223
334
335 if ( (tetal1 >=0.2) && (tetal1 <=2.6670) && (L1etaOverTheta2>=0.1e-3) && (L1etaOverTheta2<=0.866e2) )
336 universalFunction_l1 = FunctionFL1(tetal1,L1etaOverTheta2);
337
338 if (verboseLevel>0) G4cout << "at medium and high velocity range, universalFunction_l1 =" << universalFunction_l1 << G4endl;
339
340 sigmaPSSR_l1 = (sigma0/tetal1)*universalFunction_l1;// Plane-wave Born -Aproximation L1-subshell ionisation Cross Section
341 // *** see Benka, ADANDT 22, p220, f1
342
343 if (verboseLevel>0) G4cout << " sigma PWBA L1 CS at medium and high velocity range = " << sigmaPSSR_l1<< G4endl;
344 }
345
346 G4double pssDeltal1 = (4./(systemMass *sigmaPSS_l1*tetal1))*(sigmaPSS_l1/velocityl1)*(sigmaPSS_l1/velocityl1);
347 // *** also called dzeta*delta
348 // *** see Brandt, Phys Rev A23, p1727, f B2
349
350 if (verboseLevel>0) G4cout << " pssDeltal1=" << pssDeltal1<< G4endl;
351
352 if (pssDeltal1>1) return 0.;
353
354 G4double energyLossl1 = std::pow(1-pssDeltal1,0.5);
355 // *** also called z
356 // *** see Brandt, Phys Rev A23, p1727, after f B2
357
358 if (verboseLevel>0) G4cout << " energyLossl1=" << energyLossl1<< G4endl;
359
360 G4double coulombDeflectionl1 =
361 (8.*pi*zIncident/systemMass)*std::pow(tetal1*sigmaPSS_l1,-2.)*std::pow(velocityl1/sigmaPSS_l1,-3.)*(zTarget/screenedzTarget);
362 // *** see Brandt, Phys Rev A20, v2s and f2 and B2
363 // *** with factor n2 compared to Brandt, Phys Rev A23, p1727, f B3
364
365 G4double cParameterl1 =2.* coulombDeflectionl1/(energyLossl1*(energyLossl1+1.));
366 // *** see Brandt, Phys Rev A23, p1727, f B4
367
368 G4double coulombDeflectionFunction_l1 = 9.*ExpIntFunction(10,cParameterl1); //Coulomb-deflection effect correction
369
370 if (verboseLevel>0) G4cout << " coulombDeflectionFunction_l1 =" << coulombDeflectionFunction_l1 << G4endl;
371
372 G4double crossSection_L1 = coulombDeflectionFunction_l1 * sigmaPSSR_l1;
373
374 //ECPSSR L1 -subshell cross section is estimated at perturbed-stationnairy-state(PSS)
375 //and reduced by the energy-loss(E),the Coulomb deflection(C),and the relativity(R) effects
376
377 if (verboseLevel>0) G4cout << " crossSection_L1 =" << crossSection_L1 << G4endl;
378
379 if (crossSection_L1 >= 0)
380 {
381 return crossSection_L1 * barn;
382 }
383
384 else {return 0;}
385}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:180
double G4double
Definition G4Types.hh:83
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
static G4Alpha * Alpha()
Definition G4Alpha.cc:83
G4double BindingEnergy() const
G4AtomicShell * Shell(G4int Z, size_t shellIndex) const
static G4AtomicTransitionManager * Instance()
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
static G4Proton * Proton()
Definition G4Proton.cc:90
G4double ExpIntFunction(G4int n, G4double x)
G4double CalculateVelocity(G4int subShell, G4int zTarget, G4double massIncident, G4double energyIncident)

◆ CalculateL2CrossSection()

G4double G4ecpssrBaseLixsModel::CalculateL2CrossSection ( G4int zTarget,
G4double massIncident,
G4double energyIncident )
overridevirtual

Implements G4VecpssrLiModel.

Definition at line 389 of file G4ecpssrBaseLixsModel.cc.

391{
392 if (zTarget <=13 ) return 0.;
393
394 // this L2-CrossSection calculation method is done according to Werner Brandt and Grzegorz Lapicki, Phys.Rev.A20 N2 (1979),
395 // and using data tables of O. Benka et al. At.Data Nucl.Data Tables Vol.22 No.3 (1978).
396
397 G4NistManager* massManager = G4NistManager::Instance();
398
400
401 G4double zIncident = 0;
402
403 G4Proton* aProtone = G4Proton::Proton();
404 G4Alpha* aAlpha = G4Alpha::Alpha();
405
406 if (massIncident == aProtone->GetPDGMass() )
407 zIncident = (aProtone->GetPDGCharge())/eplus;
408
409 else
410 {
411 if (massIncident == aAlpha->GetPDGMass())
412 zIncident = (aAlpha->GetPDGCharge())/eplus;
413
414 else
415 {
416 G4cout << "*** WARNING in G4ecpssrBaseLixsModel::CalculateL2CrossSection : Proton or Alpha incident particles only. " << G4endl;
417 G4cout << massIncident << ", " << aAlpha->GetPDGMass() << " (alpha)" << aProtone->GetPDGMass() << " (proton)" << G4endl;
418 return 0;
419 }
420 }
421
422 G4double l2BindingEnergy = transitionManager->Shell(zTarget,2)->BindingEnergy(); //Observed binding energy of L2-subshell
423
424 G4double massTarget = (massManager->GetAtomicMassAmu(zTarget))*amu_c2;
425
426 G4double systemMass =((massIncident*massTarget)/(massIncident+massTarget))/electron_mass_c2; //Mass of the system (projectile, target)
427
428 const G4double zlshell= 4.15;
429
430 G4double screenedzTarget = zTarget-zlshell; //Effective nuclear charge as seen by electrons in L2-subshell
431
432 const G4double rydbergMeV= 13.6056923e-6;
433
434 const G4double nl= 2.;
435
436 G4double tetal2 = (l2BindingEnergy*nl*nl)/((screenedzTarget*screenedzTarget)*rydbergMeV); //Screening parameter
437
438 if (verboseLevel>0) G4cout << " tetal2=" << tetal2<< G4endl;
439
440 G4double reducedEnergy = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget);
441
442 const G4double bohrPow2Barn=(Bohr_radius*Bohr_radius)/barn ; //Bohr radius of hydrogen
443
444 G4double sigma0 = 8.*pi*(zIncident*zIncident)*bohrPow2Barn*std::pow(screenedzTarget,-4.);
445
446 G4double velocityl2 = CalculateVelocity(2, zTarget, massIncident, energyIncident); // Scaled velocity
447
448 if (verboseLevel>0) G4cout << " velocityl2=" << velocityl2<< G4endl;
449
450 const G4double l23AnalyticalApproximation= 1.25;
451
452 G4double x2 = (nl*l23AnalyticalApproximation)/velocityl2;
453
454 if (verboseLevel>0) G4cout << " x2=" << x2<< G4endl;
455
456 G4double electrIonizationEnergyl2=0.;
457
458 if ( x2<=0.035) electrIonizationEnergyl2= 0.75*pi*(std::log(1./(x2*x2))-1.);
459 else
460 {
461 if ( x2<=3.)
462 electrIonizationEnergyl2 =G4Exp(-2.*x2)/(0.031+(0.213*std::pow(x2,0.5))+(0.005*x2)-(0.069*std::pow(x2,3./2.))+(0.324*x2*x2));
463 else
464 {if ( x2<=11.) electrIonizationEnergyl2 =2.*G4Exp(-2.*x2)/std::pow(x2,1.6); }
465 }
466
467 G4double hFunctionl2 =(electrIonizationEnergyl2*2.*nl)/(tetal2*std::pow(velocityl2,3)); //takes into account the polarization effect
468
469 if (verboseLevel>0) G4cout << " hFunctionl2=" << hFunctionl2<< G4endl;
470
471 G4double gFunctionl2 = (1.+(10.*velocityl2)+(45.*velocityl2*velocityl2)+(102.*std::pow(velocityl2,3.))+(331.*std::pow(velocityl2,4.))+(6.7*std::pow(velocityl2,5.))+(58.*std::pow(velocityl2,6.))+(7.8*std::pow(velocityl2,7.))+ (0.888*std::pow(velocityl2,8.)) )/std::pow(1.+velocityl2,10.);
472 //takes into account the reduced binding effect
473
474 if (verboseLevel>0) G4cout << " gFunctionl2=" << gFunctionl2<< G4endl;
475
476 G4double sigmaPSS_l2 = 1.+(((2.*zIncident)/(screenedzTarget*tetal2))*(gFunctionl2-hFunctionl2)); //Binding-polarization factor
477
478 if (verboseLevel>0) G4cout << " sigmaPSS_l2=" << sigmaPSS_l2<< G4endl;
479
480 const G4double cNaturalUnit= 137.;
481
482 G4double yl2Formula=0.15*(screenedzTarget/cNaturalUnit)*(screenedzTarget/cNaturalUnit)/(velocityl2/sigmaPSS_l2);
483
484 G4double l2relativityCorrection = std::pow((1.+(1.1*yl2Formula*yl2Formula)),0.5)+yl2Formula; // Relativistic correction parameter
485
486 G4double L2etaOverTheta2;
487
488 G4double universalFunction_l2 = 0.;
489
490 G4double sigmaPSSR_l2 ;
491
492 if ( velocityl2 < 20. )
493 {
494
495 L2etaOverTheta2 = (reducedEnergy*l2relativityCorrection)/((sigmaPSS_l2*tetal2)*(sigmaPSS_l2*tetal2));
496
497 if ( (tetal2*sigmaPSS_l2>=0.2) && (tetal2*sigmaPSS_l2<=2.6670) && (L2etaOverTheta2>=0.1e-3) && (L2etaOverTheta2<=0.866e2) )
498 universalFunction_l2 = FunctionFL2((tetal2*sigmaPSS_l2),L2etaOverTheta2);
499
500 sigmaPSSR_l2 = (sigma0/(tetal2*sigmaPSS_l2))*universalFunction_l2;
501
502 if (verboseLevel>0) G4cout << " sigma PWBA L2 CS at low velocity range = " << sigmaPSSR_l2<< G4endl;
503 }
504 else
505 {
506
507 L2etaOverTheta2 = reducedEnergy /(tetal2*tetal2);
508
509 if ( (tetal2>=0.2) && (tetal2<=2.6670) && (L2etaOverTheta2>=0.1e-3) && (L2etaOverTheta2<=0.866e2) )
510 universalFunction_l2 = FunctionFL2((tetal2),L2etaOverTheta2);
511
512 sigmaPSSR_l2 = (sigma0/tetal2)*universalFunction_l2;
513
514 if (verboseLevel>0) G4cout << " sigma PWBA L2 CS at medium and high velocity range = " << sigmaPSSR_l2<< G4endl;
515
516 }
517
518 G4double pssDeltal2 = (4./(systemMass*sigmaPSS_l2*tetal2))*(sigmaPSS_l2/velocityl2)*(sigmaPSS_l2/velocityl2);
519
520 if (pssDeltal2>1) return 0.;
521
522 G4double energyLossl2 = std::pow(1-pssDeltal2,0.5);
523
524 if (verboseLevel>0) G4cout << " energyLossl2=" << energyLossl2<< G4endl;
525
526 G4double coulombDeflectionl2
527 =(8.*pi*zIncident/systemMass)*std::pow(tetal2*sigmaPSS_l2,-2.)*std::pow(velocityl2/sigmaPSS_l2,-3.)*(zTarget/screenedzTarget);
528
529 G4double cParameterl2 = 2.*coulombDeflectionl2/(energyLossl2*(energyLossl2+1.));
530
531 G4double coulombDeflectionFunction_l2 = 11.*ExpIntFunction(12,cParameterl2); //Coulomb-deflection effect correction
532 // *** see Brandt, Phys Rev A10, p477, f25
533
534 if (verboseLevel>0) G4cout << " coulombDeflectionFunction_l2 =" << coulombDeflectionFunction_l2 << G4endl;
535
536 G4double crossSection_L2 = coulombDeflectionFunction_l2 * sigmaPSSR_l2;
537 //ECPSSR L2 -subshell cross section is estimated at perturbed-stationnairy-state(PSS)
538 //and reduced by the energy-loss(E),the Coulomb deflection(C),and the relativity(R) effects
539
540 if (verboseLevel>0) G4cout << " crossSection_L2 =" << crossSection_L2 << G4endl;
541
542 if (crossSection_L2 >= 0)
543 {
544 return crossSection_L2 * barn;
545 }
546 else {return 0;}
547}

◆ CalculateL3CrossSection()

G4double G4ecpssrBaseLixsModel::CalculateL3CrossSection ( G4int zTarget,
G4double massIncident,
G4double energyIncident )
overridevirtual

Implements G4VecpssrLiModel.

Definition at line 552 of file G4ecpssrBaseLixsModel.cc.

554{
555 if (zTarget <=13) return 0.;
556
557 //this L3-CrossSection calculation method is done according to Werner Brandt and Grzegorz Lapicki, Phys.Rev.A20 N2 (1979),
558 //and using data tables of O. Benka et al. At.Data Nucl.Data Tables Vol.22 No.3 (1978).
559
560 G4NistManager* massManager = G4NistManager::Instance();
561
563
564 G4double zIncident = 0;
565
566 G4Proton* aProtone = G4Proton::Proton();
567 G4Alpha* aAlpha = G4Alpha::Alpha();
568
569 if (massIncident == aProtone->GetPDGMass() )
570
571 zIncident = (aProtone->GetPDGCharge())/eplus;
572
573 else
574 {
575 if (massIncident == aAlpha->GetPDGMass())
576
577 zIncident = (aAlpha->GetPDGCharge())/eplus;
578
579 else
580 {
581 G4cout << "*** WARNING in G4ecpssrBaseLixsModel::CalculateL3CrossSection : Proton or Alpha incident particles only. " << G4endl;
582 G4cout << massIncident << ", " << aAlpha->GetPDGMass() << " (alpha)" << aProtone->GetPDGMass() << " (proton)" << G4endl;
583 return 0;
584 }
585 }
586
587 G4double l3BindingEnergy = transitionManager->Shell(zTarget,3)->BindingEnergy();
588
589 G4double massTarget = (massManager->GetAtomicMassAmu(zTarget))*amu_c2;
590
591 G4double systemMass =((massIncident*massTarget)/(massIncident+massTarget))/electron_mass_c2;//Mass of the system (projectile, target)
592
593 const G4double zlshell= 4.15;
594
595 G4double screenedzTarget = zTarget-zlshell;//Effective nuclear charge as seen by electrons in L3-subshell
596
597 const G4double rydbergMeV= 13.6056923e-6;
598
599 const G4double nl= 2.;
600
601 G4double tetal3 = (l3BindingEnergy*nl*nl)/((screenedzTarget*screenedzTarget)*rydbergMeV);//Screening parameter
602
603 if (verboseLevel>0) G4cout << " tetal3=" << tetal3<< G4endl;
604
605 G4double reducedEnergy = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget);
606
607 const G4double bohrPow2Barn=(Bohr_radius*Bohr_radius)/barn ;//Bohr radius of hydrogen
608
609 G4double sigma0 = 8.*pi*(zIncident*zIncident)*bohrPow2Barn*std::pow(screenedzTarget,-4.);
610
611 G4double velocityl3 = CalculateVelocity(3, zTarget, massIncident, energyIncident);// Scaled velocity
612
613 if (verboseLevel>0) G4cout << " velocityl3=" << velocityl3<< G4endl;
614
615 const G4double l23AnalyticalApproximation= 1.25;
616
617 G4double x3 = (nl*l23AnalyticalApproximation)/velocityl3;
618
619 if (verboseLevel>0) G4cout << " x3=" << x3<< G4endl;
620
621 G4double electrIonizationEnergyl3=0.;
622
623 if ( x3<=0.035) electrIonizationEnergyl3= 0.75*pi*(std::log(1./(x3*x3))-1.);
624 else
625 {
626 if ( x3<=3.) electrIonizationEnergyl3 =G4Exp(-2.*x3)/(0.031+(0.213*std::pow(x3,0.5))+(0.005*x3)-(0.069*std::pow(x3,3./2.))+(0.324*x3*x3));
627 else
628 {
629 if ( x3<=11.) electrIonizationEnergyl3 =2.*G4Exp(-2.*x3)/std::pow(x3,1.6);}
630 }
631
632 G4double hFunctionl3 =(electrIonizationEnergyl3*2.*nl)/(tetal3*std::pow(velocityl3,3));//takes into account the polarization effect
633
634 if (verboseLevel>0) G4cout << " hFunctionl3=" << hFunctionl3<< G4endl;
635
636 G4double gFunctionl3 = (1.+(10.*velocityl3)+(45.*velocityl3*velocityl3)+(102.*std::pow(velocityl3,3.))+(331.*std::pow(velocityl3,4.))+(6.7*std::pow(velocityl3,5.))+(58.*std::pow(velocityl3,6.))+(7.8*std::pow(velocityl3,7.))+ (0.888*std::pow(velocityl3,8.)) )/std::pow(1.+velocityl3,10.);
637 //takes into account the reduced binding effect
638
639 if (verboseLevel>0) G4cout << " gFunctionl3=" << gFunctionl3<< G4endl;
640
641 G4double sigmaPSS_l3 = 1.+(((2.*zIncident)/(screenedzTarget*tetal3))*(gFunctionl3-hFunctionl3));//Binding-polarization factor
642
643 if (verboseLevel>0) G4cout << "sigmaPSS_l3 =" << sigmaPSS_l3<< G4endl;
644
645 const G4double cNaturalUnit= 137.;
646
647 G4double yl3Formula=0.15*(screenedzTarget/cNaturalUnit)*(screenedzTarget/cNaturalUnit)/(velocityl3/sigmaPSS_l3);
648
649 G4double l3relativityCorrection = std::pow((1.+(1.1*yl3Formula*yl3Formula)),0.5)+yl3Formula; // Relativistic correction parameter
650
651 G4double L3etaOverTheta2;
652
653 G4double universalFunction_l3 = 0.;
654
655 G4double sigmaPSSR_l3;
656
657 if ( velocityl3 < 20. )
658 {
659
660 L3etaOverTheta2 = (reducedEnergy* l3relativityCorrection)/((sigmaPSS_l3*tetal3)*(sigmaPSS_l3*tetal3));
661
662 if ( (tetal3*sigmaPSS_l3>=0.2) && (tetal3*sigmaPSS_l3<=2.6670) && (L3etaOverTheta2>=0.1e-3) && (L3etaOverTheta2<=0.866e2) )
663
664 universalFunction_l3 = 2.*FunctionFL2((tetal3*sigmaPSS_l3), L3etaOverTheta2 );
665
666 sigmaPSSR_l3 = (sigma0/(tetal3*sigmaPSS_l3))*universalFunction_l3;
667
668 if (verboseLevel>0) G4cout << " sigma PWBA L3 CS at low velocity range = " << sigmaPSSR_l3<< G4endl;
669
670 }
671
672 else
673
674 {
675
676 L3etaOverTheta2 = reducedEnergy/(tetal3*tetal3);
677
678 if ( (tetal3>=0.2) && (tetal3<=2.6670) && (L3etaOverTheta2>=0.1e-3) && (L3etaOverTheta2<=0.866e2) )
679
680 universalFunction_l3 = 2.*FunctionFL2(tetal3, L3etaOverTheta2 );
681
682 sigmaPSSR_l3 = (sigma0/tetal3)*universalFunction_l3;
683
684 if (verboseLevel>0) G4cout << " sigma PWBA L3 CS at medium and high velocity range = " << sigmaPSSR_l3<< G4endl;
685 }
686
687 G4double pssDeltal3 = (4./(systemMass*sigmaPSS_l3*tetal3))*(sigmaPSS_l3/velocityl3)*(sigmaPSS_l3/velocityl3);
688
689 if (verboseLevel>0) G4cout << " pssDeltal3=" << pssDeltal3<< G4endl;
690
691 if (pssDeltal3>1) return 0.;
692
693 G4double energyLossl3 = std::pow(1-pssDeltal3,0.5);
694
695 if (verboseLevel>0) G4cout << " energyLossl3=" << energyLossl3<< G4endl;
696
697 G4double coulombDeflectionl3 =
698 (8.*pi*zIncident/systemMass)*std::pow(tetal3*sigmaPSS_l3,-2.)*std::pow(velocityl3/sigmaPSS_l3,-3.)*(zTarget/screenedzTarget);
699
700 G4double cParameterl3 = 2.*coulombDeflectionl3/(energyLossl3*(energyLossl3+1.));
701
702 G4double coulombDeflectionFunction_l3 = 11.*ExpIntFunction(12,cParameterl3);//Coulomb-deflection effect correction
703 // *** see Brandt, Phys Rev A10, p477, f25
704
705 if (verboseLevel>0) G4cout << " coulombDeflectionFunction_l3 =" << coulombDeflectionFunction_l3 << G4endl;
706
707 G4double crossSection_L3 = coulombDeflectionFunction_l3 * sigmaPSSR_l3;
708 //ECPSSR L3 -subshell cross section is estimated at perturbed-stationnairy-state(PSS)
709 //and reduced by the energy-loss(E),the Coulomb deflection(C),and the relativity(R) effects
710
711 if (verboseLevel>0) G4cout << " crossSection_L3 =" << crossSection_L3 << G4endl;
712
713 if (crossSection_L3 >= 0)
714 {
715 return crossSection_L3 * barn;
716 }
717 else {return 0;}
718}

◆ CalculateVelocity()

G4double G4ecpssrBaseLixsModel::CalculateVelocity ( G4int subShell,
G4int zTarget,
G4double massIncident,
G4double energyIncident )

Definition at line 722 of file G4ecpssrBaseLixsModel.cc.

724{
725
727
728 G4double liBindingEnergy = transitionManager->Shell(zTarget,subShell)->BindingEnergy();
729
730 G4Proton* aProtone = G4Proton::Proton();
731 G4Alpha* aAlpha = G4Alpha::Alpha();
732
733 if (!((massIncident == aProtone->GetPDGMass()) || (massIncident == aAlpha->GetPDGMass())))
734 {
735 G4cout << "*** WARNING in G4ecpssrBaseLixsModel::CalculateVelocity : Proton or Alpha incident particles only. " << G4endl;
736 G4cout << massIncident << ", " << aAlpha->GetPDGMass() << " (alpha)" << aProtone->GetPDGMass() << " (proton)" << G4endl;
737 return 0;
738 }
739
740 constexpr G4double zlshell= 4.15;
741
742 G4double screenedzTarget = zTarget- zlshell;
743
744 constexpr G4double rydbergMeV= 13.6056923e-6;
745
746 constexpr G4double nl= 2.;
747
748 G4double tetali = (liBindingEnergy*nl*nl)/(screenedzTarget*screenedzTarget*rydbergMeV);
749
750 G4double reducedEnergy = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget);
751
752 G4double velocity = 2.*nl*std::pow(reducedEnergy,0.5)/tetali;
753 // *** see Brandt, Phys Rev A10, p10, f4
754
755 return velocity;
756}

Referenced by CalculateL1CrossSection(), CalculateL2CrossSection(), and CalculateL3CrossSection().

◆ ExpIntFunction()

G4double G4ecpssrBaseLixsModel::ExpIntFunction ( G4int n,
G4double x )

Definition at line 117 of file G4ecpssrBaseLixsModel.cc.

119{
120// this function allows fast evaluation of the n order exponential integral function En(x)
121 G4int i;
122 G4int ii;
123 G4int nm1;
124 G4double a;
125 G4double b;
126 G4double c;
127 G4double d;
128 G4double del;
129 G4double fact;
130 G4double h;
131 G4double psi;
132 G4double ans = 0;
133 static const G4double euler= 0.5772156649;
134 static const G4int maxit= 100;
135 static const G4double fpmin = 1.0e-30;
136 static const G4double eps = 1.0e-7;
137 nm1=n-1;
138 if (n<0 || x<0.0 || (x==0.0 && (n==0 || n==1)))
139 G4cout << "*** WARNING in G4ecpssrBaseLixsModel::ExpIntFunction: bad arguments in ExpIntFunction"
140 << G4endl;
141 else {
142 if (n==0) ans=G4Exp(-x)/x;
143 else {
144 if (x==0.0) ans=1.0/nm1;
145 else {
146 if (x > 1.0) {
147 b=x+n;
148 c=1.0/fpmin;
149 d=1.0/b;
150 h=d;
151 for (i=1;i<=maxit;i++) {
152 a=-i*(nm1+i);
153 b +=2.0;
154 d=1.0/(a*d+b);
155 c=b+a/c;
156 del=c*d;
157 h *=del;
158 if (std::fabs(del-1.0) < eps) {
159 ans=h*G4Exp(-x);
160 return ans;
161 }
162 }
163 } else {
164 ans = (nm1!=0 ? 1.0/nm1 : -std::log(x)-euler);
165 fact=1.0;
166 for (i=1;i<=maxit;i++) {
167 fact *=-x/i;
168 if (i !=nm1) del = -fact/(i-nm1);
169 else {
170 psi = -euler;
171 for (ii=1;ii<=nm1;ii++) psi +=1.0/ii;
172 del=fact*(-std::log(x)+psi);
173 }
174 ans += del;
175 if (std::fabs(del) < std::fabs(ans)*eps) return ans;
176 }
177 }
178 }
179 }
180 }
181 return ans;
182}
int G4int
Definition G4Types.hh:85

Referenced by CalculateL1CrossSection(), CalculateL2CrossSection(), and CalculateL3CrossSection().

◆ operator=()

G4ecpssrBaseLixsModel & G4ecpssrBaseLixsModel::operator= ( const G4ecpssrBaseLixsModel & right)
delete

The documentation for this class was generated from the following files: