30 for (
int i = 0; i < 6; ++i)
m_chi[i].resize(3);
35 m_TAG =
"ThermalModelRealGas";
72 for (
size_t i = 0; i <
m_MuStar.size(); ++i)
79 for (
size_t i = 0; i <
m_MuStar.size(); ++i)
85 map< vector<int>,
int> MapComp;
87 int NN = m_densities.size();
95 for (
int i = 0; i < NN; ++i) {
96 vector<int> IntParam(0);
98 IntParam.push_back(0);
100 IntParam.push_back(
m_exvolmod->ComponentIndices()[i]);
102 IntParam.push_back(0);
104 IntParam.push_back(
m_mfmod->ComponentIndices()[i]);
106 if (MapComp.count(IntParam) == 0) {
107 MapComp[IntParam] = tind;
134 int NN = m_densities.size();
137 vector<double> dmuscur(NNdmu, 0.);
138 for (
int i = 0; i < NNdmu; ++i)
141 BroydenEquationsRealGasComponents eqs(
this);
142 BroydenJacobianRealGasComponents jac(
this);
144 BroydenSolutionCriteriumRealGas crit(
this);
146 dmuscur = broydn.
Solve(dmuscur, &crit);
154 vector<double> ret(NN);
155 for (
int i = 0; i < NN; ++i)
163 int NN = m_densities.size();
165 vector<double> dmuscur(NN, 0.);
166 for (
int i = 0; i < NN; ++i)
167 dmuscur[i] = muStarInit[i] - m_Chem[i];
169 BroydenEquationsRealGas eqs(
this);
170 BroydenJacobianRealGas jac(
this);
172 BroydenSolutionCriteriumRealGas crit(
this);
174 dmuscur = broydn.
Solve(dmuscur, &crit);
182 vector<double> ret(NN);
183 for (
int i = 0; i < NN; ++i)
184 ret[i] = m_Chem[i] + dmuscur[i];
190 vector<double> csol(m_densities.size(), 0.);
195 double dmu = (muBmax - muBmin) / iters;
196 vector<double> curmust(m_densities.size(), 0.);
198 for (
int isol = 0; isol < iters; ++isol) {
199 double tmu = muBmin + (0.5 + isol) * dmu;
200 for (
size_t j = 0; j < curmust.size(); ++j) {
201 if (m_Parameters.muB != 0.0)
202 curmust[j] = m_Chem[j] + (tmu - m_Parameters.muB) * m_Chem[j] / m_Parameters.muB;
205 if (m_TPS->Particles()[j].Statistics() == -1 && curmust[j] > m_TPS->Particles()[j].Mass())
206 curmust[j] = 0.98 * m_TPS->Particles()[j].Mass();
212 for (
size_t i = 0; i < sol.size(); ++i)
213 if (sol[i] != sol[i]) fl =
false;
217 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
222 m_mfmod->SetDensities(m_densities);
225 for (
size_t i = 0; i < m_densities.size(); ++i) {
227 for (
size_t j = 0; j < m_densities.size(); ++j) {
228 tfsum += m_densities[j] *
m_exvolmod->df(i, j);
235 for (
size_t i = 0; i < m_densities.size(); ++i)
236 tP +=
m_mfmod->dv(i) * m_densities[i];
238 if (!solved || tP > Psol) {
253 vector<double> muStarInit =
m_MuStar;
255 for (
size_t i = 0; i < muStarInit.size(); ++i) {
256 if (m_TPS->Particles()[i].Statistics() == -1 && muStarInit[i] > m_TPS->Particles()[i].Mass())
257 muStarInit[i] = 0.98 * m_TPS->Particles()[i].Mass();
275 double dmu = (muBmax - muBmin) / iters;
276 vector<double> curmust(m_densities.size(), 0.);
278 for (
int isol = 0; isol < iters; ++isol) {
279 double tmu = muBmin + (0.5 + isol) * dmu;
280 for (
size_t j = 0; j < curmust.size(); ++j) {
281 if (m_Parameters.muB != 0.0)
282 curmust[j] = m_Chem[j] + (tmu - m_Parameters.muB) * m_Chem[j] / m_Parameters.muB;
285 if (m_TPS->Particles()[j].Statistics() == -1 && curmust[j] > m_TPS->Particles()[j].Mass())
286 curmust[j] = 0.98 * m_TPS->Particles()[j].Mass();
293 for (
size_t i = 0; i < sol.size() && valid; ++i)
294 if (sol[i] != sol[i])
308 m_FluctuationsCalculated =
false;
310 int NN = m_densities.size();
314 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
319 m_mfmod->SetDensities(m_densities);
330 vector<double> ret(order + 1, 0.);
333 for (
size_t i = 0; i < m_densities.size(); ++i)
334 ret[0] += chgs[i] * m_densities[i];
341 if (order < 2)
return ret;
343 int NN = m_densities.size();
345 const vector<int>& evinds =
m_exvolmod->ComponentIndices();
346 const vector<int>& evindsfrom =
m_exvolmod->ComponentIndicesFrom();
348 int Nmfcomp =
m_mfmod->ComponentsNumber();
349 const vector<int>& mfinds =
m_mfmod->ComponentIndices();
350 const vector<int>& mfindsfrom =
m_mfmod->ComponentIndicesFrom();
352 MatrixXd densMatrix(2 * NN, 2 * NN);
353 VectorXd solVector(2 * NN), xVector(2 * NN);
355 vector<double> chi2id(m_densities.size()), Ps(m_densities.size());
356 for (
int i = 0; i < NN; ++i) {
359 chi2id[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth,
m_MuStar[i]) * pow(
xMath::GeVtoifm(), 3);
362 vector<double> evc_chi2id(Nevcomp, 0.), evc_Ps(Nevcomp, 0.), evc_ns(Nevcomp, 0.);
363 for (
int i = 0; i < NN; ++i) {
364 evc_Ps[evinds[i]] += Ps[i];
366 evc_chi2id[evinds[i]] += chi2id[i];
369 vector<vector<double>> pkd2fkij(Nevcomp, vector<double>(Nevcomp, 0.));
370 for (
int indi = 0; indi < Nevcomp; ++indi) {
372 int i = evindsfrom[indi];
373 for (
int indj = 0; indj < Nevcomp; ++indj) {
375 int j = evindsfrom[indj];
379 for (
int k = 0; k < Nevcomp; ++k) {
380 pkd2fkij[indi][indj] += evc_Ps[k] *
m_exvolmod->d2f(evindsfrom[k], i, j);
385 for (
int i = 0; i < NN; ++i)
386 for (
int j = 0; j < NN; ++j) {
388 if (i == j) densMatrix(i, j) += 1.;
391 for (
int i = 0; i < NN; ++i)
392 for (
int j = 0; j < NN; ++j)
393 densMatrix(i, NN + j) = 0.;
395 for (
int i = 0; i < NN; ++i) {
396 densMatrix(i, NN + i) = -
m_exvolmod->f(i) * chi2id[i];
399 for (
int i = 0; i < NN; ++i)
400 for (
int j = 0; j < NN; ++j) {
401 densMatrix(NN + i, j) =
m_mfmod->d2v(i, j);
404 densMatrix(NN + i, j) += -pkd2fkij[evinds[i]][evinds[j]];
407 for (
int i = 0; i < NN; ++i)
408 for (
int j = 0; j < NN; ++j) {
410 if (i == j) densMatrix(NN + i, NN + j) += 1.;
413 PartialPivLU<MatrixXd> decomp(densMatrix);
416 vector<double> dni(NN, 0.), dmus(NN, 0.);
418 for (
int i = 0; i < NN; ++i) {
420 xVector[NN + i] = chgs[i];
423 solVector = decomp.solve(xVector);
425 for (
int i = 0; i < NN; ++i) {
426 dni[i] = solVector[i];
427 dmus[i] = solVector[NN + i];
430 for (
int i = 0; i < NN; ++i)
431 ret[1] += chgs[i] * dni[i];
438 if (order < 3)
return ret;
440 vector<double> evc_dn(Nevcomp, 0.), evc_dmus(Nevcomp, 0.), evc_nsdmus(Nevcomp, 0.);
441 for (
int i = 0; i < NN; ++i) {
442 evc_dn[evinds[i]] += dni[i];
443 evc_dmus[evinds[i]] += dmus[i];
447 vector<double> mfc_dn(Nmfcomp, 0.);
448 for (
int i = 0; i < NN; ++i) {
449 mfc_dn[mfinds[i]] += dni[i];
453 vector<double> d2ni(NN, 0.), d2mus(NN, 0.);
455 vector<double> chi3id(m_densities.size());
456 for (
int i = 0; i < NN; ++i)
457 chi3id[i] = m_TPS->Particles()[i].chiDimensionfull(3, m_Parameters, m_UseWidth,
m_MuStar[i]) * pow(
xMath::GeVtoifm(), 3);
460 vector<vector<double>> d2fijkdnk(Nevcomp, vector<double>(Nevcomp, 0.));
461 for (
int indi = 0; indi < Nevcomp; ++indi) {
462 int i = evindsfrom[indi];
463 for (
int indj = 0; indj < Nevcomp; ++indj) {
464 int j = evindsfrom[indj];
468 for (
int indk = 0; indk < Nevcomp; ++indk) {
469 int k = evindsfrom[indk];
470 d2fijkdnk[indi][indj] += evc_dn[indk] *
m_exvolmod->d2f(i, j, k);
475 vector<double> dfikdnk(Nevcomp, 0.);
476 for (
int indi = 0; indi < Nevcomp; ++indi) {
477 int i = evindsfrom[indi];
481 for (
int indk = 0; indk < Nevcomp; ++indk) {
482 int k = evindsfrom[indk];
483 dfikdnk[indi] += evc_dn[indk] *
m_exvolmod->df(i, k);
487 vector<vector<double>> d2fkijnskmusk(Nevcomp, vector<double>(Nevcomp, 0.));
488 for (
int indi = 0; indi < Nevcomp; ++indi) {
489 int i = evindsfrom[indi];
490 for (
int indj = 0; indj < Nevcomp; ++indj) {
491 int j = evindsfrom[indj];
495 for (
int indk = 0; indk < Nevcomp; ++indk) {
496 int k = evindsfrom[indk];
497 d2fkijnskmusk[indi][indj] +=
m_exvolmod->d2f(k, i, j) * evc_nsdmus[indk];
502 vector<vector<double>> pkd3fkijmdnm(Nevcomp, vector<double>(Nevcomp, 0.));
503 for (
int indi = 0; indi < Nevcomp; ++indi) {
504 int i = evindsfrom[indi];
505 for (
int indj = 0; indj < Nevcomp; ++indj) {
506 int j = evindsfrom[indj];
512 for (
int indk = 0; indk < Nevcomp; ++indk) {
513 int k = evindsfrom[indk];
514 for (
int indm = 0; indm < Nevcomp; ++indm) {
515 int m = evindsfrom[indm];
516 pkd3fkijmdnm[indi][indj] += evc_Ps[indk] *
m_exvolmod->d3f(k, i, j, m) * evc_dn[indm];
522 vector<vector<double>> d3vijkdnk(Nmfcomp, vector<double>(Nmfcomp, 0.));
523 for (
int indi = 0; indi < Nmfcomp; ++indi) {
524 int i = mfindsfrom[indi];
525 for (
int indj = 0; indj < Nmfcomp; ++indj) {
526 int j = mfindsfrom[indj];
530 for (
int indk = 0; indk < Nmfcomp; ++indk) {
531 int k = mfindsfrom[indk];
532 d3vijkdnk[indi][indj] += mfc_dn[indk] *
m_mfmod->d3v(i, j, k);
537 vector< vector<double> > daij11, daij12, daij21, daij22;
543 for (
int i = 0; i < NN; ++i) {
545 daij11[i].resize(NN);
546 daij12[i].resize(NN);
547 daij21[i].resize(NN);
548 daij22[i].resize(NN);
549 for (
int j = 0; j < NN; ++j) {
553 daij11[i][j] += -d2fijkdnk[evinds[i]][evinds[j]] *
m_DensitiesId[i];
554 daij11[i][j] += -
m_exvolmod->df(i, j) * chi2id[i] * dmus[i];
560 daij12[i][j] += -dfikdnk[evinds[i]] * chi2id[i];
561 daij12[i][j] += -
m_exvolmod->f(i) * chi3id[i] * dmus[i];
566 daij21[i][j] += d3vijkdnk[mfinds[i]][mfinds[j]];
573 daij21[i][j] += -d2fkijnskmusk[evinds[i]][evinds[j]];
574 daij21[i][j] += -pkd3fkijmdnm[evinds[i]][evinds[j]];
577 daij22[i][j] += -
m_exvolmod->df(j, i) * chi2id[j] * dmus[j];
580 daij22[i][j] += -
m_DensitiesId[j] * d2fijkdnk[evinds[j]][evinds[i]];
585 for (
int i = 0; i < NN; ++i) {
588 for (
int j = 0; j < NN; ++j)
589 xVector[i] += -daij11[i][j] * dni[j];
591 for (
int j = 0; j < NN; ++j)
592 xVector[i] += -daij12[i][j] * dmus[j];
594 for (
int i = 0; i < NN; ++i) {
595 xVector[NN + i] = 0.;
597 for (
int j = 0; j < NN; ++j)
598 xVector[NN + i] += -daij21[i][j] * dni[j];
600 for (
int j = 0; j < NN; ++j)
601 xVector[NN + i] += -daij22[i][j] * dmus[j];
604 solVector = decomp.solve(xVector);
606 for (
int i = 0; i < NN; ++i) {
607 d2ni[i] = solVector[i];
608 d2mus[i] = solVector[NN + i];
611 for (
int i = 0; i < NN; ++i)
612 ret[2] += chgs[i] * d2ni[i];
619 if (order < 4)
return ret;
621 vector<double> evc_d2n(Nevcomp, 0.), evc_d2mus(Nevcomp, 0.), evc_nsd2mus(Nevcomp, 0.), evc_chi2iddmus2(Nevcomp, 0.);
622 for (
int i = 0; i < NN; ++i) {
623 evc_d2n[evinds[i]] += d2ni[i];
624 evc_d2mus[evinds[i]] += d2mus[i];
626 evc_chi2iddmus2[evinds[i]] += chi2id[i] * dmus[i] * dmus[i];
629 vector<double> mfc_d2n(Nmfcomp, 0.);
630 for (
int i = 0; i < NN; ++i) {
631 mfc_d2n[mfinds[i]] += d2ni[i];
635 vector<double> d3ni(NN, 0.), d3mus(NN, 0.);
637 vector<double> chi4id(m_densities.size());
638 for (
int i = 0; i < NN; ++i)
639 chi4id[i] = m_TPS->Particles()[i].chiDimensionfull(4, m_Parameters, m_UseWidth,
m_MuStar[i]) * pow(
xMath::GeVtoifm(), 3);
641 vector<vector<double>> d2fijkd2nk(Nevcomp, vector<double>(Nevcomp, 0.));
642 for (
int indi = 0; indi < Nevcomp; ++indi) {
643 int i = evindsfrom[indi];
644 for (
int indj = 0; indj < Nevcomp; ++indj) {
645 int j = evindsfrom[indj];
649 for (
int indk = 0; indk < Nevcomp; ++indk) {
650 int k = evindsfrom[indk];
651 d2fijkd2nk[indi][indj] += evc_d2n[indk] *
m_exvolmod->d2f(i, j, k);
656 vector<vector<double>> d3fijkmdnkdnm(Nevcomp, vector<double>(Nevcomp, 0.));
657 for (
int indi = 0; indi < Nevcomp; ++indi) {
658 int i = evindsfrom[indi];
659 for (
int indj = 0; indj < Nevcomp; ++indj) {
660 int j = evindsfrom[indj];
666 for (
int indk = 0; indk < Nevcomp; ++indk) {
667 int k = evindsfrom[indk];
668 for (
int indm = 0; indm < Nevcomp; ++indm) {
669 int m = evindsfrom[indm];
670 d3fijkmdnkdnm[indi][indj] +=
m_exvolmod->d3f(i, j, k, m) * evc_dn[indk] * evc_dn[indm];
676 vector<double> dfikd2nk(Nevcomp, 0.);
677 for (
int indi = 0; indi < Nevcomp; ++indi) {
678 int i = evindsfrom[indi];
682 for (
int indk = 0; indk < Nevcomp; ++indk) {
683 int k = evindsfrom[indk];
684 dfikd2nk[indi] += evc_d2n[indk] *
m_exvolmod->df(i, k);
688 vector<double> d2fikmdnkdnm(Nevcomp, 0.);
689 for (
int indi = 0; indi < Nevcomp; ++indi) {
690 int i = evindsfrom[indi];
696 for (
int indk = 0; indk < Nevcomp; ++indk) {
697 int k = evindsfrom[indk];
698 for (
int indm = 0; indm < Nevcomp; ++indm) {
699 int m = evindsfrom[indm];
700 d2fikmdnkdnm[indi] +=
m_exvolmod->d2f(i, k, m) * evc_dn[indk] * evc_dn[indm];
705 vector<vector<double>> d2fkijnskd2musk(Nevcomp, vector<double>(Nevcomp, 0.));
706 for (
int indi = 0; indi < Nevcomp; ++indi) {
707 int i = evindsfrom[indi];
708 for (
int indj = 0; indj < Nevcomp; ++indj) {
709 int j = evindsfrom[indj];
713 for (
int indk = 0; indk < Nevcomp; ++indk) {
714 int k = evindsfrom[indk];
715 d2fkijnskd2musk[indi][indj] +=
m_exvolmod->d2f(k, i, j) * evc_nsd2mus[indk];
720 vector<vector<double>> d2fkijc2kdmuskdmusk(Nevcomp, vector<double>(Nevcomp, 0.));
721 for (
int indi = 0; indi < Nevcomp; ++indi) {
722 int i = evindsfrom[indi];
723 for (
int indj = 0; indj < Nevcomp; ++indj) {
724 int j = evindsfrom[indj];
728 for (
int indk = 0; indk < Nevcomp; ++indk) {
729 int k = evindsfrom[indk];
730 d2fkijc2kdmuskdmusk[indi][indj] +=
m_exvolmod->d2f(k, i, j) * evc_chi2iddmus2[indk];
735 vector<vector<double>> nskd3fkijmdmuskdnm(Nevcomp, vector<double>(Nevcomp, 0.));
736 for (
int indi = 0; indi < Nevcomp; ++indi) {
737 int i = evindsfrom[indi];
738 for (
int indj = 0; indj < Nevcomp; ++indj) {
739 int j = evindsfrom[indj];
745 for (
int indk = 0; indk < Nevcomp; ++indk) {
746 int k = evindsfrom[indk];
747 for (
int indm = 0; indm < Nevcomp; ++indm) {
748 int m = evindsfrom[indm];
749 nskd3fkijmdmuskdnm[indi][indj] += evc_nsdmus[indk] *
m_exvolmod->d3f(k, i, j, m) * evc_dn[indm];
755 vector<vector<double>> pkd3fkijmd2nm(Nevcomp, vector<double>(Nevcomp, 0.));
756 for (
int indi = 0; indi < Nevcomp; ++indi) {
757 int i = evindsfrom[indi];
758 for (
int indj = 0; indj < Nevcomp; ++indj) {
759 int j = evindsfrom[indj];
765 for (
int indk = 0; indk < Nevcomp; ++indk) {
766 int k = evindsfrom[indk];
767 for (
int indm = 0; indm < Nevcomp; ++indm) {
768 int m = evindsfrom[indm];
769 pkd3fkijmd2nm[indi][indj] += evc_Ps[indk] *
m_exvolmod->d3f(k, i, j, m) * evc_d2n[indm];
775 vector<vector<double>> pkd4fkijmldnmdnl(Nevcomp, vector<double>(Nevcomp, 0.));
776 for (
int indi = 0; indi < Nevcomp; ++indi) {
777 int i = evindsfrom[indi];
778 for (
int indj = 0; indj < Nevcomp; ++indj) {
779 int j = evindsfrom[indj];
787 for (
int indk = 0; indk < Nevcomp; ++indk) {
788 int k = evindsfrom[indk];
789 for (
int indm = 0; indm < Nevcomp; ++indm) {
790 int m = evindsfrom[indm];
791 for (
int indl = 0; indl < Nevcomp; ++indl) {
792 int l = evindsfrom[indl];
793 pkd4fkijmldnmdnl[indi][indj] += evc_Ps[indk] *
m_exvolmod->d4f(k, i, j, m, l) * evc_dn[indm] * evc_dn[indl];
800 vector<vector<double>> d3vijkd2nk(Nmfcomp, vector<double>(Nmfcomp, 0.));
801 for (
int indi = 0; indi < Nmfcomp; ++indi) {
802 int i = mfindsfrom[indi];
803 for (
int indj = 0; indj < Nmfcomp; ++indj) {
804 int j = mfindsfrom[indj];
808 for (
int indk = 0; indk < Nmfcomp; ++indk) {
809 int k = mfindsfrom[indk];
810 d3vijkd2nk[indi][indj] += mfc_d2n[indk] *
m_mfmod->d3v(i, j, k);
815 vector<vector<double>> d4vijkmdnkdnm(Nmfcomp, vector<double>(Nmfcomp, 0.));
816 for (
int indi = 0; indi < Nmfcomp; ++indi) {
817 int i = mfindsfrom[indi];
818 for (
int indj = 0; indj < Nmfcomp; ++indj) {
819 int j = mfindsfrom[indj];
825 for (
int indk = 0; indk < Nmfcomp; ++indk) {
826 int k = mfindsfrom[indk];
827 for (
int indm = 0; indm < Nmfcomp; ++indm) {
828 int m = mfindsfrom[indm];
829 d4vijkmdnkdnm[indi][indj] += mfc_dn[indk] * mfc_dn[indm] *
m_mfmod->d4v(i, j, k, m);
835 vector< vector<double> > d2aij11, d2aij12, d2aij21, d2aij22;
841 for (
int i = 0; i < NN; ++i) {
843 d2aij11[i].resize(NN);
844 d2aij12[i].resize(NN);
845 d2aij21[i].resize(NN);
846 d2aij22[i].resize(NN);
847 for (
int j = 0; j < NN; ++j) {
849 d2aij11[i][j] += -
m_exvolmod->df(i, j) * chi3id[i] * dmus[i] * dmus[i];
850 d2aij11[i][j] += -
m_exvolmod->df(i, j) * chi2id[i] * d2mus[i];
852 d2aij11[i][j] += -2. * d2fijkdnk[evinds[i]][evinds[j]] * chi2id[i] * dmus[i];
853 d2aij11[i][j] += -d2fijkd2nk[evinds[i]][evinds[j]] *
m_DensitiesId[i];
854 d2aij11[i][j] += -d3fijkmdnkdnm[evinds[i]][evinds[j]] *
m_DensitiesId[i];
867 d2aij12[i][j] += -
m_exvolmod->f(i) * chi3id[i] * d2mus[i];
868 d2aij12[i][j] += -
m_exvolmod->f(i) * chi4id[i] * dmus[i] * dmus[i];
870 d2aij12[i][j] += -2. * dfikdnk[evinds[i]] * chi3id[i] * dmus[i];
871 d2aij12[i][j] += -dfikd2nk[evinds[i]] * chi2id[i];
872 d2aij12[i][j] += -d2fikmdnkdnm[evinds[i]] * chi2id[i];
886 d2aij21[i][j] += -d2fkijnskd2musk[evinds[i]][evinds[j]];
887 d2aij21[i][j] += -d2fkijc2kdmuskdmusk[evinds[i]][evinds[j]];
888 d2aij21[i][j] += -2. * nskd3fkijmdmuskdnm[evinds[i]][evinds[j]];
889 d2aij21[i][j] += -pkd3fkijmd2nm[evinds[i]][evinds[j]];
890 d2aij21[i][j] += -pkd4fkijmldnmdnl[evinds[i]][evinds[j]];
892 d2aij21[i][j] += d3vijkd2nk[mfinds[i]][mfinds[j]];
893 d2aij21[i][j] += d4vijkmdnkdnm[mfinds[i]][mfinds[j]];
917 d2aij22[i][j] += -
m_exvolmod->df(j, i) * chi3id[j] * dmus[j] * dmus[j];
918 d2aij22[i][j] += -
m_exvolmod->df(j, i) * chi2id[j] * d2mus[j];
920 d2aij22[i][j] += -2. * d2fijkdnk[evinds[j]][evinds[i]] * chi2id[j] * dmus[j];
925 d2aij22[i][j] += -d2fijkd2nk[evinds[j]][evinds[i]] *
m_DensitiesId[j];
926 d2aij22[i][j] += -d3fijkmdnkdnm[evinds[j]][evinds[i]] *
m_DensitiesId[j];
940 for (
int i = 0; i < NN; ++i) {
943 for (
int j = 0; j < NN; ++j)
944 xVector[i] += -2. * daij11[i][j] * d2ni[j] - d2aij11[i][j] * dni[j];
946 for (
int j = 0; j < NN; ++j)
947 xVector[i] += -2. * daij12[i][j] * d2mus[j] - d2aij12[i][j] * dmus[j];
949 for (
int i = 0; i < NN; ++i) {
950 xVector[NN + i] = 0.;
952 for (
int j = 0; j < NN; ++j)
953 xVector[NN + i] += -2. * daij21[i][j] * d2ni[j] - d2aij21[i][j] * dni[j];
955 for (
int j = 0; j < NN; ++j)
956 xVector[NN + i] += -2. * daij22[i][j] * d2mus[j] - d2aij22[i][j] * dmus[j];
959 solVector = decomp.solve(xVector);
961 for (
int i = 0; i < NN; ++i) {
962 d3ni[i] = solVector[i];
963 d3mus[i] = solVector[NN + i];
966 for (
int i = 0; i < NN; ++i)
967 ret[3] += chgs[i] * d3ni[i];
975 vector<double> ret(order + 1, 0.);
978 for (
size_t i = 0; i < m_densities.size(); ++i)
979 ret[0] += chgs[i] * m_densities[i];
983 if (order < 2)
return ret;
985 int NN = m_densities.size();
987 MatrixXd densMatrix(2 * NN, 2 * NN);
988 VectorXd solVector(2 * NN), xVector(2 * NN);
990 vector<double> chi2id(m_densities.size()), Ps(m_densities.size());
991 for (
int i = 0; i < NN; ++i) {
994 chi2id[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth,
m_MuStar[i]) * pow(
xMath::GeVtoifm(), 3);
997 for (
int i = 0; i < NN; ++i)
998 for (
int j = 0; j < NN; ++j) {
1000 if (i == j) densMatrix(i, j) += 1.;
1003 for (
int i = 0; i < NN; ++i)
1004 for (
int j = 0; j < NN; ++j)
1005 densMatrix(i, NN + j) = 0.;
1007 for (
int i = 0; i < NN; ++i) {
1008 densMatrix(i, NN + i) = -
m_exvolmod->f(i) * chi2id[i];
1011 for (
int i = 0; i < NN; ++i)
1012 for (
int j = 0; j < NN; ++j) {
1013 densMatrix(NN + i, j) =
m_mfmod->d2v(i, j);
1014 for (
int k = 0; k < NN; ++k) {
1015 densMatrix(NN + i, j) += -
m_exvolmod->d2f(k, i, j) * Ps[k];
1019 for (
int i = 0; i < NN; ++i)
1020 for (
int j = 0; j < NN; ++j) {
1022 if (i == j) densMatrix(NN + i, NN + j) += 1.;
1025 PartialPivLU<MatrixXd> decomp(densMatrix);
1028 vector<double> dni(NN, 0.), dmus(NN, 0.);
1030 for (
int i = 0; i < NN; ++i) {
1032 xVector[NN + i] = chgs[i];
1035 solVector = decomp.solve(xVector);
1037 for (
int i = 0; i < NN; ++i) {
1038 dni[i] = solVector[i];
1039 dmus[i] = solVector[NN + i];
1042 for (
int i = 0; i < NN; ++i)
1043 ret[1] += chgs[i] * dni[i];
1047 if (order < 3)
return ret;
1050 vector<double> d2ni(NN, 0.), d2mus(NN, 0.);
1052 vector<double> chi3id(m_densities.size());
1053 for (
int i = 0; i < NN; ++i)
1054 chi3id[i] = m_TPS->Particles()[i].chiDimensionfull(3, m_Parameters, m_UseWidth,
m_MuStar[i]) * pow(
xMath::GeVtoifm(), 3);
1056 vector< vector<double> > daij11, daij12, daij21, daij22;
1062 for (
int i = 0; i < NN; ++i) {
1063 cout <<
"chi3 iter: " << i <<
"\n";
1064 daij11[i].resize(NN);
1065 daij12[i].resize(NN);
1066 daij21[i].resize(NN);
1067 daij22[i].resize(NN);
1068 for (
int j = 0; j < NN; ++j) {
1070 for (
int k = 0; k < NN; ++k)
1072 daij11[i][j] += -
m_exvolmod->df(i, j) * chi2id[i] * dmus[i];
1076 for (
int k = 0; k < NN; ++k)
1077 daij12[i][j] += -
m_exvolmod->df(i, k) * chi2id[i] * dni[k];
1078 daij12[i][j] += -
m_exvolmod->f(i) * chi3id[i] * dmus[i];
1083 for (
int k = 0; k < NN; ++k) {
1084 daij21[i][j] +=
m_mfmod->d3v(i, j, k) * dni[k];
1086 for (
int m = 0; m < NN; ++m)
1087 daij21[i][j] += -Ps[k] *
m_exvolmod->d3f(k, i, j, m) * dni[m];
1091 daij22[i][j] += -
m_exvolmod->df(j, i) * chi2id[j] * dmus[j];
1092 for (
int k = 0; k < NN; ++k)
1098 for (
int i = 0; i < NN; ++i) {
1101 for (
int j = 0; j < NN; ++j)
1102 xVector[i] += -daij11[i][j] * dni[j];
1104 for (
int j = 0; j < NN; ++j)
1105 xVector[i] += -daij12[i][j] * dmus[j];
1107 for (
int i = 0; i < NN; ++i) {
1108 xVector[NN + i] = 0.;
1110 for (
int j = 0; j < NN; ++j)
1111 xVector[NN + i] += -daij21[i][j] * dni[j];
1113 for (
int j = 0; j < NN; ++j)
1114 xVector[NN + i] += -daij22[i][j] * dmus[j];
1117 solVector = decomp.solve(xVector);
1119 for (
int i = 0; i < NN; ++i) {
1120 d2ni[i] = solVector[i];
1121 d2mus[i] = solVector[NN + i];
1124 for (
int i = 0; i < NN; ++i)
1125 ret[2] += chgs[i] * d2ni[i];
1129 if (order < 4)
return ret;
1132 vector<double> d3ni(NN, 0.), d3mus(NN, 0.);
1134 vector<double> chi4id(m_densities.size());
1135 for (
int i = 0; i < NN; ++i)
1136 chi4id[i] = m_TPS->Particles()[i].chiDimensionfull(4, m_Parameters, m_UseWidth,
m_MuStar[i]) * pow(
xMath::GeVtoifm(), 3);
1138 vector< vector<double> > d2aij11, d2aij12, d2aij21, d2aij22;
1144 for (
int i = 0; i < NN; ++i) {
1145 cout <<
"chi4 iter: " << i <<
"\n";
1146 d2aij11[i].resize(NN);
1147 d2aij12[i].resize(NN);
1148 d2aij21[i].resize(NN);
1149 d2aij22[i].resize(NN);
1150 for (
int j = 0; j < NN; ++j) {
1152 d2aij11[i][j] += -
m_exvolmod->df(i, j) * chi3id[i] * dmus[i] * dmus[i];
1153 d2aij11[i][j] += -
m_exvolmod->df(i, j) * chi2id[i] * d2mus[i];
1154 for (
int k = 0; k < NN; ++k) {
1155 d2aij11[i][j] += -
m_exvolmod->d2f(i, j, k) * chi2id[i] * dmus[i] * dni[k];
1157 d2aij11[i][j] += -
m_exvolmod->d2f(i, j, k) * chi2id[i] * dmus[i] * dni[k];
1158 for (
int m = 0; m < NN; ++m) {
1165 d2aij12[i][j] += -
m_exvolmod->f(i) * chi3id[i] * d2mus[i];
1166 d2aij12[i][j] += -
m_exvolmod->f(i) * chi4id[i] * dmus[i] * dmus[i];
1167 for (
int k = 0; k < NN; ++k) {
1168 d2aij12[i][j] += -2. *
m_exvolmod->df(i, k) * chi3id[i] * dmus[i] * dni[k];
1169 d2aij12[i][j] += -
m_exvolmod->df(i, k) * chi2id[i] * d2ni[k];
1170 for (
int m = 0; m < NN; ++m) {
1171 d2aij12[i][j] += -
m_exvolmod->d2f(i, k, m) * chi2id[i] * dni[k] * dni[m];
1177 for (
int k = 0; k < NN; ++k) {
1179 d2aij21[i][j] +=
m_mfmod->d3v(i, j, k) * d2ni[k];
1180 for (
int m = 0; m < NN; ++m)
1181 d2aij21[i][j] +=
m_mfmod->d4v(i, j, k, m) * dni[k] * dni[m];
1184 d2aij21[i][j] += -
m_exvolmod->d2f(k, i, j) * chi2id[k] * dmus[k] * dmus[k];
1185 for (
int m = 0; m < NN; ++m)
1188 for (
int m = 0; m < NN; ++m) {
1191 d2aij21[i][j] += -Ps[k] *
m_exvolmod->d3f(k, i, j, m) * d2ni[m];
1192 for (
int l = 0; l < NN; ++l)
1193 d2aij21[i][j] += -Ps[k] *
m_exvolmod->d4f(k, i, j, m, l) * dni[m] * dni[l];
1199 d2aij22[i][j] += -
m_exvolmod->df(j, i) * chi3id[j] * dmus[j] * dmus[j];
1200 d2aij22[i][j] += -
m_exvolmod->df(j, i) * chi2id[j] * d2mus[j];
1201 for (
int k = 0; k < NN; ++k)
1202 d2aij22[i][j] += -
m_exvolmod->d2f(j, i, k) * chi2id[j] * dmus[j] * dni[k];
1203 for (
int k = 0; k < NN; ++k) {
1205 d2aij22[i][j] += -
m_exvolmod->d2f(j, i, k) * chi2id[j] * dni[k] * dmus[j];
1207 for (
int m = 0; m < NN; ++m) {
1215 for (
int i = 0; i < NN; ++i) {
1218 for (
int j = 0; j < NN; ++j)
1219 xVector[i] += -2. * daij11[i][j] * d2ni[j] - d2aij11[i][j] * dni[j];
1221 for (
int j = 0; j < NN; ++j)
1222 xVector[i] += -2. * daij12[i][j] * d2mus[j] - d2aij12[i][j] * dmus[j];
1224 for (
int i = 0; i < NN; ++i) {
1225 xVector[NN + i] = 0.;
1227 for (
int j = 0; j < NN; ++j)
1228 xVector[NN + i] += -2. * daij21[i][j] * d2ni[j] - d2aij21[i][j] * dni[j];
1230 for (
int j = 0; j < NN; ++j)
1231 xVector[NN + i] += -2. * daij22[i][j] * d2mus[j] - d2aij22[i][j] * dmus[j];
1234 solVector = decomp.solve(xVector);
1236 for (
int i = 0; i < NN; ++i) {
1237 d3ni[i] = solVector[i];
1238 d3mus[i] = solVector[NN + i];
1241 for (
int i = 0; i < NN; ++i)
1242 ret[3] += chgs[i] * d3ni[i];
1252 if (order < 1)
return m_chi;
1254 vector<double> chgs(m_densities.size());
1255 vector<double> chis;
1258 for (
size_t i = 0; i < chgs.size(); ++i)
1259 chgs[i] = m_TPS->Particles()[i].BaryonCharge();
1261 for (
int i = 0; i < order; ++i)
m_chi[i][0] = chis[i];
1264 for (
size_t i = 0; i < chgs.size(); ++i)
1265 chgs[i] = m_TPS->Particles()[i].ElectricCharge();
1267 for (
int i = 0; i < order; ++i)
m_chi[i][1] = chis[i];
1270 for (
size_t i = 0; i < chgs.size(); ++i)
1271 chgs[i] = m_TPS->Particles()[i].Strangeness();
1273 for (
int i = 0; i < order; ++i)
m_chi[i][2] = chis[i];
1276 for (
size_t i = 0; i < chgs.size(); ++i)
1277 chgs[i] = m_TPS->Particles()[i].ArbitraryCharge();
1279 for (
int i = 0; i < order; ++i)
m_chiarb[i] = chis[i];
1286 int NN = m_densities.size();
1287 int Nevcomp =
m_exvolmod->ComponentsNumber();
1288 const vector<int>& evinds =
m_exvolmod->ComponentIndices();
1289 const vector<int>& evindsfrom =
m_exvolmod->ComponentIndicesFrom();
1292 m_PrimCorrel.resize(NN);
1293 for (
int i = 0; i < NN; ++i)
1294 m_PrimCorrel[i].resize(NN);
1295 m_dmusdmu = m_PrimCorrel;
1296 m_TotalCorrel = m_PrimCorrel;
1298 MatrixXd densMatrix(2 * NN, 2 * NN);
1299 VectorXd solVector(2 * NN), xVector(2 * NN);
1301 vector<double> chi2id(m_densities.size()), Ps(m_densities.size());
1302 for (
int i = 0; i < NN; ++i) {
1305 chi2id[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth,
m_MuStar[i]);
1308 vector<double> evc_Ps(Nevcomp, 0.);
1309 for (
int i = 0; i < NN; ++i) {
1310 evc_Ps[evinds[i]] += Ps[i];
1313 for (
int i = 0; i < NN; ++i)
1314 for (
int j = 0; j < NN; ++j) {
1316 if (i == j) densMatrix(i, j) += 1.;
1319 for (
int i = 0; i < NN; ++i)
1320 for (
int j = 0; j < NN; ++j)
1321 densMatrix(i, NN + j) = 0.;
1323 for (
int i = 0; i < NN; ++i) {
1327 for (
int i = 0; i < NN; ++i)
1328 for (
int j = 0; j < NN; ++j) {
1329 densMatrix(NN + i, j) =
m_mfmod->d2v(i, j);
1333 for (
int indk = 0; indk < Nevcomp; ++indk) {
1334 int k = evindsfrom[indk];
1335 densMatrix(NN + i, j) += -
m_exvolmod->d2f(k, i, j) * evc_Ps[indk];
1339 for (
int i = 0; i < NN; ++i)
1340 for (
int j = 0; j < NN; ++j) {
1342 if (i == j) densMatrix(NN + i, NN + j) += 1.;
1345 PartialPivLU<MatrixXd> decomp(densMatrix);
1347 for (
int k = 0; k < NN; ++k) {
1348 vector<double> dni(NN, 0.), dmus(NN, 0.);
1350 for (
int i = 0; i < NN; ++i) {
1352 xVector[NN + i] =
static_cast<int>(i == k);
1355 solVector = decomp.solve(xVector);
1357 for (
int i = 0; i < NN; ++i) {
1358 dni[i] = solVector[i];
1359 dmus[i] = solVector[NN + i];
1360 m_dmusdmu[i][k] = dmus[i];
1363 for (
int j = 0; j < NN; ++j) {
1364 m_PrimCorrel[j][k] = dni[j];
1368 for (
int i = 0; i < NN; ++i) {
1369 m_wprim[i] = m_PrimCorrel[i][i];
1370 if (m_densities[i] > 0.) m_wprim[i] *= m_Parameters.T / m_densities[i];
1371 else m_wprim[i] = 1.;
1372 if (m_wprim[i] != m_wprim[i]) m_wprim[i] = 1.;
1375 m_TwoParticleCorrelationsCalculated =
true;
1379 int N = m_TPS->ComponentsNumber();
1380 int Nevcomp =
m_exvolmod->ComponentsNumber();
1381 const vector<int>& evinds =
m_exvolmod->ComponentIndices();
1382 const vector<int>& evindsfrom =
m_exvolmod->ComponentIndicesFrom();
1383 int Nmfcomp =
m_mfmod->ComponentsNumber();
1384 const vector<int>& mfinds =
m_mfmod->ComponentIndices();
1385 const vector<int>& mfindsfrom =
m_mfmod->ComponentIndicesFrom();
1387 double T = m_Parameters.T;
1389 m_dndT = vector<double>(N, 0.);
1390 m_dmusdT = vector<double>(N, 0.);
1391 m_PrimChi2sdT = vector<vector<double>>(N, vector<double>(N, 0.));
1393 vector<double> nids(N, 0.), dniddTs(N, 0.), chi2ids(N, 0.), dchi2idsdT(N, 0.), chi3ids(N, 0.);
1394 for (
int i = 0; i < N; ++i) {
1397 chi2ids[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth,
m_MuStar[i]) *
xMath::GeVtoifm3();
1405 chi3ids[i] = m_TPS->Particles()[i].chiDimensionfull(3, m_Parameters, m_UseWidth,
m_MuStar[i]) *
xMath::GeVtoifm3();
1408 int NN = m_densities.size();
1410 MatrixXd densMatrix(2 * NN, 2 * NN);
1411 VectorXd solVector(2 * NN), xVector(2 * NN);
1413 vector<double> chi2id(m_densities.size()), Ps(m_densities.size()), sids(m_densities.size());
1414 for (
int i = 0; i < NN; ++i) {
1421 vector<double> evc_Ps(Nevcomp, 0.);
1422 for (
int i = 0; i < NN; ++i) {
1423 evc_Ps[evinds[i]] += Ps[i];
1426 for (
int i = 0; i < NN; ++i)
1427 for (
int j = 0; j < NN; ++j) {
1429 if (i == j) densMatrix(i, j) += 1.;
1432 for (
int i = 0; i < NN; ++i)
1433 for (
int j = 0; j < NN; ++j)
1434 densMatrix(i, NN + j) = 0.;
1436 for (
int i = 0; i < NN; ++i) {
1437 densMatrix(i, NN + i) = -
m_exvolmod->f(i) * chi2ids[i];
1440 for (
int i = 0; i < NN; ++i)
1441 for (
int j = 0; j < NN; ++j) {
1442 densMatrix(NN + i, j) =
m_mfmod->d2v(i, j);
1443 for (
int indk = 0; indk < Nevcomp; ++indk) {
1444 int k = evindsfrom[indk];
1445 densMatrix(NN + i, j) += -
m_exvolmod->d2f(k, i, j) * evc_Ps[indk];
1449 for (
int i = 0; i < NN; ++i)
1450 for (
int j = 0; j < NN; ++j) {
1452 if (i == j) densMatrix(NN + i, NN + j) += 1.;
1455 PartialPivLU<MatrixXd> decomp(densMatrix);
1457 for(
int i = 0; i < NN; ++i) {
1459 xVector[i] = fi * dniddTs[i];
1460 xVector[NN + i] = 0.;
1461 for(
int j = 0; j < NN; ++j) {
1462 xVector[NN + i] +=
m_exvolmod->df(j, i) * sids[j];
1466 solVector = decomp.solve(xVector);
1468 for(
int i=0;i<NN;++i) {
1469 m_dndT[i] = solVector[i];
1470 m_dmusdT[i] = solVector[NN+i];
1474 if (IsSusceptibilitiesCalculated()) {
1475 vector<double> dnevdT(Nevcomp, 0.);
1476 for(
int l = 0; l < NN; ++l) {
1477 dnevdT[evinds[l]] += m_dndT[l];
1480 vector<vector<double>> chikjd2fikldnldT(Nevcomp, vector<double>(N, 0.));
1481 for (
int indi = 0; indi < Nevcomp; ++indi) {
1482 int i = evindsfrom[indi];
1483 for (
int j = 0; j < N; ++j) {
1484 for (
int k = 0; k < N; ++k) {
1485 for(
int indl = 0; indl < Nevcomp; ++indl) {
1486 int l = evindsfrom[indl];
1487 chikjd2fikldnldT[indi][j] += m_PrimCorrel[k][j] *
m_exvolmod->d2f(i, k, l) * dnevdT[indl];
1493 vector<vector<double>> chikjdfik(Nevcomp, vector<double>(N, 0.));
1494 for (
int indi = 0; indi < Nevcomp; ++indi) {
1495 int i = evindsfrom[indi];
1496 for (
int j = 0; j < N; ++j) {
1497 for (
int k = 0; k < N; ++k) {
1498 chikjdfik[indi][j] += m_PrimCorrel[k][j] *
m_exvolmod->df(i, k);
1503 vector<double> dfikdnkdT(Nevcomp, 0.);
1504 for (
int indi = 0; indi < Nevcomp; ++indi) {
1505 int i = evindsfrom[indi];
1506 for (
int k = 0; k < N; ++k) {
1507 dfikdnkdT[indi] +=
m_exvolmod->df(i, k) * m_dndT[k];
1511 vector<vector<double>> chikjd3vikldnldT(Nmfcomp, vector<double>(N, 0.));
1512 vector<double> dnmfdT(Nmfcomp, 0.);
1513 for(
int l = 0; l < NN; ++l) {
1514 dnmfdT[mfinds[l]] += m_dndT[l];
1517 for (
int indi = 0; indi < Nmfcomp; ++indi) {
1518 int i = mfindsfrom[indi];
1519 for (
int j = 0; j < N; ++j) {
1520 for (
int k = 0; k < N; ++k) {
1521 for(
int indl = 0; indl < Nmfcomp; ++indl) {
1522 int l = mfindsfrom[indl];
1523 chikjd3vikldnldT[indi][j] += m_PrimCorrel[k][j] *
m_mfmod->d3v(i, k, l) * dnmfdT[indl];
1529 vector<vector<double>> chikjd3fmikldnldTPsm(Nevcomp, vector<double>(N, 0.));
1531 for (
int indi = 0; indi < Nevcomp; ++indi) {
1532 int i = evindsfrom[indi];
1533 for (
int j = 0; j < N; ++j) {
1534 for (
int k = 0; k < N; ++k) {
1535 for(
int indl = 0; indl < Nevcomp; ++indl) {
1536 int l = evindsfrom[indl];
1537 for(
int indm = 0; indm < Nevcomp; ++indm) {
1538 int m = evindsfrom[indm];
1539 chikjd3fmikldnldTPsm[indi][j] += m_PrimCorrel[k][j] *
m_exvolmod->d3f(m, i, k, l) * dnevdT[indl] * evc_Ps[indm];
1546 vector<double> splusnidsums(Nevcomp, 0.);
1547 for(
int m = 0; m < NN; ++m) {
1548 splusnidsums[evinds[m]] += sids[m] + nids[m] * m_dmusdT[m];
1550 vector<vector<double>> chikjd2fmiketc(Nevcomp, vector<double>(N, 0.));
1551 for (
int indi = 0; indi < Nevcomp; ++indi) {
1552 int i = evindsfrom[indi];
1553 for (
int j = 0; j < N; ++j) {
1554 for (
int k = 0; k < N; ++k) {
1555 for (
int indm = 0; indm < Nevcomp; ++indm) {
1556 int m = evindsfrom[indm];
1557 chikjd2fmiketc[indi][j] += m_PrimCorrel[k][j] *
m_exvolmod->d2f(m, i, k) * splusnidsums[indm];
1563 vector<vector<double>> dmusmukjd2fkildnldTnidk(Nevcomp, vector<double>(N, 0.));
1564 for (
int indi = 0; indi < Nevcomp; ++indi) {
1565 int i = evindsfrom[indi];
1566 for (
int j = 0; j < N; ++j) {
1567 for (
int k = 0; k < N; ++k) {
1568 for(
int indl = 0; indl < Nevcomp; ++indl) {
1569 int l = evindsfrom[indl];
1570 dmusmukjd2fkildnldTnidk[indi][j] += m_dmusdmu[k][j] *
m_exvolmod->d2f(k, i, l) * dnevdT[indl] * nids[k];
1576 vector<vector<double>> dmusdmukjdfkietc(Nevcomp, vector<double>(N, 0.));
1577 for (
int indi = 0; indi < Nevcomp; ++indi) {
1578 int i = evindsfrom[indi];
1579 for (
int j = 0; j < N; ++j) {
1580 for (
int k = 0; k < N; ++k) {
1581 dmusdmukjdfkietc[indi][j] += m_dmusdmu[k][j] *
m_exvolmod->df(k, i) * (dniddTs[k] + chi2ids[k] * m_dmusdT[k]);
1587 for (
int j = 0; j < NN; ++j) {
1588 for (
int i = 0; i < NN; ++i) {
1592 a1 += chikjd2fikldnldT[evinds[i]][j] * nids[i];
1593 a1 += chikjdfik[evinds[i]][j] * (dniddTs[i] + chi2ids[i] * m_dmusdT[i]);
1594 a1 += m_dmusdmu[i][j] * dfikdnkdT[evinds[i]] * chi2ids[i];
1603 a1 += m_dmusdmu[i][j] *
m_exvolmod->f(i) * (dchi2idsdT[i] + chi3ids[i] * m_dmusdT[i]);
1612 a2 += -chikjd3vikldnldT[mfinds[i]][j];
1614 a2 += chikjd3fmikldnldTPsm[evinds[i]][j];
1616 a2 += chikjd2fmiketc[evinds[i]][j];
1618 a2 += dmusmukjd2fkildnldTnidk[evinds[i]][j];
1620 a2 += dmusdmukjdfkietc[evinds[i]][j];
1637 xVector[i + NN] = a2;
1640 solVector = decomp.solve(xVector);
1642 for (
int i = 0; i < NN; ++i) {
1648 m_PrimChi2sdT[i][j] = 0.;
1652 m_TemperatureDerivativesCalculated =
true;
1656 m_TemperatureDerivativesCalculated =
true;
1667 for (
size_t i = 0; i < m_wprim.size(); ++i) {
1674 m_FluctuationsCalculated =
true;
1676 if (IsTemperatureDerivativesCalculated()) {
1677 m_TemperatureDerivativesCalculated =
false;
1683 if (!IsTemperatureDerivativesCalculated())
1689 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
1692 for (
int k = 0; k < m_TPS->ComponentsNumber(); ++k) {
1706 ret += dvi * m_dndT[i];
1710 assert(
m_mfmod->dvdT() == 0.0);
1716 if (!IsTemperatureDerivativesCalculated())
1722 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
1725 for (
int k = 0; k < m_TPS->ComponentsNumber(); ++k) {
1740 assert(
m_mfmod->dvdT() == 0.0);
1748 for (
size_t i = 0; i < m_densities.size(); ++i)
1753 for (
size_t i = 0; i < m_densities.size(); ++i) {
1755 ret += -m_Parameters.T * tPid *
m_exvolmod->dfdT(i);
1757 ret += -m_Parameters.T *
m_mfmod->dvdT();
1766 for (
size_t i = 0; i < m_densities.size(); ++i)
1770 for (
size_t i = 0; i < m_densities.size(); ++i) {
1783 for (
size_t i = 0; i < m_densities.size(); ++i) {
1785 for (
size_t j = 0; j < m_densities.size(); ++j) {
1786 tfsum += m_densities[j] *
m_exvolmod->df(i, j);
1793 for (
size_t i = 0; i < m_densities.size(); ++i)
1794 ret +=
m_mfmod->dv(i) * m_densities[i];
1813 std::vector<double> ThermalModelRealGas::BroydenEquationsRealGas::Equations(
const std::vector<double>& x)
1815 int NN = m_THM->Densities().size();
1816 vector<double> Ps(NN, 0.);
1817 for (
int i = 0; i < NN; ++i) {
1818 Ps[i] = m_THM->TPS()->Particles()[i].Density(m_THM->
Parameters(),
1825 vector<double> ns(NN, 0.);
1826 for (
int i = 0; i < NN; ++i) {
1827 ns[i] = m_THM->TPS()->Particles()[i].Density(m_THM->
Parameters(),
1834 vector<double> np = m_THM->m_exvolmod->nsol(ns);
1835 m_THM->m_exvolmod->SetDensities(np);
1836 m_THM->m_mfmod->SetDensities(np);
1838 vector<double> ret(
m_N, 0.);
1839 for (
size_t i = 0; i < ret.size(); ++i) {
1841 for (
int j = 0; j < NN; ++j)
1842 ret[i] += -m_THM->m_exvolmod->df(j, i) * Ps[j];
1843 ret[i] += m_THM->m_mfmod->dv(i);
1848 std::vector<double> ThermalModelRealGas::BroydenJacobianRealGas::Jacobian(
const std::vector<double>& x)
1850 int NN = m_THM->m_densities.size();
1852 MatrixXd densMatrix(NN, NN);
1853 VectorXd solVector(NN), xVector(NN);
1855 std::vector<double> ret(NN * NN, 0.);
1857 vector<double> Ps(NN, 0.);
1858 for (
int i = 0; i < NN; ++i)
1859 Ps[i] = m_THM->TPS()->Particles()[i].Density(m_THM->Parameters(),
1862 m_THM->ChemicalPotential(i) + x[i]
1865 vector<double> ns(NN, 0.);
1866 for (
int i = 0; i < NN; ++i)
1867 ns[i] = m_THM->TPS()->Particles()[i].Density(m_THM->Parameters(),
1870 m_THM->ChemicalPotential(i) + x[i]
1873 vector<double> chi2s(NN, 0.);
1874 for (
int i = 0; i < NN; ++i)
1875 chi2s[i] = m_THM->TPS()->Particles()[i].chiDimensionfull(2, m_THM->Parameters(),
1877 m_THM->ChemicalPotential(i) + x[i]
1880 vector<double> np = m_THM->m_exvolmod->nsol(ns);
1881 m_THM->m_exvolmod->SetDensities(np);
1882 m_THM->m_mfmod->SetDensities(np);
1884 for (
int i = 0; i < NN; ++i) {
1885 for (
int j = 0; j < NN; ++j) {
1886 densMatrix(i, j) = 0.;
1888 densMatrix(i, j) += 1.;
1890 densMatrix(i, j) += -m_THM->m_exvolmod->df(i, j) * ns[i];
1894 int Nevcomp = m_THM->m_exvolmod->ComponentsNumber();
1895 const vector<int>& evinds = m_THM->m_exvolmod->ComponentIndices();
1896 const vector<int>& evindsfrom = m_THM->m_exvolmod->ComponentIndicesFrom();
1898 int Nmfcomp = m_THM->m_mfmod->ComponentsNumber();
1899 const vector<int>& mfinds = m_THM->m_mfmod->ComponentIndices();
1900 const vector<int>& mfindsfrom = m_THM->m_mfmod->ComponentIndicesFrom();
1902 vector<double> evc_Ps(Nevcomp, 0.);
1903 for (
int i = 0; i < NN; ++i)
1904 evc_Ps[m_THM->m_exvolmod->ComponentIndices()[i]] += Ps[i];
1906 PartialPivLU<MatrixXd> decomp(densMatrix);
1908 for (
int kp = 0; kp < NN; ++kp) {
1911 for (
int l = 0; l < NN; ++l) {
1914 xVector[l] = chi2s[l] * pow(
xMath::GeVtoifm(), 3) * m_THM->m_exvolmod->f(l);
1918 solVector = decomp.solve(xVector);
1919 for (
int i = 0; i < NN; ++i)
1920 if (solVector[i] > 1.) solVector[i] = 1.;
1923 vector<double> dnjdmukp(NN, 0.);
1924 vector<double> evc_dnjdmukp(Nevcomp, 0.);
1925 vector<double> evc_d2fmul(Nevcomp, 0.);
1926 vector<double> mfc_dnjdmukp(Nmfcomp, 0.);
1927 vector<double> mfc_d2vmul(Nmfcomp, 0.);
1929 for (
int j = 0; j < NN; ++j) {
1930 dnjdmukp[j] = solVector[j];
1931 evc_dnjdmukp[evinds[j]] += solVector[j];
1932 mfc_dnjdmukp[mfinds[j]] += solVector[j];
1934 for (
int nn = 0; nn < Nevcomp; ++nn) {
1935 for (
int in = 0; in < Nevcomp; ++in) {
1936 for (
int inp = 0; inp < Nevcomp; ++inp) {
1937 int n = evindsfrom[in];
1938 int np = evindsfrom[inp];
1939 int k = evindsfrom[nn];
1940 evc_d2fmul[nn] += -evc_Ps[in] * m_THM->m_exvolmod->d2f(n, k, np) * evc_dnjdmukp[inp];
1945 for (
int nn = 0; nn < Nmfcomp; ++nn) {
1946 for (
int in = 0; in < Nmfcomp; ++in) {
1947 int n = mfindsfrom[in];
1948 int k = mfindsfrom[nn];
1949 mfc_d2vmul[nn] += m_THM->m_mfmod->d2v(k, n) * mfc_dnjdmukp[in];
1955 for (
int k = 0; k < NN; ++k) {
1957 ret[k * NN + kp] += 1.;
1958 ret[k * NN + kp] += -m_THM->m_exvolmod->df(kp, k) * ns[kp];
1961 ret[k * NN + kp] += evc_d2fmul[evinds[k]];
1963 ret[k * NN + kp] += mfc_d2vmul[mfinds[k]];
1973 bool ThermalModelRealGas::BroydenSolutionCriteriumRealGas::IsSolved(
const std::vector<double>& x,
const std::vector<double>& f,
const std::vector<double>& xdelta)
const
1975 if (xdelta.size() == x.size()) {
1976 double maxdiff = 0.;
1977 for (
size_t i = 0; i < xdelta.size(); ++i) {
1978 maxdiff = std::max(maxdiff, fabs(xdelta[i]));
1979 maxdiff = std::max(maxdiff, fabs(f[i]));
1981 return (maxdiff < m_MaximumError);
1988 std::vector<double> ThermalModelRealGas::BroydenEquationsRealGasComponents::Equations(
const std::vector<double> &x)
1990 int NN = m_THM->Densities().size();
1991 vector<double> Ps(NN, 0.);
1992 for (
int i = 0; i < NN; ++i) {
1993 Ps[i] = m_THM->TPS()->Particles()[i].Density(m_THM->Parameters(),
1996 m_THM->ChemicalPotential(i) + x[m_THM->m_MapTodMuStar[i]]
2000 vector<double> ns(NN, 0.);
2001 for (
int i = 0; i < NN; ++i) {
2002 ns[i] = m_THM->TPS()->Particles()[i].Density(m_THM->Parameters(),
2005 m_THM->ChemicalPotential(i) + x[m_THM->m_MapTodMuStar[i]]
2009 vector<double> np = m_THM->m_exvolmod->nsol(ns);
2010 m_THM->m_exvolmod->SetDensities(np);
2011 m_THM->m_mfmod->SetDensities(np);
2013 vector<double> ret(m_N, 0.);
2014 for (
size_t i = 0; i < ret.size(); ++i) {
2016 for (
int j = 0; j < NN; ++j)
2017 ret[i] += -m_THM->m_exvolmod->df(j, m_THM->m_MapFromdMuStar[i]) * Ps[j];
2018 ret[i] += m_THM->m_mfmod->dv(m_THM->m_MapFromdMuStar[i]);
2023 std::vector<double> ThermalModelRealGas::BroydenJacobianRealGasComponents::Jacobian(
const std::vector<double> &x)
2025 int NN = m_THM->m_densities.size();
2026 int NNdmu = m_THM->m_MapFromdMuStar.size();
2028 MatrixXd densMatrix(NNdmu, NNdmu);
2029 VectorXd solVector(NNdmu), xVector(NNdmu);
2031 std::vector<double> ret(NNdmu * NNdmu, 0.);
2033 vector<double> Ps(NN, 0.);
2034 for (
int i = 0; i < NN; ++i)
2035 Ps[i] = m_THM->TPS()->Particles()[i].Density(m_THM->Parameters(),
2038 m_THM->ChemicalPotential(i) + x[m_THM->m_MapTodMuStar[i]]
2041 vector<double> ns(NN, 0.);
2042 for (
int i = 0; i < NN; ++i)
2043 ns[i] = m_THM->TPS()->Particles()[i].Density(m_THM->Parameters(),
2046 m_THM->ChemicalPotential(i) + x[m_THM->m_MapTodMuStar[i]]
2049 vector<double> chi2s(NN, 0.);
2050 for (
int i = 0; i < NN; ++i)
2051 chi2s[i] = m_THM->TPS()->Particles()[i].chiDimensionfull(2, m_THM->Parameters(),
2053 m_THM->ChemicalPotential(i) + x[m_THM->m_MapTodMuStar[i]]
2056 vector<double> evc_Ps(NNdmu, 0.);
2057 for (
int i = 0; i < NN; ++i)
2058 evc_Ps[m_THM->m_MapTodMuStar[i]] += Ps[i];
2059 vector<double> ns_comps(NNdmu, 0.);
2060 for (
int i = 0; i < NN; ++i)
2061 ns_comps[m_THM->m_MapTodMuStar[i]] += ns[i];
2062 vector<double> chi2_comps(NNdmu, 0.);
2063 for (
int i = 0; i < NN; ++i)
2064 chi2_comps[m_THM->m_MapTodMuStar[i]] += chi2s[i];
2066 vector<double> np = m_THM->m_exvolmod->nsol(ns);
2067 m_THM->m_exvolmod->SetDensities(np);
2068 m_THM->m_mfmod->SetDensities(np);
2070 for (
int i = 0; i < NNdmu; ++i) {
2071 for (
int j = 0; j < NNdmu; ++j) {
2072 densMatrix(i, j) = 0.;
2074 densMatrix(i, j) += 1.;
2076 densMatrix(i, j) += -m_THM->m_exvolmod->df(m_THM->m_MapFromdMuStar[i], m_THM->m_MapFromdMuStar[j])
2083 PartialPivLU<MatrixXd> decomp(densMatrix);
2085 for (
int kp = 0; kp < NNdmu; ++kp) {
2087 for (
int l = 0; l < NNdmu; ++l) {
2091 * m_THM->m_exvolmod->f(m_THM->m_MapFromdMuStar[l]);
2095 solVector = decomp.solve(xVector);
2096 for (
int i = 0; i < NNdmu; ++i)
2097 if (solVector[i] > 1.) solVector[i] = 1.;
2099 vector<double> dnjdmukp(NNdmu, 0.);
2100 for (
int j = 0; j < NNdmu; ++j) {
2101 dnjdmukp[j] = solVector[j];
2104 vector<double> evc_d2fmul(NNdmu, 0.);
2105 vector<double> mfc_d2vmul(NNdmu, 0.);
2106 for (
int nn = 0; nn < NNdmu; ++nn) {
2107 for (
int in = 0; in < NNdmu; ++in) {
2108 for (
int inp = 0; inp < NNdmu; ++inp) {
2109 int n = m_THM->m_MapFromdMuStar[in];
2110 int np = m_THM->m_MapFromdMuStar[inp];
2111 int k = m_THM->m_MapFromdMuStar[nn];
2112 evc_d2fmul[nn] += -evc_Ps[in] * m_THM->m_exvolmod->d2f(n, k, np) * dnjdmukp[inp];
2117 for (
int nn = 0; nn < NNdmu; ++nn) {
2118 for (
int in = 0; in < NNdmu; ++in) {
2119 int n = m_THM->m_MapFromdMuStar[in];
2120 int k = m_THM->m_MapFromdMuStar[nn];
2121 mfc_d2vmul[nn] += m_THM->m_mfmod->d2v(k, n) * dnjdmukp[in];
2125 for (
int k = 0; k < NNdmu; ++k) {
2127 ret[k * NNdmu + kp] += 1.;
2128 ret[k * NNdmu + kp] += -m_THM->m_exvolmod->df(m_THM->m_MapFromdMuStar[kp], m_THM->m_MapFromdMuStar[k])
2131 ret[k * NNdmu + kp] += evc_d2fmul[k];
2132 ret[k * NNdmu + kp] += mfc_d2vmul[k];
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
Base class for multi-component excluded volume models.
Base class for multi-component mean field models.
virtual void CalculateSusceptibilityMatrix()
Calculates the conserved charges susceptibility matrix.
virtual void CalculateParticleChargeCorrelationMatrix()
Calculates the matrix of correlators between primordial (and also final) particle numbers and conserv...
virtual void FillChemicalPotentials()
Sets the chemical potentials of all particles.
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...
int ComponentsNumber() const
Number of different particle species in the list.
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.
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...
void CalculateFluctuations()
Calculate the fluctuations.
void CalculateComponentsMap()
Partitions particles species into sets that have identical pair interactions.
std::vector< std::vector< int > > m_dMuStarIndices
Vector of component indices for each particle species.
ThermalModelRealGas(ThermalParticleSystem *TPS_, const ThermalModelParameters ¶ms=ThermalModelParameters())
Construct a new ThermalModelRealGas object.
virtual std::vector< double > SearchSingleSolutionUsingComponents(const std::vector< double > &muStarInit)
Uses the Broyden method with a provided initial guess to determine the shifted chemical potentials by...
bool m_ComponentMapCalculated
Whether the mapping to components with the same VDW parameters has been calculated.
std::vector< int > m_MapTodMuStar
Mapping from particle species to dMuStar indices.
std::vector< double > SearchMultipleSolutions(int iters=300)
Uses the Broyden method with different initial guesses to look for different possible solutions of th...
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 std::vector< double > SearchSingleSolutionDirect(const std::vector< double > &muStarInit)
Uses the Broyden method with a provided initial guess to determine the shifted chemical potentials by...
virtual double CalculateEnergyDensity()
Calculate the energy density of the system.
std::vector< double > m_chiarb
Vector of computed susceptibilities for a specified arbitraty charge.
ExcludedVolumeModelMultiBase * m_exvolmod
Excluded volume model used in the real gas HRG model.
virtual std::vector< double > CalculateChargeFluctuationsOld(const std::vector< double > &chgs, int order=4)
Calculate the charge fluctuations of the particle species (old method).
std::vector< int > m_MapFromdMuStar
Mapping from dMuStar indices to particle species.
std::vector< double > SearchFirstSolution(int iters=50)
Try different initial guesses and return the first valid solution found.
virtual void CalculateTemperatureDerivatives()
Calculate the temperature derivatives of the system.
void CalculateTwoParticleCorrelations()
Calculate the two-particle correlations of the particle species.
virtual void CalculatePrimordialDensities()
Calculate the primordial densities of the particle species.
virtual double MuShift(int id) const
The shift in the chemical potential of particle species i due to the QvdW interactions.
virtual double CalculateEntropyDensity()
Calculate the entropy density of the system.
virtual void SetChemicalPotentials(const std::vector< double > &chem=std::vector< double >(0))
Set the chemical potentials of the particle species.
std::vector< double > m_MuStar
Vector of the shifted chemical potentials.
virtual double CalculateEntropyDensityDerivativeT()
Calculate the derivative of the entropy density with respect to temperature.
bool m_LastBroydenSuccessFlag
Whether Broyden's method was successfull.
virtual double CalculateEnergyDensityDerivativeT()
Calculate the derivative of the energy density with respect to temperature.
std::vector< double > m_DensitiesId
Vector of ideal gas densities with shifted chemical potentials.
virtual double CalculatePressure()
Calculate the pressure of the system.
virtual ~ThermalModelRealGas(void)
Destroy the ThermalModelRealGas object.
ExcludedVolumeModelMultiBase * m_exvolmodideal
Excluded volume model object in the ideal gas limit.
void FillChemicalPotentials()
Fill the chemical potentials of the particle species.
std::vector< double > m_scaldens
Vector of scalar densities. Not used.
MeanFieldModelMultiBase * m_mfmod
Mean field model used in the real gas HRG model.
MeanFieldModelMultiBase * m_mfmodideal
Mean field model object in the ideal gas limit.
std::vector< std::vector< double > > m_chi
Vector of computed susceptibilities values.
virtual std::vector< double > CalculateChargeFluctuations(const std::vector< double > &chgs, int order=4, bool dimensionfull=false)
Calculate the charge fluctuations of the particle species.
virtual double ParticleScalarDensity(int part)
Calculate the scalar density of a particle species.
bool m_SearchMultipleSolutions
Whether multiple solutions are considered.
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.
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.
Structure containing all thermal parameters of the model.
Contains some extra mathematical functions used in the code.