Thermal-FIST 1.5
Package for hadron resonance gas model applications
Loading...
Searching...
No Matches
ThermalModelIdeal.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#ifdef USE_OPENMP
11#include <omp.h>
12#endif
13
14#include <iostream>
15#include <cmath>
16#include <cassert>
17
18
19using namespace std;
20
21namespace thermalfist {
22
25 {
26 m_TAG = "ThermalModelIdeal";
27
28 m_Ensemble = GCE;
29 m_InteractionModel = Ideal;
30 }
31
35
37 m_FluctuationsCalculated = false;
38
39 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
40 m_densities[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::ParticleDensity, m_UseWidth, m_Chem[i]);
41 }
42
43 m_Calculated = true;
45 }
46
48 int NN = m_densities.size();
49 vector<double> tN(NN);
50 for (int i = 0; i < NN; ++i)
51 tN[i] = m_densities[i];
52
53 vector<double> chi2s(NN);
54 for (int i = 0; i < NN; ++i)
55 chi2s[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth, m_Chem[i]);
56
57 m_PrimCorrel.resize(NN);
58 for (int i = 0; i < NN; ++i) m_PrimCorrel[i].resize(NN);
59 m_dmusdmu = m_PrimCorrel;
60 m_TotalCorrel = m_PrimCorrel;
61
62 for (int i = 0; i < NN; ++i)
63 for (int j = 0; j < NN; ++j) {
64 m_PrimCorrel[i][j] = 0.;
65 if (i == j) m_PrimCorrel[i][j] += chi2s[i] * pow(xMath::GeVtoifm(), 3);
66 m_dmusdmu[i][j] = (i == j) ? 1. : 0.;
67 }
68
69 for (int i = 0; i < NN; ++i) {
70 m_wprim[i] = m_PrimCorrel[i][i];
71 if (m_densities[i] > 0.) m_wprim[i] *= m_Parameters.T / m_densities[i];
72 else m_wprim[i] = 1.;
73 }
74
75 }
76
77
84
85 for (size_t i = 0; i < m_wprim.size(); ++i) {
86 m_wprim[i] = ParticleScaledVariance(i);
87 m_skewprim[i] = ParticleSkewness(i);
88 m_kurtprim[i] = ParticleKurtosis(i);
89 }
90 for (size_t i = 0; i < m_wtot.size(); ++i) {
91 double tmp1 = 0., tmp2 = 0., tmp3 = 0., tmp4 = 0.;
92 tmp2 = m_densities[i] * m_wprim[i];
93 tmp3 = m_densities[i] * m_wprim[i] * m_skewprim[i];
94 tmp4 = m_densities[i] * m_wprim[i] * m_kurtprim[i];
95 const ThermalParticleSystem::DecayContributionsToParticle& decayContributions = m_TPS->DecayContributionsByFeeddown()[Feeddown::StabilityFlag][i];
96 for (size_t r = 0; r < decayContributions.size(); ++r) {
97 const ThermalParticleSystem::SingleDecayContribution& decayContrib = decayContributions[r];
98 const ThermalParticleSystem::SingleDecayCumulantsContribution& decayCumulantsSingle = m_TPS->DecayCumulants()[i][r];
99 tmp2 += m_densities[decayContrib.second] *
100 (m_wprim[decayContrib.second] * decayContrib.first * decayContrib.first
101 + decayCumulantsSingle.first[1]);
102
103 int rr = decayContrib.second;
104 double ni = decayContrib.first;
105 tmp3 += m_densities[rr] * m_wprim[rr] * (m_skewprim[rr] * ni * ni * ni + 3. * ni * decayCumulantsSingle.first[1]);
106 tmp3 += m_densities[rr] * decayCumulantsSingle.first[2];
107
108 tmp4 += m_densities[rr] * m_wprim[rr] * (m_kurtprim[rr] * ni * ni * ni * ni
109 + 6. * m_skewprim[rr] * ni * ni * decayCumulantsSingle.first[1]
110 + 3. * decayCumulantsSingle.first[1] * decayCumulantsSingle.first[1]
111 + 4. * ni * decayCumulantsSingle.first[2]);
112
113 tmp4 += m_densities[rr] * decayCumulantsSingle.first[3];
114 }
115
116
117 tmp1 = m_densitiestotal[i];
118
119 m_wtot[i] = tmp2 / tmp1;
120 m_skewtot[i] = tmp3 / tmp2;
121 m_kurttot[i] = tmp4 / tmp2;
122 }
123
124 m_FluctuationsCalculated = true;
125 }
126
127 std::vector<double> ThermalModelIdeal::CalculateChargeFluctuations(const std::vector<double>& chgs, int order)
128 {
129 return CalculateGeneralizedSusceptibilities(std::vector<std::vector<double>>(order, chgs));
130
131 // Deprecated
132 vector<double> ret(order + 1, 0.);
133
134 // chi1
135 for (size_t i = 0; i < m_densities.size(); ++i)
136 ret[0] += chgs[i] * m_densities[i];
137
138 ret[0] /= pow(m_Parameters.T * xMath::GeVtoifm(), 3);
139
140 if (order < 2) return ret;
141
142 for (size_t i = 0; i < m_densities.size(); ++i)
143 ret[1] += chgs[i] * chgs[i] * m_TPS->Particles()[i].chi(2, m_Parameters, m_UseWidth, m_Chem[i]);
144
145 if (order < 3) return ret;
146
147 for (size_t i = 0; i < m_densities.size(); ++i)
148 ret[2] += chgs[i] * chgs[i] * chgs[i] * m_TPS->Particles()[i].chi(3, m_Parameters, m_UseWidth, m_Chem[i]);
149
150 if (order < 4) return ret;
151
152 for (size_t i = 0; i < m_densities.size(); ++i)
153 ret[3] += chgs[i] * chgs[i] * chgs[i] * chgs[i] * m_TPS->Particles()[i].chi(4, m_Parameters, m_UseWidth, m_Chem[i]);
154
155 return ret;
156 }
157
158 std::vector<double> ThermalModelIdeal::CalculateGeneralizedSusceptibilities(const std::vector<std::vector<double>> &chgs) {
159 int order = chgs.size();
160
161 if (order > 4) {
162 throw std::invalid_argument("Order must be less than or equal to 4");
163 }
164
165 vector<double> ret(order + 1, 0.);
166 vector<double> current_charges(m_densities.size(), 1.);
167
168 for(int iord = 0; iord < order; ++iord) {
169 for(size_t i = 0; i < m_densities.size(); ++i) {
170 current_charges[i] *= chgs[iord][i];
171 ret[iord] += current_charges[i] * m_TPS->Particles()[i].chi(iord + 1, m_Parameters, m_UseWidth, m_Chem[i]);//m_densities[i];
172 }
173 }
174
175 return ret;
176 }
177
179 double ret = 0.;
180
181 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EnergyDensity, m_UseWidth, m_Chem[i]);
182
183 return ret;
184 }
185
187 double ret = 0.;
188
189 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EntropyDensity, m_UseWidth, m_Chem[i]);
190
191 return ret;
192 }
193
195 double ret = 0.;
196 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
197 if (m_TPS->Particles()[i].BaryonCharge() != 0)
198 ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EntropyDensity, m_UseWidth, m_Chem[i]);
199 return ret;
200 }
201
203 double ret = 0.;
204 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
205 if (m_TPS->Particles()[i].BaryonCharge() == 0)
206 ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EntropyDensity, m_UseWidth, m_Chem[i]);
207 return ret;
208 }
209
211 double ret = 0.;
212
213 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::Pressure, m_UseWidth, m_Chem[i]);
214
215 return ret;
216 }
217
219 if (!IsTemperatureDerivativesCalculated())
221
222 // Compute de/dT
223 double ret = 0.;
224
225 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
226 ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::dedT, m_UseWidth, m_Chem[i]);
227
228 return ret;
229 }
230
232 return m_TPS->Particles()[part].ScaledVariance(m_Parameters, m_UseWidth, m_Chem[part]);
233 }
234
236 return m_TPS->Particles()[part].Skewness(m_Parameters, m_UseWidth, m_Chem[part]);
237 }
238
240 return m_TPS->Particles()[part].Kurtosis(m_Parameters, m_UseWidth, m_Chem[part]);
241 }
242
244 return m_TPS->Particles()[part].Density(m_Parameters, IdealGasFunctions::ScalarDensity, m_UseWidth, m_Chem[part]);
245 }
246
248 int N = m_TPS->ComponentsNumber();
249 m_dndT = vector<double>(N, 0.);
250 m_dmusdT = vector<double>(N, 0.);
251 m_PrimChi2sdT = vector<vector<double>>(N, vector<double>(N, 0.));
252
253 for (int i = 0; i < N; ++i) {
254 m_dndT[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::dndT, m_UseWidth, m_Chem[i]);
255 m_dmusdT[i] = 0.;
256 m_PrimChi2sdT[i][i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::dchi2dT, m_UseWidth, m_Chem[i]);
257 }
258
259 m_TemperatureDerivativesCalculated = true;
260
261 if (IsSusceptibilitiesCalculated())
263 }
264
265
266} // namespace thermalfist
map< string, double > params
virtual void CalculateSusceptibilityMatrix()
Calculates the conserved charges susceptibility matrix.
virtual void CalculateParticleChargeCorrelationMatrix()
Calculates the matrix of correlators between primordial (and also final) particle numbers and conserv...
virtual void ValidateCalculation()
Checks whether issues have occured during the calculation of particle densities in the CalculateDensi...
virtual void CalculateProxySusceptibilityMatrix()
Calculates the susceptibility matrix of conserved charges proxies.
ThermalModelBase(ThermalParticleSystem *TPS, const ThermalModelParameters &params=ThermalModelParameters())
Construct a new ThermalModelBase object.
@ GCE
Grand canonical ensemble.
virtual void CalculateTwoParticleFluctuationsDecays()
Computes particle number correlations and fluctuations for all final-state particles which are marked...
virtual void CalculatePrimordialDensities()
Calculates the primordial densities of all species.
virtual double ParticleScaledVariance(int part)
virtual std::vector< double > CalculateChargeFluctuations(const std::vector< double > &chgs, int order=4)
Calculates fluctuations (diagonal susceptibilities) of an arbitrary "conserved" charge.
virtual double ParticleKurtosis(int part)
ThermalModelIdeal(ThermalParticleSystem *TPS, const ThermalModelParameters &params=ThermalModelParameters())
Construct a new ThermalModelIdeal object.
virtual void CalculateTwoParticleCorrelations()
Computes the fluctuations and correlations of the primordial particle numbers.
virtual void CalculateFluctuations()
Computes the fluctuation observables.
virtual double CalculateMesonMatterEntropyDensity()
virtual double CalculateEnergyDensityDerivativeT()
virtual ~ThermalModelIdeal(void)
Destroy the ThermalModelIdeal object.
virtual std::vector< double > CalculateGeneralizedSusceptibilities(const std::vector< std::vector< double > > &chgs)
virtual double CalculateBaryonMatterEntropyDensity()
virtual double ParticleScalarDensity(int part)
virtual double ParticleSkewness(int part)
virtual void CalculateTemperatureDerivatives()
Computes the temperature derivatives of densities, shifted chemical potentials, and primordial hadron...
Class containing the particle list.
std::vector< SingleDecayContribution > DecayContributionsToParticle
A vector of SingleDecayContribution where each element corresponds to a certain resonance species.
std::pair< double, int > SingleDecayContribution
std::pair< std::vector< double >, int > SingleDecayCumulantsContribution
constexpr double GeVtoifm()
A constant to transform GeV into fm .
Definition xMath.h:25
The main namespace where all classes and functions of the Thermal-FIST library reside.
Definition CosmicEoS.h:9
@ StabilityFlag
Feeddown from all particles marked as unstable.
Structure containing all thermal parameters of the model.