Equation of State Sub-Library: Version 0.910
ldrop_mass.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 LDROP_MASS_H
00024 #define LDROP_MASS_H
00025 
00026 #include <cmath>
00027 #include <string>
00028 #include <map>
00029 #include <o2scl/nucleus.h>
00030 #include <o2scl/nuclear_mass.h>
00031 #include <o2scl/constants.h>
00032 #include <o2scl/hadronic_eos.h>
00033 #include <o2scl/rmf_eos.h>
00034 #include <o2scl/eff_fermion.h>
00035 #include <o2scl/gsl_inte_qagiu.h>
00036 
00037 #ifndef DOXYGENP
00038 namespace o2scl {
00039 #endif
00040 
00041   /** \brief Compute the RMS radius of a Fermi-Dirac density distribution
00042       with fixed diffusiveness
00043       
00044       This class computes the RMS radius given either the central density
00045       or the radius specified in the Fermi function. This class assumes
00046       the density distribution function is of the form
00047       \f[
00048       N = 4 \pi \rho_0 \int r^2~dr~\left\{1+\exp
00049       \left[\left(r-R_{\mathrm{fermi}}\right)\right]\right\}^{-1}
00050       \f]
00051       where \f$ N \f$ is the total number of particles, and 
00052       \f$ \rho_0 \f$ is the central density.
00053       
00054       The radius assuming constant density,
00055       \f[
00056       R_{\mathrm{cd}} = \left(\frac{3 N}{4 \pi \rho_0}\right)^3 \, ,
00057       \f]
00058       is also given.
00059   */
00060   class rms_radius {
00061 
00062   protected:
00063 
00064     /// The central denstiy
00065     double urho0;
00066     /// The diffusiveness
00067     double ud;
00068     /** \brief Store the user-specified value of the radius in the
00069         Fermi distribution
00070         
00071         This is used in the integrands \ref iand() and \ref iand2().
00072      */
00073     double uRfermi;
00074     /// The total number of particles
00075     double uN;
00076     /// Blank parameter
00077     int pa;
00078 
00079     /// The integrator
00080     gsl_inte_qagiu<funct> it;
00081     /// The solver
00082     cern_mroot_root<funct> cr;
00083     
00084     /// The function \f$ 4 \pi r^4 \rho(r) \f$
00085     double iand(double r);
00086 
00087     /// The function \f$ 4 \pi r^2 \rho(r) \f$
00088     double iand2(double r);
00089 
00090     /// The function to fix the total number of particles
00091     double solve(double x);
00092 
00093   public:
00094 
00095     rms_radius();
00096     
00097     /** \brief Compute the RMS radius from the central density
00098 
00099         Computes the RMS radius \c Rrms from the central density \c
00100         rho0, the number of particles \c N, and the diffusiveness \c
00101         d.  This function also computes the radius in the Fermi
00102         distribution function, \c Rfermi and the radius assuming
00103         constant density, \c Rcd.
00104      */
00105     int eval_rms_rho(double rho0, double N, double d,
00106                      double &Rcd, double &Rfermi, double &Rrms);
00107     
00108     /** \brief Compute the RMS radius from the Fermi distribution radius
00109 
00110         Computes the RMS radius \c Rrms from the radius \c Rfermi in
00111         the Fermi distribution assuming a total number of particles \c
00112         N, a diffusiveness paramter \c d. This function also produces
00113         the central density \c rho0, and the radius assuming constant
00114         density, \c Rcd.
00115      */
00116     int eval_rms_rsq(double Rfermi, double N, double d,
00117                      double &rho0, double &Rcd, double &Rrms);
00118 
00119   };
00120 
00121   /** \brief Simple liquid drop mass formula
00122       
00123       Includes bulk \part plus surface and Coulomb (no pairing)
00124       without neutron skin and without any isospin contribution
00125       to the surface energy. 
00126 
00127       The NL4 EOS is loaded by default.
00128       
00129       \warning This class sets part::inc_rest_mass to true 
00130       for the particle objects specified in set_n_and_p().
00131 
00132       \hline
00133 
00134       <b>Central densities</b>
00135 
00136       Given a saturation density, \f$ n_0 \f$ and a transition
00137       density, \f$ n_t \f$, we set \f$ I = 1 - 2 Z/A \f$, and then
00138       assume \f$ \delta = I \f$. We further assume that the
00139       isospin-asymmetric saturation density \f$ n_L \f$ is
00140       \f[
00141       n_L = n_0 + n_1 \delta^2
00142       \f]
00143       and then we can compute \f$ n_{p} = (1 - \delta)/2 n_L \f$ and
00144       \f$ n_{n} = (1 + \delta)/2 n_L \f$ .
00145 
00146       Note that \f$ \delta = I \f$ implies no neutron skin. A neutron
00147       skin occurs when \f$ \delta < I \f$, and \f$ \delta = 0 \f$
00148       implies a "maximum skin size" which is occurs when no extra
00149       neutrons are in center and all extra neutrons are located in the
00150       skin, i.e. \f$ N_{\mathrm{skin}} = N-Z \f$.
00151 
00152       <b>Nuclear radii</b>
00153 
00154       The neutron and proton radii are determined from the 
00155       central densities with
00156       \f{eqnarray*}
00157       R_n &=& \left( \frac{3 N}{4 \pi n_n} \right)^{1/3} \nonumber \\
00158       R_n &=& \left( \frac{3 Z}{4 \pi n_p} \right)^{1/3} 
00159       \f}
00160 
00161       <b>Bulk energy contribution</b>
00162       
00163       The bulk binding energy contribution ( \f$ \sim -16 \f$
00164       MeV per nucleon) and the symmetry energy are computing using the
00165       hadronic EOS (either \ref def_had_eos or the EOS specified in
00166       the most recent call to set_hadronic_eos_temp() ). The bulk
00167       energy per baryon is
00168       \f[
00169       E_{\mathrm{bulk}}/A = \frac{\hbar c}{n_{L} }
00170       \left[\varepsilon(n_n,n_p) - n_n m_n - n_p m_p \right]
00171       \f]
00172 
00173       <b>Surface energy contribution</b>
00174 
00175       The surface energy density is (\ref Ravenhall83)
00176       \f[
00177       \varepsilon = \frac{\chi d \sigma}{R}
00178       \f]
00179       where \f$ \sigma \f$ is the surface tension. The factor \f$ \chi
00180       \f$ is typically taken care of by the caller, so we ignore it
00181       for now. To compute the surface energy per baryon, we divide by
00182       the baryon density, \f$ n_n + n_p \f$. We can rewrite this
00183       \f[
00184       E_{\mathrm{surf}} = \frac{3 \sigma}{n_n + n_p} 
00185       \left[ \frac{3 A}{ 4 (n_n+n_p) \pi}
00186       \right]^{-1/3}
00187       \f]
00188       or
00189       \f[
00190       E_{\mathrm{surf}} = \frac{\sigma}{n_L}
00191       \left(\frac{36 \pi n_L}{A} \right)^{1/3}
00192       \f]
00193       where the surface tension \f$ \sigma \f$ (in MeV) is given in 
00194       \ref surften. 
00195 
00196       Taking a typical value, \f$ \sigma =1.1~\mathrm{MeV} \f$ and 
00197       \f$ n_L = 0.16~\mathrm{fm}^{-3} \f$, gives the standard result,
00198       \f$ E_{\mathrm{surf}}/A = 18~\mathrm{MeV}~A^{-1/3} \f$. 
00199 
00200       <b>Coulomb energy contribution</b>
00201 
00202       The Coulomb energy density (\ref Ravenhall83) is
00203       \f[
00204       \varepsilon_{\mathrm{Coul}} = \frac{4 \pi}{5} n_p^2 e^2 R_p^2
00205       \f]
00206       The energy per baryon is
00207       \f[
00208       E_{\mathrm{Coul}}/A = \frac{4 \pi}{5 n_L} n_p^2 e^2 R_p^2 
00209       \f]
00210       This is the expression used in the code, except for a prefactor
00211       \ref coul_coeff which is a fit parameter and should be close to
00212       unity.
00213 
00214       Assuming \f$ R_p = R \f$
00215       and \f$ Z = \frac{4 \pi}{3} R^3 n_p \f$
00216       and \f$ R = \left[ 3 A / (4 \pi n_L) \right]^{1/3} \f$
00217       gives
00218       \f[
00219       E_{\mathrm{Coul}}/A = \frac{6^{2/3}}{5} 
00220        \pi^{1/3} e^2 n_L^{1/3} \frac{Z^2}{A^{4/3}} 
00221       \f]
00222       and taking \f$ n_L = 0.16~\mathrm{fm}^{-3} \f$ and 
00223       \f$ e^2 = \hbar c/137 \f$ gives the standard result
00224       \f[
00225       E_{\mathrm{Coul}}/A = 0.76~\mathrm{MeV}~Z^2 A^{-4/3}
00226       \f]
00227 
00228       \hline
00229 
00230       <b>References</b>
00231 
00232       Designed for \ref Steiner08 based on \ref Lattimer85 and
00233       \ref Lattimer91 .
00234 
00235       \hline
00236   */
00237   class ldrop_mass : public nuclear_mass_fit {
00238 
00239   public:
00240     
00241     ldrop_mass();
00242 
00243     /// \name Input parameters
00244     //@{ 
00245     /// Density asymmetry (default 0)
00246     double n1;
00247     
00248     /** \brief Saturation density ( The default is \f$ 0.16
00249         \mathrm{fm}^{-3} \f$)
00250     */
00251     double n0;
00252     
00253     /// Surface tension in MeV (default 1.1 MeV)
00254     double surften;
00255     
00256     /// Coulomb coefficient (default 1.0)
00257     double coul_coeff;
00258     //@}    
00259 
00260     /// \name Output quantities
00261     //@{ 
00262     /// Internal average neutron density
00263     double nn;
00264     
00265     /// Internal average proton density
00266     double np;
00267 
00268     /// Neutron radius
00269     double Rn;
00270 
00271     /// Proton radius
00272     double Rp;
00273 
00274     /// Bulk \part of energy
00275     double bulk;
00276 
00277     /// Surface \part of energy
00278     double surf;
00279 
00280     /// Coulomb \part of energy
00281     double coul;
00282     //@}
00283     
00284     /** \brief Given \c Z and \c N, return the mass excess in MeV
00285  
00286         \comment
00287         We don't need to implement mass_excess() for integers because
00288         that's done in the parent nuclear_mass_cont. 
00289         \endcomment
00290     */
00291     virtual double mass_excess_d(double Z, double N);
00292 
00293     /** \brief Given \c Z and \c N, return the binding energy in MeV
00294 
00295         This function is currently independent of \c npout, \c nnout,
00296         and \c chi.
00297     */
00298     virtual double drip_binding_energy_d(double Z, double N,
00299                                          double npout, double nnout, 
00300                                          double chi);
00301 
00302     /// \name EOS and particle parameters
00303     //@{
00304     /// Change the base hadronic EOS
00305     int set_hadronic_eos_temp(hadronic_eos_temp &uhe) {
00306       heos=&uhe;
00307       return 0;
00308     }
00309 
00310     /// The default hadronic EOS
00311     rmf_eos def_had_eos;
00312 
00313     /// Change neutron and proton objects
00314     void set_n_and_p(fermion &un, fermion &up) {
00315       n=&un;
00316       p=&up;
00317       return;
00318     }
00319 
00320     /// Default neutron
00321     fermion def_neutron;
00322 
00323     /// Default proton
00324     fermion def_proton;
00325     //@}
00326 
00327     /// \name Fitting functions
00328     //@{
00329     /// Fix parameters from an array for fitting
00330     virtual int fit_fun(size_t nv, const ovector_base &x);
00331     
00332     /// Fill array with guess from present values for fitting
00333     virtual int guess_fun(size_t nv, ovector_base &x);
00334     //@}
00335     
00336     /// Return the type, \c "ldrop_mass".
00337     virtual const char *type() { return "ldrop_mass"; }
00338       
00339     /// Energy and pressure
00340     thermo th;
00341 
00342 #ifndef DOXYGEN_INTERNAL
00343 
00344   protected:
00345 
00346     /// Desc
00347     eff_fermion eff;
00348     /// Pointer to neutron 
00349     fermion *n;
00350     /// Pointer to proton
00351     fermion *p;
00352     /// The base EOS for bulk matter
00353     hadronic_eos_temp *heos;
00354 
00355 #endif
00356     
00357   };
00358 
00359   /** \brief More advanced liquid drop model
00360 
00361       In addition to the physics in \ref ldrop_mass, this includes
00362       corrections for
00363       - finite temperature
00364       - neutron skin
00365       - an isospin-dependent surface energy
00366       - decrease in the Coulomb energy from external protons
00367 
00368       \note The input parameter T should be given in units of inverse
00369       Fermis -- this is a bit unusual since the binding energy is
00370       returned in MeV, but we keep it for now.
00371 
00372       <b>Bulk energy</b>
00373 
00374       The central densities and radii, \f$ n_n, n_p, R_n, R_p \f$
00375       are all determined in the same way as \ref ldrop_mass, 
00376       except that now \f$ \delta \equiv I \zeta \f$, where
00377       \f$ \zeta \f$ is stored in \ref doi . Note that this
00378       means \f$ N > Z~\mathrm{iff}~R_n>R_p \f$. 
00379 
00380       If \ref new_skin_mode is false, then the bulk energy is 
00381       also computed as in \ref ldrop_mass. Otherwise, the
00382       number of nucleons in the core is computed with
00383       \f{eqnarray*}
00384       A_{\mathrm{core}} = Z (n_n+n_p)/n_p~\mathrm{for}~N\geq Z \\
00385       A_{\mathrm{core}} = N (n_n+n_p)/n_p~\mathrm{for}~Z>N \\
00386       \f}
00387       and \f$ A_{\mathrm{skin}} = A - A_{\mathrm{core}} \f$.
00388       The core contribution to the bulk energy is 
00389       \f[
00390       E_{\mathrm{core}}/A = \left(\frac{A_{\mathrm{core}}}{A}\right)
00391       \frac{\hbar c}{n_{L} }
00392       \left[\varepsilon(n_n,n_p) - n_n m_n - n_p m_p \right]
00393       \f]
00394       then the skin contribution is 
00395       \f[
00396       E_{\mathrm{skin}}/A = \left(\frac{A_{\mathrm{skin}}}{A}\right)
00397       \frac{\hbar c}{n_{L} }
00398       \left[\varepsilon(n_n,0) - n_n m_n \right]~\mathrm{for}~N>Z
00399       \f]
00400       and
00401       \f[
00402       E_{\mathrm{skin}}/A = \left(\frac{A_{\mathrm{skin}}}{A}\right)
00403       \frac{\hbar c}{n_{L} }
00404       \left[\varepsilon(0,n_p) - n_p m_p \right]~\mathrm{for}~Z>N
00405       \f]
00406 
00407       <b>Surface energy</b>
00408 
00409       If \ref full_surface is false, then the surface energy is 
00410       just that from \ref ldrop_mass , with an extra factor
00411       for the surface symmetry energy
00412       \f[
00413       E_{\mathrm{surf}} = \frac{\sigma}{n_L}
00414       \left(\frac{36 \pi n_L}{A} \right)^{1/3} 
00415       \left( 1- \sigma_{\delta} \delta^2 \right)
00416       \f]
00417       where \f$ \sigma_{\delta} \f$ is unitless and stored in \ref ss.
00418 
00419       If \ref full_surface is true, then the surface energy is modified
00420       by a cubic dependence for the medium and contains finite temperature
00421       corrections.
00422 
00423       <b>Coulomb energy</b>
00424 
00425       The Coulomb energy density (\ref Ravenhall83) is
00426       \f[
00427       \varepsilon = 2 \pi e^2 R_p^2 n_p^2 f_d(\chi_p)
00428       \f]
00429       where the function \f$ f_d(\chi) \f$ is 
00430       \f[
00431       f_d(\chi_p) = \frac{1}{(d+2)}
00432       \left[ \frac{2}{(d-2)} \left( 1 - \frac{d}{2} 
00433       \chi_p^{(1-2/d)} \right) + \chi_p \right]
00434       \f]
00435 
00436       This class takes \f$ d=3 \f$ .
00437 
00438       <b>Todos and Future</b>
00439 
00440       \todo This is based on LPRL, but it's a little different in
00441       Lattimer and Swesty. I should document what the difference is.
00442 
00443       \todo The testing could be updated.
00444       
00445       \future Add translational energy?
00446 
00447       \future Remove excluded volume correction and compute nuclear
00448       mass relative to the gas rather than relative to the vacuum.
00449 
00450       \future In principle, Tc should be self-consistently determined
00451       from the EOS.
00452 
00453       \future Does this work if the nucleus is "inside-out"?
00454 
00455       \comment
00456       \todo The choice of nn and np from n0 and n1 is very closely
00457       related to FRDM (\ref Moller95). We should document this here.
00458       
00459       I've taken this out, because it appears to me that Moller '95
00460       actually set this term (n1 = -3 L/K) to zero.
00461       \endcomment
00462 
00463       \comment
00464 
00465       \hline
00466 
00467       Excluded volume and \ref rel_vacuum:
00468 
00469       Typically in a single-nucleus EOS with a neutron drip 
00470       (ignoring translational degrees of freedom for the nucleus) 
00471       \f[
00472       f = n_N m_N + (1-\chi_n) f_{n,\mathrm{drip}}
00473       \f]
00474       where
00475       \f[
00476       m_N = \frac{A}{n_n+n_p}(f - n_n m_n - n_p m_p)
00477       \f]
00478       Since \f$ n_N = 3/(4 \pi R_{\mathrm{ws}}^3) \f$, and 
00479       \f$ \chi_n = (R_n/R_{\mathrm{ws}})^3 \f$, this is 
00480       \f[
00481       f = \frac{3}{4 \pi R_{\mathrm{ws}}^3} 
00482       \left[ m_N - f_{n,\mathrm{drip}} \frac{4 \pi}{3} R_n^3 \right]
00483       + f_{n,\mathrm{drip}}
00484       \f]
00485 
00486       \endcomment
00487 
00488       \hline
00489 
00490       <b>References</b>
00491 
00492       Designed in \ref Steiner08 and \ref Souza09 based in part
00493       on \ref Lattimer85 and \ref Lattimer91 .
00494 
00495       \hline
00496   */
00497   class ldrop_mass_skin : public ldrop_mass {
00498     
00499   public:
00500 
00501     ldrop_mass_skin();
00502 
00503     /// Return the type, \c "ldrop_mass_skin".
00504     virtual const char *type() { return "ldrop_mass_skin"; }
00505 
00506     /// Fix parameters from an array for fitting
00507     virtual int fit_fun(size_t nv, const ovector_base &x);
00508     
00509     /// Fill array with guess from present values for fitting
00510     virtual int guess_fun(size_t nv, ovector_base &x);
00511 
00512     /** \brief If true, properly fix the surface for the pure neutron
00513         matter limit (default true)
00514     */
00515     bool full_surface;
00516 
00517     /** \brief If true, separately compute the skin for the bulk energy
00518         (default false)
00519     */
00520     bool new_skin_mode;
00521 
00522     /// Ratio of \f$ \delta/I \f$ (default 0.8).
00523     double doi;
00524 
00525     /// Surface symmetry energy (default 0.5)
00526     double ss;
00527 
00528     /// \name Input parameters for temperature dependence
00529     //@{ 
00530     /// Exponent (default 1.25)
00531     double pp;
00532 
00533     /// Coefficient (default 0.935)
00534     double a0;
00535 
00536     /// Coefficient (default -5.1)
00537     double a2;
00538 
00539     /// Coefficient (default -1.1)
00540     double a4;
00541     //@}
00542     
00543     /** \brief If true, define the nuclear mass relative to the vacuum
00544         (default true)
00545     */
00546     bool rel_vacuum;
00547 
00548     /** \brief The critical temperature of isospin-symmetric matter in 
00549         \f$ fm^{-1} \f$ (default \f$ 20.085/(\hbar c)\f$.)
00550     */
00551     double Tchalf;
00552     
00553     /** \brief Return the free binding energy of a \nucleus in a many-body 
00554         environment
00555     */
00556     virtual double drip_binding_energy_d(double Z, double N,
00557                                          double npout, double nnout,
00558                                          double chi);
00559 
00560     /** \brief Return the free binding energy of a \nucleus in a many-body 
00561         environment
00562     */
00563     virtual double drip_binding_energy_full_d
00564       (double Z, double N, double npout, double nnout,
00565        double chi, double T);
00566   };
00567 
00568   /** \brief Liquid drop model with pairing
00569       
00570       This class adds a pairing correction
00571       \f[
00572       E_{\mathrm{pair}}/A = - \frac{\zeta}{2 A^{3/2}}
00573       \left[
00574       \cos(Z \pi) + \cos(N \pi)
00575       \right]
00576       \f]
00577       where \f$ \zeta \f$ is stored in \ref Epair. The trigonometric
00578       functions give the expected result for integer values of 
00579       N and Z.
00580   */
00581   class ldrop_mass_pair : public ldrop_mass_skin {
00582     
00583   public:
00584 
00585     /// Return the type, \c "ldrop_mass_pair".
00586     virtual const char *type() { return "ldrop_mass_pair"; }
00587 
00588     ldrop_mass_pair() {
00589       nfit=7;
00590       Epair=13.0;
00591     }
00592 
00593     /// Fix parameters from an array for fitting
00594     virtual int fit_fun(size_t nv, const ovector_base &x);
00595     
00596     /// Fill array with guess from present values for fitting
00597     virtual int guess_fun(size_t nv, ovector_base &x);
00598 
00599     /// Pairing energy coefficient (default 13 MeV)
00600     double Epair;
00601 
00602     /// Most recently computed pairing energy per baryon
00603     double pair;
00604 
00605     /** \brief Return the free binding energy of a \nucleus in a many-body 
00606         environment
00607     */
00608     virtual double drip_binding_energy_full_d
00609       (double Z, double N, double npout, double nnout,
00610        double chi, double T);
00611 
00612   };
00613 
00614 #ifndef DOXYGENP
00615 }
00616 #endif
00617 
00618 #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.