Thermal-FIST 1.6.1
Package for hadron resonance gas model applications
Loading...
Searching...
No Matches
ExcludedVolumeModelsMulti.cpp
Go to the documentation of this file.
2#include <cmath>
3#include <map>
4
5#include <Eigen/Dense>
6
7using namespace Eigen;
8
9namespace thermalfist {
10
12 const std::vector<double>& n = m_densities;
13 double ret = 1.;
14 for (int ii = 0; ii < n.size(); ++ii)
15 ret -= m_b[ii] * n[ii];
16 return ret;
17 }
18
19 double ExcludedVolumeModelDiagonalVDW::df(int i, int j) const {
20 const std::vector<double>& n = m_densities;
21 return -m_b[j];
22 }
23
25 {
26 const std::vector<double>& n = m_densities;
27 double ret = 0.;
28 for (int ii = 0; ii < n.size(); ++ii)
29 ret -= m_dbdT[ii] * n[ii];
30 return ret;
31 }
32
33 std::vector<double> ExcludedVolumeModelDiagonalVDW::nsol(const std::vector<double>& nid) {
34 std::vector<double> ret = nid;
35 double denom = 1.;
36 for (int ii = 0; ii < nid.size(); ++ii)
37 denom += m_b[ii] * nid[ii];
38 for (int ii = 0; ii < nid.size(); ++ii)
39 ret[ii] = nid[ii] / denom;
40 return ret;
41 }
42
44 {
45 m_components = std::vector<int>(m_N, 0);
46 m_componentsFrom = std::vector<int>();
47 std::map<std::pair<double,double>, int> MapEV;
49 for (int i = 0; i < m_N; ++i) {
50 std::pair<double, double> param = std::make_pair(m_b[i], m_dbdT[i]);
51 if (MapEV.count(param) == 0) {
52 MapEV[param] = m_componentsNumber;
53 m_componentsFrom.push_back(i);
55 }
56 m_components[i] = MapEV[param];
57 }
58 }
59
61 const std::vector<double>& n = m_densities;
62 double ret = 1.;
63 for (int j = 0; j < n.size(); ++j)
64 ret -= m_b[j][i] * n[j];
65 return ret;
66 }
67
68 double ExcludedVolumeModelCrosstermsVDW::df(int i, int j) const {
69 const std::vector<double>& n = m_densities;
70 return -m_b[j][i];
71 }
72
74 const std::vector<double>& n = m_densities;
75 double ret = 0.;
76 for (int j = 0; j < n.size(); ++j)
77 ret -= m_dbdT[j][i] * n[j];
78 return ret;
79 }
80
81 std::vector<double> ExcludedVolumeModelCrosstermsVDW::nsol(const std::vector<double>& nid) {
82 std::vector<double> ret = nid;
83 int NN = nid.size();
84
85 MatrixXd densMatrix(NN, NN);
86 VectorXd solVector(NN), xVector(NN);
87
88 for (int i = 0; i < NN; ++i)
89 for (int j = 0; j < NN; ++j) {
90 densMatrix(i, j) = m_b[j][i] * nid[i];
91 if (i == j) densMatrix(i, j) += 1.;
92 }
93
94 PartialPivLU<MatrixXd> decomp(densMatrix);
95
96 for (int i = 0; i < NN; ++i) xVector[i] = nid[i];
97 solVector = decomp.solve(xVector);
98
99 for (int i = 0; i < NN; ++i) ret[i] = solVector[i];
100
101 return ret;
102 }
103
105 {
106 m_components = std::vector<int>(m_N, 0);
107 m_componentsFrom = std::vector<int>();
108 std::map<std::vector<double>, int> MapEV;
110 for (int i = 0; i < m_N; ++i) {
111 std::vector<double> param(0);
112 for (int j = 0; j < m_N; ++j)
113 param.push_back(m_b[i][j]);
114 for (int j = 0; j < m_N; ++j)
115 param.push_back(m_b[j][i]);
116 for (int j = 0; j < m_N; ++j)
117 param.push_back(m_dbdT[i][j]);
118 for (int j = 0; j < m_N; ++j)
119 param.push_back(m_dbdT[j][i]);
120
121 if (MapEV.count(param) == 0) {
122 MapEV[param] = m_componentsNumber;
123 m_componentsFrom.push_back(i);
125 }
126 m_components[i] = MapEV[param];
127 }
128 }
129
137
139 {
140 return m_evmodelsingle->f(m_eta);
141 }
142
144 {
145 return m_evmodelsingle->df(1, m_eta) * (m_b[j] / 4.);
146 }
147
148 double ExcludedVolumeModelDiagonalGeneralized::d2f(int i, int j, int k) const
149 {
150 return m_evmodelsingle->df(2, m_eta) * (m_b[j] / 4.) * (m_b[k] / 4.);
151 }
152
153 double ExcludedVolumeModelDiagonalGeneralized::d3f(int i, int j, int k, int l) const
154 {
155 return m_evmodelsingle->df(3, m_eta) * (m_b[j] / 4.) * (m_b[k] / 4.) * (m_b[l] / 4.);
156 }
157
158 double ExcludedVolumeModelDiagonalGeneralized::d4f(int i, int j, int k, int l, int m) const
159 {
160 return m_evmodelsingle->df(4, m_eta) * (m_b[j] / 4.) * (m_b[k] / 4.) * (m_b[l] / 4.) * (m_b[m] / 4.);
161 }
162
164 {
165 double ret = 0.;
166 for (int i = 0; i < m_N; ++i)
167 ret += m_dbdT[i] * m_densities[i] / 4.;
168 ret *= m_evmodelsingle->df(1, m_eta);
169 return ret;
170 }
171
172 std::vector<double> ExcludedVolumeModelDiagonalGeneralized::nsol(const std::vector<double>& nid)
173 {
174 double etaid = GetEta(nid);
175 double eta = m_evmodelsingle->etasol(etaid);
176 double fval = m_evmodelsingle->f(eta);
177 std::vector<double> ret(m_N, 0.);
178 for (int i = 0; i < m_N; ++i)
179 ret[i] = fval * nid[i];
180 return ret;
181 }
182
188
190 {
191 m_components = std::vector<int>(m_N, 0);
192 m_componentsFrom = std::vector<int>();
193 std::map<std::pair<double, double>, int> MapEV;
195 for (int i = 0; i < m_N; ++i) {
196 std::pair<double, double> param = std::make_pair(m_b[i], m_dbdT[i]);
197 if (MapEV.count(param) == 0) {
198 MapEV[param] = m_componentsNumber;
199 m_componentsFrom.push_back(i);
201 }
202 m_components[i] = MapEV[param];
203 }
204 }
205
206 double ExcludedVolumeModelDiagonalGeneralized::GetEta(const std::vector<double>& n) const
207 {
208 double ret = 0.0;
209 for (int i = 0; i < n.size(); ++i)
210 ret += m_b[i] * n[i];
211 ret /= 4.;
212 return ret;
213 }
214
215 std::vector<double> ExcludedVolumeModelMultiBase::BroydenEquationsEVMulti::Equations(const std::vector<double>& x)
216 {
217 std::vector<double> ret(m_N, 0.);
218
219 std::vector<double> dens(m_EVM->m_N, 0.);
220 for (int i = 0; i < m_EVM->m_N; ++i) {
221 int ti = i;
222 if (m_componentsMode)
223 ti = m_EVM->ComponentIndices()[i];
224 dens[i] = x[ti] * m_ntil->operator[](i);
225 }
226 m_EVM->SetDensities(dens);
227
228 for (int i = 0; i < m_N; ++i) {
229 int fi = i;
230 if (m_componentsMode)
231 fi = m_EVM->ComponentIndicesFrom()[i];
232 ret[i] = x[i] - m_EVM->f(fi);
233 }
234
235 return ret;
236 }
237
238 std::vector<double> ExcludedVolumeModelMultiBase::BroydenJacobianEVMulti::Jacobian(const std::vector<double>& x)
239 {
240 int N = x.size();
241 std::vector<double> ret(N * N);
242
243 std::vector<double> dens(m_EVM->m_N, 0.);
244 for (int i = 0; i < m_EVM->m_N; ++i) {
245 int ti = i;
246 if (m_componentsMode)
247 ti = m_EVM->ComponentIndices()[i];
248 dens[i] = x[ti] * m_ntil->operator[](i);
249 }
250 m_EVM->SetDensities(dens);
251
252 std::vector<double> ntilcomp(N, 0.);
253 for (int i = 0; i < m_EVM->m_N; ++i) {
254 int ti = i;
255 if (m_componentsMode)
256 ti = m_EVM->ComponentIndices()[i];
257 ntilcomp[ti] = m_ntil->operator[](i);
258 }
259
260 for (int i = 0; i < N; ++i) {
261 int fi = i;
262 if (m_componentsMode)
263 fi = m_EVM->ComponentIndicesFrom()[i];
264 for (int j = 0; j < N; ++j) {
265 int fj = j;
266 if (m_componentsMode)
267 fj = m_EVM->ComponentIndicesFrom()[j];
268 ret[i * N + j] = 0.;
269 if (i == j)
270 ret[i * N + j] += 1.;
271 ret[i * N + j] += -m_EVM->df(fi, fj) * ntilcomp[j];
272 }
273 }
274
275 return ret;;
276 }
277
278 std::vector<double> ExcludedVolumeModelMultiBase::nsolBroyden(const std::vector<double>& ntil)
279 {
280 BroydenEquationsEVMulti eqs(this, &ntil);
281 BroydenJacobianEVMulti jac(this, &ntil);
282 Broyden broydn(&eqs, &jac);
284
285 std::vector<double> ret(m_N, 0.);
286
287 ret = broydn.Solve(ret, &crit);
288 for (int i = 0; i < m_N; ++i)
289 ret[i] *= ntil[i];
290
291 return ret;
292 }
293
294 std::vector<double> ExcludedVolumeModelMultiBase::nsolBroydenComponents(const std::vector<double>& ntil)
295 {
296 BroydenEquationsEVMulti eqs(this, &ntil, true);
297 BroydenJacobianEVMulti jac(this, &ntil, true);
299
300 std::vector<double> ret(m_N, 0.);
301 std::vector<double> sol(m_componentsNumber, 0.);
302 bool converged = false;
303
304 // Try cached previous solution as initial guess first
306 Broyden broydn(&eqs, &jac);
307 sol = broydn.Solve(m_previousSolComponents, &crit);
308 converged = (broydn.Iterations() < broydn.MaxIterations());
309 }
310
311 // Fall back to unit initial guess (no suppression)
312 if (!converged) {
313 Broyden broydn2(&eqs, &jac);
314 std::vector<double> sol1(m_componentsNumber, 1.);
315 sol = broydn2.Solve(sol1, &crit);
316 converged = (broydn2.Iterations() < broydn2.MaxIterations());
317 }
318
319 // Fall back to zero initial guess
320 if (!converged) {
321 Broyden broydn3(&eqs, &jac);
322 std::vector<double> sol0(m_componentsNumber, 0.);
323 sol = broydn3.Solve(sol0, &crit);
324 converged = (broydn3.Iterations() < broydn3.MaxIterations());
325 }
326
327 // Last resort: fixed-point iteration (guaranteed to stay in physical bounds)
328 if (!converged) {
329 sol = std::vector<double>(m_componentsNumber, 1.);
330 double alpha = 0.5;
331 for (int iter = 0; iter < 10000; ++iter) {
332 auto residual = eqs.Equations(sol);
333 double maxres = 0.;
334 for (int c = 0; c < m_componentsNumber; ++c)
335 if (std::abs(residual[c]) > maxres) maxres = std::abs(residual[c]);
336 if (maxres < 1.0E-10) {
337 converged = true;
338 break;
339 }
340 // sol_new[c] = sol[c] - residual[c] = f(eta_c), clamp to [0, 1]
341 for (int c = 0; c < m_componentsNumber; ++c) {
342 double sol_new = sol[c] - residual[c];
343 if (sol_new < 0.) sol_new = 0.;
344 if (sol_new > 1.) sol_new = 1.;
345 sol[c] = alpha * sol_new + (1. - alpha) * sol[c];
346 }
347 }
348 }
349
350 // Only cache if converged to avoid propagating bad solutions
351 if (converged) {
354
355 for (int i = 0; i < m_N; ++i)
356 ret[i] = ntil[i] * sol[m_components[i]];
357 }
358 // If all methods failed, ret stays at zeros (safe fallback)
359
360 return ret;
361 }
362
364 {
365 m_components = std::vector<int>(m_N, 0);
367 m_componentsFrom = std::vector<int>(1, 0);
368 }
369
370
372 {
374 for (int i = 0; i < m_componentsNumber; ++i) {
376 }
377 //for (int i = 0; i < m_N; ++i) {
378 // m_etas[i] = GetEta(i, m_densities);
379 //}
380 }
381
383 {
384 m_components = std::vector<int>(m_N, 0);
385 m_componentsFrom = std::vector<int>();
386 std::map<std::vector<double>, int> MapEV;
388 for (int i = 0; i < m_N; ++i) {
389 std::vector<double> param(0);
390 for (int j = 0; j < m_N; ++j)
391 param.push_back(m_b[i][j]);
392 for (int j = 0; j < m_N; ++j)
393 param.push_back(m_b[j][i]);
394 for (int j = 0; j < m_N; ++j)
395 param.push_back(m_dbdT[i][j]);
396 for (int j = 0; j < m_N; ++j)
397 param.push_back(m_dbdT[j][i]);
398
399 if (MapEV.count(param) == 0) {
400 MapEV[param] = m_componentsNumber;
401 m_componentsFrom.push_back(i);
403 }
404 m_components[i] = MapEV[param];
405 }
406
408 for (int i = 0; i < m_componentsNumber; ++i) {
409 for (int j = 0; j < m_componentsNumber; ++j) {
410 if (i != j) {
413 }
414 }
415 }
416
417 printf("EV Components: %d Are Disconnected: %d\n", m_componentsNumber, (int)m_componentsDisconnected);
418 }
419
420 double ExcludedVolumeModelCrosstermsGeneralized::GetEta(int i, const std::vector<double>& n) const
421 {
422 double ret = 0.0;
423 for (int j = 0; j < n.size(); ++j)
424 ret += m_b[j][i] * n[j];
425 ret /= 4.;
426 return ret;
427 }
428
436
438 {
439 //return m_evmodelsingle->f(m_etas[i]);
440 return m_evmodelsingle->f(m_etas[ComponentIndices()[i]]);
441 }
442
444 {
445 //return m_evmodelsingle->df(1, m_etas[i]) * (m_b[j][i] / 4.);
446 return m_evmodelsingle->df(1, m_etas[ComponentIndices()[i]]) * (m_b[j][i] / 4.);
447 }
448
449 double ExcludedVolumeModelCrosstermsGeneralized::d2f(int i, int j, int k) const
450 {
451 //return m_evmodelsingle->df(2, m_etas[i]) * (m_b[j][i] / 4.) * (m_b[k][i] / 4.);
452 return m_evmodelsingle->df(2, m_etas[ComponentIndices()[i]]) * (m_b[j][i] / 4.) * (m_b[k][i] / 4.);
453 }
454
455 double ExcludedVolumeModelCrosstermsGeneralized::d3f(int i, int j, int k, int l) const
456 {
457 //return m_evmodelsingle->df(3, m_etas[i]) * (m_b[j][i] / 4.) * (m_b[k][i] / 4.) * (m_b[l][i] / 4.);
458 return m_evmodelsingle->df(3, m_etas[ComponentIndices()[i]]) * (m_b[j][i] / 4.) * (m_b[k][i] / 4.) * (m_b[l][i] / 4.);
459 }
460
461 double ExcludedVolumeModelCrosstermsGeneralized::d4f(int i, int j, int k, int l, int m) const
462 {
463 //return m_evmodelsingle->df(4, m_etas[i]) * (m_b[j][i] / 4.) * (m_b[k][i] / 4.) * (m_b[l][i] / 4.) * (m_b[m][i] / 4.);
464 return m_evmodelsingle->df(4, m_etas[ComponentIndices()[i]]) * (m_b[j][i] / 4.) * (m_b[k][i] / 4.) * (m_b[l][i] / 4.) * (m_b[m][i] / 4.);
465 }
466
468 {
469 double ret = 0.;
470 for (int j = 0; j < m_N; ++j)
471 ret += m_dbdT[j][i] * m_densities[j] / 4.;
472 //ret *= m_evmodelsingle->df(1, m_etas[i]);
473 ret *= m_evmodelsingle->df(1, m_etas[ComponentIndices()[i]]);
474 return ret;
475 }
476
477 std::vector<double> ExcludedVolumeModelCrosstermsGeneralized::nsol(const std::vector<double>& nid)
478 {
480 return nsolBroydenComponents(nid);
481 return nsolBroyden(nid);
482 }
483
484 // Disconnected components, use binary search separately for each component
485 std::vector<double> nids_comp(m_componentsNumber, 0.);
486 for (int i = 0; i < nid.size(); ++i)
487 nids_comp[m_components[i]] += nid[i];
488
489 std::vector<double> fvals(m_componentsNumber, 0.);
490 for (int ic = 0; ic < m_componentsNumber; ++ic) {
491 int ti = m_componentsFrom[ic];
492 double etaid = m_b[ti][ti] * nids_comp[ic] / 4.;
493 double eta = m_evmodelsingle->etasol(etaid);
494 fvals[ic] = m_evmodelsingle->f(eta);
495 }
496 std::vector<double> ret(m_N, 0.);
497 for (int i = 0; i < nid.size(); ++i) {
498 ret[i] = fvals[m_components[i]] * nid[i];
499 }
500 return ret;
501
502
503
504 //std::vector<double> etasid(m_N);
505 //for (int i = 0; i < m_N; ++i)
506 // etasid[i] = GetEta(i, nid);
507 //for (int i = 0; i < m_N; ++i) {
508 // double etaid = etasid[i];
509 // double eta = m_evmodelsingle->etasol(etaid);
510 // double fval = m_evmodelsingle->f(eta);
511 // ret[i] = fval * nid[i];
512 //}
513 //return ret;
514 }
515
516 void ExcludedVolumeModelComponents::SetDensities(const std::vector<double>& n)
517 {
519
520 for (int i = 0; i < m_densities_components.size(); ++i)
522
523 for (int i = 0; i < n.size(); ++i)
525 }
526
528 {
530 for (int i = m_N - 1; i >= 0; --i) {
532 }
533 }
534
536 {
537 for (int i = 0; i < m_componentsNumber; ++i) {
538 if (m_evmodels[i] != NULL) {
539 delete m_evmodels[i];
540 m_evmodels[i] = NULL;
541 }
542 }
543 }
544
546 {
547 int tind = m_components[i];
548 double eta = m_b[tind] * m_densities_components[tind] / 4.;
549 return m_evmodels[tind]->f(eta);
550 }
551
552 double ExcludedVolumeModelComponents::df(int i, int j) const
553 {
554 bool fl = 1;
555 fl &= (m_components[i] == m_components[j]);
556 if (!fl) return 0.;
557
558 int tind = m_components[i];
559 double eta = m_b[tind] * m_densities_components[tind] / 4.;
560 return m_evmodels[tind]->df(1, eta) * (m_b[tind] / 4.);
561 }
562
563 double ExcludedVolumeModelComponents::d2f(int i, int j, int k) const
564 {
565 bool fl = 1;
566 fl &= (m_components[i] == m_components[j]);
567 fl &= (m_components[i] == m_components[k]);
568 if (!fl) return 0.;
569
570 int tind = m_components[i];
571 double eta = m_b[tind] * m_densities_components[tind] / 4.;
572 return m_evmodels[tind]->df(2, eta) * (m_b[tind] / 4.) * (m_b[tind] / 4.);
573 }
574
575 double ExcludedVolumeModelComponents::d3f(int i, int j, int k, int l) const
576 {
577 bool fl = 1;
578 fl &= (m_components[i] == m_components[j]);
579 fl &= (m_components[i] == m_components[k]);
580 fl &= (m_components[i] == m_components[l]);
581 if (!fl) return 0.;
582
583 int tind = m_components[i];
584 double eta = m_b[tind] * m_densities_components[tind] / 4.;
585 return m_evmodels[tind]->df(3, eta) * (m_b[tind] / 4.) * (m_b[tind] / 4.) * (m_b[tind] / 4.);
586 }
587
588 double ExcludedVolumeModelComponents::d4f(int i, int j, int k, int l, int m) const
589 {
590 bool fl = 1;
591 fl &= (m_components[i] == m_components[j]);
592 fl &= (m_components[i] == m_components[k]);
593 fl &= (m_components[i] == m_components[l]);
594 fl &= (m_components[i] == m_components[m]);
595 if (!fl) return 0.;
596
597 int tind = m_components[i];
598 double eta = m_b[tind] * m_densities_components[tind] / 4.;
599 return m_evmodels[tind]->df(4, eta) * (m_b[tind] / 4.) * (m_b[tind] / 4.) * (m_b[tind] / 4.) * (m_b[tind] / 4.);
600 }
601
603 {
604 int tind = m_components[i];
605 double eta = m_b[tind] * m_densities_components[tind] / 4.;
606 return m_evmodels[tind]->df(1, eta) * (m_dbdT[tind] * m_densities_components[tind] / 4.);
607 }
608
609 std::vector<double> ExcludedVolumeModelComponents::nsol(const std::vector<double>& nid)
610 {
611 std::vector<double> nids_comp(m_componentsNumber, 0.);
612 for (int i = 0; i < nid.size(); ++i)
613 nids_comp[m_components[i]] += nid[i];
614
615 std::vector<double> fvals(m_componentsNumber, 0.);
616 for (int ic = 0; ic < m_componentsNumber; ++ic) {
617 double etaid = m_b[ic] * nids_comp[ic] / 4.;
618 double eta = m_evmodels[ic]->etasol(etaid);
619 fvals[ic] = m_evmodels[ic]->f(eta);
620 }
621 std::vector<double> ret(m_N, 0.);
622 for (int i = 0; i < nid.size(); ++i) {
623 ret[i] = fvals[m_components[i]] * nid[i];
624 }
625 return ret;
626 }
627
628} // namespace thermalfist
Sub-class where it is determined whether the required accuracy is achieved in the Broyden's method.
Definition Broyden.h:144
int m_N
The number of equations.
Definition Broyden.h:66
Class implementing the Broyden method to solve a system of non-linear equations.
Definition Broyden.h:132
virtual std::vector< double > Solve(const std::vector< double > &x0, BroydenSolutionCriterium *solcrit=NULL, int max_iterations=MAX_ITERS)
Definition Broyden.cpp:83
int Iterations() const
Definition Broyden.h:229
int MaxIterations() const
Definition Broyden.h:234
virtual ~ExcludedVolumeModelComponents()
Destructor for the ExcludedVolumeModelComponents class.
virtual double d2f(int i, int j, int k) const
Calculates the second derivative of the suppression factor.
virtual double d4f(int i, int j, int k, int l, int m) const
Calculates the fourth derivative of the suppression factor.
virtual double d3f(int i, int j, int k, int l) const
Calculates the third derivative of the suppression factor.
virtual void SetDensities(const std::vector< double > &n)
Sets the densities of particle species.
virtual void ComputeComponents()
Computes the components based on the excluded volume parameters.
virtual double dfdT(int i) const
Calculates the temperature derivative of the suppression factor.
virtual std::vector< double > nsol(const std::vector< double > &nid)
Solves for the actual densities given the ideal gas densities.
virtual double f(int i) const
Calculates the suppression factor for species i.
std::vector< ExcludedVolumeModelBase * > m_evmodels
virtual double df(int i, int j) const
Calculates the first derivative of the suppression factor.
virtual double d3f(int i, int j, int k, int l) const
Calculates the third derivative of the suppression factor.
virtual double d2f(int i, int j, int k) const
Calculates the second derivative of the suppression factor.
virtual void SetDensities(const std::vector< double > &n)
Sets the densities of particle species.
virtual std::vector< double > nsol(const std::vector< double > &nid)
Solves for the actual densities given the ideal gas densities.
virtual double dfdT(int i) const
Calculates the temperature derivative of the suppression factor.
double GetEta(int i, const std::vector< double > &n) const
Calculates the eta parameter for the given densities and species index.
virtual double df(int i, int j) const
Calculates the first derivative of the suppression factor.
virtual double d4f(int i, int j, int k, int l, int m) const
Calculates the fourth derivative of the suppression factor.
virtual void ComputeComponents()
Computes the components based on the excluded volume parameters.
virtual double f(int i) const
Calculates the suppression factor for species i.
virtual ~ExcludedVolumeModelCrosstermsGeneralized()
Destructor for the ExcludedVolumeModelCrosstermsGeneralized class.
virtual double df(int i, int j) const
Calculates the first derivative of the suppression factor.
virtual void ComputeComponents()
Computes the components based on the excluded volume parameters.
virtual std::vector< double > nsol(const std::vector< double > &nid)
Solves for the actual densities given the ideal gas densities.
virtual double dfdT(int i) const
Calculates the temperature derivative of the suppression factor.
virtual double f(int i) const
Calculates the suppression factor for species i.
virtual ~ExcludedVolumeModelDiagonalGeneralized()
Destructor for the ExcludedVolumeModelDiagonalGeneralized class.
virtual double f(int i) const
Calculates the suppression factor for species i.
virtual double df(int i, int j) const
Calculates the first derivative of the suppression factor.
virtual double d2f(int i, int j, int k) const
Calculates the second derivative of the suppression factor.
double GetEta(const std::vector< double > &n) const
Calculates the eta parameter for the given densities.
virtual double dfdT(int i) const
Calculates the temperature derivative of the suppression factor.
virtual void ComputeComponents()
Computes the components based on the excluded volume parameters.
virtual std::vector< double > nsol(const std::vector< double > &nid)
Solves for the actual densities given the ideal gas densities.
virtual double d3f(int i, int j, int k, int l) const
Calculates the third derivative of the suppression factor.
virtual double d4f(int i, int j, int k, int l, int m) const
Calculates the fourth derivative of the suppression factor.
virtual void SetDensities(const std::vector< double > &n)
Sets the densities of particle species.
virtual void ComputeComponents()
Computes the components based on the excluded volume parameters.
virtual double f(int i) const
Calculates the suppression factor for species i.
virtual double df(int i, int j) const
Calculates the first derivative of the suppression factor.
virtual double dfdT(int i) const
Calculates the temperature derivative of the suppression factor.
virtual std::vector< double > nsol(const std::vector< double > &nid)
Solves for the actual densities given the ideal gas densities.
std::vector< double > Equations(const std::vector< double > &x)
Calculates the equations for Broyden's method.
std::vector< double > Jacobian(const std::vector< double > &x)
Calculates the Jacobian matrix for Broyden's method.
virtual std::vector< double > nsolBroydenComponents(const std::vector< double > &ntil)
Solves for the actual densities using Broyden's method, considering components.
std::vector< double > m_previousSolComponents
Cached previous Broyden solution (per component) for use as initial guess.
virtual const std::vector< int > & ComponentIndices() const
Gets the component indices.
virtual void ComputeComponents()
Computes the components based on the excluded volume parameters.
virtual void SetDensities(const std::vector< double > &n)
Sets the densities of particle species.
virtual std::vector< double > nsolBroyden(const std::vector< double > &ntil)
Solves for the actual densities using Broyden's method.
The main namespace where all classes and functions of the Thermal-FIST library reside.
Definition CosmicEoS.h:9