43 #ifdef G4MULTITHREADED
48 : theDecay(nullptr), rndmEngine(nullptr), verbose(0), maxZ(9), maxA(17)
54 mass = elim = excitation = tolerance = 0.0;
55 frag1 = frag2 =
nullptr;
69 if(thePool ==
nullptr) { InitialisePool(); }
75 void G4FermiBreakUpVI::InitialisePool()
77 #ifdef G4MULTITHREADED
78 G4MUTEXLOCK(&G4FermiBreakUpVI::FermiBreakUpVIMutex);
80 if(thePool ==
nullptr) {
83 #ifdef G4MULTITHREADED
90 return (ZZ < maxZ && AA < maxA && AA > 0 && eexc <= elim) ?
true :
false;
97 G4cout <<
"### G4FermiBreakUpVI::BreakFragment start new fragment " <<
G4endl;
112 rndmEngine = G4Random::getTheEngine();
116 theResult->push_back(theNucleus);
125 for(
size_t i=0; i<frag.size(); ++i) {
128 spin = frag[i]->GetSpin();
129 mass = frag[i]->GetTotalEnergy();
130 excitation = frag[i]->GetExcitationEnergy();
133 G4cout <<
"# FermiFrag " << i <<
". Z= " << Z <<
" A= " << A
134 <<
" mass= " << mass <<
" exc= " << excitation <<
G4endl;
138 if(verbose > 0) {
G4cout <<
" New G4Fragment" <<
G4endl; }
142 theResult->push_back(f);
151 G4bool G4FermiBreakUpVI::SampleDecay()
154 if(!chan) {
return false; }
157 G4cout <<
"== SampleDecay " << nn <<
" channels Eex= "
160 if(0 == nn) {
return false; }
172 if(std::abs(excitation - chan->
GetExcitation()) < tolerance) {
178 const std::vector<const G4FermiPair*>& pvect = chan->
GetChannels();
179 prob.resize(nn, 0.0);
184 for(
size_t i=0; i<
nn; ++i) {
186 pvect[i]->GetFragment1(),
187 pvect[i]->GetFragment2());
190 G4cout << i <<
". " << prob[i]
191 <<
" Z1= " << pvect[i]->GetFragment1()->GetZ()
192 <<
" A1= " << pvect[i]->GetFragment1()->GetA()
193 <<
" Z2= " << pvect[i]->GetFragment2()->GetZ()
194 <<
" A2= " << pvect[i]->GetFragment2()->GetA()
198 ptot *= rndmEngine->
flat();
199 for(
size_t i=0; i<
nn; ++i) {
200 if(ptot <= prob[i] || i+1 == nn) {
207 if(!fpair) {
return false; }
215 G4cout <<
" M= " << mass <<
" M1= " << mass1 <<
" M2= " << mass2
220 G4double e1 = 0.5*(mass*mass - mass2*mass2 + mass1*mass1)/mass;
224 p1 = std::sqrt((e1 - mass1)*(e1 + mass1));
233 lv1.
boost(boostVector);
241 lv0.
boost(boostVector);
243 frag.push_back(frag1);
244 frag.push_back(frag2);
245 lvect.push_back(lv1);
246 lvect.push_back(lv0);
G4double ComputeProbability(G4int Z, G4int A, G4int spin, G4double TotalE, const G4FermiFragment *f1, const G4FermiFragment *f2) const
Hep3Vector boostVector() const
const G4FermiFragment * GetFragment2() const
virtual G4bool IsApplicable(G4int ZZ, G4int AA, G4double etot) const final
G4double GetExcitation() const
G4ThreeVector G4RandomDirection()
virtual void BreakFragment(G4FragmentVector *, G4Fragment *theNucleus) final
const G4FermiPair * GetPair(size_t idx) const
#define G4MUTEX_INITIALIZER
const G4FermiChannels * ClosestChannels(G4int Z, G4int A, G4double mass) const
const G4FermiFragment * GetFragment1() const
const std::vector< const G4FermiPair * > & GetChannels() const
G4GLOB_DLL std::ostream G4cout
G4double GetEnergyLimit() const
virtual ~G4FermiBreakUpVI()
G4double GetCreationTime() const
const G4LorentzVector & GetMomentum() const
HepLorentzVector & boost(double, double, double)
std::vector< G4Fragment * > G4FragmentVector
const G4FermiDecayProbability * FermiDecayProbability() const
G4double GetTolerance() const
G4double GetGroundStateMass() const
virtual void Initialise() final
void SetCreationTime(G4double time)
void set(double x, double y, double z, double t)
const G4FermiPair * SamplePair(G4double rand) const
void SetSpin(G4double value)
G4double GetTotalEnergy(void) const
size_t GetNumberOfChannels() const
G4double GetExcitationEnergy() const
CLHEP::HepLorentzVector G4LorentzVector
G4double GetExcitationEnergy(void) const