39 for(
int i=0;i<6;++i)
m_chi[i].resize(3);
43 m_Virial.resize(m_densities.size(), vector<double>(m_densities.size(),0.));
48 m_TAG =
"ThermalModelVDW";
51 m_InteractionModel =
QvdW;
61 for(
size_t i = 0; i <
m_MuStar.size(); ++i)
68 for (
size_t i = 0; i <
m_MuStar.size(); ++i)
73 if (ri.size() != m_TPS->Particles().size()) {
74 std::cerr <<
"**WARNING** " << m_TAG <<
"::FillVirial(const vector<double> & ri): size of ri does not match number of hadrons in the list" << std::endl;
77 m_Virial.resize(m_TPS->Particles().size());
78 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
79 m_Virial[i].resize(m_TPS->Particles().size());
80 for (
int j = 0; j < m_TPS->ComponentsNumber(); ++j)
85 vector< vector<double> > fVirialTmp =
m_Virial;
86 for(
int i=0;i<m_TPS->ComponentsNumber();++i)
87 for(
int j=0;j<m_TPS->ComponentsNumber();++j) {
88 if (i==j)
m_Virial[i][j] = fVirialTmp[i][j];
89 else if ((fVirialTmp[i][i] + fVirialTmp[j][j]) > 0.0)
m_Virial[i][j] = 2. * fVirialTmp[i][j] * fVirialTmp[i][i] / (fVirialTmp[i][i] + fVirialTmp[j][j]);
92 m_VirialdT = vector< vector<double> >(m_TPS->Particles().size(), vector<double>(m_TPS->Particles().size(),0.));
93 m_AttrdT = vector< vector<double> >(m_TPS->Particles().size(), vector<double>(m_TPS->Particles().size(), 0.));
100 if (bij.size() != m_TPS->Particles().size()) {
101 std::cerr <<
"**WARNING** " << m_TAG <<
"::FillVirialEV(const vector<double> & bij): size of bij does not match number of hadrons in the list" << std::endl;
111 if (aij.size() != m_TPS->Particles().size()) {
112 std::cerr <<
"**WARNING** " << m_TAG <<
"::FillAttraction(const vector<double> & aij): size of aij does not match number of hadrons in the list" << std::endl;
122 m_Virial = vector< vector<double> >(m_TPS->Particles().size(), vector<double>(m_TPS->Particles().size(), 0.));
123 m_Attr = vector< vector<double> >(m_TPS->Particles().size(), vector<double>(m_TPS->Particles().size(), 0.));
125 ifstream fin(filename.c_str());
128 fin.getline(cc, 2000);
129 string tmp = string(cc);
131 if (elems.size() < 1)
133 istringstream iss(elems[0]);
134 long long pdgid1, pdgid2;
136 if (iss >> pdgid1 >> pdgid2 >> b) {
139 int ind1 = m_TPS->PdgToId(pdgid1);
140 int ind2 = m_TPS->PdgToId(pdgid2);
141 if (ind1 != -1 && ind2 != -1) {
154 ofstream fout(filename.c_str());
155 fout <<
"# List of the van dar Waals interaction parameters to be used in the QvdW-HRG model"
157 fout <<
"# Only particle pairs with a non-zero QvdW interaction are listed here"
164 fout <<
"#" <<
" " <<
"pdg_i"
166 <<
" " <<
"b_{ij}[fm^3]"
167 <<
" " <<
"a_{ij}[GeV*fm^3]"
169 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
170 for (
int j = 0; j < m_TPS->ComponentsNumber(); ++j) {
177 fout <<
" " << m_TPS->Particle(i).PdgId();
178 fout <<
" " << m_TPS->Particle(j).PdgId();
180 fout <<
" " <<
m_Attr[i][j];
190 m_Virial = vector< vector<double> >(m_TPS->Particles().size(), vector<double>(m_TPS->Particles().size(), 0.));
191 m_Attr = vector< vector<double> >(m_TPS->Particles().size(), vector<double>(m_TPS->Particles().size(), 0.));
192 m_VirialdT = vector< vector<double> >(m_TPS->Particles().size(), vector<double>(m_TPS->Particles().size(), 0.));
193 m_AttrdT = vector< vector<double> >(m_TPS->Particles().size(), vector<double>(m_TPS->Particles().size(), 0.));
199 vector<double> ns(m_densities.size(), 0.);
200 for (
size_t i = 0; i < m_densities.size(); ++i)
208 int NN = m_densities.size();
211 MatrixXd densMatrix(NNdmu, NNdmu);
212 VectorXd solVector(NNdmu), xVector(NNdmu);
214 for (
int i = 0; i < NNdmu; ++i) {
215 for (
int j = 0; j < NNdmu; ++j) {
216 densMatrix(i, j) = 0.;
218 densMatrix(i, j) += 1.;
226 PartialPivLU<MatrixXd> decomp(densMatrix);
228 for (
int kp = 0; kp < NNdmu; ++kp) {
236 solVector = decomp.solve(xVector);
238 vector<double> ntildek(NNdmu, 0.);
239 for (
int i = 0; i < NNdmu; ++i)
240 ntildek[i] = solVector[i];
242 vector<double> np(m_densities.size(), 0.);
243 for (
int i = 0; i < NN; ++i) {
245 for (
int k = 0; k < NNdmu; ++k) {
248 np[i] = (1. - np[i]) * ns[i];
256 map< vector<double>,
int> MapVDW;
258 int NN = m_densities.size();
266 for (
int i = 0; i < NN; ++i) {
267 vector<double> VDWParam(0);
268 for (
int j = 0; j < NN; ++j) {
271 for (
int j = 0; j < NN; ++j) {
275 if (MapVDW.count(VDWParam) == 0) {
276 MapVDW[VDWParam] = tind;
293 int NN = m_densities.size();
296 vector<double> dmuscur(NNdmu, 0.);
297 for (
int i = 0; i < NNdmu; ++i)
300 BroydenEquationsVDW eqs(
this);
301 BroydenJacobianVDW jac(
this);
303 BroydenSolutionCriteriumVDW crit(
this);
305 dmuscur = broydn.
Solve(dmuscur, &crit);
313 vector<double> ret(NN);
314 for (
int i = 0; i < NN; ++i)
321 vector<double> csol(m_densities.size(), 0.);
326 double dmu = (muBmax - muBmin) / iters;
327 vector<double> curmust(m_densities.size(), 0.);
329 for(
int isol = 0; isol < iters; ++isol) {
330 double tmu = muBmin + (0.5 + isol) * dmu;
331 for(
size_t j = 0; j < curmust.size(); ++j) {
332 if (m_Parameters.muB != 0.0)
333 curmust[j] = m_Chem[j] + (tmu - m_Parameters.muB) * m_Chem[j] / m_Parameters.muB;
336 if (m_TPS->Particles()[j].Statistics()==-1 && curmust[j] > m_TPS->Particles()[j].Mass())
337 curmust[j] = 0.98 * m_TPS->Particles()[j].Mass();
343 for(
size_t i = 0; i < sol.size(); ++i)
344 if (sol[i] != sol[i]) fl =
false;
348 for(
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
351 int NN = m_densities.size();
353 MatrixXd densMatrix(NN, NN);
354 VectorXd solVector(NN), xVector(NN);
356 for(
int i=0;i<NN;++i)
357 for(
int j=0;j<NN;++j) {
359 if (i==j) densMatrix(i,j) += 1.;
362 PartialPivLU<MatrixXd> decomp(densMatrix);
364 for(
int i=0;i<NN;++i)
366 solVector = decomp.solve(xVector);
367 for(
int i=0;i<NN;++i)
368 m_densities[i] = solVector[i];
371 for(
size_t i=0;i<m_densities.size();++i)
373 for(
size_t i=0;i<m_densities.size();++i)
374 for(
size_t j=0;j<m_densities.size();++j)
375 tP += -
m_Attr[i][j] * m_densities[i] * m_densities[j];
377 if (!solved || tP > Psol) {
392 vector<double> muStarInit =
m_MuStar;
394 for(
size_t i=0;i<muStarInit.size();++i) {
395 if (m_TPS->Particles()[i].Statistics()==-1 && muStarInit[i] > m_TPS->Particles()[i].Mass())
396 muStarInit[i] = 0.98 * m_TPS->Particles()[i].Mass();
414 double dmu = (muBmax - muBmin) / iters;
415 vector<double> curmust(m_densities.size(), 0.);
417 for (
int isol = 0; isol < iters; ++isol) {
418 double tmu = muBmin + (0.5 + isol) * dmu;
419 for (
size_t j = 0; j < curmust.size(); ++j) {
420 if (m_Parameters.muB != 0.0)
421 curmust[j] = m_Chem[j] + (tmu - m_Parameters.muB) * m_Chem[j] / m_Parameters.muB;
424 if (m_TPS->Particles()[j].Statistics() == -1 && curmust[j] > m_TPS->Particles()[j].Mass())
425 curmust[j] = 0.98 * m_TPS->Particles()[j].Mass();
432 for (
size_t i = 0; i < sol.size() && valid; ++i)
433 if (sol[i] != sol[i])
447 CalculatePrimordialDensitiesNew();
451 void ThermalModelVDW::CalculatePrimordialDensitiesOld() {
452 m_FluctuationsCalculated =
false;
457 int NN = m_densities.size();
492 clock_t tbeg = clock();
496 vector<double> muStarInit =
m_MuStar;
498 for (
size_t i = 0; i<muStarInit.size(); ++i) {
499 if (m_TPS->Particles()[i].Statistics() == -1 && muStarInit[i] > m_TPS->Particles()[i].Mass())
500 muStarInit[i] = 0.98 * m_TPS->Particles()[i].Mass();
508 printf(
"Solution time = %lf ms\n", (clock() - tbeg) / (
double)(CLOCKS_PER_SEC) * 1.e3);
512 for(
int i=0;i<m_TPS->ComponentsNumber();++i)
515 MatrixXd densMatrix(NN, NN);
516 VectorXd solVector(NN), xVector(NN);
518 for(
int i=0;i<NN;++i)
519 for(
int j=0;j<NN;++j) {
521 if (i==j) densMatrix(i,j) += 1.;
524 PartialPivLU<MatrixXd> decomp(densMatrix);
527 solVector = decomp.solve(xVector);
528 for(
int i=0;i<NN;++i) m_densities[i] = solVector[i];
532 solVector = decomp.solve(xVector);
534 for(
int i=0;i<NN;++i)
m_scaldens[i] = solVector[i];
542 void ThermalModelVDW::CalculatePrimordialDensitiesNew() {
543 m_FluctuationsCalculated =
false;
548 int NN = m_densities.size();
550 clock_t tbeg = clock();
556 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
562 MatrixXd densMatrix(NNdmu, NNdmu);
563 VectorXd solVector(NNdmu), xVector(NNdmu);
565 for (
int i = 0; i < NNdmu; ++i) {
566 for (
int j = 0; j < NNdmu; ++j) {
567 densMatrix(i, j) = 0.;
569 densMatrix(i, j) += 1.;
577 PartialPivLU<MatrixXd> decomp(densMatrix);
579 for (
int kp = 0; kp < NNdmu; ++kp) {
586 solVector = decomp.solve(xVector);
588 vector<double> ntildek(NNdmu, 0.);
589 for (
int i = 0; i < NNdmu; ++i)
590 ntildek[i] = solVector[i];
593 for (
int i = 0; i < NN; ++i) {
595 for (
int k = 0; k < NNdmu; ++k) {
608 vector<double> ret(order + 1, 0.);
611 for(
size_t i=0;i<m_densities.size();++i)
612 ret[0] += chgs[i] * m_densities[i];
619 if (order<2)
return ret;
621 int NN = m_densities.size();
622 MatrixXd densMatrix(2*NN, 2*NN);
623 VectorXd solVector(2*NN), xVector(2*NN);
625 vector<double> chi2id(m_densities.size());
626 for(
int i=0;i<NN;++i)
628 chi2id[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth,
m_MuStar[i]);
630 for(
int i=0;i<NN;++i)
631 for(
int j=0;j<NN;++j) {
633 if (i==j) densMatrix(i,j) += 1.;
636 for(
int i=0;i<NN;++i)
637 for(
int j=0;j<NN;++j)
638 densMatrix(i,NN+j) = 0.;
640 for(
int i=0;i<NN;++i) {
641 densMatrix(i,NN+i) = 0.;
642 for(
int k=0;k<NN;++k) {
643 densMatrix(i,NN+i) +=
m_Virial[k][i] * m_densities[k];
645 densMatrix(i,NN+i) = (densMatrix(i,NN+i) - 1.) * chi2id[i] * pow(
xMath::GeVtoifm(), 3);
648 for(
int i=0;i<NN;++i)
649 for(
int j=0;j<NN;++j) {
653 for(
int i=0;i<NN;++i)
654 for(
int j=0;j<NN;++j) {
656 if (i==j) densMatrix(NN+i,NN+j) += 1.;
660 PartialPivLU<MatrixXd> decomp(densMatrix);
663 vector<double> dni(NN, 0.), dmus(NN, 0.);
665 for(
int i=0;i<NN;++i) {
667 xVector[NN+i] = chgs[i];
670 solVector = decomp.solve(xVector);
672 for(
int i=0;i<NN;++i) {
673 dni[i] = solVector[i];
674 dmus[i] = solVector[NN+i];
677 for(
int i=0;i<NN;++i)
678 ret[1] += chgs[i] * dni[i];
685 if (order<3)
return ret;
688 vector<double> d2ni(NN, 0.), d2mus(NN, 0.);
690 vector<double> chi3id(m_densities.size());
691 for(
int i=0;i<NN;++i)
693 chi3id[i] = m_TPS->Particles()[i].chiDimensionfull(3, m_Parameters, m_UseWidth,
m_MuStar[i]);
695 for(
int i=0;i<NN;++i) {
699 for(
int j=0;j<NN;++j) tmp +=
m_Virial[j][i] * dni[j];
704 for(
int j=0;j<NN;++j) tmp +=
m_Virial[j][i] * m_densities[j];
705 tmp = -(tmp - 1.) * chi3id[i] * pow(
xMath::GeVtoifm(), 3) * dmus[i] * dmus[i];
708 for(
int i=0;i<NN;++i) {
717 solVector = decomp.solve(xVector);
719 for(
int i=0;i<NN;++i) {
720 d2ni[i] = solVector[i];
721 d2mus[i] = solVector[NN+i];
724 for(
int i=0;i<NN;++i)
725 ret[2] += chgs[i] * d2ni[i];
733 if (order<4)
return ret;
736 vector<double> d3ni(NN, 0.), d3mus(NN, 0.);
738 vector<double> chi4id(m_densities.size());
739 for (
int i = 0; i < NN; ++i)
741 chi4id[i] = m_TPS->Particles()[i].chiDimensionfull(4, m_Parameters, m_UseWidth,
m_MuStar[i]);
743 vector<double> dnis(NN, 0.);
744 for(
int i=0;i<NN;++i) {
748 vector<double> d2nis(NN, 0.);
749 for(
int i=0;i<NN;++i) {
754 for(
int i=0;i<NN;++i) {
758 for(
int j=0;j<NN;++j) tmp +=
m_Virial[j][i] * dni[j];
759 tmp = -3. * tmp * d2nis[i];
763 for(
int j=0;j<NN;++j) tmp +=
m_Virial[j][i] * d2ni[j];
764 tmp = -3. * tmp * dnis[i];
768 for(
int j=0;j<NN;++j) tmps +=
m_Virial[j][i] * m_densities[j];
770 tmp = -(tmps - 1.) * chi3id[i] * pow(
xMath::GeVtoifm(), 3) * d2mus[i] * 3. * dmus[i];
773 tmp = -(tmps - 1.) * chi4id[i] * pow(
xMath::GeVtoifm(), 3) * dmus[i] * dmus[i] * dmus[i];
776 for(
int i=0;i<NN;++i) {
780 for(
int j=0;j<NN;++j) tmp += -2. *
m_Virial[i][j] * d2mus[j] * dnis[j];
781 xVector[NN+i] += tmp;
784 for(
int j=0;j<NN;++j) tmp += -
m_Virial[i][j] * dmus[j] * d2nis[j];
785 xVector[NN+i] += tmp;
788 solVector = decomp.solve(xVector);
790 for(
int i=0;i<NN;++i) {
791 d3ni[i] = solVector[i];
792 d3mus[i] = solVector[NN+i];
795 for(
int i=0;i<NN;++i)
796 ret[3] += chgs[i] * d3ni[i];
805 if (order<1)
return m_chi;
807 vector<double> chgs(m_densities.size());
811 for(
size_t i=0;i<chgs.size();++i)
812 chgs[i] = m_TPS->Particles()[i].BaryonCharge();
814 for(
int i=0;i<order;++i)
m_chi[i][0] = chis[i];
817 for(
size_t i=0;i<chgs.size();++i)
818 chgs[i] = m_TPS->Particles()[i].ElectricCharge();
820 for(
int i=0;i<order;++i)
m_chi[i][1] = chis[i];
823 for(
size_t i=0;i<chgs.size();++i)
824 chgs[i] = m_TPS->Particles()[i].Strangeness();
826 for(
int i=0;i<order;++i)
m_chi[i][2] = chis[i];
829 for(
size_t i=0;i<chgs.size();++i)
830 chgs[i] = m_TPS->Particles()[i].ArbitraryCharge();
832 for(
int i=0;i<order;++i)
m_chiarb[i] = chis[i];
839 int NN = m_densities.size();
841 m_PrimCorrel.resize(NN);
842 for (
int i = 0; i < NN; ++i)
843 m_PrimCorrel[i].resize(NN);
844 m_dmusdmu = m_PrimCorrel;
845 m_TotalCorrel = m_PrimCorrel;
847 MatrixXd densMatrix(2 * NN, 2 * NN);
848 VectorXd solVector(2 * NN), xVector(2 * NN);
850 vector<double> chi2id(m_densities.size());
851 for (
int i = 0; i<NN; ++i)
853 chi2id[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth,
m_MuStar[i]);
855 for (
int i = 0; i<NN; ++i)
856 for (
int j = 0; j<NN; ++j) {
858 if (i == j) densMatrix(i, j) += 1.;
861 for (
int i = 0; i<NN; ++i)
862 for (
int j = 0; j<NN; ++j)
863 densMatrix(i, NN + j) = 0.;
865 for (
int i = 0; i<NN; ++i) {
866 densMatrix(i, NN + i) = 0.;
867 for (
int k = 0; k<NN; ++k) {
868 densMatrix(i, NN + i) +=
m_Virial[k][i] * m_densities[k];
871 densMatrix(i, NN + i) = (densMatrix(i, NN + i) - 1.) * chi2id[i] * pow(
xMath::GeVtoifm(), 3);
874 for (
int i = 0; i<NN; ++i)
875 for (
int j = 0; j<NN; ++j) {
879 for (
int i = 0; i<NN; ++i)
880 for (
int j = 0; j<NN; ++j) {
882 if (i == j) densMatrix(NN + i, NN + j) += 1.;
885 PartialPivLU<MatrixXd> decomp(densMatrix);
887 for (
int k = 0; k < NN; ++k) {
888 vector<double> dni(NN, 0.), dmus(NN, 0.);
890 for (
int i = 0; i < NN; ++i) {
892 xVector[NN + i] =
static_cast<int>(i == k);
895 solVector = decomp.solve(xVector);
897 for (
int i = 0; i < NN; ++i) {
898 dni[i] = solVector[i];
899 dmus[i] = solVector[NN + i];
900 m_dmusdmu[i][k] = dmus[i];
903 for (
int j = 0; j < NN; ++j) {
904 m_PrimCorrel[j][k] = dni[j];
908 for (
int i = 0; i < NN; ++i) {
909 m_wprim[i] = m_PrimCorrel[i][i];
910 if (m_densities[i] > 0.) m_wprim[i] *= m_Parameters.T / m_densities[i];
911 else m_wprim[i] = 1.;
912 if (m_wprim[i] != m_wprim[i]) m_wprim[i] = 1.;
915 m_TwoParticleCorrelationsCalculated =
true;
926 for (
size_t i = 0; i < m_wprim.size(); ++i) {
933 m_FluctuationsCalculated =
true;
935 if (IsTemperatureDerivativesCalculated()) {
936 m_TemperatureDerivativesCalculated =
false;
942 if (!IsTemperatureDerivativesCalculated())
948 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
950 double fi = 1., dvi = 0.;
952 for (
int k = 0; k < m_TPS->ComponentsNumber(); ++k) {
955 fi -=
m_Virial[k][i] * m_densities[k];
966 ret += dvi * m_dndT[i];
973 if (!IsTemperatureDerivativesCalculated())
979 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
983 for (
int k = 0; k < m_TPS->ComponentsNumber(); ++k) {
986 fi -=
m_Virial[k][i] * m_densities[k];
1000 if (!IsCalculated())
1003 int N = m_TPS->ComponentsNumber();
1004 m_dndT = vector<double>(N, 0.);
1005 m_dmusdT = vector<double>(N, 0.);
1006 m_PrimChi2sdT = vector<vector<double>>(N, vector<double>(N, 0.));
1008 double T = m_Parameters.T;
1010 vector<double> nids(N, 0.), dniddTs(N, 0.), chi2ids(N, 0.), dchi2idsdT(N, 0.), chi3ids(N, 0.);
1011 for (
int i = 0; i < N; ++i) {
1014 chi2ids[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth,
m_MuStar[i]) *
xMath::GeVtoifm3();
1022 chi3ids[i] = m_TPS->Particles()[i].chiDimensionfull(3, m_Parameters, m_UseWidth,
m_MuStar[i]) *
xMath::GeVtoifm3();
1025 int NN = m_densities.size();
1027 MatrixXd densMatrix(2 * NN, 2 * NN);
1028 VectorXd solVector(2 * NN), xVector(2 * NN);
1032 for (
int i = 0; i<NN; ++i)
1033 for (
int j = 0; j<NN; ++j) {
1035 if (i == j) densMatrix(i, j) += 1.;
1038 for (
int i = 0; i<NN; ++i)
1039 for (
int j = 0; j<NN; ++j)
1040 densMatrix(i, NN + j) = 0.;
1042 for (
int i = 0; i<NN; ++i) {
1043 densMatrix(i, NN + i) = 0.;
1044 for (
int k = 0; k<NN; ++k) {
1045 densMatrix(i, NN + i) +=
m_Virial[k][i] * m_densities[k];
1047 densMatrix(i, NN + i) = (densMatrix(i, NN + i) - 1.) * chi2ids[i];
1050 for (
int i = 0; i<NN; ++i)
1051 for (
int j = 0; j<NN; ++j) {
1052 densMatrix(NN + i, j) = -(
m_Attr[i][j] +
m_Attr[j][i]);
1055 for (
int i = 0; i<NN; ++i)
1056 for (
int j = 0; j<NN; ++j) {
1058 if (i == j) densMatrix(NN + i, NN + j) += 1.;
1061 PartialPivLU<MatrixXd> decomp(densMatrix);
1063 for(
int i=0;i<NN;++i) {
1065 for(
int k=0;k<NN;++k) {
1066 fi -=
m_Virial[k][i] * m_densities[k];
1068 xVector[i] = fi * dniddTs[i];
1069 xVector[NN + i] = 0.;
1070 for(
int j = 0; j < NN; ++j) {
1075 solVector = decomp.solve(xVector);
1077 for(
int i=0;i<NN;++i) {
1078 m_dndT[i] = solVector[i];
1079 m_dmusdT[i] = solVector[NN+i];
1084 if (IsSusceptibilitiesCalculated()) {
1102 for (
int j = 0; j < NN; ++j) {
1107 for (
int i = 0; i < NN; ++i) {
1127 vector<double> dfik = vector<double>(NN, 0.);
1129 for (
int k = 0; k < NN; ++k) {
1131 fi -=
m_Virial[k][i] * m_densities[k];
1136 for (
int k = 0; k < NN; ++k) {
1137 a1 += m_PrimCorrel[k][j] * dfik[k] * (dniddTs[i] + chi2ids[i] * m_dmusdT[i]);
1138 a1 += m_dmusdmu[i][j] * dfik[k] * m_dndT[k] * chi2ids[i];
1140 a1 += m_dmusdmu[i][j] * fi * (dchi2idsdT[i] + chi3ids[i] * m_dmusdT[i]);
1145 for (
int k = 0; k < NN; ++k) {
1146 a2 += m_dmusdmu[k][j] * (-
m_Virial[i][k]) * (dniddTs[k] + chi2ids[k] * m_dmusdT[k]);
1148 xVector[i + NN] = a2;
1151 solVector = decomp.solve(xVector);
1153 for (
int i = 0; i < NN; ++i) {
1159 m_PrimChi2sdT[i][j] = 0.;
1163 m_TemperatureDerivativesCalculated =
true;
1167 m_TemperatureDerivativesCalculated =
true;
1175 for(
size_t i=0;i<m_densities.size();++i)
1176 if (m_densities[i]>0.)
1178 for(
size_t i=0;i<m_densities.size();++i)
1179 for(
size_t j=0;j<m_densities.size();++j)
1180 ret += -
m_Attr[i][j] * m_densities[i] * m_densities[j];
1183 for (
size_t i = 0; i < m_densities.size(); ++i) {
1185 for (
size_t j = 0; j < m_densities.size(); ++j) {
1186 ret += -tPid * m_densities[j] * m_Parameters.T *
m_VirialdT[j][i];
1187 ret += m_Parameters.T *
m_AttrdT[i][j] * m_densities[i] * m_densities[j];
1198 for(
size_t i=0;i<m_densities.size();++i)
1199 if (m_densities[i]>0.)
1203 for (
size_t i = 0; i < m_densities.size(); ++i) {
1205 for (
size_t j = 0; j < m_densities.size(); ++j) {
1206 ret += -tPid * m_densities[j] *
m_VirialdT[j][i];
1207 ret +=
m_AttrdT[i][j] * m_densities[i] * m_densities[j];
1218 for(
size_t i=0;i<m_densities.size();++i)
1220 for(
size_t i=0;i<m_densities.size();++i)
1221 for(
size_t j=0;j<m_densities.size();++j)
1222 ret += -
m_Attr[i][j] * m_densities[i] * m_densities[j];
1235 if (
id >= 0. &&
id <
static_cast<int>(
m_Virial.size()))
1243 if (i<0 || i >=
static_cast<int>(
m_Virial.size()) || j < 0 || j >=
static_cast<int>(
m_Virial.size()))
1250 if (i<0 || i >=
static_cast<int>(
m_Attr.size()) || j < 0 || j >=
static_cast<int>(
m_Attr.size()))
1257 if (i<0 || i >=
static_cast<int>(
m_VirialdT.size()) || j < 0 || j >=
static_cast<int>(
m_VirialdT.size()))
1264 if (i<0 || i >=
static_cast<int>(
m_AttrdT.size()) || j < 0 || j >=
static_cast<int>(
m_AttrdT.size()))
1269 std::vector<double> ThermalModelVDW::BroydenEquationsVDW::Equations(
const std::vector<double>& x)
1271 int NN = m_THM->Densities().size();
1272 vector<double> Ps(NN, 0.);
1273 for (
int i = 0; i < NN; ++i) {
1274 Ps[i] = m_THM->TPS()->Particles()[i].Density(m_THM->
Parameters(),
1281 vector<double> ns(NN, 0.);
1282 for (
int i = 0; i < NN; ++i) {
1283 ns[i] = m_THM->TPS()->Particles()[i].Density(m_THM->
Parameters(),
1290 vector<double> np = m_THM->ComputeNp(x, ns);
1293 vector<double> ret(
m_N, 0.);
1294 for (
size_t i = 0; i < ret.size(); ++i) {
1296 for (
int j = 0; j < NN; ++j)
1297 ret[i] += m_THM->VirialCoefficient(m_THM->m_MapFromdMuStar[i], j) * Ps[j]
1298 - (m_THM->AttractionCoefficient(m_THM->m_MapFromdMuStar[i], j)
1299 + m_THM->AttractionCoefficient(j, m_THM->m_MapFromdMuStar[i])) * np[j];
1304 std::vector<double> ThermalModelVDW::BroydenJacobianVDW::Jacobian(
const std::vector<double>& x)
1306 int NN = m_THM->m_densities.size();
1307 int NNdmu = m_THM->m_MapFromdMuStar.size();
1309 bool attrfl =
false;
1310 for (
int i = 0; i < NN; ++i) {
1311 for (
int j = 0; j < NN; ++j) {
1312 if (m_THM->AttractionCoefficient(i, j) != 0.0) {
1320 MatrixXd densMatrix(NNdmu, NNdmu);
1321 VectorXd solVector(NNdmu), xVector(NNdmu);
1323 std::vector<double> ret(NNdmu*NNdmu, 0.);
1325 vector<double> Ps(NN, 0.);
1326 for (
int i = 0; i<NN; ++i)
1327 Ps[i] = m_THM->TPS()->Particles()[i].Density(m_THM->Parameters(),
1330 m_THM->ChemicalPotential(i) + x[m_THM->m_MapTodMuStar[i]]
1333 vector<double> ns(NN, 0.);
1334 for (
int i = 0; i<NN; ++i)
1335 ns[i] = m_THM->TPS()->Particles()[i].Density(m_THM->Parameters(),
1338 m_THM->ChemicalPotential(i) + x[m_THM->m_MapTodMuStar[i]]
1341 vector<double> chi2s(NN, 0.);
1342 for (
int i = 0; i<NN; ++i)
1343 chi2s[i] = m_THM->TPS()->Particles()[i].chiDimensionfull(2, m_THM->Parameters(),
1345 m_THM->ChemicalPotential(i) + x[m_THM->m_MapTodMuStar[i]]
1348 for (
int i = 0; i < NNdmu; ++i) {
1349 for (
int j = 0; j < NNdmu; ++j) {
1350 densMatrix(i, j) = 0.;
1352 densMatrix(i, j) += 1.;
1354 for (
size_t m = 0; m < m_THM->m_dMuStarIndices[i].size(); ++m) {
1355 densMatrix(i, j) += m_THM->m_Virial[m_THM->m_MapFromdMuStar[j]][m_THM->m_dMuStarIndices[i][m]] * ns[m_THM->m_dMuStarIndices[i][m]];
1360 PartialPivLU<MatrixXd> decomp(densMatrix);
1363 for (
int kp = 0; kp < NNdmu; ++kp) {
1365 for (
size_t m = 0; m < m_THM->m_dMuStarIndices[kp].size(); ++m) {
1366 xVector[kp] += ns[m_THM->m_dMuStarIndices[kp][m]];
1371 solVector = decomp.solve(xVector);
1373 vector<double> ntildek(NNdmu, 0.);
1374 for (
int i = 0; i < NNdmu; ++i)
1375 ntildek[i] = solVector[i];
1377 vector<double> np(NN, 0.);
1378 for (
int i = 0; i < NN; ++i) {
1380 for (
int k = 0; k < NNdmu; ++k) {
1381 np[i] += m_THM->m_Virial[m_THM->m_MapFromdMuStar[k]][i] * solVector[k];
1383 np[i] = (1. - np[i]) * ns[i];
1386 for (
int kp = 0; kp < NNdmu; ++kp) {
1389 for (
int l = 0; l < NNdmu; ++l) {
1391 for (
size_t m = 0; m < m_THM->m_dMuStarIndices[l].size(); ++m) {
1392 int ti = m_THM->m_dMuStarIndices[l][m];
1393 if (m_THM->m_MapTodMuStar[ti] != kp)
1398 tmps = np[ti] / ns[ti];
1403 solVector = decomp.solve(xVector);
1404 for (
int i = 0; i < NNdmu; ++i)
1405 if (solVector[i] > 1.) solVector[i] = 1.;
1408 vector<double> dnjdmukp(NN, 0.);
1410 for (
int j = 0; j < NN; ++j) {
1411 for (
int kk = 0; kk < NNdmu; ++kk) {
1412 dnjdmukp[j] += -m_THM->m_Virial[m_THM->m_MapFromdMuStar[kk]][j] * solVector[kk] * ns[j];
1415 if (m_THM->m_MapTodMuStar[j] == kp) {
1418 tmps = np[j] / ns[j];
1425 for (
int k = 0; k < NNdmu; ++k) {
1427 ret[k*NNdmu + kp] += 1.;
1428 for (
size_t m = 0; m < m_THM->m_dMuStarIndices[kp].size(); ++m) {
1429 int tj = m_THM->m_dMuStarIndices[kp][m];
1430 ret[k*NNdmu + kp] += m_THM->m_Virial[m_THM->m_MapFromdMuStar[k]][tj] * ns[tj];
1434 for (
int j = 0; j < NN; ++j) {
1435 ret[k*NNdmu + kp] += -(m_THM->m_Attr[m_THM->m_MapFromdMuStar[k]][j] + m_THM->m_Attr[j][m_THM->m_MapFromdMuStar[k]]) * dnjdmukp[j];
1446 bool ThermalModelVDW::BroydenSolutionCriteriumVDW::IsSolved(
const std::vector<double>& x,
const std::vector<double>& f,
const std::vector<double>& xdelta)
const
1448 if (xdelta.size() == x.size()) {
1449 double maxdiff = 0.;
1450 for (
size_t i = 0; i < xdelta.size(); ++i) {
1451 maxdiff = std::max(maxdiff, fabs(xdelta[i]));
1452 maxdiff = std::max(maxdiff, fabs(f[i]));
1454 return (maxdiff < m_MaximumError);
1466 for (
int i1 = 0; i1 < model->TPS()->Particles().size(); ++i1) {
1467 for (
int i2 = 0; i2 < model->TPS()->Particles().size(); ++i2) {
Contains some functions to deal with excluded volumes.
map< string, double > params
virtual bool IsSolved(const std::vector< double > &x, const std::vector< double > &f, const std::vector< double > &xdelta=std::vector< double >()) const
int m_N
The number of equations.
Class implementing the Broyden method to solve a system of non-linear equations.
double MaxDifference() const
virtual std::vector< double > Solve(const std::vector< double > &x0, BroydenSolutionCriterium *solcrit=NULL, int max_iterations=MAX_ITERS)
int MaxIterations() const
Abstract base class for an HRG model implementation.
virtual void CalculateSusceptibilityMatrix()
Calculates the conserved charges susceptibility matrix.
virtual void ChangeTPS(ThermalParticleSystem *TPS)
Change the particle list.
virtual void CalculateParticleChargeCorrelationMatrix()
Calculates the matrix of correlators between primordial (and also final) particle numbers and conserv...
virtual void SetVirial(int, int, double)
Set the excluded volume coefficient .
virtual void FillChemicalPotentials()
Sets the chemical potentials of all particles.
@ QvdW
Quantum van der Waals model.
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 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 ¶ms=ThermalModelParameters())
Construct a new ThermalModelBase object.
bool UseWidth() const
Whether finite resonance widths are considered.
virtual void CalculateDensities()
Calculates the primordial and total (after decays) densities of all species.
virtual void SetAttraction(int, int, double)
Set the vdW mean field attraction coefficient .
const ThermalModelParameters & Parameters() const
@ GCE
Grand canonical ensemble.
virtual void CalculateTwoParticleFluctuationsDecays()
Computes particle number correlations and fluctuations for all final-state particles which are marked...
virtual void SetChemicalPotentials(const std::vector< double > &chem=std::vector< double >(0))
Sets the chemical potentials of all particles.
std::vector< double > m_chiarb
virtual double CalculateEnergyDensityDerivativeT()
virtual void WriteInteractionParameters(const std::string &filename)
Write the QvdW interaction parameters to a file.
double VirialCoefficientdT(int i, int j) const
The temperature derivative of the eigenvolume parameter .
virtual void ChangeTPS(ThermalParticleSystem *TPS)
Change the particle list.
bool m_VDWComponentMapCalculated
Whether the mapping to components with the same VDW parameters has been calculated.
virtual std::vector< double > SearchSingleSolution(const std::vector< double > &muStarInit)
Uses the Broyden method with a provided initial guess to determine the shifted chemical potentials by...
virtual double MuShift(int id) const
The shift in the chemical potential of particle species i due to the QvdW interactions.
std::vector< double > m_DensitiesId
Vector of ideal gas densities with shifted chemical potentials.
virtual void ReadInteractionParameters(const std::string &filename)
Reads the QvdW interaction parameters from a file.
void FillVirialEV(const std::vector< std::vector< double > > &bij=std::vector< std::vector< double > >(0))
Same as FillVirial() but uses the matrix of excluded-volume coefficients as input instead of radii.
double AttractionCoefficient(int i, int j) const
QvdW mean field attraction coefficient .
virtual double CalculateEntropyDensity()
std::vector< int > m_MapTodMuStar
void CalculateVDWComponentsMap()
Partitions particles species into sets that have identical VDW parameters.
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 double CalculateEnergyDensity()
void FillChemicalPotentials()
Sets the chemical potentials of all particles.
virtual double CalculatePressure()
std::vector< std::vector< double > > m_AttrdT
void CalculateTwoParticleCorrelations()
Computes the fluctuations and correlations of the primordial particle numbers.
bool m_TemperatureDependentAB
std::vector< double > ComputeNp(const std::vector< double > &dmustar)
std::vector< double > SearchFirstSolution(int iters=50)
Try different initial guesses and return the first valid solution found.
virtual void FillAttraction(const std::vector< std::vector< double > > &aij=std::vector< std::vector< double > >(0))
double AttractionCoefficientdT(int i, int j) const
The temperature derivative of the QvdW attraction parameter .
std::vector< std::vector< int > > m_dMuStarIndices
virtual ~ThermalModelVDW(void)
Destroy the ThermalModelVDW object.
virtual void CalculateTemperatureDerivatives()
Computes the temperature derivatives of densities, shifted chemical potentials, and primordial hadron...
std::vector< int > m_MapFromdMuStar
std::vector< std::vector< double > > m_Virial
std::vector< double > m_MuStar
Vector of the shifted chemical potentials.
void CalculateFluctuations()
Computes the fluctuation observables.
virtual double ParticleScalarDensity(int part)
std::vector< double > m_scaldens
Vector of scalar densities. Not used.
virtual void CalculatePrimordialDensities()
Calculates the primordial densities of all species.
std::vector< std::vector< double > > m_chi
std::vector< std::vector< double > > m_VirialdT
bool m_SearchMultipleSolutions
Whether multiple solutions are considered.
ThermalModelVDW(ThermalParticleSystem *TPS_, const ThermalModelParameters ¶ms=ThermalModelParameters())
Construct a new ThermalModelVDW object.
bool m_LastBroydenSuccessFlag
Whether Broyden's method was successfull.
double VirialCoefficient(int i, int j) const
Excluded volume coefficient .
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.
std::vector< std::vector< double > > m_Attr
Matrix of the attractive QvdW coefficients .
std::vector< double > SearchMultipleSolutions(int iters=300)
Uses the Broyden method with different initial guesses to look for different possible solutions of th...
virtual double CalculateEntropyDensityDerivativeT()
Class containing all information about a particle specie.
double Density(const ThermalModelParameters ¶ms, IdealGasFunctions::Quantity type=IdealGasFunctions::ParticleDensity, bool useWidth=0, double mu=0.) const
Computes a specified ideal gas thermodynamic function.
Class containing the particle list.
std::vector< std::string > split(const std::string &s, char delim)
double brr(double r1, double r2)
Computes the symmetric 2nd virial coefficient of the classical hard spheres equation of state from t...
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.
std::vector< std::vector< double > > GetBaryonBaryonInteractionMatrix(const ThermalParticleSystem *TPS, double param)
Returns the matrix of attraction and repulsion parameters for baryon-baryon and antibaryon-antibaryon...
void SetVDWHRGInteractionParameters(ThermalModelBase *model, double a, double b)
Sets vdW interactions for baryon-baryon and antibaryon-antibaryon pairs as in https://arxiv....
Structure containing all thermal parameters of the model.
Contains some extra mathematical functions used in the code.