Thermal-FIST 1.6
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#include "HRGBase/xMath.h"
10
11#ifdef USE_OPENMP
12#include <omp.h>
13#endif
14
15#include <iostream>
16#include <cmath>
17#include <cassert>
18
19
20using namespace std;
21
22namespace thermalfist {
23
26 {
27 m_TAG = "ThermalModelIdeal";
28
29 m_Ensemble = GCE;
30 m_InteractionModel = Ideal;
31 }
32
36
38 m_FluctuationsCalculated = false;
39
40 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
41 m_densities[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::ParticleDensity, m_UseWidth, m_Chem[i]);
42 }
43
44 m_Calculated = true;
46 }
47
49 int NN = m_densities.size();
50 vector<double> tN(NN);
51 for (int i = 0; i < NN; ++i)
52 tN[i] = m_densities[i];
53
54 vector<double> chi2s(NN);
55 for (int i = 0; i < NN; ++i)
56 chi2s[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth, m_Chem[i]);
57
58 m_PrimCorrel.resize(NN);
59 for (int i = 0; i < NN; ++i) m_PrimCorrel[i].resize(NN);
60 m_dmusdmu = m_PrimCorrel;
61 m_TotalCorrel = m_PrimCorrel;
62
63 for (int i = 0; i < NN; ++i)
64 for (int j = 0; j < NN; ++j) {
65 m_PrimCorrel[i][j] = 0.;
66 if (i == j) m_PrimCorrel[i][j] += chi2s[i] * pow(xMath::GeVtoifm(), 3);
67 m_dmusdmu[i][j] = (i == j) ? 1. : 0.;
68 }
69
70 for (int i = 0; i < NN; ++i) {
71 m_wprim[i] = m_PrimCorrel[i][i];
72 if (m_densities[i] > 0.) m_wprim[i] *= m_Parameters.T / m_densities[i];
73 else m_wprim[i] = 1.;
74 if (m_wprim[i] != m_wprim[i]) m_wprim[i] = 1.;
75 }
76
77 m_TwoParticleCorrelationsCalculated = true;
78 }
79
80
87
88 for (size_t i = 0; i < m_wprim.size(); ++i) {
89 m_wprim[i] = ParticleScaledVariance(i);
90 m_skewprim[i] = ParticleSkewness(i);
91 m_kurtprim[i] = ParticleKurtosis(i);
92 }
93 for (size_t i = 0; i < m_wtot.size(); ++i) {
94 double tmp1 = 0., tmp2 = 0., tmp3 = 0., tmp4 = 0.;
95 tmp2 = m_densities[i] * m_wprim[i];
96 tmp3 = m_densities[i] * m_wprim[i] * m_skewprim[i];
97 tmp4 = m_densities[i] * m_wprim[i] * m_kurtprim[i];
98 const ThermalParticleSystem::DecayContributionsToParticle& decayContributions = m_TPS->DecayContributionsByFeeddown()[Feeddown::StabilityFlag][i];
99 for (size_t r = 0; r < decayContributions.size(); ++r) {
100 const ThermalParticleSystem::SingleDecayContribution& decayContrib = decayContributions[r];
101 const ThermalParticleSystem::SingleDecayCumulantsContribution& decayCumulantsSingle = m_TPS->DecayCumulants()[i][r];
102 tmp2 += m_densities[decayContrib.second] *
103 (m_wprim[decayContrib.second] * decayContrib.first * decayContrib.first
104 + decayCumulantsSingle.first[1]);
105
106 int rr = decayContrib.second;
107 double ni = decayContrib.first;
108 tmp3 += m_densities[rr] * m_wprim[rr] * (m_skewprim[rr] * ni * ni * ni + 3. * ni * decayCumulantsSingle.first[1]);
109 tmp3 += m_densities[rr] * decayCumulantsSingle.first[2];
110
111 tmp4 += m_densities[rr] * m_wprim[rr] * (m_kurtprim[rr] * ni * ni * ni * ni
112 + 6. * m_skewprim[rr] * ni * ni * decayCumulantsSingle.first[1]
113 + 3. * decayCumulantsSingle.first[1] * decayCumulantsSingle.first[1]
114 + 4. * ni * decayCumulantsSingle.first[2]);
115
116 tmp4 += m_densities[rr] * decayCumulantsSingle.first[3];
117 }
118
119
120 tmp1 = m_densitiestotal[i];
121
122 if (tmp1 > 0.)
123 m_wtot[i] = tmp2 / tmp1;
124 else
125 m_wtot[i] = 1.;
126
127 if (tmp2 > 0.) {
128 m_skewtot[i] = tmp3 / tmp2;
129 m_kurttot[i] = tmp4 / tmp2;
130 }
131 else {
132 m_skewtot[i] = 1.;
133 m_kurttot[i] = 1.;
134 }
135 }
136
137 m_FluctuationsCalculated = true;
138 }
139
140 std::vector<double> ThermalModelIdeal::CalculateChargeFluctuations(const std::vector<double>& chgs, int order, bool dimensionfull)
141 {
142 if (!dimensionfull)
143 return CalculateGeneralizedSusceptibilities(std::vector<std::vector<double>>(order, chgs));
144
145 // Dimensionfull: d^n P / dmu^n, using chiDimensionfull which works at T=0
146 vector<double> ret(order + 1, 0.);
147 vector<double> current_charges(m_densities.size(), 1.);
148
149 for(int iord = 0; iord < order; ++iord) {
150 for(size_t i = 0; i < m_densities.size(); ++i) {
151 current_charges[i] *= chgs[i];
152 ret[iord] += current_charges[i] * m_TPS->Particles()[i].chiDimensionfull(iord + 1, m_Parameters, m_UseWidth, m_Chem[i]);
153 }
154 }
155
156 return ret;
157 }
158
159 std::vector<double> ThermalModelIdeal::CalculateGeneralizedSusceptibilities(const std::vector<std::vector<double>> &chgs) {
160 int order = chgs.size();
161
162 if (order > 4) {
163 throw std::invalid_argument("Order must be less than or equal to 4");
164 }
165
166 vector<double> ret(order + 1, 0.);
167 vector<double> current_charges(m_densities.size(), 1.);
168
169 for(int iord = 0; iord < order; ++iord) {
170 for(size_t i = 0; i < m_densities.size(); ++i) {
171 current_charges[i] *= chgs[iord][i];
172 ret[iord] += current_charges[i] * m_TPS->Particles()[i].chi(iord + 1, m_Parameters, m_UseWidth, m_Chem[i]);//m_densities[i];
173 }
174 }
175
176 return ret;
177 }
178
180 double ret = 0.;
181
182 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EnergyDensity, m_UseWidth, m_Chem[i]);
183
184 return ret;
185 }
186
188 double ret = 0.;
189
190 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EntropyDensity, m_UseWidth, m_Chem[i]);
191
192 return ret;
193 }
194
196 double ret = 0.;
197 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
198 if (m_TPS->Particles()[i].BaryonCharge() != 0)
199 ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EntropyDensity, m_UseWidth, m_Chem[i]);
200 return ret;
201 }
202
204 double ret = 0.;
205 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
206 if (m_TPS->Particles()[i].BaryonCharge() == 0)
207 ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EntropyDensity, m_UseWidth, m_Chem[i]);
208 return ret;
209 }
210
212 double ret = 0.;
213
214 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::Pressure, m_UseWidth, m_Chem[i]);
215
216 return ret;
217 }
218
220 if (!IsTemperatureDerivativesCalculated())
222
223 // Compute de/dT
224 double ret = 0.;
225
226 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
227 ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::dedT, m_UseWidth, m_Chem[i]);
228
229 return ret;
230 }
231
233 if (!IsTemperatureDerivativesCalculated())
235
236 // Compute ds/dT
237 double ret = 0.;
238
239 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
240 ret += m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::dsdT, m_UseWidth, m_Chem[i]);
241
242 return ret;
243 }
244
246 return m_TPS->Particles()[part].ScaledVariance(m_Parameters, m_UseWidth, m_Chem[part]);
247 }
248
250 return m_TPS->Particles()[part].Skewness(m_Parameters, m_UseWidth, m_Chem[part]);
251 }
252
254 return m_TPS->Particles()[part].Kurtosis(m_Parameters, m_UseWidth, m_Chem[part]);
255 }
256
258 return m_TPS->Particles()[part].Density(m_Parameters, IdealGasFunctions::ScalarDensity, m_UseWidth, m_Chem[part]);
259 }
260
262 int N = m_TPS->ComponentsNumber();
263 m_dndT = vector<double>(N, 0.);
264 m_dmusdT = vector<double>(N, 0.);
265 m_PrimChi2sdT = vector<vector<double>>(N, vector<double>(N, 0.));
266
267 for (int i = 0; i < N; ++i) {
268 m_dndT[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::dndT, m_UseWidth, m_Chem[i]);
269 m_dmusdT[i] = 0.;
270 m_PrimChi2sdT[i][i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::dchi2dT, m_UseWidth, m_Chem[i]);
271 }
272
273 m_TemperatureDerivativesCalculated = true;
274
275 if (IsSusceptibilitiesCalculated())
277 }
278
279
280} // 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 double ParticleKurtosis(int part)
virtual double CalculateEntropyDensityDerivativeT()
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 std::vector< double > CalculateChargeFluctuations(const std::vector< double > &chgs, int order=4, bool dimensionfull=false)
Calculates fluctuations (diagonal susceptibilities) of an arbitrary "conserved" charge.
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.
Contains some extra mathematical functions used in the code.