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