45const G4double G4FermiConfigurationList::Kappa = 6.0;
46const G4double G4FermiConfigurationList::r0 = 1.3*CLHEP::fermi;
52 Coef = 0.6*(CLHEP::elm_coupling/r0)/g4pow->
Z13(1+
G4int(Kappa));
53 ConstCoeff = g4pow->
powN(r0/hbarc,3)*Kappa*std::sqrt(2.0/pi)/3.0;
57 NormalizedWeights.resize(nmax,0.0);
64G4FermiConfigurationList::CoulombBarrier(
65 const std::vector<const G4VFermiFragment*>& conf)
71 size_t nn = conf.size();
72 for (
size_t i=0; i<nn; ++i) {
73 G4int z = conf[i]->GetZ();
74 G4int a = conf[i]->GetA();
79 CoulombEnergy -= SumZ*SumZ/g4pow->
Z13(SumA);
80 return -Coef * CoulombEnergy;
84G4FermiConfigurationList::DecayProbability(
G4int A,
G4double TotalE,
95 std::set<G4int> combSet;
96 std::multiset<G4int> combmSet;
98 const std::vector<const G4VFermiFragment*> flist =
102 G4int K = flist.size();
104 for (
G4int i=0; i<K; ++i) {
105 G4int a = flist[i]->GetA();
108 G4double mass = flist[i]->GetFragmentMass();
112 S_n *= flist[i]->GetPolarization();
113 KineticEnergy -= mass + flist[i]->GetExcitationEnergy();
117 KineticEnergy -= CoulombBarrier(flist);
118 if (KineticEnergy <= 0.0) {
return 0.0; }
120 G4double MassFactor = ProdMass/SumMass;
121 MassFactor *= std::sqrt(MassFactor);
156 Gamma *= std::sqrt(pi)/g4pow->
powZ(2,n);
163 for (std::set<G4int>::iterator itr = combSet.begin();
164 itr != combSet.end(); ++itr)
166 for (
G4int ni = combmSet.count(*itr); ni > 1; ni--) { G_n *= ni; }
169 G4double Weight = Coeff * MassFactor * (S_n / G_n) / Gamma;
170 Weight *= std::sqrt(g4pow->
powN(KineticEnergy,3*(K-1)))/KineticEnergy;
180 const std::vector<const G4VFermiFragment*>* conf =
186 size_t nn = conf->size();
188 theResult->push_back(
new G4Fragment(theNucleus));
194 std::vector<G4double> mr;
196 for(
size_t i=0; i<nn; ++i) {
197 mr.push_back( (*conf)[i]->GetTotalEnergy() );
199 std::vector<G4LorentzVector*>* mom = thePhaseSpace.
Decay(M,mr);
205 size_t nmom = mom->size();
209 for (
size_t j=0; j<nmom; ++j) {
213 FourMomentum->
boost(boostVector);
217 size_t nfrag = fragment->size();
218 for (
size_t k=0; k<nfrag; ++k) { theResult->push_back((*fragment)[k]); }
229const std::vector<const G4VFermiFragment*>*
232 std::vector<const G4VFermiFragment*>* res =
233 new std::vector<const G4VFermiFragment*>;
234 const std::vector<G4FermiConfiguration*>* conflist =
236 if(!conflist) {
return res; }
237 size_t nn = conflist->size();
243 NormalizedWeights.resize(nmax,0.0);
246 for(
size_t i=0; i<
nn; ++i) {
247 prob += DecayProbability(A, mass, (*conflist)[i]);
248 NormalizedWeights[i] = prob;
251 for(idx=0; idx<
nn; ++idx) {
252 if(NormalizedWeights[idx] >= prob) {
break; }
255 const std::vector<const G4VFermiFragment*> flist =
256 (*conflist)[idx]->GetFragmentList();
257 size_t nf = flist.size();
258 for(
size_t i=0; i<nf; ++i) { res->push_back(flist[i]); }
std::vector< G4Fragment * > G4FragmentVector
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
G4FragmentVector * GetFragments(const G4Fragment &theNucleus)
~G4FermiConfigurationList()
G4FermiConfigurationList()
const std::vector< const G4VFermiFragment * > & GetFragmentList()
const std::vector< G4FermiConfiguration * > * GetConfigurationList(G4int Z, G4int A, G4double mass)
static G4FermiFragmentsPool * Instance()
std::vector< G4LorentzVector * > * Decay(const G4double, const std::vector< G4double > &) const
const G4LorentzVector & GetMomentum() const
static G4Pow * GetInstance()
G4double powN(G4double x, G4int n)
G4double powZ(G4int Z, G4double y)