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() {
23 fInitialized = kFALSE;
26 fBaryonPotential = -1111;
27 fStrangePotential = -1111;
28 fElectroPotential = -1111;
31 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;
40 GrandCanonical::~GrandCanonical() {}
43 void GrandCanonical::Temperature(Double_t value) {
45 if(fNMax!=-1111 && fBaryonPotential!=-1111 && fStrangePotential!=-1111 && fElectroPotential!=-1111)
49 void GrandCanonical::BaryonPotential(Double_t value) {
50 fBaryonPotential = value;
51 if(fNMax!=-1111 && fTemperature!=-1111 && fStrangePotential!=-1111 && fElectroPotential!=-1111)
55 void GrandCanonical::StrangePotential(Double_t value) {
56 fStrangePotential = value;
57 if(fNMax!=-1111 && fTemperature!=-1111 && fBaryonPotential!=-1111 && fElectroPotential!=-1111)
61 void GrandCanonical::ElectroPotential(Double_t value) {
62 fElectroPotential = value;
63 if(fNMax!=-1111 && fTemperature!=-1111 && fBaryonPotential!=-1111 && fStrangePotential!=-1111)
67 void GrandCanonical::NMax(Int_t value) {
69 if(fTemperature!=-1111 && fBaryonPotential!=-1111 && fStrangePotential!=-1111 && fElectroPotential!=-1111)
73 Double_t GrandCanonical::ParticleEnergyDensity(ParticlePDG* particle) {
74 // Check if all the thermodinamic parameters are set
76 Fatal("GrandCanonical::ParticleEnergyDensity", "GrandCanonical object not fully initialized!!");
78 // Compute the particle energy density
79 Double_t degFactor = 2.*particle->GetSpin() + 1.; // degeneracy factor
80 Double_t mass = particle->GetMass(); // PDG table mass
81 Double_t d = Int_t(2.*particle->GetSpin()) & 1 ? 1. : -1; // Bose-Einstein/Fermi-Dirac factor
82 Double_t preFactor = (degFactor*mass*mass*fTemperature*fTemperature/hbarc/hbarc/hbarc)/(2.*TMath::Pi()*TMath::Pi());
84 Double_t postFactor = 0.;
85 //compute chemical potential
86 Double_t potential = fBaryonPotential * particle->GetBaryonNumber() +
87 fStrangePotential * particle->GetStrangeness() +
88 fElectroPotential * particle->GetElectricCharge();
90 for(Int_t n = 1; n <= fNMax; ++n) {
91 postFactor += TMath::Power(-d, n+1)/(n*n) *
92 TMath::Exp(n*potential/fTemperature) *
93 (3.*HankelKn(2, n*mass/fTemperature) + n*mass/fTemperature*HankelK1(n*mass/fTemperature));
95 return preFactor * postFactor;
98 Double_t GrandCanonical::ParticleNumberDensity(ParticlePDG* particle) {
99 // Check if all the thermodinamic parameters are set
101 Fatal("GrandCanonical::ParticleNumberDensity", "GrandCanonical object not fully initialized!!");
103 Double_t degFactor = 2.*particle->GetSpin() + 1.;
104 Double_t mass = particle->GetMass();
105 Double_t d = Int_t(2*particle->GetSpin()) & 1 ? 1. : -1.;
106 Double_t preFactor = (degFactor*mass*mass*fTemperature/hbarc/hbarc/hbarc)/(2.*TMath::Pi()*TMath::Pi());
108 Double_t postFactor = 0.;
109 Double_t potential = fBaryonPotential * particle->GetBaryonNumber() +
110 fStrangePotential * particle->GetStrangeness() +
111 fElectroPotential * particle->GetElectricCharge();
113 for(Int_t n = 1; n <= fNMax; ++n) {
114 postFactor += TMath::Power(-d, n+1)/n *
115 TMath::Exp(n*potential/fTemperature) *
116 HankelKn(2, n*mass/fTemperature);
118 return preFactor * postFactor;
122 Double_t GrandCanonical::EnergyDensity(DatabasePDG* database) {
123 // Check if all the thermodinamic parameters are set
125 Fatal("GrandCanonical::EnergyDensity", "GrandCanonical object not fully initialized!!");
127 Double_t meanEnergyDensity = 0.;
129 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
130 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
131 meanEnergyDensity += ParticleEnergyDensity(particle);
134 return meanEnergyDensity;
137 Double_t GrandCanonical::BaryonDensity(DatabasePDG* database) {
138 // Check if all the thermodinamic parameters are set
140 Fatal("GrandCanonical::BaryonDensity", "GrandCanonical object not fully initialized!!");
142 Double_t meanBaryonDensity = 0.;
144 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
145 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
146 meanBaryonDensity += ParticleNumberDensity(particle)*particle->GetBaryonNumber();
148 return meanBaryonDensity;
151 Double_t GrandCanonical::StrangeDensity(DatabasePDG* database) {
152 // Check if all the thermodinamic parameters are set
154 Fatal("GrandCanonical::StrangeDensity", "GrandCanonical object not fully initialized!!");
156 Double_t meanStrangeDensity = 0.;
158 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
159 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
160 meanStrangeDensity += ParticleNumberDensity(particle)*particle->GetStrangeness();
163 return meanStrangeDensity;
166 Double_t GrandCanonical::ElectroDensity(DatabasePDG* database) {
167 // Check if all the thermodinamic parameters are set
169 Fatal("GrandCanonical::ElectroDensity", "GrandCanonical object not fully initialized!!");
171 Double_t meanElectroDensity = 0.;
174 for(Int_t currParticle = 0; currParticle<database->GetNParticles(); currParticle++) {
175 ParticlePDG *particle = database->GetPDGParticleByIndex(currParticle);
176 meanElectroDensity += ParticleNumberDensity(particle)*particle->GetElectricCharge();
179 return meanElectroDensity;