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)