Line data Source code
1 : ! ***********************************************************************
2 : !
3 : ! Copyright (C) 2011 Bill Paxton & 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 ionization_def
21 :
22 : use const_def, only: dp, use_mesa_temp_cache
23 :
24 : implicit none
25 :
26 : ! ionization results
27 :
28 : integer, parameter :: ion_ilogPgas = 1 ! log10 Pgas
29 : ! log10 of partial pressures
30 : integer, parameter :: ion_ilogpp_H = ion_ilogPgas + 1
31 : integer, parameter :: ion_ilogpp_He = ion_ilogpp_H + 1
32 : integer, parameter :: ion_ilogpp_C = ion_ilogpp_He + 1
33 : integer, parameter :: ion_ilogpp_N = ion_ilogpp_C + 1
34 : integer, parameter :: ion_ilogpp_O = ion_ilogpp_N + 1
35 : integer, parameter :: ion_ilogpp_Ne = ion_ilogpp_O + 1
36 : integer, parameter :: ion_ilogpp_Mg = ion_ilogpp_Ne + 1
37 : integer, parameter :: ion_ilogpp_Si = ion_ilogpp_Mg + 1
38 : integer, parameter :: ion_ilogpp_Fe = ion_ilogpp_Si + 1
39 : ! charge
40 : integer, parameter :: ion_iZ_H = ion_ilogpp_Fe + 1
41 : integer, parameter :: ion_iZ_He = ion_iZ_H + 1
42 : integer, parameter :: ion_iZ_C = ion_iZ_He + 1
43 : integer, parameter :: ion_iZ_N = ion_iZ_C + 1
44 : integer, parameter :: ion_iZ_O = ion_iZ_N + 1
45 : integer, parameter :: ion_iZ_Ne = ion_iZ_O + 1
46 : integer, parameter :: ion_iZ_Mg = ion_iZ_Ne + 1
47 : integer, parameter :: ion_iZ_Si = ion_iZ_Mg + 1
48 : integer, parameter :: ion_iZ_Fe = ion_iZ_Si + 1
49 : ! fraction neutral
50 : integer, parameter :: ion_ifneut_H = ion_iZ_Fe + 1
51 : integer, parameter :: ion_ifneut_He = ion_ifneut_H + 1
52 : integer, parameter :: ion_ifneut_C = ion_ifneut_He + 1
53 : integer, parameter :: ion_ifneut_N = ion_ifneut_C + 1
54 : integer, parameter :: ion_ifneut_O = ion_ifneut_N + 1
55 : integer, parameter :: ion_ifneut_Ne = ion_ifneut_O + 1
56 : integer, parameter :: ion_ifneut_Mg = ion_ifneut_Ne + 1
57 : integer, parameter :: ion_ifneut_Si = ion_ifneut_Mg + 1
58 : integer, parameter :: ion_ifneut_Fe = ion_ifneut_Si + 1
59 :
60 : integer, parameter :: num_ion_vals = ion_ifneut_Fe
61 :
62 : character (len=20) :: ion_result_names(num_ion_vals)
63 :
64 :
65 : ! based on scheme for eos tables
66 :
67 : integer, parameter :: num_ion_Zs = 5
68 : real(dp), parameter :: ion_Zs(num_ion_Zs) = [ 0.00d0, 0.02d0, 0.04d0, 0.20d0, 1.00d0 ]
69 : integer, parameter :: num_ion_Xs_for_Z(num_ion_Zs) = [ 6, 5, 5, 5, 1 ]
70 :
71 : integer, parameter :: num_ion_Xs = 6
72 : real(dp), parameter :: ion_Xs(num_ion_Xs) = &
73 : [ 0.0d0, 0.2d0, 0.4d0, 0.6d0, 0.8d0, 1.0d0 ]
74 :
75 : integer, parameter :: sz_per_ion_point = 4 ! for bicubic spline interpolation
76 :
77 : real(dp) :: ion_logQ_min ! logQ = logRho - 2*logT + 12
78 : real(dp) :: ion_logQ_max
79 : real(dp) :: ion_del_logQ ! spacing for the logQs
80 : integer :: ion_num_logQs
81 : real(dp) :: ion_logT_min
82 : real(dp) :: ion_logT_max
83 : real(dp) :: ion_del_logT ! spacing for the logTs
84 : integer :: ion_num_logTs
85 : real(dp), dimension(:), pointer :: ion_logQs, ion_logTs
86 : real(dp), dimension(:), pointer :: ion_tbl1
87 : real(dp), dimension(:,:,:,:,:,:), pointer :: ion_tbl
88 : ! dimension(sz_per_ion_point, num_ion_vals, num_logQs, num_logTs, num_ion_Xs, num_ion_Zs)
89 : integer :: ion_version
90 :
91 : integer, parameter :: min_version = 49
92 :
93 : character(len=32) :: ion_file_prefix, ion_Z1_suffix
94 : character(len=1000) :: ionization_cache_dir, ionization_temp_cache_dir
95 :
96 : logical :: use_cache_for_ion = .true.
97 : logical :: ion_root_is_initialized = .false.
98 : logical :: ion_is_initialized = .false.
99 :
100 :
101 : integer, parameter :: table_version = 1
102 :
103 : type Ionization_Info
104 : integer :: num_log_ne, num_logT
105 : real(dp), pointer :: log_ne(:), logT(:)
106 : real(dp), pointer :: f1(:)
107 : logical :: have_interpolation_info
108 : integer :: ilinx, iliny
109 : end type Ionization_Info
110 :
111 :
112 : type (Ionization_Info), target :: fe_he_info
113 : type (Ionization_Info), pointer :: fe_he_ptr
114 :
115 :
116 : logical :: table_is_initialized = .false.
117 :
118 : contains
119 :
120 3 : subroutine ion_def_init(ionization_cache_dir_in)
121 : use const_def, only: mesa_data_dir, mesa_caches_dir, mesa_temp_caches_dir
122 : use utils_lib, only : mkdir
123 : character (len=*), intent(in) :: ionization_cache_dir_in
124 :
125 3 : ion_is_initialized = .false.
126 3 : use_cache_for_ion = .true.
127 :
128 3 : if (len_trim(ionization_cache_dir_in) > 0) then
129 0 : ionization_cache_dir = ionization_cache_dir_in
130 3 : else if (len_trim(mesa_caches_dir) > 0) then
131 0 : ionization_cache_dir = trim(mesa_caches_dir) // '/ionization_cache'
132 : else
133 3 : ionization_cache_dir = trim(mesa_data_dir) // '/ionization_data/cache'
134 : end if
135 3 : call mkdir(ionization_cache_dir)
136 :
137 3 : ionization_temp_cache_dir = trim(mesa_temp_caches_dir)//'/ionization_cache'
138 3 : if(use_mesa_temp_cache) call mkdir(ionization_temp_cache_dir)
139 :
140 3 : ion_file_prefix = 'ion'
141 3 : ion_Z1_suffix = '_CO_1'
142 3 : ion_result_names(ion_ilogPgas) = 'logPgas'
143 3 : ion_result_names(ion_ilogpp_H) = 'logpp_H'
144 3 : ion_result_names(ion_ilogpp_He) = 'logpp_He'
145 3 : ion_result_names(ion_ilogpp_C) = 'logpp_C'
146 3 : ion_result_names(ion_ilogpp_N) = 'logpp_N'
147 3 : ion_result_names(ion_ilogpp_O) = 'logpp_O'
148 3 : ion_result_names(ion_ilogpp_Ne) = 'logpp_Ne'
149 3 : ion_result_names(ion_ilogpp_Mg) = 'logpp_Mg'
150 3 : ion_result_names(ion_ilogpp_Si) = 'logpp_Si'
151 3 : ion_result_names(ion_ilogpp_Fe) = 'logpp_Fe'
152 3 : ion_result_names(ion_iZ_H) = 'Z_H'
153 3 : ion_result_names(ion_iZ_He) = 'Z_He'
154 3 : ion_result_names(ion_iZ_C) = 'Z_C'
155 3 : ion_result_names(ion_iZ_N) = 'Z_N'
156 3 : ion_result_names(ion_iZ_O) = 'Z_O'
157 3 : ion_result_names(ion_iZ_Ne) = 'Z_Ne'
158 3 : ion_result_names(ion_iZ_Mg) = 'Z_Mg'
159 3 : ion_result_names(ion_iZ_Si) = 'Z_Si'
160 3 : ion_result_names(ion_iZ_Fe) = 'Z_Fe'
161 3 : ion_result_names(ion_ifneut_H) = 'fneut_H'
162 3 : ion_result_names(ion_ifneut_He) = 'fneut_He'
163 3 : ion_result_names(ion_ifneut_C) = 'fneut_C'
164 3 : ion_result_names(ion_ifneut_N) = 'fneut_N'
165 3 : ion_result_names(ion_ifneut_O) = 'fneut_O'
166 3 : ion_result_names(ion_ifneut_Ne) = 'fneut_Ne'
167 3 : ion_result_names(ion_ifneut_Mg) = 'fneut_Mg'
168 3 : ion_result_names(ion_ifneut_Si) = 'fneut_Si'
169 3 : ion_result_names(ion_ifneut_Fe) = 'fneut_Fe'
170 3 : end subroutine ion_def_init
171 :
172 0 : end module ionization_def
|