94 using namespace G4InuclParticleNames;
95 using namespace G4InuclSpecialFunctions;
101 22.5, 22.0, 21.0, 21.0, 20.0,
104 20.6, 20.6, 18.6, 15.8, 13.5, 6.5,
107 6.65, 6.22, 6.27, 6.5, 6.7, 6.2, 6.25, 5.9, 6.1, 5.75,
110 6.46, 5.7, 6.28, 5.8, 6.15, 5.6, 5.8, 5.2, 5.8,
113 6.2 , 5.9 , 5.9, 6.0, 5.8, 5.7, 5.4, 5.4,
116 5.6, 6.1, 5.57, 6.3, 5.5, 5.8, 4.7, 6.2, 6.4, 6.2,
119 6.5, 6.2, 6.5, 5.3, 6.4, 5.7, 5.7, 6.2, 5.7,
122 6.3, 5.8, 6.7, 5.8, 6.6, 6.1, 4.3,
125 6.2, 3.8, 5.6, 4.0, 4.0, 4.2, 4.2, 3.5 };
129 0.6761, 0.677, 0.6788, 0.6803, 0.685,
131 0.6889, 0.6914, 0.6991, 0.7068, 0.725, 0.7391,
133 0.74, 0.741, 0.742, 0.743, 0.744, 0.7509, 0.752, 0.7531, 0.7543, 0.7548,
135 0.7557, 0.7566, 0.7576,
137 0.7587, 0.7597, 0.7608, 0.762, 0.7632, 0.7644, 0.7675, 0.7686, 0.7697, 0.7709,
139 0.7714, 0.7721, 0.7723, 0.7733, 0.7743, 0.7753, 0.7764,
141 0.7775, 0.7786, 0.7801, 0.781, 0.7821, 0.7831, 0.7842, 0.7852,
143 0.7864, 0.7875, 0.7880, 0.7887, 0.7889, 0.7899, 0.7909, 0.7919, 0.7930,
145 0.7941, 0.7953, 0.7965, 0.7977, 0.7987, 0.7989,
147 0.7997, 0.8075, 0.8097, 0.8119, 0.8143, 0.8164, 0.8174, 0.8274 };
155 theParaMaker(verboseLevel), QFinterp(XREP) {
156 parms.first.resize(6,0.);
157 parms.second.resize(6,0.);
174 G4cout <<
" >>> G4EquilibriumEvaporator::deExcite" <<
G4endl;
193 const G4double prob_cut_off = 1.0e-15;
194 const G4double Q1[6] = { 0.0, 0.0, 2.23, 8.49, 7.72, 28.3 };
195 const G4int AN[6] = { 1, 1, 2, 3, 3, 4 };
196 const G4int Q[6] = { 0, 1, 1, 1, 2, 2 };
197 const G4double G[6] = { 2.0, 2.0, 6.0, 6.0, 6.0, 4.0 };
199 const G4double fisssion_cut = 1000.0;
200 const G4double cut_off_energy = 0.1;
203 const G4int itry_max = 1000;
204 const G4int itry_global_max = 1000;
206 const G4int itry_gam_max = 100;
221 toTheNucleiSystemRestFrame.
setBullet(dummy);
226 if (explosion(
A,
Z,
EEXS)) {
228 theBigBanger.
deExcite(target, output);
235 if (
EEXS < cut_off_energy) {
244 G4double coul_coeff = (
A >= 100.0) ? 1.4 : 1.2;
249 G4bool fission_open =
true;
250 G4int itry_global = 0;
253 while (try_again && itry_global < itry_global_max) {
262 G4cout <<
" A " <<
A <<
" Z " <<
Z <<
" mass " << nuc_mass
266 if (explosion(
A,
Z,
EEXS)) {
268 G4cout <<
" big bang in eql step " << itry_global <<
G4endl;
276 if (
EEXS < cut_off_energy) {
278 G4cout <<
" no energy for evaporation in eql step " << itry_global
291 const std::vector<G4double>& AK = parms.first;
292 const std::vector<G4double>& CPA = parms.second;
297 for (i = 0; i < 6; i++) {
300 u[i] = parlev * A1[i];
304 if (goodRemnant(A1[i], Z1[i])) {
306 V[i] = coul_coeff *
Z * Q[i] * AK[i] / (1.0 +
EEXS / E0) /
308 TM[i] =
EEXS - QB - V[i] * A / A1[i];
310 G4cout <<
" i=" << i <<
" : QB " << QB <<
" u " << u[i]
311 <<
" V " << V[i] <<
" TM " << TM[i] <<
G4endl;
320 if (TM[0] > cut_off_energy) {
323 W[0] = BE * A13*A13 * G[0] * AL;
324 G4double TM1 = 2.0 * std::sqrt(u[0] * TM[0]) - ue;
326 if (TM1 > huge_num) TM1 = huge_num;
327 else if (TM1 < small) TM1 = small;
333 for (i = 1; i < 6; i++) {
335 if (TM[i] > cut_off_energy) {
337 W[i] = BE * A13*A13 * G[i] * (1.0 + CPA[i]);
338 G4double TM1 = 2.0 * std::sqrt(u[i] * TM[i]) - ue;
340 if (TM1 > huge_num) TM1 = huge_num;
341 else if (TM1 < small) TM1 = small;
350 if (A >= 100.0 && fission_open) {
353 G4double X = 0.019316 * X2 / (1.0 - 1.79 * X1 * X1);
354 G4double EF = EEXS - getQF(X, X2, A,
Z, EEXS);
358 G4double TM1 = 2.0 * std::sqrt(AF * EF) - ue;
360 if (TM1 > huge_num) TM1 = huge_num;
361 else if (TM1 < small) TM1 = small;
363 W[6] = BF *
G4Exp(TM1);
364 if (W[6] > fisssion_cut*W[0]) W[6] = fisssion_cut*W[0];
372 G4cout <<
" Evaporation probabilities: sum = " << prob_sum
373 <<
"\n\t n " << W[0] <<
" p " << W[1] <<
" d " << W[2]
374 <<
" He3 " << W[3] <<
"\n\t t " << W[4] <<
" alpha " << W[5]
375 <<
" fission " << W[6] <<
G4endl;
380 if (prob_sum < prob_cut_off) {
382 G4double T00 = 1.0 / (std::sqrt(u1 / UCR0) - 1.25 / UCR0);
388 while (EEXS > cut_off_energy && try_again) {
395 FMAX = (T04*T04*T04*T04) *
G4Exp((EEXS - T04) / T00);
397 FMAX = EEXS*EEXS*EEXS*
EEXS;
401 G4cout <<
" T04 " << T04 <<
" FMAX (EEXS^4) " << FMAX <<
G4endl;
404 while (itry < itry_max) {
412 if (itry == itry_max) {
430 <<
" pz " <<
PEX.
pz() <<
" E " <<
PEX.
e() << G4endl
431 <<
" evaporate px " << mom.
px() <<
" py " << mom.
py()
432 <<
" pz " << mom.
pz() <<
" E " << mom.
e() <<
G4endl;
447 if (itry_gam == itry_gam_max) try_again =
false;
456 for (i = 0; i < 7; i++) {
464 if (icase < 0)
continue;
468 G4cout <<
" particle/light-ion escape ("
469 << (icase==0 ?
"neutron" : icase==1 ?
"proton" :
470 icase==2 ?
"deuteron" : icase==3 ?
"He3" :
471 icase==4 ?
"triton" : icase==5 ?
"alpha" :
"ERROR!")
475 G4double Xmax = (std::sqrt(u[icase]*TM[icase] + 0.25) - 0.5)/u[icase];
479 while (itry1 < itry_max && bad) {
486 while (itry < itry_max) {
491 Ptest = (X/Xmax)*
G4Exp(-2.*u[icase]*Xmax + 2.*std::sqrt(u[icase]*(TM[icase] - X)));
498 if (S > V[icase] && S < EEXS) {
501 G4cout <<
" escape itry1 " << itry1 <<
" icase "
502 << icase <<
" S (MeV) " << S <<
G4endl;
507 G4int ptype = 2 - icase;
515 G4double pmod = std::sqrt((2.0 * mass + S) * S);
523 <<
" pz " <<
PEX.
pz() <<
" E " <<
PEX.
e() << G4endl
524 <<
" evaporate px " << mom.
px() <<
" py " << mom.
py()
525 <<
" pz " << mom.
pz() <<
" E " << mom.
e() <<
G4endl;
533 if (EEXS_new < 0.0)
continue;
552 G4cout <<
" nucleus A " << AN[icase] <<
" Z " << Q[icase]
553 <<
" escape icase " << icase <<
G4endl;
560 G4double pmod = std::sqrt((2.0 * mass + S) * S);
568 <<
" pz " <<
PEX.
pz() <<
" E " <<
PEX.
e() << G4endl
569 <<
" evaporate px " << mom.
px() <<
" py " << mom.
py()
570 <<
" pz " << mom.
pz() <<
" E " << mom.
e() <<
G4endl;
578 if (EEXS_new < 0.0)
continue;
588 AN[icase], Q[icase], 0.*
GeV,
600 if (itry1 == itry_max || bad) try_again =
false;
603 G4cout <<
" fission: A " << A <<
" Z " <<
Z <<
" eexs " << EEXS
604 <<
" Wn " << W[0] <<
" Wf " << W[6] <<
G4endl;
608 fission_output.
reset();
624 fission_open =
false;
632 if (itry_global == itry_global_max) {
634 G4cout <<
" ! itry_global " << itry_global_max <<
G4endl;
658 G4cout <<
" >>> G4EquilibriumEvaporator::explosion? ";
664 G4bool bigb = (!(a >= 12 && z >= 0 && z < 3*(a-
z)) &&
673 G4bool G4EquilibriumEvaporator::goodRemnant(
G4int a,
676 G4cout <<
" >>> G4EquilibriumEvaporator::goodRemnant(" << a <<
"," << z
677 <<
")? " << (a>1 && z>0 && a>
z) <<
G4endl;
680 return a > 1 && z > 0 && a >
z;
689 G4cout <<
" >>> G4EquilibriumEvaporator::getQF ";
698 if (x < XMIN || x > XMAX) {
700 G4double FX = (0.73 + (3.33 * X1 - 0.66) * X1) * (X1*X1*X1);
702 QFF = G0 * FX * A13*
A13;
707 if (QFF < 0.0) QFF = 0.0;
720 G4cout <<
" >>> G4EquilibriumEvaporator::getAF" <<
G4endl;
724 G4double AF = 1.285 * (1.0 - e / 1100.0);
726 if(AF < 1.06) AF = 1.06;
736 G4cout <<
" >>> G4EquilibriumEvaporator::getPARLEVDEN" <<
G4endl;
747 G4cout <<
" >>> G4EquilibriumEvaporator::getE0" <<
G4endl;
virtual void setVerboseLevel(G4int verbose=0)
std::vector< ExP01TrackerHit * > a
virtual ~G4EquilibriumEvaporator()
void addOutgoingParticle(const G4InuclElementaryParticle &particle)
static G4double getParticleMass(G4int type)
void setBullet(const G4InuclParticle *bullet)
G4LorentzVector backToTheLab(const G4LorentzVector &mom) const
void getTargetData(const G4Fragment &target)
G4EquilibriumEvaporator()
G4GLOB_DLL std::ostream G4cout
static constexpr double m
G4double interpolate(const G4double x, const G4double(&yb)[nBins]) const
G4double getNucleiMass() const
void boostToLabFrame(const G4LorentzConvertor &convertor)
G4LorentzVector generateWithRandomAngles(G4double p, G4double mass=0.)
virtual void setVerboseLevel(G4int verbose)
G4double G4cbrt(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
const G4Fragment & makeFragment(G4LorentzVector mom, G4int A, G4int Z, G4double EX=0.)
const std::vector< G4InuclNuclei > & getOutgoingNuclei() const
static const G4double * SL[nLA]
const std::vector< G4InuclElementaryParticle > & getOutgoingParticles() const
static constexpr double GeV
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)