44 throw G4HadronicException(__FILE__, __LINE__,
"G4StatMFMicroPartition::copy_constructor meant to not be accessable");
52 throw G4HadronicException(__FILE__, __LINE__,
"G4StatMFMicroPartition::operator= meant to not be accessable");
70 void G4StatMFMicroPartition::CoulombFreeEnergy(
G4int anA)
79 if (anA == 0 || anA == 1)
81 _theCoulombFreeEnergy.push_back(CoulombConstFactor*ZA*ZA);
83 else if (anA == 2 || anA == 3 || anA == 4)
86 _theCoulombFreeEnergy.push_back(CoulombConstFactor*0.5
91 _theCoulombFreeEnergy.push_back(CoulombConstFactor*ZA*ZA
96 G4double G4StatMFMicroPartition::GetCoulombEnergy(
void)
105 for (
unsigned int i = 0; i < _thePartition.size(); i++)
106 CoulombEnergy += _theCoulombFreeEnergy[i] -
elm_coupling*0.6*
107 ZA*ZA*_thePartition[i]*g4calc->
Z23(_thePartition[i])/
110 return CoulombEnergy;
121 for (
unsigned int i = 0; i < _thePartition.size(); i++)
123 if (_thePartition[i] == 0 || _thePartition[i] == 1)
125 PartitionEnergy += _theCoulombFreeEnergy[i];
127 else if (_thePartition[i] == 2)
131 + _theCoulombFreeEnergy[i];
133 else if (_thePartition[i] == 3)
137 + _theCoulombFreeEnergy[i];
139 else if (_thePartition[i] == 4)
143 + _theCoulombFreeEnergy[i]
144 + 4.*T*T/InvLevelDensity(4.);
151 T*T/InvLevelDensity(_thePartition[i]))
156 (1.0-2.0*theZ/theA)*(1.0-2.0*theZ/theA)*_thePartition[i] +
160 g4calc->
Z23(_thePartition[i]) +
163 _theCoulombFreeEnergy[i];
167 PartitionEnergy +=
elm_coupling*0.6*theZ*theZ*CoulombFactor/
169 + 1.5*T*(_thePartition.size()-1);
171 return PartitionEnergy;
177 G4double PartitionEnergy = GetPartitionEnergy(0.0);
181 if (std::fabs(U + FreeInternalE0 - PartitionEnergy) < 0.003)
return -1.0;
190 G4double Da = (U + FreeInternalE0 - GetPartitionEnergy(Ta))/U;
191 G4double Db = (U + FreeInternalE0 - GetPartitionEnergy(Tb))/U;
195 while (Da*Db > 0.0 && maxit < 1000)
199 Db = (U + FreeInternalE0 - GetPartitionEnergy(Tb))/U;
204 for (
G4int i = 0; i < 1000; i++)
207 if (std::fabs(Ta-Tb) <=
eps)
return Tmid;
208 G4double Dmid = (U + FreeInternalE0 - GetPartitionEnergy(Tmid))/U;
209 if (std::fabs(Dmid) < 0.003)
return Tmid;
222 G4cout <<
"G4StatMFMicroPartition::CalcPartitionTemperature: I can't calculate the temperature"
233 G4double T = CalcPartitionTemperature(U,FreeInternalE0);
234 if ( T <= 0.0)
return _Probability = 0.0;
242 for (i = 0; i < _thePartition.size() - 1; i++)
245 for (
unsigned int ii = i+1; i< _thePartition.size(); i++)
247 if (_thePartition[i] == _thePartition[ii]) f++;
255 for (i = 0; i < _thePartition.size(); i++)
257 ProbDegeneracy *= GetDegeneracyFactor(_thePartition[i]);
258 ProbA32 *= _thePartition[i]*std::sqrt((
G4double)_thePartition[i]);
263 for (i = 0; i < _thePartition.size(); i++)
266 if (_thePartition[i] == 4)
269 2.0*T*_thePartition[i]/InvLevelDensity(_thePartition[i]);
272 else if (_thePartition[i] > 4)
275 2.0*T*_thePartition[i]/InvLevelDensity(_thePartition[i])
282 ThermalWaveLenght3 = ThermalWaveLenght3*ThermalWaveLenght3*ThermalWaveLenght3;
287 kappa = kappa*kappa*kappa;
293 (_thePartition.size()-1.0)*
G4Log(FreeVolume/ThermalWaveLenght3) +
294 1.5*(_thePartition.size()-1.0) - 1.5*g4calc->
logZ(theA));
296 PartitionEntropy +=
G4Log(ProbDegeneracy) + TranslationalS;
297 _Entropy = PartitionEntropy;
300 G4double exponent = PartitionEntropy-SCompound;
301 if (exponent > 300.0) exponent = 300.0;
302 return _Probability =
G4Exp(exponent);
310 if (A > 4) DegFactor = 1.0;
311 else if (A == 1) DegFactor = 4.0;
312 else if (A == 2) DegFactor = 3.0;
313 else if (A == 3) DegFactor = 4.0;
314 else if (A == 4) DegFactor = 1.0;
321 std::vector<G4int> FragmentsZ;
328 for (
unsigned int i = 0; i < _thePartition.size(); i++)
332 if (Af > 1.5 && Af < 4.5) ZMean = 0.5*Af;
333 else ZMean = Af*Z0/A0;
334 G4double ZDispersion = std::sqrt(Af * MeanT/CC);
341 while (Zf < 0 || Zf > Af);
342 FragmentsZ.push_back(Zf);
345 ZBalance = Z0 - SumZ;
348 while (std::abs(ZBalance) > 1);
349 FragmentsZ[0] += ZBalance;
352 for (
unsigned int i = 0; i < _thePartition.size(); i++)
static G4double GetGamma0()
static G4Pow * GetInstance()
G4bool operator!=(const G4StatMFMicroPartition &right) const
ThreeVector shoot(const G4int Ap, const G4int Af)
static G4double GetKappaCoulomb()
static const G4double eps
G4bool operator==(const G4StatMFMicroPartition &right) const
void CreateFragment(G4int A, G4int Z)
G4StatMFChannel * ChooseZ(G4int A0, G4int Z0, G4double MeanT)
G4double logZ(G4int Z) const
G4GLOB_DLL std::ostream G4cout
G4double Z13(G4int Z) const
double A(double temperature)
G4StatMFMicroPartition(G4int A, G4int Z)
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double A13(G4double A) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double CalcPartitionProbability(G4double U, G4double FreeInternalE0, G4double SCompound)
static G4double DBetaDT(G4double T)
static G4double GetCoulomb()
G4double Z23(G4int Z) const
static constexpr double MeV
static constexpr double pi
static constexpr double fermi
static G4double Beta(G4double T)