source: trunk/source/processes/hadronic/models/de_excitation/multifragmentation/src/G4StatMFMacroTemperature.cc

Last change on this file was 1347, checked in by garnier, 14 years ago

geant4 tag 9.4

File size: 7.9 KB
Line 
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// $Id: G4StatMFMacroTemperature.cc,v 1.9 2010/10/29 17:35:04 vnivanch Exp $
28// GEANT4 tag $Name: geant4-09-04-ref-00 $
29//
30// Hadronic Process: Nuclear De-excitations
31// by V. Lara
32//
33// Modified:
34// 25.07.08 I.Pshenichnov (in collaboration with Alexander Botvina and Igor
35//          Mishustin (FIAS, Frankfurt, INR, Moscow and Kurchatov Institute,
36//          Moscow, pshenich@fias.uni-frankfurt.de) make algorithm closer to
37//          original MF model
38// 16.04.10 V.Ivanchenko improved logic of solving equation for tempetature
39//          to protect code from rare unwanted exception; moved constructor
40//          and destructor to source 
41// 28.10.10 V.Ivanchenko defined members in constructor and cleaned up
42
43#include "G4StatMFMacroTemperature.hh"
44
45G4StatMFMacroTemperature::G4StatMFMacroTemperature(const G4double anA, const G4double aZ, 
46  const G4double ExEnergy, const G4double FreeE0, const G4double kappa, 
47  std::vector<G4VStatMFMacroCluster*> * ClusterVector) :
48  theA(anA),
49  theZ(aZ),
50  _ExEnergy(ExEnergy),
51  _FreeInternalE0(FreeE0),
52  _Kappa(kappa),
53  _MeanMultiplicity(0.0),
54  _MeanTemperature(0.0),
55  _ChemPotentialMu(0.0),
56  _ChemPotentialNu(0.0),
57  _MeanEntropy(0.0),
58  _theClusters(ClusterVector) 
59{}
60       
61G4StatMFMacroTemperature::~G4StatMFMacroTemperature() 
62{}
63
64
65G4double G4StatMFMacroTemperature::CalcTemperature(void) 
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    while (fTa < 0.0 && ++iterations < 10) {
85        Ta -= 0.5*Ta;
86        fTa = this->operator()(Ta);
87    }
88    // Usually, fTb will be less than 0, but if it is not the case:
89    iterations = 0; 
90    while (fTa*fTb > 0.0 && iterations++ < 10) {
91        Tb += 2.*std::fabs(Tb-Ta);
92        fTb = this->operator()(Tb);
93    }
94       
95    if (fTa*fTb > 0.0) {
96      G4cerr <<"G4StatMFMacroTemperature:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl;
97      G4cerr <<"G4StatMFMacroTemperature:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl;
98      throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't bracket the solution.");
99    }
100
101    G4Solver<G4StatMFMacroTemperature> * theSolver = new G4Solver<G4StatMFMacroTemperature>(100,1.e-4);
102    theSolver->SetIntervalLimits(Ta,Tb);
103    if (!theSolver->Crenshaw(*this)){ 
104      G4cout <<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl;
105      G4cout <<"G4StatMFMacroTemperature, Crenshaw method failed:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl;
106    }
107    _MeanTemperature = theSolver->GetRoot();
108    G4double FunctionValureAtRoot =  this->operator()(_MeanTemperature);
109    delete  theSolver;
110
111    // Verify if the root is found and it is indeed within the physical domain,
112    // say, between 1 and 50 MeV, otherwise try Brent method:
113    if (std::fabs(FunctionValureAtRoot) > 5.e-2) {
114      if (_MeanTemperature < 1. || _MeanTemperature > 50.) {
115        G4cout << "Crenshaw method failed; function = " << FunctionValureAtRoot
116               << " solution? = " << _MeanTemperature << " MeV " << G4endl;
117        G4Solver<G4StatMFMacroTemperature> * theSolverBrent = new G4Solver<G4StatMFMacroTemperature>(200,1.e-3);
118        theSolverBrent->SetIntervalLimits(Ta,Tb);
119        if (!theSolverBrent->Brent(*this)){
120          G4cout <<"G4StatMFMacroTemperature, Brent method failed:"<<" Ta="<<Ta<<" Tb="<<Tb<< G4endl;
121          G4cout <<"G4StatMFMacroTemperature, Brent method failed:"<<" fTa="<<fTa<<" fTb="<<fTb<< G4endl; 
122          throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't find the root with any method.");
123        }
124
125        _MeanTemperature = theSolverBrent->GetRoot();
126        FunctionValureAtRoot =  this->operator()(_MeanTemperature);
127        delete theSolverBrent;
128      }
129      if (std::abs(FunctionValureAtRoot) > 5.e-2) {
130        //if (_MeanTemperature < 1. || _MeanTemperature > 50. || std::abs(FunctionValureAtRoot) > 5.e-2) {
131        G4cout << "Brent method failed; function = " << FunctionValureAtRoot << " solution? = " << _MeanTemperature << " MeV " << G4endl;
132        throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroTemperature::CalcTemperature: I couldn't find the root with any method.");
133      }
134    }
135    //G4cout << "G4StatMFMacroTemperature::CalcTemperature: function = " << FunctionValureAtRoot
136    //     << " T(MeV)= " << _MeanTemperature << G4endl;
137    return _MeanTemperature;
138}
139
140
141
142G4double G4StatMFMacroTemperature::FragsExcitEnergy(const G4double T)
143    // Calculates excitation energy per nucleon and summed fragment multiplicity and entropy
144{
145
146    // Model Parameters
147    G4double R0 = G4StatMFParameters::Getr0()*std::pow(theA,1./3.);
148    G4double R = R0*std::pow(1.0+G4StatMFParameters::GetKappaCoulomb(), 1./3.);
149    G4double FreeVol = _Kappa*(4.*pi/3.)*R0*R0*R0; 
150 
151 
152    // Calculate Chemical potentials
153    CalcChemicalPotentialNu(T);
154
155
156    // Average total fragment energy
157    G4double AverageEnergy = 0.0;
158    std::vector<G4VStatMFMacroCluster*>::iterator i;
159    for (i =  _theClusters->begin(); i != _theClusters->end(); ++i) 
160      {
161        AverageEnergy += (*i)->GetMeanMultiplicity() * (*i)->CalcEnergy(T);
162      }
163   
164    // Add Coulomb energy                       
165    AverageEnergy += (3./5.)*elm_coupling*theZ*theZ/R;         
166   
167    // Calculate mean entropy
168    _MeanEntropy = 0.0;
169    for (i = _theClusters->begin(); i != _theClusters->end(); ++i) 
170      {
171        _MeanEntropy += (*i)->CalcEntropy(T,FreeVol);   
172      }
173
174    // Excitation energy per nucleon
175    G4double FragsExcitEnergy = AverageEnergy - _FreeInternalE0;
176
177    return FragsExcitEnergy;
178
179}
180
181
182void G4StatMFMacroTemperature::CalcChemicalPotentialNu(const G4double T)
183    // Calculates the chemical potential \nu
184
185{
186    G4StatMFMacroChemicalPotential * theChemPot = new
187        G4StatMFMacroChemicalPotential(theA,theZ,_Kappa,T,_theClusters);
188
189
190    _ChemPotentialNu = theChemPot->CalcChemicalPotentialNu();
191    _ChemPotentialMu = theChemPot->GetChemicalPotentialMu();
192    _MeanMultiplicity = theChemPot->GetMeanMultiplicity();     
193       
194    delete theChemPot;
195                   
196    return;
197
198}
199
200
Note: See TracBrowser for help on using the repository browser.