LCOV - code coverage report
Current view: top level - star/private - profile_getval.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 4.5 % 1209 54
Test Date: 2026-08-20 21:51:39 Functions: 15.4 % 13 2

            Line data    Source code
       1              : ! ***********************************************************************
       2              : !
       3              : !   Copyright (C) 2010-2019  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 profile_getval
      21              : 
      22              :       use star_private_def
      23              :       use star_profile_def
      24              :       use const_def, only: dp, qe, kerg, avo, amu, boltz_sigma, secday, secyer, standard_cgrav, &
      25              :          clight, four_thirds_pi, ln10, lsun, msun, pi, pi4, rsun, sqrt_2_div_3, one_third, &
      26              :          convective_mixing, &
      27              :          overshoot_mixing, &
      28              :          semiconvective_mixing, &
      29              :          thermohaline_mixing, &
      30              :          minimum_mixing, &
      31              :          anonymous_mixing, &
      32              :          leftover_convective_mixing
      33              :       use star_utils
      34              :       use utils_lib
      35              :       use auto_diff_support, only: get_w, get_etrb
      36              : 
      37              :       implicit none
      38              : 
      39              :       integer, parameter :: idel = 10000
      40              :       integer, parameter :: add_abundances = idel
      41              :       integer, parameter :: add_log_abundances = add_abundances + 1
      42              :       integer, parameter :: category_offset = add_log_abundances + 1
      43              :       integer, parameter :: abundance_offset = category_offset + idel
      44              :       integer, parameter :: log_abundance_offset = abundance_offset + idel
      45              :       integer, parameter :: xadot_offset = log_abundance_offset + idel
      46              :       integer, parameter :: xaprev_offset = xadot_offset + idel
      47              :       integer, parameter :: ionization_offset = xaprev_offset + idel
      48              :       integer, parameter :: typical_charge_offset = ionization_offset + idel
      49              :       integer, parameter :: edv_offset = typical_charge_offset + idel
      50              :       integer, parameter :: extra_diffusion_factor_offset = edv_offset + idel
      51              :       integer, parameter :: v_rad_offset = extra_diffusion_factor_offset + idel
      52              :       integer, parameter :: log_g_rad_offset = v_rad_offset + idel
      53              :       integer, parameter :: log_concentration_offset = log_g_rad_offset + idel
      54              :       integer, parameter :: diffusion_dX_offset = log_concentration_offset + idel
      55              :       integer, parameter :: diffusion_D_offset = diffusion_dX_offset + idel
      56              :       integer, parameter :: raw_rate_offset = diffusion_D_offset + idel
      57              :       integer, parameter :: screened_rate_offset = raw_rate_offset + idel
      58              :       integer, parameter :: eps_nuc_rate_offset = screened_rate_offset + idel
      59              :       integer, parameter :: eps_neu_rate_offset = eps_nuc_rate_offset + idel
      60              :       integer, parameter :: extra_offset = eps_neu_rate_offset + idel
      61              :       integer, parameter :: max_profile_offset = extra_offset + idel
      62              : 
      63              :       contains
      64              : 
      65           12 :       integer function do1_profile_spec( &
      66              :             s, iounit, n, i, string, buffer, report, ierr) result(spec)
      67              : 
      68              :          use utils_lib
      69              :          use utils_def
      70              :          use chem_def
      71              :          use chem_lib
      72              :          use net_def
      73              : 
      74              :          type(star_info), pointer :: s
      75              :          integer :: iounit, n, i, num, t
      76              : 
      77              :          character (len=*) :: string, buffer
      78              :          logical, intent(in) :: report
      79              :          integer, intent(out) :: ierr
      80              : 
      81              :          integer :: id
      82              :          type(Net_General_Info), pointer :: g
      83              : 
      84              :          ierr = 0
      85           12 :          spec = -1
      86              : 
      87           12 :          call get_net_ptr(s% net_handle, g, ierr)
      88           12 :          if(ierr/=0) return
      89              : 
      90           12 :          id = do_get_profile_id(string)
      91           12 :          if (id > 0) then
      92              :             spec = id
      93              :             return
      94              :          end if
      95              : 
      96            0 :          select case(string)
      97              : 
      98              :             case ('xadot')
      99            0 :                call do1_nuclide(xadot_offset)
     100              : 
     101              :             case ('xaprev')
     102            0 :                call do1_nuclide(xaprev_offset)
     103              : 
     104              :             case ('ionization')
     105            0 :                call do1_nuclide(ionization_offset)
     106              : 
     107              :             case ('typical_charge')
     108            0 :                call do1_nuclide(typical_charge_offset)
     109              : 
     110              :             case ('edv')
     111            0 :                call do1_nuclide(edv_offset)
     112              : 
     113              :             case ('extra_diffusion_factor')
     114            0 :                call do1_nuclide(extra_diffusion_factor_offset)
     115              : 
     116              :             case ('v_rad')
     117            0 :                call do1_nuclide(v_rad_offset)
     118              : 
     119              :             case ('log_g_rad')
     120            0 :                call do1_nuclide(log_g_rad_offset)
     121              : 
     122              :             case ('log_concentration')
     123            0 :                call do1_nuclide(log_concentration_offset)
     124              : 
     125              :             case ('diffusion_dX')
     126            0 :                call do1_nuclide(diffusion_dX_offset)
     127              : 
     128              :             case ('diffusion_D')
     129            0 :                call do1_nuclide(diffusion_D_offset)
     130              : 
     131              :             case ('log')  ! add log of abundance
     132            0 :                call do1_nuclide(log_abundance_offset)
     133              : 
     134              :             case ('eps_neu_rate')
     135            0 :                 call do1_rate(eps_neu_rate_offset)
     136              : 
     137              :             case ('eps_nuc_rate')
     138            0 :                 call do1_rate(eps_nuc_rate_offset)
     139              : 
     140              :             case ('screened_rate')
     141            0 :                 call do1_rate(screened_rate_offset)
     142              : 
     143              :             case ('raw_rate')
     144            0 :                 call do1_rate(raw_rate_offset)
     145              : 
     146              :             case ('extra')
     147              : 
     148            0 :                t = token(iounit, n, i, buffer, string)
     149            0 :                if (t /= name_token) then
     150            0 :                   ierr = -1; return
     151              :                end if
     152            0 :                read(string,fmt=*,iostat=ierr) num
     153            0 :                if (ierr /= 0 .or. num <= 0 .or. num > max_num_profile_extras) then
     154            0 :                   write(*,*) 'failed to find valid integer for extra: ' // trim(string)
     155            0 :                   ierr = -1
     156              :                end if
     157            0 :                spec = extra_offset + num
     158              : 
     159              :             case default
     160              : 
     161            3 :                id = chem_get_iso_id(string)
     162            3 :                if (id > 0) then
     163            0 :                   spec = abundance_offset + id
     164            0 :                   return
     165              :                end if
     166            3 :                id = rates_category_id(string)
     167            3 :                if (id > 0) then
     168            3 :                   spec = category_offset + id
     169            3 :                   return
     170              :                end if
     171            0 :                if (report) &
     172            0 :                   write(*,*) 'failed to recognize item for profile columns: ' // trim(string)
     173            3 :                ierr = -1
     174              : 
     175              :          end select
     176              : 
     177              : 
     178              :          contains
     179              : 
     180              : 
     181            0 :          subroutine do1_nuclide(offset)
     182              :             integer, intent(in) :: offset
     183              :             integer :: t, id
     184            0 :             t = token(iounit, n, i, buffer, string)
     185            0 :             if (t /= name_token) then
     186            0 :                ierr = -1; return
     187              :             end if
     188            0 :             id = chem_get_iso_id(string)
     189            0 :             if (id > 0) then
     190            0 :                spec = offset + id
     191            0 :                return
     192              :             end if
     193            0 :             write(*,*) 'bad iso name: ' // trim(string)
     194            0 :             ierr = -1
     195              :          end subroutine do1_nuclide
     196              : 
     197            0 :          subroutine do1_rate(offset)  ! raw_rate, screened_rate, eps_nuc_rate, eps_neu_rate
     198              :             use rates_lib, only: rates_reaction_id
     199              :             integer, intent(in) :: offset
     200              :             integer :: t, id
     201            0 :             t = token(iounit, n, i, buffer, string)
     202            0 :             if (t /= name_token) then
     203            0 :                ierr = -1; return
     204              :             end if
     205            0 :             id = rates_reaction_id(string)
     206            0 :             id = g% net_reaction(id)  ! Convert to net id not the global rate id
     207            0 :             if (id > 0) then
     208            0 :                spec = offset + id
     209            0 :                return
     210              :             end if
     211            0 :             write(*,*) 'bad rate name: ' // trim(string)
     212            0 :             ierr = -1
     213              :          end subroutine do1_rate
     214              : 
     215              : 
     216              :       end function do1_profile_spec
     217              : 
     218              : 
     219            0 :       integer function get_profile_id(s, name) result(spec)
     220              :          use utils_lib, only: token
     221              :          use utils_def, only: name_token
     222              :          type (star_info), pointer :: s
     223              :          character (len=*), intent(in) :: name
     224              :          character (len=strlen) :: buffer, string
     225              :          integer :: i, n, iounit, ierr, t
     226            0 :          iounit = -1
     227            0 :          ierr = 0
     228            0 :          buffer = name
     229            0 :          n = len_trim(buffer) + 1
     230            0 :          buffer(n:n) = ' '
     231            0 :          i = 0
     232            0 :          t = token(iounit, n, i, buffer, string)
     233            0 :          if (t /= name_token) then
     234            0 :             spec = -1; return
     235              :          end if
     236            0 :          spec = do1_profile_spec(s, iounit, n, i, string, buffer, .false., ierr)
     237            0 :          if (ierr == 0) return
     238              :          ! check to see if it is one of the extra profile columns
     239            0 :          do i=1,s% num_extra_profile_cols
     240            0 :             if (name == s% extra_profile_col_names(i)) then
     241            0 :                spec = i + max_profile_offset
     242            0 :                return
     243              :             end if
     244              :          end do
     245            0 :          spec = -1
     246            0 :       end function get_profile_id
     247              : 
     248              : 
     249            0 :       real(dp) function get_profile_val(s, id, k)
     250              :          type (star_info), pointer :: s
     251              :          integer, intent(in) :: id, k
     252              :          integer :: int_val
     253              :          logical :: int_flag
     254            0 :          if (id > max_profile_offset) then  ! get from extras
     255            0 :             get_profile_val = s% extra_profile_col_vals(k, id - max_profile_offset)
     256            0 :             return
     257              :          end if
     258            0 :          call getval_for_profile(s, id, k, get_profile_val, int_flag, int_val)
     259            0 :          if (int_flag) get_profile_val = dble(int_val)
     260            0 :       end function get_profile_val
     261              : 
     262              : 
     263        41472 :       subroutine getval_for_profile(s, c, k, val, int_flag, int_val)
     264              :          use chem_def
     265              :          use rates_def
     266              :          use ionization_def
     267              :          use mod_typical_charge, only: eval_typical_charge
     268              :          use rsp_def, only: rsp_WORK, rsp_WORKQ, rsp_WORKT, rsp_WORKC
     269              : 
     270              :          type (star_info), pointer :: s
     271              :          integer, intent(in) :: c, k
     272              :          real(dp), intent(out) :: val
     273              :          integer, intent(out) :: int_val
     274              :          logical, intent(inout) :: int_flag
     275              : 
     276              :          real(dp) :: cno, z, x, L_rad, L_edd, &
     277              :             r00, rp1, v00, vp1, Ap1, &
     278              :             r00_start, rp1_start, dr3, dr3_start, &
     279              :             d_dlnR00, d_dlnRp1, d_dv00, d_dvp1
     280              :          integer :: j, nz, ionization_k, klo, khi, i, ii, ierr
     281              :          real(dp) :: f, lgT, full_on, full_off, am_nu_factor
     282              :          logical :: rsp_or_w, reconstructed_face_state_active
     283              :          include 'formats'
     284              : 
     285        41472 :          if (s% rotation_flag) then
     286            0 :             full_on = s% D_mix_rotation_max_logT_full_on
     287            0 :             full_off = s% D_mix_rotation_min_logT_full_off
     288            0 :             lgT = s% lnT(k)/ln10
     289            0 :             if (lgT <= full_on) then
     290              :                f = 1d0
     291            0 :             else if (lgT >= full_off) then
     292              :                f = 0d0
     293              :             else                   ! lgT > full_on and < full_off
     294            0 :                f = (lgT - full_on) / (full_off - full_on)
     295              :             end if
     296            0 :             am_nu_factor = f*s% am_nu_factor
     297              :          else
     298              :             am_nu_factor = 1d0
     299              :          end if
     300              : 
     301        41472 :          val = 0; int_val = 0; int_flag = .false.
     302        41472 :          nz = s% nz
     303        41472 :          ionization_k = 0
     304              : 
     305              :          int_flag = .false.
     306        41472 :          rsp_or_w = s% RSP_flag .or. s% RSP2_flag
     307        41472 :          reconstructed_face_state_active = s% use_face_reconstruction
     308              : 
     309        41472 :          if (c > extra_offset) then
     310            0 :             i = c - extra_offset
     311            0 :             val = s% profile_extra(k,i)
     312              :          ! TODO: implement eps_neu_rate, eps_nuc_rate, screened_rate
     313        41472 :          else if (c > eps_neu_rate_offset) then
     314            0 :             i = c - eps_neu_rate_offset
     315            0 :             val = s% eps_neu_rate(i,k) * s% dm(k)
     316        41472 :          else if (c > eps_nuc_rate_offset) then
     317            0 :             i = c - eps_nuc_rate_offset
     318            0 :             val = s% eps_nuc_rate(i,k) * s% dm(k)
     319        41472 :          else if (c > screened_rate_offset) then
     320            0 :             i = c - screened_rate_offset
     321            0 :             val = s% screened_rate(i,k) * s% dm(k)
     322        41472 :          else if (c > raw_rate_offset) then
     323            0 :             i = c - raw_rate_offset
     324            0 :             val = s% raw_rate(i,k) * s% dm(k)
     325        41472 :          else if (c > diffusion_D_offset) then
     326            0 :             i = c - diffusion_D_offset
     327            0 :             ii = s% net_iso(i)
     328            0 :             if (ii > 0 .and. s% do_element_diffusion) val = s% diffusion_D_self(ii,k)
     329        41472 :          else if (c > diffusion_dX_offset) then
     330            0 :             i = c - diffusion_dX_offset
     331            0 :             ii = s% net_iso(i)
     332            0 :             if (ii > 0 .and. s% do_element_diffusion) val = s% diffusion_dX(ii,k)
     333        41472 :          else if (c > log_concentration_offset) then
     334            0 :             i = c - log_concentration_offset
     335            0 :             ii = s% net_iso(i)
     336            0 :             if (ii > 0) val = get_log_concentration(s,ii,k)
     337        41472 :          else if (c > log_g_rad_offset) then
     338            0 :             i = c - log_g_rad_offset
     339            0 :             ii = s% net_iso(i)
     340            0 :             if (ii > 0 .and. s% do_element_diffusion) val = safe_log10(s% g_rad(ii,k))
     341        41472 :          else if (c > v_rad_offset) then
     342            0 :             i = c - v_rad_offset
     343            0 :             ii = s% net_iso(i)
     344            0 :             if (ii > 0 .and. s% do_element_diffusion) val = s% v_rad(ii,k)
     345        41472 :          else if (c > extra_diffusion_factor_offset) then
     346            0 :             i = c - extra_diffusion_factor_offset
     347            0 :             ii = s% net_iso(i)
     348            0 :             if (ii > 0 .and. s% do_element_diffusion) val = s% extra_diffusion_factor(ii,k)
     349        41472 :          else if (c > edv_offset) then
     350            0 :             i = c - edv_offset
     351            0 :             ii = s% net_iso(i)
     352            0 :             if (ii > 0 .and. s% do_element_diffusion) val = s% edv(ii,k)
     353        41472 :          else if (c > typical_charge_offset) then
     354            0 :             i = c - typical_charge_offset
     355            0 :             ii = s% net_iso(i)
     356            0 :             if (ii > 0 .and. s% do_element_diffusion) val = s% typical_charge(ii,k)
     357        41472 :          else if (c > ionization_offset) then
     358            0 :             i = c - ionization_offset
     359            0 :             ii = s% net_iso(i)
     360              :             val = eval_typical_charge( &
     361              :                i, s% abar(k), exp(s% lnfree_e(k)), &
     362            0 :                s% T(k), s% lnT(k)/ln10, s% rho(k), s% lnd(k)/ln10)
     363        41472 :          else if (c > xaprev_offset) then
     364            0 :             i = c - xaprev_offset
     365            0 :             ii = s% net_iso(i)
     366            0 :             if (ii > 0) val = s% xa_start(ii,k)
     367        41472 :          else if (c > xadot_offset) then
     368            0 :             i = c - xadot_offset
     369            0 :             ii = s% net_iso(i)
     370            0 :             if (ii > 0) val = s% xa(ii,k) - s% xa_start(ii,k)
     371        41472 :          else if (c > log_abundance_offset) then
     372            0 :             i = c - log_abundance_offset
     373            0 :             ii = s% net_iso(i)
     374            0 :             if (ii > 0) then
     375            0 :                val = safe_log10(s% xa(ii,k))
     376              :             else
     377            0 :                val = -99d0
     378              :             end if
     379        41472 :          else if (c > abundance_offset) then
     380            0 :             i = c - abundance_offset
     381            0 :             ii = s% net_iso(i)
     382            0 :             if (ii > 0) val = s% xa(ii,k)
     383        41472 :          else if (c > category_offset) then
     384        10368 :             i = c - category_offset
     385        10368 :             val = s% eps_nuc_categories(i,k)
     386              :          else
     387              : 
     388         3456 :          select case(c)
     389              :             case (p_zone)
     390         3456 :                val = dble(k)
     391         3456 :                int_val = k
     392         3456 :                int_flag = .true.
     393              :             case (p_k)
     394            0 :                val = dble(k)
     395            0 :                int_val = k
     396            0 :                int_flag = .true.
     397              :             case (p_conv_L_div_L)
     398            0 :                if (s% L(k) > 0d0) val = get_Lconv(s,k)/s% L(k)
     399              :             case (p_log_conv_L_div_L)
     400            0 :                if (s% L(k) > 0d0) val = safe_log10(get_Lconv(s,k)/s% L(k))
     401              :             case (p_lum_erg_s)
     402            0 :                val = s% L(k)
     403              :             case (p_L)
     404            0 :                val = s% L(k)/Lsun
     405              :             case (p_luminosity)
     406            0 :                val = s% L(k)/Lsun
     407              :             case (p_log_abs_lum_erg_s)
     408            0 :                val = safe_log10(abs(s% L(k)))
     409              :             case (p_lum_adv)
     410            0 :                val = get_Ladv(s,k)
     411              :             case (p_lum_plus_lum_adv)
     412            0 :                val = s% L(k) + get_Ladv(s,k)
     413              :             case (p_lum_rad)
     414            0 :                L_rad = get_Lrad(s,k)
     415            0 :                val = L_rad/Lsun
     416              :             case (p_lum_conv)
     417            0 :                val = get_Lconv(s,k)/Lsun
     418              :             case (p_lum_conv_MLT)
     419            0 :                val = s% L_conv(k)/Lsun
     420              : 
     421              :             case(p_Frad_div_cUrad)
     422              :                val = ((s% L(k) - s% L_conv(k)) / (4._dp*pi*pow2(s%r(k)))) &
     423            0 :                         /(clight * s% Prad(k) *3._dp)
     424              :             case (p_lum_rad_div_L_Edd_sub_fourPrad_div_PchiT)
     425            0 :                val = get_Lrad_div_Ledd(s,k) - 4*s% Prad(k)/(s% Peos(k)*s% chiT(k))
     426              :             case (p_lum_rad_div_L_Edd)
     427            0 :                val = get_Lrad_div_Ledd(s,k)
     428              :             case (p_lum_conv_div_lum_Edd)
     429            0 :                L_rad = get_Lrad(s,k)
     430            0 :                L_edd = get_Ledd(s,k)
     431            0 :                val = (s% L(k) - L_rad)/L_edd
     432              : 
     433              :             case (p_lum_conv_div_lum_rad)
     434            0 :                L_rad = get_Lrad(s,k)
     435            0 :                val = (s% L(k) - L_rad)/L_rad
     436              : 
     437              :             case (p_lum_rad_div_L)
     438            0 :                L_rad = get_Lrad(s,k)
     439            0 :                val = L_rad/max(1d0,s% L(k))
     440              :             case (p_lum_conv_div_L)
     441            0 :                L_rad = get_Lrad(s,k)
     442            0 :                val = (s% L(k) - L_rad)/max(1d0,s% L(k))
     443              : 
     444              :             case (p_log_Lrad)
     445            0 :                L_rad = get_Lrad(s,k)
     446            0 :                val = safe_log10(L_rad/Lsun)
     447              :             case (p_log_Lconv)
     448            0 :                L_rad = get_Lrad(s,k)
     449            0 :                val = safe_log10((s% L(k) - L_rad)/Lsun)
     450              :             case (p_log_Lconv_div_L)
     451            0 :                L_rad = get_Lrad(s,k)
     452            0 :                val = safe_log10((s% L(k) - L_rad)/s% L(k))
     453              : 
     454              :             case (p_log_Lrad_div_L)
     455            0 :                L_rad = get_Lrad(s,k)
     456            0 :                val = safe_log10(L_rad/s% L(k))
     457              :             case (p_log_Lrad_div_Ledd)
     458            0 :                val = safe_log10(get_Lrad_div_Ledd(s,k))
     459              : 
     460              :             case (p_log_g)
     461            0 :                val = safe_log10(s% grav(k))
     462              :             case (p_grav)
     463            0 :                val = s% grav(k)
     464              :             case (p_g_div_r)
     465            0 :                val = s% grav(k)/s% r(k)
     466              :             case (p_r_div_g)
     467            0 :                val = s% r(k)/s% grav(k)
     468              :             case (p_signed_log_eps_grav)
     469            0 :                val = s% eps_grav_ad(k)% val
     470            0 :                val = sign(1d0,val)*log10(max(1d0,abs(val)))
     471              :             case (p_net_nuclear_energy)
     472              :                ! Do not subtract s% eps_nuc_neu_total(k)  eps_nuc already contains it
     473            0 :                val = s% eps_nuc(k) - s% non_nuc_neu(k)
     474            0 :                val = sign(1d0,val)*log10(max(1d0,abs(val)))
     475              :             case (p_eps_nuc_plus_nuc_neu)
     476              :                !  eps_nuc  subtracts eps_nuc_neu so this is just the total eenrgy from nuclear burning without neutrinos
     477            0 :                val = s% eps_nuc(k) + s% eps_nuc_neu_total(k)
     478              :             case (p_eps_nuc_minus_non_nuc_neu)
     479            0 :                val = s% eps_nuc(k) - s% non_nuc_neu(k)
     480              :             case (p_net_energy)
     481            0 :                val = s% eps_nuc(k) - s% non_nuc_neu(k) + s% eps_grav_ad(k)% val
     482            0 :                val = sign(1d0,val)*log10(max(1d0,abs(val)))
     483              :             case (p_signed_log_power)
     484            0 :                val = s% L(k)
     485            0 :                val = sign(1d0,val)*log10(max(1d0,abs(val)))
     486              :             case (p_logL)
     487            0 :                val = safe_log10(max(1d-12,s% L(k)/Lsun))
     488              :             case (p_log_Ledd)
     489            0 :                val = safe_log10(get_Ledd(s,k)/Lsun)
     490              :             case (p_lum_div_Ledd)
     491            0 :                val = s% L(k)/get_Ledd(s,k)
     492              :             case (p_log_L_div_Ledd)
     493            0 :                val = safe_log10(max(1d-12,s% L(k)/get_Ledd(s,k)))
     494              :             case (p_log_abs_v)
     495            0 :                if (s% u_flag) then
     496            0 :                   val = safe_log10(abs(s% u(k)))
     497            0 :                else if (s% v_flag) then
     498            0 :                   val = safe_log10(abs(s% v(k)))
     499              :                end if
     500              : 
     501              :             case (p_superad_reduction_factor)
     502            0 :                val = s% superad_reduction_factor(k)
     503              :             case (p_gradT_excess_effect)
     504            0 :                val = s% gradT_excess_effect(k)
     505              :             case (p_diff_grads)
     506            0 :                val = s% gradr(k) - s% gradL(k)  ! convective if this is > 0
     507              :             case (p_log_diff_grads)
     508            0 :                val = safe_log10(abs(s% gradr(k) - s% gradL(k)))
     509              :             case (p_v)
     510            0 :                if (s% u_flag) then
     511            0 :                   val = s% u(k)
     512            0 :                else if (s% v_flag) then
     513            0 :                   val = s% v(k)
     514              :                end if
     515              :             case (p_velocity)
     516            0 :                if (s% u_flag) then
     517            0 :                   val = s% u(k)
     518            0 :                else if (s% v_flag) then
     519            0 :                   val = s% v(k)
     520              :                end if
     521              :             case (p_v_kms)
     522            0 :                if (s% u_flag) then
     523            0 :                   val = s% u(k)*1d-5
     524            0 :                else if (s% v_flag) then
     525            0 :                   val = s% v(k)*1d-5
     526              :                end if
     527              :             case (p_vel_km_per_s)
     528            0 :                if (s% u_flag) then
     529            0 :                   val = s% u(k)*1d-5
     530            0 :                else if (s% v_flag) then
     531            0 :                   val = s% v(k)*1d-5
     532              :                end if
     533              :             case (p_v_div_r)
     534            0 :                if (s% u_flag) then
     535            0 :                   val = s% u_face_ad(k)%val/s% r(k)
     536            0 :                else if (s% v_flag) then
     537            0 :                   val = s% v(k)/s% r(k)
     538              :                end if
     539              : 
     540              :             case (p_v_times_t_div_r)
     541            0 :                if (s% u_flag) then
     542            0 :                   val = s% u_face_ad(k)%val*s% time/s% r(k)
     543            0 :                else if (s% v_flag) then
     544            0 :                   val = s% v(k)*s% time/s% r(k)
     545              :                end if
     546              :             case (p_radius)
     547            0 :                val = s% r(k)/Rsun
     548              :             case (p_radius_cm)
     549            0 :                val = s% r(k)
     550              :             case (p_radius_km)
     551            0 :                val = s% r(k)*1d-5
     552              :             case (p_rmid)
     553            0 :                val = s% rmid(k)/Rsun
     554              :             case (p_logR_cm)
     555            0 :                val = safe_log10(s% r(k))
     556              :             case (p_logR)
     557         3456 :                val = safe_log10(s% r(k)/Rsun)
     558              :             case (p_psi_roche)
     559            0 :                if (.not. associated(s% binary_get_roche_potential)) then
     560            0 :                   val = -99d0
     561              :                else
     562            0 :                   call s% binary_get_roche_potential(s% id, s% r(k), val, ierr)
     563              :                end if
     564              : 
     565              :             case (p_q)
     566            0 :                val = s% q(k)
     567              :             case (p_log_q)
     568            0 :                val = safe_log10(s% q(k))
     569              :             case (p_dq)
     570            0 :                val = s% dq(k)
     571              :             case (p_log_dq)
     572            0 :                val = safe_log10(s% dq(k))
     573              :             case (p_mass)
     574         3456 :                val = s% m(k)/Msun
     575              :             case (p_log_mass)
     576            0 :                val = safe_log10(s% m(k)/Msun)
     577              :             case (p_mass_grams)
     578            0 :                val = s% m(k)
     579              :             case (p_mmid)
     580            0 :                val = (s% M_center + s% xmstar*(s% q(k) - s% dq(k)/2))/Msun
     581              : 
     582              :             case (p_dm)
     583            0 :                val = s% dm(k)
     584              :             case (p_dm_bar)
     585            0 :                val = s% dm_bar(k)
     586              : 
     587              :             case (p_m_div_r)
     588            0 :                val = s% m(k)/s% r(k)
     589              :             case (p_dmbar_m_div_r)
     590            0 :                val = s% dm_bar(k)*s% m(k)/s% r(k)
     591              :             case (p_log_dmbar_m_div_r)
     592            0 :                val = safe_log10(s% dm_bar(k)*s% m(k)/s% r(k))
     593              : 
     594              :             case (p_m_grav)
     595            0 :                val = s% m_grav(k)/Msun
     596              :             case (p_m_grav_div_m_baryonic)
     597            0 :                val = s% m_grav(k)/s% m(k)
     598              :             case (p_mass_correction_factor)
     599            0 :                val = s% mass_correction(k)
     600              : 
     601              :             case (p_xr)
     602            0 :                val = (s% r(1) - s% r(k))/Rsun
     603              :             case (p_xr_cm)
     604            0 :                val = s% r(1) - s% r(k)
     605              :             case (p_xr_div_R)
     606            0 :                val = (s% r(1) - s% r(k))/s% r(1)
     607              :             case (p_log_xr)
     608            0 :                val = safe_log10((s% r(1) - s% r(k))/Rsun)
     609              :             case (p_log_xr_cm)
     610            0 :                val = safe_log10(s% r(1) - s% r(k))
     611              :             case (p_log_xr_div_R)
     612            0 :                val = safe_log10((s% r(1) - s% r(k))/s% r(1))
     613              : 
     614              :             case (p_x)
     615            0 :                val = s% X(k)
     616              :             case (p_log_x)
     617            0 :                val = safe_log10(s% X(k))
     618              :             case (p_y)
     619            0 :                val = s% Y(k)
     620              :             case (p_log_y)
     621            0 :                val = safe_log10(s% Y(k))
     622              :             case (p_z)
     623            0 :                val = s% Z(k)
     624              :             case (p_log_z)
     625            0 :                val = safe_log10(s% Z(k))
     626              :             case (p_xm)
     627            0 :                val = sum(s% dm(1:k-1))/Msun
     628              :             case (p_logxm)
     629            0 :                val = safe_log10(sum(s% dm(1:k-1))/Msun)
     630              :             case (p_xq)
     631            0 :                val = sum(s% dq(1:k-1))
     632              :             case (p_logxq)
     633            0 :                val = safe_log10(sum(s% dq(1:k-1)))
     634              :             case (p_logdq)
     635            0 :                val = safe_log10(s% dq(k))
     636              :             case (p_log_column_depth)
     637            0 :                val = safe_log10(s% xmstar*sum(s% dq(1:k-1))/(pi4*s% r(k)*s% r(k)))
     638              :             case (p_log_radial_depth)
     639            0 :                val = safe_log10(s% r(1) - s% r(k))
     640              : 
     641              :             case (p_r_div_R)
     642            0 :                val = s% r(k)/s% r(1)
     643              :             case (p_log_dr)
     644            0 :                if (k == s% nz) then
     645            0 :                   val = s% r(k) - s% R_center
     646              :                else
     647            0 :                   val = s% r(k) - s% r(k+1)
     648              :                end if
     649            0 :                val = safe_log10(val)
     650              :             case (p_dlogR)
     651            0 :                if (k == s% nz) then
     652            0 :                   val = s% lnR(k) - log(max(1d0,s% R_center))
     653              :                else
     654            0 :                   val = s% lnR(k) - s% lnR(k+1)
     655              :                end if
     656            0 :                val = val/ln10
     657              :             case (p_dr_div_rmid)
     658            0 :                if (k == s% nz) then
     659            0 :                   val = s% r(k) - s% R_center
     660              :                else
     661            0 :                   val = s% r(k) - s% r(k+1)
     662              :                end if
     663            0 :                val = val/s% rmid(k)
     664              :             case (p_log_dr_div_rmid)
     665            0 :                if (k == s% nz) then
     666            0 :                   val = s% r(k) - s% R_center
     667              :                else
     668            0 :                   val = s% r(k) - s% r(k+1)
     669              :                end if
     670            0 :                val = safe_log10(val/s% rmid(k))
     671              :             case (p_log_acoustic_radius)
     672            0 :                val = safe_log10(sum(s% dr_div_csound(k:nz)))
     673              :             case (p_acoustic_radius)
     674            0 :                val = sum(s% dr_div_csound(k:nz))
     675              :             case (p_log_acoustic_depth)
     676            0 :                if (k > 1) &
     677            0 :                   val = sum(s% dr_div_csound(1:k-1))
     678            0 :                val = safe_log10(val)
     679              :             case (p_acoustic_depth)
     680            0 :                if (k > 1) &
     681            0 :                   val = sum(s% dr_div_csound(1:k-1))
     682              :             case (p_acoustic_r_div_R_phot)
     683            0 :                val = sum(s% dr_div_csound(k:nz))/s% photosphere_acoustic_r
     684              : 
     685              :             case (p_ergs_error)
     686            0 :                val = s% ergs_error(k)
     687              :             case (p_log_rel_E_err)
     688            0 :                val = safe_log10(abs(s% ergs_error(k)/s% total_energy_start))
     689              :             case (p_ergs_error_integral)
     690            0 :                val = sum(s% ergs_error(1:k))
     691              :             case (p_ergs_rel_error_integral)
     692            0 :                if (s% total_energy_end /= 0d0) &
     693            0 :                   val = sum(s% ergs_error(1:k))/s% total_energy_end
     694              : 
     695              :             case (p_cell_internal_energy_fraction)
     696            0 :                val = s% energy(k)*s% dm(k)/s% total_internal_energy_end
     697              :             case (p_cell_internal_energy_fraction_start)
     698            0 :                val = s% energy_start(k)*s% dm(k)/s% total_internal_energy_start
     699              : 
     700              :             case (p_dr_div_R)
     701            0 :                if (k < s% nz) then
     702            0 :                   val = (s% r(k) - s% r(k+1))/s% r(1)
     703              :                else
     704            0 :                   val = (s% r(k) - s% r_center)/s% r(1)
     705              :                end if
     706              :             case (p_dRstar_div_dr)
     707            0 :                if (k < s% nz) then
     708            0 :                   val = (s% r(1) - s% R_center)/(s% r(k) - s% r(k+1))
     709              :                else
     710            0 :                   val = (s% r(1) - s% R_center)/(s% r(k) - s% r_center)
     711              :                end if
     712              :             case (p_log_dr_div_R)
     713            0 :                if (k < s% nz) then
     714            0 :                   val = (s% r(k) - s% r(k+1))/s% r(1)
     715              :                else
     716            0 :                   val = (s% r(k) - s% r_center)/s% r(1)
     717              :                end if
     718            0 :                val = safe_log10(val)
     719              : 
     720              :             case(p_t_rad)
     721            0 :                val = 1d0/(clight*s% opacity(k)*s% rho(k))
     722              :             case(p_log_t_rad)
     723            0 :                val = log10(1d0/(clight*s% opacity(k)*s% rho(k)))
     724              :             case (p_dt_cs_div_dr)
     725            0 :                if (k < s% nz) then
     726            0 :                   val = s% r(k) - s% r(k+1)
     727              :                else
     728            0 :                   val = s% r(k) - s% r_center
     729              :                end if
     730            0 :                val = s% dt*s% csound(k)/val
     731              :             case (p_log_dt_cs_div_dr)
     732            0 :                if (k < s% nz) then
     733            0 :                   val = s% r(k) - s% r(k+1)
     734              :                else
     735            0 :                   val = s% r(k) - s% r_center
     736              :                end if
     737            0 :                val = s% dt*s% csound(k)/val
     738            0 :                val = safe_log10(val)
     739              :             case (p_dr_div_cs)
     740            0 :                if (k == s% nz) then
     741            0 :                   val = s% r(k) - s% R_center
     742              :                else
     743            0 :                   val = s% r(k) - s% r(k+1)
     744              :                end if
     745            0 :                val = val/s% csound(k)
     746              :             case (p_log_dr_div_cs)
     747            0 :                if (k == s% nz) then
     748            0 :                   val = s% r(k) - s% R_center
     749              :                else
     750            0 :                   val = s% r(k) - s% r(k+1)
     751              :                end if
     752            0 :                val = safe_log10(val/s% csound(k))
     753              : 
     754              :             case (p_dr_div_cs_yr)
     755            0 :                if (k == s% nz) then
     756            0 :                   val = s% r(k) - s% R_center
     757              :                else
     758            0 :                   val = s% r(k) - s% r(k+1)
     759              :                end if
     760            0 :                val = val/s% csound(k)/secyer
     761              :             case (p_log_dr_div_cs_yr)
     762            0 :                if (k == s% nz) then
     763            0 :                   val = s% r(k) - s% R_center
     764              :                else
     765            0 :                   val = s% r(k) - s% r(k+1)
     766              :                end if
     767            0 :                val = safe_log10(val/s% csound(k)/secyer)
     768              : 
     769              :             case (p_pgas_div_ptotal)
     770            0 :                val = s% Pgas(k)/s% Peos(k)
     771              :             case (p_prad_div_pgas)
     772            0 :                val = s% Prad(k)/s% Pgas(k)
     773              :             case(p_prad_div_pgas_div_L_div_Ledd)
     774            0 :                val = (s% Prad(k)/s% Pgas(k))/max(1d-12,s% L(k)/get_Ledd(s,k))
     775              :             case (p_pgas_div_p)
     776            0 :                val = s% Pgas(k)/s% Peos(k)
     777              :             case (p_flux_limit_R)
     778            0 :                if (s% use_dPrad_dm_form_of_T_gradient_eqn .and. k > 1) &
     779            0 :                   val = s% flux_limit_R(k)
     780              :             case (p_flux_limit_lambda)
     781            0 :                if (s% use_dPrad_dm_form_of_T_gradient_eqn .and. k > 1) then
     782            0 :                   val = s% flux_limit_lambda(k)
     783              :                else
     784            0 :                   val = 1d0
     785              :                end if
     786              :             case (p_cell_collapse_time)
     787            0 :                if (s% v_flag) then
     788            0 :                   if (k == s% nz) then
     789            0 :                      rp1 = s% R_center
     790            0 :                      vp1 = s% v_center
     791              :                   else
     792            0 :                      rp1 = s% r(k+1)
     793            0 :                      vp1 = s% v(k+1)
     794              :                   end if
     795            0 :                   r00 = s% r(k)
     796            0 :                   v00 = s% v(k)
     797            0 :                   if (vp1 > v00) val = (r00 - rp1)/(vp1 - v00)
     798              :                end if
     799              : 
     800              :             case (p_log_cell_collapse_time)
     801            0 :                if (s% v_flag) then
     802            0 :                   if (k == s% nz) then
     803            0 :                      rp1 = s% R_center
     804            0 :                      vp1 = s% v_center
     805              :                   else
     806            0 :                      rp1 = s% r(k+1)
     807            0 :                      vp1 = s% v(k+1)
     808              :                   end if
     809            0 :                   r00 = s% r(k)
     810            0 :                   v00 = s% v(k)
     811            0 :                   if (vp1 > v00) val = (r00 - rp1)/(vp1 - v00)
     812              :                end if
     813            0 :                val = safe_log10(val)
     814              : 
     815              :             case (p_dq_ratio)
     816            0 :                if (k == 1 .or. k == s% nz) then
     817            0 :                   val = 1
     818              :                else
     819            0 :                   val = s% dq(k-1)/s% dq(k)
     820              :                end if
     821              : 
     822              :             case (p_compression_gradient)
     823            0 :                if (k == 1) then
     824              :                   val = s% rho_start(1)*&
     825            0 :                      ((1/s% rho(1) - 1/s% rho_start(1)) - (1/s% rho(2) - 1/s% rho_start(2)))
     826              :                else
     827              :                   val = s% rho_start(k-1)*&
     828            0 :                      ((1/s% rho(k-1) - 1/s% rho_start(k-1)) - (1/s% rho(k) - 1/s% rho_start(k)))
     829              :                end if
     830              : 
     831              :             case (p_tau)
     832            0 :                val = s% tau(k)
     833              :             case (p_logtau)
     834            0 :                val = safe_log(s% tau(k))/ln10
     835              :             case (p_xtau)
     836            0 :                val = s% tau(nz) - s% tau(k)
     837              :             case (p_xlogtau)
     838            0 :                val = safe_log10(s% tau(nz) - s% tau(k))
     839              :             case (p_logtau_sub_xlogtau)
     840            0 :                val = safe_log10(s% tau(k)) - safe_log10(s% tau(nz) - s% tau(k))
     841              : 
     842              :             case (p_tau_eff)
     843            0 :                val = tau_eff(s,k)
     844              :             case (p_tau_eff_div_tau)
     845            0 :                val = tau_eff(s,k)/s% tau(k)
     846              : 
     847              :             case (p_kap_frac_lowT)
     848            0 :                val = s% kap_frac_lowT(k)
     849              :             case (p_kap_frac_highT)
     850            0 :                val = s% kap_frac_highT(k)
     851              :             case (p_kap_frac_Type2)
     852            0 :                val = s% kap_frac_Type2(k)
     853              :             case (p_kap_frac_Compton)
     854            0 :                val = s% kap_frac_Compton(k)
     855              :             case (p_kap_frac_op_mono)
     856            0 :                val = s% kap_frac_op_mono(k)
     857              :             case (p_log_kap)
     858            0 :                val = safe_log10(s% opacity(k))
     859              :             case (p_log_opacity)
     860            0 :                val = safe_log10(s% opacity(k))
     861              :             case (p_extra_opacity_factor)
     862            0 :                val = s% extra_opacity_factor(k)
     863              :             case (p_log_kap_times_factor)
     864            0 :                val = safe_log10(s% opacity(k)*s% extra_opacity_factor(k))
     865              :             case (p_energy)
     866            0 :                val = s% energy(k)
     867              :             case (p_logM)
     868            0 :                val = safe_log10(s% m(k)/Msun)
     869              :             case (p_temperature)
     870            0 :                val = s% T(k)
     871              :             case (p_logT)
     872         3456 :                val = s% lnT(k)/ln10
     873              : 
     874              :             case (p_logT_face)
     875            0 :                if (k == 1) then
     876            0 :                   val = safe_log10(s% T_surf)
     877              :                else
     878              :                   val = (s% dq(k-1)*s% lnT(k) + &
     879            0 :                          s% dq(k)*s% lnT(k-1))/(s% dq(k-1) + s% dq(k))/ln10
     880              :                end if
     881              :             case (p_logT_bb)
     882              :                val = safe_log10( &
     883            0 :                         pow(s% L(k)/(pi4*s% r(k)*s% r(k)*boltz_sigma), 0.25d0))
     884              :             case (p_logT_face_div_logT_bb)
     885            0 :                if (k == 1) then
     886            0 :                   val = safe_log10(s% Teff)
     887              :                else
     888              :                   val = (s% dq(k-1)*s% lnT(k) + &
     889            0 :                          s% dq(k)*s% lnT(k-1))/(s% dq(k-1) + s% dq(k))/ln10
     890              :                end if
     891              :                val = val / safe_log10( &
     892            0 :                         pow(s% L(k)/(pi4*s% r(k)*s% r(k)*boltz_sigma), 0.25d0))
     893              : 
     894              :             case (p_density)
     895            0 :                val = s% rho(k)
     896              :             case (p_rho)
     897            0 :                val = s% rho(k)
     898              :             case (p_logRho)
     899         3456 :                val = s% lnd(k)/ln10
     900              :             case (p_pgas)
     901            0 :                val = s% Pgas(k)
     902              :             case (p_logPgas)
     903            0 :                val = s% lnPgas(k)/ln10
     904              :             case (p_prad)
     905            0 :                val = s% Prad(k)
     906              :             case (p_pressure)
     907            0 :                val = s% Peos(k)
     908              :             case (p_logP)
     909         3456 :                val = s% lnPeos(k)/ln10
     910              :             case (p_logE)
     911            0 :                val = s% lnE(k)/ln10
     912              :             case (p_grada)
     913            0 :                val = s% grada(k)
     914              :             case (p_dE_dRho)
     915            0 :                val = s% dE_dRho(k)
     916              :             case (p_cv)
     917            0 :                val = s% Cv(k)
     918              :             case (p_cp)
     919            0 :                val = s% cp(k)
     920              : 
     921              :             case (p_thermal_time_to_surface)
     922            0 :                if (s% L(1) > 0) &
     923            0 :                   val = sum(s% dm(1:k)*s% cp(1:k)*s% T(1:k))/s% L(1)
     924              :             case (p_log_thermal_time_to_surface)
     925            0 :                if (s% L(1) > 0) then
     926            0 :                   val = sum(s% dm(1:k)*s% cp(1:k)*s% T(1:k))/s% L(1)
     927            0 :                   val = safe_log10(val)
     928              :                end if
     929              : 
     930              :             case (p_log_CpT)
     931            0 :                val = safe_log10(s% cp(k)*s% T(k))
     932              :             case (p_log_CpT_absMdot_div_L)
     933            0 :                val = safe_log10(s% cp(k)*s% T(k)*abs(s% mstar_dot)/max(1d-99,s% L(k)))
     934              :             case (p_logS)
     935            0 :                val = s% lnS(k)/ln10
     936              :             case (p_logS_per_baryon)
     937            0 :                val = s% lnS(k)/ln10 + log10(amu)
     938              :             case (p_gamma1)
     939            0 :                val = s% gamma1(k)
     940              :             case (p_gamma3)
     941            0 :                val = s% gamma3(k)
     942              :             case (p_eta)
     943            0 :                val = s% eta(k)
     944              :             case (p_gam)
     945            0 :                val = s% gam(k)
     946              :             case (p_mu)
     947            0 :                val = s% mu(k)
     948              : 
     949              :             case (p_eos_frac_OPAL_SCVH)
     950            0 :                val = s% eos_frac_OPAL_SCVH(k)
     951              :             case (p_eos_frac_HELM)
     952            0 :                val = s% eos_frac_HELM(k)
     953              :             case (p_eos_frac_Skye)
     954            0 :                val = s% eos_frac_Skye(k)
     955              :             case (p_eos_frac_PC)
     956            0 :                val = s% eos_frac_PC(k)
     957              :             case (p_eos_frac_FreeEOS)
     958            0 :                val = s% eos_frac_FreeEOS(k)
     959              :             case (p_eos_frac_CMS)
     960            0 :                val = s% eos_frac_CMS(k)
     961              :             case (p_eos_frac_ideal)
     962            0 :                val = s% eos_frac_ideal(k)
     963              : 
     964              :             case (p_log_c_div_tau)
     965            0 :                val = safe_log10(clight/s% tau(k))
     966              :             case (p_log_v_escape)
     967            0 :                val = safe_log10(sqrt(2*s% cgrav(k)*s% m(k)/(s% r(k))))
     968              :             case (p_v_div_vesc)
     969            0 :                if (s% u_flag) then
     970            0 :                   val = s% u(k)
     971            0 :                else if (s% v_flag) then
     972            0 :                   val = s% v(k)
     973              :                end if
     974            0 :                val = val/sqrt(2*s% cgrav(k)*s% m(k)/(s% r(k)))
     975              :             case (p_v_div_v_escape)
     976            0 :                if (s% u_flag) then
     977            0 :                   val = s% u_face_ad(k)%val
     978            0 :                else if (s% v_flag) then
     979            0 :                   val = s% v(k)
     980              :                end if
     981            0 :                val = val/sqrt(2d0*s% cgrav(k)*s% m(k)/(s% r(k)))
     982              :             case (p_v_div_cs)
     983            0 :                val = s% v_div_csound(k)
     984              :             case (p_v_div_csound)
     985            0 :                val = s% v_div_csound(k)
     986              :             case (p_log_csound)
     987            0 :                val = safe_log10(s% csound(k))
     988              :             case (p_csound)
     989            0 :                val = s% csound(k)
     990              :             case (p_csound_face)
     991            0 :                val = s% csound_face(k)
     992              :             case (p_scale_height)
     993            0 :                val = s% scale_height(k)/Rsun
     994              :             case (p_entropy)
     995            0 :                val = s% entropy(k)
     996              :             case (p_free_e)
     997            0 :                val = exp(s% lnfree_e(k))
     998              :             case (p_logfree_e)
     999            0 :                val = s% lnfree_e(k)/ln10
    1000              :             case (p_chiRho)
    1001            0 :                val = s% chiRho(k)
    1002              :             case (p_chiT)
    1003            0 :                val = s% chiT(k)
    1004              :             case (p_QQ)
    1005            0 :                val = s% QQ(k)
    1006              : 
    1007              :             case (p_eos_phase)
    1008            0 :                val = s% phase(k)
    1009              :             case (p_latent_ddlnT)
    1010            0 :                val = s% latent_ddlnT(k)
    1011              :             case (p_latent_ddlnRho)
    1012            0 :                val = s% latent_ddlnRho(k)
    1013              : 
    1014              :             case (p_chiRho_for_partials)
    1015            0 :                val = s% chiRho_for_partials(k)
    1016              :             case (p_chiT_for_partials)
    1017            0 :                val = s% chiT_for_partials(k)
    1018              :             case (p_rel_diff_chiRho_for_partials)
    1019            0 :                val = (s% chiRho_for_partials(k) - s% chiRho(k))/s% chiRho(k)
    1020              :             case (p_rel_diff_chiT_for_partials)
    1021            0 :                val = (s% chiT_for_partials(k) - s% chiT(k))/s% chiT(k)
    1022              : 
    1023              :             case (p_x_mass_fraction_H)
    1024         3456 :                val = s% X(k)
    1025              :             case (p_y_mass_fraction_He)
    1026         3456 :                val = s% Y(k)
    1027              :             case (p_z_mass_fraction_metals)
    1028         3456 :                val = s% Z(k)
    1029              : 
    1030              :             case (p_abar)
    1031            0 :                val = s% abar(k)
    1032              :             case (p_zbar)
    1033            0 :                val = s% zbar(k)
    1034              :             case (p_z2bar)
    1035            0 :                val = s% z2bar(k)
    1036              :             case (p_ye)
    1037            0 :                val = s% ye(k)
    1038              :             case (p_opacity)
    1039            0 :                val = s% opacity(k)
    1040              :             case (p_dkap_dlnrho_face)
    1041            0 :                val = interp_val_to_pt(s% d_opacity_dlnd,k,nz,s% dq,'p_dkap_dlnrho_face')
    1042              :             case (p_dkap_dlnT_face)
    1043            0 :                val = interp_val_to_pt(s% d_opacity_dlnT,k,nz,s% dq,'p_dkap_dlnT_face')
    1044              : 
    1045              :             case (p_eps_nuc)
    1046            0 :                val = s% eps_nuc(k)
    1047              :             case (p_signed_log_eps_nuc)
    1048            0 :                val = s% eps_nuc(k)
    1049            0 :                val = sign(1d0,val)*log10(max(1d0,abs(val)))
    1050              :             case (p_log_abs_eps_nuc)
    1051            0 :                val = safe_log10(abs(s% eps_nuc(k)))
    1052              :             case (p_d_epsnuc_dlnd)
    1053            0 :                val = s% d_epsnuc_dlnd(k)
    1054              :             case (p_d_lnepsnuc_dlnd)
    1055            0 :                val = s% d_epsnuc_dlnd(k)/max(1d0,abs(s% eps_nuc(k)))
    1056              :             case (p_d_epsnuc_dlnT)
    1057            0 :                val = s% d_epsnuc_dlnT(k)
    1058              :             case (p_d_lnepsnuc_dlnT)
    1059            0 :                val = s% d_epsnuc_dlnT(k)/max(1d0,abs(s% eps_nuc(k)))
    1060              : 
    1061              :             case (p_deps_dlnd_face)
    1062            0 :                val = interp_val_to_pt(s% d_epsnuc_dlnd,k,nz,s% dq,'p_deps_dlnd_face')
    1063              :             case (p_deps_dlnT_face)
    1064            0 :                val = interp_val_to_pt(s% d_epsnuc_dlnT,k,nz,s% dq,'p_deps_dlnT_face')
    1065              :             case (p_eps_nuc_neu_total)
    1066            0 :                val = s% eps_nuc_neu_total(k)
    1067              :             case (p_non_nuc_neu)
    1068            0 :                val = s% non_nuc_neu(k)
    1069              :             case (p_nonnucneu_plas)
    1070            0 :                val = s% nonnucneu_plas(k)
    1071              :             case (p_nonnucneu_brem)
    1072            0 :                val = s% nonnucneu_brem(k)
    1073              :             case (p_nonnucneu_phot)
    1074            0 :                val = s% nonnucneu_phot(k)
    1075              :             case (p_nonnucneu_pair)
    1076            0 :                val = s% nonnucneu_pair(k)
    1077              :             case (p_nonnucneu_reco)
    1078            0 :                val = s% nonnucneu_reco(k)
    1079              : 
    1080              :             case (p_log_irradiation_heat)
    1081            0 :                val = safe_log10(s% irradiation_heat(k))
    1082              :             case (p_cgrav_factor)
    1083            0 :                val = s% cgrav(k)/standard_cgrav
    1084              :             case (p_alpha_mlt)
    1085            0 :                val = s% alpha_mlt(k)
    1086              : 
    1087              :             case (p_extra_jdot)
    1088            0 :                val = s% extra_jdot(k)
    1089              :             case (p_extra_omegadot)
    1090            0 :                val = s% extra_omegadot(k)
    1091              :             case (p_extra_heat)
    1092            0 :                val = s% extra_heat(k)%val
    1093              :             case (p_extra_grav)
    1094            0 :                val = s% extra_grav(k)%val
    1095              :             case (p_extra_L)
    1096            0 :                val = dot_product(s% dm(k:s% nz),s% extra_heat(k:s% nz)%val)/Lsun
    1097              :             case (p_log_extra_L)
    1098              :                val = safe_log10( &
    1099            0 :                   dot_product(s% dm(k:s% nz),s% extra_heat(k:s% nz)%val)/Lsun)
    1100              : 
    1101              :             case (p_log_abs_eps_grav_dm_div_L)
    1102              :                val = safe_log10( &
    1103            0 :                   abs(s% eps_grav_ad(k)% val)*s% dm(k)/max(1d0,abs(s% L(k))))
    1104              : 
    1105              :             case (p_eps_grav_composition_term)
    1106            0 :                if (s% include_composition_in_eps_grav) &
    1107            0 :                   val = s% eps_grav_composition_term(k)
    1108              : 
    1109              :             case (p_eps_grav_plus_eps_mdot)
    1110            0 :                val = s% eps_grav_ad(k)% val + s% eps_mdot(k)
    1111              :             case (p_ergs_eps_grav_plus_eps_mdot)
    1112            0 :                val = (s% eps_grav_ad(k)% val + s% eps_mdot(k))*s% dm(k)*s% dt
    1113              : 
    1114              :             case (p_eps_mdot)
    1115            0 :                val = s% eps_mdot(k)
    1116              :             case (p_ergs_mdot)
    1117            0 :                val = s% eps_mdot(k)*s% dm(k)*s% dt
    1118              : 
    1119              :             case (p_div_v)
    1120            0 :                if (s% v_flag) then
    1121            0 :                   if (k == s% nz) then
    1122            0 :                      vp1 = s% V_center
    1123            0 :                      Ap1 = pi4*s% R_center*s% R_center
    1124              :                   else
    1125            0 :                      vp1 = s% v(k+1)
    1126            0 :                      Ap1 = pi4*s% r(k+1)*s% r(k+1)
    1127              :                   end if
    1128            0 :                   val = (pi4*s% r(k)*s% r(k)*s% v(k) - Ap1*vp1)*s% rho(k)/s% dm(k)
    1129              :                end if
    1130              : 
    1131              :             case (p_d_v_div_r_dm)
    1132            0 :                if (s% v_flag) then
    1133            0 :                   if (k == s% nz) then
    1134            0 :                      vp1 = s% V_center
    1135            0 :                      rp1 = s% R_center
    1136              :                   else
    1137            0 :                      vp1 = s% v(k+1)
    1138            0 :                      rp1 = s% r(k+1)
    1139              :                   end if
    1140            0 :                   v00 = s% v(k)
    1141            0 :                   r00 = s% r(k)
    1142            0 :                   if (rp1 > 0) then
    1143            0 :                      val = (v00/r00 - vp1/rp1)/s% dm(k)
    1144              :                   end if
    1145              :                end if
    1146              : 
    1147              :             case (p_d_v_div_r_dr)
    1148            0 :                if (s% v_flag) then
    1149            0 :                   if (k == s% nz) then
    1150            0 :                      vp1 = s% V_center
    1151            0 :                      rp1 = s% R_center
    1152              :                   else
    1153            0 :                      vp1 = s% v(k+1)
    1154            0 :                      rp1 = s% r(k+1)
    1155              :                   end if
    1156            0 :                   v00 = s% v(k)
    1157            0 :                   r00 = s% r(k)
    1158            0 :                   if (rp1 > 0) then
    1159              :                      val = pi4*s% rmid(k)*s% rmid(k)*s% rho(k)* &
    1160            0 :                            (v00/r00 - vp1/rp1)/s% dm(k)
    1161              :                   end if
    1162              :                end if
    1163              : 
    1164              :             case (p_rho_times_r3)
    1165            0 :                val = s% rho_face(k)*s% r(k)*s% r(k)*s% r(k)
    1166              :             case (p_log_rho_times_r3)
    1167            0 :                val = safe_log10(s% rho_face(k)*s% r(k)*s% r(k)*s% r(k))
    1168              : 
    1169              :             case(p_du)
    1170            0 :                if (s% u_flag) then
    1171            0 :                   if (k == s% nz) then
    1172            0 :                      val = s% u(k)
    1173              :                   else
    1174            0 :                      val = s% u(k) - s% u(k+1)
    1175              :                   end if
    1176              :                end if
    1177              : 
    1178              :             case(p_P_face)
    1179            0 :                if (s% u_flag) val = s% P_face_ad(k)%val
    1180              :             case(p_log_P_face)
    1181            0 :                if (s% u_flag) val = safe_log10(s% P_face_ad(k)%val)
    1182              : 
    1183              :             case (p_dPdr_div_grav)
    1184            0 :                if (k > 1 .and. k < nz .and. s% cgrav(k) > 0d0 .and. s% RTI_flag) then
    1185            0 :                   val = s% dPdr_info(k)/s% rho_face(k)
    1186              :                end if
    1187              : 
    1188              :             case (p_gradP_div_rho)
    1189            0 :                if (k > 1) val = pi4*s% r(k)*s% r(k)*(s% Peos(k-1) - s% Peos(k))/s% dm_bar(k)
    1190              :             case (p_dlnP_dlnR)
    1191            0 :                if (k > 1) val = log(s% P_face_ad(k-1)%val/s% P_face_ad(k)%val) / (s% lnR(k-1) - s% lnR(k))
    1192              :             case (p_dlnRho_dlnR)
    1193            0 :                if (k > 1) val = log(s% rho_face(k-1)/s% rho_face(k)) / (s% lnR(k-1) - s% lnR(k))
    1194              : 
    1195              :             case (p_dvdt_grav)
    1196            0 :                   val = -s% cgrav(k)*s% m(k)/(s% r(k)*s% r(k))
    1197              :             case (p_grav_eff)
    1198            0 :                   int_val = if_rot_ad(s% fp_rot,k, alt=1.0d0)
    1199            0 :                   val = s% dxh_v(k)/s%dt / (int_val * s% cgrav(k) * s% m(k) /(s% r(k)*s% r(k)))
    1200              :             case (p_dvdt_dPdm)
    1201            0 :                if (k > 1) val = -pi4*s% r(k)*s% r(k)*(s% Peos(k-1) - s% Peos(k))/s% dm_bar(k)
    1202              : 
    1203              :             case (p_dm_eps_grav)
    1204            0 :                val = s% eps_grav_ad(k)% val*s% dm(k)
    1205              :             case (p_eps_grav)
    1206            0 :                val = s% eps_grav_ad(k)% val
    1207              : 
    1208              :             case (p_log_xm_div_delta_m)
    1209            0 :                if(abs(s% dt*s% mstar_dot) > 0) val = safe_log10((s% m(1) - s% m(k))/abs(s% dt*s% mstar_dot))
    1210              :             case (p_xm_div_delta_m)
    1211            0 :                if(abs(s% dt*s% mstar_dot) > 0) val = (s% m(1) - s% m(k))/abs(s% dt*s% mstar_dot)
    1212              : 
    1213              :             case (p_env_eps_grav)
    1214              :                val = -s% gradT_sub_grada(k)*s% grav(k)*s% mstar_dot*s% Cp(k)*s% T(k) / &
    1215            0 :                         (pi4*s% r(k)*s% r(k)*s% Peos(k))
    1216              : 
    1217              :             case (p_mlt_mixing_type)
    1218            0 :                int_val = s% mlt_mixing_type(k)
    1219            0 :                val = dble(int_val)
    1220            0 :                int_flag = .true.
    1221              :             case (p_mlt_mixing_length)
    1222            0 :                val = s% mlt_mixing_length(k)
    1223              :             case (p_mlt_Gamma)
    1224            0 :                val = s% mlt_Gamma(k)
    1225              :             case (p_mlt_Zeta)
    1226            0 :                if (abs(s% gradr(k) - s% grada_face(k)) > 1d-20) &
    1227            0 :                   val = (s% gradr(k) - s% gradT(k))/(s% gradr(k) - s% grada_face(k))
    1228              :             case (p_mlt_Pturb)
    1229            0 :                if (s% mlt_Pturb_factor > 0d0 .and. s% okay_to_set_mlt_vc) then
    1230            0 :                 if (s% mlt_vc_old(k) > 0d0) &
    1231            0 :                   val = s% mlt_Pturb_factor*pow2(s% mlt_vc(k))*get_rho_face_val(s,k)/3d0
    1232              :                end if
    1233              :             case (p_grad_density)
    1234            0 :                val = s% grad_density(k)
    1235              :             case (p_grad_temperature)
    1236            0 :                val = s% grad_temperature(k)
    1237              : 
    1238              :             case (p_gradL_sub_gradr)
    1239            0 :                val = s% gradL(k) - s% gradr(k)
    1240              :             case (p_grada_sub_gradr)
    1241            0 :                val = s% grada_face(k) - s% gradr(k)
    1242              : 
    1243              :             case (p_gradL)
    1244            0 :                val = s% gradL(k)
    1245              :             case (p_sch_stable)
    1246            0 :                if (s% grada(k) > s% gradr(k)) val = 1
    1247              :             case (p_ledoux_stable)
    1248            0 :                if (s% gradL(k) > s% gradr(k)) val = 1
    1249              : 
    1250              :             case (p_eps_nuc_start)
    1251            0 :                val = s% eps_nuc_start(k)
    1252              : 
    1253              :             case (p_dominant_isoA_for_thermohaline)
    1254            0 :                int_val = chem_isos% Z_plus_N(s% dominant_iso_for_thermohaline(k))
    1255            0 :                int_flag = .true.
    1256              :             case (p_dominant_isoZ_for_thermohaline)
    1257            0 :                int_val = chem_isos% Z(s% dominant_iso_for_thermohaline(k))
    1258            0 :                int_flag = .true.
    1259              :             case (p_gradL_composition_term)
    1260            0 :                val = s% gradL_composition_term(k)
    1261              : 
    1262              :             case (p_log_D_conv)
    1263            0 :                if (s% mixing_type(k) == convective_mixing) then
    1264            0 :                   val = safe_log10(s% D_mix_non_rotation(k))
    1265              :                else
    1266            0 :                   val = -99
    1267              :                end if
    1268              :             case (p_log_D_leftover)
    1269            0 :                if (s% mixing_type(k) == leftover_convective_mixing) then
    1270            0 :                   val = safe_log10(s% D_mix_non_rotation(k))
    1271              :                else
    1272            0 :                   val = -99
    1273              :                end if
    1274              :             case (p_log_D_semi)
    1275            0 :                if (s% mixing_type(k) == semiconvective_mixing) then
    1276            0 :                   val = safe_log10(s% D_mix_non_rotation(k))
    1277              :                else
    1278            0 :                   val = -99
    1279              :                end if
    1280              :             case (p_log_D_ovr)
    1281            0 :                if (s% mixing_type(k) == overshoot_mixing) then
    1282            0 :                   val = safe_log10(s% D_mix_non_rotation(k))
    1283              :                else
    1284            0 :                   val = -99
    1285              :                end if
    1286              :             case (p_log_D_rayleigh_taylor)
    1287            0 :                if(s% RTI_flag) then
    1288            0 :                   val = safe_log10(s% eta_RTI(k))
    1289              :                else
    1290            0 :                   val =-99
    1291              :                end if
    1292              :             case (p_log_D_anon)
    1293            0 :                if (s% mixing_type(k) == anonymous_mixing) then
    1294            0 :                   val = safe_log10(s% D_mix_non_rotation(k))
    1295              :                else
    1296            0 :                   val = -99
    1297              :                end if
    1298              :             case (p_log_D_thrm)
    1299            0 :                if (s% mixing_type(k) == thermohaline_mixing) then
    1300            0 :                   val = safe_log10(s% D_mix_non_rotation(k))
    1301              :                else
    1302            0 :                   val = -99
    1303              :                end if
    1304              : 
    1305              :             case (p_log_D_minimum)
    1306            0 :                if (s% mixing_type(k) == minimum_mixing) then
    1307            0 :                   val = safe_log10(s% D_mix(k))
    1308              :                else
    1309            0 :                   val = -99
    1310              :                end if
    1311              : 
    1312              :             case (p_log_lambda_RTI_div_Hrho)
    1313            0 :                if (s% RTI_flag) val = safe_log10( &
    1314            0 :                   sqrt(s% alpha_RTI(k))*s% r(k)/s% rho(k)*abs(s% dRhodr_info(k)))
    1315              :             case (p_lambda_RTI)
    1316            0 :                if (s% RTI_flag) val = sqrt(s% alpha_RTI(k))*s% r(k)
    1317              :             case (p_dPdr_info)
    1318            0 :                if (s% RTI_flag) val = s% dPdr_info(k)
    1319              :             case (p_dRhodr_info)
    1320            0 :                if (s% RTI_flag) val = s% dRhodr_info(k)
    1321              : 
    1322              :             case (p_source_plus_alpha_RTI)
    1323            0 :                if (s% RTI_flag) val = s% source_plus_alpha_RTI(k)
    1324              :             case (p_log_source_plus_alpha_RTI)
    1325            0 :                if (s% RTI_flag) val = safe_log10(s% source_plus_alpha_RTI(k))
    1326              :             case (p_log_source_RTI)
    1327            0 :                if (s% RTI_flag) val = safe_log10(s% source_plus_alpha_RTI(k))
    1328              :             case (p_source_minus_alpha_RTI)
    1329            0 :                if (s% RTI_flag) val = s% source_minus_alpha_RTI(k)
    1330              :             case (p_log_source_minus_alpha_RTI)
    1331            0 :                if (s% RTI_flag) val = safe_log10(abs(s% source_minus_alpha_RTI(k)))
    1332              : 
    1333              :             case (p_dudt_RTI)
    1334            0 :                if (s% RTI_flag) val = s% dudt_RTI(k)
    1335              :             case (p_dedt_RTI)
    1336            0 :                if (s% RTI_flag) val = s% dedt_RTI(k)
    1337              : 
    1338              :             case (p_eta_RTI)
    1339            0 :                if (s% RTI_flag) val = s% eta_RTI(k)
    1340              :             case (p_log_eta_RTI)
    1341            0 :                if (s% RTI_flag) val = safe_log10(abs(s% eta_RTI(k)))
    1342              :             case (p_boost_for_eta_RTI)
    1343            0 :                if (s% RTI_flag) val = s% boost_for_eta_RTI(k)
    1344              :             case (p_log_boost_for_eta_RTI)
    1345            0 :                if (s% RTI_flag) val = safe_log10(abs(s% boost_for_eta_RTI(k)))
    1346              : 
    1347              :             case (p_alpha_RTI)
    1348            0 :                if (s% RTI_flag) val = s% alpha_RTI(k)
    1349              :             case (p_log_alpha_RTI)
    1350            0 :                if (s% RTI_flag) val = safe_log10(s% alpha_RTI(k))
    1351              :             case (p_log_etamid_RTI)
    1352            0 :                if (s% RTI_flag) val = safe_log10(s% etamid_RTI(k))
    1353              : 
    1354              :             case (p_log_sig_RTI)
    1355            0 :                if (s% RTI_flag) val = safe_log10(s% sig_RTI(k))
    1356              :             case (p_log_sigmid_RTI)
    1357            0 :                if (s% RTI_flag) val = safe_log10(s% sigmid_RTI(k))
    1358              : 
    1359              :             case (p_log_D_omega)
    1360            0 :                if (s% rotation_flag) val = safe_log10(s% D_omega(k))
    1361              : 
    1362              :             case (p_log_D_mix_non_rotation)
    1363            0 :                val = safe_log10(s% D_mix_non_rotation(k))
    1364              :             case (p_log_D_mix_rotation)
    1365            0 :                val = safe_log10(s% D_mix(k) - s% D_mix_non_rotation(k))
    1366              :             case (p_log_D_mix)
    1367            0 :                val = safe_log10(s% D_mix(k))
    1368              :             case (p_log_sig_mix)
    1369            0 :                val = safe_log10(s% sig(k))
    1370              :             case (p_log_sig_raw_mix)
    1371            0 :                val = safe_log10(s% sig_raw(k))
    1372              : 
    1373              :             case (p_burn_avg_epsnuc)
    1374            0 :                if (s% op_split_burn) val = s% burn_avg_epsnuc(k)
    1375              :             case (p_log_burn_avg_epsnuc)
    1376            0 :                if (s% op_split_burn) &
    1377            0 :                   val = safe_log10(abs(s% burn_avg_epsnuc(k)))
    1378              :             case (p_burn_num_iters)
    1379            0 :                if (s% op_split_burn) then
    1380            0 :                   int_val = s% burn_num_iters(k); val = dble(int_val)
    1381              :                else
    1382              :                   int_val = 0; val = 0
    1383              :                end if
    1384            0 :                int_flag = .true.
    1385              : 
    1386              :             case (p_conv_vel_div_mlt_vc)
    1387            0 :                if (s% mlt_vc(k) > 0d0) val = s% conv_vel(k)/s% mlt_vc(k)
    1388              : 
    1389              :             case (p_conv_vel)
    1390            0 :                val = s% conv_vel(k)
    1391              :             case (p_dt_times_conv_vel_div_mixing_length)
    1392            0 :                val = s% dt*s% conv_vel(k)/s% mlt_mixing_length(k)
    1393              :             case (p_log_dt_times_conv_vel_div_mixing_length)
    1394            0 :                val = safe_log10(s% dt*s% conv_vel(k)/s% mlt_mixing_length(k))
    1395              :             case (p_log_conv_vel)
    1396            0 :                val = safe_log10(s% conv_vel(k))
    1397              :             case (p_conv_vel_div_L_vel)
    1398            0 :                val = s% conv_vel(k)/max(1d0,get_L_vel(k))
    1399              :             case (p_conv_vel_div_csound)
    1400            0 :                val = s% conv_vel(k)/s% csound_face(k)
    1401              :             case (p_dvc_dt_TDC_div_g)
    1402            0 :                val = s%dvc_dt_TDC(k) / s%grav(k)
    1403              :             case (p_mix_type)
    1404            0 :                val = dble(s% mixing_type(k))
    1405            0 :                int_val = s% mixing_type(k)
    1406            0 :                int_flag = .true.
    1407              :             case (p_mixing_type)
    1408            0 :                val = dble(s% mixing_type(k))
    1409            0 :                int_val = s% mixing_type(k)
    1410            0 :                int_flag = .true.
    1411              :             case (p_log_mlt_D_mix)
    1412            0 :                val = safe_log10(s% mlt_D(k))
    1413              :             case (p_log_t_thermal)
    1414            0 :                val = safe_log10(s% Cp(k)*s% T(k)*(s% m(1) - s% m(k))/s% L(k))
    1415              :             case (p_log_cp_T_div_t_sound)
    1416              :                val = safe_log10( &
    1417            0 :                   s% Cp(k)*s% T(k)/(s% Peos(k)/(s% rho(k)*s% grav(k))/s% csound(k)))
    1418              :             case (p_log_t_sound)
    1419            0 :                val = safe_log10(s% Peos(k)/(s% rho(k)*s% grav(k))/s% csound(k))
    1420              :             case (p_pressure_scale_height)
    1421            0 :                val = s% Peos(k)/(s% rho(k)*s% grav(k))/Rsun
    1422              :             case (p_pressure_scale_height_cm)
    1423            0 :                val = s% Peos(k)/(s% rho(k)*s% grav(k))
    1424              :             case (p_gradT)
    1425            0 :                val = s% gradT(k)
    1426              :             case (p_gradr)
    1427            0 :                val = s% gradr(k)
    1428              :             case (p_grada_sub_gradT)
    1429            0 :                val = s% grada_face(k) - s% gradT(k)
    1430              : 
    1431              :             case (p_omega)
    1432            0 :                val = if_rot(s% omega,k)
    1433              : 
    1434              :             case (p_log_omega)
    1435            0 :                val = safe_log10(if_rot(s% omega,k))
    1436              :             case (p_log_j_rot)
    1437            0 :                val = safe_log10(if_rot(s% j_rot,k))
    1438              :             case (p_log_J_inside)
    1439            0 :                if (s% rotation_flag) then
    1440            0 :                   val = safe_log10(dot_product(s% j_rot(k:s% nz), s% dm(k:s% nz)))
    1441              :                else
    1442            0 :                   val = -99.0d0
    1443              :                end if
    1444              :             case (p_log_J_div_M53)
    1445            0 :                if (s% rotation_flag) then
    1446              :                   val = safe_log10(&
    1447              :                        dot_product(s% j_rot(k:s% nz), s% dm(k:s% nz)) * &
    1448            0 :                        1d-50/pow(s% m(k)/Msun,5d0/3d0))
    1449              :                else
    1450            0 :                   val = -99.0d0
    1451              :                end if
    1452              : 
    1453              :             case (p_shear)
    1454            0 :                val = if_rot(s% omega_shear,k)
    1455              :             case (p_log_abs_shear)
    1456            0 :                if (s% rotation_flag) then
    1457            0 :                   val = safe_log10(s% omega_shear(k))
    1458            0 :                   if (is_bad(val)) then
    1459            0 :                      write(*,2) 'val', k, val
    1460            0 :                      write(*,2) 's% omega_shear(k)', k, s% omega_shear(k)
    1461            0 :                      call mesa_error(__FILE__,__LINE__,'profile')
    1462              :                   end if
    1463              :                else
    1464            0 :                   val = -99
    1465              :                end if
    1466              :             case (p_log_abs_dlnR_domega)
    1467            0 :                if (s% rotation_flag) then
    1468            0 :                   val = -safe_log10(s% omega_shear(k))
    1469            0 :                   if (is_bad(val)) then
    1470            0 :                      write(*,2) 'val', k, val
    1471            0 :                      write(*,2) 's% omega_shear(k)', k, s% omega_shear(k)
    1472            0 :                      call mesa_error(__FILE__,__LINE__,'profile')
    1473              :                   end if
    1474              :                else
    1475            0 :                   val = -99
    1476              :                end if
    1477              :             case (p_i_rot)
    1478            0 :                val = if_rot_ad(s% i_rot,k)
    1479              :             case (p_j_rot)
    1480            0 :                val = if_rot(s% j_rot,k)
    1481              :             case (p_v_rot)
    1482            0 :                val = if_rot(s% omega,k)*if_rot(s% r_equatorial,k)*1d-5  ! km/sec
    1483              :             case (p_fp_rot)
    1484            0 :                val = if_rot_ad(s% fp_rot,k, alt=1.0d0)
    1485              :             case (p_ft_rot)
    1486            0 :                val = if_rot_ad(s% ft_rot,k, alt=1.0d0)
    1487              :             case (p_ft_rot_div_fp_rot)
    1488            0 :                if(s% rotation_flag) then
    1489            0 :                   val = s% ft_rot(k)% val/s% fp_rot(k)% val
    1490              :                else
    1491            0 :                   val = 1.0d0
    1492              :                end if
    1493              :             case (p_w_div_w_crit_roche)
    1494            0 :                val = if_rot(s% w_div_w_crit_roche,k)
    1495              :             case (p_w_div_w_crit_roche2)
    1496            0 :                val = if_rot(s% xh(s% i_w_div_wc,:),k)
    1497              :             case (p_log_am_nu_non_rot)
    1498            0 :                val = safe_log10(if_rot(s% am_nu_non_rot,k))
    1499              :             case (p_log_am_nu_rot)
    1500            0 :                val = safe_log10(if_rot(s% am_nu_rot,k))
    1501              :             case (p_log_am_nu)
    1502            0 :                val = safe_log10(if_rot(s% am_nu_rot,k) + if_rot(s% am_nu_non_rot,k))
    1503              : 
    1504              :             case (p_r_polar)
    1505            0 :                val = if_rot(s% r_polar,k, alt=s% r(k))/Rsun
    1506              :             case (p_log_r_polar)
    1507            0 :                val = safe_log10(if_rot(s% r_polar,k, alt=s% r(k))/Rsun)
    1508              :             case (p_r_equatorial)
    1509            0 :                val = if_rot(s% r_equatorial,k, alt=s% r(k))/Rsun
    1510              :             case (p_log_r_equatorial)
    1511            0 :                val = safe_log10(if_rot(s% r_equatorial,k, alt=s% r(k))/Rsun)
    1512              :             case (p_r_e_div_r_p)
    1513            0 :                if (s% rotation_flag) then
    1514            0 :                    if(s% r_polar(k) > 1) val = s% r_equatorial(k)/s% r_polar(k)
    1515              :                end if
    1516              :             case (p_omega_crit)
    1517            0 :                val = omega_crit(s,k)
    1518              :             case (p_omega_div_omega_crit)
    1519            0 :                if (s% rotation_flag) then
    1520            0 :                   val = omega_crit(s,k)
    1521            0 :                   if (val < 1d-50) then
    1522            0 :                      val = 0
    1523              :                   else
    1524            0 :                      val = s% omega(k)/val
    1525              :                   end if
    1526              :                end if
    1527              : 
    1528              :             case (p_eps_phase_separation)
    1529            0 :                if (s% do_phase_separation .and. s% do_phase_separation_heating) val = s% eps_phase_separation(k)
    1530              : 
    1531              :             case (p_eps_WD_sedimentation)
    1532            0 :                if (s% do_element_diffusion) val = s% eps_WD_sedimentation(k)
    1533              :             case (p_log_eps_WD_sedimentation)
    1534            0 :                if (s% do_element_diffusion) val = safe_log10(s% eps_WD_sedimentation(k))
    1535              : 
    1536              :             case (p_eps_diffusion)
    1537            0 :                if (s% do_element_diffusion) val = s% eps_diffusion(k)
    1538              :             case (p_log_eps_diffusion)
    1539            0 :                if (s% do_element_diffusion) val = safe_log10(s% eps_diffusion(k))
    1540              : 
    1541              :             case (p_e_field)
    1542            0 :                if (s% do_element_diffusion) val = s% E_field(k)
    1543              :             case (p_log_e_field)
    1544            0 :                if (s% do_element_diffusion) val = safe_log10(s% E_field(k))
    1545              : 
    1546              :             case (p_g_field_element_diffusion)
    1547            0 :                if (s% do_element_diffusion) val = s% g_field_element_diffusion(k)
    1548              :             case (p_log_g_field_element_diffusion)
    1549            0 :                if (s% do_element_diffusion) &
    1550            0 :                   val = safe_log10(s% g_field_element_diffusion(k))
    1551              : 
    1552              :             case (p_eE_div_mg_element_diffusion)
    1553            0 :                if (s% do_element_diffusion) then
    1554            0 :                   if ( s% g_field_element_diffusion(k) /= 0d0) then
    1555            0 :                      val = qe * s% E_field(k)/(amu * s% g_field_element_diffusion(k))
    1556              :                   else
    1557              :                      val = 0d0
    1558              :                   end if
    1559              :                end if
    1560              :             case (p_log_eE_div_mg_element_diffusion)
    1561            0 :                if (s% do_element_diffusion) &
    1562            0 :                   val = safe_log10(qe * s% E_field(k)/(amu * s% g_field_element_diffusion(k)))
    1563              : 
    1564              :             case (p_richardson_number)
    1565            0 :                val = if_rot(s% richardson_number,k)
    1566              :             case (p_am_domega_dlnR)
    1567            0 :                val = if_rot(s% domega_dlnR,k)
    1568              : 
    1569              :             case (p_am_log_sig)  ! == am_log_sig_omega
    1570            0 :                val = safe_log10(if_rot(s% am_sig_omega,k))
    1571              :             case (p_am_log_sig_omega)
    1572            0 :                val = safe_log10(if_rot(s% am_sig_omega,k))
    1573              :             case (p_am_log_sig_j)
    1574            0 :                val = safe_log10(if_rot(s% am_sig_j,k))
    1575              : 
    1576              :             case (p_am_log_nu_omega)
    1577            0 :                val = safe_log10(if_rot(s% am_nu_omega,k))
    1578              :             case (p_am_log_nu_j)
    1579            0 :                val = safe_log10(if_rot(s% am_nu_j,k))
    1580              : 
    1581              :             case (p_am_log_nu_rot)
    1582            0 :                val = safe_log10(if_rot(s% am_nu_rot,k))
    1583              :             case (p_am_log_nu_non_rot)
    1584            0 :                val = safe_log10(if_rot(s% am_nu_non_rot,k))
    1585              : 
    1586              :             case (p_am_log_D_visc)
    1587            0 :                if (s% am_nu_visc_factor >= 0) then
    1588              :                   f = s% am_nu_visc_factor
    1589              :                else
    1590            0 :                   f = s% D_visc_factor
    1591              :                end if
    1592            0 :                val = safe_log10(am_nu_factor*f*if_rot(s% D_visc,k))
    1593              :             case (p_am_log_D_DSI)
    1594            0 :                if (s% am_nu_DSI_factor >= 0) then
    1595              :                   f = s% am_nu_DSI_factor
    1596              :                else
    1597            0 :                   f = s% D_DSI_factor
    1598              :                end if
    1599            0 :                val = safe_log10(am_nu_factor*f*if_rot(s% D_DSI,k))
    1600              :             case (p_am_log_D_SH)
    1601            0 :                if (s% am_nu_SH_factor >= 0) then
    1602              :                   f = s% am_nu_SH_factor
    1603              :                else
    1604            0 :                   f = s% D_SH_factor
    1605              :                end if
    1606            0 :                val = safe_log10(am_nu_factor*f*if_rot(s% D_SH,k))
    1607              :             case (p_am_log_D_SSI)
    1608            0 :                if (s% am_nu_SSI_factor >= 0) then
    1609              :                   f = s% am_nu_SSI_factor
    1610              :                else
    1611            0 :                   f = s% D_SSI_factor
    1612              :                end if
    1613            0 :                val = safe_log10(am_nu_factor*f*if_rot(s% D_SSI,k))
    1614              : 
    1615              :             case (p_am_log_D_ES)
    1616            0 :                if (s% am_nu_ES_factor >= 0) then
    1617              :                   f = s% am_nu_ES_factor
    1618              :                else
    1619            0 :                   f = s% D_ES_factor
    1620              :                end if
    1621            0 :                val = safe_log10(am_nu_factor*f*if_rot(s% D_ES,k))
    1622              :             case (p_am_log_D_GSF)
    1623            0 :                if (s% am_nu_GSF_factor >= 0) then
    1624              :                   f = s% am_nu_GSF_factor
    1625              :                else
    1626            0 :                   f = s% D_GSF_factor
    1627              :                end if
    1628            0 :                val = safe_log10(am_nu_factor*f*if_rot(s% D_GSF,k))
    1629              :             case (p_am_log_D_ST)
    1630            0 :                if (s% am_nu_ST_factor >= 0) then
    1631              :                   f = s% am_nu_ST_factor
    1632              :                else
    1633            0 :                   f = s% D_ST_factor
    1634              :                end if
    1635            0 :                val = safe_log10(am_nu_factor*f*if_rot(s% D_ST,k))
    1636              :             case (p_am_log_nu_ST)
    1637            0 :                if (s% am_nu_ST_factor >= 0) then
    1638              :                   f = s% am_nu_ST_factor
    1639              :                else
    1640            0 :                   f = s% D_ST_factor
    1641              :                end if
    1642            0 :                val = safe_log10(am_nu_factor*f*if_rot(s% nu_ST,k))
    1643              : 
    1644              :             case (p_dynamo_log_B_r)
    1645            0 :                val = safe_log10(if_rot(s% dynamo_B_r,k))
    1646              :             case (p_dynamo_log_B_phi)
    1647            0 :                val = safe_log10(if_rot(s% dynamo_B_phi,k))
    1648              : 
    1649              :             case (p_grada_face)
    1650            0 :                val = s% grada_face(k)
    1651              :             case (p_gradr_div_grada)
    1652            0 :                val = s% gradr(k)/s% grada_face(k)
    1653              :             case (p_gradr_sub_grada)
    1654            0 :                val = s% gradr(k) - s% grada_face(k)
    1655              :             case (p_gradT_sub_a)
    1656            0 :                val = s% gradT(k) - s% grada_face(k)
    1657              :             case (p_gradT_sub_grada)
    1658            0 :                val = s% gradT(k) - s% grada_face(k)
    1659              :             case (p_gradT_div_grada)
    1660            0 :                val = s% gradT(k) / s% grada_face(k)
    1661              :             case (p_gradr_sub_gradT)
    1662            0 :                val = s% gradr(k) - s% gradT(k)
    1663              :             case (p_gradT_sub_gradr)
    1664            0 :                val = s% gradT(k) - s% gradr(k)
    1665              : 
    1666              :             case (p_gradT_rel_err)
    1667            0 :                if (k > 1) then
    1668            0 :                   val = (s% lnT(k-1) - s% lnT(k))/(s% lnPeos(k-1) - s% lnPeos(k))
    1669            0 :                   val = (s% gradT(k) - val)/s% gradT(k)
    1670              :                end if
    1671              : 
    1672              :             case (p_gradT_div_gradr)
    1673            0 :                if (abs(s% gradr(k)) < 1d-99) then
    1674            0 :                   val = 1d0
    1675              :                else
    1676            0 :                   val = s% gradT(k) / s% gradr(k)
    1677              :                end if
    1678              :             case (p_log_gradT_div_gradr)
    1679            0 :                if (abs(s% gradr(k)) < 1d-99) then
    1680              :                   val = 0d0
    1681              :                else
    1682            0 :                   val = safe_log10(s% gradT(k) / s% gradr(k))
    1683              :                end if
    1684              : 
    1685              :             case (p_log_mlt_Gamma)
    1686            0 :                val = safe_log10(s% mlt_Gamma(k))
    1687              :             case (p_log_mlt_vc)
    1688            0 :                val = safe_log10(s% mlt_vc(k))
    1689              :             case (p_mlt_vc)
    1690            0 :                val = s% mlt_vc(k)
    1691              :             case (p_mlt_D)
    1692            0 :                val = s% mlt_D(k)
    1693              :             case (p_mlt_gradT)
    1694            0 :                val = s% mlt_gradT(k)
    1695              :             case (p_mlt_Y_face)
    1696            0 :                val = s% Y_face(k)
    1697              :             case (p_mlt_log_abs_Y)
    1698            0 :                val = safe_log10(abs(s% Y_face(k)))
    1699              :             case (p_tdc_num_iters)
    1700            0 :                int_val = s% tdc_num_iters(k); val = dble(int_val)
    1701            0 :                int_flag = .true.
    1702              :             case(p_COUPL)
    1703            0 :                val = s% COUPL(k)
    1704              :             case(p_SOURCE)
    1705            0 :                val = s% SOURCE(k)
    1706              :             case(p_DAMP)
    1707            0 :                val = s% DAMP(k)
    1708              :             case(p_DAMPR)
    1709            0 :                val = s% DAMPR(k)
    1710              : 
    1711              :             case (p_delta_r)
    1712            0 :                val = s% r(k) - s% r_start(k)
    1713              :             case (p_delta_L)
    1714            0 :                val = s% L(k) - s% L_start(k)
    1715              :             case (p_delta_cell_vol)
    1716            0 :                if (k == s% nz) then
    1717            0 :                   rp1 = s% R_center
    1718            0 :                   rp1_start = s% R_center_old
    1719              :                else
    1720            0 :                   rp1 = s% r(k+1)
    1721            0 :                   rp1_start = s% r_start(k+1)
    1722              :                end if
    1723            0 :                r00 = s% r(k)
    1724            0 :                r00_start = s% r_start(k)
    1725            0 :                dr3 = r00*r00*r00 - rp1*rp1*rp1
    1726            0 :                dr3_start = r00_start*r00_start*r00_start - rp1_start*rp1_start*rp1_start
    1727            0 :                val = four_thirds_pi*(dr3 - dr3_start)
    1728              :             case (p_delta_entropy)
    1729            0 :                val = s% entropy(k) - exp(s% lnS_start(k))/(avo*kerg)
    1730              :             case (p_delta_T)
    1731            0 :                val = s% T(k) - s% T_start(k)
    1732              :             case (p_delta_rho)
    1733            0 :                val = s% rho(k) - exp(s% lnd_start(k))
    1734              :             case (p_delta_eps_nuc)
    1735            0 :                val = s% eps_nuc(k) - s% eps_nuc_start(k)
    1736              :             case (p_delta_mu)
    1737            0 :                val = s% mu(k) - s% mu_start(k)
    1738              : 
    1739              :             case (p_cno_div_z)
    1740              :                cno = s% xa(s% net_iso(ic12),k) + &
    1741            0 :                      s% xa(s% net_iso(in14),k) + s% xa(s% net_iso(io16),k)
    1742            0 :                z = 1 - (s% xa(s% net_iso(ih1),k) + s% xa(s% net_iso(ihe4),k))
    1743            0 :                if (z > 1d-50) then
    1744            0 :                   val = cno/z
    1745              :                else
    1746              :                   val = 0
    1747              :                end if
    1748              :             case (p_dE)
    1749            0 :                val = s% energy(k) - s% energy_start(k)
    1750              :             case (p_dr)
    1751            0 :                if (k < s% nz) then
    1752            0 :                   val = s% r(k) - s% r(k+1)
    1753              :                else
    1754            0 :                   val = s% r(k) - s% R_center
    1755              :                end if
    1756              :             case (p_dr_ratio)
    1757            0 :                if (k == 1 .or. k == s% nz) then
    1758            0 :                   val = 1
    1759              :                else
    1760            0 :                   val = (s% r(k-1) - s% r(k))/(s% r(k) - s% r(k+1))
    1761              :                end if
    1762              :             case (p_dv)
    1763            0 :                if (.not. s% v_flag) then
    1764              :                   val = 0
    1765            0 :                else if (k < s% nz) then
    1766            0 :                   val = s% v(k+1) - s% v(k)
    1767              :                else
    1768            0 :                   val = -s% v(k)
    1769              :                end if
    1770              :             case (p_dt_dv_div_dr)
    1771            0 :                if (.not. s% v_flag) then
    1772              :                   val = 0
    1773            0 :                else if (k < s% nz) then
    1774            0 :                   val = s% dt*(s% v(k+1) - s% v(k))/(s% r(k) - s% r(k+1))
    1775              :                else
    1776            0 :                   val = -s% dt*s% v(k)/s% r(k)
    1777              :                end if
    1778              : 
    1779              :             case (p_dlog_h1_dlogP)
    1780            0 :                val = get_dlogX_dlogP(ih1, k)
    1781              :             case (p_dlog_he3_dlogP)
    1782            0 :                val = get_dlogX_dlogP(ihe3, k)
    1783              :             case (p_dlog_he4_dlogP)
    1784            0 :                val = get_dlogX_dlogP(ihe4, k)
    1785              :             case (p_dlog_c12_dlogP)
    1786            0 :                val = get_dlogX_dlogP(ic12, k)
    1787              :             case (p_dlog_c13_dlogP)
    1788            0 :                val = get_dlogX_dlogP(ic13, k)
    1789              :             case (p_dlog_n14_dlogP)
    1790            0 :                val = get_dlogX_dlogP(in14, k)
    1791              :             case (p_dlog_o16_dlogP)
    1792            0 :                val = get_dlogX_dlogP(io16, k)
    1793              :             case (p_dlog_ne20_dlogP)
    1794            0 :                val = get_dlogX_dlogP(ine20, k)
    1795              :             case (p_dlog_mg24_dlogP)
    1796            0 :                val = get_dlogX_dlogP(img24, k)
    1797              :             case (p_dlog_si28_dlogP)
    1798            0 :                val = get_dlogX_dlogP(isi28, k)
    1799              : 
    1800              :             case (p_dlog_pp_dlogP)
    1801            0 :                val = get_dlog_eps_dlogP(ipp, k)
    1802              :             case (p_dlog_cno_dlogP)
    1803            0 :                val = get_dlog_eps_dlogP(icno, k)
    1804              :             case (p_dlog_3alf_dlogP)
    1805            0 :                val = get_dlog_eps_dlogP(i3alf, k)
    1806              : 
    1807              :             case (p_dlog_burn_c_dlogP)
    1808            0 :                val = get_dlog_eps_dlogP(i_burn_c, k)
    1809              :             case (p_dlog_burn_n_dlogP)
    1810            0 :                val = get_dlog_eps_dlogP(i_burn_n, k)
    1811              :             case (p_dlog_burn_o_dlogP)
    1812            0 :                val = get_dlog_eps_dlogP(i_burn_o, k)
    1813              : 
    1814              :             case (p_dlog_burn_ne_dlogP)
    1815            0 :                val = get_dlog_eps_dlogP(i_burn_ne, k)
    1816              :             case (p_dlog_burn_na_dlogP)
    1817            0 :                val = get_dlog_eps_dlogP(i_burn_na, k)
    1818              :             case (p_dlog_burn_mg_dlogP)
    1819            0 :                val = get_dlog_eps_dlogP(i_burn_mg, k)
    1820              : 
    1821              :             case (p_dlog_cc_dlogP)
    1822            0 :                val = get_dlog_eps_dlogP(icc, k)
    1823              :             case (p_dlog_co_dlogP)
    1824            0 :                val = get_dlog_eps_dlogP(ico, k)
    1825              :             case (p_dlog_oo_dlogP)
    1826            0 :                val = get_dlog_eps_dlogP(ioo, k)
    1827              : 
    1828              :             case (p_dlog_burn_si_dlogP)
    1829            0 :                val = get_dlog_eps_dlogP(i_burn_si, k)
    1830              :             case (p_dlog_burn_s_dlogP)
    1831            0 :                val = get_dlog_eps_dlogP(i_burn_s, k)
    1832              :             case (p_dlog_burn_ar_dlogP)
    1833            0 :                val = get_dlog_eps_dlogP(i_burn_ar, k)
    1834              :             case (p_dlog_burn_ca_dlogP)
    1835            0 :                val = get_dlog_eps_dlogP(i_burn_ca, k)
    1836              :             case (p_dlog_burn_ti_dlogP)
    1837            0 :                val = get_dlog_eps_dlogP(i_burn_ti, k)
    1838              :             case (p_dlog_burn_cr_dlogP)
    1839            0 :                val = get_dlog_eps_dlogP(i_burn_cr, k)
    1840              :             case (p_dlog_burn_fe_dlogP)
    1841            0 :                val = get_dlog_eps_dlogP(i_burn_fe, k)
    1842              :             case (p_dlog_pnhe4_dlogP)
    1843            0 :                val = get_dlog_eps_dlogP(ipnhe4, k)
    1844              :             case (p_dlog_photo_dlogP)
    1845            0 :                val = get_dlog_eps_dlogP(iphoto, k)
    1846              :             case (p_dlog_other_dlogP)
    1847            0 :                val = get_dlog_eps_dlogP(iother, k)
    1848              : 
    1849              :             case(p_d_u_div_rmid)
    1850            0 :                if (s% u_flag .and. k > 1) &
    1851            0 :                   val = s% u(k-1)/s% rmid(k-1) - s% u(k)/s% rmid(k)
    1852              :             case(p_d_u_div_rmid_start)
    1853            0 :                if (s% u_flag .and. k > 1) &
    1854            0 :                   val = s% u(k-1)/s% rmid_start(k-1) - s% u(k)/s% rmid_start(k)
    1855              : 
    1856              :             case(p_Ptrb)
    1857            0 :                if (s% RSP2_flag) then
    1858            0 :                   val = get_etrb(s,k)*s% rho(k)
    1859            0 :                else if (s% RSP_flag) then
    1860            0 :                   val = s% RSP_Et(k)*s% rho(k)
    1861              :                end if
    1862              :             case(p_log_Ptrb)
    1863            0 :                if (s% RSP2_flag) then
    1864            0 :                   val = safe_log10(get_etrb(s,k)*s% rho(k))
    1865            0 :                else if (s% RSP_flag) then
    1866            0 :                   val = safe_log10(s% RSP_Et(k)*s% rho(k))
    1867              :                end if
    1868              :             case(p_w)
    1869            0 :                if (s% RSP2_flag) then
    1870            0 :                   val = get_w(s,k)
    1871            0 :                else if (s% RSP_flag) then
    1872            0 :                   val = s% RSP_w(k)
    1873              :                else
    1874            0 :                   val = s% mlt_vc(k)/sqrt_2_div_3
    1875              :                end if
    1876              :             case(p_log_w)
    1877            0 :                if (s% RSP2_flag) then
    1878            0 :                   val = get_w(s,k)
    1879            0 :                else if (s% RSP_flag) then
    1880            0 :                   val = s% RSP_w(k)
    1881              :                else
    1882            0 :                   val = s% mlt_vc(k)/sqrt_2_div_3
    1883              :                end if
    1884            0 :                val = safe_log10(val)
    1885              :             case(p_etrb)
    1886            0 :                if (s% RSP2_flag) then
    1887            0 :                   val = get_etrb(s,k)
    1888            0 :                else if (s% RSP_flag) then
    1889            0 :                   val = s% RSP_Et(k)
    1890              :                end if
    1891              :             case(p_log_etrb)
    1892            0 :                if (s% RSP2_flag) then
    1893            0 :                   val = safe_log10(get_etrb(s,k))
    1894            0 :                else if (s% RSP_flag) then
    1895            0 :                   val = safe_log10(s% RSP_Et(k))
    1896              :                end if
    1897              :             case(p_Pvsc)
    1898            0 :                if (s% use_Pvsc_art_visc .or. s% RSP_flag) val = s% Pvsc(k)
    1899              :             case(p_Hp_face)
    1900            0 :                if (rsp_or_w) val = s% Hp_face(k)
    1901              :             case(p_Y_face)
    1902            0 :                if (rsp_or_w) val = s% Y_face(k)
    1903              :             case(p_PII_face)
    1904            0 :                if (rsp_or_w) val = s% PII(k)
    1905              :             case(p_Chi)
    1906            0 :                 val = s% Chi(k)
    1907              :             case(p_Eq)
    1908            0 :                val = s% Eq(k)
    1909              :             case(p_Uq)
    1910            0 :                val = s% Uq(k)
    1911              :             case(p_Lr)
    1912            0 :                val = get_Lrad(s,k)
    1913              :             case(p_Lr_div_L)
    1914            0 :                val = get_Lrad(s,k)/s% L(k)
    1915              :             case(p_Lc)
    1916            0 :                val = get_Lconv(s,k)
    1917              :             case(p_Lc_div_L)
    1918            0 :                val = get_Lconv(s,k)/s% L(k)
    1919              :             case(p_Lt)
    1920            0 :                if (rsp_or_w) val = s% Lt(k)
    1921              :             case(p_Lt_div_L)
    1922            0 :                if (rsp_or_w) val = s% Lt(k)/s% L(k)
    1923              :             case(p_reconstructed_T_face)
    1924            0 :                if (reconstructed_face_state_active .and. s% reconstructed_face_state_valid(k)) val = s% reconstructed_T_face_ad(k)% val
    1925              :             case(p_reconstructed_rho_face)
    1926            0 :                if (reconstructed_face_state_active .and. s% reconstructed_face_state_valid(k)) val = s% reconstructed_rho_face_ad(k)% val
    1927              :             case(p_reconstructed_P_face)
    1928            0 :                if (reconstructed_face_state_active .and. s% reconstructed_face_state_valid(k)) val = s% reconstructed_P_face_ad(k)% val
    1929              :             case(p_reconstructed_Cp_face)
    1930            0 :                if (reconstructed_face_state_active .and. s% reconstructed_face_state_valid(k)) val = s% reconstructed_Cp_face_ad(k)% val
    1931              :             case(p_reconstructed_ChiRho_face)
    1932            0 :                if (reconstructed_face_state_active .and. s% reconstructed_face_state_valid(k)) val = s% reconstructed_ChiRho_face_ad(k)% val
    1933              :             case(p_reconstructed_ChiT_face)
    1934            0 :                if (reconstructed_face_state_active .and. s% reconstructed_face_state_valid(k)) val = s% reconstructed_ChiT_face_ad(k)% val
    1935              :             case(p_reconstructed_grada_face)
    1936            0 :                if (reconstructed_face_state_active .and. s% reconstructed_face_state_valid(k)) val = s% reconstructed_grada_face_ad(k)% val
    1937              :             case(p_reconstructed_opacity_face)
    1938            0 :                if (reconstructed_face_state_active .and. s% reconstructed_face_state_valid(k)) val = s% reconstructed_opacity_face_ad(k)% val
    1939              :             case(p_reconstructed_scale_height_face)
    1940            0 :                if (reconstructed_face_state_active .and. s% reconstructed_face_state_valid(k)) val = s% reconstructed_scale_height_face_ad(k)% val
    1941              :             case(p_reconstructed_gradr_face)
    1942            0 :                if (reconstructed_face_state_active .and. s% reconstructed_face_state_valid(k)) val = s% reconstructed_gradr_face_ad(k)% val
    1943              : 
    1944              : 
    1945              :             case(p_rsp_Et)
    1946            0 :                if (s% rsp_flag) val = s% RSP_Et(k)
    1947              :             case(p_rsp_logEt)
    1948            0 :                if (s% rsp_flag) &
    1949            0 :                   val = safe_log10(s% RSP_Et(k))
    1950              :             case(p_rsp_Pt)
    1951            0 :                if (s% rsp_flag) val = s% Ptrb(k)
    1952              :             case(p_rsp_Eq)
    1953            0 :                if (s% rsp_flag) val = s% Eq(k)
    1954              :             case(p_rsp_src_snk)
    1955            0 :                if (s% rsp_flag) val = s% COUPL(k)
    1956              :             case(p_rsp_src)
    1957            0 :                if (s% rsp_flag) val = s% SOURCE(k)
    1958              :             case(p_rsp_sink)
    1959            0 :                if (s% rsp_flag) val = s% DAMP(k) + s% DAMPR(k)
    1960              :             case(p_rsp_damp)
    1961            0 :                if (s% rsp_flag) val = s% DAMP(k)
    1962              :             case(p_rsp_dampR)
    1963            0 :                if (s% rsp_flag) val = s% DAMPR(k)
    1964              :             case(p_rsp_Hp_face)
    1965            0 :                if (s% rsp_flag) val = s% Hp_face(k)
    1966              :             case(p_rsp_Chi)
    1967            0 :                if (s% rsp_flag) val = s% Chi(k)
    1968              :             case(p_rsp_Pvsc)
    1969            0 :                if (s% rsp_flag) val = s% Pvsc(k)
    1970              :             case(p_rsp_erad)
    1971            0 :                if (s% rsp_flag) val = s% erad(k)
    1972              :             case(p_rsp_log_erad)
    1973            0 :                if (s% rsp_flag) val = safe_log10(s% erad(k))
    1974              :             case(p_rsp_log_dt_div_heat_exchange_timescale)
    1975            0 :                if (s% rsp_flag) val = safe_log10(s% dt*clight*s% opacity(k)*s% rho(k))
    1976              :             case(p_rsp_heat_exchange_timescale)
    1977            0 :                if (s% rsp_flag) val = 1d0/(clight*s% opacity(k)*s% rho(k))
    1978              :             case(p_rsp_log_heat_exchange_timescale)
    1979            0 :                if (s% rsp_flag) &
    1980            0 :                   val = safe_log10(1d0/(clight*s% opacity(k)*s% rho(k)))
    1981              :             case(p_rsp_Y_face)
    1982            0 :                if (s% rsp_flag) then
    1983            0 :                   if (k > 1) then
    1984            0 :                      val = s% Y_face(k)
    1985              :                   else  ! for plotting, use value at k=2
    1986            0 :                      val = s% Y_face(2)
    1987              :                   end if
    1988              :                end if
    1989              :             case(p_rsp_gradT)
    1990            0 :                if (s% rsp_flag) then
    1991            0 :                   if (k > 1) then  ! Y is superadiabatic gradient
    1992            0 :                      val = s% Y_face(k) + 0.5d0*(s% grada(k-1) + s% grada(k))
    1993              :                   else  ! for plotting, use value at k=2
    1994            0 :                      val = s% Y_face(2) + 0.5d0*(s% grada(1) + s% grada(2))
    1995              :                   end if
    1996              :                end if
    1997              :             case(p_rsp_Uq)
    1998            0 :                if (s% rsp_flag) then
    1999            0 :                   if (k > 1) then
    2000            0 :                      val = s% Uq(k)
    2001              :                   else  ! for plotting, use value at k=2
    2002            0 :                      val = s% Uq(2)
    2003              :                   end if
    2004              :                end if
    2005              :             case(p_rsp_Lr)
    2006            0 :                if (s% rsp_flag) val = s% Fr(k)*pi4*s% r(k)*s% r(k)
    2007              :             case(p_rsp_Lr_div_L)
    2008            0 :                if (s% rsp_flag) val = s% Fr(k)*pi4*s% r(k)*s% r(k)/s% L(k)
    2009              :             case(p_rsp_Lc)
    2010            0 :                if (s% rsp_flag) then
    2011            0 :                   val = s% Lc(k)
    2012            0 :                   if (k > 1) then
    2013              :                      val = s% Lc(k)
    2014              :                   else  ! for plotting, use value at k=2
    2015            0 :                      val = s% Lc(2)
    2016              :                   end if
    2017              :                end if
    2018              :             case(p_rsp_Lc_div_L)
    2019            0 :                if (s% rsp_flag) then
    2020            0 :                   if (k > 1) then
    2021            0 :                      val = s% Lc(k)/s% L(k)
    2022              :                   else  ! for plotting, use value at k=2
    2023            0 :                      val = s% Lc(2)/s% L(2)
    2024              :                   end if
    2025              :                end if
    2026              :             case(p_rsp_Lt)
    2027            0 :                if (s% rsp_flag) then
    2028            0 :                   if (k > 1) then
    2029            0 :                      val = s% Lt(k)
    2030              :                   else  ! for plotting, use value at k=2
    2031            0 :                      val = s% Lt(2)
    2032              :                   end if
    2033              :                end if
    2034              :             case(p_rsp_Lt_div_L)
    2035            0 :                if (s% rsp_flag) then
    2036            0 :                   if (k > 1) then
    2037            0 :                      val = s% Lt(k)/s% L(k)
    2038              :                   else  ! for plotting, use value at k=2
    2039            0 :                      val = s% Lt(2)/s% L(2)
    2040              :                   end if
    2041              :                end if
    2042              : 
    2043              :             case (p_total_energy)  ! specific total energy at k
    2044            0 :                val = eval_cell_section_total_energy(s,k,k)/s% dm(k)
    2045              :             case (p_total_energy_sign)  ! specific total energy at k
    2046            0 :                val = eval_cell_section_total_energy(s,k,k)
    2047            0 :                if (val > 0d0) then
    2048            0 :                   int_val = 1
    2049            0 :                else if (val < 0d0) then
    2050            0 :                   int_val = -1
    2051              :                else
    2052            0 :                   int_val = 0
    2053              :                end if
    2054            0 :                val = dble(int_val)
    2055            0 :                int_flag = .true.
    2056              :             case (p_dwork_dm)
    2057              :                ! differential work per unit mass per unit mass*time dW/dm
    2058              :                ! W = dwork_dm*dm*dt
    2059            0 :                val = s% dwork_dm(k) ! returns (dw/dt)/dm
    2060              : 
    2061              :             case (p_cell_specific_IE)
    2062            0 :                val = s% energy(k)
    2063              :             case (p_cell_ie_div_star_ie)
    2064            0 :                val = s% energy(k)*s% dm(k)/s% total_internal_energy_end
    2065              :             case (p_log_cell_specific_IE)
    2066            0 :                val = safe_log10(s% energy(k))
    2067              :             case (p_log_cell_ie_div_star_ie)
    2068            0 :                val = safe_log10(s% energy(k)*s% dm(k)/s% total_internal_energy_end)
    2069              : 
    2070              :             case (p_cell_specific_PE)
    2071            0 :                val = cell_specific_PE(s,k,d_dlnR00,d_dlnRp1)
    2072              : 
    2073              :             case (p_cell_specific_KE)
    2074            0 :                val = cell_specific_KE(s,k,d_dv00,d_dvp1)
    2075              : 
    2076              :             case (p_cell_IE_div_IE_plus_KE)
    2077            0 :                val = s% energy(k)/(s% energy(k) + cell_specific_KE(s,k,d_dv00,d_dvp1))
    2078              : 
    2079              :             case (p_cell_KE_div_IE_plus_KE)
    2080            0 :                f = cell_specific_KE(s,k,d_dv00,d_dvp1)
    2081            0 :                val = f/(s% energy(k) + f)
    2082              : 
    2083              :             case (p_dlnX_dr)
    2084            0 :                klo = max(1,k-1)
    2085            0 :                khi = min(nz,k+1)
    2086              :                val = log(max(1d-99,max(1d-99,s% X(klo))/max(1d-99,s% X(khi))))  &
    2087            0 :                               /  (s% rmid(klo) - s% rmid(khi))
    2088              :             case (p_dlnY_dr)
    2089            0 :                klo = max(1,k-1)
    2090            0 :                khi = min(nz,k+1)
    2091              :                val = log(max(1d-99,max(1d-99,s% Y(klo))/max(1d-99,s% Y(khi))))  &
    2092            0 :                               /  (s% rmid(klo) - s% rmid(khi))
    2093              :             case (p_dlnRho_dr)
    2094            0 :                klo = max(1,k-1)
    2095            0 :                khi = min(nz,k+1)
    2096            0 :                val = (s% lnd(klo) - s% lnd(khi))/(s% rmid(klo) - s% rmid(khi))
    2097              : 
    2098              :             case (p_brunt_B)
    2099            0 :                if (s% calculate_Brunt_N2) val = s% brunt_B(k)
    2100              :             case (p_brunt_nonB)
    2101            0 :                if (s% calculate_Brunt_N2) val = -s% gradT_sub_grada(k)
    2102              :             case (p_log_brunt_B)
    2103            0 :                val = log10(max(1d-99,s% brunt_B(k)))
    2104              :             case (p_log_brunt_nonB)
    2105            0 :                if (s% calculate_Brunt_N2) val = log10(max(1d-99,-s% gradT_sub_grada(k)))
    2106              : 
    2107              :             case (p_brunt_N2)
    2108            0 :                if (s% calculate_Brunt_N2) val = s% brunt_N2(k)
    2109              :             case (p_brunt_N2_composition_term)
    2110            0 :                if (s% calculate_Brunt_N2) val = s% brunt_N2_composition_term(k)
    2111              :             case (p_brunt_N2_structure_term)
    2112            0 :                if (s% calculate_Brunt_N2) val = s% brunt_N2(k) - s% brunt_N2_composition_term(k)
    2113              :             case (p_log_brunt_N2_composition_term)
    2114            0 :                if (s% calculate_Brunt_N2) val = &
    2115            0 :                   safe_log10(s% brunt_N2_composition_term(k))
    2116              :             case (p_log_brunt_N2_structure_term)
    2117            0 :                if (s% calculate_Brunt_N2) val = &
    2118            0 :                   safe_log10(s% brunt_N2(k) - s% brunt_N2_composition_term(k))
    2119              : 
    2120              :             case (p_brunt_A)
    2121            0 :                if (s% calculate_Brunt_N2) val = s% brunt_N2(k)*s% r(k)/s% grav(k)
    2122              :             case (p_brunt_A_div_x2)
    2123            0 :                x = s% r(k)/s% r(1)
    2124            0 :                if (s% calculate_Brunt_N2) val = s% brunt_N2(k)*s% r(k)/s% grav(k)/x/x
    2125              :             case (p_log_brunt_N2_dimensionless)
    2126            0 :                if (s% calculate_Brunt_N2) val = &
    2127            0 :                   safe_log10(s% brunt_N2(k)/(3*s% cgrav(1)*s% m_grav(1)/pow3(s% r(1))))
    2128              :             case (p_brunt_N2_dimensionless)
    2129            0 :                if (s% calculate_Brunt_N2) val = &
    2130            0 :                   s% brunt_N2(k)/(3*s% cgrav(1)*s% m_grav(1)/pow3(s% r(1)))
    2131              :             case (p_brunt_N_dimensionless)
    2132            0 :                if (s% calculate_Brunt_N2) val = &
    2133            0 :                   sqrt(max(0d0,s% brunt_N2(k))/(3*s% cgrav(1)*s% m_grav(1)/pow3(s% r(1))))
    2134              :             case (p_brunt_N)
    2135            0 :                if (s% calculate_Brunt_N2) val = sqrt(max(0d0,s% brunt_N2(k)))
    2136              :             case (p_brunt_frequency)  ! cycles per day
    2137            0 :                if (s% calculate_Brunt_N2) val = &
    2138            0 :                   (secday/(2*pi))*sqrt(max(0d0,s% brunt_N2(k)))
    2139              :             case (p_log_brunt_N)
    2140            0 :                if (s% calculate_Brunt_N2) val = safe_log10(sqrt(max(0d0,s% brunt_N2(k))))
    2141              :             case (p_log_brunt_N2)
    2142            0 :                if (s% calculate_Brunt_N2) val = safe_log10(s% brunt_N2(k))
    2143              : 
    2144              :             case (p_brunt_nu)  ! micro Hz
    2145            0 :                if (s% calculate_Brunt_N2) val = s% brunt_N2(k)
    2146            0 :                val = (1d6/(2*pi))*sqrt(max(0d0,val))
    2147              :             case (p_log_brunt_nu)  ! micro Hz
    2148            0 :                if (s% calculate_Brunt_N2) &
    2149            0 :                   val = safe_log10((1d6/(2*pi))*sqrt(max(0d0,s% brunt_N2(k))))
    2150              : 
    2151              :             case (p_lamb_S)
    2152            0 :                val = sqrt(2d0)*s% csound_face(k)/s% r(k)  ! for l=1
    2153              :             case (p_lamb_S2)
    2154            0 :                val = 2d0*pow2(s% csound_face(k)/s% r(k))  ! for l=1
    2155              : 
    2156              :             case (p_lamb_Sl1)
    2157            0 :                val = (1d6/(2*pi))*sqrt(2d0)*s% csound_face(k)/s% r(k)  ! microHz
    2158              :             case (p_lamb_Sl2)
    2159            0 :                val = (1d6/(2*pi))*sqrt(6d0)*s% csound_face(k)/s% r(k)  ! microHz
    2160              :             case (p_lamb_Sl3)
    2161            0 :                val = (1d6/(2*pi))*sqrt(12d0)*s% csound_face(k)/s% r(k)  ! microHz
    2162              :             case (p_lamb_Sl10)
    2163            0 :                val = (1d6/(2*pi))*sqrt(110d0)*s% csound_face(k)/s% r(k)  ! microHz
    2164              : 
    2165              :             case (p_log_lamb_Sl1)
    2166            0 :                val = safe_log10((1d6/(2*pi))*sqrt(2d0)*s% csound_face(k)/s% r(k))  ! microHz
    2167              :             case (p_log_lamb_Sl2)
    2168            0 :                val = safe_log10((1d6/(2*pi))*sqrt(6d0)*s% csound_face(k)/s% r(k))  ! microHz
    2169              :             case (p_log_lamb_Sl3)
    2170            0 :                val = safe_log10((1d6/(2*pi))*sqrt(12d0)*s% csound_face(k)/s% r(k))  ! microHz
    2171              :             case (p_log_lamb_Sl10)
    2172            0 :                val = safe_log10((1d6/(2*pi))*sqrt(110d0)*s% csound_face(k)/s% r(k))  ! microHz
    2173              : 
    2174              :             case (p_brunt_N_div_r_integral)
    2175            0 :                if (s% calculate_Brunt_N2) val = get_brunt_N_div_r_integral(k)
    2176              :             case (p_sign_brunt_N2)
    2177            0 :                if (s% calculate_Brunt_N2) val = sign(1d0,s% brunt_N2(k))
    2178              : 
    2179              :             case (p_k_r_integral)
    2180            0 :                if (s% calculate_Brunt_N2) val = get_k_r_integral(k,1,1d0)
    2181              : 
    2182              :             case (p_brunt_N2_sub_omega2)
    2183            0 :                if (s% calculate_Brunt_N2) then
    2184            0 :                   val = s% brunt_N2(k) - pow2(2*pi*s% nu_max/1d6)
    2185            0 :                   if (val > 0d0) then
    2186            0 :                      val = 1
    2187              :                   else
    2188            0 :                      val = 0
    2189              :                   end if
    2190              :                end if
    2191              :             case (p_sl2_sub_omega2)
    2192            0 :                if (s% calculate_Brunt_N2) then
    2193            0 :                   val = 2*pow2(s% csound_face(k)/s% r(k)) - pow2(2*pi*s% nu_max/1d6)
    2194            0 :                   if (val >= 0d0) then
    2195            0 :                      val = 1
    2196              :                   else
    2197            0 :                      val = 0
    2198              :                   end if
    2199              :                end if
    2200              : 
    2201              :             case (p_cs_at_cell_bdy)
    2202            0 :                val = s% csound_face(k)
    2203              :             case (p_log_mdot_cs)  ! log10(4 Pi r^2 csound rho / (Msun/year))
    2204            0 :                val = safe_log10(pi4*s% r(k)*s% r(k)*s% csound(k)*s% rho(k)/(Msun/secyer))
    2205              :             case (p_log_mdot_v)  ! log10(4 Pi r^2 v rho / (Msun/year))
    2206            0 :                if (s% u_flag) then
    2207            0 :                   val = safe_log10(4*pi*s% r(k)*s% r(k)*s% u_face_ad(k)%val*s% rho(k)/(Msun/secyer))
    2208            0 :                else if (s% v_flag) then
    2209            0 :                   val = safe_log10(pi4*s% r(k)*s% r(k)*s% v(k)*s% rho(k)/(Msun/secyer))
    2210              :                end if
    2211              :             case (p_log_L_div_CpTMdot)
    2212            0 :                if (s% star_mdot == 0) then
    2213              :                   val = 0
    2214              :                else
    2215            0 :                   val = safe_log10(s% L(k)/(s% cp(k)*s% T(k)*abs(s% star_mdot)*(Msun/secyer)))
    2216              :                end if
    2217              :             case (p_logR_kap)
    2218            0 :                val = s% lnd(k)/ln10 - 3d0*s% lnT(k)/ln10 + 18d0
    2219              :             case (p_logW)
    2220            0 :                val = s% lnPgas(k)/ln10 - 4d0*s% lnT(k)/ln10
    2221              :             case (p_logQ)
    2222            0 :                val = s% lnd(k)/ln10 - 2d0*s% lnT(k)/ln10 + 12d0
    2223              :             case (p_logV)
    2224            0 :                val = s% lnd(k)/ln10 - 0.7d0*s% lnE(k)/ln10 + 20d0
    2225              : 
    2226              :             case (p_log_zFe)
    2227              :                val = 0d0
    2228            0 :                do j=1,s% species
    2229            0 :                   if (chem_isos% Z(s% chem_id(j)) >= 24) val = val + s% xa(j,k)
    2230              :                end do
    2231            0 :                val = safe_log10(val)
    2232              :             case (p_zFe)
    2233              :                val = 0d0
    2234            0 :                do j=1,s% species
    2235            0 :                   if (chem_isos% Z(s% chem_id(j)) >= 24) val = val + s% xa(j,k)
    2236              :                end do
    2237              :             case(p_u)
    2238            0 :                if (s% u_flag) val = s% u(k)
    2239              :             case(p_u_face)
    2240            0 :                if (s% u_flag) val = s% u_face_ad(k)%val
    2241              :             case (p_dPdr_dRhodr_info)
    2242            0 :                if (s% RTI_flag) val = s% dPdr_dRhodr_info(k)
    2243              :             case(p_RTI_du_diffusion_kick)
    2244            0 :                if (s% u_flag) val = s% RTI_du_diffusion_kick(k)
    2245              :             case(p_log_du_kick_div_du)
    2246            0 :                if (s% u_flag .and. k > 1) then
    2247            0 :                   if (abs(s% u_face_ad(k)%val) > 1d0) &
    2248            0 :                      val = safe_log10(abs(s% RTI_du_diffusion_kick(k)/s% u_face_ad(k)%val))
    2249              :                end if
    2250              : 
    2251              :             case(p_log_dt_div_tau_conv)
    2252            0 :                val = safe_log10(s% dt/max(1d-20,conv_time_scale(s,k)))
    2253              :             case(p_dt_div_tau_conv)
    2254            0 :                val = s% dt/max(1d-20,conv_time_scale(s,k))
    2255              :             case(p_tau_conv)
    2256            0 :                val = conv_time_scale(s,k)
    2257              :             case(p_tau_qhse)
    2258            0 :                val = QHSE_time_scale(s,k)
    2259              :             case(p_tau_epsnuc)
    2260            0 :                val = eps_nuc_time_scale(s,k)
    2261              :             case(p_tau_cool)
    2262            0 :                val = cooling_time_scale(s,k)
    2263              : 
    2264              :             case(p_max_abs_xa_corr)
    2265            0 :                val = s% max_abs_xa_corr(k)
    2266              : 
    2267              :             case default
    2268            0 :                write(*,*) 'FATAL ERROR in profile_getval', c, k
    2269              :                write(*,*) 'between ' // trim(profile_column_name(c-1)) // ' and ' // &
    2270            0 :                   trim(profile_column_name(c+1)), c-1, c+1
    2271            0 :                val = 0
    2272        31104 :                call mesa_error(__FILE__,__LINE__,'profile_getval')
    2273              : 
    2274              :          end select
    2275              : 
    2276              :          end if
    2277              : 
    2278              : 
    2279              :          contains
    2280              : 
    2281              : 
    2282            0 :          real(dp) function get_L_vel(k) result(v)  ! velocity if L carried by convection
    2283              :             integer, intent(in) :: k
    2284              :             real(dp) :: rho_face
    2285              :             integer :: j
    2286            0 :             if (k == 1) then
    2287            0 :                j = 2
    2288              :             else
    2289            0 :                j = k
    2290              :             end if
    2291            0 :             rho_face = interp_val_to_pt(s% rho,j,nz,s% dq,'profile get_L_vel')
    2292            0 :             v = pow(max(1d0,s% L(k))/(pi4*s% r(k)*s% r(k)*rho_face),one_third)
    2293            0 :          end function get_L_vel
    2294              : 
    2295              : 
    2296            0 :          real(dp) function get_k_r_integral(k_in, el, nu_factor)
    2297              :             integer, intent(in) :: k_in
    2298              :             integer, intent(in) :: el
    2299              :             real(dp), intent(in) :: nu_factor
    2300              :             real(dp) :: integral, integral_for_k, &
    2301              :                cs2, r2, n2, sl2, omega2, L2, kr2, dr
    2302              :             integer :: k, k1, k_inner, k_outer
    2303              :             include 'formats'
    2304              : 
    2305            0 :             if (k_in == 1) then
    2306              :                get_k_r_integral = 1
    2307              :                return
    2308              :             end if
    2309              : 
    2310              :             get_k_r_integral = 0
    2311            0 :             L2 = el*(el+1)
    2312            0 :             omega2 = pow2(1d-6*2*pi*s% nu_max*nu_factor)
    2313              : 
    2314              :             ! k_inner and k_outer are bounds of evanescent region
    2315              : 
    2316              :             ! k_outer is outermost k where Sl2 <= omega2 at k-1 and Sl2 > omega2 at k
    2317              :             ! 1st find outermost where Sl2 <= omega2
    2318            0 :             k1 = 0
    2319            0 :             do k = 2, s% nz
    2320            0 :                r2 = s% r(k)*s% r(k)
    2321            0 :                cs2 = s% csound_face(k)*s% csound_face(k)
    2322            0 :                sl2 = L2*cs2/r2
    2323            0 :                if (sl2 <= omega2) then
    2324              :                   k1 = k; exit
    2325              :                end if
    2326              :             end do
    2327            0 :             if (k1 == 0) return
    2328              :             ! then find next k where Sl2 >= omega2
    2329            0 :             k_outer = 0
    2330            0 :             do k = k1+1, s% nz
    2331            0 :                r2 = s% r(k)*s% r(k)
    2332            0 :                cs2 = s% csound_face(k)*s% csound_face(k)
    2333            0 :                sl2 = L2*cs2/r2
    2334            0 :                if (sl2 > omega2) then
    2335              :                   k_outer = k; exit
    2336              :                end if
    2337              :             end do
    2338            0 :             if (k_outer == 0) return
    2339            0 :             if (k_in <= k_outer) then
    2340              :                get_k_r_integral = 1
    2341              :                return
    2342              :             end if
    2343              : 
    2344              :             ! k_inner is next k where N2 >= omega2 at k+1 and N2 < omega2 at k
    2345            0 :             k_inner = 0
    2346            0 :             do k = k_outer+1, s% nz
    2347            0 :                if (s% brunt_N2(k) >= omega2) then
    2348              :                   k_inner= k; exit
    2349              :                end if
    2350              :             end do
    2351            0 :             if (k_inner == 0) return
    2352            0 :             if (k_in > k_inner) then
    2353              :                get_k_r_integral = 1
    2354              :                return
    2355              :             end if
    2356              : 
    2357            0 :             integral = 0; integral_for_k = 0
    2358              :             get_k_r_integral = 0
    2359            0 :             do k = k_inner, k_outer, -1
    2360            0 :                r2 = s% r(k)*s% r(k)
    2361            0 :                cs2 = s% csound_face(k)*s% csound_face(k)
    2362            0 :                n2 = s% brunt_N2(k)
    2363            0 :                sl2 = L2*cs2/r2
    2364            0 :                kr2 = (1 - n2/omega2)*(1 - Sl2/omega2)/cs2
    2365            0 :                dr = s% rmid(k-1) - s% rmid(k)
    2366            0 :                if (kr2 < 0 .and. omega2 < Sl2) integral = integral + sqrt(-kr2)*dr
    2367            0 :                if (k == k_in) integral_for_k = integral
    2368              :             end do
    2369            0 :             if (integral < 1d-99) return
    2370            0 :             get_k_r_integral = integral_for_k/integral
    2371              : 
    2372            0 :             if (is_bad(get_k_r_integral)) then
    2373            0 :                write(*,2) 'get_k_r_integral', k_in, integral_for_k, integral
    2374            0 :                call mesa_error(__FILE__,__LINE__,'get_k_r_integral')
    2375              :             end if
    2376              : 
    2377              :          end function get_k_r_integral
    2378              : 
    2379              : 
    2380            0 :          real(dp) function get_brunt_N_div_r_integral(k_in)
    2381              :             integer, intent(in) :: k_in
    2382              :             real(dp) :: integral, integral_for_k, dr
    2383              :             integer :: k
    2384            0 :             integral = 0
    2385            0 :             integral_for_k = 0
    2386            0 :             get_brunt_N_div_r_integral = 1
    2387            0 :             if (k_in == 1) return
    2388            0 :             get_brunt_N_div_r_integral = 0
    2389            0 :             do k = s% nz, 2, -1
    2390            0 :                dr = s% rmid(k-1) - s% rmid(k)
    2391            0 :                if (s% brunt_N2(k) > 0) &
    2392            0 :                   integral = integral + sqrt(s% brunt_N2(k))*dr/s% r(k)
    2393            0 :                if (k == k_in) integral_for_k = integral
    2394              :             end do
    2395            0 :             if (integral < 1d-99) return
    2396            0 :             get_brunt_N_div_r_integral = integral_for_k/integral
    2397            0 :          end function get_brunt_N_div_r_integral
    2398              : 
    2399              : 
    2400            0 :          real(dp) function get_dlogX_dlogP(j, k)
    2401              :             integer, intent(in) :: j, k
    2402              :             integer :: ii, i
    2403              :             real(dp) :: x00, xm1, dlogP, dlogX
    2404              :             include 'formats'
    2405            0 :             get_dlogx_dlogp = 0
    2406            0 :             if (k > 1) then
    2407              :                ii = k
    2408              :             else
    2409              :                ii = 2
    2410              :             end if
    2411            0 :             i = s% net_iso(j)
    2412            0 :             if (i == 0) return
    2413            0 :             x00 = s% xa(i,ii)
    2414            0 :             xm1 = s% xa(i,ii-1)
    2415            0 :             if (x00 < 1d-20 .or. xm1 < 1d-20) return
    2416            0 :             dlogP = (s% lnPeos(ii) - s% lnPeos(ii-1))/ln10
    2417            0 :             if (dlogP <= 0d0) return
    2418            0 :             dlogX = log10(x00/xm1)
    2419            0 :             get_dlogX_dlogP = dlogX/dlogP
    2420            0 :          end function get_dlogX_dlogP
    2421              : 
    2422              : 
    2423            0 :          real(dp) function get_dlog_eps_dlogP(cat, k)
    2424              :             integer, intent(in) :: cat, k
    2425              :             integer :: ii
    2426              :             real(dp) :: eps, epsm1, dlogP, dlog_eps
    2427            0 :             get_dlog_eps_dlogP = 0
    2428            0 :             if (k > 1) then
    2429              :                ii = k
    2430              :             else
    2431              :                ii = 2
    2432              :             end if
    2433            0 :             eps = s% eps_nuc_categories(cat,ii)
    2434            0 :             epsm1 = s% eps_nuc_categories(cat,ii-1)
    2435            0 :             if (eps < 1d-3 .or. epsm1 < 1d-3) return
    2436            0 :             dlogP = (s% lnPeos(ii) - s% lnPeos(ii-1))/ln10
    2437            0 :             if (dlogP <= 0d0) return
    2438            0 :             dlog_eps = log10(eps/epsm1)
    2439            0 :             get_dlog_eps_dlogP = dlog_eps/dlogP
    2440            0 :          end function get_dlog_eps_dlogP
    2441              : 
    2442              : 
    2443              :          real(dp) function pt(v,k)
    2444              :             integer, intent(in) :: k
    2445              :             real(dp), pointer :: v(:)
    2446              :             if (k == 1) then
    2447              :                pt = v(k)
    2448              :             else
    2449              :                pt = (v(k)*s% dq(k-1) + v(k-1)*s% dq(k))/(s% dq(k-1) + s% dq(k))
    2450              :             end if
    2451              :          end function pt
    2452              : 
    2453              : 
    2454            0 :          real(dp) function if_rot(v,k, alt)
    2455              :             real(dp),dimension(:), intent(in) :: v
    2456              :             integer, intent(in) :: k
    2457              :             real(dp), optional, intent(in) :: alt
    2458            0 :             if (s% rotation_flag) then
    2459            0 :                if_rot = v(k)
    2460              :             else
    2461            0 :                if (present(alt)) then
    2462            0 :                   if_rot = alt
    2463              :                else
    2464              :                   if_rot = 0
    2465              :                end if
    2466              :             end if
    2467            0 :          end function if_rot
    2468              : 
    2469              : 
    2470            0 :          real(dp) function if_rot_ad(v,k, alt)
    2471              :             type(auto_diff_real_star_order1), dimension(:), pointer :: v
    2472              :             integer, intent(in) :: k
    2473              :             real(dp), optional, intent(in) :: alt
    2474            0 :             if (s% rotation_flag) then
    2475            0 :                if_rot_ad = v(k)% val
    2476              :             else
    2477            0 :                if (present(alt)) then
    2478            0 :                   if_rot_ad = alt
    2479              :                else
    2480              :                   if_rot_ad = 0
    2481              :                end if
    2482              :             end if
    2483            0 :          end function if_rot_ad
    2484              : 
    2485              :       end subroutine getval_for_profile
    2486              : 
    2487              :       end module profile_getval
        

Generated by: LCOV version 2.0-1