00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "G4FermiFragmentsPool.hh"
00047 #include "G4PhysicalConstants.hh"
00048 #include "G4SystemOfUnits.hh"
00049 #include "G4StableFermiFragment.hh"
00050 #include "G4B9FermiFragment.hh"
00051 #include "G4Be8FermiFragment.hh"
00052 #include "G4He5FermiFragment.hh"
00053 #include "G4Li5FermiFragment.hh"
00054
00055 G4FermiFragmentsPool* G4FermiFragmentsPool::theInstance = 0;
00056
00057 G4FermiFragmentsPool* G4FermiFragmentsPool::Instance()
00058 {
00059 if(0 == theInstance) {
00060 static G4FermiFragmentsPool pool;
00061 theInstance = &pool;
00062 }
00063 return theInstance;
00064 }
00065
00066 G4FermiFragmentsPool::G4FermiFragmentsPool()
00067 {
00068 maxZ = 9;
00069 maxA = 17;
00070 verbose = 0;
00071 Initialise();
00072 }
00073
00074 G4FermiFragmentsPool::~G4FermiFragmentsPool()
00075 {
00076 for(size_t i=0; i<17; ++i) {
00077 size_t nn = list1[i].size();
00078 if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete (list1[i])[j]; }}
00079 nn = list2[i].size();
00080 if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete (list2[i])[j]; }}
00081 nn = list3[i].size();
00082 if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete (list3[i])[j]; }}
00083 nn = list4[i].size();
00084 if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete (list4[i])[j]; }}
00085 }
00086 size_t nn = listextra.size();
00087 if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete listextra[j]; }}
00088 nn = fragment_pool.size();
00089 if(0 < nn) { for(size_t j=0; j<nn; ++j) { delete fragment_pool[j]; }}
00090 }
00091
00092 void G4FermiFragmentsPool::Initialise()
00093 {
00094
00095
00096
00097
00098
00099 fragment_pool.push_back(new G4StableFermiFragment( 1, 0, 2, 0.00*MeV ));
00100 fragment_pool.push_back(new G4StableFermiFragment( 1, 1, 2, 0.00*MeV ));
00101 fragment_pool.push_back(new G4StableFermiFragment( 2, 1, 3, 0.00*MeV ));
00102 fragment_pool.push_back(new G4StableFermiFragment( 3, 1, 2, 0.00*MeV ));
00103 fragment_pool.push_back(new G4StableFermiFragment( 3, 2, 2, 0.00*MeV ));
00104 fragment_pool.push_back(new G4StableFermiFragment( 4, 2, 1, 0.00*MeV ));
00105 fragment_pool.push_back(new G4He5FermiFragment ( 5, 2, 4, 0.00*MeV ));
00106 fragment_pool.push_back(new G4Li5FermiFragment ( 5, 3, 4, 0.00*MeV ));
00107 fragment_pool.push_back(new G4StableFermiFragment( 6, 2, 1, 0.00*MeV ));
00108 fragment_pool.push_back(new G4StableFermiFragment( 6, 3, 3, 0.00*MeV ));
00109 fragment_pool.push_back(new G4StableFermiFragment( 6, 3, 1, 3.562880*MeV ));
00110 fragment_pool.push_back(new G4StableFermiFragment( 7, 3, 4, 0.00*MeV ));
00111 fragment_pool.push_back(new G4StableFermiFragment( 7, 3, 2, 0.4776120*MeV ));
00112 fragment_pool.push_back(new G4StableFermiFragment( 7, 4, 4, 0.00*MeV ));
00113 fragment_pool.push_back(new G4StableFermiFragment( 7, 4, 2, 0.4290800*MeV ));
00114 fragment_pool.push_back(new G4StableFermiFragment( 8, 3, 5, 0.00*MeV ));
00115 fragment_pool.push_back(new G4StableFermiFragment( 8, 3, 3, 0.9808000*MeV ));
00116 fragment_pool.push_back(new G4Be8FermiFragment ( 8, 4, 1, 0.00*MeV ));
00117 fragment_pool.push_back(new G4StableFermiFragment( 9, 4, 4, 0.00*MeV ));
00118 fragment_pool.push_back(new G4B9FermiFragment ( 9, 5, 4, 0.00*MeV ));
00119 fragment_pool.push_back(new G4StableFermiFragment( 10, 4, 1, 0.00*MeV ));
00120 fragment_pool.push_back(new G4StableFermiFragment( 10, 4, 5, 3.368030*MeV ));
00121 fragment_pool.push_back(new G4StableFermiFragment( 10, 4, 8, 5.958390*MeV ));
00122 fragment_pool.push_back(new G4StableFermiFragment( 10, 4, 1, 6.179300*MeV ));
00123 fragment_pool.push_back(new G4StableFermiFragment( 10, 4, 5, 6.263300*MeV ));
00124 fragment_pool.push_back(new G4StableFermiFragment( 10, 5, 7, 0.00*MeV ));
00125 fragment_pool.push_back(new G4StableFermiFragment( 10, 5, 3, 0.7183500*MeV ));
00126 fragment_pool.push_back(new G4StableFermiFragment( 10, 5, 1, 1.740150*MeV ));
00127 fragment_pool.push_back(new G4StableFermiFragment( 10, 5, 3, 2.154300*MeV ));
00128 fragment_pool.push_back(new G4StableFermiFragment( 10, 5, 5, 3.587100*MeV ));
00129 fragment_pool.push_back(new G4StableFermiFragment( 10, 6, 3, 0.00*MeV ));
00130 fragment_pool.push_back(new G4StableFermiFragment( 10, 6, 5, 3.353600*MeV ));
00131 fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 4, 0.00*MeV ));
00132 fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 2, 2.124693*MeV ));
00133 fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 6, 4.444890*MeV ));
00134 fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 4, 5.020310*MeV ));
00135 fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 8, 6.742900*MeV ));
00136 fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 2, 6.791800*MeV ));
00137 fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 6, 7.285510*MeV ));
00138 fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 4, 7.977840*MeV ));
00139 fragment_pool.push_back(new G4StableFermiFragment( 11, 5, 6, 8.560300*MeV ));
00140 fragment_pool.push_back(new G4StableFermiFragment( 11, 6, 4, 0.00*MeV ));
00141 fragment_pool.push_back(new G4StableFermiFragment( 11, 6, 2, 2.00*MeV ));
00142 fragment_pool.push_back(new G4StableFermiFragment( 11, 6, 6, 4.318800*MeV ));
00143 fragment_pool.push_back(new G4StableFermiFragment( 11, 6, 4, 4.804200*MeV ));
00144 fragment_pool.push_back(new G4StableFermiFragment( 11, 6, 2, 6.339200*MeV ));
00145 fragment_pool.push_back(new G4StableFermiFragment( 11, 6, 8, 6.478200*MeV ));
00146 fragment_pool.push_back(new G4StableFermiFragment( 11, 6, 6, 6.904800*MeV ));
00147 fragment_pool.push_back(new G4StableFermiFragment( 11, 6, 4, 7.499700*MeV ));
00148 fragment_pool.push_back(new G4StableFermiFragment( 11, 6, 4, 8.104500*MeV ));
00149 fragment_pool.push_back(new G4StableFermiFragment( 11, 6, 6, 8.420000*MeV ));
00150 fragment_pool.push_back(new G4StableFermiFragment( 12, 5, 3, 0.00*MeV ));
00151 fragment_pool.push_back(new G4StableFermiFragment( 12, 5, 5, 0.9531400*MeV ));
00152 fragment_pool.push_back(new G4StableFermiFragment( 12, 5, 5, 1.673650*MeV ));
00153 fragment_pool.push_back(new G4StableFermiFragment( 12, 5, 3, 2.620800*MeV ));
00154 fragment_pool.push_back(new G4StableFermiFragment( 12, 6, 1, 0.00*MeV ));
00155 fragment_pool.push_back(new G4StableFermiFragment( 12, 6, 5, 4.438910*MeV ));
00156 fragment_pool.push_back(new G4StableFermiFragment( 13, 6, 2, 0.00*MeV ));
00157 fragment_pool.push_back(new G4StableFermiFragment( 13, 6, 2, 3.089443*MeV ));
00158 fragment_pool.push_back(new G4StableFermiFragment( 13, 6, 4, 3.684507*MeV ));
00159 fragment_pool.push_back(new G4StableFermiFragment( 13, 6, 6, 3.853807*MeV ));
00160 fragment_pool.push_back(new G4StableFermiFragment( 13, 7, 2, 0.00*MeV ));
00161 fragment_pool.push_back(new G4StableFermiFragment( 14, 6, 1, 0.00*MeV ));
00162 fragment_pool.push_back(new G4StableFermiFragment( 14, 6, 3, 6.093800*MeV ));
00163 fragment_pool.push_back(new G4StableFermiFragment( 14, 6, 1, 6.589400*MeV ));
00164 fragment_pool.push_back(new G4StableFermiFragment( 14, 6, 7, 6.728200*MeV ));
00165 fragment_pool.push_back(new G4StableFermiFragment( 14, 6, 1, 6.902600*MeV ));
00166 fragment_pool.push_back(new G4StableFermiFragment( 14, 6, 5, 7.012000*MeV ));
00167 fragment_pool.push_back(new G4StableFermiFragment( 14, 6, 5, 7.341000*MeV ));
00168 fragment_pool.push_back(new G4StableFermiFragment( 14, 7, 3, 0.00*MeV ));
00169 fragment_pool.push_back(new G4StableFermiFragment( 14, 7, 1, 2.312798*MeV ));
00170 fragment_pool.push_back(new G4StableFermiFragment( 14, 7, 3, 3.948100*MeV ));
00171 fragment_pool.push_back(new G4StableFermiFragment( 14, 7, 1, 4.915100*MeV ));
00172 fragment_pool.push_back(new G4StableFermiFragment( 14, 7, 5, 5.105890*MeV ));
00173 fragment_pool.push_back(new G4StableFermiFragment( 14, 7, 3, 5.691440*MeV ));
00174 fragment_pool.push_back(new G4StableFermiFragment( 14, 7, 7, 5.834250*MeV ));
00175 fragment_pool.push_back(new G4StableFermiFragment( 14, 7, 3, 6.203500*MeV ));
00176 fragment_pool.push_back(new G4StableFermiFragment( 14, 7, 7, 6.446170*MeV ));
00177 fragment_pool.push_back(new G4StableFermiFragment( 14, 7, 5, 7.029120*MeV ));
00178 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 2, 0.00*MeV ));
00179
00180 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 6, 5.270155*MeV ));
00181 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 2, 5.298822*MeV ));
00182 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 4, 6.323780*MeV ));
00183
00184 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 6, 7.155050*MeV ));
00185 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 4, 7.300830*MeV ));
00186 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 8, 7.567100*MeV ));
00187 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 2, 8.312620*MeV ));
00188 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 4, 8.571400*MeV ));
00189 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 2, 9.049710*MeV ));
00190
00191 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 4, 9.151900*MeV ));
00192 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 6, 9.154900*MeV ));
00193 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 2, 9.222100*MeV ));
00194 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 6, 9.760000*MeV ));
00195 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 8, 9.829000*MeV ));
00196 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 4, 9.925000*MeV ));
00197 fragment_pool.push_back(new G4StableFermiFragment( 15, 7, 4, 10.06600*MeV ));
00198 fragment_pool.push_back(new G4StableFermiFragment( 15, 8, 2, 0.00*MeV ));
00199
00200 fragment_pool.push_back(new G4StableFermiFragment( 15, 8, 2, 5.183000*MeV ));
00201 fragment_pool.push_back(new G4StableFermiFragment( 15, 8, 6, 5.240900*MeV ));
00202 fragment_pool.push_back(new G4StableFermiFragment( 15, 8, 4, 6.176300*MeV ));
00203 fragment_pool.push_back(new G4StableFermiFragment( 15, 8, 4, 6.793100*MeV ));
00204 fragment_pool.push_back(new G4StableFermiFragment( 15, 8, 6, 6.859400*MeV ));
00205 fragment_pool.push_back(new G4StableFermiFragment( 15, 8, 8, 7.275900*MeV ));
00206 fragment_pool.push_back(new G4StableFermiFragment( 16, 7, 5, 0.00*MeV ));
00207 fragment_pool.push_back(new G4StableFermiFragment( 16, 7, 1, 0.1204200*MeV ));
00208 fragment_pool.push_back(new G4StableFermiFragment( 16, 7, 7, 0.2982200*MeV ));
00209 fragment_pool.push_back(new G4StableFermiFragment( 16, 7, 3, 0.3972700*MeV ));
00210
00211 fragment_pool.push_back(new G4StableFermiFragment( 16, 8, 1, 0.00*MeV ));
00212 fragment_pool.push_back(new G4StableFermiFragment( 16, 8, 1, 6.049400*MeV ));
00213 fragment_pool.push_back(new G4StableFermiFragment( 16, 8, 7, 6.129890*MeV ));
00214 fragment_pool.push_back(new G4StableFermiFragment( 16, 8, 5, 6.917100*MeV ));
00215
00216 fragment_pool.push_back(new G4StableFermiFragment( 16, 8, 3, 7.116850*MeV ));
00217
00218 G4int nfrag = fragment_pool.size();
00219
00220
00221 for(G4int i=0; i<nfrag; ++i) {
00222 std::vector<const G4VFermiFragment*> newvec;
00223 newvec.push_back(fragment_pool[i]);
00224 G4FermiConfiguration* conf = new G4FermiConfiguration(newvec);
00225 G4int A = fragment_pool[i]->GetA();
00226 list1[A].push_back(conf);
00227 }
00228 if(verbose > 0) {
00229 G4cout << "### G4FermiFragmentPool: " << nfrag
00230 << " fragments" << G4endl;
00231 for(G4int A=1; A<maxA; ++A) {
00232 G4cout << " A= " << A << " : Z= ";
00233 for(size_t j=0; j<list1[A].size(); ++j) {
00234 G4cout << (list1[A])[j]->GetZ() << " ";
00235 }
00236 G4cout << G4endl;
00237 }
00238 }
00239
00240
00241 G4int counter = 0;
00242 G4int tot = 0;
00243 for(G4int i=0; i<nfrag; ++i) {
00244 G4int Z1 = fragment_pool[i]->GetZ();
00245 G4int A1 = fragment_pool[i]->GetA();
00246 for(G4int j=0; j<nfrag; ++j) {
00247 G4int Z2 = fragment_pool[j]->GetZ();
00248 G4int A2 = fragment_pool[j]->GetA();
00249 G4int Z = Z1 + Z2;
00250 G4int A = A1 + A2;
00251 if(Z < maxZ && A < maxA) {
00252 if(IsAvailable(Z, A)){
00253 std::vector<const G4VFermiFragment*> newvec;
00254 newvec.push_back(fragment_pool[i]);
00255 newvec.push_back(fragment_pool[j]);
00256 if(!IsExist(Z, A, newvec)) {
00257 G4FermiConfiguration* conf = new G4FermiConfiguration(newvec);
00258 list2[A].push_back(conf);
00259 ++counter;
00260 }
00261 }
00262 }
00263 }
00264 }
00265 if(verbose > 0) {
00266 G4cout << G4endl;
00267 G4cout << "### Pairs of fragments: " << counter << G4endl;
00268 for(G4int A=2; A<maxA; ++A) {
00269 G4cout << " A= " << A<<G4endl;
00270 for(size_t j=0; j<list2[A].size(); ++j) {
00271 std::vector<const G4VFermiFragment*> vector = (list2[A])[j]->GetFragmentList();
00272 G4int a1=vector[0]->GetA();
00273 G4int z1=vector[0]->GetZ();
00274 G4int a2=vector[1]->GetA();
00275 G4int z2=vector[1]->GetZ();
00276 G4cout << "("<<a1<<","<<z1<<")("<<a2<<","<<z2<<") % ";
00277 }
00278 G4cout<<G4endl;
00279 G4cout<<"---------------------------------------------------------------------------------"
00280 << G4endl;
00281 }
00282 }
00283
00284
00285 tot += counter;
00286 counter = 0;
00287 for(G4int A1=2; A1<maxA; ++A1) {
00288 size_t nz = list2[A1].size();
00289 for(size_t idx=0; idx<nz; ++idx) {
00290 G4FermiConfiguration* conf2 = (list2[A1])[idx];
00291 G4int Z1 = conf2->GetZ();
00292 std::vector<const G4VFermiFragment*> vec2 = conf2->GetFragmentList();
00293
00294
00295
00296
00297 for(G4int j=0; j<nfrag; ++j) {
00298 G4int Z2 = fragment_pool[j]->GetZ();
00299 G4int A2 = fragment_pool[j]->GetA();
00300 G4int Z = Z1 + Z2;
00301 G4int A = A1 + A2;
00302 if(Z < maxZ && A < maxA) {
00303
00304
00305 std::vector<const G4VFermiFragment*> newvec;
00306 newvec.push_back(vec2[0]);
00307 newvec.push_back(vec2[1]);
00308 newvec.push_back(fragment_pool[j]);
00309 if(!IsExist(Z, A, newvec)) {
00310 G4FermiConfiguration* conf3 = new G4FermiConfiguration(newvec);
00311 list3[A].push_back(conf3);
00312 ++counter;
00313
00314 }
00315 }
00316 }
00317 }
00318 }
00319 if(verbose > 0) {
00320 G4cout << G4endl;
00321 G4cout << "### Triples of fragments: " << counter << G4endl;
00322 for(G4int A=3; A<maxA; ++A) {
00323 G4cout << " A= " << A<<G4endl;
00324 for(size_t j=0; j<list3[A].size(); ++j) {
00325 std::vector<const G4VFermiFragment*> vector = (list3[A])[j]->GetFragmentList();
00326 G4int a1=vector[0]->GetA();
00327 G4int z1=vector[0]->GetZ();
00328 G4int a2=vector[1]->GetA();
00329 G4int z2=vector[1]->GetZ();
00330 G4int a3=vector[2]->GetA();
00331 G4int z3=vector[2]->GetZ();
00332 G4cout << "("<<a1<<","<<z1<<")("<<a2<<","<<z2<<")("<<a3<<","<<z3<<") % ";
00333 }
00334 G4cout<<G4endl;
00335 G4cout<<"---------------------------------------------------------------------------------"
00336 << G4endl;
00337 }
00338 }
00339
00340
00341 tot += counter;
00342 counter = 0;
00343 for(G4int A1=3; A1<maxA; ++A1) {
00344 size_t nz = list3[A1].size();
00345 for(size_t idx=0; idx<nz; ++idx) {
00346 G4FermiConfiguration* conf3 = (list3[A1])[idx];
00347 G4int Z1 = conf3->GetZ();
00348 std::vector<const G4VFermiFragment*> vec3 = conf3->GetFragmentList();
00349
00350
00351
00352
00353
00354
00355 for(G4int j=0; j<nfrag; ++j) {
00356 G4int Z2 = fragment_pool[j]->GetZ();
00357 G4int A2 = fragment_pool[j]->GetA();
00358 G4int Z = Z1 + Z2;
00359 G4int A = A1 + A2;
00360 if(Z < maxZ && A < maxA) {
00361
00362
00363 std::vector<const G4VFermiFragment*> newvec;
00364 newvec.push_back(vec3[0]);
00365 newvec.push_back(vec3[1]);
00366 newvec.push_back(vec3[2]);
00367 newvec.push_back(fragment_pool[j]);
00368 if(!IsExist(Z, A, newvec)) {
00369 G4FermiConfiguration* conf4 = new G4FermiConfiguration(newvec);
00370 list4[A].push_back(conf4);
00371 ++counter;
00372 }
00373
00374 }
00375 }
00376 }
00377 }
00378
00379 for(G4int A1=2; A1<maxA; ++A1) {
00380 size_t nz1 = list2[A1].size();
00381 for(size_t id1=0; id1<nz1; ++id1) {
00382 G4FermiConfiguration* conf1 = (list2[A1])[id1];
00383 G4int Z1 = conf1->GetZ();
00384 std::vector<const G4VFermiFragment*> vec1 = conf1->GetFragmentList();
00385
00386
00387
00388
00389 for(G4int A2=2; A2<maxA; ++A2) {
00390 size_t nz2 = list2[A2].size();
00391 for(size_t id2=0; id2<nz2; ++id2) {
00392 G4FermiConfiguration* conf2 = (list2[A2])[id2];
00393 G4int Z2 = conf2->GetZ();
00394 std::vector<const G4VFermiFragment*> vec2 = conf2->GetFragmentList();
00395
00396
00397
00398
00399 G4int Z = Z1 + Z2;
00400 G4int A = A1 + A2;
00401 if(Z < maxZ && A < maxA) {
00402
00403
00404
00405
00406 std::vector<const G4VFermiFragment*> newvec;
00407 newvec.push_back(vec1[0]);
00408 newvec.push_back(vec1[1]);
00409 newvec.push_back(vec2[0]);
00410 newvec.push_back(vec2[1]);
00411 if(!IsExist(Z, A, newvec)) {
00412 G4FermiConfiguration* conf4 = new G4FermiConfiguration(newvec);
00413 list4[A].push_back(conf4);
00414 ++counter;
00415 }
00416
00417 }
00418 }
00419 }
00420 }
00421 }
00422 if(verbose > 0) {
00423 tot += counter;
00424 G4cout << G4endl;
00425 G4cout << "### Quartets of fragments: " << counter << G4endl;
00426 for(G4int A=4; A<maxA; ++A) {
00427 G4cout << " A= " << A<<G4endl;
00428 for(size_t j=0; j<list4[A].size(); ++j) {
00429 std::vector<const G4VFermiFragment*> vector = (list4[A])[j]->GetFragmentList();
00430 G4int a1=vector[0]->GetA();
00431 G4int z1=vector[0]->GetZ();
00432 G4int a2=vector[1]->GetA();
00433 G4int z2=vector[1]->GetZ();
00434 G4int a3=vector[2]->GetA();
00435 G4int z3=vector[2]->GetZ();
00436 G4int a4=vector[3]->GetA();
00437 G4int z4=vector[3]->GetZ();
00438
00439 G4cout << "("<<a1<<","<<z1<<")("<<a2<<","<<z2<<")("<<a3<<","<<z3<<")("<<a4<<","<<z4<<") % ";
00440 }
00441 G4cout<<G4endl;
00442 G4cout<<"---------------------------------------------------------------------------------"
00443 << G4endl;
00444 }
00445 G4cout << "Total number: " << tot << G4endl;
00446 }
00447 }
00448
00449 const std::vector<G4FermiConfiguration*>*
00450 G4FermiFragmentsPool::GetConfigurationList(G4int Z, G4int A, G4double mass)
00451 {
00452
00453 G4int nconf=0;
00454
00455 std::vector<G4FermiConfiguration*>* v = new std::vector<G4FermiConfiguration*>;
00456 if(Z >= maxZ || A >= maxA) { return v; }
00457
00458
00459
00460
00461
00462 size_t nz = list2[A].size();
00463 if(0 < nz) {
00464 for(size_t j=0; j<nz; ++j) {
00465 G4FermiConfiguration* conf = (list2[A])[j];
00466 if(Z == conf->GetZ() && mass >= conf->GetMass()) {
00467 v->push_back(conf);
00468 ++nconf;
00469 }
00470
00471
00472 }
00473 }
00474
00475 nz = list3[A].size();
00476 if(0 < nz) {
00477 for(size_t j=0; j<nz; ++j) {
00478 G4FermiConfiguration* conf = (list3[A])[j];
00479 if(Z == conf->GetZ() && mass >= conf->GetMass()) {
00480 v->push_back(conf);
00481 ++nconf;
00482 }
00483
00484
00485 }
00486 }
00487
00488 nz = list4[A].size();
00489 if(0 < nz) {
00490 for(size_t j=0; j<nz; ++j) {
00491 G4FermiConfiguration* conf = (list4[A])[j];
00492 if(Z == conf->GetZ() && mass >= conf->GetMass()) {
00493 v->push_back(conf);
00494 ++nconf;
00495 }
00496
00497
00498 }
00499 }
00500
00501 if(0 < v->size()) {
00502 if(verbose > 0) {
00503 G4double ExEn= mass - G4NucleiProperties::GetNuclearMass(A,Z);
00504 G4cout<<"Total number of configurations = "<<nconf<<" for A= "
00505 <<A<<" Z= "<<Z<<" E*= "<< ExEn<<" MeV"<<G4endl;
00506 size_t size_vector_conf = v->size();
00507 for(size_t jc=0; jc<size_vector_conf; ++jc) {
00508 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
00509 size_t size_vector_fragments = v_frag.size();
00510 G4cout<<size_vector_fragments<<"-body configuration "<<jc+1<<": ";
00511 for(size_t jf=0;jf<size_vector_fragments;++jf){
00512 G4int af= v_frag[jf]->GetA();
00513 G4int zf= v_frag[jf]->GetZ();
00514 G4double ex=v_frag[jf]->GetExcitationEnergy();
00515 G4cout<<"(a="<<af<<", z="<<zf<<", ex="<<ex<<") ";
00516 }
00517 G4cout<<G4endl;
00518 G4cout<<"-----------------------------------------------------"<<G4endl;
00519 }
00520 }
00521 return v;
00522 }
00523
00524
00525 nz = list1[A].size();
00526 G4FermiConfiguration* conf1 = 0;
00527 if(0 < nz) {
00528 for(size_t j=0; j<nz; ++j) {
00529 G4FermiConfiguration* conf = (list1[A])[j];
00530
00531
00532
00533 if(Z == conf->GetZ() && mass >= conf->GetMass()) {
00534 if(!(conf->GetFragmentList())[0]->IsStable()) {
00535 ++nconf;
00536 v->push_back(conf);
00537 if(verbose > 0) {
00538 G4double ExEn= mass -G4NucleiProperties::GetNuclearMass(A,Z);
00539 G4cout<<"Total number of configurations = "<<nconf<<" for A= "
00540 <<A<<" Z= "<<Z<<" E*= "<< ExEn<<" MeV"<<G4endl;
00541 size_t size_vector_conf=v->size();
00542 for(size_t jc=0; jc<size_vector_conf; ++jc) {
00543 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
00544 size_t size_vector_fragments=v_frag.size();
00545 G4cout<<"1 Fragment configuration "<<jc+1<<": ";
00546 for(size_t jf=0;jf<size_vector_fragments;++jf){
00547 G4int af= v_frag[jf]->GetA();
00548 G4int zf= v_frag[jf]->GetZ();
00549 G4double ex=v_frag[jf]->GetExcitationEnergy();
00550 G4cout<<"(a="<<af<<", z="<<zf<<", ex="<<ex<<") ";
00551 }
00552 G4cout<<G4endl;
00553 G4cout<<"-----------------------------------------------------"<<G4endl;
00554 }
00555 }
00556 return v;
00557 } else {
00558 conf1 = conf;
00559 break;
00560 }
00561 }
00562 }
00563 }
00564
00565
00566 nz = listextra.size();
00567 if(0 < nz) {
00568 for(size_t j=0; j<nz; ++j) {
00569 G4FermiConfiguration* conf = listextra[j];
00570 if(Z == conf->GetZ() && A == conf->GetA() &&
00571 mass >= conf->GetMass()) {
00572 ++nconf;
00573 v->push_back(conf);
00574 if(verbose > 0) {
00575 G4double ExEn= mass -G4NucleiProperties::GetNuclearMass(A,Z);
00576 G4cout<<"Total number of configurations = "<<nconf<<" for A= "
00577 <<A<<" Z= "<<Z<<" E*= "<< ExEn<<" MeV"<<G4endl;
00578 size_t size_vector_conf=v->size();
00579 for(size_t jc=0; jc<size_vector_conf; ++jc) {
00580 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
00581 size_t size_vector_fragments=v_frag.size();
00582 G4cout<<"Found exotic configuration -> configuration "<<jc+1<<": ";
00583 for(size_t jf=0;jf<size_vector_fragments;++jf){
00584 G4int af= v_frag[jf]->GetA();
00585 G4int zf= v_frag[jf]->GetZ();
00586 G4double ex=v_frag[jf]->GetExcitationEnergy();
00587 G4cout<<"(a="<<af<<", z="<<zf<<", ex="<<ex<<") ";
00588 }
00589 G4cout<<G4endl;
00590 G4cout<<"-----------------------------------------------------"<<G4endl;
00591 }
00592 }
00593 return v;
00594 }
00595 }
00596 }
00597
00598
00599
00600
00601 if(mass > Z*proton_mass_c2 + (A-Z)*neutron_mass_c2) {
00602 std::vector<const G4VFermiFragment*> newvec;
00603 G4int idx = 1;
00604 for(G4int i=0; i<A; ++i) {
00605 if(i == Z) { idx = 0; }
00606 newvec.push_back(fragment_pool[idx]);
00607 }
00608 G4FermiConfiguration* conf = new G4FermiConfiguration(newvec);
00609 listextra.push_back(conf);
00610 v->push_back(conf);
00611 ++nconf;
00612 if(verbose > 0) {
00613 G4cout<<"Total number of configurations = "<<nconf<<G4cout;
00614 G4double ExEn= mass -G4NucleiProperties::GetNuclearMass(A,Z);
00615 G4cout<<"Total number of configurations = "<<nconf<<" for A= "
00616 <<A<<" Z= "<<Z<<" E*= "<< ExEn<<" MeV"<<G4endl;
00617 size_t size_vector_conf=v->size();
00618 for(size_t jc=0; jc<size_vector_conf; ++jc) {
00619 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
00620 size_t size_vector_fragments=v_frag.size();
00621 G4cout<<"New exotic configuration -> configuration "<<jc+1<<": ";
00622 for(size_t jf=0;jf<size_vector_fragments;++jf){
00623 G4int af= v_frag[jf]->GetA();
00624 G4int zf= v_frag[jf]->GetZ();
00625 G4double ex=v_frag[jf]->GetExcitationEnergy();
00626 G4cout<<"(a="<<af<<", z="<<zf<<", ex="<<ex<<") ";
00627 }
00628 G4cout<<G4endl;
00629 G4cout<<"-----------------------------------------------------"<<G4endl;
00630 }
00631 }
00632 return v;
00633 }
00634
00635
00636 if(conf1) {
00637 v->push_back(conf1);
00638 ++nconf;
00639 if(verbose > 0) {
00640 G4cout<<"Total number of configurations = "<<nconf<<G4endl;
00641 G4double ExEn= mass -G4NucleiProperties::GetNuclearMass(A,Z);
00642 G4cout<<"Total number of configurations = "<<nconf<<" for A= "
00643 <<A<<" Z= "<<Z<<" E*= "<< ExEn<<" MeV"<<G4endl;
00644 size_t size_vector_conf=v->size();
00645 for(size_t jc=0; jc<size_vector_conf; ++jc) {
00646 std::vector<const G4VFermiFragment*> v_frag = (*v)[jc]->GetFragmentList();
00647 size_t size_vector_fragments=v_frag.size();
00648 G4cout<<"Only evaporation is possible -> configuration "<<jc+1<<": ";
00649 for(size_t jf=0;jf<size_vector_fragments;++jf){
00650 G4int af= v_frag[jf]->GetA();
00651 G4int zf= v_frag[jf]->GetZ();
00652 G4double ex=v_frag[jf]->GetExcitationEnergy();
00653 G4cout<<"(a="<<af<<", z="<<zf<<", ex="<<ex<<") ";
00654 }
00655 G4cout<<G4endl;
00656 G4cout<<"-----------------------------------------------------"<<G4endl;
00657 }
00658 }
00659 return v;
00660 }
00661
00662
00663 if(verbose > 0) {
00664 G4cout << "G4FermiFragmentsPool::GetConfigurationList: WARNING: not "
00665 << "able decay fragment Z= " << Z << " A= " << A
00666 << " Mass(GeV)= " << mass/GeV<< G4endl;
00667 }
00668 return v;
00669 }
00670
00671 G4bool
00672 G4FermiFragmentsPool::IsExist(G4int Z, G4int A,
00673 std::vector<const G4VFermiFragment*>& newconf)
00674 {
00675 size_t nn = newconf.size();
00676 G4double mass = 0.0;
00677 for(size_t i=0; i<nn; ++i) { mass += newconf[i]->GetTotalEnergy(); }
00678
00679 if(2 == nn) {
00680 size_t nz = list2[A].size();
00681 if(0 < nz) {
00682 for(size_t j=0; j<nz; ++j) {
00683 G4FermiConfiguration* conf = (list2[A])[j];
00684 if(Z == conf->GetZ() && A == conf->GetA() &&
00685 std::fabs(mass - conf->GetMass()) < keV) {return true; }
00686 }
00687 }
00688 return false;
00689 }
00690
00691 if(3 == nn) {
00692 size_t nz = list3[A].size();
00693 if(0 < nz) {
00694 for(size_t j=0; j<nz; ++j) {
00695 G4FermiConfiguration* conf = (list3[A])[j];
00696 if(Z == conf->GetZ() && A == conf->GetA() &&
00697 std::fabs(mass - conf->GetMass()) < keV) { return true; }
00698 }
00699 }
00700 return false;
00701 }
00702
00703 if(4 == nn) {
00704 size_t nz = list4[A].size();
00705 if(0 < nz) {
00706 for(size_t j=0; j<nz; ++j) {
00707 G4FermiConfiguration* conf = (list4[A])[j];
00708 if(Z == conf->GetZ() && A == conf->GetA() &&
00709 std::fabs(mass - conf->GetMass()) < keV) { return true; }
00710 }
00711 }
00712 return false;
00713 }
00714 return false;
00715 }
00716
00717 const G4VFermiFragment*
00718 G4FermiFragmentsPool::GetFragment(G4int Z, G4int A)
00719 {
00720 const G4VFermiFragment* f = 0;
00721 if(Z >= maxZ || A >= maxA) { return f; }
00722 size_t nz = list1[A].size();
00723 if(0 < nz) {
00724 for(size_t j=0; j<nz; ++j) {
00725 G4FermiConfiguration* conf = (list1[A])[j];
00726 if(Z == conf->GetZ()) { return (conf->GetFragmentList())[0]; }
00727 }
00728 }
00729 return f;
00730 }