Thermal-FIST 1.5
Package for hadron resonance gas model applications
Loading...
Searching...
No Matches
IdealGasFunctions.cpp
Go to the documentation of this file.
1/*
2 * Thermal-FIST package
3 *
4 * Copyright (c) 2017-2019 Volodymyr Vovchenko
5 *
6 * GNU General Public License (GPLv3 or later)
7 */
9
10#include <stdio.h>
11#include <cmath>
12#include <sstream>
13#include <stdexcept>
14#include <cfloat>
15#include <vector>
16#include <cassert>
17
18#include "HRGBase/xMath.h"
20
21using namespace std;
22
23namespace thermalfist {
24
25 namespace IdealGasFunctions {
26
28 std::vector<double> GetSpins(double degSpin) {
29 // Check that spin degeneracy is integer
30 assert(abs(degSpin - round(degSpin)) < 1.e-6);
31 int spinDegeneracy = round(degSpin);
32 std::vector<double> ret;
33 for(int isz = 0; isz < spinDegeneracy; ++isz) {
34 ret.push_back(-(spinDegeneracy - 1.)/2. + isz);
35 }
36 return ret;
37 }
38
40
41 double BoltzmannDensity(double T, double mu, double m, double deg,
42 const IdealGasFunctionsExtraConfig& extraConfig) {
43 // Check for magnetic field effect for charged particles
44 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
45 double Qmod = abs(extraConfig.MagneticField.Q);
46 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
47 // Use Eq. (7) from https://arxiv.org/pdf/2104.06843.pdf
48 // Sum over spins
49 double ret = 0.;
50 for(double sz : spins) {
51 // Sum over Landau levels
52 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
53 double e0 = sqrt(m*m + Qmod*extraConfig.MagneticField.B*(2.*l + 1. - 2.*sz));
54 ret += e0 * xMath::BesselKexp(1, e0 / T) * exp((mu - e0) / T);
55 }
56 }
57 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
58 }
59
60 // No magnetic field
61 if (m == 0.)
62 return deg * T * T * T / 2. / xMath::Pi() / xMath::Pi() * 2. * exp(mu/ T) * xMath::GeVtoifm3();
63 return deg * m * m * T / 2. / xMath::Pi() / xMath::Pi() * xMath::BesselKexp(2, m / T) * exp((mu - m) / T) * xMath::GeVtoifm3();
64 }
65
66 double BoltzmannPressure(double T, double mu, double m, double deg,
67 const IdealGasFunctionsExtraConfig& extraConfig) {
68 return T * BoltzmannDensity(T, mu, m, deg, extraConfig);
69 }
70
71 double BoltzmannEnergyDensity(double T, double mu, double m, double deg,
72 const IdealGasFunctionsExtraConfig& extraConfig) {
73 // Check for magnetic field effect for charged particles
74 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
75 // TODO: Check that it's done correctly
76 double Qmod = abs(extraConfig.MagneticField.Q);
77 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
78 // Use e = -p + T (dp/dT) + mu (dp/mu) + B * (dp/dB)
79 // Sum over spins
80 double ret = 0.;
81 for(double sz : spins) {
82 // Sum over Landau levels
83 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
84 double e0 = sqrt(m*m + Qmod*extraConfig.MagneticField.B*(2.*l + 1. - 2.*sz));
85 ret += (T + e0 * xMath::BesselKexp(0, e0 / T) / xMath::BesselKexp(1, e0 / T)) * e0 * xMath::BesselKexp(1, e0 / T) * exp((mu - e0) / T);
86 }
87 }
88 ret *= Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
89 return ret + extraConfig.MagneticField.B * BoltzmannMagnetization(T, mu, m, deg, extraConfig) * xMath::GeVtoifm3();
90 }
91
92 // No magnetic field
93 if (m == 0.)
94 return 3 * T * BoltzmannDensity(T, mu, m, deg);
95 return (3 * T + m * xMath::BesselK1exp(m / T) / xMath::BesselKexp(2, m / T)) * BoltzmannDensity(T, mu, m, deg);
96 }
97
98 double BoltzmannEntropyDensity(double T, double mu, double m, double deg,
99 const IdealGasFunctionsExtraConfig& extraConfig) {
100 double ret = (BoltzmannPressure(T, mu, m, deg, extraConfig) +
101 BoltzmannEnergyDensity(T, mu, m, deg, extraConfig) -
102 mu * BoltzmannDensity(T, mu, m, deg, extraConfig)) / T;
103
104 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.)
105 ret -= extraConfig.MagneticField.B * BoltzmannMagnetization(T, mu, m, deg, extraConfig) * xMath::GeVtoifm3() / T;
106
107 return ret;
108 }
109
110 double BoltzmannScalarDensity(double T, double mu, double m, double deg,
111 const IdealGasFunctionsExtraConfig& extraConfig) {
112 // Check for magnetic field effect for charged particles
113 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
114 // TODO: Check that it's done correctly
115 double Qmod = abs(extraConfig.MagneticField.Q);
116 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
117 // Use nsig = -dp/dm
118 // Sum over spins
119 double ret = 0.;
120 for(double sz : spins) {
121 // Sum over Landau levels
122 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
123 double e0 = sqrt(m*m + Qmod*extraConfig.MagneticField.B*(2.*l + 1. - 2.*sz));
124 ret += m * xMath::BesselKexp(0, e0 / T) * exp((mu - e0) / T);
125 }
126 }
127 ret *= Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
128 return ret;
129 }
130
131 // No magnetic field
132 if (m == 0.)
133 return 0.;
134 return deg * m * m * T / 2. / xMath::Pi() / xMath::Pi() * xMath::BesselKexp(1, m / T) * exp((mu - m) / T) * xMath::GeVtoifm3();
135 }
136
137 double BoltzmannTdndmu(int /*N*/, double T, double mu, double m, double deg,
138 const IdealGasFunctionsExtraConfig& extraConfig)
139 {
140 return BoltzmannDensity(T, mu, m, deg, extraConfig);
141 }
142
143 double BoltzmannChiN(int N, double T, double mu, double m, double deg,
144 const IdealGasFunctionsExtraConfig& extraConfig)
145 {
146 return BoltzmannTdndmu(N - 1, T, mu, m, deg, extraConfig) / pow(T, 3) / xMath::GeVtoifm3();
147 }
148
149 double BoltzmannChiNDimensionfull(int N, double T, double mu, double m, double deg,
150 const IdealGasFunctionsExtraConfig& extraConfig)
151 {
152 return BoltzmannTdndmu(N - 1, T, mu, m, deg, extraConfig) / pow(T, N - 1) / xMath::GeVtoifm3();
153 }
154
155 double QuantumClusterExpansionDensity(int statistics, double T, double mu, double m, double deg, int order,
156 const IdealGasFunctionsExtraConfig& extraConfig)
157 {
158 bool signchange = true;
159 if (statistics == 1) //Fermi
160 signchange = true;
161 else if (statistics == -1) //Bose
162 signchange = false;
163 else
164 return BoltzmannDensity(T, mu, m, deg, extraConfig);
165
166 // Check for magnetic field effect for charged particles
167 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
168 double Qmod = abs(extraConfig.MagneticField.Q);
169 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
170
171
172 // Use Eq. (7) from https://arxiv.org/pdf/2104.06843.pdf
173 // Sum over spins
174 double ret = 0.;
175 for(double sz : spins) {
176 // Sum over Landau levels
177 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
178 double e0 = sqrt(m*m + Qmod*extraConfig.MagneticField.B*(2.*l + 1. - 2.*sz));
179
180 // Sum over clusters
181 double tfug = exp((mu - e0) / T);
182 double EoverT = e0 / T;
183 double cfug = tfug;
184 double sign = 1.;
185 for (int i = 1; i <= order; ++i) {
186 ret += e0 * sign * xMath::BesselKexp(1, i*EoverT) * cfug;
187 cfug *= tfug;
188 if (signchange) sign = -sign;
189 }
190 }
191 }
192 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
193 }
194
195 // No magnetic field
196 double tfug = exp((mu - m) / T);
197 double moverT = m / T;
198 double cfug = tfug;
199 double sign = 1.;
200 double ret = 0.;
201 for (int i = 1; i <= order; ++i) {
202 ret += sign * xMath::BesselKexp(2, i*moverT) * cfug / static_cast<double>(i);
203 cfug *= tfug;
204 if (signchange) sign = -sign;
205 }
206 ret *= deg * m * m * T / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
207 return ret;
208 }
209
210 double QuantumClusterExpansionPressure(int statistics, double T, double mu, double m, double deg, int order,
211 const IdealGasFunctionsExtraConfig& extraConfig)
212 {
213 bool signchange = true;
214 if (statistics == 1) //Fermi
215 signchange = true;
216 else if (statistics == -1) //Bose
217 signchange = false;
218 else
219 return BoltzmannPressure(T, mu, m, deg, extraConfig);
220
221 // Check for magnetic field effect for charged particles
222 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
223 double Qmod = abs(extraConfig.MagneticField.Q);
224 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
225
226
227 // Use Eq. (7) from https://arxiv.org/pdf/2104.06843.pdf
228 // Sum over spins
229 double ret = 0.;
230 for(double sz : spins) {
231 // Sum over Landau levels
232 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
233 double e0 = sqrt(m*m + Qmod*extraConfig.MagneticField.B*(2.*l + 1. - 2.*sz));
234
235 // Sum over clusters
236 double tfug = exp((mu - e0) / T);
237 double EoverT = e0 / T;
238 double cfug = tfug;
239 double sign = 1.;
240 for (int i = 1; i <= order; ++i) {
241 ret += e0 * sign * xMath::BesselKexp(1, i*EoverT) * cfug * T / static_cast<double>(i);
242 cfug *= tfug;
243 if (signchange) sign = -sign;
244 }
245 }
246 }
247 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
248 }
249
250 // No magnetic field
251 double tfug = exp((mu - m) / T);
252 double cfug = tfug;
253 double moverT = m / T;
254 double sign = 1.;
255 double ret = 0.;
256 for (int i = 1; i <= order; ++i) {
257 ret += sign * xMath::BesselKexp(2, i*moverT) * cfug / static_cast<double>(i) / static_cast<double>(i);
258 cfug *= tfug;
259 if (signchange) sign = -sign;
260 }
261 ret *= deg * m * m * T * T / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
262 return ret;
263 }
264
265 double QuantumClusterExpansionEnergyDensity(int statistics, double T, double mu, double m, double deg, int order,
266 const IdealGasFunctionsExtraConfig& extraConfig)
267 {
268 bool signchange = true;
269 if (statistics == 1) //Fermi
270 signchange = true;
271 else if (statistics == -1) //Bose
272 signchange = false;
273 else
274 return BoltzmannEnergyDensity(T, mu, m, deg, extraConfig);
275
276 // Check for magnetic field effect for charged particles
277 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
278 double Qmod = abs(extraConfig.MagneticField.Q);
279 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
280
281
282 // Use Eq. (7) from https://arxiv.org/pdf/2104.06843.pdf
283 // Sum over spins
284 double ret = 0.;
285 for(double sz : spins) {
286 // Sum over Landau levels
287 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
288 double e0 = sqrt(m*m + Qmod*extraConfig.MagneticField.B*(2.*l + 1. - 2.*sz));
289
290 // Sum over clusters
291 double tfug = exp((mu - e0) / T);
292 double EoverT = e0 / T;
293 double cfug = tfug;
294 double sign = 1.;
295 for (int i = 1; i <= order; ++i) {
296 ret += sign * e0 * T / static_cast<double>(i) * xMath::BesselKexp(1, i*EoverT) * cfug;
297 ret += sign * e0 * e0 * xMath::BesselKexp(0, i*EoverT) * cfug;
298 cfug *= tfug;
299 if (signchange) sign = -sign;
300 }
301 }
302 }
303 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3()
304 + extraConfig.MagneticField.B * QuantumClusterExpansionMagnetization(statistics, T, mu, m, deg, order, extraConfig) * xMath::GeVtoifm3();
305 }
306
307 // No magnetic field
308 double tfug = exp((mu - m) / T);
309 double cfug = tfug;
310 double moverT = m / T;
311 double sign = 1.;
312 double ret = 0.;
313 for (int i = 1; i <= order; ++i) {
314 ret += sign * (xMath::BesselKexp(1, i*moverT) + 3. * xMath::BesselKexp(2, i*moverT) / moverT / static_cast<double>(i)) * cfug / static_cast<double>(i);
315 cfug *= tfug;
316 if (signchange) sign = -sign;
317 }
318 ret *= deg * m * m * m * T / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
319 return ret;
320 }
321
322 double QuantumClusterExpansionEntropyDensity(int statistics, double T, double mu, double m, double deg, int order,
323 const IdealGasFunctionsExtraConfig& extraConfig)
324 {
325 double ret = (QuantumClusterExpansionPressure(statistics, T, mu, m, deg, order, extraConfig) +
326 QuantumClusterExpansionEnergyDensity(statistics, T, mu, m, deg, order, extraConfig) -
327 mu * QuantumClusterExpansionDensity(statistics, T, mu, m, deg, order, extraConfig)) / T;
328
329 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.)
330 ret -= extraConfig.MagneticField.B * QuantumClusterExpansionMagnetization(statistics, T, mu, m, deg, order, extraConfig) * xMath::GeVtoifm3() / T;
331
332 return ret;
333 }
334
335 double QuantumClusterExpansionScalarDensity(int statistics, double T, double mu, double m, double deg, int order,
336 const IdealGasFunctionsExtraConfig& extraConfig)
337 {
338 bool signchange = true;
339 if (statistics == 1) //Fermi
340 signchange = true;
341 else if (statistics == -1) //Bose
342 signchange = false;
343 else
344 return BoltzmannScalarDensity(T, mu, m, deg, extraConfig);
345
346 // Check for magnetic field effect for charged particles
347 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
348 double Qmod = abs(extraConfig.MagneticField.Q);
349 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
350
351
352 // Use Eq. (7) from https://arxiv.org/pdf/2104.06843.pdf
353 // Sum over spins
354 double ret = 0.;
355 for(double sz : spins) {
356 // Sum over Landau levels
357 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
358 double e0 = sqrt(m*m + Qmod*extraConfig.MagneticField.B*(2.*l + 1. - 2.*sz));
359
360 // Sum over clusters
361 double tfug = exp((mu - e0) / T);
362 double EoverT = e0 / T;
363 double cfug = tfug;
364 double sign = 1.;
365 for (int i = 1; i <= order; ++i) {
366 ret += m * sign * xMath::BesselKexp(0, i*EoverT) * cfug;
367 cfug *= tfug;
368 if (signchange) sign = -sign;
369 }
370 }
371 }
372 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
373 }
374
375 // No magnetic field
376 double tfug = exp((mu - m) / T);
377 double cfug = tfug;
378 double moverT = m / T;
379 double sign = 1.;
380 double ret = 0.;
381 for (int i = 1; i <= order; ++i) {
382 ret += sign * xMath::BesselKexp(1, i*moverT) * cfug / static_cast<double>(i);
383 cfug *= tfug;
384 if (signchange) sign = -sign;
385 }
386 ret *= deg * m * m * T / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
387 return ret;
388 }
389
390 double QuantumClusterExpansionTdndmu(int N, int statistics, double T, double mu, double m, double deg, int order,
391 const IdealGasFunctionsExtraConfig& extraConfig)
392 {
393 bool signchange = true;
394 if (statistics == 1) //Fermi
395 signchange = true;
396 else if (statistics == -1) //Bose
397 signchange = false;
398 else
399 return BoltzmannTdndmu(N, T, mu, m, deg, extraConfig);
400
401 // Check for magnetic field effect for charged particles
402 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
403 double Qmod = abs(extraConfig.MagneticField.Q);
404 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
405
406
407 // Sum over spins
408 double ret = 0.;
409 for(double sz : spins) {
410 // Sum over Landau levels
411 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
412 double e0 = sqrt(m*m + Qmod*extraConfig.MagneticField.B*(2.*l + 1. - 2.*sz));
413
414 // Sum over clusters
415 double tfug = exp((mu - e0) / T);
416 double EoverT = e0 / T;
417 double cfug = tfug;
418 double sign = 1.;
419 for (int i = 1; i <= order; ++i) {
420 ret += e0 * sign * xMath::BesselKexp(1, i*EoverT) * cfug * pow(static_cast<double>(i), N);
421 cfug *= tfug;
422 if (signchange) sign = -sign;
423 }
424 }
425 }
426 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
427 }
428
429 // No magnetic field
430 double tfug = exp((mu - m) / T);
431 double cfug = tfug;
432 double moverT = m / T;
433 double sign = 1.;
434 double ret = 0.;
435 for (int i = 1; i <= order; ++i) {
436 ret += sign * xMath::BesselKexp(2, i*moverT) * cfug * pow(static_cast<double>(i), N - 1);
437 cfug *= tfug;
438 if (signchange) sign = -sign;
439 }
440 ret *= deg * m * m * T / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
441 return ret;
442 }
443
444 double QuantumClusterExpansionChiN(int N, int statistics, double T, double mu, double m, double deg, int order,
445 const IdealGasFunctionsExtraConfig& extraConfig)
446 {
447 return QuantumClusterExpansionTdndmu(N - 1, statistics, T, mu, m, deg, order, extraConfig) /
448 pow(T, 3) / xMath::GeVtoifm3();
449 }
450
451
452 double QuantumClusterExpansionChiNDimensionfull(int N, int statistics, double T, double mu, double m, double deg, int order,
453 const IdealGasFunctionsExtraConfig& extraConfig)
454 {
455 return QuantumClusterExpansionTdndmu(N - 1, statistics, T, mu, m, deg, order, extraConfig) /
456 pow(T, N - 1) / xMath::GeVtoifm3();
457 }
458
459 // Gauss-Legendre 32-point quadrature for [0,1] interval
462 // Gauss-Laguerre 32-point quadrature for [0,\infty] interval
465
466 double QuantumNumericalIntegrationDensity(int statistics, double T, double mu, double m, double deg,
467 const IdealGasFunctionsExtraConfig& extraConfig)
468 {
469 if (statistics == 0) return BoltzmannDensity(T, mu, m, deg, extraConfig);
470 if (statistics == 1 && T == 0.) return FermiZeroTDensity(mu, m, deg, extraConfig);
471 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMuDensity(T, mu, m, deg, extraConfig);
472 if (statistics == -1 && mu > m) {
473 std::cerr << "**WARNING** QuantumNumericalIntegrationDensity: Bose-Einstein condensation, mass = " << m << ", mu = " << mu << std::endl;
475 return 0.;
476 }
477 if (statistics == -1 && T == 0.) return 0.;
478
479 // Check for magnetic field effect for charged particles
480 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
481 double Qmod = abs(extraConfig.MagneticField.Q);
482 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
483
484 // Use Eq. (5) from https://arxiv.org/pdf/2104.06843.pdf
485 // Sum over spins
486 double ret = 0.;
487 for(double sz : spins) {
488 // Sum over Landau levels
489 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
490
491 // Numerical integration over pz
492 double moverT = m / T;
493 double muoverT = mu / T;
494 double BoverT2 = extraConfig.MagneticField.B / T / T;
495 for (int i = 0; i < 32; i++) {
496 double tx = lagx32[i];
497 double EoverT = sqrt(tx*tx + moverT*moverT + Qmod*BoverT2*(2.*l + 1. - 2.*sz));
498 ret += lagw32[i] * T / (exp(EoverT - muoverT) + statistics);
499 }
500 }
501 }
502 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
503 }
504
505 // No magnetic field
506 double ret = 0.;
507 double moverT = m / T;
508 double muoverT = mu / T;
509 for (int i = 0; i < 32; i++) {
510 double tx = lagx32[i];
511 ret += lagw32[i] * T * tx * T * tx * T / (exp(sqrt(tx*tx + moverT * moverT) - muoverT) + statistics);
512 }
513
514 ret *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
515
516 return ret;
517 }
518
519 double QuantumNumericalIntegrationPressure(int statistics, double T, double mu, double m, double deg,
520 const IdealGasFunctionsExtraConfig& extraConfig)
521 {
522 if (statistics == 0) return BoltzmannPressure(T, mu, m, deg, extraConfig);
523 if (statistics == 1 && T == 0.) return FermiZeroTPressure(mu, m, deg, extraConfig);
524 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMuPressure(T, mu, m, deg, extraConfig);
525 if (statistics == -1 && mu > m) {
526 std::cerr << "**WARNING** QuantumNumericalIntegrationPressure: Bose-Einstein condensation" << std::endl;
528 return 0.;
529 }
530 if (statistics == -1 && T == 0.) return 0.;
531
532 // Check for magnetic field effect for charged particles
533 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
534 double Qmod = abs(extraConfig.MagneticField.Q);
535 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
536
537 // Use Eq. (5) from https://arxiv.org/pdf/2104.06843.pdf
538 // Sum over spins
539 double ret = 0.;
540 for(double sz : spins) {
541 // Sum over Landau levels
542 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
543
544 // Numerical integration over pz
545 double moverT = m / T;
546 double muoverT = mu / T;
547 double BoverT2 = extraConfig.MagneticField.B / T / T;
548 for (int i = 0; i < 32; i++) {
549 double tx = lagx32[i];
550 double x2 = tx * T * tx * T;
551 double EoverT = sqrt(tx*tx + moverT*moverT + Qmod*BoverT2*(2.*l + 1. - 2.*sz));
552 ret += lagw32[i] * T * x2 / EoverT / T / (exp(EoverT - muoverT) + statistics);
553 }
554 }
555 }
556 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
557 }
558
559 // No magnetic field
560 double ret = 0.;
561 double moverT = m / T;
562 double muoverT = mu / T;
563 for (int i = 0; i < 32; i++) {
564 double tx = lagx32[i];
565 double x2 = tx * T * tx * T;
566 double E = sqrt(tx*tx + moverT * moverT);
567 ret += lagw32[i] * T * x2 * x2 / E / T / (exp(E - muoverT) + statistics);
568 }
569
570 ret *= deg / 6. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
571
572 return ret;
573 }
574
575 double QuantumNumericalIntegrationEnergyDensity(int statistics, double T, double mu, double m, double deg,
576 const IdealGasFunctionsExtraConfig& extraConfig)
577 {
578 if (statistics == 0) return BoltzmannEnergyDensity(T, mu, m, deg, extraConfig);
579 if (statistics == 1 && T == 0.) return FermiZeroTEnergyDensity(mu, m, deg, extraConfig);
580 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMuEnergyDensity(T, mu, m, deg, extraConfig);
581 if (statistics == -1 && mu > m) {
582 std::cerr << "**WARNING** QuantumNumericalIntegrationEnergyDensity: Bose-Einstein condensation" << std::endl;
584 return 0.;
585 }
586 if (statistics == -1 && T == 0.) return 0.;
587
588 // Check for magnetic field effect for charged particles
589 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
590 double Qmod = abs(extraConfig.MagneticField.Q);
591 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
592
593 // Use Eq. (5) from https://arxiv.org/pdf/2104.06843.pdf
594 // Sum over spins
595 double ret = 0.;
596 for(double sz : spins) {
597 // Sum over Landau levels
598 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
599
600 // Numerical integration over pz
601 double moverT = m / T;
602 double muoverT = mu / T;
603 double BoverT2 = extraConfig.MagneticField.B / T / T;
604 for (int i = 0; i < 32; i++) {
605 double tx = lagx32[i];
606 double EoverT = sqrt(tx*tx + moverT*moverT + Qmod*BoverT2*(2.*l + 1. - 2.*sz));
607 ret += lagw32[i] * T * EoverT * T / (exp(EoverT - muoverT) + statistics);
608 }
609 }
610 }
611 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3()
612 + extraConfig.MagneticField.B * QuantumNumericalIntegrationMagnetization(statistics, T, mu, m, deg, extraConfig) * xMath::GeVtoifm3();
613 }
614
615 // No magnetic field
616 double ret = 0.;
617 double moverT = m / T;
618 double muoverT = mu / T;
619 for (int i = 0; i < 32; i++) {
620 double tx = lagx32[i];
621 ret += lagw32[i] * T * tx * T * tx * T * sqrt(tx*tx + moverT * moverT) * T / (exp(sqrt(tx*tx + moverT * moverT) - muoverT) + statistics);
622 }
623
624 ret *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
625
626 return ret;
627 }
628
629 double QuantumNumericalIntegrationEntropyDensity(int statistics, double T, double mu, double m, double deg,
630 const IdealGasFunctionsExtraConfig& extraConfig)
631 {
632 if (T == 0.)
633 return 0.;
634
635 double ret = (QuantumNumericalIntegrationPressure(statistics, T, mu, m, deg, extraConfig)
636 + QuantumNumericalIntegrationEnergyDensity(statistics, T, mu, m, deg, extraConfig)
637 - mu * QuantumNumericalIntegrationDensity(statistics, T, mu, m, deg, extraConfig)) / T;
638
639 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.)
640 ret -= extraConfig.MagneticField.B * QuantumNumericalIntegrationMagnetization(statistics, T, mu, m, deg, extraConfig) * xMath::GeVtoifm3() / T;
641
642 return ret;
643 }
644
645 double QuantumNumericalIntegrationScalarDensity(int statistics, double T, double mu, double m, double deg,
646 const IdealGasFunctionsExtraConfig& extraConfig)
647 {
648 if (statistics == 0) return BoltzmannScalarDensity(T, mu, m, deg, extraConfig);
649 if (statistics == 1 && T == 0.) return FermiZeroTScalarDensity(mu, m, deg, extraConfig);
650 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMuScalarDensity(T, mu, m, deg, extraConfig);
651 if (statistics == -1 && mu > m) {
652 std::cerr << "**WARNING** QuantumNumericalIntegrationScalarDensity: Bose-Einstein condensation" << std::endl;
654 return 0.;
655 }
656 if (statistics == -1 && T == 0.) return 0.;
657
658 // Check for magnetic field effect for charged particles
659 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
660 double Qmod = abs(extraConfig.MagneticField.Q);
661 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
662
663 // Use Eq. (5) from https://arxiv.org/pdf/2104.06843.pdf
664 // Sum over spins
665 double ret = 0.;
666 for(double sz : spins) {
667 // Sum over Landau levels
668 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
669
670 // Numerical integration over pz
671 double moverT = m / T;
672 double muoverT = mu / T;
673 double BoverT2 = extraConfig.MagneticField.B / T / T;
674 for (int i = 0; i < 32; i++) {
675 double tx = lagx32[i];
676 double EoverT = sqrt(tx*tx + moverT*moverT + Qmod*BoverT2*(2.*l + 1. - 2.*sz));
677 ret += lagw32[i] * T * moverT / EoverT / (exp(EoverT - muoverT) + statistics);
678 }
679 }
680 }
681 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
682 }
683
684 // No magnetic field
685 double ret = 0.;
686 double moverT = m / T;
687 double muoverT = mu / T;
688 for (int i = 0; i < 32; i++) {
689 double tx = lagx32[i];
690 ret += lagw32[i] * T * tx * T * tx * T * moverT / sqrt(tx*tx + moverT * moverT) / (exp(sqrt(tx*tx + moverT * moverT) - muoverT) + statistics);
691 }
692
693 ret *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
694
695 return ret;
696 }
697
698 double QuantumNumericalIntegrationT1dn1dmu1(int statistics, double T, double mu, double m, double deg,
699 const IdealGasFunctionsExtraConfig& extraConfig)
700 {
701 if (statistics == 0) return BoltzmannTdndmu(1, T, mu, m, deg, extraConfig);
702 if (statistics == 1 && T == 0.) return 0.;
703 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMuT1dn1dmu1(T, mu, m, deg, extraConfig);
704 if (statistics == -1 && mu > m) {
705 std::cerr << "**WARNING** QuantumNumericalIntegrationT1dn1dmu1: Bose-Einstein condensation" << std::endl;
707 return 0.;
708 }
709 if (statistics == -1 && T == 0.) return 0.;
710
711 // Check for magnetic field effect for charged particles
712 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
713 double Qmod = abs(extraConfig.MagneticField.Q);
714 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
715
716 // Use Eq. (5) from https://arxiv.org/pdf/2104.06843.pdf
717 // Sum over spins
718 double ret = 0.;
719 for(double sz : spins) {
720 // Sum over Landau levels
721 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
722
723 // Numerical integration over pz
724 double moverT = m / T;
725 double muoverT = mu / T;
726 double BoverT2 = extraConfig.MagneticField.B / T / T;
727 for (int i = 0; i < 32; i++) {
728 double tx = lagx32[i];
729 double EoverT = sqrt(tx*tx + moverT*moverT + Qmod*BoverT2*(2.*l + 1. - 2.*sz));
730 double Eexp = exp(EoverT - muoverT);
731 ret += lagw32[i] * T * 1. / (1. + statistics / Eexp) / (Eexp + statistics);
732 }
733 }
734 }
735 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
736 }
737
738 // No magnetic field
739 double ret = 0.;
740 double moverT = m / T;
741 double muoverT = mu / T;
742 for (int i = 0; i < 32; i++) {
743 double tx = lagx32[i];
744 double Eexp = exp(sqrt(tx*tx + moverT * moverT) - muoverT);
745 ret += lagw32[i] * T * tx * T * tx * T * 1. / (1. + statistics / Eexp) / (Eexp + statistics);
746 }
747
748 ret *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
749
750 return ret;
751 }
752
753 double QuantumNumericalIntegrationT2dn2dmu2(int statistics, double T, double mu, double m, double deg,
754 const IdealGasFunctionsExtraConfig& extraConfig)
755 {
756 if (statistics == 0) return BoltzmannTdndmu(2, T, mu, m, deg, extraConfig);
757 if (statistics == 1 && T == 0.) return 0.;
758 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMuT2dn2dmu2(T, mu, m, deg, extraConfig);
759 if (statistics == -1 && mu > m) {
760 std::cerr << "**WARNING** QuantumNumericalIntegrationT2dn2dmu2: Bose-Einstein condensation" << std::endl;
762 return 0.;
763 }
764 if (statistics == -1 && T == 0.) return 0.;
765
766 // Check for magnetic field effect for charged particles
767 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
768 double Qmod = abs(extraConfig.MagneticField.Q);
769 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
770
771 // Use Eq. (5) from https://arxiv.org/pdf/2104.06843.pdf
772 // Sum over spins
773 double ret = 0.;
774 for(double sz : spins) {
775 // Sum over Landau levels
776 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
777
778 // Numerical integration over pz
779 double moverT = m / T;
780 double muoverT = mu / T;
781 double BoverT2 = extraConfig.MagneticField.B / T / T;
782 for (int i = 0; i < 32; i++) {
783 double tx = lagx32[i];
784 double EoverT = sqrt(tx*tx + moverT*moverT + Qmod*BoverT2*(2.*l + 1. - 2.*sz));
785 double Eexp = exp(EoverT - muoverT);
786 ret += lagw32[i] * T * (1. - statistics / Eexp) / (1. + statistics / Eexp) / (1. + statistics / Eexp) / (Eexp + statistics);
787 }
788 }
789 }
790 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
791 }
792
793 // No magnetic field
794 double ret = 0.;
795 double moverT = m / T;
796 double muoverT = mu / T;
797 for (int i = 0; i < 32; i++) {
798 double tx = lagx32[i];
799 double Eexp = exp(sqrt(tx*tx + moverT * moverT) - muoverT);
800 //ret += lagw32[i] * T * tx * T * tx * T * (Eexp*Eexp - statistics * Eexp) / (Eexp + statistics) / (Eexp + statistics) / (Eexp + statistics);
801 ret += lagw32[i] * T * tx * T * tx * T * (1. - statistics / Eexp) / (1. + statistics / Eexp) / (1. + statistics / Eexp) / (Eexp + statistics);
802 }
803
804 ret *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
805
806 return ret;
807 }
808
809 double QuantumNumericalIntegrationT3dn3dmu3(int statistics, double T, double mu, double m, double deg,
810 const IdealGasFunctionsExtraConfig& extraConfig)
811 {
812 if (statistics == 0) return BoltzmannTdndmu(3, T, mu, m, deg, extraConfig);
813 if (statistics == 1 && T == 0.) return 0.;
814 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMuT3dn3dmu3(T, mu, m, deg, extraConfig);
815 if (statistics == -1 && mu > m) {
816 std::cerr << "**WARNING** QuantumNumericalIntegrationT3dn3dmu3: Bose-Einstein condensation" << std::endl;
818 return 0.;
819 }
820 if (statistics == -1 && T == 0.) return 0.;
821
822
823 // Check for magnetic field effect for charged particles
824 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
825 double Qmod = abs(extraConfig.MagneticField.Q);
826 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
827
828 // Use Eq. (5) from https://arxiv.org/pdf/2104.06843.pdf
829 // Sum over spins
830 double ret = 0.;
831 for(double sz : spins) {
832 // Sum over Landau levels
833 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
834
835 // Numerical integration over pz
836 double moverT = m / T;
837 double muoverT = mu / T;
838 double BoverT2 = extraConfig.MagneticField.B / T / T;
839 for (int i = 0; i < 32; i++) {
840 double tx = lagx32[i];
841 double EoverT = sqrt(tx*tx + moverT*moverT + Qmod*BoverT2*(2.*l + 1. - 2.*sz));
842 double Eexp = exp(EoverT - muoverT);
843 ret += lagw32[i] * T * (1. - 4.*statistics / Eexp + statistics * statistics / Eexp / Eexp) / (1. + statistics / Eexp) / (1. + statistics / Eexp) / (1. + statistics / Eexp) / (Eexp + statistics);
844 }
845 }
846 }
847 return ret * Qmod * extraConfig.MagneticField.B / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
848 }
849
850 // No magnetic field
851 double ret = 0.;
852 double moverT = m / T;
853 double muoverT = mu / T;
854 for (int i = 0; i < 32; i++) {
855 double tx = lagx32[i];
856 double Eexp = exp(sqrt(tx*tx + moverT * moverT) - muoverT);
857 //ret += lagw32[i] * T * tx * T * tx * T * (Eexp*Eexp*Eexp - 4.*statistics*Eexp*Eexp + statistics*statistics*Eexp) / (Eexp + statistics) / (Eexp + statistics) / (Eexp + statistics) / (Eexp + statistics);
858 ret += lagw32[i] * T * tx * T * tx * T * (1. - 4.*statistics / Eexp + statistics * statistics / Eexp / Eexp) / (1. + statistics / Eexp) / (1. + statistics / Eexp) / (1. + statistics / Eexp) / (Eexp + statistics);
859 //printf("%E %E ", ret, Eexp);
860 }
861 //printf("\n");
862
863 ret *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
864
865 return ret;
866 }
867
868 double QuantumNumericalIntegrationTdndmu(int N, int statistics, double T, double mu, double m, double deg,
869 const IdealGasFunctionsExtraConfig& extraConfig)
870 {
871 if (N < 0 || N>3) {
872 std::cerr << "**WARNING** QuantumNumericalIntegrationTdndmu: N must be between 0 and 3!" << std::endl;
874 exit(1);
875 }
876 if (N == 0)
877 return QuantumNumericalIntegrationDensity(statistics, T, mu, m, deg, extraConfig);
878
879 if (N == 1)
880 return QuantumNumericalIntegrationT1dn1dmu1(statistics, T, mu, m, deg, extraConfig);
881
882 if (N == 2)
883 return QuantumNumericalIntegrationT2dn2dmu2(statistics, T, mu, m, deg, extraConfig);
884
885 return QuantumNumericalIntegrationT3dn3dmu3(statistics, T, mu, m, deg, extraConfig);
886 }
887
888 double QuantumNumericalIntegrationChiN(int N, int statistics, double T, double mu, double m, double deg,
889 const IdealGasFunctionsExtraConfig& extraConfig)
890 {
891 return QuantumNumericalIntegrationTdndmu(N - 1, statistics, T, mu, m, deg, extraConfig) / pow(T, 3) / xMath::GeVtoifm3();
892 }
893
894 double QuantumNumericalIntegrationChiNDimensionfull(int N, int statistics, double T, double mu, double m, double deg,
895 const IdealGasFunctionsExtraConfig& extraConfig)
896 {
897 if (statistics == 1 && T == 0.0)
898 return FermiZeroTChiNDimensionfull(N, mu, m, deg, extraConfig);
899 if (statistics == -1 && T == 0.0) {
900 if (mu >= m) {
901 std::cerr << "**WARNING** QuantumNumericalIntegrationChiNDimensionfull: Bose-Einstein condensation" << std::endl;
903 }
904 return 0.;
905 }
906 return QuantumNumericalIntegrationTdndmu(N - 1, statistics, T, mu, m, deg, extraConfig) / pow(T, N-1) / xMath::GeVtoifm3();
907 }
908
909 double psi(double x)
910 {
911 if (x == 0.0)
912 return 1.;
913 double x2 = x * x;
914 double tmpsqrt = sqrt(1. + x2);
915 return (1. + x2 / 2.) * tmpsqrt - x2 * x2 / 2. * log((1. + tmpsqrt) / x);
916 }
917
918 double psi2(double x)
919 {
920 if (x == 0.0)
921 return 2.;
922 double x2 = x * x;
923 double tmpsqrt = sqrt(1. + x2);
924 return 2. * tmpsqrt + 2. * x2 * log((1. + tmpsqrt) / x);
925 }
926
927 double FermiNumericalIntegrationLargeMuDensity(double T, double mu, double m, double deg,
928 const IdealGasFunctionsExtraConfig& extraConfig)
929 {
930 if (mu <= m)
931 return QuantumNumericalIntegrationDensity(1, T, mu, m, deg, extraConfig);
932
933 assert(extraConfig.MagneticField.B == 0.0);
934
935 double pf = sqrt(mu*mu - m * m);
936 double ret1 = 0.;
937 for (int i = 0; i < 32; i++) {
938 ret1 += -legw32[i] * pf * legx32[i] * pf * legx32[i] * pf / (exp(-(sqrt(legx32[i] * legx32[i] * pf * pf + m * m) - mu) / T) + 1.);
939 }
940
941 double moverT = m / T;
942 double muoverT = mu / T;
943 for (int i = 0; i < 32; i++) {
944 double tx = pf / T + lagx32[i];
945 ret1 += lagw32[i] * T * tx * T * tx * T / (exp(sqrt(tx*tx + moverT * moverT) - muoverT) + 1.);
946 }
947
948 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
949
950 double ret2 = 0.;
951 ret2 += deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3() * pf * pf * pf / 3.;
952
953 // Other terms from differentiating Eq. (55) in https://arxiv.org/pdf/1901.05249.pdf add up to zero
954
955 return ret1 + ret2;
956 }
957
958 double FermiNumericalIntegrationLargeMuPressure(double T, double mu, double m, double deg,
959 const IdealGasFunctionsExtraConfig& extraConfig)
960 {
961 if (mu <= m)
962 return QuantumNumericalIntegrationPressure(1, T, mu, m, deg, extraConfig);
963
964 assert(extraConfig.MagneticField.B == 0.0);
965
966 double pf = sqrt(mu*mu - m * m);
967 double ret1 = 0.;
968 for (int i = 0; i < 32; i++) {
969 double x2 = legx32[i] * pf * legx32[i] * pf;
970 double E = sqrt(legx32[i] * legx32[i] * pf*pf + m * m);
971 ret1 += -legw32[i] * pf * x2 * x2 / E / (exp(-(E - mu) / T) + 1.);
972 }
973
974 double moverT = m / T;
975 double muoverT = mu / T;
976 for (int i = 0; i < 32; i++) {
977 double tx = pf / T + lagx32[i];
978 double x2 = tx * T * tx * T;
979 double E = sqrt(tx*tx + moverT * moverT);
980 ret1 += lagw32[i] * T * x2 * x2 / E / T / (exp(E - muoverT) + 1.);
981 }
982
983 ret1 *= deg / 6. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
984
985 double ret2 = 0.;
986 ret2 += mu * pf * pf * pf;
987 ret2 += -3. / 4. * pf * pf * pf * pf * psi(m / pf);
988 ret2 *= deg / 6. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
989
990 return ret1 + ret2;
991 }
992
993 double FermiNumericalIntegrationLargeMuEnergyDensity(double T, double mu, double m, double deg,
994 const IdealGasFunctionsExtraConfig& extraConfig)
995 {
996 if (mu <= m)
997 return QuantumNumericalIntegrationEnergyDensity(1, T, mu, m, deg, extraConfig);
998
999 assert(extraConfig.MagneticField.B == 0.0);
1000
1001 double pf = sqrt(mu*mu - m * m);
1002 double ret1 = 0.;
1003 for (int i = 0; i < 32; i++) {
1004 ret1 += -legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * sqrt(legx32[i] * legx32[i] * pf*pf + m * m) / (exp(-(sqrt(legx32[i] * legx32[i] * pf*pf + m * m) - mu) / T) + 1.);
1005 }
1006
1007 double moverT = m / T;
1008 double muoverT = mu / T;
1009 for (int i = 0; i < 32; i++) {
1010 double tx = pf / T + lagx32[i];
1011 ret1 += lagw32[i] * T * tx * T * tx * T * sqrt(tx*tx + moverT * moverT) * T / (exp(sqrt(tx*tx + moverT * moverT) - muoverT) + 1.);
1012 }
1013
1014 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1015
1016 double ret2 = 0.;
1017 ret2 += deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3() * pf * pf * pf * pf / 4. * psi(m / pf);
1018
1019 return ret1 + ret2;
1020 }
1021
1022 double FermiNumericalIntegrationLargeMuEntropyDensity(double T, double mu, double m, double deg,
1023 const IdealGasFunctionsExtraConfig& extraConfig)
1024 {
1025 double ret = (FermiNumericalIntegrationLargeMuPressure(T, mu, m, deg, extraConfig)
1026 + FermiNumericalIntegrationLargeMuEnergyDensity(T, mu, m, deg, extraConfig)
1027 - mu * FermiNumericalIntegrationLargeMuDensity(T, mu, m, deg, extraConfig)) / T;
1028
1029 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.)
1030 ret -= extraConfig.MagneticField.B * FermiNumericalIntegrationLargeMuMagnetization(T, mu, m, deg, extraConfig) * xMath::GeVtoifm3() / T;
1031
1032 return ret;
1033 }
1034
1035 double FermiNumericalIntegrationLargeMuScalarDensity(double T, double mu, double m, double deg,
1036 const IdealGasFunctionsExtraConfig& extraConfig)
1037 {
1038 if (mu <= m)
1039 return QuantumNumericalIntegrationScalarDensity(1, T, mu, m, deg, extraConfig);
1040
1041 assert(extraConfig.MagneticField.B == 0.0);
1042
1043 double pf = sqrt(mu*mu - m * m);
1044 double ret1 = 0.;
1045 for (int i = 0; i < 32; i++) {
1046 ret1 += -legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * m / sqrt(legx32[i] * legx32[i] * pf*pf + m * m) / (exp(-(sqrt(legx32[i] * legx32[i] * pf*pf + m * m) - mu) / T) + 1.);
1047 }
1048
1049 double moverT = m / T;
1050 double muoverT = mu / T;
1051 for (int i = 0; i < 32; i++) {
1052 double tx = pf / T + lagx32[i];
1053 ret1 += lagw32[i] * T * tx * T * tx * T * moverT / sqrt(tx*tx + moverT * moverT) / (exp(sqrt(tx*tx + moverT * moverT) - muoverT) + 1.);
1054 }
1055
1056 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1057
1058 double ret2 = 0.;
1059 ret2 += deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3() * m * pf * (mu - pf / 4. * psi2(m / pf));
1060
1061 return ret1 + ret2;
1062 }
1063
1064 double FermiNumericalIntegrationLargeMuT1dn1dmu1(double T, double mu, double m, double deg,
1065 const IdealGasFunctionsExtraConfig& extraConfig)
1066 {
1067 if (mu <= m)
1068 return QuantumNumericalIntegrationT1dn1dmu1(1, T, mu, m, deg, extraConfig);
1069
1070 assert(extraConfig.MagneticField.B == 0.0);
1071
1072 double pf = sqrt(mu*mu - m * m);
1073 double ret1 = 0.;
1074 for (int i = 0; i < 32; i++) {
1075 double Eexp = exp(-(sqrt(legx32[i] * legx32[i] * pf*pf + m * m) - mu) / T);
1076 ret1 += legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * 1. / (1. + 1./Eexp) / (Eexp + 1.);
1077 //ret1 += legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * Eexp / (Eexp + 1.) / (Eexp + 1.);
1078 }
1079
1080 double moverT = m / T;
1081 double muoverT = mu / T;
1082 for (int i = 0; i < 32; i++) {
1083 double tx = pf / T + lagx32[i];
1084 double Eexp = exp(sqrt(tx*tx + moverT * moverT) - muoverT);
1085 ret1 += lagw32[i] * T * tx * T * tx * T * 1. / (1. + 1. / Eexp) / (Eexp + 1.);
1086 //ret1 += lagw32[i] * T * tx * T * tx * T * Eexp / (Eexp + 1.) / (Eexp + 1.);
1087 }
1088
1089 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1090
1091 // The remaining factor cancels out with the derivatives of the integral limits wrt pF/mu
1092
1093 return ret1;
1094 }
1095
1096 double FermiNumericalIntegrationLargeMuT2dn2dmu2(double T, double mu, double m, double deg,
1097 const IdealGasFunctionsExtraConfig& extraConfig)
1098 {
1099 if (mu <= m)
1100 return QuantumNumericalIntegrationT2dn2dmu2(1, T, mu, m, deg, extraConfig);
1101
1102 assert(extraConfig.MagneticField.B == 0.0);
1103
1104 double pf = sqrt(mu*mu - m * m);
1105 double ret1 = 0.;
1106 for (int i = 0; i < 32; i++) {
1107 double Eexp = exp(-(sqrt(legx32[i] * legx32[i] * pf*pf + m * m) - mu) / T);
1108 ret1 += -legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * (1. - 1. / Eexp) / (1. + 1. / Eexp) / (1. + 1. / Eexp) / (Eexp + 1.);
1109 //ret1 += -legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * (Eexp*Eexp - Eexp) / (Eexp + 1.) / (Eexp + 1.) / (Eexp + 1.);
1110 }
1111
1112 double moverT = m / T;
1113 double muoverT = mu / T;
1114 for (int i = 0; i < 32; i++) {
1115 double tx = pf / T + lagx32[i];
1116 double Eexp = exp(sqrt(tx*tx + moverT * moverT) - muoverT);
1117 ret1 += lagw32[i] * T * tx * T * tx * T * (1. - 1. / Eexp) / (1. + 1. / Eexp) / (1. + 1. / Eexp) / (Eexp + 1.);
1118 //ret1 += lagw32[i] * T * tx * T * tx * T * (Eexp*Eexp - Eexp) / (Eexp + 1.) / (Eexp + 1.) / (Eexp + 1.);
1119 }
1120
1121 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1122
1123 return ret1;
1124 }
1125
1126 double FermiNumericalIntegrationLargeMuT3dn3dmu3(double T, double mu, double m, double deg,
1127 const IdealGasFunctionsExtraConfig& extraConfig)
1128 {
1129 if (mu <= m)
1130 return QuantumNumericalIntegrationT3dn3dmu3(1, T, mu, m, deg, extraConfig);
1131
1132 assert(extraConfig.MagneticField.B == 0.0);
1133
1134 double pf = sqrt(mu*mu - m * m);
1135 double ret1 = 0.;
1136 for (int i = 0; i < 32; i++) {
1137 double Eexp = exp(-(sqrt(legx32[i] * legx32[i] * pf*pf + m * m) - mu) / T);
1138 ret1 += legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * (1. - 4./Eexp + 1./Eexp / Eexp) / (1. + 1. / Eexp) / (1. + 1. / Eexp) / (1. + 1. / Eexp) / (Eexp + 1.);
1139 //ret1 += legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * (Eexp*Eexp*Eexp - 4.*Eexp*Eexp + Eexp) / (Eexp + 1.) / (Eexp + 1.) / (Eexp + 1.) / (Eexp + 1.);
1140 }
1141
1142 double moverT = m / T;
1143 double muoverT = mu / T;
1144 for (int i = 0; i < 32; i++) {
1145 double tx = pf / T + lagx32[i];
1146 double Eexp = exp(sqrt(tx*tx + moverT * moverT) - muoverT);
1147 ret1 += lagw32[i] * T * tx * T * tx * T * (1. - 4. / Eexp + 1. / Eexp / Eexp) / (1. + 1. / Eexp) / (1. + 1. / Eexp) / (1. + 1. / Eexp) / (Eexp + 1.);
1148 //ret1 += lagw32[i] * T * tx * T * tx * T * (Eexp*Eexp*Eexp - 4.*Eexp*Eexp + Eexp) / (Eexp + 1.) / (Eexp + 1.) / (Eexp + 1.) / (Eexp + 1.);
1149 }
1150
1151 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1152
1153 return ret1;
1154 }
1155
1156 double FermiNumericalIntegrationLargeMuTdndmu(int N, double T, double mu, double m, double deg,
1157 const IdealGasFunctionsExtraConfig& extraConfig)
1158 {
1159 if (N < 0 || N>3) {
1160 throw std::runtime_error("**ERROR** FermiNumericalIntegrationLargeMuTdndmu: N < 0 or N > 3");
1161 }
1162 if (N == 0)
1163 return FermiNumericalIntegrationLargeMuDensity(T, mu, m, deg, extraConfig);
1164
1165 if (N == 1)
1166 return FermiNumericalIntegrationLargeMuT1dn1dmu1(T, mu, m, deg, extraConfig);
1167
1168 if (N == 2)
1169 return FermiNumericalIntegrationLargeMuT2dn2dmu2(T, mu, m, deg, extraConfig);
1170
1171 return FermiNumericalIntegrationLargeMuT3dn3dmu3(T, mu, m, deg, extraConfig);
1172 }
1173
1174 double FermiNumericalIntegrationLargeMuChiN(int N, double T, double mu, double m, double deg,
1175 const IdealGasFunctionsExtraConfig& extraConfig)
1176 {
1177 return FermiNumericalIntegrationLargeMuTdndmu(N - 1, T, mu, m, deg, extraConfig) / pow(T, 3) / xMath::GeVtoifm3();
1178 }
1179
1180 double FermiNumericalIntegrationLargeMuChiNDimensionfull(int N, double T, double mu, double m, double deg,
1181 const IdealGasFunctionsExtraConfig& extraConfig)
1182 {
1183 return FermiNumericalIntegrationLargeMuTdndmu(N - 1, T, mu, m, deg, extraConfig) / pow(T, N-1) / xMath::GeVtoifm3();
1184 }
1185
1186 double FermiZeroTDensity(double mu, double m, double deg,
1187 const IdealGasFunctionsExtraConfig& extraConfig)
1188 {
1189 if (m >= mu)
1190 return 0.0;
1191 double pf = sqrt(mu * mu - m * m);
1192 return deg / 6. / xMath::Pi() / xMath::Pi() * pf * pf * pf * xMath::GeVtoifm3();
1193 }
1194
1195 double FermiZeroTPressure(double mu, double m, double deg,
1196 const IdealGasFunctionsExtraConfig& extraConfig)
1197 {
1198 assert(extraConfig.MagneticField.B == 0.0);
1199 if (m >= mu)
1200 return 0.0;
1201 double pf = sqrt(mu * mu - m * m);
1202 if (m == 0.0) {
1203 return deg / 24. / xMath::Pi() / xMath::Pi() * pf * pf * pf * pf * xMath::GeVtoifm3();
1204 }
1205 double m2 = m * m;
1206 return deg / 48. / xMath::Pi() / xMath::Pi() *
1207 (
1208 mu * pf * (2. * mu * mu - 5. * m2)
1209 - 3. * m2 * m2 * log(m / (mu + pf))
1210 ) * xMath::GeVtoifm3();
1211 }
1212
1213 double FermiZeroTEnergyDensity(double mu, double m, double deg,
1214 const IdealGasFunctionsExtraConfig& extraConfig)
1215 {
1216 assert(extraConfig.MagneticField.B == 0.0);
1217 if (m >= mu)
1218 return 0.0;
1219 double pf = sqrt(mu * mu - m * m);
1220 if (m == 0.0) {
1221 return deg / 8. / xMath::Pi() / xMath::Pi() * pf * pf * pf * pf * xMath::GeVtoifm3();
1222 }
1223 double m2 = m * m;
1224 return deg / 16. / xMath::Pi() / xMath::Pi() *
1225 (
1226 mu * pf * (2. * mu * mu - m2)
1227 + m2 * m2 * log(m / (mu + pf))
1228 ) * xMath::GeVtoifm3();
1229 }
1230
1231 double FermiZeroTEntropyDensity(double mu, double m, double deg,
1232 const IdealGasFunctionsExtraConfig& extraConfig)
1233 {
1234 return 0.0;
1235 }
1236
1237 double FermiZeroTScalarDensity(double mu, double m, double deg,
1238 const IdealGasFunctionsExtraConfig& extraConfig)
1239 {
1240 assert(extraConfig.MagneticField.B == 0.0);
1241 if (m >= mu)
1242 return 0.0;
1243 double pf = sqrt(mu * mu - m * m);
1244 if (m == 0.0) {
1245 return 0.;
1246 }
1247 double m2 = m * m;
1248 return deg * m / 4. / xMath::Pi() / xMath::Pi() *
1249 (
1250 mu * pf
1251 + m2 * log(m / (mu + pf))
1252 ) * xMath::GeVtoifm3();
1253 }
1254
1255 double FermiZeroTdn1dmu1(double mu, double m, double deg,
1256 const IdealGasFunctionsExtraConfig& extraConfig)
1257 {
1258 assert(extraConfig.MagneticField.B == 0.0);
1259 if (m >= mu)
1260 return 0.0;
1261 double pf = sqrt(mu * mu - m * m);
1262 return deg / 2. / xMath::Pi() / xMath::Pi() * mu * pf * xMath::GeVtoifm3();
1263 }
1264
1265 double FermiZeroTdn2dmu2(double mu, double m, double deg,
1266 const IdealGasFunctionsExtraConfig& extraConfig)
1267 {
1268 assert(extraConfig.MagneticField.B == 0.0);
1269 if (m >= mu)
1270 return 0.0;
1271 double pf = sqrt(mu * mu - m * m);
1272 return deg / 2. / xMath::Pi() / xMath::Pi() * (mu * mu + pf * pf) / pf * xMath::GeVtoifm3();
1273 }
1274
1275 double FermiZeroTdn3dmu3(double mu, double m, double deg,
1276 const IdealGasFunctionsExtraConfig& extraConfig)
1277 {
1278 assert(extraConfig.MagneticField.B == 0.0);
1279 if (m >= mu)
1280 return 0.0;
1281 double pf = sqrt(mu * mu - m * m);
1282 return deg / 2. / xMath::Pi() / xMath::Pi() * mu * (3. * pf * pf - mu * mu) / pf / pf / pf * xMath::GeVtoifm3();
1283 }
1284
1285 double FermiZeroTdndmu(int N, double mu, double m, double deg,
1286 const IdealGasFunctionsExtraConfig& extraConfig)
1287 {
1288 if (N < 0 || N>3) {
1289 throw std::runtime_error("**ERROR** FermiNumericalIntegrationLargeMuTdndmu: N < 0 or N > 3");
1290 }
1291 if (N == 0)
1292 return FermiZeroTDensity(mu, m, deg, extraConfig);
1293
1294 if (N == 1)
1295 return FermiZeroTdn1dmu1(mu, m, deg, extraConfig);
1296
1297 if (N == 2)
1298 return FermiZeroTdn2dmu2(mu, m, deg, extraConfig);
1299
1300 return FermiZeroTdn3dmu3(mu, m, deg, extraConfig);
1301 }
1302
1303 double FermiZeroTChiN(int N, double mu, double m, double deg,
1304 const IdealGasFunctionsExtraConfig& extraConfig)
1305 {
1306 throw std::runtime_error("**ERROR** FermiZeroTChiN: This quantity is infinite by definition at T = 0!");
1307 //return FermiNumericalIntegrationLargeMuTdndmu(N - 1, mu, m, deg) / pow(T, 3) / xMath::GeVtoifm3();
1308 }
1309
1310 double FermiZeroTChiNDimensionfull(int N, double mu, double m, double deg,
1311 const IdealGasFunctionsExtraConfig& extraConfig)
1312 {
1313 return FermiZeroTdndmu(N - 1, mu, m, deg, extraConfig) / xMath::GeVtoifm3();
1314 }
1315
1316 double IdealGasQuantity(Quantity quantity, QStatsCalculationType calctype, int statistics, double T, double mu, double m, double deg, int order,
1317 const IdealGasFunctionsExtraConfig& extraConfig)
1318 {
1319 if (statistics == 0) {
1320 if (quantity == ParticleDensity)
1321 return BoltzmannDensity(T, mu, m, deg, extraConfig);
1322 if (quantity == Pressure)
1323 return BoltzmannPressure(T, mu, m, deg, extraConfig);
1324 if (quantity == EnergyDensity)
1325 return BoltzmannEnergyDensity(T, mu, m, deg, extraConfig);
1326 if (quantity == EntropyDensity)
1327 return BoltzmannEntropyDensity(T, mu, m, deg, extraConfig);
1328 if (quantity == ScalarDensity)
1329 return BoltzmannScalarDensity(T, mu, m, deg, extraConfig);
1330 if (quantity == chi2)
1331 return BoltzmannChiN(2, T, mu, m, deg, extraConfig);
1332 if (quantity == chi3)
1333 return BoltzmannChiN(3, T, mu, m, deg, extraConfig);
1334 if (quantity == chi4)
1335 return BoltzmannChiN(4, T, mu, m, deg, extraConfig);
1336 if (quantity == chi2difull)
1337 return BoltzmannChiNDimensionfull(2, T, mu, m, deg, extraConfig);
1338 if (quantity == chi3difull)
1339 return BoltzmannChiNDimensionfull(3, T, mu, m, deg, extraConfig);
1340 if (quantity == chi4difull)
1341 return BoltzmannChiNDimensionfull(4, T, mu, m, deg, extraConfig);
1342 // Temperature derivatives
1343 if (quantity == dndT)
1344 return BoltzmanndndT(T, mu, m, deg, extraConfig);
1345 if (quantity == d2ndT2)
1346 return Boltzmannd2ndT2(T, mu, m, deg, extraConfig);
1347 if (quantity == dedT)
1348 return BoltzmanndedT(T, mu, m, deg, extraConfig);
1349 if (quantity == dedmu)
1350 return Boltzmanndedmu(T, mu, m, deg, extraConfig);
1351 if (quantity == dchi2dT)
1352 return Boltzmanndchi2dT(T, mu, m, deg, extraConfig);
1353 }
1354 else {
1355 if (calctype == ClusterExpansion) {
1356 if (quantity == ParticleDensity)
1357 return QuantumClusterExpansionDensity(statistics, T, mu, m, deg, order, extraConfig);
1358 if (quantity == Pressure)
1359 return QuantumClusterExpansionPressure(statistics, T, mu, m, deg, order, extraConfig);
1360 if (quantity == EnergyDensity)
1361 return QuantumClusterExpansionEnergyDensity(statistics, T, mu, m, deg, order, extraConfig);
1362 if (quantity == EntropyDensity)
1363 return QuantumClusterExpansionEntropyDensity(statistics, T, mu, m, deg, order, extraConfig);
1364 if (quantity == ScalarDensity)
1365 return QuantumClusterExpansionScalarDensity(statistics, T, mu, m, deg, order, extraConfig);
1366 if (quantity == chi2)
1367 return QuantumClusterExpansionChiN(2, statistics, T, mu, m, deg, order, extraConfig);
1368 if (quantity == chi3)
1369 return QuantumClusterExpansionChiN(3, statistics, T, mu, m, deg, order, extraConfig);
1370 if (quantity == chi4)
1371 return QuantumClusterExpansionChiN(4, statistics, T, mu, m, deg, order, extraConfig);
1372 if (quantity == chi2difull)
1373 return QuantumClusterExpansionChiNDimensionfull(2, statistics, T, mu, m, deg, order, extraConfig);
1374 if (quantity == chi3difull)
1375 return QuantumClusterExpansionChiNDimensionfull(3, statistics, T, mu, m, deg, order, extraConfig);
1376 if (quantity == chi4difull)
1377 return QuantumClusterExpansionChiNDimensionfull(4, statistics, T, mu, m, deg, order, extraConfig);
1378 // Temperature derivatives
1379 if (quantity == dndT)
1380 return QuantumClusterExpansiondndT(statistics, T, mu, m, deg, order, extraConfig);
1381 if (quantity == d2ndT2)
1382 return QuantumClusterExpansiond2ndT2(statistics, T, mu, m, deg, order, extraConfig);
1383 if (quantity == dedT)
1384 return QuantumClusterExpansiondedT(statistics, T, mu, m, deg, order, extraConfig);
1385 if (quantity == dedmu)
1386 return QuantumClusterExpansiondedmu(statistics, T, mu, m, deg, order, extraConfig);
1387 if (quantity == dchi2dT)
1388 return QuantumClusterExpansiondchi2dT(statistics, T, mu, m, deg, order, extraConfig);
1389 }
1390 else {
1391 if (quantity == ParticleDensity)
1392 return QuantumNumericalIntegrationDensity(statistics, T, mu, m, deg, extraConfig);
1393 if (quantity == Pressure)
1394 return QuantumNumericalIntegrationPressure(statistics, T, mu, m, deg, extraConfig);
1395 if (quantity == EnergyDensity)
1396 return QuantumNumericalIntegrationEnergyDensity(statistics, T, mu, m, deg, extraConfig);
1397 if (quantity == EntropyDensity)
1398 return QuantumNumericalIntegrationEntropyDensity(statistics, T, mu, m, deg, extraConfig);
1399 if (quantity == ScalarDensity)
1400 return QuantumNumericalIntegrationScalarDensity(statistics, T, mu, m, deg, extraConfig);
1401 if (quantity == chi2)
1402 return QuantumNumericalIntegrationChiN(2, statistics, T, mu, m, deg, extraConfig);
1403 if (quantity == chi3)
1404 return QuantumNumericalIntegrationChiN(3, statistics, T, mu, m, deg, extraConfig);
1405 if (quantity == chi4)
1406 return QuantumNumericalIntegrationChiN(4, statistics, T, mu, m, deg, extraConfig);
1407 if (quantity == chi2difull)
1408 return QuantumNumericalIntegrationChiNDimensionfull(2, statistics, T, mu, m, deg, extraConfig);
1409 if (quantity == chi3difull)
1410 return QuantumNumericalIntegrationChiNDimensionfull(3, statistics, T, mu, m, deg, extraConfig);
1411 if (quantity == chi4difull)
1412 return QuantumNumericalIntegrationChiNDimensionfull(4, statistics, T, mu, m, deg, extraConfig);
1413 // Temperature derivatives
1414 if (quantity == dndT)
1415 return QuantumNumericalIntegrationdndT(statistics, T, mu, m, deg, extraConfig);
1416 if (quantity == d2ndT2)
1417 return QuantumNumericalIntegrationd2ndT2(statistics, T, mu, m, deg, extraConfig);
1418 if (quantity == dedT)
1419 return QuantumNumericalIntegrationdedT(statistics, T, mu, m, deg, extraConfig);
1420 if (quantity == dedmu)
1421 return QuantumNumericalIntegrationdedmu(statistics, T, mu, m, deg, extraConfig);
1422 if (quantity == dchi2dT)
1423 return QuantumNumericalIntegrationdchi2dT(statistics, T, mu, m, deg, extraConfig);
1424 }
1425 }
1426 std::cerr << "**WARNING** IdealGasFunctions::IdealGasQuantity: Unknown quantity" << std::endl;
1427 return 0.;
1428 }
1429
1430 double BoltzmannMagnetization(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig) {
1431 // Check for magnetic field effect for charged particles
1432 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
1433 // TODO: Check that it's done correctly
1434 double Qmod = abs(extraConfig.MagneticField.Q);
1435 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
1436 // Sum over spins
1437 double ret = 0.;
1438 for(double sz : spins) {
1439 // Sum over Landau levels
1440 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
1441 double e0 = sqrt(m*m + Qmod*extraConfig.MagneticField.B*(2.*l + 1. - 2.*sz));
1442 ret += (T * e0 * xMath::BesselKexp(1, e0 / T)
1443 - Qmod * extraConfig.MagneticField.B * (l + 0.5 - sz) * xMath::BesselKexp(0, e0 / T)
1444 ) * exp((mu - e0) / T);
1445 }
1446 }
1447 ret *= Qmod / 2. / xMath::Pi() / xMath::Pi();
1448 return ret;
1449 }
1450
1451 // No magnetic field
1452 return 0.;
1453 }
1454
1455 double QuantumClusterExpansionMagnetization(int statistics, double T, double mu, double m, double deg, int order,
1456 const IdealGasFunctionsExtraConfig &extraConfig) {
1457 bool signchange = true;
1458 if (statistics == 1) //Fermi
1459 signchange = true;
1460 else if (statistics == -1) //Bose
1461 signchange = false;
1462 else
1463 return BoltzmannMagnetization(T, mu, m, deg, extraConfig);
1464
1465 // Check for magnetic field effect for charged particles
1466 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
1467 double Qmod = abs(extraConfig.MagneticField.Q);
1468 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
1469
1470
1471 // Use Eq. (7) from https://arxiv.org/pdf/2104.06843.pdf
1472 // Sum over spins
1473 double ret = 0.;
1474 for(double sz : spins) {
1475 // Sum over Landau levels
1476 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
1477 double e0 = sqrt(m*m + Qmod*extraConfig.MagneticField.B*(2.*l + 1. - 2.*sz));
1478
1479 // Sum over clusters
1480 double tfug = exp((mu - e0) / T);
1481 double EoverT = e0 / T;
1482 double cfug = tfug;
1483 double sign = 1.;
1484 for (int i = 1; i <= order; ++i) {
1485 ret += sign * (T / static_cast<double>(i) * e0 * xMath::BesselKexp(1, i*EoverT)
1486 - Qmod * extraConfig.MagneticField.B * (l + 0.5 - sz) * xMath::BesselKexp(0, i*EoverT)
1487 ) * cfug;
1488
1489 cfug *= tfug;
1490 if (signchange) sign = -sign;
1491 }
1492 }
1493 }
1494 return ret * Qmod / 2. / xMath::Pi() / xMath::Pi();
1495 }
1496
1497 // No magnetic field
1498 return 0.;
1499 }
1500
1501 double QuantumNumericalIntegrationMagnetization(int statistics, double T, double mu, double m, double deg,
1502 const IdealGasFunctionsExtraConfig &extraConfig) {
1503 if (statistics == 0) return BoltzmannMagnetization(T, mu, m, deg, extraConfig);
1504 if (statistics == 1 && T == 0.) return FermiZeroTMagnetization(mu, m, deg, extraConfig);
1505 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMuMagnetization(T, mu, m, deg, extraConfig);
1506 if (statistics == -1 && mu > m) {
1507 std::cerr << "**WARNING** QuantumNumericalIntegrationScalarDensity: Bose-Einstein condensation" << std::endl;
1509 return 0.;
1510 }
1511 if (statistics == -1 && T == 0.) return 0.;
1512
1513 // Check for magnetic field effect for charged particles
1514 if (extraConfig.MagneticField.B != 0. && extraConfig.MagneticField.Q != 0.) {
1515 double Qmod = abs(extraConfig.MagneticField.Q);
1516 auto spins = GetSpins(extraConfig.MagneticField.degSpin);
1517
1518 // Use Eq. (5) from https://arxiv.org/pdf/2104.06843.pdf
1519 // Sum over spins
1520 double ret = 0.;
1521 for(double sz : spins) {
1522 // Sum over Landau levels
1523 for(int l = 0; l < extraConfig.MagneticField.lmax; ++l) {
1524
1525 // Numerical integration over pz
1526 double moverT = m / T;
1527 double muoverT = mu / T;
1528 double BoverT2 = extraConfig.MagneticField.B / T / T;
1529 for (int i = 0; i < 32; i++) {
1530 double tx = lagx32[i];
1531 double EoverT = sqrt(tx*tx + moverT*moverT + Qmod*BoverT2*(2.*l + 1. - 2.*sz));
1532 ret += lagw32[i] * T * (tx * T * tx - Qmod * BoverT2 * T * (l + 0.5 - sz) ) / EoverT / (exp(EoverT - muoverT) + statistics);
1533 }
1534 }
1535 }
1536 return ret * Qmod / 2. / xMath::Pi() / xMath::Pi();
1537 }
1538
1539 // No magnetic field
1540 return 0.;
1541 }
1542
1543 double FermiNumericalIntegrationLargeMuMagnetization(double T, double mu, double m, double deg,
1544 const IdealGasFunctionsExtraConfig &extraConfig) {
1545 if (mu <= m)
1546 return QuantumNumericalIntegrationMagnetization(1, T, mu, m, deg, extraConfig);
1547
1548 assert(extraConfig.MagneticField.B == 0.0);
1549
1550 return 0.;
1551 }
1552
1553 double FermiZeroTMagnetization(double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig) {
1554 assert(extraConfig.MagneticField.B == 0.0);
1555 return 0.;
1556 }
1557
1559
1560 double BoltzmanndndT(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig) {
1561 // Check for magnetic field effect for charged particles
1562 assert(extraConfig.MagneticField.B == 0);
1563
1564 // No magnetic field
1565 if (m == 0.)
1566 return deg / xMath::Pi() / xMath::Pi() * T * exp(mu/ T) * (3. * T - mu) * xMath::GeVtoifm3();
1567 return deg * m * m / 2. / T / xMath::Pi() / xMath::Pi()
1568 * (m * xMath::BesselKexp(1, m / T) - (mu - 3. * T) * xMath::BesselKexp(2, m / T))
1569 * exp((mu - m) / T) * xMath::GeVtoifm3();
1570 }
1571
1572 double Boltzmannd2ndT2(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig) {
1573 // Check for magnetic field effect for charged particles
1574 assert(extraConfig.MagneticField.B == 0);
1575
1576 // No magnetic field
1577 if (m == 0.)
1578 return deg / xMath::Pi() / xMath::Pi() / T * exp(mu/ T) *
1579 (mu * mu - 4. * mu * T + 6. * T * T) * xMath::GeVtoifm3();
1580 return deg / 2. / T / T / T / xMath::Pi() / xMath::Pi()
1581 * m * (m * (m * m + mu * mu - 4. * mu * T + 6. * T * T) * xMath::BesselKexp(0, m / T)
1582 + (m * m * (3. * T - 2. * mu) + 2. * T * (mu * mu - 4. * mu * T + 6. * T * T)) * xMath::BesselKexp(1, m / T))
1583 * exp((mu - m) / T) * xMath::GeVtoifm3();
1584 }
1585
1586 double BoltzmanndedT(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig) {
1587 // Check for magnetic field effect for charged particles
1588 assert(extraConfig.MagneticField.B == 0);
1589
1590 // No magnetic field
1591 if (m == 0.)
1592 return 3. * deg / xMath::Pi() / xMath::Pi() * T * T * exp(mu/ T) *
1593 (4. * T - mu) * xMath::GeVtoifm3();
1594
1595 return deg * m / 2. / T / xMath::Pi() / xMath::Pi()
1596 * (m * (m*m + 3*T*(4.*T-mu))*xMath::BesselKexp(0, m / T)
1597 + (6.*T*T*(4.*T-mu) - m*m*(mu-5.*T) )*xMath::BesselKexp(1, m / T))
1598 * exp((mu - m) / T) * xMath::GeVtoifm3();
1599 }
1600
1601 double Boltzmanndedmu(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig) {
1602 return BoltzmannEnergyDensity(T, mu, m, deg, extraConfig) / T;
1603 }
1604
1605 double Boltzmanndchi2dT(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig) {
1606 // Check for magnetic field effect for charged particles
1607 assert(extraConfig.MagneticField.B == 0);
1608
1609 // No magnetic field
1610 return deg * m * m / 2. / T / T / T / T / xMath::Pi() / xMath::Pi()
1611 * (m * xMath::BesselKexp(1, m / T) - mu * xMath::BesselKexp(2, m / T))
1612 * exp((mu - m) / T);
1613 }
1614
1615 double QuantumClusterExpansiondndT(int statistics, double T, double mu, double m, double deg, int order,
1616 const IdealGasFunctionsExtraConfig &extraConfig) {
1617 bool signchange = true;
1618 if (statistics == 1) //Fermi
1619 signchange = true;
1620 else if (statistics == -1) //Bose
1621 signchange = false;
1622 else
1623 return BoltzmanndndT(T, mu, m, deg, extraConfig);
1624
1625 // Check for magnetic field effect for charged particles
1626 assert(extraConfig.MagneticField.B == 0);
1627
1628 // No magnetic field
1629 double tfug = exp((mu - m) / T);
1630 double moverT = m / T;
1631 double cfug = tfug;
1632 double sign = 1.;
1633 double ret = 0.;
1634 for (int i = 1; i <= order; ++i) {
1635 ret += sign * (
1636 m * xMath::BesselKexp(1, i*moverT)
1637 - (mu - 3. * T/ static_cast<double>(i)) * xMath::BesselKexp(2, i*moverT)
1638 ) * cfug;
1639 cfug *= tfug;
1640 if (signchange) sign = -sign;
1641 }
1642 ret *= deg * m * m / T / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1643 return ret;
1644 }
1645
1646 double QuantumClusterExpansiond2ndT2(int statistics, double T, double mu, double m, double deg, int order,
1647 const IdealGasFunctionsExtraConfig &extraConfig) {
1648 bool signchange = true;
1649 if (statistics == 1) //Fermi
1650 signchange = true;
1651 else if (statistics == -1) //Bose
1652 signchange = false;
1653 else
1654 return Boltzmannd2ndT2(T, mu, m, deg, extraConfig);
1655
1656 // Check for magnetic field effect for charged particles
1657 assert(extraConfig.MagneticField.B == 0);
1658
1659 // No magnetic field
1660 double tfug = exp((mu - m) / T);
1661 double moverT = m / T;
1662 double cfug = tfug;
1663 double sign = 1.;
1664 double ret = 0.;
1665 for (int i = 1; i <= order; ++i) {
1666 double k = static_cast<double>(i);
1667 ret += sign * k * (
1668 (m * (m * m + mu * mu - 4. * mu * T / k + 6. * T * T / k / k) * xMath::BesselKexp(0, i*moverT)
1669 + (m * m * (3. * T / k - 2. * mu) + 2. * T / k * (mu * mu - 4. * mu * T / k + 6. * T / k * T / k)) * xMath::BesselKexp(1, i*moverT))
1670 ) * cfug;
1671 cfug *= tfug;
1672 if (signchange) sign = -sign;
1673 }
1674 ret *= deg * m / T / T / T / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1675 return ret;
1676 }
1677
1678 double QuantumClusterExpansiondedT(int statistics, double T, double mu, double m, double deg, int order,
1679 const IdealGasFunctionsExtraConfig &extraConfig) {
1680 bool signchange = true;
1681 if (statistics == 1) //Fermi
1682 signchange = true;
1683 else if (statistics == -1) //Bose
1684 signchange = false;
1685 else
1686 return BoltzmanndedT(T, mu, m, deg, extraConfig);
1687
1688 // Check for magnetic field effect for charged particles
1689 assert(extraConfig.MagneticField.B == 0);
1690
1691 // No magnetic field
1692 double tfug = exp((mu - m) / T);
1693 double moverT = m / T;
1694 double cfug = tfug;
1695 double sign = 1.;
1696 double ret = 0.;
1697 for (int i = 1; i <= order; ++i) {
1698 double k = static_cast<double>(i);
1699 ret += sign * (
1700 m * (m*m + 3*T/k*(4.*T/k-mu))*xMath::BesselKexp(0, i*moverT)
1701 + (6.*T/k*T/k*(4.*T/k-mu) - m*m*(mu-5.*T/k) )*xMath::BesselKexp(1, i*moverT)
1702 ) * cfug;
1703 cfug *= tfug;
1704 if (signchange) sign = -sign;
1705 }
1706 ret *= deg * m / T / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1707 return ret;
1708 }
1709
1710 double QuantumClusterExpansiondedmu(int statistics, double T, double mu, double m, double deg, int order,
1711 const IdealGasFunctionsExtraConfig &extraConfig) {
1712 bool signchange = true;
1713 if (statistics == 1) //Fermi
1714 signchange = true;
1715 else if (statistics == -1) //Bose
1716 signchange = false;
1717 else
1718 return Boltzmanndedmu(T, mu, m, deg, extraConfig);
1719
1720 // Check for magnetic field effect for charged particles
1721 assert(extraConfig.MagneticField.B == 0);
1722
1723 // No magnetic field
1724 double tfug = exp((mu - m) / T);
1725 double cfug = tfug;
1726 double moverT = m / T;
1727 double sign = 1.;
1728 double ret = 0.;
1729 for (int i = 1; i <= order; ++i) {
1730 ret += sign * (xMath::BesselKexp(1, i*moverT) + 3. * xMath::BesselKexp(2, i*moverT) / moverT / static_cast<double>(i)) * cfug / T;
1731 cfug *= tfug;
1732 if (signchange) sign = -sign;
1733 }
1734 ret *= deg * m * m * m * T / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1735 return ret;
1736 }
1737
1738
1739 double QuantumClusterExpansiondchi2dT(int statistics, double T, double mu, double m, double deg, int order,
1740 const IdealGasFunctionsExtraConfig &extraConfig) {
1741 bool signchange = true;
1742 if (statistics == 1) //Fermi
1743 signchange = true;
1744 else if (statistics == -1) //Bose
1745 signchange = false;
1746 else
1747 return Boltzmanndchi2dT(T, mu, m, deg, extraConfig);
1748
1749 // Check for magnetic field effect for charged particles
1750 assert(extraConfig.MagneticField.B == 0);
1751
1752 // No magnetic field
1753 double tfug = exp((mu - m) / T);
1754 double moverT = m / T;
1755 double cfug = tfug;
1756 double sign = 1.;
1757 double ret = 0.;
1758 for (int i = 1; i <= order; ++i) {
1759 double k = static_cast<double>(i);
1760 ret += sign * k * (
1761 m * xMath::BesselKexp(1, i*moverT)
1762 - mu * xMath::BesselKexp(2, i*moverT)
1763 ) * cfug;
1764 cfug *= tfug;
1765 if (signchange) sign = -sign;
1766 }
1767 ret *= deg * m * m / 2. / T / T / T / T / xMath::Pi() / xMath::Pi();
1768 return ret;
1769 }
1770
1771 double QuantumNumericalIntegrationdndT(int statistics, double T, double mu, double m, double deg,
1772 const IdealGasFunctionsExtraConfig &extraConfig) {
1773 if (statistics == 0) return BoltzmanndndT(T, mu, m, deg, extraConfig);
1774 if (statistics == 1 && T == 0.) return 0.; //FermiZeroTDensity(mu, m, deg, extraConfig);
1775 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMudndT(T, mu, m, deg, extraConfig);
1776 if (statistics == -1 && mu > m) {
1777 std::cerr << "**WARNING** QuantumNumericalIntegrationDensity: Bose-Einstein condensation, mass = " << m << ", mu = " << mu << std::endl;
1779 return 0.;
1780 }
1781 if (statistics == -1 && T == 0.) return 0.;
1782
1783 // Check for magnetic field effect for charged particles
1784 assert(extraConfig.MagneticField.B == 0);
1785
1786 // No magnetic field
1787 double ret = 0.;
1788 double moverT = m / T;
1789 double muoverT = mu / T;
1790 for (int i = 0; i < 32; i++) {
1791 double tx = lagx32[i];
1792 double EoverT = sqrt(tx*tx + moverT * moverT);
1793 double Eexp = exp(EoverT - muoverT);
1794 double f = 1. / (Eexp + statistics);
1795 ret += lagw32[i] * T * tx * T * tx * T * f * (EoverT - muoverT) * (1. - statistics * f);
1796 }
1797
1798 ret *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3() / T;
1799
1800 return ret;
1801 }
1802
1803 double QuantumNumericalIntegrationd2ndT2(int statistics, double T, double mu, double m, double deg,
1804 const IdealGasFunctionsExtraConfig &extraConfig) {
1805 if (statistics == 0) return Boltzmannd2ndT2(T, mu, m, deg, extraConfig);
1806 if (statistics == 1 && T == 0.) return 0.;//FermiZeroTDensity(mu, m, deg, extraConfig);
1807 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMud2ndT2(T, mu, m, deg, extraConfig);
1808 if (statistics == -1 && mu > m) {
1809 std::cerr << "**WARNING** QuantumNumericalIntegrationDensity: Bose-Einstein condensation, mass = " << m << ", mu = " << mu << std::endl;
1811 return 0.;
1812 }
1813 if (statistics == -1 && T == 0.) return 0.;
1814
1815 // Check for magnetic field effect for charged particles
1816 assert(extraConfig.MagneticField.B == 0);
1817
1818 // No magnetic field
1819 double ret = 0.;
1820 double moverT = m / T;
1821 double muoverT = mu / T;
1822 for (int i = 0; i < 32; i++) {
1823 double tx = lagx32[i];
1824 double EoverT = sqrt(tx*tx + moverT * moverT);
1825 double Eexp = exp(EoverT - muoverT);
1826 double f = 1. / (Eexp + statistics);
1827 ret += lagw32[i] * T * tx * T * tx * T * f
1828 * (EoverT - muoverT) * (1. - statistics * f)
1829 * ((EoverT - muoverT) * (1. - 2. * statistics * f) - 2.);
1830 }
1831
1832 ret *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3() / T / T;
1833
1834 return ret;
1835 }
1836
1837 double QuantumNumericalIntegrationdedT(int statistics, double T, double mu, double m, double deg,
1838 const IdealGasFunctionsExtraConfig &extraConfig) {
1839 if (statistics == 0) return BoltzmanndedT(T, mu, m, deg, extraConfig);
1840 if (statistics == 1 && T == 0.) return 0.; //FermiZeroTDensity(mu, m, deg, extraConfig);
1841 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMudedT(T, mu, m, deg, extraConfig);
1842 if (statistics == -1 && mu > m) {
1843 std::cerr << "**WARNING** QuantumNumericalIntegrationDensity: Bose-Einstein condensation, mass = " << m << ", mu = " << mu << std::endl;
1845 return 0.;
1846 }
1847 if (statistics == -1 && T == 0.) return 0.;
1848
1849 // No magnetic field
1850 double ret = 0.;
1851 double moverT = m / T;
1852 double muoverT = mu / T;
1853 for (int i = 0; i < 32; i++) {
1854 double tx = lagx32[i];
1855 double EoverT = sqrt(tx*tx + moverT * moverT);
1856 double Eexp = exp(EoverT - muoverT);
1857 double f = 1. / (Eexp + statistics);
1858 ret += lagw32[i] * T * tx * T * tx * T * EoverT * f * (EoverT - muoverT) * (1. - statistics * f);
1859 }
1860
1861 ret *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1862
1863 return ret;
1864 }
1865
1866 double QuantumNumericalIntegrationdedmu(int statistics, double T, double mu, double m, double deg,
1867 const IdealGasFunctionsExtraConfig &extraConfig) {
1868 if (statistics == 0) return BoltzmanndedT(T, mu, m, deg, extraConfig);
1869 if (statistics == 1 && T == 0.) return 0.; //FermiZeroTDensity(mu, m, deg, extraConfig);
1870 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMudedmu(T, mu, m, deg, extraConfig);
1871 if (statistics == -1 && mu > m) {
1872 std::cerr << "**WARNING** QuantumNumericalIntegrationDensity: Bose-Einstein condensation, mass = " << m << ", mu = " << mu << std::endl;
1874 return 0.;
1875 }
1876 if (statistics == -1 && T == 0.) return 0.;
1877
1878 // No magnetic field
1879 double ret = 0.;
1880 double moverT = m / T;
1881 double muoverT = mu / T;
1882 for (int i = 0; i < 32; i++) {
1883 double tx = lagx32[i];
1884 double EoverT = sqrt(tx*tx + moverT * moverT);
1885 double Eexp = exp(EoverT - muoverT);
1886 double f = 1. / (Eexp + statistics);
1887 ret += lagw32[i] * T * tx * T * tx * T * EoverT * f * (1. - statistics * f);
1888 }
1889
1890 ret *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1891
1892 return ret;
1893 }
1894
1895 double QuantumNumericalIntegrationdchi2dT(int statistics, double T, double mu, double m, double deg,
1896 const IdealGasFunctionsExtraConfig &extraConfig) {
1897 if (statistics == 0) return Boltzmanndchi2dT(T, mu, m, deg, extraConfig);
1898 if (statistics == 1 && T == 0.) return 0.;//FermiZeroTDensity(mu, m, deg, extraConfig);
1899 if (statistics == 1 && mu > m) return FermiNumericalIntegrationLargeMudchi2dT(T, mu, m, deg, extraConfig);
1900 if (statistics == -1 && mu > m) {
1901 std::cerr << "**WARNING** QuantumNumericalIntegrationDensity: Bose-Einstein condensation, mass = " << m << ", mu = " << mu << std::endl;
1903 return 0.;
1904 }
1905 if (statistics == -1 && T == 0.) return 0.;
1906
1907 // Check for magnetic field effect for charged particles
1908 assert(extraConfig.MagneticField.B == 0);
1909
1910 // No magnetic field
1911 double ret = 0.;
1912 double moverT = m / T;
1913 double muoverT = mu / T;
1914 for (int i = 0; i < 32; i++) {
1915 double tx = lagx32[i];
1916 double EoverT = sqrt(tx*tx + moverT * moverT);
1917 double Eexp = exp(EoverT - muoverT);
1918 double f = 1. / (Eexp + statistics);
1919 ret += lagw32[i] * T * tx * T * tx * T * f
1920 * (1. - statistics * f)
1921 * ((EoverT - muoverT) * (1. - 2. * statistics * f) - 3.);
1922 }
1923
1924 ret *= deg / 2. / xMath::Pi() / xMath::Pi() / T / T / T / T;
1925
1926 return ret;
1927 }
1928
1929 double FermiNumericalIntegrationLargeMudndT(double T, double mu, double m, double deg,
1930 const IdealGasFunctionsExtraConfig &extraConfig) {
1931 if (mu <= m)
1932 return QuantumNumericalIntegrationdndT(1, T, mu, m, deg, extraConfig);
1933
1934 assert(extraConfig.MagneticField.B == 0.0);
1935
1936 double pf = sqrt(mu*mu - m * m);
1937 double ret1 = 0.;
1938 for (int i = 0; i < 32; i++) {
1939 double en = sqrt(legx32[i] * legx32[i] * pf * pf + m * m);
1940 double fbar = 1. / (exp(-(en - mu) / T) + 1.);
1941 ret1 += -legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * (mu - en) / T / T * fbar * (1. - fbar);
1942 }
1943
1944 double moverT = m / T;
1945 double muoverT = mu / T;
1946 for (int i = 0; i < 32; i++) {
1947 double tx = pf / T + lagx32[i];
1948 double EoverT = sqrt(tx*tx + moverT * moverT);
1949 double f = 1. / (exp(EoverT - muoverT) + 1.);
1950 ret1 += lagw32[i] * T * tx * T * tx * T * (EoverT - muoverT) / T * f * (1. - f);
1951 }
1952
1953 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1954
1955 return ret1;
1956 }
1957
1958 double FermiNumericalIntegrationLargeMud2ndT2(double T, double mu, double m, double deg,
1959 const IdealGasFunctionsExtraConfig &extraConfig) {
1960 if (mu <= m)
1961 return QuantumNumericalIntegrationd2ndT2(1, T, mu, m, deg, extraConfig);
1962
1963 assert(extraConfig.MagneticField.B == 0.0);
1964
1965 double pf = sqrt(mu*mu - m * m);
1966 double ret1 = 0.;
1967 for (int i = 0; i < 32; i++) {
1968 double en = sqrt(legx32[i] * legx32[i] * pf * pf + m * m);
1969 double fbar = 1. / (exp(-(en - mu) / T) + 1.);
1970 ret1 += -legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * (mu - en) / T / T / T
1971 * fbar * (1. - fbar) * ((mu - en) / T * (1.-2.*fbar) - 2.);
1972 }
1973
1974 double moverT = m / T;
1975 double muoverT = mu / T;
1976 for (int i = 0; i < 32; i++) {
1977 double tx = pf / T + lagx32[i];
1978 double EoverT = sqrt(tx*tx + moverT * moverT);
1979 double f = 1. / (exp(EoverT - muoverT) + 1.);
1980 ret1 += lagw32[i] * T * tx * T * tx * T * (EoverT - muoverT) / T / T
1981 * f * (1. - f) * ((EoverT - muoverT) * (1. - 2. * f) - 2.);
1982 }
1983
1984 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
1985
1986 return ret1;
1987 }
1988
1989 double FermiNumericalIntegrationLargeMudedT(double T, double mu, double m, double deg,
1990 const IdealGasFunctionsExtraConfig &extraConfig) {
1991 if (mu <= m)
1992 return QuantumNumericalIntegrationdedT(1, T, mu, m, deg, extraConfig);
1993
1994 assert(extraConfig.MagneticField.B == 0.0);
1995
1996 double pf = sqrt(mu*mu - m * m);
1997 double ret1 = 0.;
1998 for (int i = 0; i < 32; i++) {
1999 double en = sqrt(legx32[i] * legx32[i] * pf * pf + m * m);
2000 double fbar = 1. / (exp(-(en - mu) / T) + 1.);
2001 ret1 += -legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * en * (mu - en) / T / T * fbar * (1. - fbar);
2002 }
2003
2004 double moverT = m / T;
2005 double muoverT = mu / T;
2006 for (int i = 0; i < 32; i++) {
2007 double tx = pf / T + lagx32[i];
2008 double EoverT = sqrt(tx*tx + moverT * moverT);
2009 double f = 1. / (exp(EoverT - muoverT) + 1.);
2010 ret1 += lagw32[i] * T * tx * T * tx * T * EoverT * T * (EoverT - muoverT) / T * f * (1. - f);
2011 }
2012
2013 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3();
2014
2015 return ret1;
2016 }
2017
2018 double FermiNumericalIntegrationLargeMudedmu(double T, double mu, double m, double deg,
2019 const IdealGasFunctionsExtraConfig &extraConfig) {
2020 if (mu <= m)
2021 return QuantumNumericalIntegrationdedmu(1, T, mu, m, deg, extraConfig);
2022
2023 assert(extraConfig.MagneticField.B == 0.0);
2024
2025 double pf = sqrt(mu*mu - m * m);
2026 double ret1 = 0.;
2027 for (int i = 0; i < 32; i++) {
2028 double en = sqrt(legx32[i] * legx32[i] * pf * pf + m * m);
2029 double Eexp = exp(-(en - mu) / T);
2030 ret1 += legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * en * 1. / (1. + 1./Eexp) / (Eexp + 1.);
2031 //ret1 += legw32[i] * pf * legx32[i] * pf * legx32[i] * pf * Eexp / (Eexp + 1.) / (Eexp + 1.);
2032 }
2033
2034 double moverT = m / T;
2035 double muoverT = mu / T;
2036 for (int i = 0; i < 32; i++) {
2037 double tx = pf / T + lagx32[i];
2038 double EoverT = sqrt(tx*tx + moverT * moverT);
2039 double Eexp = exp(EoverT - muoverT);
2040 ret1 += lagw32[i] * T * tx * T * tx * T * EoverT * T * 1. / (1. + 1. / Eexp) / (Eexp + 1.);
2041 //ret1 += lagw32[i] * T * tx * T * tx * T * Eexp / (Eexp + 1.) / (Eexp + 1.);
2042 }
2043
2044 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() * xMath::GeVtoifm3() / T;
2045
2046 return ret1;
2047 }
2048
2049 double FermiNumericalIntegrationLargeMudchi2dT(double T, double mu, double m, double deg,
2050 const IdealGasFunctionsExtraConfig &extraConfig) {
2051 if (mu <= m)
2052 return QuantumNumericalIntegrationdchi2dT(1, T, mu, m, deg, extraConfig);
2053
2054 assert(extraConfig.MagneticField.B == 0.0);
2055
2056 double pf = sqrt(mu*mu - m * m);
2057 double ret1 = 0.;
2058 for (int i = 0; i < 32; i++) {
2059 double en = sqrt(legx32[i] * legx32[i] * pf * pf + m * m);
2060 double fbar = 1. / (exp(-(en - mu) / T) + 1.);
2061 ret1 += legw32[i] * pf * legx32[i] * pf * legx32[i] * pf
2062 * fbar * (1. - fbar) * ((mu - en) / T * (1. - 2. * fbar) - 3.);
2063 }
2064
2065 double moverT = m / T;
2066 double muoverT = mu / T;
2067 for (int i = 0; i < 32; i++) {
2068 double tx = pf / T + lagx32[i];
2069 double EoverT = sqrt(tx*tx + moverT * moverT);
2070 double f = 1. / (exp(EoverT - muoverT) + 1.);
2071 ret1 += lagw32[i] * T * tx * T * tx * T
2072 * f * (1. - f) * ((EoverT - muoverT) * (1. - 2. * f) - 3.);
2073 }
2074
2075 ret1 *= deg / 2. / xMath::Pi() / xMath::Pi() / T / T / T / T;
2076
2077 return ret1;
2078 }
2079 } // namespace IdealGasFunctions
2080
2081} // namespace thermalfist
Contains implementation of the thermodynamic functions corresponding to an ideal gas of particles in ...
double FermiNumericalIntegrationLargeMuChiNDimensionfull(int N, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the n-th order dimensionfull susceptibility for a Fermi-Dirac ideal gas at mu > m.
double FermiNumericalIntegrationLargeMudndT(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of particle number density wrt T at constant mu for a Maxwell-Boltzmann gas.
double FermiNumericalIntegrationLargeMud2ndT2(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the second derivative of particle number density wrt T at constant mu for a Maxwell-Boltzman...
double FermiZeroTChiN(int N, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the n-th order susceptibility for a Fermi-Dirac ideal gas at zero temperature.
double FermiNumericalIntegrationLargeMuScalarDensity(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the scalar density of a Fermi-Dirac ideal gas at mu > m.
double FermiZeroTdn3dmu3(double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double FermiNumericalIntegrationLargeMuDensity(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the particle number density of a Fermi-Dirac ideal gas at mu > m.
double QuantumClusterExpansionEntropyDensity(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the entropy density of a quantum ideal gas using cluster expansion.
double QuantumClusterExpansiondedT(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of energy density wrt T at constant mu for a Maxwell-Boltzmann gas.
double FermiNumericalIntegrationLargeMuPressure(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the pressure of a Fermi-Dirac ideal gas at mu > m.
double BoltzmannTdndmu(int N, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the chemical potential derivative of density for a Maxwell-Boltzmann gas.
double QuantumNumericalIntegrationMagnetization(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the magnetization of a quantum ideal gas using 32-point Gauss-Laguerre quadratures.
double FermiZeroTdn2dmu2(double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double QuantumClusterExpansionMagnetization(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the thermal part of the magnetization of a Maxwell-Boltzmann gas, m_B = dP/dB.
double QuantumNumericalIntegrationChiN(int N, int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the n-th order dimensionless susceptibility for a quantum ideal gas using 32-point Gauss-Lag...
double QuantumClusterExpansionChiNDimensionfull(int N, int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the n-th order dimensionfull susceptibility for a quantum ideal gas using cluster expansion.
double FermiNumericalIntegrationLargeMuTdndmu(int N, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double psi(double x)
Auxiliary function.
QStatsCalculationType
Identifies whether quantum statistics are to be computed using the cluster expansion or numerical int...
double BoltzmannDensity(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the particle number density of a Maxwell-Boltzmann gas.
double BoltzmanndedT(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of energy density wrt T at constant mu for a Maxwell-Boltzmann gas.
double QuantumNumericalIntegrationdedmu(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of energy density wrt mu at constant T for a Maxwell-Boltzmann gas.
double BoltzmannChiNDimensionfull(int N, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the n-th order dimensionfull susceptibility for a Maxwell-Boltzmann gas.
double FermiZeroTEntropyDensity(double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the entropy density of a Fermi-Dirac ideal gas at zero temperature.
std::vector< double > GetSpins(double degSpin)
Calculate all the spin values -S, S+1,...,S-1,S.
double FermiNumericalIntegrationLargeMudedmu(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of energy density wrt mu at constant T for a Maxwell-Boltzmann gas.
double FermiNumericalIntegrationLargeMuT3dn3dmu3(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double IdealGasQuantity(Quantity quantity, QStatsCalculationType calctype, int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Calculation of a generic ideal gas function.
double QuantumClusterExpansionScalarDensity(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the scalar density of a quantum ideal gas using cluster expansion.
bool calculationHadBECIssue
Whether \mu > m Bose-Einstein condensation issue was encountered for a Bose gas.
double BoltzmannEntropyDensity(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the entropy density of a Maxwell-Boltzmann gas.
double QuantumNumericalIntegrationdndT(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of particle number density wrt T at constant mu for a Maxwell-Boltzmann gas.
double QuantumNumericalIntegrationScalarDensity(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the scalar density of a quantum ideal gas using 32-point Gauss-Laguerre quadratures.
double FermiNumericalIntegrationLargeMudchi2dT(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of the susceptibility wrt T at constant mu for a Maxwell-Boltzmann gas.
double FermiZeroTEnergyDensity(double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the energy density of a Fermi-Dirac ideal gas at zero temperature.
double FermiNumericalIntegrationLargeMuMagnetization(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double FermiNumericalIntegrationLargeMuChiN(int N, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the n-th order dimensionless susceptibility for a Fermi-Dirac ideal gas at mu > m.
double Boltzmanndchi2dT(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of the susceptibility wrt T at constant mu for a Maxwell-Boltzmann gas.
double QuantumNumericalIntegrationT3dn3dmu3(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double FermiNumericalIntegrationLargeMuT1dn1dmu1(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double Boltzmanndedmu(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of energy density wrt mu at constant T for a Maxwell-Boltzmann gas.
double psi2(double x)
Auxiliary function.
double QuantumClusterExpansiondedmu(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of energy density wrt mu at constant T for a Maxwell-Boltzmann gas.
double FermiNumericalIntegrationLargeMuT2dn2dmu2(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double FermiZeroTMagnetization(double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double QuantumNumericalIntegrationdchi2dT(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of the susceptibility wrt T at constant mu for a Maxwell-Boltzmann gas.
double QuantumNumericalIntegrationTdndmu(int N, int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double FermiZeroTScalarDensity(double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the scalar density of a Fermi-Dirac ideal gas at zero temperature.
double QuantumNumericalIntegrationEnergyDensity(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the energy density of a quantum ideal gas using 32-point Gauss-Laguerre quadratures.
double QuantumClusterExpansionChiN(int N, int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the n-th order dimensionless susceptibility for a quantum ideal gas using cluster expansion.
double Boltzmannd2ndT2(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the 2nd derivative of particle number density wrt T at constant mu for a Maxwell-Boltzmann g...
double FermiNumericalIntegrationLargeMudedT(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of energy density wrt T at constant mu for a Maxwell-Boltzmann gas.
double QuantumClusterExpansiond2ndT2(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the 2nd derivative of particle number density wrt T at constant mu for a Maxwell-Boltzmann g...
double FermiNumericalIntegrationLargeMuEnergyDensity(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the energy density of a Fermi-Dirac ideal gas at mu > m.
double BoltzmannScalarDensity(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the scalar density of a Maxwell-Boltzmann gas.
double QuantumClusterExpansionDensity(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the particle number density of a quantum ideal gas using cluster expansion.
double BoltzmannMagnetization(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the thermal part of the magnetization of a Maxwell-Boltzmann gas, m_B = dP/dB.
double BoltzmannChiN(int N, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the n-th order dimensionless susceptibility for a Maxwell-Boltzmann gas.
double QuantumNumericalIntegrationT2dn2dmu2(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double QuantumClusterExpansionEnergyDensity(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the energy density of a quantum ideal gas using cluster expansion.
double FermiZeroTdn1dmu1(double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double FermiZeroTPressure(double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the pressure of a Fermi-Dirac ideal gas at zero temperature.
double BoltzmannPressure(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the pressure of a Maxwell-Boltzmann gas.
double QuantumClusterExpansionPressure(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the pressure of a quantum ideal gas using cluster expansion.
double QuantumNumericalIntegrationEntropyDensity(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the entropy density of a quantum ideal gas using 32-point Gauss-Laguerre quadratures.
Quantity
Identifies the thermodynamic function.
double QuantumNumericalIntegrationd2ndT2(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the 2nd derivative of particle number density wrt T at constant mu for a Maxwell-Boltzmann g...
double QuantumNumericalIntegrationT1dn1dmu1(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double BoltzmanndndT(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Temperature derivatives.
double QuantumNumericalIntegrationDensity(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the particle number density of a quantum ideal gas using 32-point Gauss-Laguerre quadratures...
double QuantumClusterExpansiondndT(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of particle number density wrt T at constant mu for a Maxwell-Boltzmann gas.
double QuantumNumericalIntegrationdedT(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of energy density wrt T at constant mu for a Maxwell-Boltzmann gas.
double FermiZeroTdndmu(int N, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
double FermiNumericalIntegrationLargeMuEntropyDensity(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the entropy density of a Fermi-Dirac ideal gas at mu > m.
double QuantumClusterExpansiondchi2dT(int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the derivative of the susceptibility wrt T at constant mu for a Maxwell-Boltzmann gas.
double QuantumNumericalIntegrationChiNDimensionfull(int N, int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the n-th order dimensionfull susceptibility for a quantum ideal gas using 32-point Gauss-Lag...
double QuantumClusterExpansionTdndmu(int N, int statistics, double T, double mu, double m, double deg, int order=1, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the chemical potential derivative of density for a quantum ideal gas using cluster expansion...
double FermiZeroTDensity(double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the particle number density of a Fermi-Dirac ideal gas at zero temperature.
double QuantumNumericalIntegrationPressure(int statistics, double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the pressure of a quantum ideal gas using 32-point Gauss-Laguerre quadratures.
double FermiZeroTChiNDimensionfull(int N, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the n-th order susceptibility scaled by T^n for a Fermi-Dirac ideal gas at zero temperature.
double BoltzmannEnergyDensity(double T, double mu, double m, double deg, const IdealGasFunctionsExtraConfig &extraConfig=IdealGasFunctionsExtraConfig())
Computes the energy density of a Maxwell-Boltzmann gas.
const double coefficients_xleg32_zeroone[32]
Nodes of the 32-point Gauss-Legendre quadrature in the interval [0,1].
const double coefficients_wlag32[32]
Weights of the 32-point Gauss-Laguerre quadrature.
const double coefficients_wleg32_zeroone[32]
Weights of the 32-point Gauss-Legendre quadrature in the interval [0,1].
const double coefficients_xlag32[32]
Nodes of the 32-point Gauss-Laguerre quadrature.
constexpr double Pi()
Pi constant.
Definition xMath.h:23
double BesselKexp(int n, double x)
Modified Bessel function K_n(x), divided by exponential factor.
Definition xMath.cpp:693
double BesselK1exp(double x)
Modified Bessel function K_1(x), divided by exponential factor.
Definition xMath.cpp:657
constexpr double GeVtoifm3()
A constant to transform GeV into fm .
Definition xMath.h:31
The main namespace where all classes and functions of the Thermal-FIST library reside.
Definition CosmicEoS.h:9
MagneticFieldConfiguration MagneticField
Magnetic field configuration.
Contains some extra mathematical functions used in the code.