#include <G4StatMFMicroPartition.hh>
Public Member Functions | |
G4StatMFMicroPartition (const G4int A, const G4double Z) | |
~G4StatMFMicroPartition () | |
G4bool | operator== (const G4StatMFMicroPartition &right) const |
G4bool | operator!= (const G4StatMFMicroPartition &right) const |
G4StatMFChannel * | ChooseZ (const G4double A0, const G4double Z0, const G4double MeanT) |
G4double | GetProbability (void) |
void | SetPartitionFragment (const G4int anA) |
void | Normalize (const G4double Normalization) |
G4double | CalcPartitionProbability (const G4double U, const G4double FreeInternalE0, const G4double SCompound) |
G4double | GetTemperature (void) |
G4double | GetEntropy (void) |
Definition at line 41 of file G4StatMFMicroPartition.hh.
G4StatMFMicroPartition::~G4StatMFMicroPartition | ( | ) | [inline] |
G4double G4StatMFMicroPartition::CalcPartitionProbability | ( | const G4double | U, | |
const G4double | FreeInternalE0, | |||
const G4double | SCompound | |||
) |
Definition at line 230 of file G4StatMFMicroPartition.cc.
References G4StatMFParameters::DBetaDT(), G4StatMFParameters::Getr0(), and G4INCL::Math::pi.
00233 { 00234 G4double T = CalcPartitionTemperature(U,FreeInternalE0); 00235 if ( T <= 0.0) return _Probability = 0.0; 00236 _Temperature = T; 00237 00238 00239 // Factorial of fragment multiplicity 00240 G4double Fact = 1.0; 00241 unsigned int i; 00242 for (i = 0; i < _thePartition.size() - 1; i++) 00243 { 00244 G4double f = 1.0; 00245 for (unsigned int ii = i+1; i< _thePartition.size(); i++) 00246 { 00247 if (_thePartition[i] == _thePartition[ii]) f++; 00248 } 00249 Fact *= f; 00250 } 00251 00252 G4double ProbDegeneracy = 1.0; 00253 G4double ProbA32 = 1.0; 00254 00255 for (i = 0; i < _thePartition.size(); i++) 00256 { 00257 ProbDegeneracy *= GetDegeneracyFactor(static_cast<G4int>(_thePartition[i])); 00258 ProbA32 *= static_cast<G4double>(_thePartition[i])* 00259 std::sqrt(static_cast<G4double>(_thePartition[i])); 00260 } 00261 00262 // Compute entropy 00263 G4double PartitionEntropy = 0.0; 00264 for (i = 0; i < _thePartition.size(); i++) 00265 { 00266 // interaction entropy for alpha 00267 if (_thePartition[i] == 4) 00268 { 00269 PartitionEntropy += 00270 2.0*T*_thePartition[i]/InvLevelDensity(_thePartition[i]); 00271 } 00272 // interaction entropy for Af > 4 00273 else if (_thePartition[i] > 4) 00274 { 00275 PartitionEntropy += 00276 2.0*T*_thePartition[i]/InvLevelDensity(_thePartition[i]) 00277 - G4StatMFParameters::DBetaDT(T) 00278 * std::pow(static_cast<G4double>(_thePartition[i]),2.0/3.0); 00279 } 00280 } 00281 00282 // Thermal Wave Lenght = std::sqrt(2 pi hbar^2 / nucleon_mass T) 00283 G4double ThermalWaveLenght3 = 16.15*fermi/std::sqrt(T); 00284 ThermalWaveLenght3 = ThermalWaveLenght3*ThermalWaveLenght3*ThermalWaveLenght3; 00285 00286 // Translational Entropy 00287 G4double kappa = (1. + elm_coupling*(std::pow(static_cast<G4double>(_thePartition.size()),1./3.)-1.0) 00288 /(G4StatMFParameters::Getr0()*std::pow(static_cast<G4double>(theA),1./3.))); 00289 kappa = kappa*kappa*kappa; 00290 kappa -= 1.; 00291 G4double V0 = (4./3.)*pi*theA*G4StatMFParameters::Getr0()*G4StatMFParameters::Getr0()* 00292 G4StatMFParameters::Getr0(); 00293 G4double FreeVolume = kappa*V0; 00294 G4double TranslationalS = std::max(0.0, std::log(ProbA32/Fact) + 00295 (_thePartition.size()-1.0)*std::log(FreeVolume/ThermalWaveLenght3) + 00296 1.5*(_thePartition.size()-1.0) - (3./2.)*std::log(theA)); 00297 00298 PartitionEntropy += std::log(ProbDegeneracy) + TranslationalS; 00299 _Entropy = PartitionEntropy; 00300 00301 // And finally compute probability of fragment configuration 00302 G4double exponent = PartitionEntropy-SCompound; 00303 if (exponent > 700.0) exponent = 700.0; 00304 return _Probability = std::exp(exponent); 00305 }
G4StatMFChannel * G4StatMFMicroPartition::ChooseZ | ( | const G4double | A0, | |
const G4double | Z0, | |||
const G4double | MeanT | |||
) |
Definition at line 323 of file G4StatMFMicroPartition.cc.
References G4StatMFChannel::CreateFragment(), and G4StatMFParameters::GetGamma0().
00325 { 00326 std::vector<G4int> FragmentsZ; 00327 00328 G4int ZBalance = 0; 00329 do 00330 { 00331 G4double CC = G4StatMFParameters::GetGamma0()*8.0; 00332 G4int SumZ = 0; 00333 for (unsigned int i = 0; i < _thePartition.size(); i++) 00334 { 00335 G4double ZMean; 00336 G4double Af = _thePartition[i]; 00337 if (Af > 1.5 && Af < 4.5) ZMean = 0.5*Af; 00338 else ZMean = Af*Z0/A0; 00339 G4double ZDispersion = std::sqrt(Af * MeanT/CC); 00340 G4int Zf; 00341 do 00342 { 00343 Zf = static_cast<G4int>(G4RandGauss::shoot(ZMean,ZDispersion)); 00344 } 00345 while (Zf < 0 || Zf > Af); 00346 FragmentsZ.push_back(Zf); 00347 SumZ += Zf; 00348 } 00349 ZBalance = static_cast<G4int>(Z0) - SumZ; 00350 } 00351 while (std::abs(ZBalance) > 1.1); 00352 FragmentsZ[0] += ZBalance; 00353 00354 G4StatMFChannel * theChannel = new G4StatMFChannel; 00355 for (unsigned int i = 0; i < _thePartition.size(); i++) 00356 { 00357 theChannel->CreateFragment(_thePartition[i],FragmentsZ[i]); 00358 } 00359 00360 return theChannel; 00361 }
G4double G4StatMFMicroPartition::GetEntropy | ( | void | ) | [inline] |
G4double G4StatMFMicroPartition::GetProbability | ( | void | ) | [inline] |
G4double G4StatMFMicroPartition::GetTemperature | ( | void | ) | [inline] |
void G4StatMFMicroPartition::Normalize | ( | const G4double | Normalization | ) | [inline] |
G4bool G4StatMFMicroPartition::operator!= | ( | const G4StatMFMicroPartition & | right | ) | const |
Definition at line 60 of file G4StatMFMicroPartition.cc.
00061 { 00062 //throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMicroPartition::operator!= meant to not be accessable"); 00063 return true; 00064 }
G4bool G4StatMFMicroPartition::operator== | ( | const G4StatMFMicroPartition & | right | ) | const |
Definition at line 53 of file G4StatMFMicroPartition.cc.
00054 { 00055 //throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMicroPartition::operator== meant to not be accessable"); 00056 return false; 00057 }
void G4StatMFMicroPartition::SetPartitionFragment | ( | const G4int | anA | ) | [inline] |