Line data Source code
1 : ! ***********************************************************************
2 : !
3 : ! Copyright (C) 2010-2020 The MESA Team
4 : !
5 : ! This program is free software: you can redistribute it and/or modify
6 : ! it under the terms of the GNU Lesser General Public License
7 : ! as published by the Free Software Foundation,
8 : ! either version 3 of the License, or (at your option) any later version.
9 : !
10 : ! This program is distributed in the hope that it will be useful,
11 : ! but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 : ! See the GNU Lesser General Public License for more details.
14 : !
15 : ! You should have received a copy of the GNU Lesser General Public License
16 : ! along with this program. If not, see <https://www.gnu.org/licenses/>.
17 : !
18 : ! ***********************************************************************
19 :
20 : module const_def
21 :
22 : implicit none
23 :
24 : public
25 :
26 : ! real number precision options: single, double, quad
27 : integer, parameter :: sp = selected_real_kind(p=5) ! real32
28 : integer, parameter :: dp = selected_real_kind(p=15) ! real64
29 : integer, parameter :: qp = selected_real_kind(p=30) ! real128
30 :
31 : ! integer precision options
32 : integer, parameter :: i1 = selected_int_kind(2) ! int8
33 : integer, parameter :: i2 = selected_int_kind(4) ! int16
34 : integer, parameter :: i4 = selected_int_kind(9) ! int32
35 : integer, parameter :: i8 = selected_int_kind(18) ! int64
36 :
37 : integer, parameter :: strlen = 256 ! for character (len=strlen)
38 :
39 : integer, parameter :: max_extra_inlists = 5 ! number of inlists an inlist can depend on
40 :
41 : !
42 : ! mathematical and physical constants (in cgs)
43 : !
44 :
45 : ! math constants
46 : real(dp), parameter :: pi = 3.1415926535897932384626433832795028841971693993751d0
47 : real(dp), parameter :: pi2 = pi*pi
48 : real(dp), parameter :: pi4 = 4*pi
49 : real(dp), parameter :: eulercon = 0.577215664901532861d0
50 : real(dp), parameter :: eulernum = 2.71828182845904523536028747135266249d0
51 : real(dp), parameter :: ln2 = 6.9314718055994529D-01 ! = log(2d0)
52 : real(dp), parameter :: ln3 = 1.0986122886681096D+00 ! = log(3d0)
53 : real(dp), parameter :: lnPi = 1.14472988584940017414343_dp ! = log(pi)
54 : real(dp), parameter :: ln10 = 2.3025850929940455_dp ! = log(10d0)
55 : real(dp), parameter :: iln10 = 0.43429448190325187_dp ! = 1d0/log(10d0)
56 : real(dp), parameter :: a2rad = pi/180.0d0 ! angle to radians
57 : real(dp), parameter :: rad2a = 180.0d0/pi ! radians to angle
58 : real(dp), parameter :: one_third = 1d0/3d0
59 : real(dp), parameter :: two_thirds = 2d0/3d0
60 : real(dp), parameter :: four_thirds = 4d0/3d0
61 : real(dp), parameter :: five_thirds = 5d0/3d0
62 : real(dp), parameter :: one_sixth = 1d0/6d0
63 : real(dp), parameter :: four_thirds_pi = four_thirds*pi
64 : real(dp), parameter :: ln4pi3 = 1.4324119583011810d0 ! = log(4*pi/3)
65 : real(dp), parameter :: two_13 = 1.2599210498948730d0 ! = pow(2d0,1d0/3d0)
66 : real(dp), parameter :: four_13 = 1.5874010519681994d0 ! = pow(4d0,1d0/3d0)
67 : real(dp), parameter :: sqrt2 = 1.414213562373095d0 ! = sqrt(2)
68 : real(dp), parameter :: sqrt_2_div_3 = 0.816496580927726d0 ! = sqrt(2/3)
69 :
70 : ! exact physical constants
71 :
72 : ! CODATA 2018
73 : real(dp), parameter :: avo = 6.02214076d23 ! Avogadro constant (mole^-1)
74 : real(dp), parameter :: amu = 1d0/avo ! atomic mass unit (g)
75 : real(dp), parameter :: clight = 2.99792458d10 ! speed of light in vacuum (cm s^-1)
76 : real(dp), parameter :: qe = (clight/10d0)*1.602176634d-19 ! elementary charge (esu == (g cm^3 s^-2)^(1/2))
77 : real(dp), parameter :: kerg = 1.380649d-16
78 : real(dp), parameter :: boltzm = kerg ! Boltzmann constant (erg K^-1)
79 : real(dp), parameter :: planck_h = 6.62607015d-27 ! Planck constant (erg s)
80 : real(dp), parameter :: hbar = planck_h/(2*pi)
81 : real(dp), parameter :: cgas = boltzm*avo ! ideal gas constant (erg K^-1)
82 : real(dp), parameter :: ev2erg = 1.602176634d-12 ! electron volt (erg)
83 : real(dp), parameter :: mev_to_ergs = 1d6*ev2erg
84 : real(dp), parameter :: mev_amu = mev_to_ergs/amu
85 : real(dp), parameter :: mev2gr = 1d6*ev2erg/(clight*clight) ! MeV to grams
86 : real(dp), parameter :: Qconv = mev_to_ergs*avo
87 : real(dp), parameter :: kev = kerg/ev2erg ! converts temp to ev (ev K^-1)
88 : real(dp), parameter :: boltz_sigma = (pi*pi*boltzm*boltzm*boltzm*boltzm)/(60*hbar*hbar*hbar*clight*clight) ! Stefan-Boltzmann constant (erg cm^-2 K^-4 s^-1)
89 : real(dp), parameter :: crad = boltz_sigma*4/clight ! radiation density constant, AKA "a" (erg cm^-3 K^-4); Prad = crad * T^4 / 3
90 :
91 : ! IAU
92 : real(dp), parameter :: au = 1.49597870700D13 ! (cm) - exact value defined by IAU 2009, 2012
93 : real(dp), parameter :: pc = (3.600D3*rad2a)*au ! (cm) parsec, by definition
94 : real(dp), parameter :: dayyer = 365.25d0 ! days per (Julian) year
95 : real(dp), parameter :: secday = 24*60*60 ! seconds in a day
96 : real(dp), parameter :: secyer = secday*dayyer ! seconds per year
97 : real(dp), parameter :: ly = clight*secyer ! light year (cm)
98 :
99 : ! inexact but very well measured physical constants
100 :
101 : real(dp), parameter :: mn = 1.67492749804d-24 ! neutron mass (g)
102 : real(dp), parameter :: mp = 1.67262192369d-24 ! proton mass (g)
103 : real(dp), parameter :: me = 9.1093837015d-28 ! electron mass (g)
104 :
105 : real(dp), parameter :: rbohr = 5.29177210903d-9 ! Bohr radius (cm)
106 : real(dp), parameter :: fine = 7.2973525693d-3 ! fine-structure constant
107 : real(dp), parameter :: hion = 13.605693122994d0 ! Rydberg constant (eV)
108 :
109 : real(dp), parameter :: sige = 6.6524587321d-25 ! Thomson cross section (cm^2)
110 :
111 : real(dp), parameter :: weinberg_theta = 0.22290d0 ! sin**2(theta_weinberg)
112 : real(dp), parameter :: num_neu_fam = 3.0d0 ! number of neutrino flavors = 3.02 plus/minus 0.005 (1998)
113 :
114 : ! the following quantities are not exact
115 :
116 : real(dp), parameter :: standard_cgrav = 6.67430d-8 ! gravitational constant (g^-1 cm^3 s^-2)
117 :
118 : ! IAU 2015 Resolution B3
119 : ! standard gravitational parameters = G*M, units cm^3 s^-2
120 : real(dp), parameter :: mu_sun = 1.3271244d26
121 : real(dp), parameter :: mu_earth = 3.986004d20
122 : real(dp), parameter :: mu_jupiter = 1.2668653d23
123 :
124 : ! astronomical constants
125 : real(dp), parameter :: agesun = 4.57d9 ! solar age (years) from Bahcall et al, ApJ 618 (2005) 1049-1056.
126 : real(dp), parameter :: Msun = mu_sun/standard_cgrav ! solar mass (g); gravitational mass, not baryonic
127 : real(dp), parameter :: Rsun = 6.957d10 ! solar radius (cm), IAU 2015 Resolution B3
128 : real(dp), parameter :: Lsun = 3.828d33 ! solar luminosity (erg s^-1), IAU 2015 Resolution B3
129 : real(dp), parameter :: Teffsun = 5772.0d0 ! solar effective temperature (K), IAU 2015 Resolution B3
130 : real(dp), parameter :: loggsun = 4.4380676273031332_dp ! log10(mu_sun/(Rsun*Rsun)), can't call log10 because we don't have math_lib at this point
131 : real(dp), parameter :: mbolsun = 4.74d0 ! Bolometric magnitude of the Sun, IAU 2015 Resolution B2
132 :
133 : real(dp), parameter :: m_earth = mu_earth/standard_cgrav ! earth mass (g)
134 : real(dp), parameter :: r_earth = 6.3781d8 ! earth equatorial radius (cm)
135 : real(dp), parameter :: r_earth_polar = 6.3568d8 ! earth polar radius (cm)
136 :
137 : real(dp), parameter :: m_jupiter = mu_jupiter/standard_cgrav ! jupiter mass (g)
138 : real(dp), parameter :: r_jupiter = 7.1492d9 ! jupiter equatorial radius (cm)
139 : real(dp), parameter :: r_jupiter_polar = 6.6854d9 ! jupiter polar radius (cm)
140 : real(dp), parameter :: semimajor_axis_jupiter = 7.7857d13 ! jupiter semimajor axis (cm)
141 :
142 : ! many routines allow either a value, a log value, or both as args
143 : ! omitted args are indicated by passing 'arg_not_provided'
144 :
145 : real(dp), parameter :: arg_not_provided = -9d99
146 : real(dp), parameter :: missing_value = arg_not_provided
147 :
148 : character(len=strlen) :: mesa_dir
149 : character(len=strlen) :: mesa_data_dir ! = trim(mesa_dir) // '/data'
150 : character(len=strlen) :: mesa_caches_dir
151 : character(len=strlen) :: mesa_temp_caches_dir !Temp storage must be local to run
152 :
153 : logical :: use_mesa_temp_cache ! If false then dont use mesa_temp_caches_dir
154 :
155 : ! mixing types
156 : ! NOTE: some packages may depend on the order
157 : integer, parameter :: crystallized = -1
158 : integer, parameter :: no_mixing = 0
159 : integer, parameter :: convective_mixing = 1
160 : integer, parameter :: overshoot_mixing = 2
161 : integer, parameter :: semiconvective_mixing = 3
162 : integer, parameter :: thermohaline_mixing = 4
163 : integer, parameter :: rotation_mixing = 5
164 : integer, parameter :: rayleigh_taylor_mixing = 6
165 : integer, parameter :: minimum_mixing = 7
166 : integer, parameter :: anonymous_mixing = 8 ! AKA "WTF_mixing"
167 : integer, parameter :: leftover_convective_mixing = 9 ! for regions with non-zero conv_vel that are not unstable to convection
168 : ! used for time dependent convection
169 : integer, parameter :: phase_separation_mixing = 10
170 :
171 : integer, parameter :: number_of_mixing_types = phase_separation_mixing + 1
172 :
173 : contains
174 :
175 25 : subroutine do_const_init(mesa_dir_init, ierr)
176 : character(len=*), intent(in) :: mesa_dir_init
177 : integer, intent(out) :: ierr
178 :
179 : character(len=strlen) :: temp_caches_disable
180 :
181 25 : ierr = 0
182 :
183 25 : call get_environment_variable("MESA_CACHES_DIR", mesa_caches_dir)
184 : !write(*,*) 'MESA_CACHES_DIR "' // trim(mesa_caches_dir) // '"'
185 :
186 25 : mesa_dir = mesa_dir_init
187 25 : if (len_trim(mesa_dir) == 0) then
188 0 : call get_environment_variable("MESA_DIR", mesa_dir)
189 : end if
190 :
191 25 : if (len_trim(mesa_dir) > 0) then
192 25 : mesa_data_dir = trim(mesa_dir)//'/data'
193 : else
194 0 : write (*, *) 'ERROR: you must provide the path to your mesa directory,'
195 0 : write (*, *) 'either in your inlist or by setting the MESA_DIR environment variable.'
196 0 : ierr = -1
197 0 : return
198 : end if
199 :
200 : !write(*,*) 'mesa_data_dir ' // trim(mesa_data_dir)
201 :
202 25 : call get_environment_variable("MESA_TEMP_CACHES_DIR", mesa_temp_caches_dir)
203 :
204 25 : if (len_trim(mesa_temp_caches_dir) == 0) then
205 25 : mesa_temp_caches_dir = './.mesa_temp_cache'
206 : end if
207 :
208 : !Opt out for temp caches
209 25 : use_mesa_temp_cache = .true.
210 25 : call get_environment_variable("MESA_TEMP_CACHES_DISABLE", temp_caches_disable)
211 :
212 25 : if (len_trim(temp_caches_disable) > 0) then
213 0 : use_mesa_temp_cache = .false.
214 : end if
215 :
216 25 : end subroutine do_const_init
217 :
218 : end module const_def
|