00001 /* 00002 ------------------------------------------------------------------- 00003 00004 Copyright (C) 2006, 2007, 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 <); 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
,
O2scl Sourceforge Project Page