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 #include "G4FissionStore.hh"
00033 #include "G4FissionConfiguration.hh"
00034 #include <cmath>
00035
00036 G4FissionStore::G4FissionStore() : verboseLevel(0) {
00037 if (verboseLevel > 1)
00038 G4cout << " >>> G4FissionStore::G4FissionStore" << G4endl;
00039 }
00040
00041 void G4FissionStore::addConfig(G4double a, G4double z, G4double ez,
00042 G4double ek, G4double ev) {
00043 G4FissionConfiguration config(a, z, ez, ek, ev);
00044 configurations.push_back(config);
00045 if (verboseLevel > 2) G4cout << config << G4endl;
00046 }
00047
00048 G4FissionConfiguration G4FissionStore::generateConfiguration(G4double amax,
00049 G4double rand) const {
00050 if (verboseLevel > 1)
00051 G4cout << " >>> G4FissionStore::generateConfiguration" << G4endl;
00052
00053 const G4double small = -30.0;
00054
00055 G4double totProb = 0.0;
00056 configProbs.resize(size(),0.);
00057
00058 if (verboseLevel > 3)
00059 G4cout << " amax " << amax << " ic " << size() << G4endl;
00060
00061 for (size_t i = 0; i < size(); i++) {
00062 G4double ez = configurations[i].ezet;
00063 G4double pr = ez - amax;
00064
00065 if (pr < small) pr = small;
00066 pr = std::exp(pr);
00067 if (verboseLevel > 2) {
00068 G4cout << configurations[i] << "\n probability " << pr << G4endl;
00069 }
00070 totProb += pr;
00071 configProbs[i] = totProb;
00072 };
00073
00074 G4double st = totProb * rand;
00075
00076 size_t igen = 0;
00077 while (configProbs[igen] <= st && igen < size()) igen++;
00078
00079 if (verboseLevel > 3) G4cout << " igen " << igen << G4endl;
00080
00081 return configurations[igen];
00082 }