Thermal-FIST 1.6.1
Package for hadron resonance gas model applications
Loading...
Searching...
No Matches
ThermalModelCanonicalCharm.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_CharmValues.resize(0);
26 m_CharmValues.push_back(0);
27 m_CharmValues.push_back(1);
28 m_CharmValues.push_back(-1);
29
30 m_CharmMap.clear();
31 for (unsigned int i = 0; i < m_CharmValues.size(); ++i) m_CharmMap[m_CharmValues[i]] = i;
32
33 m_Parameters.muC = 0.;
34
35 m_xi0 = 0.0;
36
37 m_TAG = "ThermalModelCanonicalCharm";
38
39 m_Ensemble = CCE;
40 m_InteractionModel = Ideal;
41
42 }
43
47
48
53
55 {
56 m_Parameters.muC = 0.0;
57 }
58
61 m_densitiesGCE.resize(m_TPS->Particles().size());
62 }
63
65 m_QuantumStats = stats;
66 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i)
67 if (m_TPS->Particles()[i].Charm() == 0) m_TPS->Particle(i).UseStatistics(stats);
68 else m_TPS->Particle(i).UseStatistics(false);
69 }
70
72 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
73 m_densitiesGCE[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::ParticleDensity, m_UseWidth, m_Chem[i]);
74 }
75 m_GCECalculated = true;
76 }
77
79 m_energydensitiesGCE.resize(m_densitiesGCE.size());
80 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
81 m_energydensitiesGCE[i] = m_TPS->Particles()[i].Density(m_Parameters, IdealGasFunctions::EnergyDensity, m_UseWidth, m_Chem[i]);
82 }
83 }
84
86 {
87 m_ConstrainMuC = false;
89 }
90
92 assert(m_IGFExtraConfig.MagneticField.B == 0.); // No magnetic field supported currently
93
95 throw std::runtime_error("ThermalModelCanonicalCharm::CalculatePrimordialDensities(): PCE not supported!");
96 }
97
98
99 m_FluctuationsCalculated = false;
100 m_energydensitiesGCE.resize(0);
101
103
104 // Validate: multi-charmed particles not supported in this model
105 for (int j = 0; j < m_TPS->ComponentsNumber(); ++j) {
106 if (abs(m_TPS->Particles()[j].Charm()) > 1)
107 throw std::runtime_error("ThermalModelCanonicalCharm::CalculatePrimordialDensities(): Charm particles with absolute charge > 1 not supported! Use ThermalModelCanonical instead.");
108 }
109
110 m_Zsum.resize(m_CharmValues.size());
111
112 m_partialZ.resize(m_CharmValues.size());
113 vector<double> xi(1, 0.), yi(1, 0.);
114
115 for (size_t i = 0; i < m_CharmValues.size(); ++i) {
116 m_partialZ[i] = 0.;
117 for (int j = 0; j < m_TPS->ComponentsNumber(); ++j) {
118 if (m_CharmValues[i] == m_TPS->Particles()[j].Charm()) m_partialZ[i] += m_densitiesGCE[j] * m_Parameters.SVc;
119 }
120 if (m_partialZ[i] < 1.e-10) m_partialZ[i] += 1e-10;
121 }
122
123
124 for (int i = 0; i < 1; ++i) {
125 xi[i] = 2. * sqrt(m_partialZ[m_CharmMap[i + 1]] * m_partialZ[m_CharmMap[-(i + 1)]]);
126 yi[i] = sqrt(m_partialZ[m_CharmMap[i + 1]] / m_partialZ[m_CharmMap[-(i + 1)]]);
127 }
128 m_xi0 = xi[0];
129
130 // Use exponentially-scaled Bessel functions to avoid overflow for large xi.
131 // BesselIexp(n, x) = I_n(x) * exp(-|x|), so the exp(x) factor cancels in
132 // the ratio m_Zsum[i]/m_Zsum[0] used below.
133 for (size_t i = 0; i < m_CharmValues.size(); ++i) {
134 m_Zsum[i] = xMath::BesselIexp(abs(m_CharmValues[i]), xi[0]) * pow(yi[0], m_CharmValues[i]);
135 }
136
137 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
138 if (m_CharmMap.count(-m_TPS->Particles()[i].Charm())) m_densities[i] = (m_Zsum[m_CharmMap[-m_TPS->Particles()[i].Charm()]] / m_Zsum[m_CharmMap[0]]) * m_densitiesGCE[i];
139 }
140
141 m_Calculated = true;
143 }
144
146 m_wprim.resize(m_densities.size());
147 m_wtot.resize(m_densities.size());
148 for (size_t i = 0; i < m_wprim.size(); ++i) {
149 m_wprim[i] = 1.;
150 m_wtot[i] = 1.;
151 m_skewprim[i] = 1.;
152 m_skewtot[i] = 1.;
153 }
154 }
155
157 if (!m_Calculated) CalculateDensities();
158 if (m_energydensitiesGCE.size() == 0) CalculateEnergyDensitiesGCE();
159 double ret = 0.;
160 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += (m_Zsum[m_CharmMap[-m_TPS->Particles()[i].Charm()]] / m_Zsum[m_CharmMap[0]]) * m_energydensitiesGCE[i];
161 return ret;
162 }
163
165 // m_Zsum stores BesselIexp values (scaled by exp(-xi)), so
166 // log(Z_0) = log(BesselI(0,xi)) = log(BesselIexp(0,xi)) + xi
167 double ret = m_partialZ[0] + log(m_Zsum[m_CharmMap[0]]) + m_xi0;
168 if (m_energydensitiesGCE.size() == 0) CalculateEnergyDensitiesGCE();
169 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) if (m_CharmMap.count(-m_TPS->Particles()[i].Charm())) ret += (m_Zsum[m_CharmMap[-m_TPS->Particles()[i].Charm()]] / m_Zsum[m_CharmMap[0]]) * ((m_energydensitiesGCE[i] - (m_Parameters.muB * m_TPS->Particles()[i].BaryonCharge() + m_Parameters.muQ * m_TPS->Particles()[i].ElectricCharge() + m_Parameters.muS * m_TPS->Particles()[i].Strangeness()) * m_densitiesGCE[i]) / m_Parameters.T);
170 return ret;
171 }
172
173
175 double ret = 0.;
176 for (int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += (m_Zsum[m_CharmMap[-m_TPS->Particles()[i].Charm()]] / m_Zsum[m_CharmMap[0]]) * m_Parameters.T * m_densitiesGCE[i];
177 return ret;
178 }
179
183
184} // 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.
@ CCE
Charm-canonical ensemble.
virtual void SetParameters(const ThermalModelParameters &params)
The thermal parameters.
void CalculateEnergyDensitiesGCE()
Calculates the grand-canonical energy densities.
virtual void FixParameters()
Method which actually implements ConstrainChemicalPotentials() (for backward compatibility).
virtual void CalculatePrimordialDensities()
Calculates the primordial densities of all species.
void CalculateDensitiesGCE()
Calculates the particle densities in a grand-canonical ensemble.
virtual void SetCharmChemicalPotential(double muC)
Override the base class method to always set to zero.
ThermalModelCanonicalCharm(ThermalParticleSystem *TPS, const ThermalModelParameters &params=ThermalModelParameters())
Construct a new ThermalModelCanonicalCharm object.
virtual void ChangeTPS(ThermalParticleSystem *TPS)
Change the particle list.
void CalculateFluctuations()
Dummy function. Fluctuations not yet supported.
virtual ~ThermalModelCanonicalCharm(void)
Destroy the ThermalModelCanonicalCharm object.
virtual bool IsConservedChargeCanonical(ConservedCharge::Name charge) const
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.