skyrme_eos.h

00001 /*
00002   -------------------------------------------------------------------
00003   
00004   Copyright (C) 2006, 2007, 2008, 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 #include <o2scl/hadronic_eos.h>
00032 #include <o2scl/part.h>
00033 #include <o2scl/collection.h>
00034 #include <o2scl/nonrel_fermion.h>
00035 
00036 #ifndef DOXYGENP
00037 namespace o2scl {
00038 #endif
00039 
00040   /** 
00041       \brief Skyrme hadronic equation of state at zero temperature
00042 
00043       Quantities which have units containing powers of energy
00044       are divided by \f$\hbar c\f$ to ensure all quantities are
00045       in units of \f$fm\f$. The \f$x_i\f$ and \f$\alpha\f$ are
00046       unitless, while the original units of the \f$t_i\f$ are:
00047       - \f$t_0\f$ - \f$\mathrm{MeV}\f$ \f$\mathrm{fm}^3\f$
00048       - \f$t_1\f$ - \f$\mathrm{MeV}\f$ \f$\mathrm{fm}^5\f$
00049       - \f$t_2\f$ - \f$\mathrm{MeV}\f$ \f$\mathrm{fm}^5\f$
00050       - \f$t_3\f$ - \f$\mathrm{MeV}\f$ \f$\mathrm{fm}^{3(1+\alpha)}\f$
00051       
00052       These are stored internally with units of:
00053       - \f$t_0\f$ - \f$\mathrm{fm}^2\f$
00054       - \f$t_1\f$ - \f$\mathrm{fm}^4\f$
00055       - \f$t_2\f$ - \f$\mathrm{fm}^4\f$
00056       - \f$t_3\f$ - \f$\mathrm{fm}^{2+3 \alpha}\f$
00057       
00058       The class skyrme_eos_io uses o2scl_const::hc_mev_fm for I/O so that
00059       all files contain the parameters in the original units.
00060       
00061       The chemical potentials do include the rest mass energy.
00062       
00063       n.ed and p.ed contain tau_n and tau_p which are in fm^{-5}, not
00064       fm^{-4}.
00065       
00066       The functions for the usual saturation properties are based 
00067       partly on \ref Brack85.
00068       
00069       The Hamiltonian is defined below. \f$a=0,b=1\f$ gives the standard
00070       definition of the Skyrme Hamiltonian (ref?), while \f$a=1,b=0\f$
00071       contains the modifications suggested by \ref Osni94.
00072       Check also \ref Dutta86.
00073       
00074       \f[
00075       {\cal H} = 
00076       {\cal H}_{k1} +
00077       {\cal H}_{k2} +
00078       {\cal H}_{k3} +
00079       {\cal H}_{p1} +
00080       {\cal H}_{p2} +
00081       {\cal H}_{p3} +
00082       {\cal H}_{g1} +
00083       {\cal H}_{g2}
00084       \f]
00085       
00086       The kinetic terms are:
00087       
00088       \f[
00089       {\cal H}_{k1} = \frac{\tau_n}{2 m_n} +
00090       \frac{\tau_p}{2 m_p} 
00091       \f]
00092       
00093       \f[
00094       {\cal H}_{k2} =
00095       n \left(\tau_n + \tau_p \right) \left[ \frac{t_1}{4} 
00096       \left( 1 + \frac{x_1}{2} \right)
00097       + \frac{t_2}{4} \left( 1 + \frac{x_2}{2} \right) \right]
00098       \f]
00099       
00100       \f[
00101       {\cal H}_{k3} =
00102       \left( \tau_n n_n + \tau_p n_p \right) \left[ \frac{t_2}{4} 
00103       \left( \frac{1}{2} + x_2 \right)
00104       - \frac{t_1}{4} \left( \frac{1}{2} + x_1 \right) \right]
00105       \f]
00106       
00107       The potential terms are:
00108       
00109       \f[
00110       {\cal H}_{p1} = 
00111       \frac{t_0}{2} 
00112       \left[ \left( 1 + \frac{x_0}{2} \right) n^2 - 
00113       \left( {\textstyle \frac{1}{2}} + x_0 \right) 
00114       \left( n_n^2 + n_p^2 \right) \right] 
00115       \f]
00116       
00117       \f[
00118       {\cal H}_{p2} = 
00119       \frac{a t_3}{6} \left[ \left( 1 + \frac{x_3}{2} \right) n^{\alpha} 
00120       n_n n_p + 2^{\alpha-2} \left(1 - x_3\right)
00121       \left(n_n^{\alpha+2} + n_p^{\alpha+2}\right) \right] 
00122       \f]
00123       
00124       \f[
00125       {\cal H}_{p3} = 
00126       \frac{b t_3}{12} \left[ \left(1 + \frac{x_3}{2} \right) n^{\alpha+2} -
00127       \left(\frac{1}{2} + x_3 \right) n^{\alpha} 
00128       \left( n_n^2+n_p^2 \right) \right]
00129       \f]
00130       
00131       The gradient terms are displayed here for completeness even though
00132       they are not computed in the code:
00133       
00134       \f[
00135       {\cal H}_{g1} = 
00136       \frac{3}{32} \left[ t_1 \left(1 - x_1 \right) - 
00137       t_2 \left(1 + x_2 \right) \right] \left[ \left( \nabla n_n\right)^2 + 
00138       \left( \nabla n_p \right)^2 \right] 
00139       \f]
00140       
00141       \f[
00142       {\cal H}_{g2} = 
00143       \frac{1}{8} \left[ 3 t_1 \left( 1 + 
00144       \frac{x_1}{2} \right) - t_2 \left(1 + \frac{x_2}{2} \right) \right] 
00145       \nabla n_n \nabla n_p
00146       \f]
00147 
00148       A couple useful definitions:
00149       
00150       \f[
00151       t_3^{\prime} = \left(a + b\right) t_3
00152       \f]
00153       
00154       \f[
00155       C = \frac{3 }{10 m} \left( \frac{3 \pi^2 }{2} \right)^{2/3} 
00156       \f]
00157       
00158       \f[
00159       \beta = \frac{M}{2} \left[ \frac{1}{4} \left( 3 t_1 + 5 t_2 \right)
00160       + t_2 x_2 \right] \\
00161       \f]
00162       
00163       Models are taken from the references: \ref Friedrich86, 
00164       \ref Dutta86, \ref VanGiai81, \ref Chabanat95, \ref Chabanat97, 
00165       \ref Beiner75, \ref Reinhard95, \ref Bartel79, \ref Dobaczewski94, 
00166       \ref Osni94, \ref Tondeur84 and others.
00167       
00168       \htmlonly
00169       See Mathematica notebook at 
00170       <a href="skyrme_eos.nb">
00171       skyrme_eos.nb</a>, and
00172       <a href="skyrme_eos.ps">
00173       skyrme_eos.ps</a>.
00174       \endhtmlonly
00175       \latexonly
00176       See Mathematica notebook at 
00177       \begin{verbatim}
00178       doc/o2scl/extras/skyrme_eos.nb
00179       doc/o2scl/extras/skyrme_eos.ps
00180       \end{verbatim}
00181       \endlatexonly
00182 
00183       <b>Finite temperature documentation</b>
00184 
00185       The finite temperature extension is performed using the method
00186       \ref Prakash97 (see also the Windsurfing the Fermi Sea
00187       proceedings by Prakash).
00188 
00189       Returned chemical potentials include the rest mass, and energy 
00190       densities include the rest mass energy density.
00191 
00192       The variables n.nu and p.nu contain the expressions (-mu_n+V_n)/temper
00193       and (-mu_p+V_p)/temper respectively, where V is the potential part
00194       of the single particle energy for particle i (i.e. the derivative
00195       of the Hamiltonian wrt density while energy density held constant).
00196       Equivalently, n.nu is just -n.kf^2/2/mstar.
00197      
00198       For y>4 we use a non-degenerate expansion, and for y<-40 we
00199       use a Sommerfeld expansion. For y>50 the code fails, but this is well
00200       outside the regime of applicability of this model.
00201      
00202       Runs the zero temperature code if temper<=0.0.
00203 
00204       The finite temperature code does not include attempt to include
00205       antiparticles and uses part::calc_density().
00206       
00207       \note Since this EOS uses the effective masses and chemical
00208       potentials in the fermion class, the values of
00209       part::non_interacting for neutrons and protons are set to false
00210       in many of the functions.
00211 
00212       <b>Todos</b>
00213 
00214       \todo
00215       - Make sure that this class properly handles particles for which 
00216       inc_rest_mass is true/false
00217       - What about the spin-orbit units?
00218       - Need to write a function that calculates saturation density?
00219       - Remove use of mnuc in calparfun()?
00220       - The compressibility could probably use some simplification
00221       - Make sure the finite-temperature part is properly tested
00222       
00223   */
00224   class skyrme_eos : public hadronic_eos {
00225   public:
00226 
00227     double t0,t1,t2,t3,x0,x1,x2,x3,alpha,a,b;
00228 
00229     /** 
00230         \brief Spin-orbit splitting
00231 
00232         This is unused, but included for possible future use and
00233         present in the internally stored models.
00234     */
00235     double W0;
00236 
00237     skyrme_eos();
00238 
00239     /** 
00240         \brief Load the model named 'model'
00241 
00242         See comments under skyrme_eos::load().
00243     */
00244     skyrme_eos(std::string model);
00245 
00246     virtual ~skyrme_eos() {};
00247 
00248     /// Equation of state as a function of densities
00249     virtual int calc_temp_e(fermion &ne, fermion &pr, const double temper, 
00250                             thermo &th);
00251 
00252     /// Equation of state as a function of density.
00253     virtual int calc_e(fermion &ne, fermion &pr, thermo &lt);
00254 
00255     /** 
00256         \name Saturation properties
00257 
00258         These calculate the various saturation properties exactly from
00259         the parameters at any density. These routines often assume that 
00260         the neutron and proton masses are equal.
00261     */
00262     //@{
00263   
00264     /** 
00265         \brief Calculate binding energy
00266       
00267         \f[
00268         \frac{E}{A} = C n_B^{2/3} \left( 1 + \beta n_B \right) + 
00269         \frac{3 t_0}{8} n_B + \frac{t_3^{\prime}}{16} n_B^{\alpha+1} 
00270         \f]
00271     */
00272     virtual double feoa(double nb);
00273   
00274     /** 
00275         \brief Calculate effective mass
00276       
00277         \f[
00278         M^{*}/M = \left(1+ \beta n_B \right)^{-1} \\
00279         \f]
00280     */
00281     virtual double fmsom(double nb);
00282 
00283     /** 
00284         \brief Calculate compressibility
00285 
00286         \f[
00287         K = 10 C n_B^{2/3} + \frac{27}{4} t_0 n_B + 40 C \beta n_B^{5/3} + 
00288         \frac{9 t_3^{\prime}}{16} 
00289         \alpha \left( \alpha+1 \right) n_B^{1 + \alpha} +
00290         \frac{9 t_3^{\prime}}{8} \left( \alpha+1 \right) n_B^{1 + \alpha}
00291         \f]
00292     */
00293     virtual double fcomp(double nb);
00294 
00295     /** 
00296         \brief Calculate symmetry energy
00297 
00298         If pf=0.5, then the exact expression below is used.
00299         Otherwise, the method from class hadronic_eos is used.
00300 
00301         \f[
00302         E_{sym} = \frac{5}{9} C n^{2/3} + \frac{10 C m}{3}
00303         \left[ \frac{t_2}{6} \left(1 + \frac{5}{4} x_2 \right) - 
00304         \frac{1}{8} t_1 x_1 \right] n^{5/3} 
00305         - \frac{t_3^{\prime}}{24} 
00306         \left({\textstyle \frac{1}{2}} + x_3 \right) n^{1+\alpha} - 
00307         \frac{t_0}{4} \left( {\textstyle \frac{1}{2}} + x_0 \right) n 
00308         \f]
00309     */
00310     virtual double fesym(const double nb, const double pf=0.5);
00311 
00312     /** 
00313         \brief skewness
00314 
00315         \f[
00316         2 C n_B^{2/3} \left(9-5/M^{*}/M\right)+
00317         \frac{27 t_3^{\prime}}{16} n^{1+\alpha} \alpha 
00318         \left(\alpha^2-1\right)
00319         \f]
00320     */
00321     virtual double fkprime(double nb);
00322     //@}
00323 
00324     /** \brief Calculate \f$ t_0,t_1,t_2,t_3 \f$ and \f$ \alpha \f$ from 
00325         the saturation properties.
00326       
00327         In nuclear matter: 
00328       
00329         \f$ E_b=E_b(n_0,M^{*},t_0,t_3,\alpha) \f$ \n
00330         \f$ P=P(n_0,M^{*},t_0,t_3,\alpha) \f$ \n
00331         \f$ K=K(n_0,M^{*},t_3,\alpha) \f$ 
00332         (the \f$ t_0 \f$ dependence vanishes) \n
00333         \f$ M^{*}=M^{*}(n_0,t_1,t_2,x_2) \f$ 
00334         (the \f$ x_1 \f$ dependence cancels), \n
00335         \f$ E_{sym}=E_{sym}(x_0,x_1,x_2,x_3,t_0,t_1,t_2,t_3,\alpha) \f$
00336       
00337         To fix the couplings from the saturation properties, we take
00338         \f$ n_0, M^{*}, E_b, K \f$ as inputs, and we can fix \f$
00339         t_0,t_3,\alpha \f$ from the first three relations, then use
00340         \f$ M^{*}, E_b \f$ to fix \f$ t_2 \f$ and \f$ t_1 \f$.  The
00341         separation into two solution steps should make for better
00342         convergence. All of the x's are free parameters and should be
00343         set before the function call.
00344       
00345         The arguments \c gt0, \c gt3, \c galpha, \c gt1, and \c gt2
00346         are used as initial guesses for ::t0, ::t3, ::alpha, ::t1, and
00347         ::t2 respectively.
00348       
00349         \todo Does this work for both 'a' and 'b' non-zero?
00350       
00351         \todo Compare to similar formulae from \ref Margueron02
00352     */
00353 
00354     int calpar(double gt0=-10.0, double gt3=70.0, double galpha=0.2,
00355                double gt1=2.0, double gt2=-1.0);
00356 
00357     // Unfinished.
00358     /* \brief 
00359         From \ref Margueron02
00360     */
00361     //  int calpar_new(double m);
00362 
00363     /** 
00364         \brief Load parameters from model 'model'
00365 
00366         Presently accepted values from file skdata/model_list:
00367         \include skdata/model_list
00368         
00369         If \c external is true, then model is the filename
00370         (relative to the current directory) of the file
00371         containing the model parameters
00372     */
00373     int load(std::string model, bool external=false);
00374 
00375     /** 
00376         \brief Use hadronic_eos methods for saturation properties
00377       
00378         This can be set to true to check the difference between
00379         the exact expressions and the numerical values from
00380         class hadronic_eos.
00381     */
00382     bool parent_method;
00383   
00384     /** 
00385         \brief Check the Landau parameters for instabilities
00386 
00387         This returns zero if there are no instabilities.
00388      */
00389     int check_landau(double nb, double m);
00390 
00391     /** 
00392         \brief Calculate the Landau parameters for nuclear matter
00393 
00394         Given \c n0 and \c m, this calculates the Landau parameters in
00395         nuclear matter as given in \ref Margueron02
00396      
00397         \todo This needs to be checked.
00398         
00399         (Checked once on 11/05/03)
00400     */
00401     int landau_nuclear(double n0, double m,
00402                        double &f0, double &g0, double &f0p,
00403                        double &g0p, double &f1, double &g1,
00404                        double &f1p, double &g1p);
00405 
00406     /** 
00407         \brief Calculate the Landau parameters for neutron matter
00408     
00409         Given 'n0' and 'm', this calculates the Landau parameters in
00410         neutron matter as given in \ref Margueron02
00411         
00412         \todo This needs to be checked
00413         
00414         (Checked once on 11/05/03)
00415     */
00416     int landau_neutron(double n0, double m, double &f0, double &g0, 
00417                        double &f1, double &g1);
00418 
00419     /// Default nonrelativistic neutron
00420     nonrel_fermion def_nr_neutron;
00421 
00422     /// Default nonrelativistic proton
00423     nonrel_fermion def_nr_proton;
00424 
00425     /// Return string denoting type ("skyrme_eos")
00426     virtual const char *type() { return "skyrme_eos"; }
00427 
00428 #ifndef DOXYGENP
00429     
00430   protected:
00431     
00432     /// \name Functions and parameters for calpar()
00433     //@{
00434     int calparfun(size_t nv, const ovector_view &x, ovector_view &y, 
00435                   void *&vp);
00436     int calparfun2(size_t nv, const ovector_view &x, ovector_view &y, 
00437                    void *&vp);
00438     double fixn0, fixeoa, fixesym, fixcomp, fixmsom;
00439     //@}
00440 
00441 #endif
00442 
00443   };
00444 
00445   template<> int io_tlate<skyrme_eos>::input
00446     (cinput *co, in_file_format *ins, skyrme_eos *sk);
00447   template<> int io_tlate<skyrme_eos>::output
00448     (coutput *co, out_file_format *outs, skyrme_eos *sk);
00449   template<> const char *io_tlate<skyrme_eos>::type();
00450 
00451   typedef io_tlate<skyrme_eos> skyrme_eos_io_type;
00452 
00453 #ifndef DOXYGENP
00454 }
00455 #endif
00456 
00457 #endif

Documentation generated with Doxygen and provided under the GNU Free Documentation License. See License Information for details.

Project hosting provided by SourceForge.net Logo, O2scl Sourceforge Project Page