Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4StatMFMacroTemperature.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27//
28// Hadronic Process: Nuclear De-excitations
29// by V. Lara
30//
31// Modified:
32// 25.07.08 I.Pshenichnov (in collaboration with Alexander Botvina and Igor
33// Mishustin (FIAS, Frankfurt, INR, Moscow and Kurchatov Institute,
34// Moscow, [email protected]) make algorithm closer to
35// original MF model
36// 16.04.10 V.Ivanchenko improved logic of solving equation for temperature
37// to protect code from rare unwanted exception; moved constructor
38// and destructor to source
39// 28.10.10 V.Ivanchenko defined members in constructor and cleaned up
40
43#include "G4SystemOfUnits.hh"
44#include "G4Pow.hh"
45
47 const G4double ExEnergy, const G4double FreeE0, const G4double kappa,
48 std::vector<G4VStatMFMacroCluster*> * ClusterVector) :
49 theA(anA),
50 theZ(aZ),
51 _ExEnergy(ExEnergy),
52 _FreeInternalE0(FreeE0),
53 _Kappa(kappa),
54 _MeanMultiplicity(0.0),
55 _MeanTemperature(0.0),
56 _ChemPotentialMu(0.0),
57 _ChemPotentialNu(0.0),
58 _MeanEntropy(0.0),
59 _theClusters(ClusterVector)
60{}
61
63{}
64
66{
67 // Inital guess for the interval of the ensemble temperature values
68 G4double Ta = 0.5;
69 G4double Tb = std::max(std::sqrt(_ExEnergy/(theA*0.12)),0.01*MeV);
70
71 G4double fTa = this->operator()(Ta);
72 G4double fTb = this->operator()(Tb);
73
74 // Bracketing the solution
75 // T should be greater than 0.
76 // The interval is [Ta,Tb]
77 // We start with a value for Ta = 0.5 MeV
78 // it should be enough to have fTa > 0 If it isn't
79 // the case, we decrease Ta. But carefully, because
80 // fTa growes very fast when Ta is near 0 and we could have
81 // an overflow.
82
83 G4int iterations = 0;
84 // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
85 while (fTa < 0.0 && ++iterations < 10) {
86 Ta -= 0.5*Ta;
87 fTa = this->operator()(Ta);
88 }
89 // Usually, fTb will be less than 0, but if it is not the case:
90 iterations = 0;
91 // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
92 while (fTa*fTb > 0.0 && iterations++ < 10) {
93 Tb += 2.*std::fabs(Tb-Ta);
94 fTb = this->operator()(Tb);
95 }
96
97 if (fTa*fTb > 0.0) {
98 G4cerr <<"G4StatMFMacroTemperature:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl;
99 G4cerr <<"G4StatMFMacroTemperature:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl;
100 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't bracket the solution.");
101 }
102
105 theSolver->SetIntervalLimits(Ta,Tb);
106 if (!theSolver->Crenshaw(*this)){
107 G4cout <<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" Ta="
108 <<Ta<<" Tb="<<Tb<< G4endl;
109 G4cout <<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" fTa="
110 <<fTa<<" fTb="<<fTb<< G4endl;
111 }
112 _MeanTemperature = theSolver->GetRoot();
113 G4double FunctionValureAtRoot = this->operator()(_MeanTemperature);
114 delete theSolver;
115
116 // Verify if the root is found and it is indeed within the physical domain,
117 // say, between 1 and 50 MeV, otherwise try Brent method:
118 if (std::fabs(FunctionValureAtRoot) > 5.e-2) {
119 if (_MeanTemperature < 1. || _MeanTemperature > 50.) {
120 G4cout << "Crenshaw method failed; function = " << FunctionValureAtRoot
121 << " solution? = " << _MeanTemperature << " MeV " << G4endl;
122 G4Solver<G4StatMFMacroTemperature> * theSolverBrent =
124 theSolverBrent->SetIntervalLimits(Ta,Tb);
125 if (!theSolverBrent->Brent(*this)){
126 G4cout <<"G4StatMFMacroTemperature, Brent method failed:"
127 <<" Ta="<<Ta<<" Tb="<<Tb<< G4endl;
128 G4cout <<"G4StatMFMacroTemperature, Brent method failed:"
129 <<" fTa="<<fTa<<" fTb="<<fTb<< G4endl;
130 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't find the root with any method.");
131 }
132
133 _MeanTemperature = theSolverBrent->GetRoot();
134 FunctionValureAtRoot = this->operator()(_MeanTemperature);
135 delete theSolverBrent;
136 }
137 if (std::abs(FunctionValureAtRoot) > 5.e-2) {
138 G4cout << "Brent method failed; function = " << FunctionValureAtRoot
139 << " solution? = " << _MeanTemperature << " MeV " << G4endl;
140 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't find the root with any method.");
141 }
142 }
143 //G4cout << "G4StatMFMacroTemperature::CalcTemperature: function = "
144 //<< FunctionValureAtRoot
145 // << " T(MeV)= " << _MeanTemperature << G4endl;
146 return _MeanTemperature;
147}
148
149G4double G4StatMFMacroTemperature::FragsExcitEnergy(const G4double T)
150// Calculates excitation energy per nucleon and summed fragment
151// multiplicity and entropy
152{
153 // Model Parameters
154 G4Pow* g4calc = G4Pow::GetInstance();
155 G4double R0 = G4StatMFParameters::Getr0()*g4calc->Z13(theA);
157 G4double FreeVol = _Kappa*(4.*pi/3.)*R0*R0*R0;
158
159 // Calculate Chemical potentials
160 CalcChemicalPotentialNu(T);
161
162
163 // Average total fragment energy
164 G4double AverageEnergy = 0.0;
165 std::vector<G4VStatMFMacroCluster*>::iterator i;
166 for (i = _theClusters->begin(); i != _theClusters->end(); ++i)
167 {
168 AverageEnergy += (*i)->GetMeanMultiplicity() * (*i)->CalcEnergy(T);
169 }
170
171 // Add Coulomb energy
172 AverageEnergy += 0.6*elm_coupling*theZ*theZ/R;
173
174 // Calculate mean entropy
175 _MeanEntropy = 0.0;
176 for (i = _theClusters->begin(); i != _theClusters->end(); ++i)
177 {
178 _MeanEntropy += (*i)->CalcEntropy(T,FreeVol);
179 }
180
181 // Excitation energy per nucleon
182 return AverageEnergy - _FreeInternalE0;
183}
184
185void G4StatMFMacroTemperature::CalcChemicalPotentialNu(const G4double T)
186// Calculates the chemical potential \nu
187{
188 G4StatMFMacroChemicalPotential * theChemPot = new
189 G4StatMFMacroChemicalPotential(theA,theZ,_Kappa,T,_theClusters);
190
191 _ChemPotentialNu = theChemPot->CalcChemicalPotentialNu();
192 _ChemPotentialMu = theChemPot->GetChemicalPotentialMu();
193 _MeanMultiplicity = theChemPot->GetMeanMultiplicity();
194 delete theChemPot;
195
196 return;
197}
198
199
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
Definition: G4Pow.hh:49
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double A13(G4double A) const
Definition: G4Pow.cc:120
G4double Z13(G4int Z) const
Definition: G4Pow.hh:123
G4bool Brent(Function &theFunction)
void SetIntervalLimits(const G4double Limit1, const G4double Limit2)
G4double GetRoot(void) const
Definition: G4Solver.hh:76
G4bool Crenshaw(Function &theFunction)
G4StatMFMacroTemperature(const G4double anA, const G4double aZ, const G4double ExEnergy, const G4double FreeE0, const G4double kappa, std::vector< G4VStatMFMacroCluster * > *ClusterVector)
G4double operator()(const G4double T)
static G4double Getr0()
static G4double GetKappaCoulomb()