44 Initialize(theFragment);
51 if (!_ThePartitionManagerVector.empty()) {
52 std::for_each(_ThePartitionManagerVector.begin(),
53 _ThePartitionManagerVector.end(),
58 void G4StatMFMicroCanonical::Initialize(
const G4Fragment & theFragment)
61 std::vector<G4StatMFMicroManager*>::iterator it;
99 G4double SCompoundNucleus = CalcEntropyOfCompoundNucleus(theFragment,TConfiguration);
102 _WCompoundNucleus = 1.0;
104 W += _WCompoundNucleus;
108 if (A > 110) MaxMult -= 1;
110 for (
G4int im = 2; im <= MaxMult; im++) {
113 _ThePartitionManagerVector.push_back(aMicroManager);
117 W = std::accumulate(_ThePartitionManagerVector.begin(),
118 _ThePartitionManagerVector.end(),
119 W, SumProbabilities());
122 for (it = _ThePartitionManagerVector.begin(); it != _ThePartitionManagerVector.end(); ++it)
127 _WCompoundNucleus /= W;
133 for (it = _ThePartitionManagerVector.begin(); it != _ThePartitionManagerVector.end(); ++it)
143 G4double G4StatMFMicroCanonical::CalcFreeInternalEnergy(
const G4Fragment & theFragment,
163 return VolumeTerm + SymmetryTerm + SurfaceTerm + CoulombTerm;
167 G4StatMFMicroCanonical::CalcEntropyOfCompoundNucleus(
const G4Fragment & theFragment,
178 G4double ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Ta);
182 G4double InvLevelDensity = CalcInvLevelDensity(A);
188 }
else if (Da < 0.0) {
191 ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Tb);
197 ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Tb);
204 for (
G4int i = 0; i < 1000; i++) {
206 if (std::abs(Ta-Tb) <=
eps) {
210 ECompoundNucleus = CalcFreeInternalEnergy(theFragment,Tc);
228 "G4StatMFMicrocanoncal::CalcEntropyOfCompoundNucleus: I can't calculate the temperature"
240 if (RandNumber < _WCompoundNucleus) {
248 G4double AccumWeight = _WCompoundNucleus;
249 std::vector<G4StatMFMicroManager*>::iterator it;
250 for (it = _ThePartitionManagerVector.begin(); it != _ThePartitionManagerVector.end(); ++it) {
251 AccumWeight += (*it)->GetProbability();
252 if (RandNumber < AccumWeight) {
256 throw G4HadronicException(__FILE__, __LINE__,
"G4StatMFMicroCanonical::ChooseAandZ: wrong normalization!");
262 G4double G4StatMFMicroCanonical::CalcInvLevelDensity(
G4int anA)
static G4double GetGamma0()
static G4Pow * GetInstance()
G4StatMFChannel * ChooseAandZ(const G4Fragment &theFragment)
G4StatMFMicroCanonical(const G4Fragment &theFragment)
static const G4double eps
void CreateFragment(G4int A, G4int Z)
~G4StatMFMicroCanonical()
G4GLOB_DLL std::ostream G4cout
G4double Z13(G4int Z) const
double A(double temperature)
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
static constexpr double MeV
G4double __FreeInternalE0
static G4double GetEpsilon0()
static G4double GetBeta0()
static G4double Beta(G4double T)
G4double GetExcitationEnergy() const