LCOV - code coverage report
Current view: top level - ionization/public - ionization_def.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 93.0 % 43 40
Test Date: 2025-05-08 18:23:42 Functions: 50.0 % 2 1

            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
        

Generated by: LCOV version 2.0-1