Geant4  10.02.p03
G4FermiBreakUp Class Reference

#include <G4FermiBreakUp.hh>

Inheritance diagram for G4FermiBreakUp:
Collaboration diagram for G4FermiBreakUp:

Public Member Functions

 G4FermiBreakUp ()
 
virtual ~G4FermiBreakUp ()
 
G4FragmentVectorBreakItUp (const G4Fragment &theNucleus)
 
void BreakFragment (G4FragmentVector *, G4Fragment *theNucleus)
 
- Public Member Functions inherited from G4VFermiBreakUp
 G4VFermiBreakUp ()
 
virtual ~G4VFermiBreakUp ()
 

Private Member Functions

G4double CoulombBarrier (const std::vector< const G4VFermiFragment *> *v)
 
G4double DecayProbability (G4int A, G4double TotalE, const G4FermiConfiguration *)
 
const std::vector< const G4VFermiFragment * > * SelectConfiguration (G4int Z, G4int A, G4double mass)
 
 G4FermiBreakUp (const G4FermiBreakUp &right)
 
const G4FermiBreakUpoperator= (const G4FermiBreakUp &right)
 
G4bool operator== (const G4FermiBreakUp &right) const
 
G4bool operator!= (const G4FermiBreakUp &right) const
 

Private Attributes

G4FermiFragmentsPoolthePool
 
std::vector< G4doubleNormalizedWeights
 
G4double Coef
 
G4double ConstCoeff
 
size_t nmax
 
G4Powg4pow
 
const G4FermiPhaseSpaceDecaythePhaseSpace
 
std::vector< G4doublemassRes
 
std::vector< const G4VFermiFragment * > frag
 

Detailed Description

Definition at line 44 of file G4FermiBreakUp.hh.

Constructor & Destructor Documentation

◆ G4FermiBreakUp() [1/2]

G4FermiBreakUp::G4FermiBreakUp ( )

Definition at line 47 of file G4FermiBreakUp.cc.

48 {
52  ConstCoeff = g4pow->powN(r0/hbarc,3)*Kappa/(6.0*pi*pi);
53 
55 
56  nmax = 16;
57  NormalizedWeights.resize(nmax,0.0);
58  massRes.reserve(4);
59  frag.resize(4, 0);
60 }
static G4Pow * GetInstance()
Definition: G4Pow.cc:55
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:128
const G4double Kappa
int G4int
Definition: G4Types.hh:78
float hbarc
Definition: hepunit.py:265
const G4FermiPhaseSpaceDecay * thePhaseSpace
std::vector< G4double > NormalizedWeights
G4FermiFragmentsPool * thePool
static const double elm_coupling
std::vector< const G4VFermiFragment * > frag
G4double Z13(G4int Z) const
Definition: G4Pow.hh:127
std::vector< G4double > massRes
G4double ConstCoeff
static const double pi
Definition: G4SIunits.hh:74
const G4FermiPhaseSpaceDecay * GetFermiPhaseSpaceDecay() const
static G4FermiFragmentsPool * Instance()
const G4double r0
Here is the call graph for this function:

◆ ~G4FermiBreakUp()

G4FermiBreakUp::~G4FermiBreakUp ( )
virtual

Definition at line 62 of file G4FermiBreakUp.cc.

63 {}

◆ G4FermiBreakUp() [2/2]

G4FermiBreakUp::G4FermiBreakUp ( const G4FermiBreakUp right)
private

Member Function Documentation

◆ BreakFragment()

void G4FermiBreakUp::BreakFragment ( G4FragmentVector theResult,
G4Fragment theNucleus 
)
virtual

Implements G4VFermiBreakUp.

Definition at line 92 of file G4FermiBreakUp.cc.

94 {
95  // Calculate Momenta of K fragments
96  G4double M = theNucleus->GetMomentum().m();
97  const std::vector<const G4VFermiFragment*>* conf =
98  SelectConfiguration(theNucleus->GetZ_asInt(),
99  theNucleus->GetA_asInt(), M);
100 
101  // should never happen
102  if(!conf) {
103  theResult->push_back(theNucleus);
104  return;
105  }
106 
107  size_t nn = conf->size();
108 
109  // should never happen
110  if(0 == nn) {
111  theResult->push_back(theNucleus);
112  return;
113  }
114 
115  G4LorentzVector fourMomentum = theNucleus->GetMomentum();
116 
117  // one unstable fragment
118  if(1 == nn) {
119  (*conf)[0]->FillFragment(theResult, fourMomentum);
120 
121  // normal case
122  } else {
123  G4ThreeVector boostVector = fourMomentum.boostVector();
124  massRes.clear();
125  for(size_t i=0; i<nn; ++i) {
126  massRes.push_back( (*conf)[i]->GetTotalEnergy() );
127  }
128  std::vector<G4LorentzVector*>* mom = thePhaseSpace->Decay(M, massRes);
129 
130  // size_t nmom = mom->size();
131  // G4cout << "nmom= " << nmom << G4endl;
132 
133  // Go back to the Lab Frame
134  for (size_t j=0; j<nn; ++j) {
135  (*mom)[j]->boost(boostVector);
136  (*conf)[j]->FillFragment(theResult, *((*mom)[j]));
137  delete (*mom)[j];
138  }
139  delete mom;
140  }
141  delete theNucleus;
142 }
G4int GetA_asInt() const
Definition: G4Fragment.hh:256
G4int GetZ_asInt() const
Definition: G4Fragment.hh:261
const G4FermiPhaseSpaceDecay * thePhaseSpace
const std::vector< const G4VFermiFragment * > * SelectConfiguration(G4int Z, G4int A, G4double mass)
std::vector< G4double > massRes
const G4LorentzVector & GetMomentum() const
Definition: G4Fragment.hh:289
Hep3Vector boostVector() const
std::vector< G4LorentzVector * > * Decay(G4double parent_mass, const std::vector< G4double > &fragment_masses) const
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ BreakItUp()

