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,
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;
static G4double GetGamma0()
static G4Pow * GetInstance()
G4StatMFChannel * ChooseAandZ(const G4Fragment &theFragment)
G4StatMFMicroCanonical(const G4Fragment &theFragment)
void CreateFragment(G4int A, G4int Z)
~G4StatMFMicroCanonical()
G4double Z13(G4int Z) const
G4double __MeanMultiplicity
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double __MeanTemperature
static G4double DBetaDT(G4double T)
G4double Z23(G4int Z) const
G4double __FreeInternalE0
static G4double GetEpsilon0()
static G4double GetBeta0()
static G4double Beta(G4double T)
G4double GetExcitationEnergy() const
G4GLOB_DLL std::ostream G4cerr