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

#include <G4StatMFMacroTemperature.hh>

Public Member Functions

 G4StatMFMacroTemperature (const G4double anA, const G4double aZ, const G4double ExEnergy, const G4double FreeE0, const G4double kappa, std::vector< G4VStatMFMacroCluster * > *ClusterVector)
 
 ~G4StatMFMacroTemperature ()
 
G4double operator() (const G4double T)
 
G4double GetMeanMultiplicity (void) const
 
G4double GetChemicalPotentialMu (void) const
 
G4double GetChemicalPotentialNu (void) const
 
G4double GetTemperature (void) const
 
G4double GetEntropy (void) const
 
G4double CalcTemperature (void)
 

Detailed Description

Definition at line 42 of file G4StatMFMacroTemperature.hh.

Constructor & Destructor Documentation

G4StatMFMacroTemperature::G4StatMFMacroTemperature ( const G4double  anA,
const G4double  aZ,
const G4double  ExEnergy,
const G4double  FreeE0,
const G4double  kappa,
std::vector< G4VStatMFMacroCluster * > *  ClusterVector 
)

Definition at line 47 of file G4StatMFMacroTemperature.cc.

49  :
50  theA(anA),
51  theZ(aZ),
52  _ExEnergy(ExEnergy),
53  _FreeInternalE0(FreeE0),
54  _Kappa(kappa),
55  _MeanMultiplicity(0.0),
56  _MeanTemperature(0.0),
57  _ChemPotentialMu(0.0),
58  _ChemPotentialNu(0.0),
59  _MeanEntropy(0.0),
60  _theClusters(ClusterVector)
61 {}

Here is the call graph for this function:

Here is the caller graph for this function:

G4StatMFMacroTemperature::~G4StatMFMacroTemperature ( )

Definition at line 63 of file G4StatMFMacroTemperature.cc.

64 {}

Member Function Documentation

G4double G4StatMFMacroTemperature::CalcTemperature ( void  )

Definition at line 66 of file G4StatMFMacroTemperature.cc.