G4FragmentVector * G4FermiBreakUp::BreakItUp ( const G4Fragment theNucleus)
virtual

Implements G4VFermiBreakUp.

Definition at line 84 of file G4FermiBreakUp.cc.

85 {
86  G4FragmentVector* result = new G4FragmentVector();
87  G4Fragment* nucleus = new G4Fragment(theNucleus);
88  BreakFragment(result, nucleus);
89  return result;
90 }
std::vector< G4Fragment * > G4FragmentVector
Definition: G4Fragment.hh:63
void BreakFragment(G4FragmentVector *, G4Fragment *theNucleus)
Here is the call graph for this function:

◆ CoulombBarrier()

G4double G4FermiBreakUp::CoulombBarrier ( const std::vector< const G4VFermiFragment *> *  v)
private

Definition at line 65 of file G4FermiBreakUp.cc.

67 {
68  // Calculates Coulomb Barrier (MeV) for given channel with K fragments.
69  G4int SumA = 0;
70  G4int SumZ = 0;
71  G4double CoulombEnergy = 0.;
72  size_t nn = conf->size();
73  for (size_t i=0; i<nn; ++i) {
74  G4int z = (*conf)[i]->GetZ();
75  G4int a = (*conf)[i]->GetA();
76  CoulombEnergy += G4double(z*z)/g4pow->Z13(a);
77  SumA += a;
78  SumZ += z;
79  }
80  CoulombEnergy -= SumZ*SumZ/g4pow->Z13(SumA);
81  return -Coef * CoulombEnergy;
82 }
int G4int
Definition: G4Types.hh:78
G4double Z13(G4int Z) const
Definition: G4Pow.hh:127
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DecayProbability()

G4double G4FermiBreakUp::DecayProbability ( G4int  A,
G4double  TotalE,
const G4FermiConfiguration conf 
)
private

Definition at line 181 of file G4FermiBreakUp.cc.

184 {
185  // A: Atomic Weight
186  // TotalE: Total energy of nucleus
187 
188  G4double KineticEnergy = TotalE;
189  const std::vector<const G4VFermiFragment*>* flist =
190  conf->GetFragmentList();
191 
192  // Number of fragments
193  size_t K = flist->size();
194  if(K > frag.size()) { frag.resize(K, 0); }
195 
196  for (size_t i=0; i<K; ++i) {
197  frag[i] = (*flist)[i];
198  KineticEnergy -=
199  ((*flist)[i]->GetFragmentMass() + (*flist)[i]->GetExcitationEnergy());
200  }
201 
202  // Check that there is enough energy to produce K fragments
203  KineticEnergy -= CoulombBarrier(flist);
204  if (KineticEnergy <= 0.0) { return 0.0; }
205 
206  // Spin factor S_n
207  G4double S_n = 1.0;
208 
209  // mass factors
210  G4double ProdMass = 1.0;
211  G4double SumMass = 0.0;
212 
213  for (size_t i=0; i<K; ++i) {
214  G4double mass = (*flist)[i]->GetFragmentMass();
215  ProdMass *= mass;
216  SumMass += mass;
217  S_n *= (*flist)[i]->GetPolarization();
218  }
219 
220  G4double MassFactor = ProdMass/SumMass;
221  MassFactor *= std::sqrt(MassFactor);
222 
223  G4double Coeff = g4pow->powN(ConstCoeff*A, K-1);
224 
225  //JMQ 111009 Bug fixed: gamma function for odd K was wrong by a factor 2
226  //VI 251014 Use G4Pow
227  G4double Gamma = 1.0;
228  G4double Energ = twopi*KineticEnergy;
229 
230  // integer argument of Gamma function
231  if ((K-1)%2 != 1) {
232  G4int N = 3*(K-1)/2;
233  Gamma = g4pow->factorial(N - 1);
234  Energ = g4pow->powN(Energ, N);
235 
236  // n + 1/2 argument of Gamma function
237  // http://en.wikipedia.org/wiki/Gamma_function
238  } else {
239  G4int n2 = 3*K - 4;
240  G4int n1 = n2/2;
241  Gamma = sqrtpi*g4pow->factorial(n2)/
242  (g4pow->powN(4.0,n1)*g4pow->factorial(n1));
243  Energ = g4pow->powN(Energ, n1)*std::sqrt(Energ);
244  }
245 
246  // Permutation Factor G_n
247  // search for identical fragments
248  G4double G_n = 1.0;
249  for(size_t i=0; i<K-1; ++i) {
250  if(frag[i]) {
251  G4int nf = 1;
252  for(size_t j=i+1; j<K; ++j) {
253  if(frag[i] == frag[j]) {
254  ++nf;
255  frag[j] = 0;
256  }
257  }
258  if(1 < nf) { G_n *= g4pow->factorial(nf); }
259  }
260  }
261 
262  G4double Weight = Coeff*MassFactor*S_n*Energ/(G_n*Gamma*KineticEnergy);
263 
264  return Weight;
265 }
G4double CoulombBarrier(const std::vector< const G4VFermiFragment *> *v)
const std::vector< const G4VFermiFragment * > * GetFragmentList() const
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:128
G4double factorial(G4int Z) const
Definition: G4Pow.hh:264
int G4int
Definition: G4Types.hh:78
const G4double sqrtpi
double A(double temperature)
static const double twopi
Definition: G4SIunits.hh:75
std::vector< const G4VFermiFragment * > frag
G4double ConstCoeff
**D E S C R I P T I O N
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator!=()

