56 Initialize(theFragment);
64 if (!_theClusters.empty())
66 std::for_each(_theClusters.begin(),_theClusters.end(),DeleteFragment());
71 void G4StatMFMacroCanonical::Initialize(
const G4Fragment & theFragment)
86 CalculateTemperature(theFragment);
90 void G4StatMFMacroCanonical::CalculateTemperature(
const G4Fragment & theFragment)
105 _Kappa = _Kappa*_Kappa*_Kappa - 1.0;
129 std::vector<G4int> ANumbers(A);
131 G4double Multiplicity = ChooseA(A,ANumbers);
133 std::vector<G4int> FragmentsA;
136 for (i = 0; i <
A; i++)
138 for (
G4int j = 0; j < ANumbers[i]; j++) FragmentsA.push_back(i+1);
143 for (
G4int j = 0; j < Multiplicity; j++)
145 G4int FragmentsAMax = 0;
147 for (i = j; i < Multiplicity; i++)
149 if (FragmentsA[i] <= FragmentsAMax) {
continue; }
153 FragmentsAMax = FragmentsA[im];
158 FragmentsA[im] = FragmentsA[j];
159 FragmentsA[j] = FragmentsAMax;
162 return ChooseZ(Z,FragmentsA);
165 G4double G4StatMFMacroCanonical::ChooseA(
G4int A, std::vector<G4int> & ANumbers)
171 std::vector<G4double> AcumMultiplicity;
172 AcumMultiplicity.reserve(A);
174 AcumMultiplicity.push_back((*(_theClusters.begin()))->GetMeanMultiplicity());
175 for (std::vector<G4VStatMFMacroCluster*>::iterator it = _theClusters.begin()+1;
176 it != _theClusters.end(); ++it)
178 AcumMultiplicity.push_back((*it)->GetMeanMultiplicity()+AcumMultiplicity.back());
187 for (i = 0; i <
A; i++) ANumbers[i] = 0;
190 for (i = 0; i <
A; i++) {
191 if (RandNumber < AcumMultiplicity[i]) {
197 ANumbers[ThisOne] = ANumbers[ThisOne]+1;
202 }
while (CheckA > 0);
211 std::vector<G4int> & FragmentsA)
215 std::vector<G4int> FragmentsZ;
219 G4int multiplicity = FragmentsA.size();
224 for (
G4int i = 0; i < multiplicity; i++)
226 G4int A = FragmentsA[i];
230 if (RandNumber < (*_theClusters.begin())->GetZARatio())
232 FragmentsZ.push_back(1);
233 SumZ += FragmentsZ[i];
235 else FragmentsZ.push_back(0);
241 + 2*CP*g4calc->
Z23(FragmentsA[i]);
243 if (FragmentsA[i] > 1 && FragmentsA[i] < 5) { ZMean = 0.5*FragmentsA[i]; }
246 + _ChemPotentialNu)/CC;
255 }
while (z < 0 || z > A);
256 FragmentsZ.push_back(z);
262 }
while (std::abs(DeltaZ) > 1);
268 while (FragmentsZ[idx] < 1) { ++idx; }
270 FragmentsZ[idx] += DeltaZ;
273 for (
G4int i = multiplicity-1; i >= 0; i--)
static G4double GetGamma0()
static G4Pow * GetInstance()
ThreeVector shoot(const G4int Ap, const G4int Af)
G4StatMFChannel * ChooseAandZ(const G4Fragment &theFragment)
G4double GetEntropy(void) const
void CreateFragment(G4int A, G4int Z)
G4double GetChemicalPotentialMu(void) const
G4double Z13(G4int Z) const
double A(double temperature)
G4double CalcTemperature(void)
G4double GetMeanMultiplicity(void) const
G4double __MeanMultiplicity
G4double GetChemicalPotentialNu(void) const
~G4StatMFMacroCanonical()
G4double A13(G4double A) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4StatMFMacroCanonical(G4Fragment const &theFragment)
G4double __MeanTemperature
static G4double GetCoulomb()
G4double Z23(G4int Z) const
static constexpr double MeV
G4double __FreeInternalE0
static G4double GetBeta0()
G4double GetExcitationEnergy() const