Class fermion_deriv_rel_tl (o2scl)¶
-
template<class
fermion_deriv_t
= fermion_deriv_tl<double>, classfp_t
= double>
classo2scl
::
fermion_deriv_rel_tl
: public o2scl::fermion_deriv_thermo_tl<double>¶ Equation of state for a relativistic fermion.
This implements an equation of state for a relativistic fermion using direct integration. After subtracting the rest mass from the chemical potentials, the distribution function is
\[ \left\{1+\exp[(\sqrt{k^2+m^{* 2}}-m-\nu)/T]\right\}^{-1} \]where \( k \) is the momentum, \( \nu \) is the effective chemical potential, \( m \) is the rest mass, and \( m^{*} \) is the effective mass. For later use, we define \( E^{*} = \sqrt{k^2 + m^{*2}} \) . The degeneracy parameter is\[ \psi=(\nu+(m-m^{*}))/T \]For \( \psi \) greater than deg_limit (degenerate regime), a finite interval integrator is used and for \( \psi \) less than deg_limit (non-degenerate regime), an integrator over the interval from \( [0,\infty) \) is used. The upper limit on the degenerate integration is given by the value of the momentum \( k \) which is the solution of\[ (\sqrt{k^2+m^{*,2}}-m-\nu)/T=\mathrm{f{l}imit} \]which is\[ \sqrt{(m+{\cal L})^2-m^{*2}} \]where \( {\cal L}\equiv\mathrm{f{l}imit}\times T+\nu \) .- Note
This class only has preliminary support for inc_rest_mass=true (more testing should be done, particularly for the “pair” functions)
- Note
The testing of this class is apparently sensitive to the difference between gsl_hypot and std::hypot in o2hypot in misc.cpp. Further testing needs to be done to verify which is more accurate. This further testing will probably need to wait until the full multiprecision fermion classes are done.
For the entropy integration, we set the lower limit to
\[ 2 \sqrt{\nu^2+2 \nu m} - \mathrm{upper~limit} \]since the only contribution to the entropy is at the Fermi surface.In the non-degenerate regime, we make the substitution \( u=k/T \) to help ensure that the variable of integration scales properly.
Uncertainties are given in unc.
Evaluation of the derivatives
The relevant derivatives of the distribution function are
\[ \frac{\partial f}{\partial T}= f(1-f)\frac{E^{*}-m-\nu}{T^2} \]\[ \frac{\partial f}{\partial \nu}= f(1-f)\frac{1}{T} \]\[ \frac{\partial f}{\partial k}= -f(1-f)\frac{k}{E^{*} T} \]\[ \frac{\partial f}{\partial m^{*}}= -f(1-f)\frac{m^{*}}{E^{*} T} \]We also need the derivative of the entropy integrand w.r.t. the distribution function, which is
\[ {\cal S}\equiv f \ln f +(1-f) \ln (1-f) \qquad \frac{\partial {\cal S}}{\partial f} = \ln \left(\frac{f}{1-f}\right) = \left(\frac{\nu-E^{*}+m}{T}\right) \]where the entropy density is\[ s = - \frac{g}{2 \pi^2} \int_0^{\infty} {\cal S} k^2 d k \]The derivatives can be integrated directly (method = direct) or they may be converted to integrals over the distribution function through an integration by parts (method = by_parts)
\[ \int_a^b f(k) \frac{d g(k)}{dk} dk = \left.f(k) g(k)\right|_{k=a}^{k=b} - \int_a^b g(k) \frac{d f(k)}{dk} dk \]using the distribution function for \( f(k) \) and 0 and \( \infty \) as the limits, we have\[ \frac{g}{2 \pi^2} \int_0^{\infty} \frac{d g(k)}{dk} f dk = \frac{g}{2 \pi^2} \int_0^{\infty} g(k) f (1-f) \frac{k}{E^{*} T} dk \]as long as \( g(k) \) vanishes at \( k=0 \) . Rewriting,\[ \frac{g}{2 \pi^2} \int_0^{\infty} h(k) f (1-f) dk = \frac{g}{2 \pi^2} \int_0^{\infty} f \frac{T}{k} \left[ h^{\prime} E^{*}-\frac{h E^{*}}{k}+\frac{h k}{E^{*}} \right] dk \]as long as \( h(k)/k \) vanishes at \( k=0 \) .Explicit forms
1) The derivative of the density wrt the chemical potential
\[ \left(\frac{d n}{d \mu}\right)_T = \frac{g}{2 \pi^2} \int_0^{\infty} \frac{k^2}{T} f (1-f) dk \]Using \( h(k)=k^2/T \) we get\[ \left(\frac{d n}{d \mu}\right)_T = \frac{g}{2 \pi^2} \int_0^{\infty} \left(\frac{k^2+E^{*2}}{E^{*}}\right) f dk \]2) The derivative of the density wrt the temperature
\[ \left(\frac{d n}{d T}\right)_{\mu} = \frac{g}{2 \pi^2} \int_0^{\infty} \frac{k^2(E^{*}-m-\nu)}{T^2} f (1-f) dk \]Using \( h(k)=k^2(E^{*}-\nu)/T^2 \) we get\[ \left(\frac{d n}{d T}\right)_{\mu} = \frac{g}{2 \pi^2} \int_0^{\infty} \frac{f}{T} \left[2 k^2+E^{*2}-E^{*}\left(\nu+m\right)- k^2 \left(\frac{\nu+m}{E^{*}}\right)\right] dk \]3) The derivative of the entropy wrt the chemical potential
\[ \left(\frac{d s}{d \mu}\right)_T = \frac{g}{2 \pi^2} \int_0^{\infty} k^2 f (1-f) \frac{(E^{*}-m-\nu)}{T^2} dk \]This verifies the Maxwell relation\[ \left(\frac{d s}{d \mu}\right)_T = \left(\frac{d n}{d T}\right)_{\mu} \]4) The derivative of the entropy wrt the temperature
\[ \left(\frac{d s}{d T}\right)_{\mu} = \frac{g}{2 \pi^2} \int_0^{\infty} k^2 f (1-f) \frac{(E^{*}-m-\nu)^2}{T^3} dk \]Using \( h(k)=k^2 (E^{*}-\nu)^2/T^3 \)\[ \left(\frac{d s}{d T}\right)_{\mu} = \frac{g}{2 \pi^2} \int_0^{\infty} \frac{f(E^{*}-m-\nu)}{E^{*}T^2} \left[E^{* 3}+3 E^{*} k^2- (E^{* 2}+k^2)(\nu+m)\right] d k \]5) The derivative of the density wrt the effective mass
\[ \left(\frac{d n}{d m^{*}}\right)_{T,\mu} = -\frac{g}{2 \pi^2} \int_0^{\infty} \frac{k^2 m^{*}}{E^{*} T} f (1-f) dk \]Using \( h(k)=-(k^2 m^{*})/(E^{*} T) \) we get\[ \left(\frac{d n}{d m^{*}}\right)_{T,\mu} = -\frac{g}{2 \pi^2} \int_0^{\infty} m^{*} f dk \]- Idea for Future:
The option err_nonconv=false is not really implemented yet.
- Note
The dsdT integration may fail if the system is very degenerate. When method is byparts, the integral involves a large cancellation between the regions from \( k \in (0, \mathrm{ulimit/2}) \) and \( k \in (\mathrm{ulimit/2}, \mathrm{ulimit}) \). Switching to method=direct and setting the lower limit to \( \mathrm{llimit} \), may help, but recent testing on this gave negative values for dsdT. For very degenerate systems, an expansion may be better than trying to perform the integration. The value of the integrand at k=0 also looks like it might be causing difficulties.
- Idea for Future:
The pair_density() function is a bit slow because it computes the non-derivative thermodynamic quantities twice, and this could be improved.
Method of computing derivatives
-
int
last_method
¶ An integer indicating the last numerical method used.
The function calc_mu() sets this integer to a two-digit number. It is equal to 10 times the value reported by o2scl::fermion_rel::calc_mu() plus a value from the list below corresponding to the method used for the derivatives
1: nondegenerate expansion
2: degenerate expansion
4: nondegenerate integrand, using user-specified value for method
5: degenerate integrand, using direct
6: degenerate integrand, using by_parts
7: degenerate integrand, using user-specified value for method
The function nu_from_n() sets this value equal to 100 times the value reported by o2scl::fermion_rel_tl::nu_from_n() .
The function calc_density() sets this value equal to the value from o2scl::fermion_deriv_rel_tl::nu_from_n() plus the value from o2scl::fermion_deriv_rel_tl::calc_mu() .
-
bool
err_nonconv
¶ If true, call the error handler when convergence fails (default true)
-
inte_qagiu_gsl
def_nit
¶ The default integrator for the non-degenerate regime.
-
inte_qag_gsl
def_dit
¶ The default integrator for the degenerate regime.
-
root_cern
def_density_root
¶ The default solver for npen_density() and pair_density()
-
const int
automatic
= 0¶ Automatically choose method.
-
const int
direct
= 1¶ In the form containing \( f(1-f) \) .
-
const int
by_parts
= 2¶ Integrate by parts.
-
int
intl_method
¶ The internal integration method.
-
inte *
nit
¶ The integrator for non-degenerate fermions.
-
inte *
dit
¶ The integrator for degenerate fermions.
-
root *
density_root
¶ The solver for calc_density() and pair_density()
-
int
calc_mu
(fermion_deriv_t &f, fp_t temper)¶ Calculate properties as function of chemical potential.
-
int
calc_density
(fermion_deriv_t &f, fp_t temper)¶ Calculate properties as function of density.
-
int
pair_mu
(fermion_deriv_t &f, fp_t temper)¶ Calculate properties with antiparticles as function of chemical potential.
-
int
pair_density
(fermion_deriv_t &f, fp_t temper)¶ Calculate properties with antiparticles as function of density.
-
int
nu_from_n
(fermion_deriv_t &f, fp_t temper)¶ Calculate effective chemical potential from density.
-
void
set_inte
(inte<> &unit, inte<> &udit)¶ Set inte objects.
The first integrator is used for non-degenerate integration and should integrate from 0 to \( \infty \) (like o2scl::inte_qagiu_gsl). The second integrator is for the degenerate case, and should integrate between two finite values.
-
void
set_density_root
(root<> &rp)¶ Set the solver for use in calculating the chemical potential from the density.
-
const char *
type
()¶ Return string denoting type (“fermion_deriv_rel”)
The integrands, as a function of \f$ u=k/T \f$, for
non-degenerate integrals
-
fp_t
density_T_fun
(fp_t u, fermion_deriv_t &f, fp_t T)¶
-
fp_t
density_mu_fun
(fp_t u, fermion_deriv_t &f, fp_t T)¶
-
fp_t
entropy_T_fun
(fp_t u, fermion_deriv_t &f, fp_t T)¶
-
fp_t
density_ms_fun
(fp_t u, fermion_deriv_t &f, fp_t T)¶
The integrands, as a function of momentum, for the
degenerate integrals
-
fp_t
deg_density_T_fun
(fp_t k, fermion_deriv_t &f, fp_t T)¶
-
fp_t
deg_density_mu_fun
(fp_t k, fermion_deriv_t &f, fp_t T)¶
-
fp_t
deg_entropy_T_fun
(fp_t k, fermion_deriv_t &f, fp_t T)¶
-
fp_t
deg_density_ms_fun
(fp_t k, fermion_deriv_t &f, fp_t T)¶
Public Functions
-
fermion_deriv_rel_tl
()¶ Create a fermion with mass
m
and degeneracyg
.
-
~fermion_deriv_rel_tl
()¶
Public Members
-
fp_t
upper_limit_fac
¶ The limit for the Fermi functions (default 20.0)
fermion_deriv_rel will ignore corrections smaller than about \( \exp(-\mathrm{f{l}imit}) \) .
-
fermion_deriv_t
unc
¶ Storage for the most recently calculated uncertainties.
-
fermion_rel_tl<fermion_deriv_t>
fr
¶ Object for computing non-derivative quantities.