86 parms.first.resize(6,0.);
87 parms.second.resize(6,0.);
97 G4cout <<
" >>> G4EquilibriumEvaporator::collide" <<
G4endl;
102 if (!nuclei_target) {
103 G4cerr <<
" EquilibriumEvaporator -> target is not nuclei " <<
G4endl;
115 const G4double prob_cut_off = 1.0e-15;
116 const G4double Q1[6] = { 0.0, 0.0, 2.23, 8.49, 7.72, 28.3 };
117 const G4int AN[6] = { 1, 1, 2, 3, 3, 4 };
118 const G4int Q[6] = { 0, 1, 1, 1, 2, 2 };
119 const G4double G[6] = { 2.0, 2.0, 6.0, 6.0, 6.0, 4.0 };
121 const G4double fisssion_cut = 1000.0;
122 const G4double cut_off_energy = 0.1;
125 const G4int itry_max = 1000;
126 const G4int itry_global_max = 1000;
128 const G4int itry_gam_max = 100;
143 toTheNucleiSystemRestFrame.
setBullet(dummy);
148 if (explosion(A, Z, EEXS)) {
150 theBigBanger.
collide(0, target, output);
157 if (EEXS < cut_off_energy) {
166 G4double coul_coeff = (A >= 100.0) ? 1.4 : 1.2;
171 G4bool fission_open =
true;
172 G4int itry_global = 0;
174 while (try_again && itry_global < itry_global_max) {
178 toTheNucleiSystemRestFrame.
setTarget(PEX);
183 G4cout <<
" A " << A <<
" Z " << Z <<
" mass " << nuc_mass
184 <<
" EEXS " << EEXS <<
G4endl;
187 if (explosion(A, Z, EEXS)) {
189 G4cout <<
" big bang in eql step " << itry_global <<
G4endl;
198 if (EEXS < cut_off_energy) {
200 G4cout <<
" no energy for evaporation in eql step " << itry_global
209 G4double parlev = getPARLEVDEN(A, Z);
213 const std::vector<G4double>& AK = parms.first;
214 const std::vector<G4double>& CPA = parms.second;
219 for (i = 0; i < 6; i++) {
222 u[i] = parlev * A1[i];
226 if (goodRemnant(A1[i], Z1[i])) {
228 V[i] = coul_coeff * Z * Q[i] * AK[i] / (1.0 + EEXS / E0) /
230 TM[i] = EEXS - QB - V[i] * A / A1[i];
232 G4cout <<
" i=" << i <<
" : QB " << QB <<
" u " << u[i]
233 <<
" V " << V[i] <<
" TM " << TM[i] <<
G4endl;
238 G4double ue = 2.0 * std::sqrt(u1 * EEXS);
242 if (TM[0] > cut_off_energy) {
244 W[0] = BE *
G4cbrt(A1[0]*A1[0]) * G[0] * AL;
245 G4double TM1 = 2.0 * std::sqrt(u[0] * TM[0]) - ue;
247 if (TM1 > huge_num) TM1 = huge_num;
248 else if (TM1 < small) TM1 = small;
250 W[0] *= std::exp(TM1);
254 for (i = 1; i < 6; i++) {
256 if (TM[i] > cut_off_energy) {
257 W[i] = BE *
G4cbrt(A1[i]*A1[i]) * G[i] * (1.0 + CPA[i]);
258 G4double TM1 = 2.0 * std::sqrt(u[i] * TM[i]) - ue;
260 if (TM1 > huge_num) TM1 = huge_num;
261 else if (TM1 < small) TM1 = small;
263 W[i] *= std::exp(TM1);
270 if (A >= 100.0 && fission_open) {
273 G4double X = 0.019316 * X2 / (1.0 - 1.79 * X1 * X1);
274 G4double EF = EEXS - getQF(X, X2, A, Z, EEXS);
277 G4double AF = u1 * getAF(X, A, Z, EEXS);
278 G4double TM1 = 2.0 * std::sqrt(AF * EF) - ue;
280 if (TM1 > huge_num) TM1 = huge_num;
281 else if (TM1 < small) TM1 = small;
283 W[6] = BF * std::exp(TM1);
284 if (W[6] > fisssion_cut*W[0]) W[6] = fisssion_cut*W[0];
292 G4cout <<
" Evaporation probabilities: sum = " << prob_sum
293 <<
"\n\t n " << W[0] <<
" p " << W[1] <<
" d " << W[2]
294 <<
" He3 " << W[3] <<
"\n\t t " << W[4] <<
" alpha " << W[5]
295 <<
" fission " << W[6] <<
G4endl;
300 if (prob_sum < prob_cut_off) {
302 G4double T00 = 1.0 / (std::sqrt(u1 / UCR0) - 1.25 / UCR0);
308 while (EEXS > cut_off_energy && try_again) {
315 FMAX = (T04*T04*T04*T04) * std::exp((EEXS - T04) / T00);
317 FMAX = EEXS*EEXS*EEXS*EEXS;
321 G4cout <<
" T04 " << T04 <<
" FMAX (EEXS^4) " << FMAX <<
G4endl;
324 while (itry < itry_max) {
327 X1 = (S*S*S*S) * std::exp((EEXS - S) / T00);
332 if (itry == itry_max) {
349 G4cout <<
" nucleus px " << PEX.
px() <<
" py " << PEX.
py()
350 <<
" pz " << PEX.
pz() <<
" E " << PEX.
e() <<
G4endl
351 <<
" evaporate px " << mom.
px() <<
" py " << mom.
py()
352 <<
" pz " << mom.
pz() <<
" E " << mom.
e() <<
G4endl;
367 if (itry_gam == itry_gam_max) try_again =
false;
376 for (i = 0; i < 7; i++) {
384 if (icase < 0)
continue;
388 G4cout <<
" particle/light-ion escape ("
389 << (icase==0 ?
"neutron" : icase==1 ?
"proton" :
390 icase==2 ?
"deuteron" : icase==3 ?
"He3" :
391 icase==4 ?
"triton" : icase==5 ?
"alpha" :
"ERROR!")
395 G4double uc = 2.0 * std::sqrt(u[icase] * TM[icase]);
396 G4double ur = (uc > huge_num ? std::exp(huge_num) : std::exp(uc));
402 while (itry1 < itry_max && bad) {
408 while (itry < itry_max && EPR < 0.0) {
411 S = 0.5 * (uc * uc - uu * uu) / u[icase];
412 EPR = TM[icase] - S * A / (A - 1.0) + V[icase];
416 G4cout <<
" EPR " << EPR <<
" V " << V[icase]
417 <<
" S " << S <<
" EEXS " << EEXS <<
G4endl;
420 if (EPR > 0.0 && S > V[icase] && S < EEXS) {
422 G4cout <<
" escape itry1 " << itry1 <<
" icase "
423 << icase <<
" S (MeV) " << S <<
G4endl;
428 G4int ptype = 2 - icase;
436 G4double pmod = std::sqrt((2.0 * mass + S) * S);
443 G4cout <<
" nucleus px " << PEX.
px() <<
" py " << PEX.
py()
444 <<
" pz " << PEX.
pz() <<
" E " << PEX.
e() <<
G4endl
445 <<
" evaporate px " << mom.
px() <<
" py " << mom.
py()
446 <<
" pz " << mom.
pz() <<
" E " << mom.
e() <<
G4endl;
453 G4double EEXS_new = ((PEX-mom).m() - mass_new)*GeV;
454 if (EEXS_new < 0.0)
continue;
473 G4cout <<
" nucleus A " << AN[icase] <<
" Z " << Q[icase]
474 <<
" escape icase " << icase <<
G4endl;
481 G4double pmod = std::sqrt((2.0 * mass + S) * S);
488 G4cout <<
" nucleus px " << PEX.
px() <<
" py " << PEX.
py()
489 <<
" pz " << PEX.
pz() <<
" E " << PEX.
e() <<
G4endl
490 <<
" evaporate px " << mom.
px() <<
" py " << mom.
py()
491 <<
" pz " << mom.
pz() <<
" E " << mom.
e() <<
G4endl;
498 G4double EEXS_new = ((PEX-mom).m() - mass_new)*GeV;
499 if (EEXS_new < 0.0)
continue;
509 AN[icase], Q[icase], 0.*GeV,
521 if (itry1 == itry_max || bad) try_again =
false;
526 G4cout <<
" fission: A " << A <<
" Z " << Z <<
" eexs " << EEXS
527 <<
" Wn " << W[0] <<
" Wf " << W[6] <<
G4endl;
531 fission_output.
reset();
535 if (nuclea.size() == 2) {
545 this->
collide(0, &nuclea[0], output);
546 this->
collide(0, &nuclea[1], output);
552 fission_open =
false;
560 if (itry_global == itry_global_max) {
562 G4cout <<
" ! itry_global " << itry_global_max <<
G4endl;
586 G4cout <<
" >>> G4EquilibriumEvaporator::explosion? ";
592 G4bool bigb = (!(a >= 12 && z >= 0 && z < 3*(a-z)) &&
601G4bool G4EquilibriumEvaporator::goodRemnant(
G4int a,
604 G4cout <<
" >>> G4EquilibriumEvaporator::goodRemnant(" << a <<
"," << z
605 <<
")? " << (a>1 && z>0 && a>z) <<
G4endl;
608 return a > 1 && z > 0 && a > z;
617 G4cout <<
" >>> G4EquilibriumEvaporator::getQF ";
623 22.5, 22.0, 21.0, 21.0, 20.0,
626 20.6, 20.6, 18.6, 15.8, 13.5, 6.5,
629 6.65, 6.22, 6.27, 6.5, 6.7, 6.2, 6.25, 5.9, 6.1, 5.75,
632 6.46, 5.7, 6.28, 5.8, 6.15, 5.6, 5.8, 5.2, 5.8,
635 6.2 , 5.9 , 5.9, 6.0, 5.8, 5.7, 5.4, 5.4,
638 5.6, 6.1, 5.57, 6.3, 5.5, 5.8, 4.7, 6.2, 6.4, 6.2,
641 6.5, 6.2, 6.5, 5.3, 6.4, 5.7, 5.7, 6.2, 5.7,
644 6.3, 5.8, 6.7, 5.8, 6.6, 6.1, 4.3,
647 6.2, 3.8, 5.6, 4.0, 4.0, 4.2, 4.2, 3.5 };
651 0.6761, 0.677, 0.6788, 0.6803, 0.685,
653 0.6889, 0.6914, 0.6991, 0.7068, 0.725, 0.7391,
655 0.74, 0.741, 0.742, 0.743, 0.744, 0.7509, 0.752, 0.7531, 0.7543, 0.7548,
657 0.7557, 0.7566, 0.7576,
659 0.7587, 0.7597, 0.7608, 0.762, 0.7632, 0.7644, 0.7675, 0.7686, 0.7697, 0.7709,
661 0.7714, 0.7721, 0.7723, 0.7733, 0.7743, 0.7753, 0.7764,
663 0.7775, 0.7786, 0.7801, 0.781, 0.7821, 0.7831, 0.7842, 0.7852,
665 0.7864, 0.7875, 0.7880, 0.7887, 0.7889, 0.7899, 0.7909, 0.7919, 0.7930,
667 0.7941, 0.7953, 0.7965, 0.7977, 0.7987, 0.7989,
669 0.7997, 0.8075, 0.8097, 0.8119, 0.8143, 0.8164, 0.8174, 0.8274 };
677 if (x < XMIN || x > XMAX) {
679 G4double FX = (0.73 + (3.33 * X1 - 0.66) * X1) * (X1*X1*X1);
681 QFF = G0 * FX *
G4cbrt(a*a);
684 QFF = interp.interpolate(x, QFREP);
687 if (QFF < 0.0) QFF = 0.0;
700 G4cout <<
" >>> G4EquilibriumEvaporator::getAF" <<
G4endl;
704 G4double AF = 1.285 * (1.0 - e / 1100.0);
706 if(AF < 1.06) AF = 1.06;
716 G4cout <<
" >>> G4EquilibriumEvaporator::getPARLEVDEN" <<
G4endl;
727 G4cout <<
" >>> G4EquilibriumEvaporator::getE0" <<
G4endl;
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
virtual void setVerboseLevel(G4int verbose=0)
virtual void setConservationChecks(G4bool doBalance=true)
G4bool doConservationChecks
virtual G4bool validateOutput(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
const std::vector< G4InuclNuclei > & getOutgoingNuclei() const
void boostToLabFrame(const G4LorentzConvertor &convertor)
void addOutgoingParticle(const G4InuclElementaryParticle &particle)
const std::vector< G4InuclElementaryParticle > & getOutgoingParticles() const
void addOutgoingNucleus(const G4InuclNuclei &nuclei)
virtual ~G4EquilibriumEvaporator()
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
G4EquilibriumEvaporator()
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
static G4double getParticleMass(G4int type)
G4double getNucleiMass() const
G4double getExitationEnergy() const
G4LorentzVector getMomentum() const
void toTheTargetRestFrame()
void setBullet(const G4InuclParticle *bullet)
G4LorentzVector backToTheLab(const G4LorentzVector &mom) const
void setTarget(const G4InuclParticle *target)
G4double bindingEnergy(G4int A, G4int Z)
G4LorentzVector generateWithRandomAngles(G4double p, G4double mass=0.)
void paraMaker(G4double Z, std::pair< std::vector< G4double >, std::vector< G4double > > &parms)
G4double G4cbrt(G4double x)