58 if(0 == theInstance) {
65 G4FermiFragmentsPool::G4FermiFragmentsPool()
75 for(
size_t i=0; i<17; ++i) {
76 size_t nn = list1[i].size();
77 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete (list1[i])[j]; }}
79 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete (list2[i])[j]; }}
81 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete (list3[i])[j]; }}
83 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete (list4[i])[j]; }}
85 size_t nn = listextra.size();
86 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete listextra[j]; }}
87 nn = fragment_pool.size();
88 if(0 < nn) {
for(
size_t j=0; j<
nn; ++j) {
delete fragment_pool[j]; }}
91 void G4FermiFragmentsPool::Initialise()
217 G4int nfrag = fragment_pool.size();
220 for(
G4int i=0; i<nfrag; ++i) {
221 std::vector<const G4VFermiFragment*> newvec;
222 newvec.push_back(fragment_pool[i]);
224 G4int A = fragment_pool[i]->GetA();
225 list1[A].push_back(conf);
228 G4cout <<
"### G4FermiFragmentPool: " << nfrag
229 <<
" fragments" <<
G4endl;
230 for(
G4int A=1; A<maxA; ++A) {
231 G4cout <<
" A= " << A <<
" : Z= ";
232 for(
size_t j=0; j<list1[A].size(); ++j) {
233 G4cout << (list1[A])[j]->GetZ() <<
" ";
242 for(
G4int i=0; i<nfrag; ++i) {
243 G4int Z1 = fragment_pool[i]->GetZ();
244 G4int A1 = fragment_pool[i]->GetA();
245 for(
G4int j=0; j<nfrag; ++j) {
246 G4int Z2 = fragment_pool[j]->GetZ();
247 G4int A2 = fragment_pool[j]->GetA();
250 if(Z < maxZ && A < maxA) {
251 if(IsAvailable(Z, A)){
252 std::vector<const G4VFermiFragment*> newvec;
253 newvec.push_back(fragment_pool[i]);
254 newvec.push_back(fragment_pool[j]);
255 if(!IsExist(Z, A, newvec)) {
257 list2[A].push_back(conf);
266 G4cout <<
"### Pairs of fragments: " << counter <<
G4endl;
267 for(
G4int A=2; A<maxA; ++A) {
269 for(
size_t j=0; j<list2[A].size(); ++j) {
270 std::vector<const G4VFermiFragment*> vector = (list2[A])[j]->GetFragmentList();
271 G4int a1=vector[0]->GetA();
272 G4int z1=vector[0]->GetZ();
273 G4int a2=vector[1]->GetA();
274 G4int z2=vector[1]->GetZ();
275 G4cout <<
"("<<a1<<
","<<z1<<
")("<<a2<<
","<<z2<<
") % ";
278 G4cout<<
"---------------------------------------------------------------------------------"
286 for(
G4int A1=2; A1<maxA; ++A1) {
287 size_t nz = list2[A1].size();
288 for(
size_t idx=0; idx<nz; ++idx) {
296 for(
G4int j=0; j<nfrag; ++j) {
297 G4int Z2 = fragment_pool[j]->GetZ();
298 G4int A2 = fragment_pool[j]->GetA();
301 if(Z < maxZ && A < maxA) {
304 std::vector<const G4VFermiFragment*> newvec;
305 newvec.push_back(vec2[0]);
306 newvec.push_back(vec2[1]);
307 newvec.push_back(fragment_pool[j]);
308 if(!IsExist(Z, A, newvec)) {
310 list3[A].push_back(conf3);
320 G4cout <<
"### Triples of fragments: " << counter <<
G4endl;
321 for(
G4int A=3; A<maxA; ++A) {
323 for(
size_t j=0; j<list3[A].size(); ++j) {
324 std::vector<const G4VFermiFragment*> vector = (list3[A])[j]->GetFragmentList();
325 G4int a1=vector[0]->GetA();
326 G4int z1=vector[0]->GetZ();
327 G4int a2=vector[1]->GetA();
328 G4int z2=vector[1]->GetZ();
329 G4int a3=vector[2]->GetA();
330 G4int z3=vector[2]->GetZ();
331 G4cout <<
"("<<a1<<
","<<z1<<
")("<<a2<<
","<<z2<<
")("<<a3<<
","<<z3<<
") % ";
334 G4cout<<
"---------------------------------------------------------------------------------"
342 for(
G4int A1=3; A1<maxA; ++A1) {
343 size_t nz = list3[A1].size();
344 for(
size_t idx=0; idx<nz; ++idx) {
354 for(
G4int j=0; j<nfrag; ++j) {
355 G4int Z2 = fragment_pool[j]->GetZ();
356 G4int A2 = fragment_pool[j]->GetA();
359 if(Z < maxZ && A < maxA) {
362 std::vector<const G4VFermiFragment*> newvec;
363 newvec.push_back(vec3[0]);
364 newvec.push_back(vec3[1]);
365 newvec.push_back(vec3[2]);
366 newvec.push_back(fragment_pool[j]);
367 if(!IsExist(Z, A, newvec)) {
369 list4[A].push_back(conf4);
378 for(
G4int A1=2; A1<maxA; ++A1) {
379 size_t nz1 = list2[A1].size();
380 for(
size_t id1=0; id1<nz1; ++id1) {
388 for(
G4int A2=2; A2<maxA; ++A2) {
389 size_t nz2 = list2[A2].size();
390 for(
size_t id2=0; id2<nz2; ++id2) {
400 if(Z < maxZ && A < maxA) {
405 std::vector<const G4VFermiFragment*> newvec;
406 newvec.push_back(vec1[0]);
407 newvec.push_back(vec1[1]);
408 newvec.push_back(vec2[0]);
409 newvec.push_back(vec2[1]);
410 if(!IsExist(Z, A, newvec)) {
412 list4[A].push_back(conf4);
424 G4cout <<
"### Quartets of fragments: " << counter <<
G4endl;
425 for(
G4int A=4; A<maxA; ++A) {
427 for(
size_t j=0; j<list4[A].size(); ++j) {
428 std::vector<const G4VFermiFragment*> vector = (list4[A])[j]->GetFragmentList();
429 G4int a1=vector[0]->GetA();
430 G4int z1=vector[0]->GetZ();
431 G4int a2=vector[1]->GetA();
432 G4int z2=vector[1]->GetZ();
433 G4int a3=vector[2]->GetA();
434 G4int z3=vector[2]->GetZ();
435 G4int a4=vector[3]->GetA();
436 G4int z4=vector[3]->GetZ();
438 G4cout <<
"("<<a1<<
","<<z1<<
")("<<a2<<
","<<z2<<
")("<<a3<<
","<<z3<<
")("<<a4<<
","<<z4<<
") % ";
441 G4cout<<
"---------------------------------------------------------------------------------"
448 const std::vector<G4FermiConfiguration*>*
454 std::vector<G4FermiConfiguration*>*
v =
new std::vector<G4FermiConfiguration*>;
455 if(Z >= maxZ || A >= maxA) {
return v; }
461 size_t nz = list2[A].size();
463 for(
size_t j=0; j<nz; ++j) {
474 nz = list3[A].size();
476 for(
size_t j=0; j<nz; ++j) {
487 nz = list4[A].size();
489 for(
size_t j=0; j<nz; ++j) {
503 G4cout<<
"Total number of configurations = "<<nconf<<
" for A= "
504 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
505 size_t size_vector_conf = v->size();
506 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
507 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
508 size_t size_vector_fragments = v_frag.size();
509 G4cout<<size_vector_fragments<<
"-body configuration "<<jc+1<<
": ";
510 for(
size_t jf=0;jf<size_vector_fragments;++jf){
511 G4int af= v_frag[jf]->GetA();
512 G4int zf= v_frag[jf]->GetZ();
513 G4double ex=v_frag[jf]->GetExcitationEnergy();
514 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
517 G4cout<<
"-----------------------------------------------------"<<
G4endl;
524 nz = list1[A].size();
527 for(
size_t j=0; j<nz; ++j) {
538 G4cout<<
"Total number of configurations = "<<nconf<<
" for A= "
539 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
540 size_t size_vector_conf=v->size();
541 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
542 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
543 size_t size_vector_fragments=v_frag.size();
544 G4cout<<
"1 Fragment configuration "<<jc+1<<
": ";
545 for(
size_t jf=0;jf<size_vector_fragments;++jf){
546 G4int af= v_frag[jf]->GetA();
547 G4int zf= v_frag[jf]->GetZ();
548 G4double ex=v_frag[jf]->GetExcitationEnergy();
549 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
552 G4cout<<
"-----------------------------------------------------"<<
G4endl;
565 nz = listextra.size();
567 for(
size_t j=0; j<nz; ++j) {
569 if(Z == conf->
GetZ() && A == conf->
GetA() &&
575 G4cout<<
"Total number of configurations = "<<nconf<<
" for A= "
576 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
577 size_t size_vector_conf=v->size();
578 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
579 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
580 size_t size_vector_fragments=v_frag.size();
581 G4cout<<
"Found exotic configuration -> configuration "<<jc+1<<
": ";
582 for(
size_t jf=0;jf<size_vector_fragments;++jf){
583 G4int af= v_frag[jf]->GetA();
584 G4int zf= v_frag[jf]->GetZ();
585 G4double ex=v_frag[jf]->GetExcitationEnergy();
586 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
589 G4cout<<
"-----------------------------------------------------"<<
G4endl;
601 std::vector<const G4VFermiFragment*> newvec;
603 for(
G4int i=0; i<A; ++i) {
604 if(i == Z) { idx = 0; }
605 newvec.push_back(fragment_pool[idx]);
608 listextra.push_back(conf);
612 G4cout<<
"Total number of configurations = "<<nconf<<
G4endl;
614 G4cout<<
"Total number of configurations = "<<nconf<<
" for A= "
615 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
616 size_t size_vector_conf=v->size();
617 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
618 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
619 size_t size_vector_fragments=v_frag.size();
620 G4cout<<
"New exotic configuration -> configuration "<<jc+1<<
": ";
621 for(
size_t jf=0;jf<size_vector_fragments;++jf){
622 G4int af= v_frag[jf]->GetA();
623 G4int zf= v_frag[jf]->GetZ();
624 G4double ex=v_frag[jf]->GetExcitationEnergy();
625 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
628 G4cout<<
"-----------------------------------------------------"<<
G4endl;
639 G4cout<<
"Total number of configurations = "<<nconf<<
G4endl;
641 G4cout<<
"Total number of configurations = "<<nconf<<
" for A= "
642 <<A<<
" Z= "<<Z<<
" E*= "<< ExEn<<
" MeV"<<
G4endl;
643 size_t size_vector_conf=v->size();
644 for(
size_t jc=0; jc<size_vector_conf; ++jc) {
645 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
646 size_t size_vector_fragments=v_frag.size();
647 G4cout<<
"Only evaporation is possible -> configuration "<<jc+1<<
": ";
648 for(
size_t jf=0;jf<size_vector_fragments;++jf){
649 G4int af= v_frag[jf]->GetA();
650 G4int zf= v_frag[jf]->GetZ();
651 G4double ex=v_frag[jf]->GetExcitationEnergy();
652 G4cout<<
"(a="<<af<<
", z="<<zf<<
", ex="<<ex<<
") ";
655 G4cout<<
"-----------------------------------------------------"<<
G4endl;
663 G4cout <<
"G4FermiFragmentsPool::GetConfigurationList: WARNING: not "
664 <<
"able decay fragment Z= " << Z <<
" A= " << A
671 G4FermiFragmentsPool::IsExist(
G4int Z,
G4int A,
672 std::vector<const G4VFermiFragment*>& newconf)
674 size_t nn = newconf.size();
676 for(
size_t i=0; i<
nn; ++i) { mass += newconf[i]->GetTotalEnergy(); }
679 size_t nz = list2[A].size();
681 for(
size_t j=0; j<nz; ++j) {
683 if(Z == conf->
GetZ() && A == conf->
GetA() &&
684 std::fabs(mass - conf->
GetMass()) <
keV) {
return true; }
691 size_t nz = list3[A].size();
693 for(
size_t j=0; j<nz; ++j) {
695 if(Z == conf->
GetZ() && A == conf->
GetA() &&
696 std::fabs(mass - conf->
GetMass()) <
keV) {
return true; }
703 size_t nz = list4[A].size();
705 for(
size_t j=0; j<nz; ++j) {
707 if(Z == conf->
GetZ() && A == conf->
GetA() &&
708 std::fabs(mass - conf->
GetMass()) <
keV) {
return true; }
720 if(Z >= maxZ || A >= maxA) {
return f; }
721 size_t nz = list1[A].size();
723 for(
size_t j=0; j<nz; ++j) {
static G4double GetNuclearMass(const G4double A, const G4double Z)
const std::vector< const G4VFermiFragment * > & GetFragmentList()
G4GLOB_DLL std::ostream G4cout
const G4VFermiFragment * GetFragment(G4int Z, G4int A)
const std::vector< G4FermiConfiguration * > * GetConfigurationList(G4int Z, G4int A, G4double mass)
static G4FermiFragmentsPool * Instance()