Thermal-FIST 1.6.1
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_xiSum = 0.0;
40
41 m_TAG = "ThermalModelCanonicalStrangeness";
42
43 m_Ensemble = SCE;
44 m_InteractionModel = Ideal;
45 }
46
50
51
56
58 {
59 m_Parameters.muS = 0.0;
60 }
61
64 m_densitiesGCE.resize(m_TPS->Particles().size());
65 }
67 m_ConstrainMuS = false;
68 m_ConstrainMuC = false; // No sense doing strangeness CE but charm GCE
69
71 }
72
73
75 m_QuantumStats = stats;
76 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
77 if (m_TPS->Particles()[i].Strangeness() == 0) m_TPS->Particle(i).UseStatistics(stats);
78 else m_TPS->Particle(i).UseStatistics(false);
79 }
80
82 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
83 m_densitiesGCE[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::ParticleDensity, m_UseWidth, m_Chem[i]);
84 }
85 m_GCECalculated = true;
86 }
87
90 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
91 m_energydensitiesGCE[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EnergyDensity, m_UseWidth, m_Chem[i]);
92 }
93 }
94
96 {
97 m_pressuresGCE.resize(m_densitiesGCE.size());
98 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
99 m_pressuresGCE[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::Pressure, m_UseWidth, m_Chem[i]);
100 }
101 }
102
104 {
105 if (!m_GCECalculated)
107
108 m_Zsum.resize(m_StrVals.size());
109
110 m_partialS.resize(m_StrVals.size());
111 vector<double> xi(3, 0.), yi(3, 0.);
112
113 for (size_t i = 0; i < m_StrVals.size(); ++i) {
114 m_partialS[i] = 0.;
115 for (int j = 0; j < m_TPS->ComponentsNumber(); ++j)
116 if (m_StrVals[i] == m_TPS->Particles()[j].Strangeness())
117 m_partialS[i] += m_densitiesGCE[j] * Vc;
118 }
119
120 for (int i = 0; i < 3; ++i) {
121 xi[i] = 2. * sqrt(m_partialS[m_StrMap[i + 1]] * m_partialS[m_StrMap[-(i + 1)]]);
122 yi[i] = sqrt(m_partialS[m_StrMap[i + 1]] / m_partialS[m_StrMap[-(i + 1)]]);
123 }
124
125 // TODO: Choose iters dynamically based on total strangeness
126 int iters = 20;
127
128 // Use exponentially-scaled Bessel functions to avoid overflow for large xi.
129 // BesselIexp(n, x) = I_n(x) * exp(-|x|), so the common factor exp(xi0+xi1+xi2)
130 // cancels in the ratio m_Zsum[i]/m_Zsum[0] used for densities.
131 m_xiSum = xi[0] + xi[1] + xi[2];
132
133 for (unsigned int i = 0; i < m_StrVals.size(); ++i) {
134 double res = 0.;
135
136 for (int m = -iters; m <= iters; ++m)
137 for (int n = -iters; n <= iters; ++n) {
138 double tmp = xMath::BesselIexp(abs(3 * m + 2 * n - m_StrVals[i]), xi[0]) *
139 xMath::BesselIexp(abs(n), xi[1]) *
140 xMath::BesselIexp(abs(m), xi[2]) *
141 pow(yi[0], m_StrVals[i] - 3 * m - 2 * n) *
142 pow(yi[1], n) *
143 pow(yi[2], m);
144 if (tmp != tmp) continue;
145 res += tmp;
146 }
147 m_Zsum[i] = res;
148 }
149 }
150
152 assert(m_IGFExtraConfig.MagneticField.B == 0.); // No magnetic field supported currently
153
155 throw std::runtime_error("ThermalModelCanonicalStrangeness::CalculatePrimordialDensities(): PCE not supported!");
156 }
157
158 m_FluctuationsCalculated = false;
159
160 m_energydensitiesGCE.resize(0);
161 m_pressuresGCE.resize(0);
162
164
165 CalculateSums(m_Parameters.SVc);
166
167 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
168 if (m_StrMap.count(-m_TPS->Particles()[i].Strangeness()))
169 m_densities[i] = (m_Zsum[m_StrMap[-m_TPS->Particles()[i].Strangeness()]] / m_Zsum[m_StrMap[0]]) * m_densitiesGCE[i];
170 }
171
172 m_Calculated = true;
174 }
175
176
178 m_wprim.resize(m_densities.size());
179 m_wtot.resize(m_densities.size());
180 for (size_t i = 0; i < m_wprim.size(); ++i) {
181 m_wprim[i] = 1.;
182 m_wtot[i] = 1.;
183 m_skewprim[i] = 1.;
184 m_skewtot[i] = 1.;
185 }
186 }
187
188
190 if (!m_Calculated)
192 if (m_energydensitiesGCE.size() == 0)
194 double ret = 0.;
195 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
196 if (m_StrMap.count(-m_TPS->Particles()[i].Strangeness()))
197 ret += (m_Zsum[m_StrMap[-m_TPS->Particles()[i].Strangeness()]] / m_Zsum[m_StrMap[0]]) * m_energydensitiesGCE[i];
198 return ret;
199 }
200
201
203 // m_Zsum stores BesselIexp-based values (scaled by exp(-xiSum)), so
204 // log(Z_0) = log(m_Zsum[0]) + xiSum
205 double ret = (log(m_Zsum[m_StrMap[0]]) + m_xiSum) / m_Parameters.SVc;
206 if (m_energydensitiesGCE.size() == 0)
208 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
209 if (m_TPS->Particles()[i].Strangeness() != 0) {
210 if (m_StrMap.count(-m_TPS->Particles()[i].Strangeness()))
211 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);
212 }
213 else {
214 ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EntropyDensity, m_UseWidth, m_Chem[i]);
215 }
216 return ret;
217 }
218
219
221 double ret = 0.;
222 if (m_pressuresGCE.size() == 0)
224 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
225 if (m_StrMap.count(-m_TPS->Particles()[i].Strangeness()))
226 ret += (m_Zsum[m_StrMap[-m_TPS->Particles()[i].Strangeness()]] / m_Zsum[m_StrMap[0]]) * m_pressuresGCE[i];
227 return ret;
228 }
229
233
234} // 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.
double m_xiSum
Sum of Bessel arguments, stored for entropy calculation.
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 BesselIexp(int n, double x)
Modified Bessel function I_n(x), divided by exponential factor.
Definition xMath.cpp:791
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.