47 MyOwnFissionBarrier =
true;
50 MyOwnFissionProbability =
true;
53 MyOwnLevelDensity =
true;
55 MaximalKineticEnergy = -1000.0*
MeV;
57 FissionProbability = 0.0;
58 LevelDensityParameter = 0.0;
63 if (MyOwnFissionBarrier)
delete theFissionBarrierPtr;
65 if (MyOwnFissionProbability)
delete theFissionProbabilityPtr;
67 if (MyOwnLevelDensity)
delete theLevelDensityPtr;
80 if (anA >= 65 && ExEnergy > 0.0) {
81 FissionBarrier = theFissionBarrierPtr->
FissionBarrier(anA,aZ,ExEnergy);
82 MaximalKineticEnergy = ExEnergy - FissionBarrier;
83 LevelDensityParameter =
89 MaximalKineticEnergy = -1000.0*
MeV;
90 LevelDensityParameter = 0.0;
91 FissionProbability = 0.0;
93 return FissionProbability;
109 theResult->push_back(
new G4Fragment(theNucleus));
132 G4double FragmentsExcitationEnergy = 0.0;
133 G4double FragmentsKineticEnergy = 0.0;
143 A1 = FissionAtomicNumber(A,theParameters);
144 Z1 = FissionCharge(A,Z,A1);
150 if (A2 < 1 || Z2 < 0) {
152 "G4CompetitiveFission::BreakUp: Can't define second fragment! ");
157 if (M1 + M2 > theNucleusMomentum.
e()) {
159 "G4CompetitiveFission::BreakUp: Fragments Mass > Total Energy");
164 FragmentsKineticEnergy = FissionKineticEnergy( A , Z,
176 FragmentsExcitationEnergy =
177 Tmax - FragmentsKineticEnergy+FissionPairingEnergy;
179 }
while (FragmentsExcitationEnergy < 0.0 && Trials++ < 100);
181 if (FragmentsExcitationEnergy <= 0.0) {
183 "G4CompetitiveFission::BreakItUp: Excitation energy for fragments < 0.0!");
196 (FragmentsKineticEnergy*(FragmentsKineticEnergy+2*(M2+U2)))
197 /(2*(M1+U1+M2+U2+FragmentsKineticEnergy));
198 G4ParticleMomentum Momentum1(IsotropicVector(std::sqrt(Fragment1KineticEnergy*(Fragment1KineticEnergy+2*(M1+U1)))));
240 theResult->push_back(Fragment1);
241 theResult->push_back(Fragment2);
244 CheckConservation(theNucleus,theResult);
251 G4CompetitiveFission::FissionAtomicNumber(
G4int A,
274 if (w > 1000.0 ) C2 = C2S;
275 else if (w < 0.001) C2 = C2A;
288 G4double Mass1 = MassDistribution(As,A,theParam);
289 G4double Mass2 = MassDistribution(Am1,A,theParam);
290 G4double Mass3 = MassDistribution(A1,A,theParam);
291 G4double Mass4 = MassDistribution(Am2,A,theParam);
292 G4double Mass5 = MassDistribution(A2,A,theParam);
295 if (Mass2 > MassMax) MassMax = Mass2;
296 if (Mass3 > MassMax) MassMax = Mass3;
297 if (Mass4 > MassMax) MassMax = Mass4;
298 if (Mass5 > MassMax) MassMax = Mass5;
305 Pm = MassDistribution(xm,A,theParam);
323 std::exp(-0.5*(x-(A-theParam.
GetA2()))*(x-(A-theParam.
GetA2()))/
325 0.5*std::exp(-0.5*(x-theParam.
GetA1())*(x-theParam.
GetA1())/
327 0.5*std::exp(-0.5*(x-(A-theParam.
GetA1()))*(x-(A-theParam.
GetA1()))/
330 if (theParam.
GetW() > 1000)
return Xsym;
331 else if (theParam.
GetW() < 0.001)
return Xasym;
332 else return theParam.
GetW()*Xsym+Xasym;
341 if (Af >= 134.0) DeltaZ = -0.45;
342 else if (Af <= (A-134.0)) DeltaZ = 0.45;
343 else DeltaZ = -0.45*(Af-(A/2.0))/(134.0-(A/2.0));
350 }
while (theZ < 1.0 || theZ > (Z-1.0) || theZ > Af);
352 return static_cast<G4int>(theZ+0.5);
356 G4CompetitiveFission::FissionKineticEnergy(
G4int A,
G4int Z,
365 if (AfMax < (A/2.0)) AfMax = A - AfMax;
369 if (theParam.
GetW() > 1000) Pas = 0.0;
381 if (theParam.
GetW() < 0.001) Ps = 0.0;
383 Ps = theParam.
GetW()*std::exp(-0.5*(AfMax-theParam.
GetAs())*(AfMax-theParam.
GetAs())/
408 G4double ScaleFactor = 0.5*theParam.
GetSigma1()*(AsymmetricRatio(A,A11)+AsymmetricRatio(A,A12))+
409 theParam.
GetSigma2()*(AsymmetricRatio(A,A21)+AsymmetricRatio(A,A22));
411 TaverageAfMax = (Eaverage + 12.5 * Xsy) * (PPas/ScaleFactor) * AsymmetricRatio(A,AfMax);
419 TaverageAfMax = (Eaverage - 12.5*
MeV*Xas) * (PPsy/ScaleFactor) * SymmetricRatio(A,AfMax);
429 if (i++ > 100)
return Eaverage;
430 }
while (KineticEnergy < Eaverage-3.72*ESigma ||
431 KineticEnergy > Eaverage+3.72*ESigma ||
432 KineticEnergy > Tmax);
434 return KineticEnergy;
441 return Ratio(
G4double(A),A11,B1,A00);
448 return Ratio(
G4double(A),A11,B1,A00);
456 "G4CompetitiveFission::Ratio: A == 0!");
458 if (A11 >= A/2.0 && A11 <= (A00+10.0)) {
459 return 1.0-B1*((A11-
A00)/A)*((A11-
A00)/A);
461 return 1.0-B1*(10.0/A)*(10.0/A)-2.0*(10.0/A)*B1*((A11-A00-10.0)/A);
470 G4double SinTheta = std::sqrt(1.0 - CosTheta*CosTheta);
473 Magnitude*std::sin(Phi)*SinTheta,
479 void G4CompetitiveFission::CheckConservation(
const G4Fragment & theInitialState,
486 G4FragmentVector::iterator h;
487 for (h = Result->begin(); h != Result->end(); h++) {
489 ProductsEnergy += tmp.
e();
490 ProductsMomentum += tmp.
vect();
491 ProductsA += (*h)->GetA_asInt();
492 ProductsZ += (*h)->GetZ_asInt();
495 if (ProductsA != theInitialState.
GetA_asInt()) {
496 G4cout <<
"!!!!!!!!!! Baryonic Number Conservation Violation !!!!!!!!!!" <<
G4endl;
497 G4cout <<
"G4CompetitiveFission.cc: Barionic Number Conservation test for fission fragments"
500 <<
" Fragments A = " << ProductsA <<
" Diference --> "
503 if (ProductsZ != theInitialState.
GetZ_asInt()) {
504 G4cout <<
"!!!!!!!!!! Charge Conservation Violation !!!!!!!!!!" <<
G4endl;
505 G4cout <<
"G4CompetitiveFission.cc: Charge Conservation test for fission fragments"
508 <<
" Fragments Z = " << ProductsZ <<
" Diference --> "
509 << theInitialState.
GetZ() - ProductsZ <<
G4endl;
511 if (std::fabs(ProductsEnergy-theInitialState.
GetMomentum().
e()) > 1.0*
keV) {
512 G4cout <<
"!!!!!!!!!! Energy Conservation Violation !!!!!!!!!!" <<
G4endl;
513 G4cout <<
"G4CompetitiveFission.cc: Energy Conservation test for fission fragments"
516 <<
" Fragments E = " << ProductsEnergy/
MeV <<
" MeV Diference --> "
517 << (theInitialState.
GetMomentum().
e() - ProductsEnergy)/
MeV <<
" MeV" << G4endl;
519 if (std::fabs(ProductsMomentum.
x()-theInitialState.
GetMomentum().
x()) > 1.0*
keV ||
520 std::fabs(ProductsMomentum.
y()-theInitialState.
GetMomentum().
y()) > 1.0*
keV ||
521 std::fabs(ProductsMomentum.
z()-theInitialState.
GetMomentum().
z()) > 1.0*
keV) {
522 G4cout <<
"!!!!!!!!!! Momentum Conservation Violation !!!!!!!!!!" <<
G4endl;
523 G4cout <<
"G4CompetitiveFission.cc: Momentum Conservation test for fission fragments"
526 <<
" Fragments P = " << ProductsMomentum <<
" MeV Diference --> "
static G4Pow * GetInstance()
ThreeVector shoot(const G4int Ap, const G4int Af)
Hep3Vector boostVector() const
G4double GetSigma2(void) const
G4double GetSigma1(void) const
virtual G4double GetEmissionProbability(G4Fragment *theNucleus)
virtual G4double FissionBarrier(G4int A, G4int Z, const G4double U)=0
virtual G4FragmentVector * BreakUp(const G4Fragment &theNucleus)
virtual ~G4CompetitiveFission()
G4IonTable * GetIonTable() const
G4GLOB_DLL std::ostream G4cout
G4double Z13(G4int Z) const
G4double GetSigmaS(void) const
G4double GetIonMass(G4int Z, G4int A, G4int L=0, G4int lvl=0) const
const G4LorentzVector & GetMomentum() const
HepLorentzVector & boost(double, double, double)
std::vector< G4Fragment * > G4FragmentVector
G4double GetGroundStateMass() const
G4double GetA1(void) const
static G4PairingCorrection * GetInstance()
G4double GetFissionPairingCorrection(G4int A, G4int Z) const
G4double GetAs(void) const
static G4ParticleTable * GetParticleTable()
T max(const T t1, const T t2)
brief Return the largest of the two arguments
virtual G4double LevelDensityParameter(G4int A, G4int Z, G4double U) const =0
G4double GetW(void) const
virtual G4double EmissionProbability(const G4Fragment &fragment, const G4double anEnergy)=0
G4double GetExcitationEnergy() const
G4double GetA2(void) const