59 if(0 == theInstance) {
66G4FermiFragmentsPool::G4FermiFragmentsPool()
76 for(
size_t i=0; i<17; ++i) {
77 size_t nn = list1[i].size();
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 size_t nn = listextra.size();
87 if(0 < nn) {
for(
size_t j=0; j<nn; ++j) {
delete listextra[j]; }}
88 nn = fragment_pool.size();
89 if(0 < nn) {
for(
size_t j=0; j<nn; ++j) {
delete fragment_pool[j]; }}
92void G4FermiFragmentsPool::Initialise()
218 G4int nfrag = fragment_pool.size();
221 for(
G4int i=0; i<nfrag; ++i) {
222 std::vector<const G4VFermiFragment*> newvec;
223 newvec.push_back(fragment_pool[i]);
225 G4int A = fragment_pool[i]->GetA();
226 list1[A].push_back(conf);
229 G4cout <<
"### G4FermiFragmentPool: " << nfrag
230 <<
" fragments" <<
G4endl;
231 for(
G4int A=1; A<maxA; ++A) {
232 G4cout <<
" A= " << A <<
" : Z= ";
233 for(
size_t j=0; j<list1[A].size(); ++j) {
234 G4cout << (list1[A])[j]->GetZ() <<
" ";
243 for(
G4int i=0; i<nfrag; ++i) {
244 G4int Z1 = fragment_pool[i]->GetZ();
245 G4int A1 = fragment_pool[i]->GetA();
246 for(
G4int j=0; j<nfrag; ++j) {
247 G4int Z2 = fragment_pool[j]->GetZ();
248 G4int A2 = fragment_pool[j]->GetA();
251 if(Z < maxZ && A < maxA) {
252 if(IsAvailable(Z, A)){
253 std::vector<const G4VFermiFragment*> newvec;
254 newvec.push_back(fragment_pool[i]);
255 newvec.push_back(fragment_pool[j]);
256 if(!IsExist(Z, A, newvec)) {
258 list2[A].push_back(conf);
267 G4cout <<
"### Pairs of fragments: " << counter <<
G4endl;
268 for(
G4int A=2; A<maxA; ++A) {
270 for(
size_t j=0; j<list2[A].size(); ++j) {
271 std::vector<const G4VFermiFragment*> vector = (list2[A])[j]->GetFragmentList();
272 G4int a1=vector[0]->GetA();
273 G4int z1=vector[0]->GetZ();
274 G4int a2=vector[1]->GetA();
275 G4int z2=vector[1]->GetZ();
276 G4cout <<
"("<<a1<<
","<<z1<<
")("<<a2<<
","<<z2<<
") % ";
279 G4cout<<
"---------------------------------------------------------------------------------"
287 for(
G4int A1=2; A1<maxA; ++A1) {
288 size_t nz = list2[A1].size();
289 for(
size_t idx=0; idx<nz; ++idx) {
297 for(
G4int j=0; j<nfrag; ++j) {
298 G4int Z2 = fragment_pool[j]->GetZ();
299 G4int A2 = fragment_pool[j]->GetA();
302 if(Z < maxZ && A < maxA) {
305 std::vector<const G4VFermiFragment*> newvec;
306 newvec.push_back(vec2[0]);
307 newvec.push_back(vec2[1]);
308 newvec.push_back(fragment_pool[j]);
309 if(!IsExist(Z, A, newvec)) {
311 list3[A].push_back(conf3);
321 G4cout <<
"### Triples of fragments: " << counter <<
G4endl;
322 for(
G4int A=3; A<maxA; ++A) {
324 for(
size_t j=0; j<list3[A].size(); ++j) {
325 std::vector<const G4VFermiFragment*> vector = (list3[A])[j]->GetFragmentList();
326 G4int a1=vector[0]->GetA();
327 G4int z1=vector[0]->GetZ();
328 G4int a2=vector[1]->GetA();
329 G4int z2=vector[1]->GetZ();
330 G4int a3=vector[2]->GetA();
331 G4int z3=vector[2]->GetZ();
332 G4cout <<
"("<<a1<<
","<<z1<<
")("<<a2<<
","<<z2<<
")("<<a3<<
","<<z3<<
") % ";
335 G4cout<<
"---------------------------------------------------------------------------------"
343 for(
G4int A1=3; A1<maxA; ++A1) {
344 size_t nz = list3[A1].size();
345 for(
size_t idx=0; idx<nz; ++idx) {
355 for(
G4int j=0; j<nfrag; ++j) {
356 G4int Z2 = fragment_pool[j]->GetZ();
357 G4int A2 = fragment_pool[j]->GetA();
360 if(Z < maxZ && A < maxA) {
363 std::vector<const G4VFermiFragment*> newvec;
364 newvec.push_back(vec3[0]);
365 newvec.push_back(vec3[1]);
366 newvec.push_back(vec3[2]);
367 newvec.push_back(fragment_pool[j]);
368 if(!IsExist(Z, A, newvec)) {
370 list4[A].push_back(conf4);
379 for(
G4int A1=2; A1<maxA; ++A1) {
380 size_t nz1 = list2[A1].size();
381 for(
size_t id1=0; id1<nz1; ++id1) {
389 for(
G4int A2=2; A2<maxA; ++A2) {
390 size_t nz2 = list2[A2].size();
391 for(
size_t id2=0; id2<nz2; ++id2) {
401 if(Z < maxZ && A < maxA) {
406 std::vector<const G4VFermiFragment*> newvec;
407 newvec.push_back(vec1[0]);
408 newvec.push_back(vec1[1]);
409 newvec.push_back(vec2[0]);
410 newvec.push_back(vec2[1]);
411 if(!IsExist(Z, A, newvec)) {
413 list4[A].push_back(conf4);
425 G4cout <<
"### Quartets of fragments: " << counter <<
G4endl;
426 for(
G4int A=4; A<maxA; ++A) {
428 for(
size_t j=0; j<list4[A].size(); ++j) {
429 std::vector<const G4VFermiFragment*> vector = (list4[A])[j]->GetFragmentList();
430 G4int a1=vector[0]->GetA();
431 G4int z1=vector[0]->GetZ();
432 G4int a2=vector[1]->GetA();
433 G4int z2=vector[1]->GetZ();
434 G4int a3=vector[2]->GetA();
435 G4int z3=vector[2]->GetZ();
436 G4int a4=vector[3]->GetA();
437 G4int z4=vector[3]->GetZ();
439 G4cout <<
"("<<a1<<
","<<z1<<
")("<<a2<<
","<<z2<<
")("<<a3<<
","<<z3<<
")("<<a4<<
","<<z4<<
") % ";
442 G4cout<<
"---------------------------------------------------------------------------------"
449const std::vector<G4FermiConfiguration*>*
455 std::vector<G4FermiConfiguration*>* v =
new std::vector<G4FermiConfiguration*>;
456 if(Z >= maxZ || A >= maxA) {
return v; }
462 size_t nz = list2[A].size();
464 for(
size_t j=0; j<nz; ++j) {
475 nz = list3[A].size();
477 for(
size_t j=0; j<nz; ++j) {
488 nz = list4[A].size();
490 for(
size_t j=0; j<nz; ++j) {
504 G4cout<<
"Total number of configurations = "<<nconf<<
" for A= "
505 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
506 size_t size_vector_conf = v->size();
507 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
508 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
509 size_t size_vector_fragments = v_frag.size();
510 G4cout<<size_vector_fragments<<
"-body configuration "<<jc+1<<
": ";
511 for(
size_t jf=0;jf<size_vector_fragments;++jf){
512 G4int af= v_frag[jf]->GetA();
513 G4int zf= v_frag[jf]->GetZ();
514 G4double ex=v_frag[jf]->GetExcitationEnergy();
515 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
518 G4cout<<
"-----------------------------------------------------"<<
G4endl;
525 nz = list1[A].size();
528 for(
size_t j=0; j<nz; ++j) {
539 G4cout<<
"Total number of configurations = "<<nconf<<
" for A= "
540 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
541 size_t size_vector_conf=v->size();
542 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
543 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
544 size_t size_vector_fragments=v_frag.size();
545 G4cout<<
"1 Fragment configuration "<<jc+1<<
": ";
546 for(
size_t jf=0;jf<size_vector_fragments;++jf){
547 G4int af= v_frag[jf]->GetA();
548 G4int zf= v_frag[jf]->GetZ();
549 G4double ex=v_frag[jf]->GetExcitationEnergy();
550 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
553 G4cout<<
"-----------------------------------------------------"<<
G4endl;
566 nz = listextra.size();
568 for(
size_t j=0; j<nz; ++j) {
570 if(Z == conf->
GetZ() && A == conf->
GetA() &&
576 G4cout<<
"Total number of configurations = "<<nconf<<
" for A= "
577 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
578 size_t size_vector_conf=v->size();
579 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
580 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
581 size_t size_vector_fragments=v_frag.size();
582 G4cout<<
"Found exotic configuration -> configuration "<<jc+1<<
": ";
583 for(
size_t jf=0;jf<size_vector_fragments;++jf){
584 G4int af= v_frag[jf]->GetA();
585 G4int zf= v_frag[jf]->GetZ();
586 G4double ex=v_frag[jf]->GetExcitationEnergy();
587 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
590 G4cout<<
"-----------------------------------------------------"<<
G4endl;
601 if(mass > Z*proton_mass_c2 + (A-Z)*neutron_mass_c2) {
602 std::vector<const G4VFermiFragment*> newvec;
604 for(
G4int i=0; i<A; ++i) {
605 if(i == Z) { idx = 0; }
606 newvec.push_back(fragment_pool[idx]);
609 listextra.push_back(conf);
613 G4cout<<
"Total number of configurations = "<<nconf<<
G4cout;
615 G4cout<<
"Total number of configurations = "<<nconf<<
" for A= "
616 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
617 size_t size_vector_conf=v->size();
618 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
619 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
620 size_t size_vector_fragments=v_frag.size();
621 G4cout<<
"New exotic configuration -> configuration "<<jc+1<<
": ";
622 for(
size_t jf=0;jf<size_vector_fragments;++jf){
623 G4int af= v_frag[jf]->GetA();
624 G4int zf= v_frag[jf]->GetZ();
625 G4double ex=v_frag[jf]->GetExcitationEnergy();
626 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
629 G4cout<<
"-----------------------------------------------------"<<
G4endl;
640 G4cout<<
"Total number of configurations = "<<nconf<<
G4endl;
642 G4cout<<
"Total number of configurations = "<<nconf<<
" for A= "
643 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
644 size_t size_vector_conf=v->size();
645 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
646 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
647 size_t size_vector_fragments=v_frag.size();
648 G4cout<<
"Only evaporation is possible -> configuration "<<jc+1<<
": ";
649 for(
size_t jf=0;jf<size_vector_fragments;++jf){
650 G4int af= v_frag[jf]->GetA();
651 G4int zf= v_frag[jf]->GetZ();
652 G4double ex=v_frag[jf]->GetExcitationEnergy();
653 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
656 G4cout<<
"-----------------------------------------------------"<<
G4endl;
664 G4cout <<
"G4FermiFragmentsPool::GetConfigurationList: WARNING: not "
665 <<
"able decay fragment Z= " << Z <<
" A= " << A
666 <<
" Mass(GeV)= " << mass/GeV<<
G4endl;
672G4FermiFragmentsPool::IsExist(
G4int Z,
G4int A,
673 std::vector<const G4VFermiFragment*>& newconf)
675 size_t nn = newconf.size();
677 for(
size_t i=0; i<nn; ++i) { mass += newconf[i]->GetTotalEnergy(); }
680 size_t nz = list2[A].size();
682 for(
size_t j=0; j<nz; ++j) {
684 if(Z == conf->
GetZ() && A == conf->
GetA() &&
685 std::fabs(mass - conf->
GetMass()) < keV) {
return true; }
692 size_t nz = list3[A].size();
694 for(
size_t j=0; j<nz; ++j) {
696 if(Z == conf->
GetZ() && A == conf->
GetA() &&
697 std::fabs(mass - conf->
GetMass()) < keV) {
return true; }
704 size_t nz = list4[A].size();
706 for(
size_t j=0; j<nz; ++j) {
708 if(Z == conf->
GetZ() && A == conf->
GetA() &&
709 std::fabs(mass - conf->
GetMass()) < keV) {
return true; }
721 if(Z >= maxZ || A >= maxA) {
return f; }
722 size_t nz = list1[A].size();
724 for(
size_t j=0; j<nz; ++j) {
G4DLLIMPORT std::ostream G4cout
const std::vector< const G4VFermiFragment * > & GetFragmentList()
const std::vector< G4FermiConfiguration * > * GetConfigurationList(G4int Z, G4int A, G4double mass)
static G4FermiFragmentsPool * Instance()
const G4VFermiFragment * GetFragment(G4int Z, G4int A)
static G4double GetNuclearMass(const G4double A, const G4double Z)