43 Initialize(theFragment);
50 if (!_ThePartitionManagerVector.empty()) {
51 std::for_each(_ThePartitionManagerVector.begin(),
52 _ThePartitionManagerVector.end(),
57void G4StatMFMicroCanonical::Initialize(
const G4Fragment & theFragment)
60 std::vector<G4StatMFMicroManager*>::iterator it;
98 G4double SCompoundNucleus = CalcEntropyOfCompoundNucleus(theFragment,TConfiguration);
101 _WCompoundNucleus = 1.0;
103 W += _WCompoundNucleus;
107 if (A > 110) MaxMult -= 1;
109 for (
G4int im = 2; im <= MaxMult; im++) {
112 _ThePartitionManagerVector.push_back(aMicroManager);
116 W = std::accumulate(_ThePartitionManagerVector.begin(),
117 _ThePartitionManagerVector.end(),
118 W, [](
const G4double& running_total,
121 return running_total + manager->GetProbability();
125 for (it = _ThePartitionManagerVector.begin(); it != _ThePartitionManagerVector.end(); ++it)
130 _WCompoundNucleus /= W;
136 for (it = _ThePartitionManagerVector.begin(); it != _ThePartitionManagerVector.end(); ++it)
146G4double G4StatMFMicroCanonical::CalcFreeInternalEnergy(
const G4Fragment & theFragment,
166 return VolumeTerm + SymmetryTerm + SurfaceTerm + CoulombTerm;
170G4StatMFMicroCanonical::CalcEntropyOfCompoundNucleus(
const G4Fragment & theFragment,
178 G4double Ta = std::max(std::sqrt(U/(0.125*A)),0.0012*MeV);
181 G4double ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Ta);
185 G4double InvLevelDensity = CalcInvLevelDensity(A);
191 }
else if (Da < 0.0) {
194 ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Tb);
200 ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Tb);
205 G4double eps = 1.0e-14 * std::abs(Tb-Ta);
207 for (
G4int i = 0; i < 1000; i++) {
209 if (std::abs(Ta-Tb) <= eps) {
213 ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Tc);
231 "G4StatMFMicrocanoncal::CalcEntropyOfCompoundNucleus: I can't calculate the temperature"
243 if (RandNumber < _WCompoundNucleus) {
251 G4double AccumWeight = _WCompoundNucleus;
252 std::vector<G4StatMFMicroManager*>::iterator it;
253 for (it = _ThePartitionManagerVector.begin(); it != _ThePartitionManagerVector.end(); ++it) {
254 AccumWeight += (*it)->GetProbability();
255 if (RandNumber < AccumWeight) {
259 throw G4HadronicException(__FILE__, __LINE__,
"G4StatMFMicroCanonical::ChooseAandZ: wrong normalization!");
265G4double G4StatMFMicroCanonical::CalcInvLevelDensity(
G4int anA)
double A(double temperature)
G4GLOB_DLL std::ostream G4cout
G4double GetExcitationEnergy() const
static G4Pow * GetInstance()
G4double Z13(G4int Z) const
G4double Z23(G4int Z) const
void CreateFragment(G4int A, G4int Z)
G4StatMFChannel * ChooseAandZ(const G4Fragment &theFragment)
G4StatMFMicroCanonical(const G4Fragment &theFragment)
~G4StatMFMicroCanonical()
static G4double DBetaDT(G4double T)
static G4double GetBeta0()
static G4double GetGamma0()
static G4double Beta(G4double T)
static G4double GetEpsilon0()
G4double __FreeInternalE0
G4double __MeanTemperature
G4double __MeanMultiplicity