Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4StatMFMicroPartition Class Reference

#include <G4StatMFMicroPartition.hh>

Public Member Functions

 G4StatMFMicroPartition (G4int A, G4int Z)
 
 ~G4StatMFMicroPartition ()
 
G4bool operator== (const G4StatMFMicroPartition &right) const
 
G4bool operator!= (const G4StatMFMicroPartition &right) const
 
G4StatMFChannelChooseZ (G4int A0, G4int Z0, G4double MeanT)
 
G4double GetProbability (void)
 
void SetPartitionFragment (G4int anA)
 
void Normalize (G4double Normalization)
 
G4double CalcPartitionProbability (G4double U, G4double FreeInternalE0, G4double SCompound)
 
G4double GetTemperature (void)
 
G4double GetEntropy (void)
 

Detailed Description

Definition at line 41 of file G4StatMFMicroPartition.hh.

Constructor & Destructor Documentation

G4StatMFMicroPartition::G4StatMFMicroPartition ( G4int  A,
G4int  Z 
)
inline

Definition at line 45 of file G4StatMFMicroPartition.hh.

45  :
46  theA(A), theZ(Z), _Probability(0.0), _Temperature(0.0),
47  _Entropy(0.0) {};
double A(double temperature)
G4StatMFMicroPartition::~G4StatMFMicroPartition ( )
inline

Definition at line 51 of file G4StatMFMicroPartition.hh.

51 {};

Member Function Documentation

G4double G4StatMFMicroPartition::CalcPartitionProbability ( G4double  U,
G4double  FreeInternalE0,
G4double  SCompound 
)

Definition at line 229 of file G4StatMFMicroPartition.cc.

232 {
233  G4double T = CalcPartitionTemperature(U,FreeInternalE0);
234  if ( T <= 0.0) return _Probability = 0.0;
235  _Temperature = T;
236 
237  G4Pow* g4calc = G4Pow::GetInstance();
238 
239  // Factorial of fragment multiplicity
240  G4double Fact = 1.0;
241  unsigned int i;
242  for (i = 0; i < _thePartition.size() - 1; i++)
243  {
244  G4double f = 1.0;
245  for (unsigned int ii = i+1; i< _thePartition.size(); i++)
246  {
247  if (_thePartition[i] == _thePartition[ii]) f++;
248  }
249  Fact *= f;
250  }
251 
252  G4double ProbDegeneracy = 1.0;
253  G4double ProbA32 = 1.0;
254 
255  for (i = 0; i < _thePartition.size(); i++)
256  {
257  ProbDegeneracy *= GetDegeneracyFactor(_thePartition[i]);
258  ProbA32 *= _thePartition[i]*std::sqrt((G4double)_thePartition[i]);
259  }
260 
261  // Compute entropy
262  G4double PartitionEntropy = 0.0;
263  for (i = 0; i < _thePartition.size(); i++)
264  {
265  // interaction entropy for alpha
266  if (_thePartition[i] == 4)
267  {
268  PartitionEntropy +=
269  2.0*T*_thePartition[i]/InvLevelDensity(_thePartition[i]);
270  }
271  // interaction entropy for Af > 4
272  else if (_thePartition[i] > 4)
273  {
274  PartitionEntropy +=
275  2.0*T*_thePartition[i]/InvLevelDensity(_thePartition[i])
276  - G4StatMFParameters::DBetaDT(T) * g4calc->Z23(_thePartition[i]);
277  }
278  }
279 
280  // Thermal Wave Lenght = std::sqrt(2 pi hbar^2 / nucleon_mass T)
281  G4double ThermalWaveLenght3 = 16.15*fermi/std::sqrt(T);
282  ThermalWaveLenght3 = ThermalWaveLenght3*ThermalWaveLenght3*ThermalWaveLenght3;
283 
284  // Translational Entropy
285  G4double kappa = 1. + elm_coupling*(g4calc->Z13(_thePartition.size())-1.0)
286  /(G4StatMFParameters::Getr0()*g4calc->Z13(theA));
287  kappa = kappa*kappa*kappa;
288  kappa -= 1.;
291  G4double FreeVolume = kappa*V0;
292  G4double TranslationalS = std::max(0.0, G4Log(ProbA32/Fact) +
293  (_thePartition.size()-1.0)*G4Log(FreeVolume/ThermalWaveLenght3) +
294  1.5*(_thePartition.size()-1.0) - 1.5*g4calc->logZ(theA));
295 
296  PartitionEntropy += G4Log(ProbDegeneracy) + TranslationalS;
297  _Entropy = PartitionEntropy;
298 
299  // And finally compute probability of fragment configuration
300  G4double exponent = PartitionEntropy-SCompound;
301  if (exponent > 300.0) exponent = 300.0;
302  return _Probability = G4Exp(exponent);
303 }
static G4Pow * GetInstance()
Definition: G4Pow.cc:55
Definition: G4Pow.hh:56
static G4double Getr0()
G4double logZ(G4int Z) const
Definition: G4Pow.hh:166
G4double Z13(G4int Z) const
Definition: G4Pow.hh:127
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
T max(const T t1, const T t2)
brief Return the largest of the two arguments
static G4double DBetaDT(G4double T)
G4double Z23(G4int Z) const
Definition: G4Pow.hh:154
static constexpr double elm_coupling
static constexpr double pi
Definition: G4SIunits.hh:75
double G4double
Definition: G4Types.hh:76
static constexpr double fermi
Definition: G4SIunits.hh:103

