40 throw G4HadronicException(__FILE__, __LINE__,
"G4StatMFMicroPartition::copy_constructor meant to not be accessable");
48 throw G4HadronicException(__FILE__, __LINE__,
"G4StatMFMicroPartition::operator= meant to not be accessable");
68void G4StatMFMicroPartition::CoulombFreeEnergy(
const G4double anA)
73 CoulombConstFactor = elm_coupling * (3./5.) *
78 if (anA == 0 || anA == 1)
80 _theCoulombFreeEnergy.push_back(CoulombConstFactor*(theZ/theA)*(theZ/theA));
82 else if (anA == 2 || anA == 3 || anA == 4)
85 _theCoulombFreeEnergy.push_back(CoulombConstFactor*0.5*std::pow(anA,5./3.));
89 _theCoulombFreeEnergy.push_back(CoulombConstFactor*(theZ/theA)*(theZ/theA)*
96G4double G4StatMFMicroPartition::GetCoulombEnergy(
void)
101 G4double CoulombEnergy = elm_coupling*(3./5.)*theZ*theZ*CoulombFactor/
104 for (
unsigned int i = 0; i < _thePartition.size(); i++)
105 CoulombEnergy += _theCoulombFreeEnergy[i] - elm_coupling*(3./5.)*
106 (theZ/theA)*(theZ/theA)*std::pow(
static_cast<G4double>(_thePartition[i]),5./3.)/
109 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 std::pow(
static_cast<G4double>(_thePartition[i]),2./3.) +
163 _theCoulombFreeEnergy[i];
167 PartitionEnergy += elm_coupling*(3./5.)*theZ*theZ*CoulombFactor/
169 + (3./2.)*T*(_thePartition.size()-1);
171 return PartitionEnergy;
178 G4double PartitionEnergy = GetPartitionEnergy(0.0);
182 if (std::abs(U + FreeInternalE0 - PartitionEnergy) < 0.003)
return -1.0;
188 G4double Tb = std::max(std::sqrt(8.0*U/theA),0.0012*MeV);
191 G4double Da = (U + FreeInternalE0 - GetPartitionEnergy(Ta))/U;
192 G4double Db = (U + FreeInternalE0 - GetPartitionEnergy(Tb))/U;
195 while (Da*Db > 0.0 && maxit < 1000)
199 Db = (U + FreeInternalE0 - GetPartitionEnergy(Tb))/U;
202 G4double eps = 1.0e-14*std::abs(Ta-Tb);
204 for (
G4int i = 0; i < 1000; i++)
207 if (std::abs(Ta-Tb) <= eps)
return Tmid;
208 G4double Dmid = (U + FreeInternalE0 - GetPartitionEnergy(Tmid))/U;
209 if (std::abs(Dmid) < 0.003)
return Tmid;
222 G4cerr <<
"G4StatMFMicroPartition::CalcPartitionTemperature: I can't calculate the temperature"
234 G4double T = CalcPartitionTemperature(U,FreeInternalE0);
235 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(
static_cast<G4int>(_thePartition[i]));
258 ProbA32 *=
static_cast<G4double>(_thePartition[i])*
259 std::sqrt(
static_cast<G4double>(_thePartition[i]));
264 for (i = 0; i < _thePartition.size(); i++)
267 if (_thePartition[i] == 4)
270 2.0*T*_thePartition[i]/InvLevelDensity(_thePartition[i]);
273 else if (_thePartition[i] > 4)
276 2.0*T*_thePartition[i]/InvLevelDensity(_thePartition[i])
278 * std::pow(
static_cast<G4double>(_thePartition[i]),2.0/3.0);
283 G4double ThermalWaveLenght3 = 16.15*fermi/std::sqrt(T);
284 ThermalWaveLenght3 = ThermalWaveLenght3*ThermalWaveLenght3*ThermalWaveLenght3;
287 G4double kappa = (1. + elm_coupling*(std::pow(
static_cast<G4double>(_thePartition.size()),1./3.)-1.0)
289 kappa = kappa*kappa*kappa;
294 G4double TranslationalS = std::max(0.0, std::log(ProbA32/Fact) +
295 (_thePartition.size()-1.0)*std::log(FreeVolume/ThermalWaveLenght3) +
296 1.5*(_thePartition.size()-1.0) - (3./2.)*std::log(theA));
298 PartitionEntropy += std::log(ProbDegeneracy) + TranslationalS;
299 _Entropy = PartitionEntropy;
302 G4double exponent = PartitionEntropy-SCompound;
303 if (exponent > 700.0) exponent = 700.0;
304 return _Probability = std::exp(exponent);
309G4double G4StatMFMicroPartition::GetDegeneracyFactor(
const G4int A)
314 if (A > 4) DegFactor = 1.0;
315 else if (A == 1) DegFactor = 4.0;
316 else if (A == 2) DegFactor = 3.0;
317 else if (A == 3) DegFactor = 2.0+2.0;
318 else if (A == 4) DegFactor = 1.0;
326 std::vector<G4int> FragmentsZ;
333 for (
unsigned int i = 0; i < _thePartition.size(); i++)
337 if (Af > 1.5 && Af < 4.5) ZMean = 0.5*Af;
338 else ZMean = Af*Z0/A0;
339 G4double ZDispersion = std::sqrt(Af * MeanT/CC);
343 Zf =
static_cast<G4int>(G4RandGauss::shoot(ZMean,ZDispersion));
345 while (Zf < 0 || Zf > Af);
346 FragmentsZ.push_back(Zf);
349 ZBalance =
static_cast<G4int>(Z0) - SumZ;
351 while (std::abs(ZBalance) > 1.1);
352 FragmentsZ[0] += ZBalance;
355 for (
unsigned int i = 0; i < _thePartition.size(); i++)
G4DLLIMPORT std::ostream G4cerr
void CreateFragment(G4int A, G4int Z)
G4StatMFMicroPartition(const G4int A, const G4double Z)
G4bool operator==(const G4StatMFMicroPartition &right) const
G4StatMFChannel * ChooseZ(const G4double A0, const G4double Z0, const G4double MeanT)
G4double CalcPartitionProbability(const G4double U, const G4double FreeInternalE0, const G4double SCompound)
G4bool operator!=(const G4StatMFMicroPartition &right) const
static G4double GetGamma0()
static G4double GetKappaCoulomb()
static G4double DBetaDT(const G4double T)
static G4double Beta(const G4double T)