30 m_FeeddownCalculated(false),
31 m_FluctuationsCalculated(false),
32 m_TemperatureDerivativesCalculated(false),
33 m_GCECalculated(false),
46 m_Chem.resize(m_TPS->Particles().size());
48 m_densities.resize(m_TPS->Particles().size());
49 m_densitiestotal.resize(m_TPS->Particles().size());
52 m_wprim.resize(m_TPS->Particles().size());
53 m_wtot.resize(m_TPS->Particles().size());
54 m_skewprim.resize(m_TPS->Particles().size());
55 m_skewtot.resize(m_TPS->Particles().size());
56 m_kurtprim.resize(m_TPS->Particles().size());
57 m_kurttot.resize(m_TPS->Particles().size());
59 m_ConstrainMuB =
false;
60 m_ConstrainMuC = m_ConstrainMuQ = m_ConstrainMuS =
true;
63 for (
int i = 0; i < 4; ++i) m_Susc[i].resize(4);
68 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
70 for (
size_t j = 0; j < tpart.
Decays().size(); ++j) {
76 m_PrimCorrel = std::vector< std::vector<double> >(TPS()->ComponentsNumber(), std::vector<double>(TPS()->
ComponentsNumber(), 0.));
77 m_TotalCorrel = std::vector< std::vector<double> >(TPS()->ComponentsNumber(), std::vector<double>(TPS()->
ComponentsNumber(), 0.));
78 m_PrimChargesCorrel = std::vector< std::vector<double> >(TPS()->ComponentsNumber(), std::vector<double>(4, 0.));
79 m_FinalChargesCorrel = std::vector< std::vector<double> >(TPS()->ComponentsNumber(), std::vector<double>(4, 0.));
82 m_InteractionModel =
Ideal;
86 SetUseWidth(TPS()->ResonanceWidthIntegrationType());
88 ResetCalculatedFlags();
107 m_UseWidth = useWidth;
113 m_TPS->SetResonanceWidthIntegrationType(type);
118 if (normBratio != m_NormBratio) {
119 m_NormBratio = normBratio;
121 m_TPS->NormalizeBranchingRatios();
124 m_TPS->RestoreBranchingRatios();
130 void ThermalModelBase::ResetChemicalPotentials() {
131 m_Parameters.muS = m_Parameters.muB / 5.;
132 m_Parameters.muQ = -m_Parameters.muB / 50.;
133 m_Parameters.muC = 0.;
139 m_Volume = m_Parameters.V;
140 ResetCalculatedFlags();
146 ResetCalculatedFlags();
151 m_Parameters.muB = muB;
153 ResetCalculatedFlags();
158 m_Parameters.muQ = muQ;
160 ResetCalculatedFlags();
165 m_Parameters.muS = muS;
167 ResetCalculatedFlags();
172 m_Parameters.muC = muC;
174 ResetCalculatedFlags();
179 m_Parameters.gammaS = gammaS;
180 ResetCalculatedFlags();
185 m_Parameters.gammaC = gammaC;
186 ResetCalculatedFlags();
192 ResetCalculatedFlags();
198 ResetCalculatedFlags();
204 ResetCalculatedFlags();
210 ResetCalculatedFlags();
215 for (
int i = 0; i < TPS()->ComponentsNumber(); ++i) {
216 for (
int j = 0; j < TPS()->ComponentsNumber(); ++j) {
227 for (
int i = 0; i < TPS()->ComponentsNumber(); ++i) {
228 for (
int j = 0; j < TPS()->ComponentsNumber(); ++j) {
239 for (
int i = 0; i < TPS()->ComponentsNumber(); ++i) {
240 for (
int j = 0; j < TPS()->ComponentsNumber(); ++j) {
252 for (
int i = 0; i < TPS()->ComponentsNumber(); ++i) {
253 for (
int j = 0; j < TPS()->ComponentsNumber(); ++j) {
265 for (
int i = 0; i < TPS()->ComponentsNumber(); ++i) {
266 for (
int j = 0; j < TPS()->ComponentsNumber(); ++j) {
278 for (
int i = 0; i < TPS()->ComponentsNumber(); ++i) {
279 for (
int j = 0; j < TPS()->ComponentsNumber(); ++j) {
291 for (
int i = 0; i < TPS()->ComponentsNumber(); ++i) {
292 for (
int j = 0; j < TPS()->ComponentsNumber(); ++j) {
304 for (
int i = 0; i < TPS()->ComponentsNumber(); ++i) {
305 for (
int j = 0; j < TPS()->ComponentsNumber(); ++j) {
317 m_Parameters.gammaq = gammaq;
318 ResetCalculatedFlags();
324 m_Chem.resize(m_TPS->Particles().size());
325 m_densities.resize(m_TPS->Particles().size());
326 m_densitiestotal.resize(m_TPS->Particles().size());
328 m_wprim.resize(m_TPS->Particles().size());
329 m_wtot.resize(m_TPS->Particles().size());
330 m_skewprim.resize(m_TPS->Particles().size());
331 m_skewtot.resize(m_TPS->Particles().size());
332 m_kurtprim.resize(m_TPS->Particles().size());
333 m_kurttot.resize(m_TPS->Particles().size());
334 m_PrimCorrel = std::vector< std::vector<double> >(TPS()->ComponentsNumber(), std::vector<double>(TPS()->
ComponentsNumber(), 0.));
335 m_TotalCorrel = std::vector< std::vector<double> >(TPS()->ComponentsNumber(), std::vector<double>(TPS()->
ComponentsNumber(), 0.));
336 m_PrimChargesCorrel = std::vector< std::vector<double> >(TPS()->ComponentsNumber(), std::vector<double>(4, 0.));
337 m_FinalChargesCorrel = std::vector< std::vector<double> >(TPS()->ComponentsNumber(), std::vector<double>(4, 0.));
338 ResetCalculatedFlags();
342 m_QuantumStats = stats;
343 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
344 m_TPS->Particle(i).UseStatistics(stats);
350 std::cerr <<
"**WARNING** ThermalModelBase::SetResonanceWidthIntegrationType: Using resonance widths is switched off!" << std::endl;
354 m_TPS->SetResonanceWidthIntegrationType(type);
358 m_Chem.resize(m_TPS->Particles().size());
359 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
360 m_Chem[i] = m_TPS->Particles()[i].BaryonCharge() * m_Parameters.muB + m_TPS->Particles()[i].Strangeness() * m_Parameters.muS + m_TPS->Particles()[i].ElectricCharge() * m_Parameters.muQ + m_TPS->Particles()[i].Charm() * m_Parameters.muC;
365 if (chem.size() != m_TPS->Particles().size()) {
366 std::cerr <<
"**WARNING** " << m_TAG <<
"::SetChemicalPotentials(const std::vector<double> & chem): size of chem does not match number of hadrons in the list" << std::endl;
374 if (i < 0 || i >=
static_cast<int>(m_Chem.size())) {
375 throw std::out_of_range(
"ThermalModelBase::ChemicalPotential: i is out of bounds!");
382 if (i < 0 || i >=
static_cast<int>(m_Chem.size())) {
383 throw std::out_of_range(
"ThermalModelBase::SetChemicalPotential: i is out of bounds!");
390 if (i < 0 || i >=
static_cast<int>(m_Chem.size())) {
391 throw std::out_of_range(
"ThermalModelBase::FullIdealChemicalPotential: i is out of bounds!");
400 if (!(m_Parameters.gammaq == 1.)) ret += log(m_Parameters.gammaq) * part.
AbsoluteQuark() * m_Parameters.T;
402 if (!(m_Parameters.gammaC == 1. || part.
AbsoluteCharm() == 0.)) ret += log(m_Parameters.gammaC) * part.
AbsoluteCharm() * m_Parameters.T;
409 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
410 m_TPS->Particle(i).CalculateThermalBranchingRatios(m_Parameters, m_UseWidth, m_Chem[i] + MuShift(i));
412 m_TPS->ProcessDecays();
420 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
421 m_densitiestotal[i] = m_densities[i];
424 for (
size_t j = 0; j < decayContributions.size(); ++j)
425 if (i != decayContributions[j].second)
426 m_densitiestotal[i] += decayContributions[j].first * m_densities[decayContributions[j].second];
429 m_densitiesbyfeeddown[feed_index] = m_densitiestotal;
433 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
434 m_densitiesbyfeeddown[feed_index][i] = m_densities[i];
437 for (
size_t j = 0; j < decayContributions.size(); ++j)
438 if (i != decayContributions[j].second)
439 m_densitiesbyfeeddown[feed_index][i] += decayContributions[j].first * m_densities[decayContributions[j].second];
443 m_FeeddownCalculated =
true;
449 if (resetInitialValues)
456 if (fabs(m_Parameters.muB) < 1e-6 && !m_ConstrainMuB) {
458 m_Parameters.muS = 0.;
460 m_Parameters.muQ = 0.;
462 m_Parameters.muC = 0.;
467 if (m_ConstrainMuB) {
471 if (m_Parameters.muB > 0.150) suppr = 8.;
472 if (m_Parameters.muB > 0.300) suppr = 7.;
473 if (m_Parameters.muB > 0.450) suppr = 6.;
474 if (m_Parameters.muB > 0.600) suppr = 6.;
475 if (m_Parameters.muB > 0.750) suppr = 5.;
476 if (m_Parameters.muB > 0.900) suppr = 4.;
477 if (m_Parameters.muB > 1.000) suppr = 3.;
479 m_Parameters.muS = m_Parameters.muB / suppr;
481 m_Parameters.muQ = -m_Parameters.muB / suppr / 10.;
483 m_Parameters.muC = -m_Parameters.muS;
489 if (fabs(m_Parameters.muB) < 1e-6 && !m_ConstrainMuB) {
491 m_Parameters.muS = 0.;
493 m_Parameters.muQ = 0.;
495 m_Parameters.muC = 0.;
502 m_ConstrainMuB &= m_TPS->hasBaryons();
503 m_ConstrainMuQ &= (m_TPS->hasCharged() && m_TPS->hasBaryons());
504 m_ConstrainMuS &= m_TPS->hasStrange();
505 m_ConstrainMuC &= m_TPS->hasCharmed();
507 vector<double> x22(4);
508 x22[0] = m_Parameters.muB;
509 x22[1] = m_Parameters.muQ;
510 x22[2] = m_Parameters.muS;
511 x22[3] = m_Parameters.muC;
512 vector<double> x2(4), xinit(4);
513 xinit[0] = x2[0] = m_Parameters.muB;
514 xinit[1] = x2[1] = m_Parameters.muQ;
515 xinit[2] = x2[2] = m_Parameters.muS;
516 xinit[3] = x2[3] = m_Parameters.muC;
517 int iter = 0, iterMAX = 2;
518 while (iter < iterMAX) {
519 BroydenEquationsChem eqs(
this);
520 BroydenJacobianChem jaco(
this);
521 BroydenChem broydn(
this, &eqs, &jaco);
523 broydn.Solve(x22, &crit);
530 double muBinit,
double muQinit,
double muSinit,
double muCinit,
531 bool ConstrMuB,
bool ConstrMuQ,
bool ConstrMuS,
bool ConstrMuC) {
534 V * rhoB, V * rhoQ, V * rhoS, V * rhoC,
535 muBinit, muQinit, muSinit, muCinit,
536 ConstrMuB, ConstrMuQ, ConstrMuS, ConstrMuC);
540 double muBinit,
double muQinit,
double muSinit,
double muCinit,
541 bool ConstrMuB,
bool ConstrMuQ,
bool ConstrMuS,
bool ConstrMuC) {
543 std::cerr <<
"**WARNING** PCE enabled, cannot assume chemical equilibrium to do optimization..." << std::endl;
558 m_Parameters.muB = muBinit;
560 m_Parameters.muS = muSinit;
562 m_Parameters.muQ = muQinit;
564 m_Parameters.muC = muCinit;
566 allzero &= (totB == 0.0 && ConstrMuB) || (muBinit == 0 && !ConstrMuB);
567 allzero &= (totQ == 0.0 && ConstrMuQ) || (muQinit == 0 && !ConstrMuQ);
568 allzero &= (totS == 0.0 && ConstrMuS) || (muSinit == 0 && !ConstrMuS);
569 allzero &= (totC == 0.0 && ConstrMuC) || (muCinit == 0 && !ConstrMuC);
573 m_Parameters.muB = 0.;
574 m_Parameters.muS = 0.;
575 m_Parameters.muQ = 0.;
576 m_Parameters.muC = 0.;
581 vector<int> vConstr(4, 1);
582 vector<int> vType(4, 0);
585 vConstr[0] = m_TPS->hasBaryons() && ConstrMuB;
586 vConstr[1] = m_TPS->hasCharged() && ConstrMuQ;
587 vConstr[2] = m_TPS->hasStrange() && ConstrMuS;
588 vConstr[3] = m_TPS->hasCharmed() && ConstrMuC;
590 vType[0] = (int)(totB == 0.0);
591 vType[1] = (int)(totQ == 0.0);
592 vType[2] = (int)(totS == 0.0);
593 vType[3] = (int)(totC == 0.0);
595 vector<double> vTotals(4);
601 vector<double> xin(4, 0.);
607 vector<double> xinactual;
608 for (
int i = 0; i < 4; ++i) {
610 xinactual.push_back(xin[i]);
614 BroydenEquationsChemTotals eqs(vConstr, vType, vTotals,
this);
615 BroydenJacobianChemTotals jaco(vConstr, vType, vTotals,
this);
618 broydn.
Solve(xinactual, &crit);
639 m_LastCalculationSuccessFlag =
true;
640 for (
size_t i = 0; i < m_densities.size(); ++i) {
641 if (m_densities[i] != m_densities[i]) {
642 m_LastCalculationSuccessFlag =
false;
644 std::cerr <<
"**WARNING** Density for particle " << m_TPS->Particle(i).PdgId() <<
" (" << m_TPS->Particle(i).Name() <<
") is NaN!\n\n";
646 m_ValidityLog.append(cc);
654 std::cerr <<
"**WARNING** " << m_TAG <<
"::CalculateChargeFluctuations(const std::vector<double>& chgs, int order) not implemented!" << std::endl;
655 return std::vector<double>();
658 std::vector<double> ThermalModelBase::CalculateGeneralizedSusceptibilities(
const std::vector<std::vector<double>> &)
660 throw std::runtime_error(
"ThermalModelBase::CalculateGeneralizedSusceptibilities: not implemented!");
663 double ThermalModelBase::CalculateHadronDensity() {
666 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
667 ret += m_densities[i];
672 double ThermalModelBase::CalculateBaryonDensity() {
675 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
676 ret += m_TPS->Particles()[i].BaryonCharge() * m_densities[i];
681 double ThermalModelBase::CalculateChargeDensity() {
684 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
685 ret += m_TPS->Particles()[i].ElectricCharge() * m_densities[i];
690 double ThermalModelBase::CalculateStrangenessDensity() {
693 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
694 ret += m_TPS->Particles()[i].Strangeness() * m_densities[i];
699 double ThermalModelBase::CalculateCharmDensity() {
702 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
703 ret += m_TPS->Particles()[i].Charm() * m_densities[i];
707 double ThermalModelBase::CalculateAbsoluteBaryonDensity() {
710 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
711 ret += fabs((
double)m_TPS->Particles()[i].BaryonCharge()) * m_densities[i];
715 double ThermalModelBase::CalculateAbsoluteChargeDensity() {
718 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
719 ret += fabs((
double)m_TPS->Particles()[i].ElectricCharge()) * m_densities[i];
723 double ThermalModelBase::CalculateAbsoluteStrangenessDensity() {
726 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
727 ret += m_TPS->Particles()[i].AbsoluteStrangeness() * m_densities[i];
731 double ThermalModelBase::CalculateAbsoluteStrangenessDensityModulo() {
734 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
735 ret += fabs((
double)m_TPS->Particles()[i].Strangeness()) * m_densities[i];
739 double ThermalModelBase::CalculateAbsoluteCharmDensity() {
742 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
743 ret += m_TPS->Particles()[i].AbsoluteCharm() * m_densities[i];
747 double ThermalModelBase::CalculateAbsoluteCharmDensityModulo() {
750 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
751 ret += fabs((
double)m_TPS->Particles()[i].Charm()) * m_densities[i];
755 double ThermalModelBase::CalculateArbitraryChargeDensity() {
758 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
759 ret += m_TPS->Particles()[i].ArbitraryCharge() * m_densities[i];
764 double ThermalModelBase::GetDensity(
long long PDGID,
const std::vector<double> *dens)
766 if (m_TPS->PdgToId(PDGID) != -1)
767 return dens->operator[](m_TPS->PdgToId(PDGID));
770 if (PDGID == 1)
return CalculateBaryonDensity();
773 if (PDGID == 310 || PDGID == 130)
774 if (m_TPS->PdgToId(311) != -1 && m_TPS->PdgToId(-311) != -1)
775 return (dens->operator[](m_TPS->PdgToId(311)) + dens->operator[](m_TPS->PdgToId(-311))) / 2.;
778 if (PDGID % 10 == 0) {
779 long long tpdgid = PDGID / 10;
780 if (m_TPS->PdgToId(tpdgid) != -1 && m_TPS->PdgToId(-tpdgid) != -1)
781 return dens->operator[](m_TPS->PdgToId(tpdgid)) + dens->operator[](m_TPS->PdgToId(-tpdgid));
785 if (PDGID == 22122112 && m_TPS->PdgToId(2212) != -1 && m_TPS->PdgToId(2112) != -1)
786 return dens->operator[](m_TPS->PdgToId(2212)) + dens->operator[](m_TPS->PdgToId(2112));
788 std::cerr <<
"**WARNING** " << m_TAG <<
": Density with PDG ID " << PDGID <<
" not found!" << std::endl;
793 double ThermalModelBase::GetDensity(
long long PDGID,
Feeddown::Type feeddown)
795 std::vector<double> *dens = NULL;
799 dens = &m_densitiestotal;
800 else if (
static_cast<size_t>(feeddown) < m_densitiesbyfeeddown.size())
801 dens = &m_densitiesbyfeeddown[
static_cast<int>(feeddown)];
803 std::cerr <<
"**WARNING** " << m_TAG <<
": GetDensity: Unknown feeddown: " <<
static_cast<int>(feeddown) << std::endl;
813 double ret = GetDensity(PDGID, dens);
819 ret += 2. * 0.308 * GetDensity(310, dens);
822 if (PDGID == 211 || PDGID == -211) {
823 ret += 0.692 * GetDensity(310, dens);
831 std::vector<double> ThermalModelBase::GetIdealGasDensities()
const {
832 std::vector<double> ret = m_densities;
833 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
839 void ThermalModelBase::ResetCalculatedFlags()
841 m_Calculated =
false;
842 m_FeeddownCalculated =
false;
843 m_SusceptibilitiesCalculated =
false;
844 m_FluctuationsCalculated =
false;
845 m_TemperatureDerivativesCalculated =
false;
846 m_GCECalculated =
false;
852 return BaryonDensity();
854 return ElectricChargeDensity();
856 return StrangenessDensity();
858 return CharmDensity();
864 if (!IsTemperatureDerivativesCalculated())
868 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
869 ret += m_TPS->Particles()[i].ConservedCharge(chg) * m_dndT[i];
875 double ThermalModelBase::ChargedMultiplicity(
int type)
879 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
880 int tQ = m_TPS->Particles()[i].ElectricCharge();
882 if (type == 0 && tQ != 0)
884 if (type == 1 && tQ > 0)
886 if (type == -1 && tQ < 0)
889 ret += m_densities[i];
894 double ThermalModelBase::ChargedScaledVariance(
int type)
896 if (!m_FluctuationsCalculated) {
897 std::cerr <<
"**WARNING** " << m_TAG <<
": ChargedScaledVariance(int): Fluctuations were not calculated\n";
901 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
902 int tQ = m_TPS->Particles()[i].ElectricCharge();
904 if (type == 0 && tQ != 0)
906 if (type == 1 && tQ > 0)
908 if (type == -1 && tQ < 0)
911 for (
int j = 0; j < m_TPS->ComponentsNumber(); ++j) {
912 int tQ2 = m_TPS->Particles()[j].ElectricCharge();
914 if (type == 0 && tQ2 != 0)
916 if (type == 1 && tQ2 > 0)
918 if (type == -1 && tQ2 < 0)
922 ret += m_PrimCorrel[i][j];
927 return ret * m_Parameters.T *
Volume() / ChargedMultiplicity(type);
930 double ThermalModelBase::ChargedMultiplicityFinal(
int type)
939 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
940 ret += m_densities[i] * m_TPS->Particles()[i].Nch()[op];
945 double ThermalModelBase::ChargedScaledVarianceFinal(
int type)
947 if (!m_FluctuationsCalculated) {
948 std::cerr <<
"**WARNING** " << m_TAG <<
": ChargedScaledVarianceFinal(int): Fluctuations were not calculated" << std::endl;
955 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
956 ret += m_densities[i] *
Volume() * m_TPS->Particles()[i].DeltaNch()[op];
957 for (
int j = 0; j < m_TPS->ComponentsNumber(); ++j) {
958 ret += m_PrimCorrel[i][j] * m_Parameters.T *
Volume() * m_TPS->Particles()[i].Nch()[op] * m_TPS->Particles()[j].Nch()[op];
961 return ret / ChargedMultiplicityFinal(type);
965 throw std::runtime_error(
"ThermalModelBase::CalculateTwoParticleCorrelations: Calculation of two-particle correlations and fluctuations is not implemented");
973 int NN = m_densities.size();
976 for (
int i = 0; i < NN; ++i)
979 m_TotalCorrel[i][i] = m_PrimCorrel[i][i];
982 for (
size_t r = 0; r < decayContributions.size(); ++r) {
983 int rr = decayContributions[r].second;
985 m_TotalCorrel[i][i] += 2. * m_PrimCorrel[i][rr] * decayContributions[r].first;
987 for (
size_t r2 = 0; r2 < decayContributions.size(); ++r2) {
988 int rr2 = decayContributions[r2].second;
989 m_TotalCorrel[i][i] += m_PrimCorrel[rr][rr2] * decayContributions[r].first * decayContributions[r2].first;
993 m_TotalCorrel[i][i] += m_densities[rr] / m_Parameters.T * m_TPS->DecayCumulants()[i][r].first[1];
1011 for (
int i = 0; i < NN; ++i) {
1012 if (m_TPS->Particles()[i].IsStable()) {
1013 for (
int j = 0; j < NN; ++j) {
1014 if (j != i && m_TPS->Particles()[j].IsStable()) {
1015 m_TotalCorrel[i][j] = m_PrimCorrel[i][j];
1020 for (
size_t r = 0; r < decayContributionsJ.size(); ++r) {
1021 int rr = decayContributionsJ[r].second;
1022 m_TotalCorrel[i][j] += m_PrimCorrel[i][rr] * decayContributionsJ[r].first;
1025 for (
size_t r = 0; r < decayContributionsI.size(); ++r) {
1026 int rr = decayContributionsI[r].second;
1027 m_TotalCorrel[i][j] += m_PrimCorrel[j][rr] * decayContributionsI[r].first;
1030 for (
size_t r = 0; r < decayContributionsI.size(); ++r) {
1031 int rr = decayContributionsI[r].second;
1033 for (
size_t r2 = 0; r2 < decayContributionsJ.size(); ++r2) {
1034 int rr2 = decayContributionsJ[r2].second;
1035 m_TotalCorrel[i][j] += m_PrimCorrel[rr][rr2] * decayContributionsI[r].first * decayContributionsJ[r2].first;
1040 for (
int r = 0; r < m_TPS->ComponentsNumber(); ++r) {
1041 if (r != i && r != j) {
1042 double nij = 0., ni = 0., nj = 0., dnij = 0.;
1045 for (
size_t br = 0; br < decayDistributions.size(); ++br) {
1046 nij += decayDistributions[br].first * decayDistributions[br].second[i] * decayDistributions[br].second[j];
1047 ni += decayDistributions[br].first * decayDistributions[br].second[i];
1048 nj += decayDistributions[br].first * decayDistributions[br].second[j];
1050 dnij = nij - ni * nj;
1051 m_TotalCorrel[i][j] += m_densities[r] / m_Parameters.T * dnij;
1059 for (
int i = 0; i < NN; ++i) {
1060 m_wtot[i] = m_TotalCorrel[i][i];
1061 if (m_densitiestotal[i] > 0.) m_wtot[i] *= m_Parameters.T / m_densitiestotal[i];
1062 else m_wtot[i] = 1.;
1068 if (!IsFluctuationsCalculated()) {
1069 throw std::runtime_error(
"ThermalModelBase::TwoParticleSusceptibilityPrimordial: fluctuations were not computed beforehand!");
1077 int i = TPS()->PdgToId(id1);
1078 int j = TPS()->PdgToId(id2);
1081 std::cerr <<
"**WARNING** ThermalModelBase::TwoParticleSusceptibilityPrimordialByPdg: unknown pdg code " << id1 << std::endl;
1085 std::cerr <<
"**WARNING** ThermalModelBase::TwoParticleSusceptibilityPrimordialByPdg: unknown pdg code " << id2 << std::endl;
1093 if (!IsFluctuationsCalculated() || !IsTemperatureDerivativesCalculated()) {
1094 throw std::runtime_error(
"ThermalModelBase::TwoParticleSusceptibilityPrimordial: temperature derivatives of fluctuations were not computed beforehand!");
1097 return m_PrimChi2sdT[i][j];
1102 int i = TPS()->PdgToId(id1);
1103 int j = TPS()->PdgToId(id2);
1106 std::cerr <<
"**WARNING** ThermalModelBase::TwoParticleSusceptibilityTemperatureDerivativePrimordialByPdg: unknown pdg code " << id1 << std::endl;
1110 std::cerr <<
"**WARNING** ThermalModelBase::TwoParticleSusceptibilityTemperatureDerivativePrimordialByPdg: unknown pdg code " << id2 << std::endl;
1119 int i1 = TPS()->PdgToId(id1);
1120 int j1 = TPS()->PdgToId(id2);
1123 std::cerr <<
"**WARNING** ThermalModelBase::NetParticleSusceptibilityPrimordialByPdg: unknown pdg code " << id1 << std::endl;
1127 std::cerr <<
"**WARNING** ThermalModelBase::NetParticleSusceptibilityPrimordialByPdg: unknown pdg code " << id2 << std::endl;
1131 int i2 = TPS()->PdgToId(-id1);
1132 int j2 = TPS()->PdgToId(-id2);
1135 if (i2 == -1 && j2 == -1) {
1155 if (!IsFluctuationsCalculated()) {
1156 throw std::runtime_error(
"ThermalModelBase::TwoParticleSusceptibilityFinal: fluctuations were not computed beforehand!");
1159 if (!m_TPS->Particle(i).IsStable() || !m_TPS->Particle(j).IsStable()) {
1161 if (!m_TPS->Particle(j).IsStable())
1163 throw std::runtime_error(
"ThermalModelBase::TwoParticleSusceptibilityFinal: Particle " + std::to_string(tid) +
" is not stable! Final correlations not computed for unstable particles.");
1171 int i = TPS()->PdgToId(id1);
1172 int j = TPS()->PdgToId(id2);
1175 std::cerr <<
"**WARNING** ThermalModelBase::TwoParticleSusceptibilityFinalByPdg: unknown pdg code " << id1 << std::endl;
1179 std::cerr <<
"**WARNING** ThermalModelBase::TwoParticleSusceptibilityFinalByPdg: unknown pdg code " << id2 << std::endl;
1188 int i1 = TPS()->PdgToId(id1);
1189 int j1 = TPS()->PdgToId(id2);
1192 std::cerr <<
"**WARNING** ThermalModelBase::NetParticleSusceptibilityFinalByPdg: unknown pdg code " << id1 << std::endl;
1196 std::cerr <<
"**WARNING** ThermalModelBase::NetParticleSusceptibilityFinalByPdg: unknown pdg code " << id2 << std::endl;
1200 int i2 = TPS()->PdgToId(-id1);
1201 int j2 = TPS()->PdgToId(-id2);
1204 if (i2 == -1 && j2 == -1) {
1224 if (!IsFluctuationsCalculated()) {
1225 throw std::runtime_error(
"ThermalModelBase::PrimordialParticleChargeSusceptibility: fluctuations were not computed beforehand!");
1233 int i = TPS()->PdgToId(id1);
1235 std::cerr <<
"**WARNING** ThermalModelBase::PrimordialParticleChargeSusceptibilityByPdg: unknown pdg code " << id1 << std::endl;
1244 int i1 = TPS()->PdgToId(id1);
1246 std::cerr <<
"**WARNING** ThermalModelBase::PrimordialNetParticleChargeSusceptibilityByPdg: unknown pdg code " << id1 << std::endl;
1250 int i2 = TPS()->PdgToId(-id1);
1259 if (!IsFluctuationsCalculated()) {
1260 throw std::runtime_error(
"ThermalModelBase::FinalParticleChargeSusceptibility: fluctuations were not computed beforehand!");
1268 int i = TPS()->PdgToId(id1);
1270 std::cerr <<
"**WARNING** ThermalModelBase::FinalParticleChargeSusceptibilityByPdg: unknown pdg code " << id1 << std::endl;
1279 int i1 = TPS()->PdgToId(id1);
1281 std::cerr <<
"**WARNING** ThermalModelBase::FinalNetParticleChargeSusceptibilityByPdg: unknown pdg code " << id1 << std::endl;
1285 int i2 = TPS()->PdgToId(-id1);
1295 for (
int i = 0; i < 4; ++i) m_Susc[i].resize(4);
1298 for (
int i = 0; i < 4; ++i) {
1299 for (
int j = 0; j < 4; ++j) {
1301 m_dSuscdT[i][j] = 0.;
1302 for (
size_t k = 0; k < m_PrimCorrel.size(); ++k) {
1304 if (i == 0) c1 = m_TPS->Particles()[k].BaryonCharge();
1305 if (i == 1) c1 = m_TPS->Particles()[k].ElectricCharge();
1306 if (i == 2) c1 = m_TPS->Particles()[k].Strangeness();
1307 if (i == 3) c1 = m_TPS->Particles()[k].Charm();
1308 for (
size_t kp = 0; kp < m_PrimCorrel.size(); ++kp) {
1310 if (j == 0) c2 = m_TPS->Particles()[kp].BaryonCharge();
1311 if (j == 1) c2 = m_TPS->Particles()[kp].ElectricCharge();
1312 if (j == 2) c2 = m_TPS->Particles()[kp].Strangeness();
1313 if (j == 3) c2 = m_TPS->Particles()[kp].Charm();
1314 m_Susc[i][j] += c1 * c2 * m_PrimCorrel[k][kp];
1316 if (IsTemperatureDerivativesCalculated())
1317 m_dSuscdT[i][j] += c1 * c2 * m_PrimChi2sdT[k][kp];
1323 m_SusceptibilitiesCalculated =
true;
1328 m_ProxySusc.resize(4);
1329 for (
int i = 0; i < 4; ++i)
1330 m_ProxySusc[i].resize(4);
1333 for (
int i = 0; i < 3; ++i) {
1334 for (
int j = 0; j < 3; ++j) {
1335 m_ProxySusc[i][j] = 0.;
1336 for (
size_t k = 0; k < m_TotalCorrel.size(); ++k) {
1337 if (m_TPS->Particles()[k].IsStable()) {
1340 if (i == 0) c1 = 1 * (m_TPS->Particles()[k].PdgId() == 2212) - 1 * (m_TPS->Particles()[k].PdgId() == -2212);
1341 if (i == 1) c1 = m_TPS->Particles()[k].ElectricCharge();
1343 if (i == 2) c1 = 1 * (m_TPS->Particles()[k].PdgId() == 321) - 1 * (m_TPS->Particles()[k].PdgId() == -321);
1344 if (i == 3) c1 = m_TPS->Particles()[k].Charm();
1345 for (
size_t kp = 0; kp < m_TotalCorrel.size(); ++kp) {
1346 if (m_TPS->Particles()[kp].IsStable()) {
1349 if (j == 0) c2 = 1 * (m_TPS->Particles()[kp].PdgId() == 2212) - 1 * (m_TPS->Particles()[kp].PdgId() == -2212);
1350 if (j == 1) c2 = m_TPS->Particles()[kp].ElectricCharge();
1352 if (j == 2) c2 = 1 * (m_TPS->Particles()[kp].PdgId() == 321) - 1 * (m_TPS->Particles()[kp].PdgId() == -321);
1353 if (j == 3) c2 = m_TPS->Particles()[kp].Charm();
1354 m_ProxySusc[i][j] += c1 * c2 * m_TotalCorrel[k][kp];
1368 m_PrimChargesCorrel = std::vector< std::vector<double> >(TPS()->ComponentsNumber(), std::vector<double>(4, 0.));
1369 m_FinalChargesCorrel = std::vector< std::vector<double> >(TPS()->ComponentsNumber(), std::vector<double>(4, 0.));
1371 for (
size_t i = 0; i < TPS()->ComponentsNumber(); ++i) {
1373 for (
int chg = 0; chg < 4; ++chg) {
1374 for (
size_t j = 0; j < TPS()->ComponentsNumber(); ++j) {
1376 m_PrimChargesCorrel[i][chg] += c1 * c2 * m_PrimCorrel[i][j];
1381 for (
size_t i = 0; i < TPS()->ComponentsNumber(); ++i) {
1382 if (m_TPS->Particles()[i].IsStable()) {
1384 for (
int chg = 0; chg < 4; ++chg) {
1385 for (
size_t j = 0; j < TPS()->ComponentsNumber(); ++j) {
1386 if (m_TPS->Particles()[j].IsStable()) {
1388 m_FinalChargesCorrel[i][chg] += c1 * c2 * m_TotalCorrel[i][j];
1396 std::vector<double> ThermalModelBase::PartialPressures() {
1397 if (!IsCalculated())
1400 std::vector<double> ret(5, 0.);
1401 for (
size_t i = 0; i < TPS()->ComponentsNumber(); ++i) {
1419 std::cerr <<
"**WARNING** " << m_TAG <<
": Calculation of fluctuations is not implemented" << std::endl;
1423 std::cerr <<
"**WARNING** " << m_TAG <<
": Calculation of temperature derivatives is not implemented" << std::endl;
1426 std::vector<double> ThermalModelBase::BroydenEquationsChem::Equations(
const std::vector<double>& x)
1428 std::vector<double> ret(m_N, 0.);
1431 if (m_THM->ConstrainMuB()) { m_THM->SetBaryonChemicalPotential(x[i1]); i1++; }
1432 if (m_THM->ConstrainMuQ()) { m_THM->SetElectricChemicalPotential(x[i1]); i1++; }
1433 if (m_THM->ConstrainMuS()) { m_THM->SetStrangenessChemicalPotential(x[i1]); i1++; }
1434 if (m_THM->ConstrainMuC()) { m_THM->SetCharmChemicalPotential(x[i1]); i1++; }
1435 m_THM->FillChemicalPotentials();
1436 m_THM->CalculatePrimordialDensities();
1441 if (m_THM->ConstrainMuB()) {
1442 double fBd = m_THM->CalculateBaryonDensity();
1443 double fSd = m_THM->CalculateEntropyDensity();
1445 ret[i1] = (fBd / fSd - 1. / m_THM->SoverB()) * m_THM->SoverB();
1451 if (m_THM->ConstrainMuQ()) {
1452 double fBd = m_THM->CalculateBaryonDensity();
1453 double fQd = m_THM->CalculateChargeDensity();
1456 ret[i1] = (fQd / fBd - m_THM->QoverB());
1464 if (m_THM->ConstrainMuS()) {
1465 double fSd = m_THM->CalculateStrangenessDensity();
1466 double fASd = m_THM->CalculateAbsoluteStrangenessDensity();
1468 fASd = m_THM->CalculateAbsoluteStrangenessDensityModulo();
1470 ret[i1] = fSd / fASd;
1477 if (m_THM->ConstrainMuC()) {
1478 double fCd = m_THM->CalculateCharmDensity();
1479 double fACd = m_THM->CalculateAbsoluteCharmDensity();
1481 fACd = m_THM->CalculateAbsoluteCharmDensityModulo();
1483 ret[i1] = fCd / fACd;
1491 std::vector<double> ThermalModelBase::BroydenJacobianChem::Jacobian(
const std::vector<double>& x)
1495 if (m_THM->ConstrainMuB()) {
1496 throw std::runtime_error(
"ThermalModelBase::ConstrainChemicalPotentials: analytic calculation of the Jacobian not supported if muB is constrained");
1499 if (m_THM->ConstrainMuQ()) { m_THM->SetElectricChemicalPotential(x[i1]); i1++; }
1500 if (m_THM->ConstrainMuS()) { m_THM->SetStrangenessChemicalPotential(x[i1]); i1++; }
1501 if (m_THM->ConstrainMuC()) { m_THM->SetCharmChemicalPotential(x[i1]); i1++; }
1502 m_THM->FillChemicalPotentials();
1503 m_THM->CalculatePrimordialDensities();
1505 double fBd = m_THM->CalculateBaryonDensity();
1506 double fQd = m_THM->CalculateChargeDensity();
1507 double fSd = m_THM->CalculateStrangenessDensity();
1508 double fASd = m_THM->CalculateAbsoluteStrangenessDensity();
1509 if (fASd < 1.e-25) {
1510 fASd = m_THM->CalculateAbsoluteStrangenessDensityModulo();
1512 double fCd = m_THM->CalculateCharmDensity();
1513 double fACd = m_THM->CalculateAbsoluteCharmDensity();
1514 if (fACd < 1.e-25) {
1515 fACd = m_THM->CalculateAbsoluteCharmDensityModulo();
1518 vector<double> chi2s;
1519 chi2s.resize(m_THM->Densities().size());
1520 for (
size_t i = 0; i < chi2s.size(); ++i) {
1521 chi2s[i] = m_THM->TPS()->Particle(i).chiDimensionfull(2, m_THM->Parameters(), m_THM->UseWidth(), m_THM->ChemicalPotential(i) + m_THM->MuShift(i))
1526 if (m_THM->ConstrainMuQ()) NNN++;
1527 if (m_THM->ConstrainMuS()) NNN++;
1528 if (m_THM->ConstrainMuC()) NNN++;
1529 MatrixXd ret(NNN, NNN);
1533 if (m_THM->ConstrainMuQ()) {
1536 double d1 = 0., d2 = 0.;
1538 if (m_THM->ConstrainMuQ()) {
1540 for (
size_t i = 0; i < chi2s.size(); ++i)
1541 d1 += m_THM->TPS()->Particle(i).ElectricCharge() * m_THM->TPS()->Particle(i).ElectricCharge() * chi2s[i];
1544 for (
size_t i = 0; i < chi2s.size(); ++i)
1545 d2 += m_THM->TPS()->Particle(i).BaryonCharge() * m_THM->TPS()->Particle(i).ElectricCharge() * chi2s[i];
1548 ret(i1, i2) = (d1 / fBd - fQd / fBd / fBd * d2);
1555 if (m_THM->ConstrainMuS()) {
1557 for (
size_t i = 0; i < chi2s.size(); ++i)
1558 d1 += m_THM->TPS()->Particle(i).ElectricCharge() * m_THM->TPS()->Particle(i).Strangeness() * chi2s[i];
1561 for (
size_t i = 0; i < chi2s.size(); ++i)
1562 d2 += m_THM->TPS()->Particle(i).BaryonCharge() * m_THM->TPS()->Particle(i).Strangeness() * chi2s[i];
1565 ret(i1, i2) = (d1 / fBd - fQd / fBd / fBd * d2);
1572 if (m_THM->ConstrainMuC()) {
1574 for (
size_t i = 0; i < chi2s.size(); ++i)
1575 d1 += m_THM->TPS()->Particle(i).ElectricCharge() * m_THM->TPS()->Particle(i).Charm() * chi2s[i];
1578 for (
size_t i = 0; i < chi2s.size(); ++i)
1579 d2 += m_THM->TPS()->Particle(i).BaryonCharge() * m_THM->TPS()->Particle(i).Charm() * chi2s[i];
1582 ret(i1, i2) = (d1 / fBd - fQd / fBd / fBd * d2);
1593 if (m_THM->ConstrainMuS()) {
1596 double d1 = 0., d2 = 0.;
1598 if (m_THM->ConstrainMuQ()) {
1600 for (
size_t i = 0; i < chi2s.size(); ++i)
1601 d1 += m_THM->TPS()->Particle(i).Strangeness() * m_THM->TPS()->Particle(i).ElectricCharge() * chi2s[i];
1604 for (
size_t i = 0; i < chi2s.size(); ++i)
1605 d2 += m_THM->TPS()->Particle(i).AbsoluteStrangeness() * m_THM->TPS()->Particle(i).ElectricCharge() * chi2s[i];
1607 ret(i1, i2) = d1 / fASd - fSd / fASd / fASd * d2;
1613 if (m_THM->ConstrainMuS()) {
1615 for (
size_t i = 0; i < chi2s.size(); ++i)
1616 d1 += m_THM->TPS()->Particle(i).Strangeness() * m_THM->TPS()->Particle(i).Strangeness() * chi2s[i];
1619 for (
size_t i = 0; i < chi2s.size(); ++i)
1620 d2 += m_THM->TPS()->Particle(i).AbsoluteStrangeness() * m_THM->TPS()->Particle(i).Strangeness() * chi2s[i];
1622 ret(i1, i2) = d1 / fASd - fSd / fASd / fASd * d2;
1628 if (m_THM->ConstrainMuC()) {
1630 for (
size_t i = 0; i < chi2s.size(); ++i)
1631 d1 += m_THM->TPS()->Particle(i).Strangeness() * m_THM->TPS()->Particle(i).Charm() * chi2s[i];
1634 for (
size_t i = 0; i < chi2s.size(); ++i)
1635 d2 += m_THM->TPS()->Particle(i).AbsoluteStrangeness() * m_THM->TPS()->Particle(i).Charm() * chi2s[i];
1637 ret(i1, i2) = d1 / fASd - fSd / fASd / fASd * d2;
1647 if (m_THM->ConstrainMuC()) {
1650 double d1 = 0., d2 = 0.;
1652 if (m_THM->ConstrainMuQ()) {
1654 for (
size_t i = 0; i < chi2s.size(); ++i)
1655 d1 += m_THM->TPS()->Particle(i).Charm() * m_THM->TPS()->Particle(i).ElectricCharge() * chi2s[i];
1658 for (
size_t i = 0; i < chi2s.size(); ++i)
1659 d2 += m_THM->TPS()->Particle(i).AbsoluteCharm() * m_THM->TPS()->Particle(i).ElectricCharge() *chi2s[i];
1661 ret(i1, i2) = d1 / fACd - fCd / fACd / fACd * d2;
1667 if (m_THM->ConstrainMuS()) {
1669 for (
size_t i = 0; i < chi2s.size(); ++i)
1670 d1 += m_THM->TPS()->Particle(i).Charm() * m_THM->TPS()->Particle(i).Strangeness() * chi2s[i];
1673 for (
size_t i = 0; i < chi2s.size(); ++i)
1674 d2 += m_THM->TPS()->Particle(i).AbsoluteCharm() * m_THM->TPS()->Particle(i).Strangeness() * chi2s[i];
1676 ret(i1, i2) = d1 / fACd - fCd / fACd / fACd * d2;
1682 if (m_THM->ConstrainMuC()) {
1684 for (
size_t i = 0; i < chi2s.size(); ++i)
1685 d1 += m_THM->TPS()->Particle(i).Charm() * m_THM->TPS()->Particle(i).Charm() * chi2s[i];
1688 for (
size_t i = 0; i < chi2s.size(); ++i)
1689 d2 += m_THM->TPS()->Particle(i).AbsoluteCharm() * m_THM->TPS()->Particle(i).Charm() * chi2s[i];
1691 ret(i1, i2) = d1 / fACd - fCd / fACd / fACd * d2;
1699 std::vector<double> retVec(NNN*NNN, 0);
1700 for (
int i = 0; i < NNN; ++i)
1701 for (
int j = 0; j < NNN; ++j)
1702 retVec[i*NNN + j] = ret(i, j);
1708 std::vector<double> ThermalModelBase::BroydenChem::Solve(
const std::vector<double>& x0, BroydenSolutionCriterium * solcrit,
int max_iterations)
1710 if (m_Equations == NULL) {
1711 throw std::runtime_error(
"Broyden::Solve: Equations to solve not specified!");
1715 std::vector<double> xcur;
1716 if (m_THM->ConstrainMuB()) { xcur.push_back(x0[0]); NNN++; }
1717 if (m_THM->ConstrainMuQ()) { xcur.push_back(x0[1]); NNN++; }
1718 if (m_THM->ConstrainMuS()) { xcur.push_back(x0[2]); NNN++; }
1719 if (m_THM->ConstrainMuC()) { xcur.push_back(x0[3]); NNN++; }
1721 m_THM->FillChemicalPotentials();
1725 m_Equations->SetDimension(NNN);
1727 m_MaxIterations = max_iterations;
1729 BroydenSolutionCriterium *SolutionCriterium = solcrit;
1730 bool UseDefaultSolutionCriterium =
false;
1731 if (SolutionCriterium == NULL) {
1732 SolutionCriterium =
new BroydenSolutionCriterium(TOL);
1733 UseDefaultSolutionCriterium =
true;
1737 bool UseDefaultJacobian =
false;
1738 if (JacobianInUse == NULL || m_THM->ConstrainMuB()) {
1740 UseDefaultJacobian =
true;
1743 double &maxdiff = m_MaxDifference;
1744 int N = m_Equations->Dimension();
1748 std::vector<double> tmpvec, xdeltavec = xcur;
1749 VectorXd xold(N), xnew(N), xdelta(N);
1750 VectorXd fold(N), fnew(N), fdelta(N);
1752 xold = VectorXd::Map(&xcur[0], xcur.size());
1754 MatrixXd Jac = Eigen::Map< Matrix<double, Dynamic, Dynamic, RowMajor> >(&JacobianInUse->Jacobian(xcur)[0], N, N);
1756 bool constrmuB = m_THM->ConstrainMuB();
1757 bool constrmuQ = m_THM->ConstrainMuQ();
1758 bool constrmuS = m_THM->ConstrainMuS();
1759 bool constrmuC = m_THM->ConstrainMuC();
1760 bool repeat =
false;
1762 if (m_THM->ConstrainMuB()) {
1763 for (
int j = 0; j < Jac.rows(); ++j)
1764 if (Jac(NNN, j) > 1.e8) { repeat =
true; m_THM->ConstrainMuB(
false); }
1765 double S = m_THM->CalculateEntropyDensity();
1766 double nB = m_THM->CalculateBaryonDensity();
1767 if (abs(S) < 1.e-25 || abs(nB) < 1.e-25) { repeat =
true; m_THM->ConstrainMuB(
false); }
1770 if (m_THM->ConstrainMuQ()) {
1771 for (
int j = 0; j < Jac.rows(); ++j)
1772 if (Jac(NNN, j) > 1.e8) { repeat =
true; m_THM->ConstrainMuQ(
false); }
1773 double nQ = m_THM->CalculateChargeDensity();
1774 double nB = m_THM->CalculateBaryonDensity();
1775 if (abs(nQ) < 1.e-25 || abs(nB) < 1.e-25) { repeat =
true; m_THM->ConstrainMuQ(
false); }
1778 if (m_THM->ConstrainMuS()) {
1779 for (
int j = 0; j < Jac.rows(); ++j)
1780 if (Jac(NNN, j) > 1.e8) { repeat =
true; m_THM->ConstrainMuS(
false); }
1782 double nS = m_THM->CalculateAbsoluteStrangenessDensity();
1783 if (abs(nS) < 1.e-25) { nS = m_THM->CalculateAbsoluteStrangenessDensityModulo(); }
1784 if (abs(nS) < 1.e-25) { repeat =
true; m_THM->ConstrainMuS(
false); }
1787 if (m_THM->ConstrainMuC()) {
1788 for (
int j = 0; j < Jac.rows(); ++j)
1789 if (Jac(NNN, j) > 1.e8) { repeat =
true; m_THM->ConstrainMuC(
false); }
1790 double nC = m_THM->CalculateAbsoluteCharmDensity();
1791 if (abs(nC) < 1.e-25) { nC = m_THM->CalculateAbsoluteCharmDensityModulo(); }
1792 if (abs(nC) < 1.e-25) { repeat =
true; m_THM->ConstrainMuC(
false); }
1796 std::vector<double> ret = Solve(x0, solcrit, max_iterations);
1797 m_THM->ConstrainMuQ(constrmuB);
1798 m_THM->ConstrainMuQ(constrmuQ);
1799 m_THM->ConstrainMuS(constrmuS);
1800 m_THM->ConstrainMuC(constrmuC);
1804 if (Jac.determinant() == 0.0)
1806 std::cerr <<
"**WARNING** Singular Jacobian in Broyden::Solve" << std::endl;
1810 MatrixXd Jinv = Jac.inverse();
1811 tmpvec = m_Equations->Equations(xcur);
1812 fold = VectorXd::Map(&tmpvec[0], tmpvec.size());
1814 for (m_Iterations = 1; m_Iterations < max_iterations; ++m_Iterations) {
1815 xnew = xold - Jinv * fold;
1817 VectorXd::Map(&xcur[0], xcur.size()) = xnew;
1819 tmpvec = m_Equations->Equations(xcur);
1820 fnew = VectorXd::Map(&tmpvec[0], tmpvec.size());
1824 for (
size_t i = 0; i < xcur.size(); ++i) {
1825 maxdiff = std::max(maxdiff, fabs(fnew[i]));
1828 xdelta = xnew - xold;
1829 fdelta = fnew - fold;
1831 VectorXd::Map(&xdeltavec[0], xdeltavec.size()) = xdelta;
1833 if (SolutionCriterium->IsSolved(xcur, tmpvec, xdeltavec))
1840 for (
int i = 0; i < N; ++i)
1841 for (
int j = 0; j < N; ++j)
1842 norm += xdelta[i] * Jinv(i, j) * fdelta[j];
1844 p1 = (xdelta - Jinv * fdelta);
1845 for (
int i = 0; i < N; ++i) p1[i] *= 1. / norm;
1846 Jinv = Jinv + (p1 * xdelta.transpose()) * Jinv;
1850 Jac = Eigen::Map< Matrix<double, Dynamic, Dynamic, RowMajor> >(&JacobianInUse->Jacobian(xcur)[0], N, N);
1851 Jinv = Jac.inverse();
1858 if (m_Iterations == max_iterations) {
1859 std::cerr <<
"**WARNING** Reached maximum number of iterations in Broyden procedure" << std::endl;
1862 if (UseDefaultSolutionCriterium) {
1863 delete SolutionCriterium;
1864 SolutionCriterium = NULL;
1866 if (UseDefaultJacobian) {
1867 delete JacobianInUse;
1868 JacobianInUse = NULL;
1874 ThermalModelBase::BroydenEquationsChemTotals::BroydenEquationsChemTotals(
const std::vector<int>& vConstr,
const std::vector<int>& vType,
const std::vector<double>& vTotals,
ThermalModelBase * model) :
1875 BroydenEquations(), m_Constr(vConstr), m_Type(vType), m_Totals(vTotals), m_THM(model)
1878 for (
size_t i = 0; i < m_Constr.size(); ++i)
1882 std::vector<double> ThermalModelBase::BroydenEquationsChemTotals::Equations(
const std::vector<double>& x)
1884 std::vector<double> ret(m_N, 0.);
1887 for (
int i = 0; i < 4; ++i) {
1889 if (i == 0) m_THM->SetBaryonChemicalPotential(x[i1]);
1890 if (i == 1) m_THM->SetElectricChemicalPotential(x[i1]);
1891 if (i == 2) m_THM->SetStrangenessChemicalPotential(x[i1]);
1892 if (i == 3) m_THM->SetCharmChemicalPotential(x[i1]);
1896 m_THM->FillChemicalPotentials();
1897 m_THM->CalculatePrimordialDensities();
1899 vector<double> dens(4, 0.), absdens(4, 0.);
1901 dens[0] = m_THM->CalculateBaryonDensity();
1902 absdens[0] = m_THM->CalculateAbsoluteBaryonDensity();
1905 dens[1] = m_THM->CalculateChargeDensity();
1906 absdens[1] = m_THM->CalculateAbsoluteChargeDensity();
1909 dens[2] = m_THM->CalculateStrangenessDensity();
1910 absdens[2] = m_THM->CalculateAbsoluteStrangenessDensity();
1911 if (absdens[2] < 1.e-25) {
1912 absdens[2] = m_THM->CalculateAbsoluteStrangenessDensityModulo();
1916 dens[3] = m_THM->CalculateCharmDensity();
1917 absdens[3] = m_THM->CalculateAbsoluteCharmDensity();
1918 if (absdens[3] < 1.e-25) {
1919 absdens[3] = m_THM->CalculateAbsoluteCharmDensityModulo();
1925 for (
int i = 0; i < 4; ++i) {
1928 ret[i1] = (dens[i] * m_THM->Parameters().V - m_Totals[i]) / m_Totals[i];
1930 ret[i1] = dens[i] / absdens[i];
1938 std::vector<double> ThermalModelBase::BroydenJacobianChemTotals::Jacobian(
const std::vector<double>& x)
1941 for (
int i = 0; i < 4; ++i) NNN += m_Constr[i];
1945 for (
int i = 0; i < 4; ++i) {
1947 if (i == 0) m_THM->SetBaryonChemicalPotential(x[i1]);
1948 if (i == 1) m_THM->SetElectricChemicalPotential(x[i1]);
1949 if (i == 2) m_THM->SetStrangenessChemicalPotential(x[i1]);
1950 if (i == 3) m_THM->SetCharmChemicalPotential(x[i1]);
1955 m_THM->FillChemicalPotentials();
1956 m_THM->CalculatePrimordialDensities();
1958 vector<double> dens(4, 0.), absdens(4, 0.);
1960 dens[0] = m_THM->CalculateBaryonDensity();
1961 absdens[0] = m_THM->CalculateAbsoluteBaryonDensity();
1964 dens[1] = m_THM->CalculateChargeDensity();
1965 absdens[1] = m_THM->CalculateAbsoluteChargeDensity();
1968 dens[2] = m_THM->CalculateStrangenessDensity();
1969 absdens[2] = m_THM->CalculateAbsoluteStrangenessDensity();
1970 if (absdens[2] < 1.e-25) {
1971 absdens[2] = m_THM->CalculateAbsoluteStrangenessDensityModulo();
1975 dens[3] = m_THM->CalculateCharmDensity();
1976 absdens[3] = m_THM->CalculateAbsoluteCharmDensity();
1977 if (absdens[3] < 1.e-25) {
1978 absdens[3] = m_THM->CalculateAbsoluteCharmDensityModulo();
1982 vector<double> chi2s;
1983 chi2s.resize(m_THM->Densities().size());
1984 for (
size_t i = 0; i < chi2s.size(); ++i) {
1985 chi2s[i] = m_THM->TPS()->Particle(i).chiDimensionfull(2, m_THM->Parameters(), m_THM->UseWidth(), m_THM->ChemicalPotential(i) + m_THM->MuShift(i))
1989 vector< vector<double> > deriv(4, vector<double>(4)), derivabs(4, vector<double>(4));
1990 for (
int i = 0; i < 4; ++i)
1991 for (
int j = 0; j < 4; ++j) {
1993 for (
size_t part = 0; part < chi2s.size(); ++part)
1994 deriv[i][j] += m_THM->TPS()->Particles()[part].GetCharge(i) * m_THM->TPS()->Particles()[part].GetCharge(j) * chi2s[part];
1996 derivabs[i][j] = 0.;
1997 for (
size_t part = 0; part < chi2s.size(); ++part)
1998 derivabs[i][j] += m_THM->TPS()->Particles()[part].GetAbsCharge(i) * m_THM->TPS()->Particles()[part].GetCharge(j) * chi2s[part];
2002 MatrixXd ret(NNN, NNN);
2006 for (
int i = 0; i < 4; ++i) {
2009 for (
int j = 0; j < 4; ++j)
2013 ret(i1, i2) = deriv[i][j] * m_THM->Parameters().V / m_Totals[i];
2015 ret(i1, i2) = deriv[i][j] / absdens[i] - dens[i] / absdens[i] / absdens[i] * derivabs[i][j];
2022 std::vector<double> retVec(NNN*NNN, 0);
2023 for (
int i = 0; i < NNN; ++i)
2024 for (
int j = 0; j < NNN; ++j)
2025 retVec[i*NNN + j] = ret(i, j);
2031 void ThermalModelBase::SetDensityModelForParticleSpecies(
int i,
GeneralizedDensity *density_model)
2034 TPS()->Particle(i).SetGeneralizedDensity(density_model);
2036 std::cerr <<
"**WARNING** ThermalModelBase::SetDensityModelForParticleSpecies(): Particle id " << i <<
" is outside the range!" << std::endl;
2040 void ThermalModelBase::SetDensityModelForParticleSpeciesByPdg(
long long PDGID,
GeneralizedDensity *density_model)
2042 int id = TPS()->PdgToId(PDGID);
2044 TPS()->Particle(
id).SetGeneralizedDensity(density_model);
2046 std::cerr <<
"**WARNING** ThermalModelBase::SetDensityModelForParticleSpeciesByPdg(): Pdg code " << PDGID <<
" is outside the range!" << std::endl;
2050 void ThermalModelBase::ClearDensityModels() {
2051 for (
auto& particle : TPS()->Particles())
2052 particle.ClearGeneralizedDensity();
2055 void ThermalModelBase::SetMagneticField(
double B,
int lmax) {
2056 m_IGFExtraConfig.MagneticField.B = B;
2058 m_IGFExtraConfig.MagneticField.lmax = lmax;
2059 for (
auto& particle : TPS()->Particles())
2060 particle.SetMagneticField(B, m_IGFExtraConfig.MagneticField.lmax);
2061 RecomputeThresholdsDueToMagneticField();
2062 ResetCalculatedFlags();
2065 void ThermalModelBase::RecomputeThresholdsDueToMagneticField() {
2066 const double &B = m_IGFExtraConfig.MagneticField.B;
2067 for (
int ipart = 0; ipart < TPS()->ComponentsNumber(); ++ipart) {
2068 ThermalParticle &part = TPS()->Particle(ipart);
2069 if (!part.ZeroWidthEnforced() || part.ElectricCharge()==0) {
2071 part.CalculateAndSetDynamicalThreshold();
2072 part.FillCoefficientsDynamical();
2073 }
else if (!part.ZeroWidthEnforced()) {
2074 double szmax = (part.Degeneracy() - 1.) / 2.;
2076 double mmin = sqrt(2. * abs(part.ElectricCharge()) * B * (szmax - 0.5));
2077 part.CalculateAndSetDynamicalThreshold();
2078 if (mmin > part.DecayThresholdMassDynamical()) {
2079 part.SetDecayThresholdMassDynamical(mmin);
2081 part.FillCoefficientsDynamical();
2088 void ThermalModelBase::ClearMagneticField() {
2089 m_IGFExtraConfig.MagneticField.B = 0.;
2090 for (
auto& particle : TPS()->Particles())
2091 particle.ClearMagneticField();
2092 ResetCalculatedFlags();
2096 assert(IsSusceptibilitiesCalculated());
2097 return m_Susc[i][j];
2101 assert(IsSusceptibilitiesCalculated() && IsTemperatureDerivativesCalculated());
2102 return m_dSuscdT[i][j];
2106 assert(IsFluctuationsCalculated());
2107 return m_ProxySusc[i][j];
2110 double ThermalModelBase::GetdndT(
int i)
const {
2111 if (IsTemperatureDerivativesCalculated() && i >= 0 && i <
ComponentsNumber())
2114 std::cerr <<
"**WARNING** ThermalModelBase::GetdndT(): Temperature derivatives are not calculated or particle id " << i <<
" is outside the range!" << std::endl;
2122 for (
size_t k = 0; k < m_PrimCorrel.size(); ++k) {
2123 int c1 = m_TPS->Particles()[k].ConservedCharge(i);
2124 for (
size_t kp = 0; kp < m_PrimCorrel.size(); ++kp) {
2125 int c2 = m_TPS->Particles()[kp].ConservedCharge(j);
2126 ret += c1 * c2 * m_PrimCorrel[k][kp];
2132 double ThermalModelBase::CalculateSpecificHeatChem()
2134 double dedT = CalculateEnergyDensityDerivativeT();
2138 for(
int i = 0; i < TPS()->ComponentsNumber(); ++i) {
2139 ret -= m_Chem[i] * m_dndT[i];
2147 for (
int i = 0; i < 4; ++i)
2148 if (ConservedDensities[i] == 1)
2158 for(
int i = 0; i < 4; ++i) {
2159 if (ConservedDensities[i] == 0)
2162 for(
int j = 0; j < 4; ++j) {
2163 if (ConservedDensities[j] == 0)
2178 for (
int i = 0; i < 4; ++i)
2179 if (ConservedDensities[i] == 1)
2186 ret(0, 0) = model->SpecificHeatChem() / model->
Parameters().
T;
2191 for(
int i = 0; i < 4; ++i) {
2192 if (ConservedDensities[i] == 0)
2202 for(
int i = 0; i < 4; ++i) {
2203 if (ConservedDensities[i] == 0)
2206 for(
int j = 0; j < 4; ++j) {
2207 if (ConservedDensities[j] == 0)
2219 double ThermalModelBase::CalculateAdiabaticSpeedOfSoundSquared(
bool rhoBconst,
bool rhoQconst,
bool rhoSconst,
bool rhoCconst) {
2225 std::vector<int> ConservedCharges = {
static_cast<int>(rhoBconst),
static_cast<int>(rhoQconst),
static_cast<int>(rhoSconst),
static_cast<int>(rhoCconst)};
2227 if (!TPS()->hasBaryons())
2228 ConservedCharges[0] = 0;
2229 if (!TPS()->hasCharged())
2230 ConservedCharges[1] = 0;
2231 if (!TPS()->hasStrange())
2232 ConservedCharges[2] = 0;
2233 if (!TPS()->hasCharmed())
2234 ConservedCharges[3] = 0;
2238 for(
int i = 0; i < ConservedCharges.size(); ++i)
2239 assert(ConservedCharges[i] == 1 || mus[i] == 0.0);
2243 bool AllMuZero =
true;
2244 for(
int i = 0; i < ConservedCharges.size(); ++i)
2245 AllMuZero &= (ConservedCharges[i] == 0 || mus[i] == 0.0);
2249 if (!IsTemperatureDerivativesCalculated())
2257 for(
int i = 0; i < 4; ++i)
2258 if (ConservedCharges[i] == 1)
2262 if (!IsFluctuationsCalculated())
2269 MatrixXd chi2inv = chi2matr.inverse();
2272 for(
int i = 0; i < 4; ++i) {
2273 if (ConservedCharges[i] == 0)
2276 for(
int j = 0; j < 4; ++j) {
2277 if (ConservedCharges[j] == 0)
2282 ret += ConservedChargeDensity(chg1) * ConservedChargeDensity(chg2) * chi2inv(i1, i2);
2295 if (!IsTemperatureDerivativesCalculated())
2303 MatrixXd PiMatrInv = PiMatr.inverse();
2306 vector<double> x = {s};
2307 for(
int i = 0; i < ConservedCharges.size(); ++i)
2308 if (ConservedCharges[i] == 1)
2312 for(
int i = 0; i < x.size(); ++i)
2313 for(
int j = 0; j < x.size(); ++j)
2314 ret += x[i] * x[j] * PiMatrInv(i,j);
2320 double ThermalModelBase::CalculateIsothermalSpeedOfSoundSquared(
bool rhoBconst,
bool rhoQconst,
bool rhoSconst,
bool rhoCconst) {
2326 std::vector<int> ConservedCharges = {
static_cast<int>(rhoBconst),
static_cast<int>(rhoQconst),
static_cast<int>(rhoSconst),
static_cast<int>(rhoCconst)};
2328 if (!TPS()->hasBaryons())
2329 ConservedCharges[0] = 0;
2330 if (!TPS()->hasCharged())
2331 ConservedCharges[1] = 0;
2332 if (!TPS()->hasStrange())
2333 ConservedCharges[2] = 0;
2334 if (!TPS()->hasCharmed())
2335 ConservedCharges[3] = 0;
2339 bool AllMuZero =
true;
2340 for(
int i = 0; i < ConservedCharges.size(); ++i)
2341 AllMuZero &= (ConservedCharges[i] == 0 || mus[i] == 0.0);
2349 for(
int i = 0; i < ConservedCharges.size(); ++i)
2350 assert(ConservedCharges[i] == 1 || mus[i] == 0.0);
2354 MatrixXd chi2inv= chi2Matr.inverse();
2356 double numerator = 0.;
2357 double denominator = 0.;
2359 for(
int i = 0; i < 4; ++i) {
2361 if (ConservedCharges[i] == 0)
2363 denominator += mus[i] * ConservedChargeDensity((ConservedCharge::Name)i);
2365 for(
int j = 0; j < 4; ++j) {
2366 if (ConservedCharges[j] == 0)
2372 numerator += ConservedChargeDensity(chg1) * ConservedChargeDensity(chg2) * chi2inv(i1, i2);
2373 denominator += T * ConservedChargeDensitydT(chg1) * chi2inv(i1, i2) * ConservedChargeDensity(chg2);
2375 ret += ConservedChargeDensity(chg1) * ConservedChargeDensity(chg2) * chi2inv(i1, i2);
2381 return numerator / denominator;
2384 double ThermalModelBase::CalculateHeatCapacity(
bool rhoBconst,
bool rhoQconst,
bool rhoSconst,
bool rhoCconst) {
2390 std::vector<int> ConservedCharges = {
static_cast<int>(rhoBconst),
static_cast<int>(rhoQconst),
static_cast<int>(rhoSconst),
static_cast<int>(rhoCconst)};
2392 if (!TPS()->hasBaryons())
2393 ConservedCharges[0] = 0;
2394 if (!TPS()->hasCharged())
2395 ConservedCharges[1] = 0;
2396 if (!TPS()->hasStrange())
2397 ConservedCharges[2] = 0;
2398 if (!TPS()->hasCharmed())
2399 ConservedCharges[3] = 0;
2402 double TdsdT = SpecificHeatChem();
2406 bool AllMuZero =
true;
2407 for(
int i = 0; i < ConservedCharges.size(); ++i)
2408 AllMuZero &= (ConservedCharges[i] == 0 || mus[i] == 0.0);
2414 if (!IsFluctuationsCalculated())
2418 double denominator = 1.;
2420 auto PiMatrInv = PiMatr.inverse();
2421 int N = PiMatr.rows();
2422 for(
int i = 1; i < N; ++i) {
2423 denominator -= PiMatr(0, i) * PiMatrInv(i, 0);
2426 double heatCapacity = TdsdT / denominator;
2427 return heatCapacity;
map< string, double > params
Contains some helper functions.
Sub-class where it is determined whether the required accuracy is achieved in the Broyden's method.
Abstract class which defines the system of non-linear equations to be solved by the Broyden's method.
Class implementing the Broyden method to solve a system of non-linear equations.
virtual std::vector< double > Solve(const std::vector< double > &x0, BroydenSolutionCriterium *solcrit=NULL, int max_iterations=MAX_ITERS)
int MaxIterations() const
Class which implements calculation of the Jacobian needed for the Broyden's method.
static bool PrintDisclaimer()
static bool DisclaimerPrinted
Implements the possibility of a generalized calculation of the densities. For example,...
Abstract base class for an HRG model implementation.
virtual void CalculateSusceptibilityMatrix()
Calculates the conserved charges susceptibility matrix.
virtual double FullIdealChemicalPotential(int i) const
Chemical potential entering the ideal gas expressions of particle species i.
virtual void FixParametersNoReset()
Method which actually implements ConstrainChemicalPotentialsNoReset() (for backward compatibility).
virtual void ChangeTPS(ThermalParticleSystem *TPS)
Change the particle list.
virtual void SetGammaC(double gammaC)
Set the charm quark fugacity factor.
virtual void CalculateParticleChargeCorrelationMatrix()
Calculates the matrix of correlators between primordial (and also final) particle numbers and conserv...
virtual void SetTemperature(double T)
Set the temperature.
virtual void CalculateFluctuations()
Computes the fluctuation observables.
bool UsePartialChemicalEquilibrium()
Whether partial chemical equilibrium with additional chemical potentials is used.
virtual bool SolveChemicalPotentials(double totB=0., double totQ=0., double totS=0., double totC=0., double muBinit=0., double muQinit=0., double muSinit=0., double muCinit=0., bool ConstrMuB=true, bool ConstrMuQ=true, bool ConstrMuS=true, bool ConstrMuC=true)
The procedure which calculates the chemical potentials which reproduce the specified total baryon,...
virtual double TwoParticleSusceptibilityPrimordialByPdg(long long id1, long long id2)
Returns the computed primordial particle number (cross-)susceptibility for particles with pdg codes ...
virtual void DisableMesonMesonVirial()
virtual void SetVirial(int, int, double)
Set the excluded volume coefficient .
virtual void FillChemicalPotentials()
Sets the chemical potentials of all particles.
virtual void CalculateTemperatureDerivatives()
Computes the temperature derivatives of densities, shifted chemical potentials, and primordial hadron...
virtual void DisableMesonBaryonAttraction()
void ConstrainChemicalPotentials(bool resetInitialValues=true)
Constrains the chemical potentials by the conservation laws imposed.
virtual void FixParameters()
Method which actually implements ConstrainChemicalPotentials() (for backward compatibility).
virtual void DisableMesonBaryonVirial()
virtual double TwoParticleSusceptibilityFinalByPdg(long long id1, long long id2)
Returns the computed final particle number (cross-)susceptibility for particles with pdg codes id1 a...
virtual double TwoParticleSusceptibilityFinal(int i, int j) const
Returns the computed final particle number (cross-)susceptibility for particles with ids i and j....
virtual void SetGammaS(double gammaS)
Set the strange quark fugacity factor.
virtual void SetCharm(int C)
Set the total charm (for canonical ensemble only)
virtual double FinalNetParticleChargeSusceptibilityByPdg(long long id1, ConservedCharge::Name chg)
Returns the computed final (after decays) net particle vs conserved charge (cross-)susceptibility fo...
void SetResonanceWidthIntegrationType(ThermalParticle::ResonanceWidthIntegration type)
Set the ThermalParticle::ResonanceWidthIntegration scheme for all particles. Calls the corresponding ...
virtual void CalculateFeeddown()
Calculates the total densities which include feeddown contributions.
virtual double TwoParticleSusceptibilityTemperatureDerivativePrimordial(int i, int j) const
Returns the computed temperature derivative of the primordial particle number (cross-)susceptibility ...
void SetUseWidth(bool useWidth)
Sets whether finite resonance widths are used. Deprecated.
virtual double FinalParticleChargeSusceptibilityByPdg(long long id1, ConservedCharge::Name chg)
Returns the computed final (after decays) particle vs conserved charge (cross-)susceptibility for pa...
virtual void DisableBaryonAntiBaryonAttraction()
virtual double FinalParticleChargeSusceptibility(int i, ConservedCharge::Name chg) const
Returns the computed final (after decays) particle vs conserved charge (cross-)susceptibility for pa...
virtual void SetChemicalPotentials(const std::vector< double > &chem=std::vector< double >(0))
Sets the chemical potentials of all particles.
double ChemicalPotential(int i) const
Chemical potential of particle species i.
virtual void SetElectricCharge(int Q)
Set the total electric charge (for canonical ensemble only)
virtual std::vector< double > CalculateChargeFluctuations(const std::vector< double > &chgs, int order=4)
Calculates fluctuations (diagonal susceptibilities) of an arbitrary "conserved" charge.
virtual void SetBaryonChemicalPotential(double muB)
Set the baryon chemical potential.
virtual void CalculateTwoParticleCorrelations()
Computes the fluctuations and correlations of the primordial particle numbers.
virtual double SusceptibilityDimensionfull(ConservedCharge::Name i, ConservedCharge::Name j) const
A 2nd order susceptibility of conserved charges.
void SetNormBratio(bool normBratio)
Whether branching ratios are renormalized to 100%.
virtual void SetParameters(const ThermalModelParameters ¶ms)
The thermal parameters.
virtual void DisableMesonMesonAttraction()
virtual void SetElectricChemicalPotential(double muQ)
Set the electric chemical potential.
virtual double PrimordialNetParticleChargeSusceptibilityByPdg(long long id1, ConservedCharge::Name chg)
Returns the computed primordial net particle vs conserved charge (cross-)susceptibility for particle...
virtual double TwoParticleSusceptibilityTemperatureDerivativePrimordialByPdg(long long id1, long long id2)
Returns the computed temperature derivative of the primordial particle number (cross-)susceptibility ...
virtual double NetParticleSusceptibilityFinalByPdg(long long id1, long long id2)
Returns the computed (cross-)susceptibility between final net-particle numbers for pdg codes id1 and...
virtual void SetChemicalPotential(int i, double chem)
Sets the chemical potential of particle species i.
virtual bool FixChemicalPotentialsThroughDensities(double rhoB=0., double rhoQ=0., double rhoS=0., double rhoC=0., double muBinit=0., double muQinit=0., double muSinit=0., double muCinit=0., bool ConstrMuB=true, bool ConstrMuQ=true, bool ConstrMuS=true, bool ConstrMuC=true)
The procedure which calculates the chemical potentials which reproduce the specified baryon,...
virtual void ValidateCalculation()
Checks whether issues have occured during the calculation of particle densities in the CalculateDensi...
int ComponentsNumber() const
Number of different particle species in the list.
virtual void SetBaryonCharge(int B)
Set the total baryon number (for canonical ensemble only)
virtual void DisableBaryonBaryonVirial()
virtual void CalculateProxySusceptibilityMatrix()
Calculates the susceptibility matrix of conserved charges proxies.
virtual void DisableBaryonAntiBaryonVirial()
ThermalModelBase(ThermalParticleSystem *TPS, const ThermalModelParameters ¶ms=ThermalModelParameters())
Construct a new ThermalModelBase object.
virtual void DisableBaryonBaryonAttraction()
virtual double PrimordialParticleChargeSusceptibility(int i, ConservedCharge::Name chg) const
Returns the computed primordial particle vs conserved charge (cross-)susceptibility for particle wit...
virtual void CalculatePrimordialDensities()=0
Calculates the primordial densities of all species.
virtual void SetStrangenessChemicalPotential(double muS)
Set the strangeness chemical potential.
virtual double TwoParticleSusceptibilityPrimordial(int i, int j) const
Returns the computed primordial particle number (cross-)susceptibility for particles with ids i and ...
virtual void CalculateDensities()
Calculates the primordial and total (after decays) densities of all species.
virtual void FillVirial(const std::vector< double > &ri=std::vector< double >(0))
Fills the excluded volume coefficients based on the provided radii parameters for all species.
virtual void SetGammaq(double gammaq)
Set the light quark fugacity factor.
virtual void SetStrangeness(int S)
Set the total strangeness (for canonical ensemble only)
virtual void SetAttraction(int, int, double)
Set the vdW mean field attraction coefficient .
virtual double PrimordialParticleChargeSusceptibilityByPdg(long long id1, ConservedCharge::Name chg)
Returns the computed primordial particle vs conserved charge (cross-)susceptibility for particle wit...
const ThermalModelParameters & Parameters() const
virtual double NetParticleSusceptibilityPrimordialByPdg(long long id1, long long id2)
Returns the computed (cross-)susceptibility between primordial net-particle numbers for pdg codes id...
virtual void SetCharmChemicalPotential(double muC)
Set the charm chemical potential.
virtual void SetStatistics(bool stats)
double Volume() const
System volume (fm )
@ GCE
Grand canonical ensemble.
virtual void CalculateTwoParticleFluctuationsDecays()
Computes particle number correlations and fluctuations for all final-state particles which are marked...
Class containing all information about a particle specie.
double AbsoluteCharm() const
Absolute charm quark content |s|.
int BaryonCharge() const
Particle's baryon number.
double Density(const ThermalModelParameters ¶ms, IdealGasFunctions::Quantity type=IdealGasFunctions::ParticleDensity, bool useWidth=0, double mu=0.) const
Computes a specified ideal gas thermodynamic function.
const ParticleDecaysVector & Decays() const
A vector of particle's decays.
ResonanceWidthIntegration
Treatment of finite resonance widths.
@ eBW
Energy-dependent Breit-Wigner scheme (eBW)
@ BWTwoGamma
Energy-independent Breit-Wigner in +-2\Gamma interval.
@ ZeroWidth
Zero-width approximation.
double AbsoluteStrangeness() const
Absolute strange quark content |s|.
double AbsoluteQuark() const
Absolute light quark content |u,d|.
const ParticleDecaysVector & DecaysOriginal() const
A backup copy of particle's decays.
Class containing the particle list.
std::vector< std::pair< double, std::vector< int > > > ResonanceFinalStatesDistribution
std::vector< SingleDecayContribution > DecayContributionsToParticle
A vector of SingleDecayContribution where each element corresponds to a certain resonance species.
constexpr double GeVtoifm()
A constant to transform GeV into fm .
constexpr double GeVtoifm3()
A constant to transform GeV into fm .
constexpr double mnucleon()
Nucleon's mass. Value as in UrQMD.
The main namespace where all classes and functions of the Thermal-FIST library reside.
MatrixXd GetSusceptibilityMatrix(ThermalModelBase *model, const vector< int > &ConservedDensities)
MatrixXd GetPressureHessianMatrix(ThermalModelBase *model, const vector< int > &ConservedDensities)
Name
Set of all conserved charges considered.
@ BaryonCharge
Baryon number.
@ StrangenessCharge
Strangeness.
@ ElectricCharge
Electric charge.
@ Strong
Feeddown from strong decays.
@ Weak
Feeddown from strong, electromagnetic, and weak decays.
@ StabilityFlag
Feeddown from all particles marked as unstable.
static const int NumberOfDecayTypes
Structure containing all thermal parameters of the model.