3 Nikolai Amelin, Ludmila Malinina, Timur Pocheptsov (C) JINR/Dubna
4 amelin@sunhe.jinr.ru, malinina@sunhe.jinr.ru, pocheptsov@sunhe.jinr.ru
12 #ifndef GRANDCANONICAL_INCLUDED
13 #include "GrandCanonical.h"
15 #ifndef HANKELFUNCTION_INCLUDED
16 #include "HankelFunction.h"
18 #ifndef UKUTILITY_INCLUDED
19 #include "UKUtility.h"
22 #include "ParticlePDG.h"
25 #include "DatabasePDG.h"
28 GrandCanonical::GrandCanonical():
30 fBaryonPotential(-1111),
31 fStrangePotential(-1111),
32 fElectroPotential(-1111),
38 GrandCanonical::GrandCanonical(Int_t nmax, Double_t temperature, Double_t baryonPotential, Double_t strangePotential, Double_t electroPotential):
39 fTemperature(temperature),
40 fBaryonPotential(baryonPotential),
41 fStrangePotential(strangePotential),
42 fElectroPotential(electroPotential),
48 GrandCanonical::~GrandCanonical() {}
51 void GrandCanonical::Temperature(Double_t value) {
53 if(fNMax!=-1111 && fBaryonPotential!=-1111 && fStrangePotential!=-1111 && fElectroPotential!=-1111)
57 void GrandCanonical::BaryonPotential(Double_t value) {
58 fBaryonPotential = value;
59 if(fNMax!=-1111 && fTemperature!=-1111 && fStrangePotential!=-1111 && fElectroPotential!=-1111)
63 void GrandCanonical::StrangePotential(Double_t value) {
64 fStrangePotential = value;
65 if(fNMax!=-1111 && fTemperature!=-1111 && fBaryonPotential!=-1111 && fElectroPotential!=-1111)
69 void GrandCanonical::ElectroPotential(Double_t value) {
70 fElectroPotential = value;
71 if(fNMax!=-1111 && fTemperature!=-1111 && fBaryonPotential!=-1111 && fStrangePotential!=-1111)
75 void GrandCanonical::NMax(Int_t value) {
77 if(fTemperature!=-1111 && fBaryonPotential!=-1111 && fStrangePotential!=-1111 && fElectroPotential!=-1111)
81 Double_t GrandCanonical::ParticleEnergyDensity(ParticlePDG *const particle) {
82 // Check if all the thermodinamic parameters are set
84 Fatal("GrandCanonical::ParticleEnergyDensity", "GrandCanonical object not fully initialized!!");
86 // Compute the particle energy density
87 Double_t degFactor = 2.*particle->GetSpin() + 1.; // degeneracy factor
88 Double_t mass = particle->GetMass(); // PDG table mass
89 Double_t d = Int_t(2.*particle->GetSpin()) & 1 ? 1. : -1; // Bose-Einstein/Fermi-Dirac factor
90 Double_t preFactor = (degFactor*mass*mass*fTemperature*fTemperature/hbarc/hbarc/hbarc)/(2.*TMath::Pi()*TMath::Pi());
92 Double_t postFactor = 0.;
93 //compute chemical potential
94 Double_t potential = fBaryonPotential * particle->GetBaryonNumber() +
95 fStrangePotential * particle->GetStrangeness() +
96 fElectroPotential * particle->GetElectricCharge();
98 for(Int_t n = 1; n <= fNMax; ++n) {
99 postFactor += TMath::Power(-d, n+1)/(n*n) *
100 TMath::Exp(n*potential/fTemperature) *
101 (3.*HankelKn(2, n*mass/fTemperature) + n*mass/fTemperature*HankelK1(n*mass/fTemperature));
103 return preFactor * postFactor;
106 Double_t GrandCanonical::ParticleNumberDensity(ParticlePDG *const particle) {
107 // Check if all the thermodinamic parameters are set
109 Fatal("GrandCanonical::ParticleNumberDensity", "GrandCanonical object not fully initialized!!");
111 Double_t degFactor = 2.*particle->GetSpin() + 1.;
112 Double_t mass = particle->GetMass();
113 Double_t d = Int_t(2*particle->GetSpin()) & 1 ? 1. : -1.;
114 Double_t preFactor = (degFactor*mass*mass*fTemperature/hbarc/hbarc/hbarc)/(2.*TMath::Pi()*TMath::Pi());
116 Double_t postFactor = 0.;
117 Double_t potential = fBaryonPotential * particle->GetBaryonNumber() +
118 fStrangePotential * particle->GetStrangeness() +
119 fElectroPotential * particle->GetElectricCharge();
121 for(Int_t n = 1; n <= fNMax; ++n) {
122 postFactor += TMath::Power(-d, n+1)/n *
123 TMath::Exp(n*potential/fTemperature) *
124 HankelKn(2, n*mass/fTemperature);
126 return preFactor * postFactor;
130 Double_t GrandCanonical::EnergyDensity(DatabasePDG *const database) {
131 // Check if all the thermodinamic parameters are set
133 Fatal("GrandCanonical::EnergyDensity", "GrandCanonical object not fully initialized!!");
135 Double_t meanEnergyDensity = 0.;
137 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
138 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
139 meanEnergyDensity += ParticleEnergyDensity(particle);
142 return meanEnergyDensity;
145 Double_t GrandCanonical::BaryonDensity(DatabasePDG *const database) {
146 // Check if all the thermodinamic parameters are set
148 Fatal("GrandCanonical::BaryonDensity", "GrandCanonical object not fully initialized!!");
150 Double_t meanBaryonDensity = 0.;
152 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
153 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
154 meanBaryonDensity += ParticleNumberDensity(particle)*particle->GetBaryonNumber();
156 return meanBaryonDensity;
159 Double_t GrandCanonical::StrangeDensity(DatabasePDG *const database) {
160 // Check if all the thermodinamic parameters are set
162 Fatal("GrandCanonical::StrangeDensity", "GrandCanonical object not fully initialized!!");
164 Double_t meanStrangeDensity = 0.;
166 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
167 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
168 meanStrangeDensity += ParticleNumberDensity(particle)*particle->GetStrangeness();
171 return meanStrangeDensity;
174 Double_t GrandCanonical::ElectroDensity(DatabasePDG *const database) {
175 // Check if all the thermodinamic parameters are set
177 Fatal("GrandCanonical::ElectroDensity", "GrandCanonical object not fully initialized!!");
179 Double_t meanElectroDensity = 0.;
182 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
183 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
184 meanElectroDensity += ParticleNumberDensity(particle)*particle->GetElectricCharge();
187 return meanElectroDensity;