Here is the call graph for this function:

G4StatMFChannel * G4StatMFMicroPartition::ChooseZ ( G4int  A0,
G4int  Z0,
G4double  MeanT 
)

Definition at line 318 of file G4StatMFMicroPartition.cc.

320 {
321  std::vector<G4int> FragmentsZ;
322 
323  G4int ZBalance = 0;
324  do
325  {
327  G4int SumZ = 0;
328  for (unsigned int i = 0; i < _thePartition.size(); i++)
329  {
330  G4double ZMean;
331  G4double Af = _thePartition[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);
335  G4int Zf;
336  do
337  {
338  Zf = static_cast<G4int>(G4RandGauss::shoot(ZMean,ZDispersion));
339  }
340  // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
341  while (Zf < 0 || Zf > Af);
342  FragmentsZ.push_back(Zf);
343  SumZ += Zf;
344  }
345  ZBalance = Z0 - SumZ;
346  }
347  // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
348  while (std::abs(ZBalance) > 1);
349  FragmentsZ[0] += ZBalance;
350 
351  G4StatMFChannel * theChannel = new G4StatMFChannel;
352  for (unsigned int i = 0; i < _thePartition.size(); i++)
353  {
354  theChannel->CreateFragment(_thePartition[i],FragmentsZ[i]);
355  }
356 
357  return theChannel;
358 }
static G4double GetGamma0()
ThreeVector shoot(const G4int Ap, const G4int Af)
int G4int
Definition: G4Types.hh:78
void CreateFragment(G4int A, G4int Z)
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

G4double G4StatMFMicroPartition::GetEntropy ( void  )
inline

Definition at line 93 of file G4StatMFMicroPartition.hh.

94  {
95  return _Entropy;
96  }
G4double G4StatMFMicroPartition::GetProbability ( void  )
inline

Definition at line 72 of file G4StatMFMicroPartition.hh.

73  { return _Probability; }
G4double G4StatMFMicroPartition::GetTemperature ( void  )
inline

Definition at line 88 of file G4StatMFMicroPartition.hh.

89  {
90  return _Temperature;
91  }
void G4StatMFMicroPartition::Normalize ( G4double  Normalization)
inline

Definition at line 81 of file G4StatMFMicroPartition.hh.

82  { _Probability /= Normalization; }
G4bool G4StatMFMicroPartition::operator!= ( const G4StatMFMicroPartition right) const

Definition at line 64 of file G4StatMFMicroPartition.cc.

65 {
66  //throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMicroPartition::operator!= meant to not be accessable");
67  return true;
68 }
G4bool G4StatMFMicroPartition::operator== ( const G4StatMFMicroPartition right) const

Definition at line 57 of file G4StatMFMicroPartition.cc.

58 {
59  //throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMicroPartition::operator== meant to not be accessable");
60  return false;
61 }
void G4StatMFMicroPartition::SetPartitionFragment ( G4int  anA)
inline

Definition at line 75 of file G4StatMFMicroPartition.hh.

76  {
77  _thePartition.push_back(anA);
78  CoulombFreeEnergy(anA);
79  }

The documentation for this class was generated from the following files: