77 #include "G4EquilibriumEvaporator.hh" 85 #include "G4InuclSpecialFunctions.hh" 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 };
152 G4EquilibriumEvaporator::G4EquilibriumEvaporator()
154 theParaMaker(verboseLevel), QFinterp(XREP) {
155 parms.first.resize(6,0.);
156 parms.second.resize(6,0.);
159 G4EquilibriumEvaporator::~G4EquilibriumEvaporator() {}
161 void G4EquilibriumEvaporator::setVerboseLevel(
G4int verbose) {
163 theFissioner.setVerboseLevel(verbose);
164 theBigBanger.setVerboseLevel(verbose);
173 G4cout <<
" >>> G4EquilibriumEvaporator::deExcite" <<
G4endl;
176 if (verboseLevel>1)
G4cout <<
" evaporating target: \n" << target <<
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;
199 getTargetData(target);
200 if (verboseLevel > 3)
G4cout <<
" after noeq: eexs " << EEXS <<
G4endl;
205 toTheNucleiSystemRestFrame.
setBullet(dummy);
210 if (explosion(
A,
Z, EEXS)) {
211 if (verboseLevel > 1)
G4cout <<
" big bang in eql start " <<
G4endl;
212 theBigBanger.deExcite(target, output);
214 validateOutput(target, output);
219 if (EEXS < cut_off_energy) {
220 if (verboseLevel > 1)
G4cout <<
" no energy for evaporation" <<
G4endl;
223 validateOutput(target, output);
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) {
241 toTheNucleiSystemRestFrame.
setTarget(PEX);
244 if (verboseLevel > 2) {
246 G4cout <<
" A " <<
A <<
" Z " <<
Z <<
" mass " << nuc_mass
247 <<
" EEXS " << EEXS <<
G4endl;
250 if (explosion(
A,
Z, EEXS)) {
251 if (verboseLevel > 2)
252 G4cout <<
" big bang in eql step " << itry_global <<
G4endl;
254 theBigBanger.deExcite(makeFragment(PEX,
A,
Z,EEXS), output);
256 validateOutput(target, output);
260 if (EEXS < cut_off_energy) {
261 if (verboseLevel > 2)
262 G4cout <<
" no energy for evaporation in eql step " << itry_global
274 theParaMaker.getParams(
Z, parms);
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];
288 if (goodRemnant(A1[i], Z1[i])) {
289 G4double QB = DM0 - bindingEnergy(A1[i],Z1[i]) - Q1[i];
290 V[i] = coul_coeff *
Z * Q[i] * AK[i] / (1.0 + EEXS / E0) /
291 (G4cbrt(A1[i]) + G4cbrt(AN[i]));
292 TM[i] = EEXS - QB - V[i] * A / A1[i];
293 if (verboseLevel > 3) {
294 G4cout <<
" i=" << i <<
" : QB " << QB <<
" u " << u[i]
295 <<
" V " << V[i] <<
" TM " << TM[i] <<
G4endl;
300 G4double ue = 2.0 * std::sqrt(u1 * EEXS);
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);
338 G4double EF = EEXS - getQF(X, X2, A,
Z, EEXS);
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];
355 if (verboseLevel > 2) {
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);
368 if (verboseLevel > 3)
372 while (EEXS > cut_off_energy && try_again) {
379 FMAX = (T04*T04*T04*T04) *
G4Exp((EEXS - T04) / T00);
381 FMAX = EEXS*EEXS*EEXS*EEXS;
384 if (verboseLevel > 3)
385 G4cout <<
" T04 " << T04 <<
" FMAX (EEXS^4) " << FMAX <<
G4endl;
388 while (itry < itry_max) {
390 S = EEXS * inuclRndm();
393 if (X1 > FMAX * inuclRndm())
break;
396 if (itry == itry_max) {
401 if (verboseLevel > 2)
G4cout <<
" photon escape ?" <<
G4endl;
412 if (verboseLevel > 3) {
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;
426 if (verboseLevel > 3)
431 if (itry_gam == itry_gam_max) try_again =
false;
437 if (verboseLevel > 3)
G4cout <<
" random SL " << SL <<
G4endl;
440 for (i = 0; i < 7; i++) {
448 if (icase < 0)
continue;
451 if (verboseLevel > 2) {
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];
479 if (verboseLevel > 3) {
480 G4cout <<
" EPR " << EPR <<
" V " << V[icase]
481 <<
" S " << S <<
" EEXS " << EEXS <<
G4endl;
484 if (EPR > 0.0 && S > V[icase] && S < EEXS) {
485 if (verboseLevel > 2)
486 G4cout <<
" escape itry1 " << itry1 <<
" icase " 487 << icase <<
" S (MeV) " << S <<
G4endl;
492 G4int ptype = 2 - icase;
493 if (verboseLevel > 2)
500 G4double pmod = std::sqrt((2.0 * mass + S) * S);
506 if (verboseLevel > 2) {
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;
517 G4double EEXS_new = ((PEX-mom).
m() - mass_new)*GeV;
518 if (EEXS_new < 0.0)
continue;
530 if (verboseLevel > 3)
536 if (verboseLevel > 2) {
537 G4cout <<
" nucleus A " << AN[icase] <<
" Z " << Q[icase]
538 <<
" escape icase " << icase <<
G4endl;
545 G4double pmod = std::sqrt((2.0 * mass + S) * S);
551 if (verboseLevel > 2) {
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;
562 G4double EEXS_new = ((PEX-mom).
m() - mass_new)*GeV;
563 if (EEXS_new < 0.0)
continue;
573 AN[icase], Q[icase], 0.*GeV,
576 if (verboseLevel > 3)
585 if (itry1 == itry_max || bad) try_again =
false;
587 if (verboseLevel > 2) {
588 G4cout <<
" fission: A " << A <<
" Z " <<
Z <<
" eexs " << EEXS
589 <<
" Wn " << W[0] <<
" Wf " << W[6] <<
G4endl;
593 fission_output.reset();
594 theFissioner.deExcite(makeFragment(A,
Z,EEXS), fission_output);
596 if (fission_output.numberOfFragments() == 2) {
597 if (verboseLevel > 2)
G4cout <<
" fission done in eql" <<
G4endl;
600 fission_output.boostToLabFrame(toTheNucleiSystemRestFrame);
603 this->deExcite(fission_output.getRecoilFragment(0), output);
604 this->deExcite(fission_output.getRecoilFragment(1), output);
606 validateOutput(target, output);
609 fission_open =
false;
617 if (itry_global == itry_global_max) {
618 if (verboseLevel > 3) {
619 G4cout <<
" ! itry_global " << itry_global_max <<
G4endl;
629 if (verboseLevel > 3) {
635 validateOutput(target, output);
642 if (verboseLevel > 3) {
643 G4cout <<
" >>> G4EquilibriumEvaporator::explosion? ";
649 G4bool bigb = (!(a >= 12 && z >= 0 && z < 3*(a-
z)) &&
650 (e >= be_cut * bindingEnergy(a,z))
658 G4bool G4EquilibriumEvaporator::goodRemnant(
G4int a,
660 if (verboseLevel > 3) {
661 G4cout <<
" >>> G4EquilibriumEvaporator::goodRemnant(" << a <<
"," << z
662 <<
")? " << (a>1 && z>0 && a>
z) << G4endl;
665 return a > 1 && z > 0 && a >
z;
673 if (verboseLevel > 3) {
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;
689 QFF = QFinterp.interpolate(x, QFREP);
692 if (QFF < 0.0) QFF = 0.0;
694 if (verboseLevel>3)
G4cout <<
" returns " << QFF <<
G4endl;
704 if (verboseLevel > 3) {
705 G4cout <<
" >>> G4EquilibriumEvaporator::getAF" <<
G4endl;
709 G4double AF = 1.285 * (1.0 - e / 1100.0);
711 if(AF < 1.06) AF = 1.06;
720 if (verboseLevel > 3) {
721 G4cout <<
" >>> G4EquilibriumEvaporator::getPARLEVDEN" <<
G4endl;
731 if (verboseLevel > 3) {
732 G4cout <<
" >>> G4EquilibriumEvaporator::getE0" <<
G4endl;
virtual void setVerboseLevel(G4int verbose=0)
void addOutgoingParticle(const G4InuclElementaryParticle &particle)
const std::vector< G4InuclElementaryParticle > & getOutgoingParticles() const
static G4double getParticleMass(G4int type)
void setBullet(const G4InuclParticle *bullet)
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
G4LorentzVector backToTheLab(const G4LorentzVector &mom) const
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double getNucleiMass() const
static const G4double * SL[nLA]
cout<< "-> Edep in the target
void addOutgoingNucleus(const G4InuclNuclei &nuclei)
void addRecoilFragment(const G4Fragment *aFragment)
void toTheTargetRestFrame()
const std::vector< G4InuclNuclei > & getOutgoingNuclei() const
void setTarget(const G4InuclParticle *target)