Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ecpssrBaseKxsModel.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26
27//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
28
29#include <cmath>
30#include <iostream>
31
33
34#include "globals.hh"
36#include "G4SystemOfUnits.hh"
38#include "G4NistManager.hh"
39#include "G4Proton.hh"
40#include "G4Alpha.hh"
42
43//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
44
46{
47 verboseLevel=0;
48
49 // Storing C coefficients for high velocity formula
50
51 G4String fileC1("pixe/uf/c1");
52 tableC1 = new G4CrossSectionDataSet(new G4SemiLogInterpolation, 1.,1.);
53
54 G4String fileC2("pixe/uf/c2");
55 tableC2 = new G4CrossSectionDataSet(new G4SemiLogInterpolation, 1.,1.);
56
57 G4String fileC3("pixe/uf/c3");
58 tableC3 = new G4CrossSectionDataSet(new G4SemiLogInterpolation, 1.,1.);
59
60 // Storing FK data needed for medium velocities region
61 char *path = 0;
62
63 path = getenv("G4LEDATA");
64
65 if (!path) {
66 G4Exception("G4ecpssrBaseKxsModel::G4ecpssrBaseKxsModel()", "em0006", FatalException,"G4LEDATA environment variable not set" );
67 return;
68 }
69
70 std::ostringstream fileName;
71 fileName << path << "/pixe/uf/FK.dat";
72 std::ifstream FK(fileName.str().c_str());
73
74 if (!FK)
75 G4Exception("G4ecpssrBaseKxsModel::G4ecpssrBaseKxsModel()", "em0003", FatalException,"error opening FK data file" );
76
77 dummyVec.push_back(0.);
78
79 while(!FK.eof())
80 {
81 double x;
82 double y;
83
84 FK>>x>>y;
85
86 // Mandatory vector initialization
87 if (x != dummyVec.back())
88 {
89 dummyVec.push_back(x);
90 aVecMap[x].push_back(-1.);
91 }
92
93 FK>>FKData[x][y];
94
95 if (y != aVecMap[x].back()) aVecMap[x].push_back(y);
96
97 }
98
99 tableC1->LoadData(fileC1);
100 tableC2->LoadData(fileC2);
101 tableC3->LoadData(fileC3);
102
103}
104
105//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
106
107void print (G4double elem)
108{
109 G4cout << elem << " ";
110}
111//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
112
114{
115
116 delete tableC1;
117 delete tableC2;
118 delete tableC3;
119
120}
121
122//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
123
125
126{
127// this "ExpIntFunction" function allows fast evaluation of the n order exponential integral function En(x)
128
129 G4int i;
130 G4int ii;
131 G4int nm1;
132 G4double a;
133 G4double b;
134 G4double c;
135 G4double d;
136 G4double del;
137 G4double fact;
138 G4double h;
139 G4double psi;
140 G4double ans = 0;
141 const G4double euler= 0.5772156649;
142 const G4int maxit= 100;
143 const G4double fpmin = 1.0e-30;
144 const G4double eps = 1.0e-7;
145 nm1=n-1;
146 if (n<0 || x<0.0 || (x==0.0 && (n==0 || n==1))) {
147 G4cout << "*** WARNING in G4ecpssrBaseKxsModel::ExpIntFunction: bad arguments in ExpIntFunction" << G4endl;
148 G4cout << n << ", " << x << G4endl;
149 }
150 else {
151 if (n==0) ans=std::exp(-x)/x;
152 else {
153 if (x==0.0) ans=1.0/nm1;
154 else {
155 if (x > 1.0) {
156 b=x+n;
157 c=1.0/fpmin;
158 d=1.0/b;
159 h=d;
160 for (i=1;i<=maxit;i++) {
161 a=-i*(nm1+i);
162 b +=2.0;
163 d=1.0/(a*d+b);
164 c=b+a/c;
165 del=c*d;
166 h *=del;
167 if (std::fabs(del-1.0) < eps) {
168 ans=h*std::exp(-x);
169 return ans;
170 }
171 }
172 } else {
173 ans = (nm1!=0 ? 1.0/nm1 : -std::log(x)-euler);
174 fact=1.0;
175 for (i=1;i<=maxit;i++) {
176 fact *=-x/i;
177 if (i !=nm1) del = -fact/(i-nm1);
178 else {
179 psi = -euler;
180 for (ii=1;ii<=nm1;ii++) psi +=1.0/ii;
181 del=fact*(-std::log(x)+psi);
182 }
183 ans += del;
184 if (std::fabs(del) < std::fabs(ans)*eps) return ans;
185 }
186 }
187 }
188 }
189 }
190return ans;
191}
192
193//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
194
195
197
198{
199
200 // this K-CrossSection calculation method is done according to W.Brandt and G.Lapicki, Phys.Rev.A23(1981)//
201
202 G4NistManager* massManager = G4NistManager::Instance();
203
205
206 G4double zIncident = 0;
207 G4Proton* aProtone = G4Proton::Proton();
208 G4Alpha* aAlpha = G4Alpha::Alpha();
209
210 if (massIncident == aProtone->GetPDGMass() )
211 {
212 zIncident = (aProtone->GetPDGCharge())/eplus;
213 }
214 else
215 {
216 if (massIncident == aAlpha->GetPDGMass())
217 {
218 zIncident = (aAlpha->GetPDGCharge())/eplus;
219 }
220 else
221 {
222 G4cout << "*** WARNING in G4ecpssrBaseKxsModel::CalculateCrossSection : we can treat only Proton or Alpha incident particles " << G4endl;
223 return 0;
224 }
225 }
226
227 if (verboseLevel>0) G4cout << " massIncident=" << massIncident<< G4endl;
228
229 G4double kBindingEnergy = transitionManager->Shell(zTarget,0)->BindingEnergy();
230
231 if (verboseLevel>0) G4cout << " kBindingEnergy=" << kBindingEnergy/eV<< G4endl;
232
233 G4double massTarget = (massManager->GetAtomicMassAmu(zTarget))*amu_c2;
234
235 if (verboseLevel>0) G4cout << " massTarget=" << massTarget<< G4endl;
236
237 G4double systemMass =((massIncident*massTarget)/(massIncident+massTarget))/electron_mass_c2; //the mass of the system (projectile, target)
238
239 if (verboseLevel>0) G4cout << " systemMass=" << systemMass<< G4endl;
240
241 const G4double zkshell= 0.3;
242 // *** see Brandt, Phys Rev A23, p 1727
243
244 G4double screenedzTarget = zTarget-zkshell; // screenedzTarget is the screened nuclear charge of the target
245 // *** see Brandt, Phys Rev A23, p 1727
246
247 const G4double rydbergMeV= 13.6056923e-6;
248
249 G4double tetaK = kBindingEnergy/((screenedzTarget*screenedzTarget)*rydbergMeV); //tetaK denotes the reduced binding energy of the electron
250 // *** see Rice, ADANDT 20, p 504, f 2
251
252 if (verboseLevel>0) G4cout << " tetaK=" << tetaK<< G4endl;
253
254 G4double velocity =(2./(tetaK*screenedzTarget))*std::pow(((energyIncident*electron_mass_c2)/(massIncident*rydbergMeV)),0.5);
255 // *** also called xiK
256 // *** see Brandt, Phys Rev A23, p 1727
257 // *** see Basbas, Phys Rev A17, p 1656, f4
258
259 if (verboseLevel>0) G4cout << " velocity=" << velocity<< G4endl;
260
261 const G4double bohrPow2Barn=(Bohr_radius*Bohr_radius)/barn ;
262
263 if (verboseLevel>0) G4cout << " bohrPow2Barn=" << bohrPow2Barn<< G4endl;
264
265 G4double sigma0 = 8.*pi*(zIncident*zIncident)*bohrPow2Barn*std::pow(screenedzTarget,-4.); //sigma0 is the initial cross section of K shell at stable state
266 // *** see Benka, ADANDT 22, p 220, f2, for protons
267 // *** see Basbas, Phys Rev A7, p 1000
268
269 if (verboseLevel>0) G4cout << " sigma0=" << sigma0<< G4endl;
270
271 const G4double kAnalyticalApproximation= 1.5;
272 G4double x = kAnalyticalApproximation/velocity;
273 // *** see Brandt, Phys Rev A23, p 1727
274 // *** see Brandt, Phys Rev A20, p 469, f16 in expression of h
275
276 if (verboseLevel>0) G4cout << " x=" << x<< G4endl;
277
278 G4double electrIonizationEnergy;
279 // *** see Basbas, Phys Rev A17, p1665, f27
280 // *** see Brandt, Phys Rev A20, p469
281 // *** see Liu, Comp Phys Comm 97, p325, f A5
282
283 if ((0.< x) && (x <= 0.035))
284 {
285 electrIonizationEnergy= 0.75*pi*(std::log(1./(x*x))-1.);
286 }
287 else
288 {
289 if ( (0.035 < x) && (x <=3.))
290 {
291 electrIonizationEnergy =std::exp(-2.*x)/(0.031+(0.213*std::pow(x,0.5))+(0.005*x)-(0.069*std::pow(x,3./2.))+(0.324*x*x));
292 }
293
294 else
295 {
296 if ( (3.< x) && (x<=11.))
297 {
298 electrIonizationEnergy =2.*std::exp(-2.*x)/std::pow(x,1.6);
299 }
300
301 else electrIonizationEnergy =0.;
302 }
303 }
304
305 if (verboseLevel>0) G4cout << " electrIonizationEnergy=" << electrIonizationEnergy<< G4endl;
306
307 G4double hFunction =(electrIonizationEnergy*2.)/(tetaK*std::pow(velocity,3)); //hFunction represents the correction for polarization effet
308 // *** see Brandt, Phys Rev A20, p 469, f16
309
310 if (verboseLevel>0) G4cout << " hFunction=" << hFunction<< G4endl;
311
312 G4double gFunction = (1.+(9.*velocity)+(31.*velocity*velocity)+(98.*std::pow(velocity,3.))+(12.*std::pow(velocity,4.))+(25.*std::pow(velocity,5.))
313 +(4.2*std::pow(velocity,6.))+(0.515*std::pow(velocity,7.)))/std::pow(1.+velocity,9.); //gFunction represents the correction for binding effet
314 // *** see Brandt, Phys Rev A20, p 469, f19
315
316 if (verboseLevel>0) G4cout << " gFunction=" << gFunction<< G4endl;
317
318 //-----------------------------------------------------------------------------------------------------------------------------
319
320 G4double sigmaPSS = 1.+(((2.*zIncident)/(screenedzTarget*tetaK))*(gFunction-hFunction)); //describes the perturbed stationnairy state of the affected atomic electon
321 // *** also called dzeta
322 // *** also called epsilon
323 // *** see Basbas, Phys Rev A17, p1667, f45
324
325 if (verboseLevel>0) G4cout << " sigmaPSS=" << sigmaPSS<< G4endl;
326
327 if (verboseLevel>0) G4cout << " sigmaPSS*tetaK=" << sigmaPSS*tetaK<< G4endl;
328
329 //----------------------------------------------------------------------------------------------------------------------------
330
331 const G4double cNaturalUnit= 1/fine_structure_const; // it's the speed of light according to Atomic-Unit-System
332
333 if (verboseLevel>0) G4cout << " cNaturalUnit=" << cNaturalUnit<< G4endl;
334
335 G4double ykFormula=0.4*(screenedzTarget/cNaturalUnit)*(screenedzTarget/cNaturalUnit)/(velocity/sigmaPSS);
336 // *** also called yS
337 // *** see Brandt, Phys Rev A20, p467, f6
338 // *** see Brandt, Phys Rev A23, p1728
339
340 if (verboseLevel>0) G4cout << " ykFormula=" << ykFormula<< G4endl;
341
342 G4double relativityCorrection = std::pow((1.+(1.1*ykFormula*ykFormula)),0.5)+ykFormula;// the relativistic correction parameter
343 // *** also called mRS
344 // *** see Brandt, Phys Rev A20, p467, f6
345
346 if (verboseLevel>0) G4cout << " relativityCorrection=" << relativityCorrection<< G4endl;
347
348 G4double reducedVelocity = velocity*std::pow(relativityCorrection,0.5); // presents the reduced collision velocity parameter
349 // *** also called xiR
350 // *** see Brandt, Phys Rev A20, p468, f7
351 // *** see Brandt, Phys Rev A23, p1728
352
353 if (verboseLevel>0) G4cout << " reducedVelocity=" << reducedVelocity<< G4endl;
354
355 G4double etaOverTheta2 = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget)
356 /(sigmaPSS*tetaK)/(sigmaPSS*tetaK);
357 // *** see Benka, ADANDT 22, p220, f4 for eta
358 // then we use sigmaPSS*tetaK == epsilon*tetaK
359
360 if (verboseLevel>0) G4cout << " etaOverTheta2=" << etaOverTheta2<< G4endl;
361
362 G4double universalFunction = 0;
363
364 // low velocity formula
365 // *****************
366 if ( velocity < 1. )
367 // OR
368 //if ( reducedVelocity/sigmaPSS < 1.)
369 // *** see Brandt, Phys Rev A23, p1727
370 // *** reducedVelocity/sigmaPSS is also called xiR/dzeta
371 // *****************
372 {
373 if (verboseLevel>0) G4cout << " Notice : FK is computed from low velocity formula" << G4endl;
374
375 universalFunction = (std::pow(2.,9.)/45.)*std::pow(reducedVelocity/sigmaPSS,8.)*std::pow((1.+(1.72*(reducedVelocity/sigmaPSS)*(reducedVelocity/sigmaPSS))),-4.);// is the reduced universal cross section
376 // *** see Brandt, Phys Rev A23, p1728
377
378 if (verboseLevel>0) G4cout << " universalFunction by Brandt 1981 =" << universalFunction<< G4endl;
379
380 }
381
382 else
383
384 {
385
386 if ( etaOverTheta2 > 86.6 && (sigmaPSS*tetaK) > 0.4 && (sigmaPSS*tetaK) < 2.9996 )
387 {
388 // High and medium energies. Method from Rice ADANDT 20, p506, 1977 on tables from Benka 1978
389
390 if (verboseLevel>0) G4cout << " Notice : FK is computed from high velocity formula" << G4endl;
391
392 if (verboseLevel>0) G4cout << " sigmaPSS*tetaK=" << sigmaPSS*tetaK << G4endl;
393
394 G4double C1= tableC1->FindValue(sigmaPSS*tetaK);
395 G4double C2= tableC2->FindValue(sigmaPSS*tetaK);
396 G4double C3= tableC3->FindValue(sigmaPSS*tetaK);
397
398 if (verboseLevel>0) G4cout << " C1=" << C1 << G4endl;
399 if (verboseLevel>0) G4cout << " C2=" << C2 << G4endl;
400 if (verboseLevel>0) G4cout << " C3=" << C3 << G4endl;
401
402 G4double etaK = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget);
403 // *** see Benka, ADANDT 22, p220, f4 for eta
404
405 if (verboseLevel>0) G4cout << " etaK=" << etaK << G4endl;
406
407 G4double etaT = (sigmaPSS*tetaK)*(sigmaPSS*tetaK)*(86.6); // at any theta, the largest tabulated etaOverTheta2 is 86.6
408 // *** see Rice, ADANDT 20, p506
409
410 if (verboseLevel>0) G4cout << " etaT=" << etaT << G4endl;
411
412 G4double fKT = FunctionFK((sigmaPSS*tetaK),86.6)*(etaT/(sigmaPSS*tetaK));
413 // *** see Rice, ADANDT 20, p506
414
415 if (FunctionFK((sigmaPSS*tetaK),86.6)<=0.)
416 {
417 G4cout <<
418 "*** WARNING in G4ecpssrBaseKxsModel::CalculateCrossSection : unable to interpolate FK function in high velocity region ! ***" << G4endl;
419 return 0;
420 }
421
422 if (verboseLevel>0) G4cout << " FunctionFK=" << FunctionFK((sigmaPSS*tetaK),86.6) << G4endl;
423
424 if (verboseLevel>0) G4cout << " fKT=" << fKT << G4endl;
425
426 G4double GK = C2/(4*etaK) + C3/(32*etaK*etaK);
427
428 if (verboseLevel>0) G4cout << " GK=" << GK << G4endl;
429
430 G4double GT = C2/(4*etaT) + C3/(32*etaT*etaT);
431
432 if (verboseLevel>0) G4cout << " GT=" << GT << G4endl;
433
434 G4double DT = fKT - C1*std::log(etaT) + GT;
435
436 if (verboseLevel>0) G4cout << " DT=" << DT << G4endl;
437
438 G4double fKK = C1*std::log(etaK) + DT - GK;
439
440 if (verboseLevel>0) G4cout << " fKK=" << fKK << G4endl;
441
442 G4double universalFunction3= fKK/(etaK/tetaK);
443 // *** see Rice, ADANDT 20, p505, f7
444
445 if (verboseLevel>0) G4cout << " universalFunction3=" << universalFunction3 << G4endl;
446
447 universalFunction=universalFunction3;
448
449 }
450
451 else if ( etaOverTheta2 >= 1.e-3 && etaOverTheta2 <= 86.6 && (sigmaPSS*tetaK) >= 0.4 && (sigmaPSS*tetaK) <= 2.9996 )
452
453 {
454 // From Benka 1978
455
456 if (verboseLevel>0) G4cout << " Notice : FK is computed from INTERPOLATED data" << G4endl;
457
458 G4double universalFunction2 = FunctionFK((sigmaPSS*tetaK),etaOverTheta2);
459
460 if (universalFunction2<=0)
461 {
462 G4cout <<
463 "*** WARNING : G4ecpssrBaseKxsModel::CalculateCrossSection is unable to interpolate FK function in medium velocity region ! ***" << G4endl;
464 return 0;
465 }
466
467 if (verboseLevel>0) G4cout << " universalFunction2=" << universalFunction2 << " for theta=" << sigmaPSS*tetaK << " and etaOverTheta2=" << etaOverTheta2 << G4endl;
468
469 universalFunction=universalFunction2;
470 }
471
472 }
473
474 //----------------------------------------------------------------------------------------------------------------------
475
476 G4double sigmaPSSR = (sigma0/(sigmaPSS*tetaK))*universalFunction; //sigmaPSSR is the straight-line K-shell ionization cross section
477 // *** see Benka, ADANDT 22, p220, f1
478
479 if (verboseLevel>0) G4cout << " sigmaPSSR=" << sigmaPSSR<< G4endl;
480
481 //-----------------------------------------------------------------------------------------------------------------------
482
483 G4double pssDeltaK = (4./(systemMass*sigmaPSS*tetaK))*(sigmaPSS/velocity)*(sigmaPSS/velocity);
484 // *** also called dzetaK*deltaK
485 // *** see Brandt, Phys Rev A23, p1727, f B2
486
487 if (verboseLevel>0) G4cout << " pssDeltaK=" << pssDeltaK<< G4endl;
488
489 if (pssDeltaK>1) return 0.;
490
491 G4double energyLoss = std::pow(1-pssDeltaK,0.5); //energyLoss incorporates the straight-line energy-loss
492 // *** also called zK
493 // *** see Brandt, Phys Rev A23, p1727, after f B2
494
495 if (verboseLevel>0) G4cout << " energyLoss=" << energyLoss<< G4endl;
496
497 G4double energyLossFunction = (std::pow(2.,-9)/8.)*((((9.*energyLoss)-1.)*std::pow(1.+energyLoss,9.))+(((9.*energyLoss)+1.)*std::pow(1.-energyLoss,9.)));//energy loss function
498 // *** also called fs
499 // *** see Brandt, Phys Rev A23, p1718, f7
500
501 if (verboseLevel>0) G4cout << " energyLossFunction=" << energyLossFunction<< G4endl;
502
503 //----------------------------------------------------------------------------------------------------------------------------------------------
504
505 G4double coulombDeflection = (4.*pi*zIncident/systemMass)*std::pow(tetaK*sigmaPSS,-2.)*std::pow(velocity/sigmaPSS,-3.)*(zTarget/screenedzTarget); //incorporates Coulomb deflection parameter
506 // *** see Brandt, Phys Rev A23, p1727, f B3
507
508 if (verboseLevel>0) G4cout << " cParameter-short=" << coulombDeflection<< G4endl;
509
510 G4double cParameter = 2.*coulombDeflection/(energyLoss*(energyLoss+1.));
511 // *** see Brandt, Phys Rev A23, p1727, f B4
512
513 if (verboseLevel>0) G4cout << " cParameter-full=" << cParameter<< G4endl;
514
515 G4double coulombDeflectionFunction = 9.*ExpIntFunction(10,cParameter); //this function describes Coulomb-deflection effect
516 // *** see Brandt, Phys Rev A23, p1727
517
518 if (verboseLevel>0) G4cout << " ExpIntFunction(10,cParameter) =" << ExpIntFunction(10,cParameter) << G4endl;
519
520 if (verboseLevel>0) G4cout << " coulombDeflectionFunction =" << coulombDeflectionFunction << G4endl;
521
522 //--------------------------------------------------------------------------------------------------------------------------------------------------
523
524 G4double crossSection = 0;
525
526 crossSection = energyLossFunction* coulombDeflectionFunction*sigmaPSSR; //this ECPSSR cross section is estimated at perturbed-stationnairy-state(PSS)
527 //and it's reduced by the energy-loss(E),the Coulomb deflection(C),
528 //and the relativity(R) effects
529
530 //--------------------------------------------------------------------------------------------------------------------------------------------------
531
532 if (crossSection >= 0) {
533 return crossSection * barn;
534 }
535 else {return 0;}
536
537}
538
539//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
540
541G4double G4ecpssrBaseKxsModel::FunctionFK(G4double k, G4double theta)
542{
543
544 G4double sigma = 0.;
545 G4double valueT1 = 0;
546 G4double valueT2 = 0;
547 G4double valueE21 = 0;
548 G4double valueE22 = 0;
549 G4double valueE12 = 0;
550 G4double valueE11 = 0;
551 G4double xs11 = 0;
552 G4double xs12 = 0;
553 G4double xs21 = 0;
554 G4double xs22 = 0;
555
556 // PROTECTION TO ALLOW INTERPOLATION AT MINIMUM AND MAXIMUM EtaK/Theta2 values
557 // (in particular for FK computation at 8.66EXX for high velocity formula)
558
559 if (
560 theta==8.66e-3 ||
561 theta==8.66e-2 ||
562 theta==8.66e-1 ||
563 theta==8.66e+0 ||
564 theta==8.66e+1
565 ) theta=theta-1e-12;
566
567 if (
568 theta==1.e-3 ||
569 theta==1.e-2 ||
570 theta==1.e-1 ||
571 theta==1.e+00 ||
572 theta==1.e+01
573 ) theta=theta+1e-12;
574
575 // END PROTECTION
576
577 std::vector<double>::iterator t2 = std::upper_bound(dummyVec.begin(),dummyVec.end(), k);
578 std::vector<double>::iterator t1 = t2-1;
579
580 std::vector<double>::iterator e12 = std::upper_bound(aVecMap[(*t1)].begin(),aVecMap[(*t1)].end(), theta);
581 std::vector<double>::iterator e11 = e12-1;
582
583 std::vector<double>::iterator e22 = std::upper_bound(aVecMap[(*t2)].begin(),aVecMap[(*t2)].end(), theta);
584 std::vector<double>::iterator e21 = e22-1;
585
586 valueT1 =*t1;
587 valueT2 =*t2;
588 valueE21 =*e21;
589 valueE22 =*e22;
590 valueE12 =*e12;
591 valueE11 =*e11;
592
593 xs11 = FKData[valueT1][valueE11];
594 xs12 = FKData[valueT1][valueE12];
595 xs21 = FKData[valueT2][valueE21];
596 xs22 = FKData[valueT2][valueE22];
597
598/*
599 if (verboseLevel>0)
600 {
601 G4cout << "x1= " << valueT1 << G4endl;
602 G4cout << " vector of y for x1" << G4endl;
603 std::for_each (aVecMap[(*t1)].begin(),aVecMap[(*t1)].end(), print);
604 G4cout << G4endl;
605 G4cout << "x2= " << valueT2 << G4endl;
606 G4cout << " vector of y for x2" << G4endl;
607 std::for_each (aVecMap[(*t2)].begin(),aVecMap[(*t2)].end(), print);
608
609 G4cout << G4endl;
610 G4cout
611 << " "
612 << valueT1 << " "
613 << valueT2 << " "
614 << valueE11 << " "
615 << valueE12 << " "
616 << valueE21<< " "
617 << valueE22 << " "
618 << xs11 << " "
619 << xs12 << " "
620 << xs21 << " "
621 << xs22 << " "
622 << G4endl;
623 }
624*/
625
626 G4double xsProduct = xs11 * xs12 * xs21 * xs22;
627
628 if (xs11==0 || xs12==0 ||xs21==0 ||xs22==0) return (0.);
629
630 if (xsProduct != 0.)
631 {
632 sigma = QuadInterpolator( valueE11, valueE12,
633 valueE21, valueE22,
634 xs11, xs12,
635 xs21, xs22,
636 valueT1, valueT2,
637 k, theta );
638 }
639
640 return sigma;
641}
642
643//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
644
645G4double G4ecpssrBaseKxsModel::LinLogInterpolate(G4double e1,
646 G4double e2,
647 G4double e,
648 G4double xs1,
649 G4double xs2)
650{
651 G4double d1 = std::log(xs1);
652 G4double d2 = std::log(xs2);
653 G4double value = std::exp(d1 + (d2 - d1)*(e - e1)/ (e2 - e1));
654 return value;
655}
656
657//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
658
659G4double G4ecpssrBaseKxsModel::LogLogInterpolate(G4double e1,
660 G4double e2,
661 G4double e,
662 G4double xs1,
663 G4double xs2)
664{
665 G4double a = (std::log10(xs2)-std::log10(xs1)) / (std::log10(e2)-std::log10(e1));
666 G4double b = std::log10(xs2) - a*std::log10(e2);
667 G4double sigma = a*std::log10(e) + b;
668 G4double value = (std::pow(10.,sigma));
669 return value;
670}
671
672//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
673
674G4double G4ecpssrBaseKxsModel::QuadInterpolator(G4double e11, G4double e12,
675 G4double e21, G4double e22,
676 G4double xs11, G4double xs12,
677 G4double xs21, G4double xs22,
678 G4double t1, G4double t2,
679 G4double t, G4double e)
680{
681// Log-Log
682 G4double interpolatedvalue1 = LogLogInterpolate(e11, e12, e, xs11, xs12);
683 G4double interpolatedvalue2 = LogLogInterpolate(e21, e22, e, xs21, xs22);
684 G4double value = LogLogInterpolate(t1, t2, t, interpolatedvalue1, interpolatedvalue2);
685
686/*
687// Lin-Log
688 G4double interpolatedvalue1 = LinLogInterpolate(e11, e12, e, xs11, xs12);
689 G4double interpolatedvalue2 = LinLogInterpolate(e21, e22, e, xs21, xs22);
690 G4double value = LinLogInterpolate(t1, t2, t, interpolatedvalue1, interpolatedvalue2);
691*/
692 return value;
693}
694
695
696
697
698
@ GT
Definition: Evaluator.cc:66
@ FatalException
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
void print(G4double elem)
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
#define C1
#define C3
static G4Alpha * Alpha()
Definition: G4Alpha.cc:89
G4double BindingEnergy() const
G4AtomicShell * Shell(G4int Z, size_t shellIndex) const
static G4AtomicTransitionManager * Instance()
virtual G4bool LoadData(const G4String &argFileName)
virtual G4double FindValue(G4double e, G4int componentId=0) const
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
G4double GetPDGCharge() const
static G4Proton * Proton()
Definition: G4Proton.cc:93
G4double CalculateCrossSection(G4int, G4double, G4double)
G4double ExpIntFunction(G4int n, G4double x)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41