43 throw G4HadronicException(__FILE__, __LINE__,
"G4StatMFMicroPartition::copy_constructor meant to not be accessible");
51 throw G4HadronicException(__FILE__, __LINE__,
"G4StatMFMicroPartition::operator= meant to not be accessible");
69void G4StatMFMicroPartition::CoulombFreeEnergy(
G4int anA)
78 if (anA == 0 || anA == 1)
80 _theCoulombFreeEnergy.push_back(CoulombConstFactor*ZA*ZA);
82 else if (anA == 2 || anA == 3 || anA == 4)
85 _theCoulombFreeEnergy.push_back(CoulombConstFactor*0.5
90 _theCoulombFreeEnergy.push_back(CoulombConstFactor*ZA*ZA
95G4double G4StatMFMicroPartition::GetCoulombEnergy(
void)
100 G4double CoulombEnergy = elm_coupling*0.6*theZ*theZ*CoulombFactor/
104 for (
unsigned int i = 0; i < _thePartition.size(); i++)
105 CoulombEnergy += _theCoulombFreeEnergy[i] - elm_coupling*0.6*
106 ZA*ZA*_thePartition[i]*g4calc->
Z23(_thePartition[i])/
109 return CoulombEnergy;
120 for (
unsigned int i = 0; i < _thePartition.size(); i++)
122 if (_thePartition[i] == 0 || _thePartition[i] == 1)
124 PartitionEnergy += _theCoulombFreeEnergy[i];
126 else if (_thePartition[i] == 2)
130 + _theCoulombFreeEnergy[i];
132 else if (_thePartition[i] == 3)
136 + _theCoulombFreeEnergy[i];
138 else if (_thePartition[i] == 4)
142 + _theCoulombFreeEnergy[i]
143 + 4.*T*T/InvLevelDensity(4.);
150 T*T/InvLevelDensity(_thePartition[i]))
155 (1.0-2.0*theZ/theA)*(1.0-2.0*theZ/theA)*_thePartition[i] +
159 g4calc->
Z23(_thePartition[i]) +
162 _theCoulombFreeEnergy[i];
166 PartitionEnergy += elm_coupling*0.6*theZ*theZ*CoulombFactor/
168 + 1.5*T*(_thePartition.size()-1);
170 return PartitionEnergy;
176 G4double PartitionEnergy = GetPartitionEnergy(0.0);
180 if (std::fabs(U + FreeInternalE0 - PartitionEnergy) < 0.003)
return -1.0;
186 G4double Tb = std::max(std::sqrt(8.0*U/theA),0.0012*MeV);
189 G4double Da = (U + FreeInternalE0 - GetPartitionEnergy(Ta))/U;
190 G4double Db = (U + FreeInternalE0 - GetPartitionEnergy(Tb))/U;
194 while (Da*Db > 0.0 && maxit < 1000)
198 Db = (U + FreeInternalE0 - GetPartitionEnergy(Tb))/U;
201 G4double eps = 1.0e-14*std::abs(Ta-Tb);
203 for (
G4int i = 0; i < 1000; i++)
206 if (std::fabs(Ta-Tb) <= eps)
return Tmid;
207 G4double Dmid = (U + FreeInternalE0 - GetPartitionEnergy(Tmid))/U;
208 if (std::fabs(Dmid) < 0.003)
return Tmid;
221 G4cout <<
"G4StatMFMicroPartition::CalcPartitionTemperature: I can't calculate the temperature"
232 G4double T = CalcPartitionTemperature(U,FreeInternalE0);
233 if ( T <= 0.0)
return _Probability = 0.0;
241 for (i = 0; i < _thePartition.size() - 1; i++)
244 for (
unsigned int ii = i+1; i< _thePartition.size(); i++)
246 if (_thePartition[i] == _thePartition[ii]) f++;
254 for (i = 0; i < _thePartition.size(); i++)
256 ProbDegeneracy *= GetDegeneracyFactor(_thePartition[i]);
257 ProbA32 *= _thePartition[i]*std::sqrt((
G4double)_thePartition[i]);
262 for (i = 0; i < _thePartition.size(); i++)
265 if (_thePartition[i] == 4)
268 2.0*T*_thePartition[i]/InvLevelDensity(_thePartition[i]);
271 else if (_thePartition[i] > 4)
274 2.0*T*_thePartition[i]/InvLevelDensity(_thePartition[i])
280 G4double ThermalWaveLenght3 = 16.15*fermi/std::sqrt(T);
281 ThermalWaveLenght3 = ThermalWaveLenght3*ThermalWaveLenght3*ThermalWaveLenght3;
284 G4double kappa = 1. + elm_coupling*(g4calc->
Z13(_thePartition.size())-1.0)
286 kappa = kappa*kappa*kappa;
291 G4double TranslationalS = std::max(0.0,
G4Log(ProbA32/Fact) +
292 (_thePartition.size()-1.0)*
G4Log(FreeVolume/ThermalWaveLenght3) +
293 1.5*(_thePartition.size()-1.0) - 1.5*g4calc->
logZ(theA));
295 PartitionEntropy +=
G4Log(ProbDegeneracy) + TranslationalS;
296 _Entropy = PartitionEntropy;
299 G4double exponent = PartitionEntropy-SCompound;
300 if (exponent > 300.0) exponent = 300.0;
301 return _Probability =
G4Exp(exponent);
309 if (A > 4) DegFactor = 1.0;
310 else if (A == 1) DegFactor = 4.0;
311 else if (A == 2) DegFactor = 3.0;
312 else if (A == 3) DegFactor = 4.0;
313 else if (A == 4) DegFactor = 1.0;
320 std::vector<G4int> FragmentsZ;
327 for (
unsigned int i = 0; i < _thePartition.size(); i++)
331 if (Af > 1.5 && Af < 4.5) ZMean = 0.5*Af;
332 else ZMean = Af*Z0/A0;
333 G4double ZDispersion = std::sqrt(Af * MeanT/CC);
337 Zf =
static_cast<G4int>(G4RandGauss::shoot(ZMean,ZDispersion));
340 while (Zf < 0 || Zf > Af);
341 FragmentsZ.push_back(Zf);
344 ZBalance = Z0 - SumZ;
347 while (std::abs(ZBalance) > 1);
348 FragmentsZ[0] += ZBalance;
351 for (
unsigned int i = 0; i < _thePartition.size(); i++)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
G4GLOB_DLL std::ostream G4cout
static G4Pow * GetInstance()
G4double logZ(G4int Z) const
G4double A13(G4double A) const
G4double Z13(G4int Z) const
G4double Z23(G4int Z) const
void CreateFragment(G4int A, G4int Z)
G4bool operator==(const G4StatMFMicroPartition &right) const
G4double CalcPartitionProbability(G4double U, G4double FreeInternalE0, G4double SCompound)
G4StatMFMicroPartition(G4int A, G4int Z)
G4bool operator!=(const G4StatMFMicroPartition &right) const
G4StatMFChannel * ChooseZ(G4int A0, G4int Z0, G4double MeanT)
static G4double DBetaDT(G4double T)
static G4double GetGamma0()
static G4double Beta(G4double T)
static G4double GetCoulomb()
static G4double GetKappaCoulomb()