46 const G4double G4GEMChannelVI::ws[] = {
58 const G4double G4GEMChannelVI::xs[] = {
72 :
A(theA),
Z(theZ), levelDensity(0.1)
87 resA = resZ = fragZ = fragA = nWarn = 0;
88 massGround = maxLevelE = Z13 = A13 = massFrag = eCBarrier
89 = resMassGround = resZ13 = resA13 = delta0
90 = delta1 = maxExc = maxProb = alphaP = betaP = maxKinEnergy = 0.0;
113 if(resA < A || resA < resZ || resZ < 0 || (resA == A && resZ < Z)) {
123 maxExc = massFrag - massGround - resMassGround - eCBarrier - delta0;
124 if(maxExc < 0.0) {
return prob; }
126 resZ13 = fG4pow->
Z13(resZ);
127 resA13 = fG4pow->
Z13(resA);
133 }
else if(resZ > 20) {
134 C = (0.123482-0.00534691*Z-0.0000610624*(Z*Z)+5.93719*1e-7*(Z*Z*Z)+
135 1.95687*1e-8*(Z*Z*Z*Z))/
G4double(A);
138 alphaP = 0.76+1.93/resA13;
139 betaP = (1.66/(resA13*resA13)-0.05)*
CLHEP::MeV/alphaP;
150 prob += ws[i]*IntegratedProbability(e0*(xs[i] + 1.0));
173 y = ProbabilityDistributionFunction(exc, e0*(xs[i] + 1.0));
189 for(
G4int i=0; i<100; ++i) {
191 exc = maxExc*rndm->
flat();
192 resExc = maxExc*rndm->
flat();
193 }
while (exc + resExc > maxExc);
195 G4double prob = ProbabilityDistributionFunction(exc, resExc);
196 if(prob > maxProb && nWarn < 10) {
198 G4cout <<
"### G4GEMChannelVI::EmittedFragment WARNING: majoranta "
199 << maxProb <<
" is exceeded " << prob <<
"\n"
200 <<
" fragZ= " << fragZ <<
" fragA= " << fragA
201 <<
" Z= " << Z <<
" A= " << A
202 <<
" resZ= " << resZ <<
" resA= " << resA <<
"\n"
203 <<
" exc(MeV)= " << exc <<
" resExc(MeV)= " << resExc
204 <<
" maxExc(MeV)= " << maxExc <<
G4endl;
206 if(maxProb*rndm->
flat() <= prob) {
break; }
208 if(exc <= maxLevelE) {
209 exc = FindLevel(levelManager, exc, maxExc - resExc);
214 if(lman) { resExc = FindLevel(lman, resExc, maxExc - exc); }
219 G4double mass2 = resMassGround + resExc;
221 G4double e1 = 0.5*((massFrag - mass2)*(massFrag + mass2)
222 + mass1*mass1)/massFrag;
226 p1 = std::sqrt((e1 - mass1)*(e1 + mass1));
234 lv1.
boost(boostVector);
244 lv0.
boost(boostVector);
253 G4GEMChannelVI::ProbabilityDistributionFunction(
G4double exc,
G4double resExc)
257 G4double T = 1.0/(std::sqrt(levelDensity/Ux) - 1.5/Ux);
259 - 1.25*
G4Log(Ux) + 2.0*std::sqrt(levelDensity*Ux));
263 G4double TCN = 1.0/(std::sqrt(levelDensity/UxCN) - 1.5/UxCN);
266 G4double mass2 = resMassGround + resExc;
268 maxKinEnergy = 0.5*((massFrag - mass2)*(massFrag + mass2)
269 + mass1*mass1)/massFrag - mass1;
270 maxKinEnergy =
std::max(maxKinEnergy, 0.0);
274 if ( maxKinEnergy < Ex ) {
275 Width = (I1(t,t)*T + (betaP+eCBarrier)*I0(t))/
G4Exp(E0/T);
280 G4double s0 = 2.0*std::sqrt(levelDensity*(maxKinEnergy-delta0));
281 G4double sx = 2.0*std::sqrt(levelDensity*(Ex-delta0));
284 if(s0 > 350.) { s0 = 350.; }
288 static const G4double sqrt2 = std::sqrt(2.0);
290 Width = I1(t,tx)*T/expE0T + I3(s0,sx)*exps0/(sqrt2*levelDensity);
293 Width += (betaP+eCBarrier)*(I0(tx)/expE0T + 2.0*sqrt2*I2(s0,sx)*exps0);
296 Width *= alphaP*massFrag;
303 Rb = 1.12*(resA13 + A13) - 0.86*((resA13 + A13)/(resA13*A13))+2.85;
305 Rb=1.5*(resA13 + A13);
314 + 2.0*std::sqrt(levelDensity*UxCN));
315 ild =
G4Exp((exc-E0CN)/TCN)/TCN;
318 G4double x1 = std::sqrt(levelDensity*x);
319 ild =
G4Exp(2*x1)/(x*std::sqrt(x1));
322 Width *= (Rb*Rb/ild);
338 pr = (exc - e1 <= e2 - exc) ? 1.0 - (1.0 - pr)*2*(exc - e1)/(e2 - e1) :
339 2*pr*(e2 - exc)/(e2 - e1);
357 G4double p1 = S *(2.0 + S2 *( 4.0 + S2 *( 13.5 + S2 *( 60.0 + S2 * 325.125 ))));
359 + Sx2 *((1.5*s2+0.5*sx2)
360 + Sx2 *((3.75*s2+0.25*sx2)
361 + Sx2 *((12.875*s2+0.625*sx2)
362 + Sx2 *((59.0625*s2+0.9375*sx2)
363 + Sx2 *(324.8*s2+3.28*sx2))))));
size_t NearestLowEdgeLevelIndex(G4double energy) const
G4int GetMinA(G4int Z) const
static G4Pow * GetInstance()
Hep3Vector boostVector() const
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4int SpinParity(size_t i) const
G4GEMChannelVI(G4int theA, G4int theZ)
const G4LevelManager * GetLevelManager(G4int Z, G4int A)
static constexpr double hbarc
G4ThreeVector G4RandomDirection()
virtual G4Fragment * EmittedFragment(G4Fragment *theNucleus) final
virtual void Initialise() final
G4double GetLevelDensity() const
G4float LevelEnergy(size_t i) const
G4GLOB_DLL std::ostream G4cout
G4double Z13(G4int Z) const
double A(double temperature)
const G4LorentzVector & GetMomentum() const
HepLorentzVector & boost(double, double, double)
void SetMomentum(const G4LorentzVector &value)
static constexpr double MeV
G4double GetPairingCorrection(G4int A, G4int Z) const
G4DeexPrecoParameters * GetParameters()
size_t NumberOfTransitions() const
G4double GetGroundStateMass() const
G4int GetMaxA(G4int Z) const
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
static G4PairingCorrection * GetInstance()
void set(double x, double y, double z, double t)
T max(const T t1, const T t2)
brief Return the largest of the two arguments
void SetZandA_asInt(G4int Znew, G4int Anew)
virtual ~G4GEMChannelVI()
static constexpr double fermi
G4double GetMaxLevelEnergy(G4int Z, G4int A) const
virtual void Dump() const
virtual G4double GetCoulombBarrier(G4int ARes, G4int ZRes, G4double U) const =0
G4float MaxLevelEnergy() const
static G4NuclearLevelData * GetInstance()
static constexpr double pi
G4double GetExcitationEnergy() const
virtual G4double GetEmissionProbability(G4Fragment *theNucleus) final