Equation of State Sub-Library: Version 0.910
skyrme_eos.h
00001 /*
00002   -------------------------------------------------------------------
00003   
00004   Copyright (C) 2006-2012, Andrew W. Steiner
00005   
00006   This file is part of O2scl.
00007   
00008   O2scl is free software; you can redistribute it and/or modify
00009   it under the terms of the GNU General Public License as published by
00010   the Free Software Foundation; either version 3 of the License, or
00011   (at your option) any later version.
00012   
00013   O2scl is distributed in the hope that it will be useful,
00014   but WITHOUT ANY WARRANTY; without even the implied warranty of
00015   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016   GNU General Public License for more details.
00017   
00018   You should have received a copy of the GNU General Public License
00019   along with O2scl. If not, see <http://www.gnu.org/licenses/>.
00020 
00021   -------------------------------------------------------------------
00022 */
00023 #ifndef O2SCL_SKYRME_EOS_H
00024 #define O2SCL_SKYRME_EOS_H
00025 
00026 #include <iostream>
00027 #include <string>
00028 #include <cmath>
00029 #include <o2scl/constants.h>
00030 #include <o2scl/mroot.h>
00031 
00032 #include <o2scl/hadronic_eos.h>
00033 #include <o2scl/part.h>
00034 #include <o2scl/nonrel_fermion.h>
00035 
00036 #ifndef DOXYGENP
00037 namespace o2scl {
00038 #endif
00039 
00040   /** \brief Skyrme hadronic equation of state 
00041 
00042       Equation of state of nucleonic matter based on 
00043       the Skryme interaction from \ref Skyrme59 .
00044 
00045       \hline
00046       \b Background:
00047 
00048       The Hamiltonian is defined (using the notation of 
00049       \ref Steiner05b )
00050       \f[
00051       {\cal H} = 
00052       {\cal H}_{k1} +
00053       {\cal H}_{k2} +
00054       {\cal H}_{k3} +
00055       {\cal H}_{p1} +
00056       {\cal H}_{p2} +
00057       {\cal H}_{p3} +
00058       {\cal H}_{g1} +
00059       {\cal H}_{g2}
00060       \f]
00061       
00062       The kinetic terms are:
00063       \f[
00064       {\cal H}_{k1} = \frac{\tau_n}{2 m_n} +
00065       \frac{\tau_p}{2 m_p} 
00066       \f]
00067       \f[
00068       {\cal H}_{k2} =
00069       n \left(\tau_n + \tau_p \right) \left[ \frac{t_1}{4} 
00070       \left( 1 + \frac{x_1}{2} \right)
00071       + \frac{t_2}{4} \left( 1 + \frac{x_2}{2} \right) \right]
00072       \f]
00073       \f[
00074       {\cal H}_{k3} =
00075       \left( \tau_n n_n + \tau_p n_p \right) \left[ \frac{t_2}{4} 
00076       \left( \frac{1}{2} + x_2 \right)
00077       - \frac{t_1}{4} \left( \frac{1}{2} + x_1 \right) \right]
00078       \f]
00079       where \f$ \tau_i \f$ are defined
00080       
00081       The potential terms are:
00082       \f[
00083       {\cal H}_{p1} = 
00084       \frac{t_0}{2} 
00085       \left[ \left( 1 + \frac{x_0}{2} \right) n^2 - 
00086       \left( {\textstyle \frac{1}{2}} + x_0 \right) 
00087       \left( n_n^2 + n_p^2 \right) \right] 
00088       \f]
00089       \f[
00090       {\cal H}_{p2} = 
00091       \frac{a t_3}{6} \left[ \left( 1 + \frac{x_3}{2} \right) n^{\alpha} 
00092       n_n n_p + 2^{\alpha-2} \left(1 - x_3\right)
00093       \left(n_n^{\alpha+2} + n_p^{\alpha+2}\right) \right] 
00094       \f]
00095       \f[
00096       {\cal H}_{p3} = 
00097       \frac{b t_3}{12} \left[ \left(1 + \frac{x_3}{2} \right) n^{\alpha+2} -
00098       \left(\frac{1}{2} + x_3 \right) n^{\alpha} 
00099       \left( n_n^2+n_p^2 \right) \right]
00100       \f]
00101       
00102       The gradient terms are displayed here for completeness even though
00103       they are not computed in the code:
00104       \f[
00105       {\cal H}_{g1} = 
00106       \frac{3}{32} \left[ t_1 \left(1 - x_1 \right) - 
00107       t_2 \left(1 + x_2 \right) \right] \left[ \left( \nabla n_n\right)^2 + 
00108       \left( \nabla n_p \right)^2 \right] 
00109       \f]
00110       \f[
00111       {\cal H}_{g2} = 
00112       \frac{1}{8} \left[ 3 t_1 \left( 1 + 
00113       \frac{x_1}{2} \right) - t_2 \left(1 + \frac{x_2}{2} \right) \right] 
00114       \nabla n_n \nabla n_p
00115       \f]
00116 
00117       The values \f$ a=0, b=1 \f$ give the standard definition of the
00118       Skyrme Hamiltonian \ref Skyrme59, while \f$a=1, b=0\f$ contains
00119       the modifications suggested by \ref Onsi94.
00120 
00121       Also, couple useful definitions
00122       \f[
00123       t_3^{\prime} = \left(a + b\right) t_3 \, ,
00124       \f]
00125       \f[
00126       C = \frac{3 }{10 m} \left( \frac{3 \pi^2 }{2} \right)^{2/3}  \, ,
00127       \f]
00128       and
00129       \f[
00130       \beta = \frac{M}{2} \left[ \frac{1}{4} \left( 3 t_1 + 5 t_2 \right) \, .
00131       + t_2 x_2 \right] \\
00132       \f]
00133       
00134       \hline
00135       \b Units:
00136 
00137       Quantities which have units containing powers of energy
00138       are divided by \f$\hbar c\f$ to ensure all quantities are
00139       in units of \f$fm\f$. The \f$x_i\f$ and \f$\alpha\f$ are
00140       unitless, while the original units of the \f$t_i\f$ are:
00141       - \f$t_0\f$ - \f$\mathrm{MeV}\f$ \f$\mathrm{fm}^3\f$
00142       - \f$t_1\f$ - \f$\mathrm{MeV}\f$ \f$\mathrm{fm}^5\f$
00143       - \f$t_2\f$ - \f$\mathrm{MeV}\f$ \f$\mathrm{fm}^5\f$
00144       - \f$t_3\f$ - \f$\mathrm{MeV}\f$ \f$\mathrm{fm}^{3(1+\alpha)}\f$
00145       
00146       These are stored internally with units of:
00147       - \f$t_0\f$ - \f$\mathrm{fm}^2\f$
00148       - \f$t_1\f$ - \f$\mathrm{fm}^4\f$
00149       - \f$t_2\f$ - \f$\mathrm{fm}^4\f$
00150       - \f$t_3\f$ - \f$\mathrm{fm}^{2+3 \alpha}\f$
00151       
00152       The class skyrme_eos_io uses o2scl_const::hc_mev_fm for I/O so that
00153       all files contain the parameters in the original units.
00154       
00155       \hline
00156       \b Misc:
00157 
00158       The functions for the usual saturation properties are based 
00159       partly on \ref Brack85.
00160       
00161       Models are taken from the references: \ref Bartel79, \ref
00162       Beiner75, \ref Chabanat95, \ref Chabanat97, \ref Danielewicz08,
00163       \ref Dobaczewski94, \ref Dutta86, \ref Friedrich86, \ref Onsi94,
00164       \ref Reinhard95, and \ref Tondeur84, and \ref VanGiai81 .
00165       
00166       \htmlonly
00167       See Mathematica notebook at 
00168       <a href="skyrme_eos.nb">
00169       skyrme_eos.nb</a>, and
00170       <a href="skyrme_eos.ps">
00171       skyrme_eos.ps</a>.
00172       \endhtmlonly
00173       \latexonly
00174       See Mathematica notebook at 
00175       \begin{verbatim}
00176       doc/o2scl/extras/skyrme_eos.nb
00177       doc/o2scl/extras/skyrme_eos.ps
00178       \end{verbatim}
00179       \endlatexonly
00180 
00181       The variables \f$ \nu_n\f$ and \f$ \nu_p\f$ contain the
00182       expressions \f$ (-\mu_n+V_n)/T \f$ and \f$ (-\mu_p+V_p)/T \f$
00183       respectively, where \f$ V \f$ is the potential part of the
00184       single particle energy for particle i (i.e. the derivative of
00185       the Hamiltonian w.r.t. density while energy density held
00186       constant). Equivalently, \f$ \nu_n\f$ is just \f$ -k_{F_n}^2/ 2
00187       m^{*} \f$.
00188      
00189       \note The finite temperature code does not include attempt to
00190       include antiparticles and uses part::calc_density().
00191       
00192       \note Since this EOS uses the effective masses and chemical
00193       potentials in the fermion class, the values of
00194       part::non_interacting for neutrons and protons are set to false
00195       in many of the functions.
00196 
00197       \hline
00198 
00199       \todo
00200       - Make sure that this class properly handles particles for which 
00201       inc_rest_mass is true/false
00202       - What about the spin-orbit units?
00203       - Need to write a function that calculates saturation density?
00204       - Remove use of mnuc in calparfun()?
00205       - The compressibility could probably use some simplification
00206       - Make sure the finite-temperature part is properly tested
00207       - The testing code doesn't work if err_mode is 2, probably because
00208       of problems in load().
00209       - Document load() file format.
00210       - Update reference list.
00211 
00212       \future
00213       - There is some code duplication between calc_e() and calc_temp_e()
00214       which could be simplified.
00215       \hline
00216       
00217   */
00218   class skyrme_eos : public hadronic_eos_temp_eden {
00219   public:
00220 
00221     /// \name Basic Skyrme model parameters
00222     //@{
00223     double t0,t1,t2,t3,x0,x1,x2,x3,alpha,a,b;
00224     //@}
00225 
00226     /** \brief Spin-orbit splitting
00227 
00228         This is unused, but included for possible future use and
00229         present in the internally stored models.
00230     */
00231     double W0;
00232 
00233     /// \name Basic usage
00234     //@{
00235     /// Create a blank Skyrme EOS
00236     skyrme_eos();
00237 
00238     /// Destructor
00239     virtual ~skyrme_eos() {};
00240 
00241     /** \brief Equation of state as a function of densities
00242 
00243         \note Runs the zero temperature code if \c temper is less
00244         than or equal to zero.
00245      */
00246     virtual int calc_temp_e(fermion &ne, fermion &pr, double temper, 
00247                             thermo &th);
00248 
00249     /// Equation of state as a function of density.
00250     virtual int calc_e(fermion &ne, fermion &pr, thermo &lt);
00251     //@}
00252 
00253     /** \name Saturation properties
00254 
00255         These calculate the various saturation properties exactly from
00256         the parameters at any density. These routines often assume that 
00257         the neutron and proton masses are equal.
00258     */
00259     //@{
00260   
00261     /** \brief Calculate binding energy
00262       
00263         \f[
00264         \frac{E}{A} = C n_B^{2/3} \left( 1 + \beta n_B \right) + 
00265         \frac{3 t_0}{8} n_B + \frac{t_3^{\prime}}{16} n_B^{\alpha+1} 
00266         \f]
00267     */
00268     virtual double feoa(double nb);
00269   
00270     /** \brief Calculate effective mass
00271       
00272         \f[
00273         M^{*}/M = \left(1+ \beta n_B \right)^{-1} \\
00274         \f]
00275     */
00276     virtual double fmsom(double nb);
00277 
00278     /** \brief Calculate compressibility
00279 
00280         \f[
00281         K = 10 C n_B^{2/3} + \frac{27}{4} t_0 n_B + 40 C \beta n_B^{5/3} + 
00282         \frac{9 t_3^{\prime}}{16} 
00283         \alpha \left( \alpha+1 \right) n_B^{1 + \alpha} +
00284         \frac{9 t_3^{\prime}}{8} \left( \alpha+1 \right) n_B^{1 + \alpha}
00285         \f]
00286     */
00287     virtual double fcomp(double nb);
00288 
00289     /** \brief Calculate symmetry energy
00290 
00291         If pf=0.5, then the exact expression below is used.
00292         Otherwise, the method from class hadronic_eos is used.
00293 
00294         \f[
00295         E_{sym} = \frac{5}{9} C n^{2/3} + \frac{10 C m}{3}
00296         \left[ \frac{t_2}{6} \left(1 + \frac{5}{4} x_2 \right) - 
00297         \frac{1}{8} t_1 x_1 \right] n^{5/3} 
00298         - \frac{t_3^{\prime}}{24} 
00299         \left({\textstyle \frac{1}{2}} + x_3 \right) n^{1+\alpha} - 
00300         \frac{t_0}{4} \left( {\textstyle \frac{1}{2}} + x_0 \right) n 
00301         \f]
00302     */
00303     virtual double fesym(double nb, double alpha=0.0);
00304 
00305     /** \brief skewness
00306 
00307         \f[
00308         2 C n_B^{2/3} \left(9-5/M^{*}/M\right)+
00309         \frac{27 t_3^{\prime}}{16} n^{1+\alpha} \alpha 
00310         \left(\alpha^2-1\right)
00311         \f]
00312     */
00313     virtual double fkprime(double nb);
00314     //@}
00315 
00316     /** \brief Calculate \f$ t_0,t_1,t_2,t_3 \f$ and \f$ \alpha \f$ from 
00317         the saturation properties.
00318       
00319         In nuclear matter: 
00320       
00321         \f$ E_b=E_b(n_0,M^{*},t_0,t_3,\alpha) \f$ \n
00322         \f$ P=P(n_0,M^{*},t_0,t_3,\alpha) \f$ \n
00323         \f$ K=K(n_0,M^{*},t_3,\alpha) \f$ 
00324         (the \f$ t_0 \f$ dependence vanishes) \n
00325         \f$ M^{*}=M^{*}(n_0,t_1,t_2,x_2) \f$ 
00326         (the \f$ x_1 \f$ dependence cancels), \n
00327         \f$ E_{sym}=E_{sym}(x_0,x_1,x_2,x_3,t_0,t_1,t_2,t_3,\alpha) \f$
00328       
00329         To fix the couplings from the saturation properties, we take
00330         \f$ n_0, M^{*}, E_b, K \f$ as inputs, and we can fix \f$
00331         t_0,t_3,\alpha \f$ from the first three relations, then use
00332         \f$ M^{*}, E_b \f$ to fix \f$ t_2 \f$ and \f$ t_1 \f$.  The
00333         separation into two solution steps should make for better
00334         convergence. All of the x's are free parameters and should be
00335         set before the function call.
00336       
00337         The arguments \c gt0, \c gt3, \c galpha, \c gt1, and \c gt2
00338         are used as initial guesses for skyme_eos::t0, skyrme_eos::t3,
00339         skyrme_eos::alpha, skyrme_eos::t1, and skyrme_eos::t2
00340         respectively.
00341       
00342         \todo Does this work for both 'a' and 'b' non-zero?
00343       
00344         \todo Compare to similar formulae from \ref Margueron02
00345     */
00346 
00347     int calpar(double gt0=-10.0, double gt3=70.0, double galpha=0.2,
00348                double gt1=2.0, double gt2=-1.0);
00349 
00350     // Unfinished.
00351     /* \brief 
00352         From \ref Margueron02
00353     */
00354     //  int calpar_new(double m);
00355 
00356     /** \brief Use hadronic_eos methods for saturation properties
00357       
00358         This can be set to true to check the difference between
00359         the exact expressions and the numerical values from
00360         class hadronic_eos.
00361     */
00362     bool parent_method;
00363   
00364     /** \brief Check the Landau parameters for instabilities
00365 
00366         This returns zero if there are no instabilities.
00367      */
00368     int check_landau(double nb, double m);
00369 
00370     /** \brief Calculate the Landau parameters for nuclear matter
00371 
00372         Given \c n0 and \c m, this calculates the Landau parameters in
00373         nuclear matter as given in \ref Margueron02
00374      
00375         \todo This needs to be checked.
00376         
00377         (Checked once on 11/05/03)
00378     */
00379     int landau_nuclear(double n0, double m,
00380                        double &f0, double &g0, double &f0p,
00381                        double &g0p, double &f1, double &g1,
00382                        double &f1p, double &g1p);
00383 
00384     /** \brief Calculate the Landau parameters for neutron matter
00385             
00386         Given 'n0' and 'm', this calculates the Landau parameters in
00387         neutron matter as given in \ref Margueron02
00388         
00389         \todo This needs to be checked
00390         
00391         (Checked once on 11/05/03)
00392     */
00393     int landau_neutron(double n0, double m, double &f0, double &g0, 
00394                        double &f1, double &g1);
00395 
00396     /// Return string denoting type ("skyrme_eos")
00397     virtual const char *type() { return "skyrme_eos"; }
00398 
00399     /// Desc
00400     bool mu_at_zero_density;
00401 
00402 #ifndef DOXYGENP
00403     
00404   protected:
00405 
00406     /// Desc
00407     nonrel_fermion nrf;
00408     
00409     /// \name Functions and parameters for calpar()
00410     //@{
00411     int calparfun(size_t nv, const ovector_base &x, ovector_base &y);
00412     int calparfun2(size_t nv, const ovector_base &x, ovector_base &y);
00413     double fixn0, fixeoa, fixesym, fixcomp, fixmsom;
00414     //@}
00415 
00416 #endif
00417 
00418   };
00419 
00420 #ifndef DOXYGENP
00421 }
00422 #endif
00423 
00424 #endif
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Friends

Documentation generated with Doxygen. Provided under the GNU Free Documentation License (see License Information).

Get Object-oriented Scientific Computing
Lib at SourceForge.net. Fast, secure and Free Open Source software
downloads.