G4bool G4FermiBreakUp::operator!= ( const G4FermiBreakUp right) const
private

◆ operator=()

const G4FermiBreakUp& G4FermiBreakUp::operator= ( const G4FermiBreakUp right)
private

◆ operator==()

G4bool G4FermiBreakUp::operator== ( const G4FermiBreakUp right) const
private

◆ SelectConfiguration()

const std::vector< const G4VFermiFragment * > * G4FermiBreakUp::SelectConfiguration ( G4int  Z,
G4int  A,
G4double  mass 
)
private

Definition at line 145 of file G4FermiBreakUp.cc.

146 {
147  const std::vector<const G4VFermiFragment*>* res = 0;
148  // new std::vector<const G4VFermiFragment*>;
149  const std::vector<const G4FermiConfiguration*>* conflist =
150  thePool->GetConfigurationList(Z, A, mass);
151  if(!conflist) { return res; }
152  size_t nn = conflist->size();
153  if(0 < nn) {
154  size_t idx = 0;
155  if(1 < nn) {
156  if(nn > nmax) {
157  nmax = nn;
158  NormalizedWeights.resize(nmax,0.0);
159  }
160  G4double prob = 0.0;
161  for(size_t i=0; i<nn; ++i) {
162  prob += DecayProbability(A, mass, (*conflist)[i]);
163  NormalizedWeights[i] = prob;
164  }
165  prob *= G4UniformRand();
166  for(idx=0; idx<nn; ++idx) {
167  if(NormalizedWeights[idx] >= prob) { break; }
168  }
169  }
170  //const std::vector<const G4VFermiFragment*> flist =
171  res = (*conflist)[idx]->GetFragmentList();
172  //size_t nf = flist.size();
173  //for(size_t i=0; i<nf; ++i) { res->push_back(flist[i]); }
174  //G4cout << "FermiBreakUp: " << nn << " conf; selected idx= "
175  // << idx << " Nprod= " << nf << G4endl;
176  }
177  delete conflist;
178  return res;
179 }
#define G4UniformRand()
Definition: Randomize.hh:97
double A(double temperature)
Float_t Z
std::vector< G4double > NormalizedWeights
G4FermiFragmentsPool * thePool
double G4double
Definition: G4Types.hh:76
G4double DecayProbability(G4int A, G4double TotalE, const G4FermiConfiguration *)
const std::vector< const G4FermiConfiguration * > * GetConfigurationList(G4int Z, G4int A, G4double mass) const
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ Coef

G4double G4FermiBreakUp::Coef
private

Definition at line 78 of file G4FermiBreakUp.hh.

◆ ConstCoeff

G4double G4FermiBreakUp::ConstCoeff
private

Definition at line 79 of file G4FermiBreakUp.hh.

◆ frag

std::vector<const G4VFermiFragment*> G4FermiBreakUp::frag
private

Definition at line 86 of file G4FermiBreakUp.hh.

◆ g4pow

G4Pow* G4FermiBreakUp::g4pow
private

Definition at line 82 of file G4FermiBreakUp.hh.

◆ massRes

std::vector<G4double> G4FermiBreakUp::massRes
private

Definition at line 85 of file G4FermiBreakUp.hh.

◆ nmax

size_t G4FermiBreakUp::nmax
private

Definition at line 80 of file G4FermiBreakUp.hh.

◆ NormalizedWeights

std::vector<G4double> G4FermiBreakUp::NormalizedWeights
private

Definition at line 76 of file G4FermiBreakUp.hh.

◆ thePhaseSpace

const G4FermiPhaseSpaceDecay* G4FermiBreakUp::thePhaseSpace
private

Definition at line 84 of file G4FermiBreakUp.hh.

◆ thePool

G4FermiFragmentsPool* G4FermiBreakUp::thePool
private

Definition at line 74 of file G4FermiBreakUp.hh.


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