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 GrandCanonical::GrandCanonical():
24 fBaryonPotential(-1111),
25 fStrangePotential(-1111),
26 fElectroPotential(-1111),
32 GrandCanonical::GrandCanonical(Int_t nmax, Double_t temperature, Double_t baryonPotential, Double_t strangePotential, Double_t electroPotential):
33 fTemperature(temperature),
34 fBaryonPotential(baryonPotential),
35 fStrangePotential(strangePotential),
36 fElectroPotential(electroPotential),
42 GrandCanonical::~GrandCanonical() {}
45 void GrandCanonical::Temperature(Double_t value) {
47 if(fNMax!=-1111 && fBaryonPotential!=-1111 && fStrangePotential!=-1111 && fElectroPotential!=-1111)
51 void GrandCanonical::BaryonPotential(Double_t value) {
52 fBaryonPotential = value;
53 if(fNMax!=-1111 && fTemperature!=-1111 && fStrangePotential!=-1111 && fElectroPotential!=-1111)
57 void GrandCanonical::StrangePotential(Double_t value) {
58 fStrangePotential = value;
59 if(fNMax!=-1111 && fTemperature!=-1111 && fBaryonPotential!=-1111 && fElectroPotential!=-1111)
63 void GrandCanonical::ElectroPotential(Double_t value) {
64 fElectroPotential = value;
65 if(fNMax!=-1111 && fTemperature!=-1111 && fBaryonPotential!=-1111 && fStrangePotential!=-1111)
69 void GrandCanonical::NMax(Int_t value) {
71 if(fTemperature!=-1111 && fBaryonPotential!=-1111 && fStrangePotential!=-1111 && fElectroPotential!=-1111)
75 Double_t GrandCanonical::ParticleEnergyDensity(ParticlePDG* particle) {
76 // Check if all the thermodinamic parameters are set
78 Fatal("GrandCanonical::ParticleEnergyDensity", "GrandCanonical object not fully initialized!!");
80 // Compute the particle energy density
81 Double_t degFactor = 2.*particle->GetSpin() + 1.; // degeneracy factor
82 Double_t mass = particle->GetMass(); // PDG table mass
83 Double_t d = Int_t(2.*particle->GetSpin()) & 1 ? 1. : -1; // Bose-Einstein/Fermi-Dirac factor
84 Double_t preFactor = (degFactor*mass*mass*fTemperature*fTemperature/hbarc/hbarc/hbarc)/(2.*TMath::Pi()*TMath::Pi());
86 Double_t postFactor = 0.;
87 //compute chemical potential
88 Double_t potential = fBaryonPotential * particle->GetBaryonNumber() +
89 fStrangePotential * particle->GetStrangeness() +
90 fElectroPotential * particle->GetElectricCharge();
92 for(Int_t n = 1; n <= fNMax; ++n) {
93 postFactor += TMath::Power(-d, n+1)/(n*n) *
94 TMath::Exp(n*potential/fTemperature) *
95 (3.*HankelKn(2, n*mass/fTemperature) + n*mass/fTemperature*HankelK1(n*mass/fTemperature));
97 return preFactor * postFactor;
100 Double_t GrandCanonical::ParticleNumberDensity(ParticlePDG* particle) {
101 // Check if all the thermodinamic parameters are set
103 Fatal("GrandCanonical::ParticleNumberDensity", "GrandCanonical object not fully initialized!!");
105 Double_t degFactor = 2.*particle->GetSpin() + 1.;
106 Double_t mass = particle->GetMass();
107 Double_t d = Int_t(2*particle->GetSpin()) & 1 ? 1. : -1.;
108 Double_t preFactor = (degFactor*mass*mass*fTemperature/hbarc/hbarc/hbarc)/(2.*TMath::Pi()*TMath::Pi());
110 Double_t postFactor = 0.;
111 Double_t potential = fBaryonPotential * particle->GetBaryonNumber() +
112 fStrangePotential * particle->GetStrangeness() +
113 fElectroPotential * particle->GetElectricCharge();
115 for(Int_t n = 1; n <= fNMax; ++n) {
116 postFactor += TMath::Power(-d, n+1)/n *
117 TMath::Exp(n*potential/fTemperature) *
118 HankelKn(2, n*mass/fTemperature);
120 return preFactor * postFactor;
124 Double_t GrandCanonical::EnergyDensity(DatabasePDG* database) {
125 // Check if all the thermodinamic parameters are set
127 Fatal("GrandCanonical::EnergyDensity", "GrandCanonical object not fully initialized!!");
129 Double_t meanEnergyDensity = 0.;
131 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
132 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
133 meanEnergyDensity += ParticleEnergyDensity(particle);
136 return meanEnergyDensity;
139 Double_t GrandCanonical::BaryonDensity(DatabasePDG* database) {
140 // Check if all the thermodinamic parameters are set
142 Fatal("GrandCanonical::BaryonDensity", "GrandCanonical object not fully initialized!!");
144 Double_t meanBaryonDensity = 0.;
146 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
147 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
148 meanBaryonDensity += ParticleNumberDensity(particle)*particle->GetBaryonNumber();
150 return meanBaryonDensity;
153 Double_t GrandCanonical::StrangeDensity(DatabasePDG* database) {
154 // Check if all the thermodinamic parameters are set
156 Fatal("GrandCanonical::StrangeDensity", "GrandCanonical object not fully initialized!!");
158 Double_t meanStrangeDensity = 0.;
160 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
161 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
162 meanStrangeDensity += ParticleNumberDensity(particle)*particle->GetStrangeness();
165 return meanStrangeDensity;
168 Double_t GrandCanonical::ElectroDensity(DatabasePDG* database) {
169 // Check if all the thermodinamic parameters are set
171 Fatal("GrandCanonical::ElectroDensity", "GrandCanonical object not fully initialized!!");
173 Double_t meanElectroDensity = 0.;
176 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
177 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
178 meanElectroDensity += ParticleNumberDensity(particle)*particle->GetElectricCharge();
181 return meanElectroDensity;