100 22.5, 22.0, 21.0, 21.0, 20.0,
103 20.6, 20.6, 18.6, 15.8, 13.5, 6.5,
106 6.65, 6.22, 6.27, 6.5, 6.7, 6.2, 6.25, 5.9, 6.1, 5.75,
109 6.46, 5.7, 6.28, 5.8, 6.15, 5.6, 5.8, 5.2, 5.8,
112 6.2 , 5.9 , 5.9, 6.0, 5.8, 5.7, 5.4, 5.4,
115 5.6, 6.1, 5.57, 6.3, 5.5, 5.8, 4.7, 6.2, 6.4, 6.2,
118 6.5, 6.2, 6.5, 5.3, 6.4, 5.7, 5.7, 6.2, 5.7,
121 6.3, 5.8, 6.7, 5.8, 6.6, 6.1, 4.3,
124 6.2, 3.8, 5.6, 4.0, 4.0, 4.2, 4.2, 3.5 };
128 0.6761, 0.677, 0.6788, 0.6803, 0.685,
130 0.6889, 0.6914, 0.6991, 0.7068, 0.725, 0.7391,
132 0.74, 0.741, 0.742, 0.743, 0.744, 0.7509, 0.752, 0.7531, 0.7543, 0.7548,
134 0.7557, 0.7566, 0.7576,
136 0.7587, 0.7597, 0.7608, 0.762, 0.7632, 0.7644, 0.7675, 0.7686, 0.7697, 0.7709,
138 0.7714, 0.7721, 0.7723, 0.7733, 0.7743, 0.7753, 0.7764,
140 0.7775, 0.7786, 0.7801, 0.781, 0.7821, 0.7831, 0.7842, 0.7852,
142 0.7864, 0.7875, 0.7880, 0.7887, 0.7889, 0.7899, 0.7909, 0.7919, 0.7930,
144 0.7941, 0.7953, 0.7965, 0.7977, 0.7987, 0.7989,
146 0.7997, 0.8075, 0.8097, 0.8119, 0.8143, 0.8164, 0.8174, 0.8274 };
154 theParaMaker(verboseLevel), QFinterp(XREP) {
155 parms.first.resize(6,0.);
156 parms.second.resize(6,0.);
173 G4cout <<
" >>> G4EquilibriumEvaporator::deExcite" <<
G4endl;
181 const G4double prob_cut_off = 1.0e-15;
182 const G4double Q1[6] = { 0.0, 0.0, 2.23, 8.49, 7.72, 28.3 };
183 const G4int AN[6] = { 1, 1, 2, 3, 3, 4 };
184 const G4int Q[6] = { 0, 1, 1, 1, 2, 2 };
185 const G4double G[6] = { 2.0, 2.0, 6.0, 6.0, 6.0, 4.0 };
187 const G4double fisssion_cut = 1000.0;
188 const G4double cut_off_energy = 0.1;
191 const G4int itry_max = 1000;
192 const G4int itry_global_max = 1000;
194 const G4int itry_gam_max = 100;
205 toTheNucleiSystemRestFrame.
setBullet(dummy);
219 if (
EEXS < cut_off_energy) {
228 G4double coul_coeff = (
A >= 100.0) ? 1.4 : 1.2;
233 G4bool fission_open =
true;
234 G4int itry_global = 0;
237 while (try_again && itry_global < itry_global_max) {
246 G4cout <<
" A " <<
A <<
" Z " <<
Z <<
" mass " << nuc_mass
252 G4cout <<
" big bang in eql step " << itry_global <<
G4endl;
260 if (
EEXS < cut_off_energy) {
262 G4cout <<
" no energy for evaporation in eql step " << itry_global
275 const std::vector<G4double>& AK =
parms.first;
276 const std::vector<G4double>& CPA =
parms.second;
281 for (i = 0; i < 6; i++) {
284 u[i] = parlev * A1[i];
290 V[i] = coul_coeff *
Z * Q[i] * AK[i] / (1.0 +
EEXS / E0) /
292 TM[i] =
EEXS - QB - V[i] * A / A1[i];
294 G4cout <<
" i=" << i <<
" : QB " << QB <<
" u " << u[i]
295 <<
" V " << V[i] <<
" TM " << TM[i] <<
G4endl;
304 if (TM[0] > cut_off_energy) {
307 W[0] = BE * A13*A13 * G[0] * AL;
308 G4double TM1 = 2.0 * std::sqrt(u[0] * TM[0]) - ue;
310 if (TM1 > huge_num) TM1 = huge_num;
311 else if (TM1 < small) TM1 = small;
317 for (i = 1; i < 6; i++) {
319 if (TM[i] > cut_off_energy) {
321 W[i] = BE * A13*A13 * G[i] * (1.0 + CPA[i]);
322 G4double TM1 = 2.0 * std::sqrt(u[i] * TM[i]) - ue;
324 if (TM1 > huge_num) TM1 = huge_num;
325 else if (TM1 < small) TM1 = small;
334 if (A >= 100.0 && fission_open) {
337 G4double X = 0.019316 * X2 / (1.0 - 1.79 * X1 * X1);
342 G4double TM1 = 2.0 * std::sqrt(AF * EF) - ue;
344 if (TM1 > huge_num) TM1 = huge_num;
345 else if (TM1 < small) TM1 = small;
347 W[6] = BF *
G4Exp(TM1);
348 if (W[6] > fisssion_cut*W[0]) W[6] = fisssion_cut*W[0];
356 G4cout <<
" Evaporation probabilities: sum = " << prob_sum
357 <<
"\n\t n " << W[0] <<
" p " << W[1] <<
" d " << W[2]
358 <<
" He3 " << W[3] <<
"\n\t t " << W[4] <<
" alpha " << W[5]
359 <<
" fission " << W[6] <<
G4endl;
364 if (prob_sum < prob_cut_off) {
366 G4double T00 = 1.0 / (std::sqrt(u1 / UCR0) - 1.25 / UCR0);
372 while (EEXS > cut_off_energy && try_again) {
379 FMAX = (T04*T04*T04*T04) *
G4Exp((EEXS - T04) / T00);
381 FMAX = EEXS*EEXS*EEXS*
EEXS;
385 G4cout <<
" T04 " << T04 <<
" FMAX (EEXS^4) " << FMAX <<
G4endl;
388 while (itry < itry_max) {
396 if (itry == itry_max) {
413 G4cout <<
" nucleus px " <<
PEX.px() <<
" py " <<
PEX.py()
414 <<
" pz " <<
PEX.pz() <<
" E " <<
PEX.e() << G4endl
415 <<
" evaporate px " << mom.px() <<
" py " << mom.py()
416 <<
" pz " << mom.pz() <<
" E " << mom.e() <<
G4endl;
431 if (itry_gam == itry_gam_max) try_again =
false;
440 for (i = 0; i < 7; i++) {
448 if (icase < 0)
continue;
452 G4cout <<
" particle/light-ion escape ("
453 << (icase==0 ?
"neutron" : icase==1 ?
"proton" :
454 icase==2 ?
"deuteron" : icase==3 ?
"He3" :
455 icase==4 ?
"triton" : icase==5 ?
"alpha" :
"ERROR!")
459 G4double uc = 2.0 * std::sqrt(u[icase] * TM[icase]);
466 while (itry1 < itry_max && bad) {
472 while (itry < itry_max && EPR < 0.0) {
475 S = 0.5 * (uc * uc - uu * uu) / u[icase];
476 EPR = TM[icase] - S * A / (A - 1.0) + V[icase];
480 G4cout <<
" EPR " << EPR <<
" V " << V[icase]
481 <<
" S " << S <<
" EEXS " << EEXS <<
G4endl;
484 if (EPR > 0.0 && S > V[icase] && S < EEXS) {
486 G4cout <<
" escape itry1 " << itry1 <<
" icase "
487 << icase <<
" S (MeV) " << S <<
G4endl;
492 G4int ptype = 2 - icase;
500 G4double pmod = std::sqrt((2.0 * mass + S) * S);
507 G4cout <<
" nucleus px " <<
PEX.px() <<
" py " <<
PEX.py()
508 <<
" pz " <<
PEX.pz() <<
" E " <<
PEX.e() << G4endl
509 <<
" evaporate px " << mom.px() <<
" py " << mom.py()
510 <<
" pz " << mom.pz() <<
" E " << mom.e() <<
G4endl;
518 if (EEXS_new < 0.0)
continue;
537 G4cout <<
" nucleus A " << AN[icase] <<
" Z " << Q[icase]
538 <<
" escape icase " << icase <<
G4endl;
545 G4double pmod = std::sqrt((2.0 * mass + S) * S);
552 G4cout <<
" nucleus px " <<
PEX.px() <<
" py " <<
PEX.py()
553 <<
" pz " <<
PEX.pz() <<
" E " <<
PEX.e() << G4endl
554 <<
" evaporate px " << mom.px() <<
" py " << mom.py()
555 <<
" pz " << mom.pz() <<
" E " << mom.e() <<
G4endl;
563 if (EEXS_new < 0.0)
continue;
573 AN[icase], Q[icase], 0.*
GeV,
585 if (itry1 == itry_max || bad) try_again =
false;
588 G4cout <<
" fission: A " << A <<
" Z " <<
Z <<
" eexs " << EEXS
589 <<
" Wn " << W[0] <<
" Wf " << W[6] <<
G4endl;
609 fission_open =
false;
617 if (itry_global == itry_global_max) {
619 G4cout <<
" ! itry_global " << itry_global_max <<
G4endl;
643 G4cout <<
" >>> G4EquilibriumEvaporator::explosion? ";
649 G4bool bigb = (!(a >= 12 && z >= 0 && z < 3*(a-
z)) &&
661 G4cout <<
" >>> G4EquilibriumEvaporator::goodRemnant(" << a <<
"," << z
662 <<
")? " << (a>1 && z>0 && a>
z) <<
G4endl;
665 return a > 1 && z > 0 && a >
z;
674 G4cout <<
" >>> G4EquilibriumEvaporator::getQF ";
683 if (x < XMIN || x > XMAX) {
685 G4double FX = (0.73 + (3.33 * X1 - 0.66) * X1) * (X1*X1*X1);
687 QFF = G0 * FX * A13*
A13;
692 if (QFF < 0.0) QFF = 0.0;
705 G4cout <<
" >>> G4EquilibriumEvaporator::getAF" <<
G4endl;
709 G4double AF = 1.285 * (1.0 - e / 1100.0);
711 if(AF < 1.06) AF = 1.06;
721 G4cout <<
" >>> G4EquilibriumEvaporator::getPARLEVDEN" <<
G4endl;
732 G4cout <<
" >>> G4EquilibriumEvaporator::getE0" <<
G4endl;
virtual void setVerboseLevel(G4int verbose=0)
G4double getQF(G4double x, G4double x2, G4int a, G4int z, G4double e) const
virtual ~G4EquilibriumEvaporator()
virtual G4bool explosion(G4int a, G4int z, G4double e) const
G4double getAF(G4double x, G4int a, G4int z, G4double e) const
G4CollisionOutput fission_output
void addOutgoingParticle(const G4InuclElementaryParticle &particle)
static G4double getParticleMass(G4int type)
void setBullet(const G4InuclParticle *bullet)
G4LorentzVector backToTheLab(const G4LorentzVector &mom) const
G4CascadeInterpolator< 72 > QFinterp
G4bool goodRemnant(G4int a, G4int z) const
void getTargetData(const G4Fragment &target)
G4EquilibriumEvaporator()
G4GLOB_DLL std::ostream G4cout
G4double interpolate(const G4double x, const G4double(&yb)[nBins]) const
G4double getNucleiMass() const
std::pair< std::vector< G4double >, std::vector< G4double > > parms
void boostToLabFrame(const G4LorentzConvertor &convertor)
G4LorentzVector generateWithRandomAngles(G4double p, G4double mass=0.)
virtual void setVerboseLevel(G4int verbose)
G4double G4cbrt(G4double x)
G4double G4Log(G4double x)
G4double getE0(G4int A) const
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
const G4Fragment & makeFragment(G4LorentzVector mom, G4int A, G4int Z, G4double EX=0.)
G4double getPARLEVDEN(G4int A, G4int Z) const
const std::vector< G4InuclNuclei > & getOutgoingNuclei() const
const G4double x[NPOINTSGL]
static const G4double * SL[nLA]
const std::vector< G4InuclElementaryParticle > & getOutgoingParticles() const
G4InuclSpecialFunctions::paraMaker theParaMaker
void addOutgoingNucleus(const G4InuclNuclei &nuclei)
G4int numberOfFragments() const
virtual G4bool validateOutput(const G4Fragment &target, G4CollisionOutput &output)
void addRecoilFragment(const G4Fragment *aFragment)
const G4Fragment & getRecoilFragment(G4int index=0) const
virtual void deExcite(const G4Fragment &target, G4CollisionOutput &output)
void toTheTargetRestFrame()
void getParams(G4double Z, std::pair< std::vector< G4double >, std::vector< G4double > > &parms)
virtual void deExcite(const G4Fragment &target, G4CollisionOutput &output)
G4double bindingEnergy(G4int A, G4int Z)
virtual void deExcite(const G4Fragment &target, G4CollisionOutput &output)
void setTarget(const G4InuclParticle *target)
CLHEP::HepLorentzVector G4LorentzVector