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 elm_coupling
static constexpr double MeV
static constexpr double pi
static constexpr double fermi
static G4double Beta(G4double T)