Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4StatMFMacroChemicalPotential.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
33#include "G4Pow.hh"
34
35// operators definitions
37G4StatMFMacroChemicalPotential::operator=(const G4StatMFMacroChemicalPotential & )
38{
39 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroChemicalPotential::operator= meant to not be accessible");
40 return *this;
41}
42
43G4bool G4StatMFMacroChemicalPotential::operator==(const G4StatMFMacroChemicalPotential & ) const
44{
45 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroChemicalPotential::operator== meant to not be accessible");
46 return false;
47}
48
49
50G4bool G4StatMFMacroChemicalPotential::operator!=(const G4StatMFMacroChemicalPotential & ) const
51{
52 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroChemicalPotential::operator!= meant to not be accessible");
53 return true;
54}
55
57// Calculate Chemical potential \nu
58{
59 G4Pow* g4calc = G4Pow::GetInstance();
61
62 // Initial value for _ChemPotentialNu
63 _ChemPotentialNu = (theZ/theA)*(8.0*G4StatMFParameters::GetGamma0()
64 +2.0*CP*g4calc->Z23(theA))
66
67 G4double ChemPa = _ChemPotentialNu;
68 G4double ChemPb = 0.5*_ChemPotentialNu;
69
70 G4double fChemPa = this->operator()(ChemPa);
71 G4double fChemPb = this->operator()(ChemPb);
72
73 if (fChemPa*fChemPb > 0.0) {
74 // bracketing the solution
75 if (fChemPa < 0.0) {
76 do {
77 ChemPb -= 1.5*std::abs(ChemPb-ChemPa);
78 fChemPb = this->operator()(ChemPb);
79 // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
80 } while (fChemPb < 0.0);
81 } else {
82 do {
83 ChemPb += 1.5*std::abs(ChemPb-ChemPa);
84 fChemPb = this->operator()(ChemPb);
85 // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
86 } while (fChemPb > 0.0);
87 }
88 }
89
92 theSolver->SetIntervalLimits(ChemPa,ChemPb);
93 // if (!theSolver->Crenshaw(*this))
94 if (!theSolver->Brent(*this)){
95 G4cout <<"G4StatMFMacroChemicalPotential:"<<" ChemPa="<<ChemPa
96 <<" ChemPb="<<ChemPb<< G4endl;
97 G4cout <<"G4StatMFMacroChemicalPotential:"<<" fChemPa="<<fChemPa
98 <<" fChemPb="<<fChemPb<< G4endl;
99 throw G4HadronicException(__FILE__, __LINE__, "G4StatMFMacroChemicalPotential::CalcChemicalPotentialNu: I couldn't find the root.");
100 }
101 _ChemPotentialNu = theSolver->GetRoot();
102 delete theSolver;
103 return _ChemPotentialNu;
104}
105
106
107
108G4double G4StatMFMacroChemicalPotential::CalcMeanZ(const G4double nu)
109{
110 std::vector<G4VStatMFMacroCluster*>::iterator i;
111 for (i= _theClusters->begin()+1; i != _theClusters->end(); ++i)
112 {
113 (*i)->CalcZARatio(nu);
114 }
115 CalcChemicalPotentialMu(nu);
116 // This is important, the Z over A ratio for proton and neutron depends on the
117 // chemical potential Mu, while for the first guess for Chemical potential mu
118 // some values of Z over A ratio. This is the reason for that.
119 (*_theClusters->begin())->CalcZARatio(nu);
120
121 G4double MeanZ = 0.0;
122 G4int n = 1;
123 for (i = _theClusters->begin(); i != _theClusters->end(); ++i)
124 {
125 MeanZ += (n++) * (*i)->GetZARatio() * (*i)->GetMeanMultiplicity();
126 }
127 return MeanZ;
128}
129
130void G4StatMFMacroChemicalPotential::CalcChemicalPotentialMu(const G4double nu)
131// Calculate Chemical potential \mu
132// For that is necesary to calculate mean multiplicities
133{
134 G4StatMFMacroMultiplicity * theMultip = new
135 G4StatMFMacroMultiplicity(theA,_Kappa,_MeanTemperature,nu,_theClusters);
136
137 _ChemPotentialMu = theMultip->CalcChemicalPotentialMu();
138 _MeanMultiplicity = theMultip->GetMeanMultiplicity();
139
140 delete theMultip;
141
142 return;
143}
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
Definition G4Pow.hh:49
static G4Pow * GetInstance()
Definition G4Pow.cc:41
G4double Z23(G4int Z) const
Definition G4Pow.hh:125
G4bool Brent(Function &theFunction)
void SetIntervalLimits(const G4double Limit1, const G4double Limit2)
G4double GetRoot(void) const
Definition G4Solver.hh:76
static G4double GetGamma0()
static G4double GetCoulomb()