58 const G4double dExc = 1.0*CLHEP::MeV;
59 const G4double limE = 1.0*CLHEP::MeV;
61 const G4int nProbMax = 10;
66 : evapA(theA), evapZ(theZ)
69 pairingCorrection = nData->GetPairingCorrection();
70 if (evapZ > 2) { lManagerEvap = nData->GetLevelManager(evapZ, evapA); }
72 fEvapMass2 = fEvapMass*fEvapMass;
76 fTolerance = 10*CLHEP::keV;
77 fCoeff = fEvapMass/((CLHEP::pi*CLHEP::hbarc)*(CLHEP::pi*CLHEP::hbarc));
79 std::ostringstream ss;
80 ss <<
"GEMVI_" <<
"Z" << evapZ <<
"_A" << evapA;
81 fModelName = ss.str();
88 if (evapZ == 0 && evapA == 1) {
92 }
else if (evapZ == 1 && evapA == 1) {
96 }
else if (evapZ == 1 && evapA == 2) {
100 }
else if (evapZ == 1 && evapA == 3) {
104 }
else if (evapZ == 2 && evapA == 3) {
108 }
else if (evapZ == 2 && evapA == 4) {
113 fCoeff *= (1 + (evapZ - 2*(evapZ/2)))*(1 + (
N - 2*(
N/2)));
117 G4double de = (0 == indexC) ? 0.15*CLHEP::MeV : 0.25*CLHEP::MeV;
138 resZ = fragZ - evapZ;
139 resA = fragA - evapA;
142 if (resA < evapA || resA < resZ || resZ < 1 ||
143 (resA == evapA && resZ < evapZ)) {
return 0.0; }
148 fResA13 = g4pow->Z13(resA);
149 xsfactor = g4pow->Z23(fragA)/g4pow->Z23(resA);
153 if (fMass <= fEvapMass + fResMass) {
return 0.0; }
156 delta0 = nData->GetPairingCorrection(fragZ, fragA);
157 delta1 = nData->GetPairingCorrection(resZ, resA);
158 fE0 = std::max(fFragExc - delta0, 0.0);
161 bCoulomb = cBarrier->GetCoulombBarrier(resA, resZ, fFragExc);
164 G4double de = fMass - fEvapMass - fResMass - elim;
165 if (de < fTolerance) {
return 0.0; }
170 nProbEvap = std::min(n, nProbMax);
171 if (nProbEvap > 1) { fDeltaEvap /= (
G4double)(nProbEvap - 1); }
175 G4cout <<
"## G4GEMChannelVI::GetEmissionProbability fragZ="
176 << fragZ <<
" fragA=" << fragA <<
" Z=" << evapZ <<
" A=" << evapA
177 <<
" Eex(MeV)=" << fFragExc <<
" nProbEvap=" << nProbEvap
178 <<
" nProbRes=" << nProbRes <<
" CB=" << bCoulomb
179 <<
" Elim=" << fEnergyLimitXS <<
" XSfac=" << xsfactor <<
G4endl;
185 for (
G4int i = 0; i < nProbEvap; ++i) {
186 fEvapExc = fDeltaEvap*i;
188 G4double e2 = fMass - m1 - fResMass;
189 e2 = std::max(e2, 0.0);
190 if (e2 <= elim + fTolerance) {
199 G4cout << i <<
". e1=" << elim <<
" e2=" << e2 <<
" e2-e1="
200 << e2 - elim <<
" fEvapExc=" << fEvapExc
201 <<
" Probability=" << p <<
G4endl;
204 if (nProbEvap > 1) { sump /= (
G4double)nProbEvap; }
212 fResExc = fMass - m1 - fResMass - e;
213 if (fResExc < 0.0 || 0.0 == e) {
return 0.0; }
214 fE1 = std::max(fResExc - delta1, 0.0);
217 G4double elab = 0.5*(fMass + m1 + m2)*(fMass - m1 - m2)/m2;
220 fCoeff*
G4Exp(2.0*(std::sqrt(a1*fE1) - std::sqrt(a0*fE0)))*e*xs;
229 G4int Z = std::min(resZ, ZMAXNUCLEARDATA);
232 if (e1 < 0.5*bCoulomb) {
239 e2 = lowEnergyLimitMeV[Z];
240 if (e2 == 0.0) { e2 = limE; }
242 e1 = std::max(e1, e2);
244 recentXS = fXSection->GetElementCrossSection(e1, Z)/CLHEP::millibarn;
251 recentXS = CLHEP::pi*(pR + tR)*(pR + tR);
262 lManagerRes = nData->GetLevelManager(resZ, resA);
263 G4double e2 = fMass - fEvapMass - fResMass;
271 for (
G4int i=0; i < nProbEvap; ++i) {
273 if (0 == i) {
break; }
274 G4double e1 = fDeltaEvap*((i - 1) + (q - prob[i - 1])/(prob[i] - prob[i - 1]));
275 fEvapExc = CorrectExcitation(e1, lManagerEvap);
277 e2 = std::max(e2, 0.0);
287 fResExc = CorrectExcitation(e2 - e, lManagerRes);
293 G4double ekin = 0.5*e*(e + 2*m2)/(e + m1 + m2);
298 evFragment =
new G4Fragment(evapA, evapZ, lv);
313 if (exc <= 0.0 ||
nullptr == man) {
return 0.0; }
317 if (0 == idx) {
return 0.0; }
321 std::size_t ntrans{0};
322 if (std::abs(elevel - exc) < fTolerance) {
324 if (
nullptr != level) {
325 ntrans = level->NumberOfTransitions();
329 auto newlevel = man->
GetLevel(idx - 1);
331 if (
nullptr != newlevel && std::abs(elevel - newenergy) < fTolerance) {
332 std::size_t newntrans = newlevel->NumberOfTransitions();
339 if (0 < ntrans) {
return elevel; }
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
CLHEP::HepLorentzVector G4LorentzVector
G4ThreeVector G4RandomDirection()
G4GLOB_DLL std::ostream G4cout
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
static G4double LevelDensity(const G4int Z, const G4int A, const G4int index)
static G4double CorrectionFactor(const G4int index, const G4int Z, const G4double A13, const G4double bCoulomb, const G4double ekin)
static G4Deuteron * Deuteron()
G4double GetGroundStateMass() const
void SetZandA_asInt(G4int Znew, G4int Anew, G4int Lnew=0)
G4double GetExcitationEnergy() const
const G4LorentzVector & GetMomentum() const
void SetCreatorModelID(G4int value)
void SetMomentum(const G4LorentzVector &value)
G4GEMChannelVI(G4int theA, G4int theZ)
void Dump() const override
~G4GEMChannelVI() override
G4double ProbabilityDensityFunction(G4double ekin) override
G4double GetEmissionProbability(G4Fragment *theNucleus) override
void Initialise() override
G4Fragment * EmittedFragment(G4Fragment *theNucleus) override
const G4String & ModelName() const override
const G4NucLevel * GetLevel(const std::size_t i) const
std::size_t NearestLevelIndex(const G4double energy, const std::size_t index=0) const
G4int FloatingLevel(const std::size_t i) const
G4double LevelEnergy(const std::size_t i) const
static G4Neutron * Neutron()
static G4NuclearLevelData * GetInstance()
static G4double Radius(G4int Z, G4int A)
static G4double GetNuclearMass(const G4double A, const G4double Z)
static G4int GetModelID(const G4int modelIndex)
static G4Pow * GetInstance()
static G4Proton * Proton()
static G4Triton * Triton()
virtual void Initialise()
G4double ComputeIntegral(const G4double emin, const G4double emax)
void InitialiseIntegrator(G4double accuracy, G4double fact1, G4double fact2, G4double de, G4double dmin, G4double dmax)