44 Initialize(theFragment);
53 if (!_ThePartitionManagerVector.empty()) {
54 std::for_each(_ThePartitionManagerVector.begin(),
55 _ThePartitionManagerVector.end(),
64void 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)
156G4double G4StatMFMicroCanonical::CalcFreeInternalEnergy(
const G4Fragment & theFragment,
173 return VolumeTerm + SymmetryTerm + SurfaceTerm + CoulombTerm;
177G4StatMFMicroCanonical::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!");
273G4double G4StatMFMicroCanonical::CalcInvLevelDensity(
G4int anA)
277 if (anA == 1)
return 0.0;
G4DLLIMPORT std::ostream G4cerr
G4double GetExcitationEnergy() const
static G4Pow * GetInstance()
void CreateFragment(G4int A, G4int Z)
G4StatMFChannel * ChooseAandZ(const G4Fragment &theFragment)
G4StatMFMicroCanonical(const G4Fragment &theFragment)
~G4StatMFMicroCanonical()
static G4double GetEpsilon0()
static G4double GetGamma0()
static G4double GetBeta0()
static G4double DBetaDT(const G4double T)
static G4double Beta(const G4double T)
G4double __FreeInternalE0
G4double __MeanTemperature
G4double __MeanMultiplicity