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::abs(U + FreeInternalE0 - PartitionEnergy) < 0.003) {
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;
196 for (
G4int i = 0; i < 1000; ++i) {
198 Db = (U + FreeInternalE0 - GetPartitionEnergy(Tb))/U;
204 if (!yes) {
return -1.0; }
206 G4double eps = 1.0e-10*std::abs(Ta-Tb);
208 for (
G4int i = 0; i < 1000; ++i)
211 if (std::abs(Ta-Tb) <= eps) {
return Tmid; }
212 G4double Dmid = (U + FreeInternalE0 - GetPartitionEnergy(Tmid))/U;
213 if (std::abs(Dmid) < 0.003) {
return Tmid; }
232 G4double T = CalcPartitionTemperature(U,FreeInternalE0);
233 if ( T <= 0.0)
return _Probability = 0.0;
247 for (
G4int i = 0; i < n; ++i) {
248 G4int par = _thePartition[i];
249 ProbDegeneracy *= GetDegeneracyFactor(par);
250 ProbA32 *= _thePartition[i]*std::sqrt((
G4double)par);
254 PartitionEntropy += 2.0 * T * par/InvLevelDensity(par);
258 PartitionEntropy += 2.0 * T * par/InvLevelDensity(par) - db * g4calc->
Z23(par);
263 G4double ThermalWaveLenght3 = 16.15*fermi/std::sqrt(T);
264 ThermalWaveLenght3 = ThermalWaveLenght3*ThermalWaveLenght3*ThermalWaveLenght3;
268 G4double kappa = 1. + elm_coupling*(g4calc->
Z13(n) - 1.0)/(r0*g4calc->
Z13(theA));
269 G4double V0 = (4./3.)*pi*theA*r0*r0*r0;
270 G4double FreeVolume = (kappa*kappa*kappa - 1.0)*V0;
272 + (n - 1)*
G4Log(FreeVolume/ThermalWaveLenght3)
273 + 1.5*(n - 1) - 1.5*g4calc->
logZ(theA);
274 TranslationalS = std::max(TranslationalS, 0.0);
276 PartitionEntropy +=
G4Log(ProbDegeneracy) + TranslationalS;
277 _Entropy = PartitionEntropy;
280 G4double exponent = std::min(PartitionEntropy - SCompound, 200.);
281 return _Probability =
G4Exp(exponent);
289 if (
A > 4) DegFactor = 1.0;
290 else if (
A == 1) DegFactor = 4.0;
291 else if (
A == 2) DegFactor = 3.0;
292 else if (
A == 3) DegFactor = 4.0;
293 else if (
A == 4) DegFactor = 1.0;
300 std::vector<G4int> FragmentsZ;
307 for (
G4int i = 0; i < n; ++i) {
310 if (Af > 1.5 && Af < 4.5) { ZMean = 0.5*Af; }
311 else ZMean = Af*Z0/A0;
312 G4double ZDispersion = std::sqrt(Af * MeanT/CC);
315 Zf =
static_cast<G4int>(G4RandGauss::shoot(ZMean, ZDispersion));
318 while (Zf < 0 || Zf > Af);
319 FragmentsZ.push_back(Zf);
322 ZBalance = Z0 - SumZ;
325 while (std::abs(ZBalance) > 1);
326 FragmentsZ[0] += ZBalance;
329 for (
G4int i = 0; i < n; ++i) {
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
static G4Pow * GetInstance()
G4double logZ(G4int Z) const
G4double factorial(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()