Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4Fissioner Class Reference

#include <G4Fissioner.hh>

+ Inheritance diagram for G4Fissioner:

Public Member Functions

 G4Fissioner ()
 
virtual ~G4Fissioner ()
 
void collide (G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
 
- Public Member Functions inherited from G4CascadeColliderBase
 G4CascadeColliderBase (const char *name, G4int verbose=0)
 
virtual ~G4CascadeColliderBase ()
 
virtual void rescatter (G4InuclParticle *, G4KineticTrackVector *, G4V3DNucleus *, G4CollisionOutput &)
 
virtual void setVerboseLevel (G4int verbose=0)
 
virtual void setConservationChecks (G4bool doBalance=true)
 
- Public Member Functions inherited from G4VCascadeCollider
 G4VCascadeCollider (const char *name, G4int verbose=0)
 
virtual ~G4VCascadeCollider ()
 
virtual void collide (G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)=0
 
virtual void setVerboseLevel (G4int verbose=0)
 

Additional Inherited Members

- Protected Member Functions inherited from G4CascadeColliderBase
virtual G4bool useEPCollider (G4InuclParticle *bullet, G4InuclParticle *target) const
 
virtual G4bool explosion (G4InuclNuclei *target) const
 
virtual G4bool explosion (G4Fragment *target) const
 
virtual G4bool explosion (G4int A, G4int Z, G4double excitation) const
 
virtual G4bool inelasticInteractionPossible (G4InuclParticle *bullet, G4InuclParticle *target, G4double ekin) const
 
virtual G4bool validateOutput (G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
 
virtual G4bool validateOutput (G4InuclParticle *bullet, G4InuclParticle *target, const std::vector< G4InuclElementaryParticle > &particles)
 
virtual G4bool validateOutput (G4InuclParticle *bullet, G4InuclParticle *target, const std::vector< G4InuclNuclei > &fragments)
 
- Protected Member Functions inherited from G4VCascadeCollider
virtual void setName (const char *name)
 
- Protected Attributes inherited from G4CascadeColliderBase
G4InteractionCase interCase
 
G4bool doConservationChecks
 
G4CascadeCheckBalancebalance
 
- Protected Attributes inherited from G4VCascadeCollider
const char * theName
 
G4int verboseLevel
 

Detailed Description

Definition at line 47 of file G4Fissioner.hh.

Constructor & Destructor Documentation

◆ G4Fissioner()

G4Fissioner::G4Fissioner ( )

Definition at line 58 of file G4Fissioner.cc.

◆ ~G4Fissioner()

virtual G4Fissioner::~G4Fissioner ( )
inlinevirtual

Definition at line 50 of file G4Fissioner.hh.

50{}

Member Function Documentation

◆ collide()

void G4Fissioner::collide ( G4InuclParticle bullet,
G4InuclParticle target,
G4CollisionOutput output 
)
virtual

Implements G4VCascadeCollider.

Definition at line 60 of file G4Fissioner.cc.

62 {
63 if (verboseLevel) {
64 G4cout << " >>> G4Fissioner::collide" << G4endl;
65 }
66
67 // const G4int itry_max = 1000;
68
69 G4InuclNuclei* nuclei_target = dynamic_cast<G4InuclNuclei*>(target);
70 if (!nuclei_target) {
71 G4cerr << " >>> G4Fissioner -> target is not nuclei " << G4endl;
72 return;
73 }
74
75 if (verboseLevel > 1)
76 G4cout << " Fissioner input\n" << *nuclei_target << G4endl;
77
78 // Initialize buffer for fission possibilities
79 fissionStore.setVerboseLevel(verboseLevel);
80 fissionStore.clear();
81
82 G4int A = nuclei_target->getA();
83 G4int Z = nuclei_target->getZ();
84
85 G4double EEXS = nuclei_target->getExitationEnergy();
86 G4double mass_in = nuclei_target->getMass();
87 G4double e_in = mass_in; // Mass includes excitation
88 G4double PARA = 0.055 * G4cbrt(A*A) * (G4cbrt(A-Z) + G4cbrt(Z));
89 G4double TEM = std::sqrt(EEXS / PARA);
90 G4double TETA = 0.494 * G4cbrt(A) * TEM;
91
92 TETA = TETA / std::sinh(TETA);
93
94 if (A < 246) PARA += (nucleiLevelDensity(A) - PARA) * TETA;
95
96 G4int A1 = A/2 + 1;
97 G4int Z1;
98 G4int A2 = A - A1;
99
100 G4double ALMA = -1000.0;
101 G4double DM1 = bindingEnergy(A,Z);
102 G4double EVV = EEXS - DM1;
104 G4double DTEM = (A < 220 ? 0.5 : 1.15);
105
106 TEM += DTEM;
107
108 G4double AL1[2] = { -0.15, -0.15 };
109 G4double BET1[2] = { 0.05, 0.05 };
110
111 G4double R12 = G4cbrt(A1) + G4cbrt(A2);
112
113 for (G4int i = 0; i < 50 && A1 > 30; i++) {
114 A1--;
115 A2 = A - A1;
116 G4double X3 = 1.0 / G4cbrt(A1);
117 G4double X4 = 1.0 / G4cbrt(A2);
118 Z1 = G4lrint(getZopt(A1, A2, Z, X3, X4, R12) - 1.);
119 G4double EDEF1[2];
120 G4int Z2 = Z - Z1;
121 G4double VPOT, VCOUL;
122
123 potentialMinimization(VPOT, EDEF1, VCOUL, A1, A2, Z1, Z2, AL1, BET1, R12);
124
125 G4double DM3 = bindingEnergy(A1,Z1);
126 G4double DM4 = bindingEnergyAsymptotic(A1, Z1);
127 G4double DM5 = bindingEnergy(A2,Z2);
128 G4double DM6 = bindingEnergyAsymptotic(A2, Z2);
129 G4double DMT1 = DM4 + DM6 - DM2;
130 G4double DMT = DM3 + DM5 - DM1;
131 G4double EZL = EEXS + DMT - VPOT;
132
133 if(EZL > 0.0) { // generate fluctuations
134 // faster, using randomGauss
135 G4double C1 = std::sqrt(getC2(A1, A2, X3, X4, R12) / TEM);
136 G4double DZ = randomGauss(C1);
137
138 DZ = DZ > 0.0 ? DZ + 0.5 : -std::fabs(DZ - 0.5);
139 Z1 += G4int(DZ);
140 Z2 -= G4int(DZ);
141
142 G4double DEfin = randomGauss(TEM);
143 G4double EZ = (DMT1 + (DMT - DMT1) * TETA - VPOT + DEfin) / TEM;
144
145 if (EZ >= ALMA) ALMA = EZ;
146 G4double EK = VCOUL + DEfin + 0.5 * TEM;
147 G4double EV = EVV + bindingEnergy(A1,Z1) + bindingEnergy(A2,Z2) - EK;
148
149 if (EV > 0.0) fissionStore.addConfig(A1, Z1, EZ, EK, EV);
150 };
151 };
152
153 G4int store_size = fissionStore.size();
154 if (store_size == 0) return; // No fission products
155
157 fissionStore.generateConfiguration(ALMA, inuclRndm());
158
159 A1 = G4int(config.afirst);
160 A2 = A - A1;
161 Z1 = G4int(config.zfirst);
162
163 G4int Z2 = Z - Z1;
164
167 G4double EK = config.ekin;
168 G4double pmod = std::sqrt(0.001 * EK * mass1 * mass2 / mass_in);
169
170 G4LorentzVector mom1 = generateWithRandomAngles(pmod, mass1);
171 G4LorentzVector mom2; mom2.setVectM(-mom1.vect(), mass2);
172
173 G4double e_out = mom1.e() + mom2.e();
174 G4double EV = 1000.0 * (e_in - e_out) / A;
175 if (EV <= 0.0) return; // No fission energy
176
177 G4double EEXS1 = EV*A1;
178 G4double EEXS2 = EV*A2;
179
180 G4InuclNuclei nuclei1(mom1, A1, Z1, EEXS1, G4InuclParticle::Fissioner);
181 G4InuclNuclei nuclei2(mom2, A2, Z2, EEXS2, G4InuclParticle::Fissioner);
182
183 // Pass only last two nuclear fragments
184 static std::vector<G4InuclNuclei> frags(2); // Always the same size!
185 frags[0] = nuclei1;
186 frags[1] = nuclei2;
187 validateOutput(0, target, frags); // Check energy conservation
188
189 output.addOutgoingNuclei(frags);
190}
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
#define C1
void setVectM(const Hep3Vector &spatial, double mass)
Hep3Vector vect() const
virtual G4bool validateOutput(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
void addOutgoingNuclei(const std::vector< G4InuclNuclei > &nuclea)
size_t size() const
void addConfig(G4double a, G4double z, G4double ez, G4double ek, G4double ev)
void setVerboseLevel(G4int verbose=1)
G4FissionConfiguration generateConfiguration(G4double amax, G4double rand) const
G4double getNucleiMass() const
G4int getZ() const
G4double getExitationEnergy() const
G4int getA() const
G4double getMass() const
G4double bindingEnergy(G4int A, G4int Z)
G4double nucleiLevelDensity(G4int A)
G4LorentzVector generateWithRandomAngles(G4double p, G4double mass=0.)
G4double randomGauss(G4double sigma)
G4double bindingEnergyAsymptotic(G4int A, G4int Z)
int G4lrint(double ad)
Definition: templates.hh:163

Referenced by G4EquilibriumEvaporator::collide().


The documentation for this class was generated from the following files: