Thermal-FIST 1.5
Package for hadron resonance gas model applications
Loading...
Searching...
No Matches
ThermalModelCanonicalStrangeness.cpp
Go to the documentation of this file.
1/*
2 * Thermal-FIST package
3 *
4 * Copyright (c) 2014-2019 Volodymyr Vovchenko
5 *
6 * GNU General Public License (GPLv3 or later)
7 */
9
10#include <cassert>
11#include <stdexcept>
12
13#include "HRGBase/xMath.h"
14
15
16using namespace std;
17
18namespace thermalfist {
19
22 {
23 m_densitiesGCE.resize(m_TPS->Particles().size());
24
25 m_StrVals.resize(0);
26 m_StrVals.push_back(0);
27 m_StrVals.push_back(1);
28 m_StrVals.push_back(2);
29 m_StrVals.push_back(3);
30 m_StrVals.push_back(-1);
31 m_StrVals.push_back(-2);
32 m_StrVals.push_back(-3);
33
34 m_StrMap.clear();
35 for (unsigned int i = 0; i < m_StrVals.size(); ++i) m_StrMap[m_StrVals[i]] = i;
36
37 m_Parameters.muS = 0.;
38
39 m_TAG = "ThermalModelCanonicalStrangeness";
40
41 m_Ensemble = SCE;
42 m_InteractionModel = Ideal;
43 }
44
48
49
54
56 {
57 m_Parameters.muS = 0.0;
58 }
59
62 m_densitiesGCE.resize(m_TPS->Particles().size());
63 }
65 m_ConstrainMuS = false;
66 m_ConstrainMuC = false; // No sense doing strangeness CE but charm GCE
67
69 }
70
71
73 m_QuantumStats = stats;
74 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
75 if (m_TPS->Particles()[i].Strangeness() == 0) m_TPS->Particle(i).UseStatistics(stats);
76 else m_TPS->Particle(i).UseStatistics(false);
77 }
78
80 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
81 m_densitiesGCE[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::ParticleDensity, m_UseWidth, m_Chem[i]);
82 }
83 m_GCECalculated = true;
84 }
85
88 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
89 m_energydensitiesGCE[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EnergyDensity, m_UseWidth, m_Chem[i]);
90 }
91 }
92
94 {
95 m_pressuresGCE.resize(m_densitiesGCE.size());
96 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
97 m_pressuresGCE[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::Pressure, m_UseWidth, m_Chem[i]);
98 }
99 }
100
102 {
103 if (!m_GCECalculated)
105
106 m_Zsum.resize(m_StrVals.size());
107
108 m_partialS.resize(m_StrVals.size());
109 vector<double> xi(3, 0.), yi(3, 0.);
110
111 for (size_t i = 0; i < m_StrVals.size(); ++i) {
112 m_partialS[i] = 0.;
113 for (int j = 0; j < m_TPS->ComponentsNumber(); ++j)
114 if (m_StrVals[i] == m_TPS->Particles()[j].Strangeness())
115 m_partialS[i] += m_densitiesGCE[j] * Vc;
116 }
117
118 for (int i = 0; i < 3; ++i) {
119 xi[i] = 2. * sqrt(m_partialS[m_StrMap[i + 1]] * m_partialS[m_StrMap[-(i + 1)]]);
120 yi[i] = sqrt(m_partialS[m_StrMap[i + 1]] / m_partialS[m_StrMap[-(i + 1)]]);
121 }
122
123 // TODO: Choose iters dynamically based on total strangeness
124 int iters = 20;
125
126 for (unsigned int i = 0; i < m_StrVals.size(); ++i) {
127 double res = 0.;
128
129 for (int m = -iters; m <= iters; ++m)
130 for (int n = -iters; n <= iters; ++n) {
131 double tmp = xMath::BesselI(abs(3 * m + 2 * n - m_StrVals[i]), xi[0]) *
132 xMath::BesselI(abs(n), xi[1]) *
133 xMath::BesselI(abs(m), xi[2]) *
134 pow(yi[0], m_StrVals[i] - 3 * m - 2 * n) *
135 pow(yi[1], n) *
136 pow(yi[2], m);
137 if (tmp != tmp) continue;
138 res += tmp;
139 }
140 m_Zsum[i] = res;
141 }
142 }
143
145 assert(m_IGFExtraConfig.MagneticField.B == 0.); // No magnetic field supported currently
146
148 throw std::runtime_error("ThermalModelCanonicalStrangeness::CalculatePrimordialDensities(): PCE not supported!");
149 }
150
151 m_FluctuationsCalculated = false;
152
153 m_energydensitiesGCE.resize(0);
154 m_pressuresGCE.resize(0);
155
157
158 CalculateSums(m_Parameters.SVc);
159
160 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
161 if (m_StrMap.count(-m_TPS->Particles()[i].Strangeness()))
162 m_densities[i] = (m_Zsum[m_StrMap[-m_TPS->Particles()[i].Strangeness()]] / m_Zsum[m_StrMap[0]]) * m_densitiesGCE[i];
163 }
164
165 m_Calculated = true;
167 }
168
169
171 m_wprim.resize(m_densities.size());
172 m_wtot.resize(m_densities.size());
173 for (size_t i = 0; i < m_wprim.size(); ++i) {
174 m_wprim[i] = 1.;
175 m_wtot[i] = 1.;
176 m_skewprim[i] = 1.;
177 m_skewtot[i] = 1.;
178 }
179 }
180
181
183 if (!m_Calculated)
185 if (m_energydensitiesGCE.size() == 0)
187 double ret = 0.;
188 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
189 if (m_StrMap.count(-m_TPS->Particles()[i].Strangeness()))
190 ret += (m_Zsum[m_StrMap[-m_TPS->Particles()[i].Strangeness()]] / m_Zsum[m_StrMap[0]]) * m_energydensitiesGCE[i];
191 return ret;
192 }
193
194
196 double ret = log(m_Zsum[m_StrMap[0]]) / m_Parameters.SVc;
197 if (m_energydensitiesGCE.size() == 0)
199 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
200 if (m_TPS->Particles()[i].Strangeness() != 0) {
201 if (m_StrMap.count(-m_TPS->Particles()[i].Strangeness()))
202 ret += (m_Zsum[m_StrMap[-m_TPS->Particles()[i].Strangeness()]] / m_Zsum[m_StrMap[0]]) * ((m_energydensitiesGCE[i] - m_Chem[i] * m_densitiesGCE[i]) / m_Parameters.T);
203 }
204 else {
205 ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EntropyDensity, m_UseWidth, m_Chem[i]);
206 }
207 return ret;
208 }
209
210
212 double ret = 0.;
213 if (m_pressuresGCE.size() == 0)
215 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
216 if (m_StrMap.count(-m_TPS->Particles()[i].Strangeness()))
217 ret += (m_Zsum[m_StrMap[-m_TPS->Particles()[i].Strangeness()]] / m_Zsum[m_StrMap[0]]) * m_pressuresGCE[i];
218 return ret;
219 }
220
224
225} // namespace thermalfist
map< string, double > params
virtual void ChangeTPS(ThermalParticleSystem *TPS)
Change the particle list.
bool UsePartialChemicalEquilibrium()
Whether partial chemical equilibrium with additional chemical potentials is used.
virtual void FixParameters()
Method which actually implements ConstrainChemicalPotentials() (for backward compatibility).
virtual void SetParameters(const ThermalModelParameters &params)
The thermal parameters.
virtual void ValidateCalculation()
Checks whether issues have occured during the calculation of particle densities in the CalculateDensi...
ThermalModelBase(ThermalParticleSystem *TPS, const ThermalModelParameters &params=ThermalModelParameters())
Construct a new ThermalModelBase object.
virtual void CalculateDensities()
Calculates the primordial and total (after decays) densities of all species.
@ SCE
Strangeness-canonical ensemble.
virtual void CalculateEnergyDensitiesGCE()
Calculates the grand-canonical energy densities.
virtual void CalculateDensitiesGCE()
Calculates the particle densities in a grand-canonical ensemble.
virtual void CalculatePrimordialDensities()
Calculates the primordial densities of all species.
ThermalModelCanonicalStrangeness(ThermalParticleSystem *TPS, const ThermalModelParameters &params=ThermalModelParameters())
Construct a new ThermalModelCanonicalStrangeness object.
virtual void SetStrangenessChemicalPotential(double muS)
Override the base class method to always set to zero.
virtual void FixParameters()
Method which actually implements ConstrainChemicalPotentials() (for backward compatibility).
virtual void CalculateSums(double Vc)
Calculates the strangeness-canonical partition functions.
void CalculateFluctuations()
Dummy function. Fluctuations not yet supported.
virtual ~ThermalModelCanonicalStrangeness(void)
Destroy the ThermalModelCanonicalStrangeness object.
virtual bool IsConservedChargeCanonical(ConservedCharge::Name charge) const
virtual void CalculatePressuresGCE()
Calculates the grand-canonical pressures.
virtual void ChangeTPS(ThermalParticleSystem *TPS)
Change the particle list.
virtual void SetParameters(const ThermalModelParameters &params)
The thermal parameters.
Class containing the particle list.
double BesselI(int n, double x)
Integer order modified Bessel function I_n(x)
Definition xMath.cpp:192
The main namespace where all classes and functions of the Thermal-FIST library reside.
Definition CosmicEoS.h:9
Name
Set of all conserved charges considered.
Structure containing all thermal parameters of the model.
Contains some extra mathematical functions used in the code.