58 if(0 == theInstance) {
60 theInstance = &instance;
65 G4FermiFragmentsPool::G4FermiFragmentsPool()
76 for(
size_t i=0; i<17; ++i) {
78 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete (list1[i])[j]; }}
80 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete (list2[i])[j]; }}
82 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete (list3[i])[j]; }}
84 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete (list4[i])[j]; }}
86 nn = fragment_pool.size();
87 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete fragment_pool[j]; }}
93 if (2 == Z && 5 == A) { res =
false; }
94 else if(3 == Z && 5 == A) { res =
false; }
95 else if(4 == Z && 8 == A) { res =
false; }
96 else if(5 == Z && 9 == A) { res =
false; }
113 return &thePhaseSpace;
116 void G4FermiFragmentsPool::Initialise()
242 G4int nfrag = fragment_pool.size();
243 std::vector<const G4VFermiFragment*> newvec;
248 for(
G4int i=0; i<nfrag; ++i) {
249 newvec[0] = fragment_pool[i];
251 G4int A = fragment_pool[i]->GetA();
252 list1[
A].push_back(conf);
255 G4cout <<
"### G4FermiFragmentPool: " << nfrag
256 <<
" fragments" <<
G4endl;
257 for(
G4int A=1; A<maxA; ++
A) {
258 G4cout <<
" A= " << A <<
" : Z= ";
259 for(
size_t j=0; j<list1[
A].size(); ++j) {
260 G4cout << (list1[
A])[j]->GetZ() <<
" ";
270 for(
G4int i=0; i<nfrag; ++i) {
271 G4int Z1 = fragment_pool[i]->GetZ();
272 G4int A1 = fragment_pool[i]->GetA();
273 for(
G4int j=0; j<nfrag; ++j) {
274 G4int Z2 = fragment_pool[j]->GetZ();
275 G4int A2 = fragment_pool[j]->GetA();
278 if(Z < maxZ && A < maxA && IsAvailable(Z, A)) {
279 newvec[0] = fragment_pool[i];
280 newvec[1] = fragment_pool[j];
281 if(!IsExist(Z, A, newvec)) {
283 list2[
A].push_back(conf);
291 G4cout <<
"### Pairs of fragments: " << counter <<
G4endl;
292 for(
G4int A=2; A<maxA; ++
A) {
294 for(
size_t j=0; j<list2[
A].size(); ++j) {
295 const std::vector<const G4VFermiFragment*>* vec
296 = (list2[
A])[j]->GetFragmentList();
297 G4int a1=(*vec)[0]->GetA();
298 G4int z1=(*vec)[0]->GetZ();
299 G4int a2=(*vec)[1]->GetA();
300 G4int z2=(*vec)[1]->GetZ();
301 G4cout <<
"("<<a1<<
","<<z1<<
")("<<a2<<
","<<z2<<
") % ";
304 G4cout<<
"----------------------------------------------------------------"
313 for(
G4int A1=2; A1<maxA; ++A1) {
314 size_t nz = list2[A1].size();
315 for(
size_t idx=0; idx<nz; ++idx) {
318 const std::vector<const G4VFermiFragment*>* vec2 =
320 for(
G4int j=0; j<nfrag; ++j) {
321 G4int Z2 = fragment_pool[j]->GetZ();
322 G4int A2 = fragment_pool[j]->GetA();
325 if(Z < maxZ && A < maxA && IsAvailable(Z, A)) {
326 newvec[0] = (*vec2)[0];
327 newvec[1] = (*vec2)[1];
328 newvec[2] = fragment_pool[j];
329 if(!IsExist(Z, A, newvec)) {
331 list3[
A].push_back(conf3);
340 G4cout <<
"### Triples of fragments: " << counter <<
G4endl;
341 for(
G4int A=3; A<maxA; ++
A) {
343 for(
size_t j=0; j<list3[
A].size(); ++j) {
344 const std::vector<const G4VFermiFragment*>* vec
345 = (list3[
A])[j]->GetFragmentList();
346 G4int a1=(*vec)[0]->GetA();
347 G4int z1=(*vec)[0]->GetZ();
348 G4int a2=(*vec)[1]->GetA();
349 G4int z2=(*vec)[1]->GetZ();
350 G4int a3=(*vec)[2]->GetA();
351 G4int z3=(*vec)[2]->GetZ();
352 G4cout <<
"("<<a1<<
","<<z1<<
")("<<a2<<
","<<z2<<
")("<<a3<<
","<<z3<<
") % ";
355 G4cout<<
"----------------------------------------------------------------"
364 for(
G4int A1=3; A1<maxA; ++A1) {
365 size_t nz = list3[A1].size();
366 for(
size_t idx=0; idx<nz; ++idx) {
369 const std::vector<const G4VFermiFragment*>* vec3 =
371 for(
G4int j=0; j<nfrag; ++j) {
372 G4int Z2 = fragment_pool[j]->GetZ();
373 G4int A2 = fragment_pool[j]->GetA();
376 if(Z < maxZ && A < maxA && IsAvailable(Z, A)) {
377 newvec[0] = (*vec3)[0];
378 newvec[1] = (*vec3)[1];
379 newvec[2] = (*vec3)[2];
380 newvec[3] = fragment_pool[j];
381 if(!IsExist(Z, A, newvec)) {
383 list4[
A].push_back(conf4);
391 for(
G4int A1=2; A1<maxA; ++A1) {
392 size_t nz1 = list2[A1].size();
393 for(
size_t id1=0; id1<nz1; ++id1) {
396 const std::vector<const G4VFermiFragment*>* vec1 =
398 for(
G4int A2=2; A2<maxA; ++A2) {
399 size_t nz2 = list2[A2].size();
400 for(
size_t id2=0; id2<nz2; ++id2) {
403 const std::vector<const G4VFermiFragment*>* vec2 =
407 if(Z < maxZ && A < maxA && IsAvailable(Z, A)) {
408 newvec[0] = (*vec1)[0];
409 newvec[1] = (*vec1)[1];
410 newvec[2] = (*vec2)[0];
411 newvec[3] = (*vec2)[1];
412 if(!IsExist(Z, A, newvec)) {
415 list4[
A].push_back(conf4);
426 G4cout <<
"### Quartets of fragments: " << counter <<
G4endl;
427 for(
G4int A=4; A<maxA; ++
A) {
429 for(
size_t j=0; j<list4[
A].size(); ++j) {
430 const std::vector<const G4VFermiFragment*>* vec
431 = (list4[
A])[j]->GetFragmentList();
432 G4int a1=(*vec)[0]->GetA();
433 G4int z1=(*vec)[0]->GetZ();
434 G4int a2=(*vec)[1]->GetA();
435 G4int z2=(*vec)[1]->GetZ();
436 G4int a3=(*vec)[2]->GetA();
437 G4int z3=(*vec)[2]->GetZ();
438 G4int a4=(*vec)[3]->GetA();
439 G4int z4=(*vec)[3]->GetZ();
441 G4cout <<
"("<<a1<<
","<<z1<<
")("<<a2<<
","<<z2<<
")("<<a3<<
","<<z3<<
")("
442 <<a4<<
","<<z4<<
") % ";
445 G4cout<<
"----------------------------------------------------------------"
454 if(Z >= maxZ || A >= maxA || A <= 0) {
return false; }
456 size_t nz = list2[
A].size();
458 for(
size_t j=0; j<nz; ++j) {
460 if(Z == conf->
GetZ() && mass >= conf->
GetMass()) {
return true; }
464 nz = list3[
A].size();
466 for(
size_t j=0; j<nz; ++j) {
468 if(Z == conf->
GetZ() && mass >= conf->
GetMass()) {
return true; }
472 nz = list4[
A].size();
474 for(
size_t j=0; j<nz; ++j) {
476 if(Z == conf->
GetZ() && mass >= conf->
GetMass()) {
return true; }
481 nz = list1[
A].size();
483 for(
size_t j=0; j<nz; ++j) {
493 const std::vector<const G4FermiConfiguration*>*
496 std::vector<const G4FermiConfiguration*>* v =
497 new std::vector<const G4FermiConfiguration*>;
498 if(Z >= maxZ || A >= maxA) {
return v; }
504 size_t nz = list2[
A].size();
506 for(
size_t j=0; j<nz; ++j) {
515 nz = list3[
A].size();
517 for(
size_t j=0; j<nz; ++j) {
526 nz = list4[
A].size();
528 for(
size_t j=0; j<nz; ++j) {
540 G4cout<<
"Total number of configurations = "<<v->size()<<
" for A= "
541 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
542 size_t size_vector_conf = v->size();
543 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
544 const std::vector<const G4VFermiFragment*>* v_frag =
545 (*v)[jc]->GetFragmentList();
546 size_t size_vector_fragments = v_frag->size();
547 G4cout<<size_vector_fragments<<
"-body configuration "<<jc+1<<
": ";
548 for(
size_t jf=0;jf<size_vector_fragments;++jf){
549 G4int af= (*v_frag)[jf]->GetA();
550 G4int zf= (*v_frag)[jf]->GetZ();
551 G4double ex=(*v_frag)[jf]->GetExcitationEnergy();
552 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
555 G4cout<<
"-----------------------------------------------------"<<
G4endl;
562 nz = list1[
A].size();
564 for(
size_t j=0; j<nz; ++j) {
574 G4cout<<
"Only 1 configurations for A= "
575 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
576 const std::vector<const G4VFermiFragment*>* v_frag
577 = (*v)[0]->GetFragmentList();
578 size_t size_vector_fragments=v_frag->size();
579 G4cout<<
"1 Fragment configuration: ";
580 for(
size_t jf=0;jf<size_vector_fragments;++jf){
581 G4int af= (*v_frag)[jf]->GetA();
582 G4int zf= (*v_frag)[jf]->GetZ();
583 G4double ex=(*v_frag)[jf]->GetExcitationEnergy();
584 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
587 G4cout<<
"-----------------------------------------------------"<<
G4endl;
596 G4cout <<
"G4FermiFragmentsPool::GetConfigurationList: WARNING: not "
597 <<
"able decay fragment Z= " << Z <<
" A= " << A
604 std::vector<const G4VFermiFragment*>& newconf)
const
606 size_t nn = newconf.size();
608 for(
size_t i=0; i<
nn; ++i) { mass += newconf[i]->GetTotalEnergy(); }
611 size_t nz = list2[
A].size();
613 for(
size_t j=0; j<nz; ++j) {
615 if(Z == conf->
GetZ() && A == conf->
GetA() &&
616 std::fabs(mass - conf->
GetMass()) <
keV) {
return true; }
623 size_t nz = list3[
A].size();
625 for(
size_t j=0; j<nz; ++j) {
627 if(Z == conf->
GetZ() && A == conf->
GetA() &&
628 std::fabs(mass - conf->
GetMass()) <
keV) {
return true; }
635 size_t nz = list4[
A].size();
637 for(
size_t j=0; j<nz; ++j) {
639 if(Z == conf->
GetZ() && A == conf->
GetA() &&
640 std::fabs(mass - conf->
GetMass()) <
keV) {
return true; }
652 if(Z < maxZ && A < maxA) {
653 size_t nz = list1[
A].size();
654 for(
size_t j=0; j<nz; ++j) {
656 if(Z == conf->
GetZ()) {
676 G4cout <<
"##### List of Fragments in the Fermi Fragment Pool #####"
678 G4int nfrag = fragment_pool.size();
679 for(
G4int i=0; i<nfrag; ++i) {
static G4double GetNuclearMass(const G4double A, const G4double Z)
const G4VFermiFragment * GetFragment(G4int Z, G4int A) const
G4bool IsApplicable(G4int Z, G4int A, G4double mass) const
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
void DumpFragment(const G4VFermiFragment *f) const
static constexpr double GeV
G4double GetExcitationEnergy(void) const
G4double GetFragmentMass(void) const
static constexpr double MeV
static G4FermiFragmentsPool * Instance()
const std::vector< const G4VFermiFragment * > * GetFragmentList() const
static constexpr double keV
const std::vector< const G4FermiConfiguration * > * GetConfigurationList(G4int Z, G4int A, G4double mass) const
const G4FermiPhaseSpaceDecay * GetFermiPhaseSpaceDecay() const