Class eos_had_rmf (o2scl)¶
-
class eos_had_rmf : public o2scl::eos_had_temp_pres_base¶
Relativistic mean field theory EOS.
This class computes the properties of nucleonic matter using a mean-field approximation to a field-theoretical model.
Before sending neutrons and protons to these member functions, the masses should be set to and the degeneracy factor should be set to 2. Some models which can be loaded using
o2scl_hdf::rmf_load()
expect that the neutron and proton masses are set to the value stored in mnuc.Background
The full Lagragian can be written as a sum of several terms
\[ {\cal L} = {\cal L}_{\mathrm{Dirac}} + {\cal L}_{\sigma} + {\cal L}_{\omega} + {\cal L}_{\rho} + {\cal L}_{\mathrm{int}} \, . \]The part for the nucleon fields is
\[ {\cal L}_{\mathrm{Dirac}} = \bar{\Psi}_i \left[ i {{\partial}\!\!\!{\backslash}} - g_{\omega} {{\omega}\!\!\!{\backslash}} - \frac{g_{\rho}}{2} {{\vec{\rho}}\!\!\!{\backslash}} \vec{\tau} - M_i + g_{\sigma} \sigma - e q_i A\!\!\!{\backslash} \right] \Psi_i \]where \( \Psi \) is the nucleon field and \( \sigma, \omega \) and \( \rho \) are the meson fields. The meson masses are \( m_{\sigma}, m_{\omega} \) and \( m_{\rho} \) and meson-nucleon couplings are \( g_{\sigma}, g_{\omega} \) and \( g_{\rho} \) . The couplingscs
,cw
, andcr
are related to \( g_{\sigma}, g_{\omega} \) and \( g_{\rho} \) by\[ c_{\sigma} = g_{\sigma}/m_{\sigma} \quad c_{\omega} = g_{\omega}/m_{\omega} \quad \mathrm{and} \quad c_{\rho} = g_{\rho}/m_{\rho} \]The nucleon masses are in \( M_i \) and stored inpart::m
and \( q_i \) just represents the charge (1 for protons and 0 for neutrons). The Coulomb field, \( A_{\mu} \), is ignored in this class, but used in o2scl::nucleus_rmf.The part for the \( \sigma \) field is
\[ {\cal L}_{\sigma} = {\textstyle \frac{1}{2}} \left( \partial_{\mu} \sigma \right)^2 - {\textstyle \frac{1}{2}} m^2_{\sigma} \sigma^2 - \frac{b M}{3} \left( g_{\sigma} \sigma\right)^3 - \frac{c}{4} \left( g_{\sigma} \sigma\right)^4 \, . \]where \( m_{\sigma} \) is the meson mass, \( b \) and \( c \) are unitless couplings and \( M \) is a dimensionful scale, ususally taken to be 939 MeV (which need not be equal to \( M_i \) above). The coefficients \( b \) and \( c \) are related to the somewhat standard \( \kappa \) and \( \lambda \) by:\[ \kappa=2 M b \quad \lambda=6 c; \]The part for the \( \omega \) field is
\[ {\cal L}_{\omega} = - {\textstyle \frac{1}{4}} f_{\mu \nu} f^{\mu \nu} + {\textstyle \frac{1}{2}} m^2_{\omega}\omega^{\mu}\omega_{\mu} + \frac{\zeta}{24} g_{\omega}^4 \left(\omega^\mu \omega_\mu\right)^2 \]where \( m_{\omega} \) is the meson mass.The part for the \( \rho \) field is
\[ {\cal L}_{\rho} = - {\textstyle \frac{1}{4}} \vec{B}_{\mu \nu} \cdot \vec{B}^{\mu \nu} + {\textstyle \frac{1}{2}} m^2_{\rho} \vec{\rho}^{~\mu} \cdot \vec{\rho}_{~\mu} + \frac{\xi}{24} g_{\rho}^4 \left(\vec{\rho}^{~\mu}\right) \cdot \vec{\rho}_{~\mu} \]Finally, additional meson interactions are
\[\begin{split} {\cal L}_{\mathrm{int}} = g_{\rho}^2 f (\sigma, \omega) \vec{\rho}^{~\mu} \cdot \vec{\rho}_{~\mu} \nonumber \\ \end{split}\]The function \( f \) is the coefficient of \( g_r^2 \rho^2 \)\( f(\sigma,\omega) = b_1 \omega^2 + b_2 \omega^4 + b_3 \omega^6 + a_1 \sigma + a_2 \sigma^2 + a_3 \sigma^3 + a_4 \sigma^4 + a_5 \sigma^5 + a_6 \sigma^6 \)where the notation from [Horowitz01] is:
\( f(\sigma,\omega) = \lambda_4 g_s^2 \sigma^2 + \lambda_v g_w^2 \omega^2 \) This implies \( b_1=\lambda_v g_w^2 \) and \( a_2=\lambda_4 g_s^2 \)
The couplings,
cs
,cw
, andcr
all have units of \( \mathrm{fm} \), and the couplingsb
,c
,zeta
andxi
are unitless.Additional couplings are from [Steiner05b],
They are: \( a_i \) have units of \( \mathrm{fm}^{(i-2)} \) and the couplings \( b_j \) have units of \( \mathrm{fm}^{(2j-2)} \) .
When the variable
zm_mode
is true, the effective mass is fixed using the approach of [Zimanyi90].The expressions for the energy densities are often simplified in the literature using the field equations. These expressions are not used in this code since they are only applicable in infinite matter where the field equations hold, and are not suitable for use in applications (such as to finite nuclei in o2scl::nucleus_rmf) where the spatial derivatives of the fields are non-zero. Notice that in the proper expressions for the energy density the similarity between terms in the pressure up to a sign. This procedure allows one to verify the thermodynamic identity even if the field equations are not solved and allows the user to add gradient terms to the energy density and pressure.
See also [Muller96].
Field equations
The field equations are:
\[ 0 = m_{\sigma}^2 \sigma - g_{\sigma} \left( n_{s n} + n_{s p} \right) + b M g_{\sigma}^3 \sigma^2 + c g_{\sigma}^4 \sigma^3 - g_{\rho}^2 \rho^2 \frac{\partial f}{\partial \sigma} \]\[ 0 = m_{\omega}^2 \omega - g_{\omega} \left(n_n+n_p\right) + \frac{\zeta}{6} g_{\omega}^4 \omega^3 + g_{\rho}^2 \rho^2 \frac{\partial f}{\partial \omega} \]\[ 0 = m_{\rho}^2 \rho + \frac{1}{2} g_{\rho} \left(n_n-n_p\right) + 2 g_{\rho}^2 \rho f + \frac{\xi}{6} g_{\rho}^4 \rho^3 \]Saturation properties
Defining
\[ U(\sigma)=\frac{1}{2} m_\sigma^2\sigma^2+\frac{b M}{3}(g_\sigma\sigma)^3 +\frac{c}{4}(g_\sigma\sigma)^4\;, \]the binding energy per particle in symmetric matter at equilibrium is given by\[ \frac{E}{A} = \frac{1}{n_0} \left[U(\sigma_0)+ \frac{1}{2} m_\omega\omega_0^2+ \frac{\zeta}{8}(g_\omega\omega_0)^4+\frac{2}{\pi^2} \int\limits_0^{k_F} dk k^2\sqrt{k^2+M^{*2}} \right] \]where the Dirac effective mass is \( M^{*}_i = M_i - g_{\sigma}\sigma_0 \) . The compressibility is given by\[ K=9\frac{g_\omega^2}{m_\omega^2}n_0+3\frac{k_F^2}{E_F^*} -9n_0\frac{M^{*2}}{E_F^{*2}}\left[\left(\frac{1}{g_\sigma^2} \frac{\partial^2}{\partial\sigma_0^2}+\frac{3}{g_\sigma M^*} \frac{\partial}{\partial\sigma_0}\right) U(\sigma_0)-3\frac{n_0}{E_F^*}\right]^{-1}\;. \]The symmetry energy of bulk matter is given by\[ E_{sym} = \frac{k_F^2}{6 E_F^{*}} + \frac{ n } {8 \left(g_{\rho}^2/m_{\rho}^2 + 2 f (\sigma_0, \omega_0) \right)} \, . \]In the above equations, the subscipt \( 0 \) denotes the mean field values of \( \sigma \) and \( \omega \) . For the case \( f=0 \) , the symmetry energy varies linearly with the density at large densities. The function \( f \) permits variations in the density dependence of the symmetry energy above nuclear matter density.
Todo
In class eos_had_rmf:
The functions fcomp_fields(), fkprime_fields(), and fesym_fields() are not quite correct if the neutron and proton masses are different. For this reason, they are currently unused by saturation().
The fix_saturation() and calc_cr() functions use mnuc, and should be modified to allow different neutron and proton masses.
Check the formulas in the “Background” section
Make sure that this class properly handles particles for which inc_rest_mass is true/false
The calc_e() function fails to converge at lower densities. See the testing code which has trouble with NL3 and RAPR.
- Idea for Future:
Finish putting the err_nonconv system into calc_p(), calc_temp_e() and fix_saturation(), etc.
It might be nice to remove explicit reference to the meson masses in functions which only compute nuclear matter since they are unnecessary. This might, however, demand redefining some of the couplings.
Fix calc_p() to be better at guessing
The number of couplings is getting large, maybe new organization is required.
Overload eos_had_base::fcomp() with an exact version
It would be nice to analytically compute the Jacobian of the field equations for the solver
Note
Since this EOS uses the effective masses and chemical potentials in the o2scl::part class, the values of
o2scl::part::non_interacting
for neutrons and protons are set to false in many of the functions.Note
Matter at two different densities can have the same chemical potentials, so the behavior of the function o2scl::eos_had_rmf::calc_temp_p() is ambiguous. This arises because the field equations have more than one solution for a specified chemical potential. Internally, o2scl::eos_had_rmf::calc_temp_p() either uses the initial guess specified by a call to o2scl::eos_had_rmf::set_fields(), or uses hard-coded initial guess values typical for saturation densities. In order to ensure that the user gets the desired solution to the field equations, it may be necessary to specify a sufficiently accurate initial guess. There is no ambiguity in the behavior of o2scl::eos_had_rmf::calc_eq_temp_p(), however.
Note
This class can fail to solve the meson field equations or fail to solve for the nucleon densities. By default the error handler is called when this happens. If eos_had_base::err_nonconv is false, then functions which don’t converge (which also return
int
) will return a non-zero value. Note that the solvers (in def_sat_mroot and o2scl::eos_had_base::def_mroot) also has its own data member indicating how to handle nonconvergence o2scl::mroot::err_nonconv which is separate.Subclassed by o2scl::eos_had_rmf_delta, o2scl::eos_had_rmf_hyp, o2scl::eos_had_sym4_rmf
Other data members
-
size_t calc_e_steps¶
The number of separate calls to the solver that the
calc_e
functions take (default 20)Values larger than about \( 10^4 \) are probably not useful.
-
bool calc_e_relative¶
If true, solve for relative densities rather than absolute densities (default false)
Setting this to true makes calc_temp_e() and calc_e() more accurate at low densities.
-
bool zm_mode¶
Modifies method of calculating effective masses (default false)
-
int verbose¶
Verbosity parameter.
If this is greater than zero, then some functions report on their progress.
The function saturation() reports progress towards computing the properties of nuclear matter near saturation.
The functions calc_e() and calc_temp_e() report progress on solving for matter at a fixed density.
Masses
-
double mnuc¶
The scale \( M \).
This need not be exactly equal to the neutron or proton mass, but provides the scale for the coupling
b
.
-
double ms¶
\( \sigma \) mass (in \( \mathrm{fm}^{-1} \) )
-
double mw¶
\( \omega \) mass (in \( \mathrm{fm}^{-1} \) )
-
double mr¶
\( \rho \) mass (in \( \mathrm{fm}^{-1} \) )
Standard couplings (including nonlinear sigma terms)
-
double cs¶
-
double cw¶
-
double cr¶
-
double b¶
-
double c¶
Additional isovector couplings
-
double a1¶
-
double a2¶
-
double a3¶
-
double a4¶
-
double a5¶
-
double a6¶
-
double b1¶
-
double b2¶
-
double b3¶
-
eos_had_rmf()¶
-
inline virtual ~eos_had_rmf()¶
Destructor.
-
inline eos_had_rmf(const eos_had_rmf &f)¶
Copy constructor.
-
inline eos_had_rmf &operator=(const eos_had_rmf &f)¶
Copy construction with operator=()
Functions dealing with naturalness
-
double n_baryon¶
Temporary baryon density.
-
double n_charge¶
Temporary charge density.
- Idea for Future:
Should use eos_had_base::proton_frac instead?
-
inline void check_naturalness(eos_had_rmf &re)¶
Set the coefficients of a eos_had_rmf object to their limits from naturalness.
As given in [Muller96].
The definition of the vector-isovector field and coupling matches what is done here. Compare the Lagrangian above with Eq. 10 from the reference.
The following couplings should all be of the same size:
\[ \frac{1}{2 c_s^2 M^2}, \frac{1}{2 c_v^2 M^2} \frac{1}{8 c_{\rho}^2 M^2},~\mathrm{and}~\frac{ \bar{a}_{ijk} M^{i+2 j+2 k-4}}{2^{2 k}} \]which are equivalent to\[ \frac{m_s^2}{2 g_s^2 M^2}, \frac{m_v^2}{2 g_v^2 M^2} \frac{m_{\rho}^2}{8 g_{\rho}^2 M^2},~\mathrm{and}~\frac{ a_{ijk} M^{i+2 j+2 k-4}}{g_s^i g_v^{2 j} g_{\rho}^{2 k} 2^{2 k}} \]The connection the \( a_{ijk} \) ‘s and the coefficients that are used here is
\[\begin{split}\begin{eqnarray*} \frac{b M}{3} g_{\sigma}^3 \sigma^3 &=& a_{300}~\sigma^3 \nonumber \\ \frac{c}{4} g_{\sigma}^4 \sigma^4 &=& a_{400}~\sigma^4 \nonumber \\ \frac{\zeta}{24} g_{\omega}^4 \omega^4 &=& a_{020}~\omega^4 \nonumber \\ \frac{\xi}{24} g_{\rho}^4 \rho^4 &=& a_{002}~\rho^4 \nonumber \\ b_1 g_{\rho}^2 \omega^2 \rho^2 &=& a_{011}~\omega^2 \rho^2 \nonumber \\ b_2 g_{\rho}^2 \omega^4 \rho^2 &=& a_{021}~\omega^4 \rho^2 \nonumber \\ b_3 g_{\rho}^2 \omega^6 \rho^2 &=& a_{031}~\omega^6 \rho^2 \nonumber \\ a_1 g_{\rho}^2 \sigma^1 \rho^2 &=& a_{101}~\sigma^1 \rho^2 \nonumber \\ a_2 g_{\rho}^2 \sigma^2 \rho^2 &=& a_{201}~\sigma^2 \rho^2 \nonumber \\ a_3 g_{\rho}^2 \sigma^3 \rho^2 &=& a_{301}~\sigma^3 \rho^2 \nonumber \\ a_4 g_{\rho}^2 \sigma^4 \rho^2 &=& a_{401}~\sigma^4 \rho^2 \nonumber \\ a_5 g_{\rho}^2 \sigma^5 \rho^2 &=& a_{501}~\sigma^5 \rho^2 \nonumber \\ a_6 g_{\rho}^2 \sigma^6 \rho^2 &=& a_{601}~\sigma^6 \rho^2 \nonumber \end{eqnarray*}\end{split}\]Note that Muller and Serot use the notation
\[ \frac{\bar{\kappa} g_s^3 }{2} = \frac{\kappa}{2} = b M g_s^3 \qquad \mathrm{and} \qquad \frac{\bar{\lambda} g_s^4}{6} = \frac{\lambda}{6} = c g_s^4 \]which differs slightly from the “standard” notation above.We need to compare the values of
\[\begin{split}\begin{eqnarray*} &\frac{m_s^2}{2 g_s^2 M^2}, \frac{m_v^2}{2 g_v^2 M^2} \frac{m_{\rho}^2}{8 g_{\rho}^2 M^2},\frac{b}{3}, \frac{c}{4} & \nonumber \\ &\frac{\zeta}{24}, \frac{\xi}{384}, \frac{b_1}{4 g_{\omega}^2}, \frac{b_2 M^2}{4 g_{\omega}^4}, \frac{b_3 M^4}{4 g_{\omega}^6}, \frac{a_1}{4 g_{\sigma} M},& \nonumber \\ &\frac{a_2}{4 g_{\sigma}^2}, \frac{a_3 M}{4 g_{\sigma}^3}, \frac{a_4 M^2}{4 g_{\sigma}^4}, \frac{a_5 M^3}{4 g_{\sigma}^5},~\mathrm{and}~\frac{a_6 M^4} {4 g_{\sigma}^6}\, .& \end{eqnarray*}\end{split}\]These values are stored in the variables cs, cw, cr, b, c, zeta, xi, b1, etc. in the specified eos_had_rmf object. All of the numbers should be around 0.001 or 0.002.
For the scale \( M \), mnuc is used.
- Todo:
I may have ignored some signs in the above, which are unimportant for this application, but it would be good to fix them for posterity.
-
inline void naturalness_limits(double value, eos_had_rmf &re)¶
Provide the maximum values of the couplings assuming a limit on naturalness.
The limits for the couplings are function of the nucleon and meson masses, except for the limits on
b
,c
,zeta
, andxi
which are independent of the masses because of the way that these four couplings are defined.
The meson fields
-
double sigma¶
-
double omega¶
-
double rho¶
-
double fe_temp¶
Temperature for solving field equations at finite temperature.
-
bool guess_set¶
True if a guess for the fields has been given.
-
double ce_temp¶
Temperature storage for calc_temp_e()
-
int fix_saturation_fun(size_t nv, const ubvector &x, ubvector &y)¶
The function for fix_saturation()
-
int fix_saturation2_fun(size_t nv, const ubvector &x, ubvector &y, double fix_n0, double fix_eoa, double fix_comp, double fix_esym, double fix_msom)¶
The function for fix_saturation2()
-
virtual int zero_pressure(size_t nv, const ubvector &ex, ubvector &ey, o2scl::thermo &th)¶
Compute matter at zero pressure (for saturation())
-
virtual int calc_e_solve_fun(size_t nv, const ubvector &ex, ubvector &ey, o2scl::thermo &th)¶
The function for calc_e()
-
virtual int calc_temp_e_solve_fun(size_t nv, const ubvector &ex, ubvector &ey, o2scl::thermo &th)¶
The function for calc_temp_e()
-
int calc_cr(double sig, double ome, double nb)¶
Calculate the
cr
coupling givensig
andome
at the density ‘nb’.Used by fix_saturation().
Compute EOS
-
virtual int calc_e(fermion &ne, fermion &pr, thermo <h)¶
Equation of state as a function of density.
Initial guesses for the chemical potentials are taken from the user-given values. Initial guesses for the fields can be set by set_fields(), or default values will be used. After the call to calc_e(), the final values of the fields can be accessed through get_fields().
This is a little more robust than the standard version in the parent eos_had_base.
- Idea for Future:
Improve the operation of this function when the proton density is zero.
-
virtual int calc_p(fermion &ne, fermion &pr, thermo <h)¶
Equation of state as a function of chemical potential.
Solves for the field equations automatically.
- Idea for Future:
It may be possible to make the solver for the field equations more robust
-
virtual int calc_eq_p(fermion &neu, fermion &p, double sig, double ome, double rho, double &f1, double &f2, double &f3, thermo &th)¶
Equation of state and meson field equations as a function of chemical potentials.
This calculates the pressure and energy density as a function of \( \mu_n,\mu_p,\sigma,\omega,rho \) . When the field equations have been solved,
f1
,f2
, andf3
are all zero.The thermodynamic identity is satisfied even when the field equations are not solved.
- Idea for Future:
Probably best to have f1, f2, and f3 scaled in some sensible way, i.e. scaled to the fields?
-
virtual int calc_eq_temp_p(fermion &ne, fermion &pr, double temper, double sig, double ome, double rho, double &f1, double &f2, double &f3, thermo &th)¶
Equation of state and meson field equations as a function of chemical potentials at finite temperature.
Analogous to calc_eq_p() except at finite temperature.
-
virtual int calc_temp_p(fermion &ne, fermion &pr, double T, thermo <h)¶
Equation of state as a function of chemical potential.
Solves for the field equations automatically.
-
virtual int calc_temp_e(fermion &ne, fermion &pr, double T, thermo <h)¶
Equation of state as a function of densities at finite temperature.
Saturation properties
-
int fix_saturation(double guess_cs = 4.0, double guess_cw = 3.0, double guess_b = 0.001, double guess_c = -0.001)¶
Calculate cs, cw, cr, b, and c from the saturation properties.
Note that the meson masses and mnuc must be specified before calling this function. The neutron and proton masses must both be equal to mnuc, and the neutron and proton objects must have
inc_rest_mass=false
.This function does not give correct results when bool zm_mode is true.
guess_cs
,guess_cw
,guess_b
, andguess_c
are initial guesses forcs
,cw
,b
, andc
respectively.This function uses the solver sat_mroot .
- Todo:
Fix this for zm_mode=true
Ensure solver is more robust
-
int fix_saturation2(double guess_cs = 4.0, double guess_cw = 3.0, double guess_cr = 3.0, double guess_b = 0.001, double guess_c = -0.001)¶
Calculate cs, cw, cr, b, and c from the saturation properties.
-
virtual int saturation()¶
Calculate properties of nuclear matter at the saturation density.
This function first constructs an initial guess, increasing the chemical potentials if required to ensure the neutron and proton densities are finite, and then uses eos_had_rmf::sat_mroot to solve the field equations and ensure that the neutron and proton densities are equal and the pressure is zero. The quantities eos_had_base::n0, eos_had_base::eoa, and eos_had_base::msom can be computed directly, and the compressibility, the skewness, and the symmetry energy are computed using the functions fkprime_fields() and fesym_fields(). This function overrides the generic version in eos_had_base.
If verbose is greater than zero, then then this function reports details on the initial iterations to get the initial guess for the solver.
-
double fesym_fields(double sig, double ome, double nb)¶
Calculate symmetry energy assuming the field equations have already been solved.
This may only work at saturation density and may assume equal neutron and proton masses.
-
double fcomp_fields(double sig, double ome, double nb)¶
Calculate the compressibility assuming the field equations have already been solved.
This may only work at saturation density and may assume equal neutron and proton masses.
-
void fkprime_fields(double sig, double ome, double nb, double &k, double &kprime)¶
Calculate compressibilty and
kprime
assuming the field equations have already been solved.This may only work at saturation density and may assume equal neutron and proton masses.
- Todo:
This function, o2scl::eos_had_rmf::fkprime_fields() is currently untested.
Fields and field equations
-
int field_eqs(size_t nv, const ubvector &x, ubvector &y, o2scl::thermo &th)¶
A function for solving the field equations.
The values
x[0], x[1]
, andx[2]
should be set to \( \sigma, \omega \) , and \( \rho \) on input (in \( \mathrm{fm}^{-1} \) ) and on exit,y[0], y[1]
andy[2]
contain the field equations and are zero when the field equations have been solved.
-
int field_eqsT(size_t nv, const ubvector &x, ubvector &y, o2scl::thermo &th)¶
A function for solving the field equations at finite temperature.
The values
x[0], x[1]
, andx[2]
should be set to \( \sigma, \omega \) , and \( \rho \) on input (in \( \mathrm{fm}^{-1} \) ) and on exit,y[0], y[1]
andy[2]
contain the field equations and are zero when the field equations have been solved.
-
inline virtual int set_fields(double sig, double ome, double lrho)¶
Set a guess for the fields for the next call to calc_e(), calc_p(), or saturation()
-
inline int get_fields(double &sig, double &ome, double &lrho)¶
Return the most recent values of the meson fields.
This returns the most recent values of the meson fields set by a call to saturation(), calc_e(), or calc_p(fermion &, fermion &, thermo &).
-
inline virtual const char *type()¶
Return string denoting type (“eos_had_rmf”)
Public Functions
-
int check_derivs(double &dPds, double &dPdw, double &dPdr, fermion &ne, fermion &pr, double sig, double ome, double lrho)¶