44 Initialize(theFragment);
53 if (!_ThePartitionManagerVector.empty()) {
54 std::for_each(_ThePartitionManagerVector.begin(),
55 _ThePartitionManagerVector.end(),
64 void G4StatMFMicroCanonical::Initialize(
const G4Fragment & theFragment)
67 std::vector<G4StatMFMicroManager*>::iterator it;
106 G4double SCompoundNucleus = CalcEntropyOfCompoundNucleus(theFragment,TConfiguration);
109 _WCompoundNucleus = 1.0;
111 W += _WCompoundNucleus;
117 if (A > 110) MaxMult -= 1;
121 for (
G4int im = 2; im <= MaxMult; im++) {
124 _ThePartitionManagerVector.push_back(aMicroManager);
128 W = std::accumulate(_ThePartitionManagerVector.begin(),
129 _ThePartitionManagerVector.end(),
130 W,SumProbabilities());
133 for (it = _ThePartitionManagerVector.begin(); it != _ThePartitionManagerVector.end(); ++it)
138 _WCompoundNucleus /= W;
145 for (it = _ThePartitionManagerVector.begin(); it != _ThePartitionManagerVector.end(); ++it)
156 G4double G4StatMFMicroCanonical::CalcFreeInternalEnergy(
const G4Fragment & theFragment,
173 return VolumeTerm + SymmetryTerm + SurfaceTerm + CoulombTerm;
177 G4StatMFMicroCanonical::CalcEntropyOfCompoundNucleus(
const G4Fragment & theFragment,
186 G4double Ta = std::max(std::sqrt(U/(0.125*A)),0.0012*
MeV);
189 G4double ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Ta);
193 G4double InvLevelDensity = CalcInvLevelDensity(static_cast<G4int>(A));
199 }
else if (Da < 0.0) {
202 ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Tb);
208 ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Tb);
213 G4double eps = 1.0e-14 * std::fabs(Tb-Ta);
215 for (
G4int i = 0; i < 1000; i++) {
217 if (std::abs(Ta-Tb) <= eps) {
221 ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Tc);
239 "G4StatMFMicrocanoncal::CalcEntropyOfCompoundNucleus: I can't calculate the temperature"
251 if (RandNumber < _WCompoundNucleus) {
259 G4double AccumWeight = _WCompoundNucleus;
260 std::vector<G4StatMFMicroManager*>::iterator it;
261 for (it = _ThePartitionManagerVector.begin(); it != _ThePartitionManagerVector.end(); ++it) {
262 AccumWeight += (*it)->GetProbability();
263 if (RandNumber < AccumWeight) {
267 throw G4HadronicException(__FILE__, __LINE__,
"G4StatMFMicroCanonical::ChooseAandZ: wrong normalization!");
273 G4double G4StatMFMicroCanonical::CalcInvLevelDensity(
G4int anA)
277 if (anA == 1)
return 0.0;