67 {
68  // Inital guess for the interval of the ensemble temperature values
69  G4double Ta = 0.5;
70  G4double Tb = std::max(std::sqrt(_ExEnergy/(theA*0.12)),0.01*MeV);
71 
72  G4double fTa = this->operator()(Ta);
73  G4double fTb = this->operator()(Tb);
74 
75  // Bracketing the solution
76  // T should be greater than 0.
77  // The interval is [Ta,Tb]
78  // We start with a value for Ta = 0.5 MeV
79  // it should be enough to have fTa > 0 If it isn't
80  // the case, we decrease Ta. But carefully, because
81  // fTa growes very fast when Ta is near 0 and we could have
82  // an overflow.
83 
84  G4int iterations = 0;
85  // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
86  while (fTa < 0.0 && ++iterations < 10) {
87  Ta -= 0.5*Ta;
88  fTa = this->operator()(Ta);
89  }
90  // Usually, fTb will be less than 0, but if it is not the case:
91  iterations = 0;
92  // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
93  while (fTa*fTb > 0.0 && iterations++ < 10) {
94  Tb += 2.*std::fabs(Tb-Ta);
95  fTb = this->operator()(Tb);
96  }
97 
98  if (fTa*fTb > 0.0) {
99  G4cerr <<"G4StatMFMacroTemperature:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl;
100  G4cerr <<"G4StatMFMacroTemperature:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl;
101  throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't bracket the solution.");
102  }
103 
105  new G4Solver<G4StatMFMacroTemperature>(100,1.e-4);
106  theSolver->SetIntervalLimits(Ta,Tb);
107  if (!theSolver->Crenshaw(*this)){
108  G4cout <<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" Ta="
109  <<Ta<<" Tb="<<Tb<< G4endl;
110  G4cout <<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" fTa="
111  <<fTa<<" fTb="<<fTb<< G4endl;
112  }
113  _MeanTemperature = theSolver->GetRoot();
114  G4double FunctionValureAtRoot = this->operator()(_MeanTemperature);
115  delete theSolver;
116 
117  // Verify if the root is found and it is indeed within the physical domain,
118  // say, between 1 and 50 MeV, otherwise try Brent method:
119  if (std::fabs(FunctionValureAtRoot) > 5.e-2) {
120  if (_MeanTemperature < 1. || _MeanTemperature > 50.) {
121  G4cout << "Crenshaw method failed; function = " << FunctionValureAtRoot
122  << " solution? = " << _MeanTemperature << " MeV " << G4endl;
123  G4Solver<G4StatMFMacroTemperature> * theSolverBrent =
124  new G4Solver<G4StatMFMacroTemperature>(200,1.e-3);
125  theSolverBrent->SetIntervalLimits(Ta,Tb);
126  if (!theSolverBrent->Brent(*this)){
127  G4cout <<"G4StatMFMacroTemperature, Brent method failed:"
128  <<" Ta="<<Ta<<" Tb="<<Tb<< G4endl;
129  G4cout <<"G4StatMFMacroTemperature, Brent method failed:"
130  <<" fTa="<<fTa<<" fTb="<<fTb<< G4endl;
131  throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't find the root with any method.");
132  }
133 
134  _MeanTemperature = theSolverBrent->GetRoot();
135  FunctionValureAtRoot = this->operator()(_MeanTemperature);
136  delete theSolverBrent;
137  }
138  if (std::abs(FunctionValureAtRoot) > 5.e-2) {
139  G4cout << "Brent method failed; function = " << FunctionValureAtRoot
140  << " solution? = " << _MeanTemperature << " MeV " << G4endl;
141  throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't find the root with any method.");
142  }
143  }
144  //G4cout << "G4StatMFMacroTemperature::CalcTemperature: function = "
145  //<< FunctionValureAtRoot
146  // << " T(MeV)= " << _MeanTemperature << G4endl;
147  return _MeanTemperature;
148 }
void SetIntervalLimits(const G4double Limit1, const G4double Limit2)
int G4int
Definition: G4Types.hh:78
G4bool Brent(Function &theFunction)
G4GLOB_DLL std::ostream G4cout
G4double GetRoot(void) const
Definition: G4Solver.hh:77
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double operator()(const G4double T)
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
G4bool Crenshaw(Function &theFunction)
double G4double
Definition: G4Types.hh:76
G4GLOB_DLL std::ostream G4cerr

Here is the call graph for this function:

G4double G4StatMFMacroTemperature::GetChemicalPotentialMu ( void  ) const
inline

Definition at line 74 of file G4StatMFMacroTemperature.hh.

74 {return _ChemPotentialMu;}
G4double G4StatMFMacroTemperature::GetChemicalPotentialNu ( void  ) const
inline

Definition at line 76 of file G4StatMFMacroTemperature.hh.

76 {return _ChemPotentialNu;}
G4double G4StatMFMacroTemperature::GetEntropy ( void  ) const
inline

Definition at line 80 of file G4StatMFMacroTemperature.hh.

80 {return _MeanEntropy;}
G4double G4StatMFMacroTemperature::GetMeanMultiplicity ( void  ) const
inline

Definition at line 72 of file G4StatMFMacroTemperature.hh.

72 {return _MeanMultiplicity;}
G4double G4StatMFMacroTemperature::GetTemperature ( void  ) const
inline

Definition at line 78 of file G4StatMFMacroTemperature.hh.

78 {return _MeanTemperature;}
G4double G4StatMFMacroTemperature::operator() ( const G4double  T)
inline

Definition at line 53 of file G4StatMFMacroTemperature.hh.

54  { return (_ExEnergy - this->FragsExcitEnergy(T))/_ExEnergy; }

Here is the caller graph for this function:


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