LCOV - code coverage report
Current view: top level - star/private - atm_support.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 7.6 % 340 26
Test Date: 2026-11-11 22:04:34 Functions: 21.1 % 19 4

            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 atm_support
      21              : 
      22              :   use star_private_def
      23              :   use const_def, only: dp, ln10
      24              :   use utils_lib, only: mesa_error, is_bad
      25              : 
      26              :   implicit none
      27              : 
      28              :   private
      29              :   public :: get_atm_PT
      30              :   public :: get_atm_PT_legacy_grey_and_kap
      31              :   public :: get_atm_tau_base
      32              :   public :: get_T_tau_id
      33              :   public :: build_atm
      34              : 
      35              : contains
      36              : 
      37           44 :   subroutine get_atm_PT( &
      38              :        s, tau_surf, L, R, M, cgrav, skip_partials, &
      39              :        Teff, &
      40              :        lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
      41              :        lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
      42              :        ierr)
      43              : 
      44              :     type (star_info), pointer :: s
      45              :     real(dp), intent(in)      :: tau_surf, L, R, M, cgrav
      46              :     logical, intent(in)       :: skip_partials
      47              :     real(dp), intent(in)      :: Teff
      48              :     real(dp), intent(out)     :: lnT_surf
      49              :     real(dp), intent(out)     :: dlnT_dL
      50              :     real(dp), intent(out)     :: dlnT_dlnR
      51              :     real(dp), intent(out)     :: dlnT_dlnM
      52              :     real(dp), intent(out)     :: dlnT_dlnkap
      53              :     real(dp), intent(out)     :: lnP_surf
      54              :     real(dp), intent(out)     :: dlnP_dL
      55              :     real(dp), intent(out)     :: dlnP_dlnR
      56              :     real(dp), intent(out)     :: dlnP_dlnM
      57              :     real(dp), intent(out)     :: dlnP_dlnkap
      58              :     integer, intent(out)      :: ierr
      59              : 
      60              :     real(dp) :: kap
      61              : 
      62           44 :     if (is_bad(tau_surf)) then
      63            0 :        write(*,*) 'tau_surf', tau_surf
      64            0 :        ierr = -1
      65            0 :        return
      66              :        call mesa_error(__FILE__,__LINE__,'bad tau_surf arg for get_atm_PT')
      67              :     end if
      68              : 
      69              :     ! Evaluate surface temperature and pressure by dispatching to the
      70              :     ! appropriate internal routine
      71              : 
      72           88 :     select case (s% atm_option)
      73              : 
      74              :     case ('T_tau')
      75              : 
      76              :        call get_T_tau( &
      77              :             s, tau_surf, L, R, M, cgrav, &
      78              :             s% atm_T_tau_relation, s% atm_T_tau_opacity, skip_partials, &
      79              :             Teff, kap, &
      80              :             lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
      81              :             lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
      82           44 :             ierr)
      83              : 
      84              :     case ('table')
      85              : 
      86              :        call get_table( &
      87              :             s, skip_partials, L, R, M, cgrav, &
      88              :             Teff, &
      89              :             lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
      90              :             lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
      91            0 :             ierr)
      92              : 
      93              :     case ('irradiated_grey')
      94              : 
      95              :        call get_irradiated( &
      96              :             s, s% atm_irradiated_opacity, skip_partials, L, R, M, cgrav, &
      97              :             Teff, &
      98              :             lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
      99              :             lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
     100            0 :             ierr)
     101              : 
     102              :     case default
     103              : 
     104           44 :        call get_legacy(s, ierr)
     105              : 
     106              :     end select
     107              : 
     108              :   end subroutine get_atm_PT
     109              : 
     110              : 
     111            0 :   subroutine get_atm_PT_legacy_grey_and_kap( &
     112              :        s, tau_surf, L, R, M, cgrav, skip_partials, &
     113              :        Teff, kap, &
     114              :        lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
     115              :        lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
     116              :        ierr)
     117              : 
     118              :     type(star_info), pointer :: s
     119              :     real(dp), intent(in)     :: tau_surf, L, R, M, cgrav
     120              :     logical, intent(in)      :: skip_partials
     121              :     real(dp), intent(in)     :: Teff
     122              :     real(dp), intent(out)    :: kap
     123              :     real(dp), intent(out)    :: lnT_surf
     124              :     real(dp), intent(out)    :: dlnT_dL
     125              :     real(dp), intent(out)    :: dlnT_dlnR
     126              :     real(dp), intent(out)    :: dlnT_dlnM
     127              :     real(dp), intent(out)    :: dlnT_dlnkap
     128              :     real(dp), intent(out)    :: lnP_surf
     129              :     real(dp), intent(out)    :: dlnP_dL
     130              :     real(dp), intent(out)    :: dlnP_dlnR
     131              :     real(dp), intent(out)    :: dlnP_dlnM
     132              :     real(dp), intent(out)    :: dlnP_dlnkap
     133              :     integer, intent(out)     :: ierr
     134              : 
     135              :     ! This routine is for legacy callers who require the old
     136              :     ! grey_and_kap behavior
     137              : 
     138              :     call get_T_tau( &
     139              :        s, tau_surf, L, R, M, cgrav, 'Eddington', 'iterated', skip_partials, &
     140              :        Teff, kap, &
     141              :        lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
     142              :        lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
     143            0 :        ierr)
     144              : 
     145            0 :     return
     146              : 
     147              :   end subroutine get_atm_PT_legacy_grey_and_kap
     148              : 
     149              : 
     150            1 :   subroutine get_atm_tau_base(s, tau_base, ierr)
     151              : 
     152              :     use atm_lib, only: &
     153              :          atm_get_T_tau_base, &
     154              :          atm_get_table_base
     155              : 
     156              :     type(star_info), pointer :: s
     157              :     real(dp), intent(out)    :: tau_base
     158              :     integer, intent(out)     :: ierr
     159              : 
     160              :     integer :: T_tau_id
     161              :     integer :: table_id
     162              : 
     163            1 :     ierr = 0
     164              : 
     165              :     ! Get the base optical depth
     166              : 
     167            2 :     select case (s% atm_option)
     168              : 
     169              :     case ('T_tau')
     170              : 
     171            1 :        call get_T_tau_id(s% atm_T_tau_relation, T_tau_id, ierr)
     172            1 :        if (ierr /= 0) then
     173            0 :          s% retry_message = 'Call to get_T_tau_id failed in get_atm_tau_base'
     174            0 :          if (s% report_ierr) write(*, *) s% retry_message
     175            0 :           return
     176              :        end if
     177              : 
     178            1 :        call atm_get_T_tau_base(T_tau_id, tau_base, ierr)
     179            1 :        if (ierr /= 0) then
     180            0 :          s% retry_message = 'Call to atm_get_T_tau_base failed in get_atm_tau_base'
     181            0 :          if (s% report_ierr) write(*, *) s% retry_message
     182            0 :           return
     183              :        end if
     184              : 
     185              :     case ('table')
     186              : 
     187            0 :        call get_table_id(s% atm_table, table_id, ierr)
     188            0 :        if (ierr /= 0) then
     189            0 :          s% retry_message = 'Call to get_table_id failed in get_atm_tau_base'
     190            0 :          if (s% report_ierr) write(*, *) s% retry_message
     191            0 :           return
     192              :        end if
     193              : 
     194            0 :        call atm_get_table_base(table_id, tau_base, ierr)
     195            0 :        if (ierr /= 0) then
     196            0 :          s% retry_message = 'Call to atm_get_table_base failed in get_atm_tau_base'
     197            0 :          if (s% report_ierr) write(*, *) s% retry_message
     198            0 :           return
     199              :        end if
     200              : 
     201              :     case ('irradiated_grey')
     202              : 
     203            0 :        tau_base = 2._dp/3._dp
     204              : 
     205              :     case default
     206              : 
     207              :        ! All other options use this
     208              : 
     209            2 :        tau_base = 2._dp/3._dp
     210              : 
     211              :     end select
     212              : 
     213              :     return
     214              : 
     215              :   end subroutine get_atm_tau_base
     216              : 
     217              : 
     218          132 :   subroutine get_T_tau( &
     219              :        s, tau_surf, L, R, M, cgrav, T_tau_relation, T_tau_opacity, skip_partials, &
     220              :        Teff, kap, &
     221              :        lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
     222              :        lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
     223              :        ierr)
     224              : 
     225              :     use atm_lib, only: &
     226              :          atm_eval_T_tau_uniform, &
     227              :          atm_eval_T_tau_varying
     228              :     use kap_support, only : prepare_kap
     229              : 
     230              :     type (star_info), pointer :: s
     231              :     real(dp), intent(in)      :: tau_surf, L, R, M, cgrav
     232              :     character(*), intent(in)  :: T_tau_relation
     233              :     character(*), intent(in)  :: T_tau_opacity
     234              :     logical, intent(in)       :: skip_partials
     235              :     real(dp), intent(in)      :: Teff
     236              :     real(dp), intent(out)     :: kap
     237              :     real(dp), intent(out)     :: lnT_surf
     238              :     real(dp), intent(out)     :: dlnT_dL
     239              :     real(dp), intent(out)     :: dlnT_dlnR
     240              :     real(dp), intent(out)     :: dlnT_dlnM
     241              :     real(dp), intent(out)     :: dlnT_dlnkap
     242              :     real(dp), intent(out)     :: lnP_surf
     243              :     real(dp), intent(out)     :: dlnP_dL
     244              :     real(dp), intent(out)     :: dlnP_dlnR
     245              :     real(dp), intent(out)     :: dlnP_dlnM
     246              :     real(dp), intent(out)     :: dlnP_dlnkap
     247              :     integer, intent(out)      :: ierr
     248              : 
     249              :     integer  :: T_tau_id
     250              :     real(dp) :: kap_guess
     251              : 
     252              :     include 'formats'
     253              : 
     254              :     ! Sanity check on L
     255              : 
     256           44 :     if (L < 0._dp) then
     257            0 :        s% retry_message = 'get_T_tau -- L <= 0'
     258            0 :        if (s% report_ierr) then
     259            0 :           write(*,2) 'get_T_tau: L <= 0', s% model_number, L
     260              :           !call mesa_error(__FILE__,__LINE__)
     261              :        end if
     262            0 :        ierr = -1
     263            0 :        return
     264              :     end if
     265              : 
     266              :     ! Get the T-tau id
     267              : 
     268           44 :     call get_T_tau_id(T_tau_relation, T_tau_id, ierr)
     269           44 :     if (ierr /= 0) then
     270            0 :        s% retry_message = 'Call to get_T_tau_id failed in get_T_tau'
     271            0 :        if (s% report_ierr) write(*, *) s% retry_message
     272            0 :        return
     273              :     end if
     274              : 
     275              :     ! Evaluate temperature and pressure by dispatching to the
     276              :     ! appropriate atm_lib routine, with the supplied T-tau relation
     277              : 
     278           44 :     select case (T_tau_opacity)
     279              : 
     280              :     case ('fixed')
     281              : 
     282              :        ! ok to use s% opacity(1) for fixed
     283              :        call atm_eval_T_tau_uniform( &
     284              :             tau_surf, L, R, M, cgrav, s% opacity(1), s% Pextra_factor, &
     285              :             T_tau_id, eos_proc_for_get_T_tau, kap_proc_for_get_T_tau, &
     286              :             s%atm_T_tau_errtol, 0, skip_partials, &
     287              :             Teff, kap, &
     288              :             lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
     289              :             lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
     290           44 :             ierr)
     291              : 
     292              :     case ('iterated')
     293              : 
     294            0 :        call prepare_kap(s, ierr)
     295            0 :        if (ierr /= 0) then
     296            0 :          s% retry_message = 'Call to prepare_kap failed in get_T_tau'
     297            0 :          if (s% report_ierr) write(*, *) s% retry_message
     298            0 :           return
     299              :        end if
     300              : 
     301              :        ! need to start iterations from same kap each time, so use opacity_start
     302            0 :        if (s% solver_iter > 0) then
     303            0 :           kap_guess = s% opacity_start(1)
     304              :        else
     305            0 :           kap_guess = s% opacity(1)
     306              :        end if
     307              :        call atm_eval_T_tau_uniform( &
     308              :             tau_surf, L, R, M, cgrav, kap_guess, s% Pextra_factor, &
     309              :             T_tau_id, eos_proc_for_get_T_tau, kap_proc_for_get_T_tau, &
     310              :             s%atm_T_tau_errtol, s%atm_T_tau_max_iters, skip_partials, &
     311              :             Teff, kap, &
     312              :             lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
     313              :             lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
     314            0 :             ierr)
     315              : 
     316              :     case ('varying')
     317              : 
     318            0 :        call prepare_kap(s, ierr)
     319            0 :        if (ierr /= 0) then
     320            0 :          s% retry_message = 'Call to prepare_kap failed in get_T_tau'
     321            0 :          if (s% report_ierr) write(*, *) s% retry_message
     322            0 :           return
     323              :        end if
     324              : 
     325              :        call atm_eval_T_tau_varying( &
     326              :             tau_surf, L, R, M, cgrav, &
     327              :             T_tau_id, eos_proc_for_get_T_tau, kap_proc_for_get_T_tau, &
     328              :             s% atm_T_tau_errtol, s% atm_T_tau_max_steps, skip_partials, &
     329              :             Teff, &
     330              :             lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
     331              :             lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
     332            0 :             ierr)
     333              : 
     334            0 :        kap = 0._dp  ! This value is not used
     335              : 
     336              :     case default
     337              : 
     338            0 :        write(*,*) 'Unknown value for atm_T_tau_opacity: ' // trim(T_tau_opacity)
     339           44 :        call mesa_error(__FILE__,__LINE__,'Please amend your inlist file to correct this problem')
     340              : 
     341              :     end select
     342              : 
     343              :     return
     344              : 
     345              :   contains
     346              : 
     347            0 :     subroutine eos_proc_for_get_T_tau( &
     348              :          lnP, lnT, &
     349            0 :          lnRho, res, dres_dlnRho, dres_dlnT, &
     350              :          ierr)
     351              : 
     352              :       real(dp), intent(in)  :: lnP
     353              :       real(dp), intent(in)  :: lnT
     354              :       real(dp), intent(out) :: lnRho
     355              :       real(dp), intent(out) :: res(:)
     356              :       real(dp), intent(out) :: dres_dlnRho(:)
     357              :       real(dp), intent(out) :: dres_dlnT(:)
     358              :       integer, intent(out)  :: ierr
     359              :       include 'formats'
     360              : 
     361              :       call eos_proc( &
     362              :            s, lnP, lnT, &
     363              :            lnRho, res, dres_dlnRho, dres_dlnT, &
     364            0 :            ierr)
     365              : 
     366            0 :     end subroutine eos_proc_for_get_T_tau
     367              : 
     368              : 
     369            0 :     subroutine kap_proc_for_get_T_tau( &
     370            0 :          lnRho, lnT, res, dres_dlnRho, dres_dlnT, &
     371              :          kap, dlnkap_dlnRho, dlnkap_dlnT, &
     372              :          ierr)
     373              : 
     374              :       real(dp), intent(in)  :: lnRho
     375              :       real(dp), intent(in)  :: lnT
     376              :       real(dp), intent(in)  :: res(:)
     377              :       real(dp), intent(in)  :: dres_dlnRho(:)
     378              :       real(dp), intent(in)  :: dres_dlnT(:)
     379              :       real(dp), intent(out) :: kap
     380              :       real(dp), intent(out) :: dlnkap_dlnRho
     381              :       real(dp), intent(out) :: dlnkap_dlnT
     382              :       integer, intent(out)  :: ierr
     383              :       include 'formats'
     384              : 
     385              :       call kap_proc( &
     386              :            s, lnRho, lnT, res, dres_dlnRho, dres_dlnT, &
     387              :            kap, dlnkap_dlnRho, dlnkap_dlnT, &
     388            0 :            ierr)
     389              : 
     390            0 :     end subroutine kap_proc_for_get_T_tau
     391              : 
     392              :   end subroutine get_T_tau
     393              : 
     394              : 
     395           45 :   subroutine get_T_tau_id (T_tau_relation, T_tau_id, ierr)
     396              : 
     397              :     use atm_def, only: &
     398              :          ATM_T_TAU_EDDINGTON, &
     399              :          ATM_T_TAU_SOLAR_HOPF, &
     400              :          ATM_T_TAU_KRISHNA_SWAMY, &
     401              :          ATM_T_TAU_TRAMPEDACH_SOLAR
     402              : 
     403              :     character(*), intent(in) :: T_tau_relation
     404              :     integer, intent(out)     :: T_tau_id
     405              :     integer, intent(out)     :: ierr
     406              : 
     407           45 :     ierr = 0
     408              : 
     409              :     ! Get the T-tau id
     410              : 
     411           45 :     select case (T_tau_relation)
     412              :     case ('Eddington')
     413           45 :        T_tau_id = ATM_T_TAU_EDDINGTON
     414              :     case ('solar_Hopf')
     415            0 :        T_tau_id = ATM_T_TAU_SOLAR_HOPF
     416              :     case ('Krishna_Swamy')
     417            0 :        T_tau_id = ATM_T_TAU_KRISHNA_SWAMY
     418              :     case ('Trampedach_solar')
     419            0 :        T_tau_id = ATM_T_TAU_TRAMPEDACH_SOLAR
     420              :     case default
     421            0 :        write(*,*) 'Unknown value for atm_T_tau_relation: ' // trim(T_tau_relation)
     422           45 :        call mesa_error(__FILE__,__LINE__,'Please amend your inlist file to correct this problem')
     423              :     end select
     424              : 
     425           45 :     return
     426              : 
     427              :   end subroutine get_T_tau_id
     428              : 
     429              : 
     430            0 :   subroutine get_table( &
     431              :        s, skip_partials, L, R, M, cgrav, &
     432              :        Teff, &
     433              :        lnT, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
     434              :        lnP, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
     435              :        ierr)
     436              : 
     437              :     use atm_lib, only: &
     438              :          atm_eval_table, &
     439              :          atm_get_table_alfa_beta, &
     440              :          atm_get_table_base
     441              : 
     442              :     type (star_info), pointer :: s
     443              :     logical, intent(in)       :: skip_partials
     444              :     real(dp), intent(in)      :: L, R, M, cgrav
     445              :     real(dp), intent(in)      :: Teff
     446              :     real(dp), intent(out)     :: lnT
     447              :     real(dp), intent(out)     :: dlnT_dL
     448              :     real(dp), intent(out)     :: dlnT_dlnR
     449              :     real(dp), intent(out)     :: dlnT_dlnM
     450              :     real(dp), intent(out)     :: dlnT_dlnkap
     451              :     real(dp), intent(out)     :: lnP
     452              :     real(dp), intent(out)     :: dlnP_dL
     453              :     real(dp), intent(out)     :: dlnP_dlnR
     454              :     real(dp), intent(out)     :: dlnP_dlnM
     455              :     real(dp), intent(out)     :: dlnP_dlnkap
     456              :     integer, intent(out)      :: ierr
     457              : 
     458              :     real(dp) :: Z
     459              :     real(dp) :: tau_base
     460              :     integer  :: table_id
     461              :     real(dp) :: alfa
     462              :     real(dp) :: beta
     463              :     real(dp) :: lnT_a
     464              :     real(dp) :: dlnT_dL_a
     465              :     real(dp) :: dlnT_dlnR_a
     466              :     real(dp) :: dlnT_dlnM_a
     467              :     real(dp) :: dlnT_dlnkap_a
     468              :     real(dp) :: lnP_a
     469              :     real(dp) :: dlnP_dL_a
     470              :     real(dp) :: dlnP_dlnR_a
     471              :     real(dp) :: dlnP_dlnM_a
     472              :     real(dp) :: dlnP_dlnkap_a
     473              :     real(dp) :: lnT_b
     474              :     real(dp) :: dlnT_dL_b
     475              :     real(dp) :: dlnT_dlnR_b
     476              :     real(dp) :: dlnT_dlnM_b
     477              :     real(dp) :: dlnT_dlnkap_b
     478              :     real(dp) :: lnP_b
     479              :     real(dp) :: dlnP_dL_b
     480              :     real(dp) :: dlnP_dlnR_b
     481              :     real(dp) :: dlnP_dlnM_b
     482              :     real(dp) :: dlnP_dlnkap_b
     483              :     real(dp) :: kap_a
     484              : 
     485              :     include 'formats'
     486              : 
     487              :     ! Check that tau_factor is correct
     488              : 
     489            0 :     if (s% tau_factor /= 1._dp) then
     490            0 :        write(*,*) 'Cannot use atm_option == ''table'' with tau_factor /= 1'
     491            0 :        call mesa_error(__FILE__,__LINE__,'Please amend your inlist file to correct this problem')
     492              :     end if
     493              : 
     494            0 :     Z = s% Z(1)
     495              : 
     496              :     ! Sanity check on L
     497              : 
     498            0 :     if (L < 0._dp) then
     499            0 :        s% retry_message = 'atm get_table: L < 0'
     500            0 :        if (s% report_ierr) then
     501            0 :           write(*,2) 'atm get_table: L < 0', s% model_number, L
     502              :        end if
     503            0 :        ierr = -1
     504            0 :        return
     505              :     end if
     506              : 
     507              :     ! Get the table id
     508              : 
     509            0 :     call get_table_id(s% atm_table, table_id, ierr)
     510            0 :     if (ierr /= 0) then
     511            0 :        s% retry_message = 'get_table_id failed in get_table'
     512            0 :        if (s% report_ierr) write(*, *) s% retry_message
     513            0 :        return
     514              :     end if
     515              : 
     516              :     ! Set up alfa and beta for doing table blending with off-table
     517              :     ! option
     518              : 
     519              :     call atm_get_table_alfa_beta( &
     520            0 :          L, Teff, R, M, cgrav, table_id, alfa, beta, ierr)
     521            0 :     if (ierr /= 0) then
     522            0 :        s% retry_message = 'Call to atm_get_table_alfa_beta failed in get_table'
     523            0 :        if (s% report_ierr) write(*, *) s% retry_message
     524            0 :        return
     525              :     end if
     526              : 
     527              :     ! If completely off the table, use the same
     528              :     ! attachment depth for the table and backup atmosphere.
     529            0 :     call atm_get_table_base(table_id, tau_base, ierr)
     530            0 :     if (ierr /= 0) then
     531            0 :        if (s% report_ierr) then
     532            0 :           write(*,*) 'Call to atm_get_table_base failed in get_table'
     533              :        end if
     534            0 :        return
     535              :     end if
     536            0 :     s% tau_base = tau_base
     537            0 :     if (beta == 0._dp) then
     538            0 :        write(*,*) "outside range for atm_table,"
     539            0 :        write(*,*) "setting T_tau value for tau_base =", tau_base
     540              :     end if
     541              : 
     542              :     ! Evaluate temperature and pressure from the table
     543              : 
     544            0 :     if (beta /= 0._dp) then
     545              : 
     546              :        call atm_eval_table( &
     547              :             L, R, M, cgrav, table_id, Z, skip_partials, &
     548              :             Teff, &
     549              :             lnT_b, dlnT_dL_b, dlnT_dlnR_b, dlnT_dlnM_b, dlnT_dlnkap_b, &
     550              :             lnP_b, dlnP_dL_b, dlnP_dlnR_b, dlnP_dlnM_b, dlnP_dlnkap_b, &
     551            0 :             ierr)
     552            0 :        if (ierr /= 0) then
     553            0 :           s% retry_message = 'Call to atm_eval_table failed in get_table'
     554            0 :           if (s% report_ierr) write(*, *) s% retry_message
     555            0 :           return
     556              :        end if
     557              : 
     558              :     else
     559              : 
     560            0 :        lnT_b = 0._dp
     561            0 :        dlnT_dL_b = 0._dp
     562            0 :        dlnT_dlnR_b = 0._dp
     563            0 :        dlnT_dlnM_b = 0._dp
     564            0 :        dlnT_dlnkap_b = 0._dp
     565              : 
     566            0 :        lnP_b = 0._dp
     567            0 :        dlnP_dL_b = 0._dp
     568            0 :        dlnP_dlnR_b = 0._dp
     569            0 :        dlnP_dlnM_b = 0._dp
     570            0 :        dlnP_dlnkap_b = 0._dp
     571              : 
     572              :     end if
     573              : 
     574              :     ! Evaluate temperature and pressure from the backup atmosphere
     575              :     ! option
     576              : 
     577            0 :     if (alfa /= 0._dp) then
     578              : 
     579            0 :        select case (s% atm_off_table_option)
     580              : 
     581              :        case ('T_tau')
     582              : 
     583              :           call get_T_tau( &
     584              :                s, s% tau_base, L, R, M, cgrav, &
     585              :                s% atm_T_tau_relation, s% atm_T_tau_opacity, skip_partials, &
     586              :                Teff, kap_a, &
     587              :                lnT_a, dlnT_dL_a, dlnT_dlnR_a, dlnT_dlnM_a, dlnT_dlnkap_a, &
     588              :                lnP_a, dlnP_dL_a, dlnP_dlnR_a, dlnP_dlnM_a, dlnP_dlnkap_a, &
     589            0 :                ierr)
     590            0 :           if (ierr /= 0) then
     591            0 :              s% retry_message = 'Call to get_T_tau failed in get_table'
     592            0 :              if (s% report_ierr) write(*, *) s% retry_message
     593            0 :              return
     594              :           end if
     595              : 
     596              :        case ('')
     597              : 
     598            0 :           write(*,*) 'Attempt to interpolate outside atmosphere table'
     599            0 :           call mesa_error(__FILE__,__LINE__,'Try setting the which_off_table_option control in your inlist file')
     600            0 :           stop
     601              : 
     602              :        case default
     603              : 
     604            0 :           write(*,*) 'Unknown value for atm_off_table_option: ' // trim(s% atm_off_table_option)
     605            0 :           call mesa_error(__FILE__,__LINE__,'Please amend your inlist file to correct this problem')
     606              : 
     607              :        end select
     608              : 
     609              :     else
     610              : 
     611            0 :        lnT_a = 0._dp
     612            0 :        dlnT_dL_a = 0._dp
     613            0 :        dlnT_dlnR_a = 0._dp
     614            0 :        dlnT_dlnM_a = 0._dp
     615            0 :        dlnT_dlnkap_a = 0._dp
     616              : 
     617            0 :        lnP_a = 0._dp
     618            0 :        dlnP_dL_a = 0._dp
     619            0 :        dlnP_dlnR_a = 0._dp
     620            0 :        dlnP_dlnM_a = 0._dp
     621            0 :        dlnP_dlnkap_a = 0._dp
     622              : 
     623              :     end if
     624              : 
     625              :     ! Blend the results together
     626              : 
     627            0 :     lnT = alfa*lnT_a + beta*lnT_b
     628            0 :     lnP = alfa*lnP_a + beta*lnP_b
     629              : 
     630            0 :     if (.not. skip_partials) then
     631              : 
     632            0 :        dlnT_dL = alfa*dlnT_dL_a + beta*dlnT_dL_b
     633            0 :        dlnT_dlnR = alfa*dlnT_dlnR_a + beta*dlnT_dlnR_b
     634            0 :        dlnT_dlnM = alfa*dlnT_dlnM_a + beta*dlnT_dlnM_b
     635            0 :        dlnT_dlnkap = alfa*dlnT_dlnkap_a + beta*dlnT_dlnkap_b
     636              : 
     637            0 :        dlnP_dL = alfa*dlnP_dL_a + beta*dlnP_dL_b
     638            0 :        dlnP_dlnR = alfa*dlnP_dlnR_a + beta*dlnP_dlnR_b
     639            0 :        dlnP_dlnM = alfa*dlnP_dlnM_a + beta*dlnP_dlnM_b
     640            0 :        dlnP_dlnkap = alfa*dlnP_dlnkap_a + beta*dlnP_dlnkap_b
     641              : 
     642              :     end if
     643              : 
     644              :     ! Set the effective temperature
     645              : 
     646              :     ! if (alfa /= 0._dp) then
     647              :     !    if (beta /= 0._dp) then
     648              :     !       if (Teff_a /= Teff_b) then
     649              :     !          ierr = -1
     650              :     !          s% retry_message = 'Mismatch between Teff values in get_tables'
     651              :     !          write(*,*) 'Mismatch between Teff values in get_tables: ', Teff_a, Teff_b
     652              :     !          !call mesa_error(__FILE__,__LINE__)
     653              :     !       end if
     654              :     !    end if
     655              :     !    Teff = Teff_a
     656              :     ! else
     657              :     !    Teff = Teff_b
     658              :     ! end if
     659              : 
     660              :     return
     661              : 
     662              :   end subroutine get_table
     663              : 
     664              : 
     665            0 :   subroutine get_table_id (table_name, table_id, ierr)
     666              : 
     667              :     use atm_def, only: &
     668              :          ATM_TABLE_TAU_100, &
     669              :          ATM_TABLE_TAU_10, &
     670              :          ATM_TABLE_TAU_1, &
     671              :          ATM_TABLE_TAU_1M1, &
     672              :          ATM_TABLE_PHOTOSPHERE, &
     673              :          ATM_TABLE_WD_TAU_25, &
     674              :          ATM_TABLE_DB_WD_TAU_25
     675              : 
     676              :     character(*), intent(in) :: table_name
     677              :     integer, intent(out)     :: table_id
     678              :     integer, intent(out)     :: ierr
     679              : 
     680            0 :     ierr = 0
     681              : 
     682              :     ! Get the table id
     683              : 
     684            0 :     select case (table_name)
     685              :     case ('tau_100')
     686            0 :        table_id = ATM_TABLE_TAU_100
     687              :     case ('tau_10')
     688            0 :        table_id = ATM_TABLE_TAU_10
     689              :     case ('tau_1')
     690            0 :        table_id = ATM_TABLE_TAU_1
     691              :     case ('tau_1m1')
     692            0 :        table_id = ATM_TABLE_TAU_1M1
     693              :     case ('photosphere')
     694            0 :        table_id = ATM_TABLE_PHOTOSPHERE
     695              :     case ('WD_tau_25')
     696            0 :        table_id = ATM_TABLE_WD_TAU_25
     697              :     case ('DB_WD_tau_25')
     698            0 :        table_id = ATM_TABLE_DB_WD_TAU_25
     699              :     case default
     700            0 :        write(*,*) 'Unknown value for atm_table: ' // trim(table_name)
     701            0 :        call mesa_error(__FILE__,__LINE__,'Please amend your inlist file to correct this problem')
     702              :     end select
     703              : 
     704            0 :     return
     705              : 
     706              :   end subroutine get_table_id
     707              : 
     708              : 
     709            0 :   subroutine get_irradiated( &
     710              :        s, irradiated_opacity, skip_partials, L, R, M, cgrav, &
     711              :        Teff, &
     712              :        lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
     713              :        lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
     714              :        ierr)
     715              : 
     716              :     use atm_lib, only: atm_eval_irradiated
     717              :     use kap_support, only: prepare_kap
     718              : 
     719              :     type (star_info), pointer :: s
     720              :     character(*), intent(in)  :: irradiated_opacity
     721              :     logical, intent(in)       :: skip_partials
     722              :     real(dp), intent(in)      :: L, R, M, cgrav
     723              :     real(dp), intent(in)      :: Teff
     724              :     real(dp), intent(out)     :: lnT_surf
     725              :     real(dp), intent(out)     :: dlnT_dL
     726              :     real(dp), intent(out)     :: dlnT_dlnR
     727              :     real(dp), intent(out)     :: dlnT_dlnM
     728              :     real(dp), intent(out)     :: dlnT_dlnkap
     729              :     real(dp), intent(out)     :: lnP_surf
     730              :     real(dp), intent(out)     :: dlnP_dL
     731              :     real(dp), intent(out)     :: dlnP_dlnR
     732              :     real(dp), intent(out)     :: dlnP_dlnM
     733              :     real(dp), intent(out)     :: dlnP_dlnkap
     734              :     integer, intent(out)      :: ierr
     735              : 
     736              :     real(dp) :: kap_for_atm
     737              :     real(dp) :: kap
     738              :     real(dp) :: tau_surf
     739              : 
     740              :     include 'formats'
     741              : 
     742            0 :     if (s% solver_iter > 0) then
     743            0 :        kap_for_atm = s% opacity_start(1)
     744              :     else
     745            0 :        kap_for_atm = s% opacity(1)
     746              :     end if
     747              : 
     748              :     ! Sanity check on L
     749              : 
     750            0 :     if (L < 0._dp) then
     751            0 :        s% retry_message = 'get_irradiated: L <= 0'
     752            0 :        if (s% report_ierr) then
     753            0 :           write(*,2) 'get_irradiated: L <= 0', s% model_number, L
     754              :           !call mesa_error(__FILE__,__LINE__)
     755              :        end if
     756            0 :        ierr = -1
     757            0 :        return
     758              :     end if
     759              : 
     760              :     ! Evaluate temperature and pressure by dispatching to the
     761              :     ! appropriate atm_lib routine
     762              : 
     763            0 :     select case (irradiated_opacity)
     764              : 
     765              :     case ('fixed')
     766              : 
     767              :        call atm_eval_irradiated( &
     768              :             L, R, M, cgrav, s% atm_irradiated_T_eq, s% atm_irradiated_P_surf, &
     769              :             kap_for_atm, s% atm_irradiated_kap_v, s% atm_irradiated_kap_v_div_kap_th, &
     770              :             eos_proc_for_get_irradiated, kap_proc_for_get_irradiated, &
     771              :             s% atm_irradiated_errtol, 0, skip_partials, &
     772              :             Teff, kap, tau_surf, &
     773              :             lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
     774            0 :             ierr)
     775              : 
     776              :     case ('iterated')
     777              : 
     778            0 :        call prepare_kap(s, ierr)
     779            0 :        if (ierr /= 0) then
     780            0 :           s% retry_message = 'Failed in call to prepare_kap'
     781            0 :           if (s% report_ierr) write(*, *) s% retry_message
     782            0 :           return
     783              :        end if
     784              : 
     785              :        call atm_eval_irradiated( &
     786              :             L, R, M, cgrav, s% atm_irradiated_T_eq, s% atm_irradiated_P_surf, &
     787              :             kap_for_atm, s% atm_irradiated_kap_v, s% atm_irradiated_kap_v_div_kap_th, &
     788              :             eos_proc_for_get_irradiated, kap_proc_for_get_irradiated, &
     789              :             s% atm_irradiated_errtol, s% atm_irradiated_max_iters, skip_partials, &
     790              :             Teff, kap, tau_surf, &
     791              :             lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
     792            0 :             ierr)
     793              : 
     794              :     case default
     795              : 
     796            0 :        write(*,*) 'Unknown value for atm_irradiated_opacity: ' // trim(irradiated_opacity)
     797            0 :        call mesa_error(__FILE__,__LINE__,'Please amend your inlist file to correct this problem')
     798              : 
     799              :     end select
     800              : 
     801              :     ! Set up remaining values
     802              : 
     803            0 :     lnP_surf = log(s% atm_irradiated_P_surf)
     804              : 
     805            0 :     dlnP_dL = 0._dp
     806            0 :     dlnP_dlnR = 0._dp
     807            0 :     dlnP_dlnM = 0._dp
     808            0 :     dlnP_dlnkap = 0._dp
     809              : 
     810              :     ! Update tau_factor
     811              : 
     812            0 :     s% tau_factor = tau_surf/s% tau_base
     813              : 
     814            0 :     return
     815              : 
     816              :   contains
     817              : 
     818            0 :     subroutine eos_proc_for_get_irradiated( &
     819              :          lnP, lnT, &
     820            0 :          lnRho, res, dres_dlnRho, dres_dlnT, &
     821              :          ierr)
     822              : 
     823              :       real(dp), intent(in)  :: lnP
     824              :       real(dp), intent(in)  :: lnT
     825              :       real(dp), intent(out) :: lnRho
     826              :       real(dp), intent(out) :: res(:)
     827              :       real(dp), intent(out) :: dres_dlnRho(:)
     828              :       real(dp), intent(out) :: dres_dlnT(:)
     829              :       integer, intent(out)  :: ierr
     830              : 
     831              :       call eos_proc( &
     832              :            s, lnP, lnT, &
     833              :            lnRho, res, dres_dlnRho, dres_dlnT, &
     834            0 :            ierr)
     835              : 
     836            0 :     end subroutine eos_proc_for_get_irradiated
     837              : 
     838              : 
     839            0 :     subroutine kap_proc_for_get_irradiated( &
     840            0 :          lnRho, lnT, res, dres_dlnRho, dres_dlnT, &
     841              :          kap, dlnkap_dlnRho, dlnkap_dlnT, &
     842              :          ierr)
     843              : 
     844              :       real(dp), intent(in)  :: lnRho
     845              :       real(dp), intent(in)  :: lnT
     846              :       real(dp), intent(in)  :: res(:)
     847              :       real(dp), intent(in)  :: dres_dlnRho(:)
     848              :       real(dp), intent(in)  :: dres_dlnT(:)
     849              :       real(dp), intent(out) :: kap
     850              :       real(dp), intent(out) :: dlnkap_dlnRho
     851              :       real(dp), intent(out) :: dlnkap_dlnT
     852              :       integer, intent(out)  :: ierr
     853              : 
     854              :       call kap_proc( &
     855              :            s, lnRho, lnT, res, dres_dlnRho, dres_dlnT, &
     856              :            kap, dlnkap_dlnRho, dlnkap_dlnT, &
     857            0 :            ierr)
     858              : 
     859            0 :     end subroutine kap_proc_for_get_irradiated
     860              : 
     861              :   end subroutine get_irradiated
     862              : 
     863              : 
     864            0 :   subroutine get_legacy (s, ierr)
     865              : 
     866              :     type(star_info), pointer :: s
     867              :     integer, intent(out)     :: ierr
     868              : 
     869              :     ! Handles legacy / invalid choices for atm_option. This is
     870              :     ! to guide users toward the newer atmosphere controls; in the long
     871              :     ! term, it can be removed
     872              : 
     873            0 :     select case (s% atm_option)
     874              : 
     875              :     case ('simple_photosphere')
     876              : 
     877            0 :        write(*,*) 'The ''simple_photosphere'' choice for atm_option is deprecated'
     878            0 :        write(*,*) 'To achieve the same results, set:'
     879            0 :        write(*,*) '   atm_option = ''T_tau'''
     880            0 :        write(*,*) '   atm_T_tau_relation = ''Eddington'''
     881            0 :        write(*,*) '   atm_T_tau_opacity = ''fixed'''
     882              : 
     883              :     case ('grey_and_kap')
     884              : 
     885            0 :        write(*,*) 'The ''grey_and_kap'' choice for atm_option is deprecated'
     886            0 :        write(*,*) 'To achieve the same results, set:'
     887            0 :        write(*,*) '   atm_option = ''T_tau'''
     888            0 :        write(*,*) '   atm_T_tau_relation = ''Eddington'''
     889            0 :        write(*,*) '   atm_T_tau_opacity = ''iterated'''
     890              : 
     891              :     case ('Eddington_grey')
     892              : 
     893            0 :        write(*,*) 'The ''Eddington_grey'' choice for atm_option is deprecated'
     894            0 :        write(*,*) 'To achieve the same results, set:'
     895            0 :        write(*,*) '   atm_option = ''T_tau'''
     896            0 :        write(*,*) '   atm_T_tau_relation = ''Eddington'''
     897            0 :        write(*,*) '   atm_T_tau_opacity = ''varying'''
     898              : 
     899              :     case ('solar_Hopf_grey')
     900              : 
     901            0 :        write(*,*) 'The ''solar_Hopf_grey'' choice for atm_option is deprecated'
     902            0 :        write(*,*) 'To achieve the same results, set:'
     903            0 :        write(*,*) '   atm_option = ''T_tau'''
     904            0 :        write(*,*) '   atm_T_tau_relation = ''solar_Hopf'''
     905            0 :        write(*,*) '   atm_T_tau_opacity = ''varying'''
     906              : 
     907              :     case ('Krishna_Swamy')
     908              : 
     909            0 :        write(*,*) 'The ''Krishna_Swamy'' choice for atm_option is deprecated'
     910            0 :        write(*,*) 'To achieve the same results, set:'
     911            0 :        write(*,*) '   atm_option = ''T_tau'''
     912            0 :        write(*,*) '   atm_T_tau_relation = ''Krishna_Swamy'''
     913            0 :        write(*,*) '   atm_T_tau_opacity = ''varying'''
     914              : 
     915              :     case ('tau_100_tables')
     916              : 
     917            0 :        write(*,*) 'The ''tau_100_tables'' choice for atm_option is deprecated'
     918            0 :        write(*,*) 'To achieve the same results, set:'
     919            0 :        write(*,*) '   atm_option = ''table'''
     920            0 :        write(*,*) '   atm_table = ''tau_100'''
     921              : 
     922              :     case ('tau_10_tables')
     923              : 
     924            0 :        write(*,*) 'The ''tau_10_tables'' choice for atm_option is deprecated'
     925            0 :        write(*,*) 'To achieve the same results, set:'
     926            0 :        write(*,*) '   atm_option = ''table'''
     927            0 :        write(*,*) '   atm_table = ''tau_10'''
     928              : 
     929              :     case ('tau_1_tables')
     930              : 
     931            0 :        write(*,*) 'The ''tau_1_tables'' choice for atm_option is deprecated'
     932            0 :        write(*,*) 'To achieve the same results, set:'
     933            0 :        write(*,*) '   atm_option = ''table'''
     934            0 :        write(*,*) '   atm_table = ''tau_1'''
     935              : 
     936              :     case ('tau_1m1_tables')
     937              : 
     938            0 :        write(*,*) 'The ''tau_1m1_tables'' choice for atm_option is deprecated'
     939            0 :        write(*,*) 'To achieve the same results, set:'
     940            0 :        write(*,*) '   atm_option = ''table'''
     941            0 :        write(*,*) '   atm_table = ''tau_1m1'''
     942              : 
     943              :     case ('photosphere_tables')
     944              : 
     945            0 :        write(*,*) 'The ''tau_10_tables'' choice for atm_option is deprecated'
     946            0 :        write(*,*) 'To achieve the same results, set:'
     947            0 :        write(*,*) '   atm_option = ''table'''
     948            0 :        write(*,*) '   atm_table = ''photosphere'''
     949              : 
     950              :     case ('grey_irradiated')
     951              : 
     952            0 :        write(*,*) 'The ''grey_irradiated'' choice for atm_option is deprecated'
     953            0 :        write(*,*) 'To achieve the same results, set:'
     954            0 :        write(*,*) '   atm_option = ''irradiated_grey'''
     955            0 :        write(*,*) '   atm_irradiated_opacity = ''fixed'' (if atm_grey_irradiated_simple_kap_th = .true.)'
     956            0 :        write(*,*) '   atm_irradiated_opacity = ''varying'' (if atm_grey_irradiated_simple_kap_th = .false.)'
     957              : 
     958              :     case default
     959              : 
     960            0 :       write(*,*) 'Unknown value for atm_option: ' // trim(s% atm_option)
     961              : 
     962              :     end select
     963              : 
     964              :     ! Stop because we can't continue
     965              : 
     966            0 :     ierr = -1  ! ifort complains if this isn't set
     967            0 :     call mesa_error(__FILE__,__LINE__,'Please amend your inlist file to correct this problem')
     968              : 
     969              :     return
     970              : 
     971              :   end subroutine get_legacy
     972              : 
     973              : 
     974            0 :   subroutine build_atm( &
     975              :        s, L, R, Teff, M, cgrav, ierr)
     976              : 
     977              :     type(star_info), pointer :: s
     978              :     real(dp), intent(in)     :: L, R, Teff, M, cgrav
     979              :     integer, intent(out)     :: ierr
     980              : 
     981              :     ! Create the atmosphere structure by dispatching to the
     982              :     ! appropriate internal routine
     983              : 
     984            0 :     select case (s% atm_option)
     985              : 
     986              :     case ('T_tau')
     987              : 
     988              :        call build_T_tau( &
     989              :             s, s% tau_factor*s% tau_base, L, R, Teff, M, cgrav, &
     990              :             s% atm_T_tau_relation, s% atm_T_tau_opacity, &
     991              :             s% atm_structure_num_pts, s% atm_structure, &
     992            0 :             ierr)
     993              : 
     994              :     case default
     995              : 
     996            0 :        write(*,*) 'Cannot create atm structure for atm_option: ' // TRIM(s% atm_option)
     997            0 :        call mesa_error(__FILE__,__LINE__,'Please amend your inlist file to correct this problem')
     998              : 
     999              :     end select
    1000              : 
    1001            0 :   end subroutine build_atm
    1002              : 
    1003              : 
    1004            0 :   subroutine build_T_tau( &
    1005              :        s, tau_surf, L, R, Teff, M, cgrav, T_tau_relation, T_tau_opacity, &
    1006              :        atm_structure_num_pts, atm_structure, &
    1007              :        ierr)
    1008              : 
    1009              :     use atm_lib, only: &
    1010              :          atm_build_T_tau_uniform, &
    1011              :          atm_build_T_tau_varying
    1012              : 
    1013              :     type(star_info), pointer :: s
    1014              :     real(dp), intent(in)     :: tau_surf, L, R, Teff, M, cgrav
    1015              :     character(*), intent(in) :: T_tau_relation
    1016              :     character(*), intent(in) :: T_tau_opacity
    1017              :     integer, intent(out)     :: atm_structure_num_pts
    1018              :     real(dp), pointer        :: atm_structure(:,:)
    1019              :     integer, intent(out)     :: ierr
    1020              : 
    1021              :     real(dp) :: kap
    1022              :     real(dp) :: lnT_surf
    1023              :     real(dp) :: dlnT_dL
    1024              :     real(dp) :: dlnT_dlnR
    1025              :     real(dp) :: dlnT_dlnM
    1026              :     real(dp) :: dlnT_dlnkap
    1027              :     real(dp) :: lnP_surf
    1028              :     real(dp) :: dlnP_dL
    1029              :     real(dp) :: dlnP_dlnR
    1030              :     real(dp) :: dlnP_dlnM
    1031              :     real(dp) :: dlnP_dlnkap
    1032              :     integer  :: T_tau_id
    1033              : 
    1034              :     ierr = 0
    1035              : 
    1036              :     ! First evaluate the temperature, pressure and opacity
    1037              : 
    1038              :     call get_T_tau( &
    1039              :          s, tau_surf, L, R, M, cgrav, T_tau_relation, T_tau_opacity, .TRUE., &
    1040              :          Teff, kap, &
    1041              :          lnT_surf, dlnT_dL, dlnT_dlnR, dlnT_dlnM, dlnT_dlnkap, &
    1042              :          lnP_surf, dlnP_dL, dlnP_dlnR, dlnP_dlnM, dlnP_dlnkap, &
    1043            0 :          ierr)
    1044            0 :     if (ierr /= 0) then
    1045            0 :        s% retry_message = 'Call to get_T_tau failed in build_T_tau'
    1046            0 :        if (s% report_ierr) write(*, *) s% retry_message
    1047            0 :        return
    1048              :     end if
    1049              : 
    1050              :     ! Get the T-tau id
    1051              : 
    1052            0 :     call get_T_tau_id(T_tau_relation, T_tau_id, ierr)
    1053            0 :     if (ierr /= 0) then
    1054            0 :        s% retry_message = 'Call to get_T_tau_id failed in build_T_tau'
    1055            0 :        if (s% report_ierr) write(*, *) s% retry_message
    1056            0 :        return
    1057              :     end if
    1058              : 
    1059              :     ! Build the atmosphere structure by dispatching to the
    1060              :     ! appropriate atm_lib routine, with the supplied T-tau relation
    1061              : 
    1062            0 :     select case (T_tau_opacity)
    1063              : 
    1064              :     case ('fixed', 'iterated')
    1065              : 
    1066              :        call atm_build_T_tau_uniform( &
    1067              :             tau_surf, L, R, Teff, M, cgrav, kap, s% Pextra_factor, s% atm_build_tau_outer, &
    1068              :             T_tau_id, eos_proc_for_build_T_tau, kap_proc_for_build_T_tau, &
    1069              :             s% atm_build_errtol, s% atm_build_dlogtau, &
    1070              :             atm_structure_num_pts, atm_structure, &
    1071            0 :             ierr)
    1072            0 :        if (ierr /= 0) then
    1073            0 :           s% retry_message = 'Call to atm_build_T_tau_uniform failed in build_T_tau'
    1074            0 :           if (s% report_ierr) write(*, *) s% retry_message
    1075            0 :           return
    1076              :        end if
    1077              : 
    1078              :     case ('varying')
    1079              : 
    1080              :        call atm_build_T_tau_varying( &
    1081              :             tau_surf, L, R, Teff, M, cgrav, lnP_surf, s% atm_build_tau_outer, &
    1082              :             T_tau_id, eos_proc_for_build_T_tau, kap_proc_for_build_T_tau, &
    1083              :             s% atm_build_errtol, s% atm_build_dlogtau, &
    1084              :             atm_structure_num_pts, atm_structure, &
    1085            0 :             ierr)
    1086            0 :        if (ierr /= 0) then
    1087            0 :           s% retry_message = 'Call to atm_build_T_tau_varying failed in build_T_tau'
    1088            0 :           if (s% report_ierr) write(*, *) s% retry_message
    1089            0 :           return
    1090              :        end if
    1091              : 
    1092              :     case default
    1093              : 
    1094            0 :        write(*,*) 'Unknown value for atm_T_tau_opacity: ' // trim(T_tau_opacity)
    1095            0 :        call mesa_error(__FILE__,__LINE__,'Please amend your inlist file to correct this problem')
    1096              : 
    1097              :     end select
    1098              : 
    1099              :     return
    1100              : 
    1101              :   contains
    1102              : 
    1103            0 :     subroutine eos_proc_for_build_T_tau( &
    1104              :          lnP, lnT, &
    1105            0 :          lnRho, res, dres_dlnRho, dres_dlnT, &
    1106              :          ierr)
    1107              : 
    1108              :       real(dp), intent(in)  :: lnP
    1109              :       real(dp), intent(in)  :: lnT
    1110              :       real(dp), intent(out) :: lnRho
    1111              :       real(dp), intent(out) :: res(:)
    1112              :       real(dp), intent(out) :: dres_dlnRho(:)
    1113              :       real(dp), intent(out) :: dres_dlnT(:)
    1114              :       integer, intent(out)  :: ierr
    1115              : 
    1116              :       call eos_proc( &
    1117              :            s, lnP, lnT, &
    1118              :            lnRho, res, dres_dlnRho, dres_dlnT, &
    1119            0 :            ierr)
    1120              : 
    1121            0 :     end subroutine eos_proc_for_build_T_tau
    1122              : 
    1123              : 
    1124            0 :     subroutine kap_proc_for_build_T_tau( &
    1125            0 :          lnRho, lnT, res, dres_dlnRho, dres_dlnT, &
    1126              :          kap, dlnkap_dlnRho, dlnkap_dlnT, &
    1127              :          ierr)
    1128              : 
    1129              :       real(dp), intent(in)  :: lnRho
    1130              :       real(dp), intent(in)  :: lnT
    1131              :       real(dp), intent(in)  :: res(:)
    1132              :       real(dp), intent(in)  :: dres_dlnRho(:)
    1133              :       real(dp), intent(in)  :: dres_dlnT(:)
    1134              :       real(dp), intent(out) :: kap
    1135              :       real(dp), intent(out) :: dlnkap_dlnRho
    1136              :       real(dp), intent(out) :: dlnkap_dlnT
    1137              :       integer, intent(out)  :: ierr
    1138              : 
    1139              :       call kap_proc( &
    1140              :            s, lnRho, lnT, res, dres_dlnRho, dres_dlnT, &
    1141              :            kap, dlnkap_dlnRho, dlnkap_dlnT, &
    1142            0 :            ierr)
    1143              : 
    1144            0 :     end subroutine kap_proc_for_build_T_tau
    1145              : 
    1146              :   end subroutine build_T_tau
    1147              : 
    1148              : 
    1149            0 :   subroutine eos_proc( &
    1150              :        s, lnP, lnT, &
    1151              :        lnRho, res, dres_dlnRho, dres_dlnT, &
    1152              :        ierr)
    1153              : 
    1154              :     use eos_def, only: num_eos_basic_results
    1155              :     use eos_lib, only: radiation_pressure, eos_gamma_PT_get_rho_energy
    1156              :     use eos_support, only: solve_eos_given_PgasT
    1157              : 
    1158              :     type(star_info), pointer :: s
    1159              :     real(dp), intent(in)     :: lnP
    1160              :     real(dp), intent(in)     :: lnT
    1161              :     real(dp), intent(out)    :: lnRho
    1162              :     real(dp), intent(out)    :: res(num_eos_basic_results)
    1163              :     real(dp), intent(out)    :: dres_dlnRho(num_eos_basic_results)
    1164              :     real(dp), intent(out)    :: dres_dlnT(num_eos_basic_results)
    1165              :     integer, intent(out)     :: ierr
    1166              : 
    1167              :     real(dp), parameter :: LOGRHO_TOL = 1E-11_dp
    1168              :     real(dp), parameter :: LOGPGAS_TOL = 1E-11_dp
    1169              : 
    1170              :     real(dp) :: T
    1171              :     real(dp) :: P
    1172              :     real(dp) :: Prad
    1173              :     real(dp) :: Pgas
    1174              :     real(dp) :: rho, gamma, energy
    1175              :     real(dp) :: logRho, logRho_guess
    1176            0 :     real(dp) :: dres_dxa(num_eos_basic_results,s% species)
    1177              : 
    1178            0 :     T = exp(lnT)
    1179            0 :     P = exp(lnP)
    1180              : 
    1181            0 :     Prad = radiation_pressure(T)
    1182            0 :     Pgas = MAX(1.E-99_dp, P - Prad)
    1183              : 
    1184            0 :     gamma = 5d0/3d0
    1185              :     call eos_gamma_PT_get_rho_energy( &
    1186            0 :        s% abar(1), P, T, gamma, rho, energy, ierr)
    1187            0 :     if (ierr /= 0) then
    1188            0 :        s% retry_message = 'Call to eos_gamma_PT_get_rho_energy failed in eos_proc'
    1189            0 :        if (s% report_ierr) write(*, *) trim(s% retry_message)
    1190              :     end if
    1191              : 
    1192            0 :     logRho_guess = log10(rho)
    1193              : 
    1194              :     call solve_eos_given_PgasT( &
    1195              :          s, 0, s% xa(:,1), &
    1196              :          lnT/ln10, log10(Pgas), logRho_guess, LOGRHO_TOL, LOGPGAS_TOL, &
    1197              :          logRho, res, dres_dlnRho, dres_dlnT, dres_dxa, &
    1198            0 :          ierr)
    1199            0 :     if (ierr /= 0) then
    1200            0 :        s% retry_message = 'Call to solve_eos_given_PgasT failed in eos_proc'
    1201            0 :        if (s% report_ierr) write(*, *) trim(s% retry_message)
    1202              :     end if
    1203              : 
    1204            0 :     lnRho = logRho*ln10
    1205              : 
    1206              : 
    1207            0 :     return
    1208              : 
    1209              :   end subroutine eos_proc
    1210              : 
    1211              : 
    1212            0 :   subroutine kap_proc( &
    1213            0 :        s, lnRho, lnT, res, dres_dlnRho, dres_dlnT, &
    1214              :        kap, dlnkap_dlnRho, dlnkap_dlnT, &
    1215              :        ierr)
    1216              : 
    1217              :     use eos_def, only: i_lnfree_e, i_eta
    1218              :     use kap_def, only: num_kap_fracs
    1219              :     use kap_support, only: get_kap
    1220              : 
    1221              :     type(star_info), pointer :: s
    1222              :     real(dp), intent(in)     :: lnRho
    1223              :     real(dp), intent(in)     :: lnT
    1224              :     real(dp), intent(in)     :: res(:)
    1225              :     real(dp), intent(in)     :: dres_dlnRho(:)
    1226              :     real(dp), intent(in)     :: dres_dlnT(:)
    1227              :     real(dp), intent(out)    :: kap
    1228              :     real(dp), intent(out)    :: dlnkap_dlnRho
    1229              :     real(dp), intent(out)    :: dlnkap_dlnT
    1230              :     integer, intent(out)     :: ierr
    1231              : 
    1232              :     real(dp) :: kap_fracs(num_kap_fracs)
    1233              : 
    1234              :     include 'formats'
    1235              : 
    1236              :     call get_kap( &
    1237              :          s, 0, s% zbar(1), s% xa(:,1), lnRho/ln10, lnT/ln10, &
    1238              :          res(i_lnfree_e), dres_dlnRho(i_lnfree_e), dres_dlnT(i_lnfree_e), &
    1239              :          res(i_eta), dres_dlnRho(i_eta), dres_dlnT(i_eta), &
    1240              :          kap_fracs, kap, dlnkap_dlnRho, dlnkap_dlnT, &
    1241            0 :          ierr)
    1242            0 :     if (ierr /= 0) then
    1243            0 :        s% retry_message = 'Call to get_kap failed in kap_proc'
    1244            0 :        if (s% report_ierr) write(*, *) s% retry_message
    1245              :     end if
    1246              : 
    1247            0 :     if (kap <= 0d0 .or. is_bad(kap)) then
    1248            0 :        write(*,1) 'bad kap', kap
    1249            0 :        write(*,1) 's% zbar(1)', s% zbar(1)
    1250            0 :        write(*,1) 'lnRho/ln10', lnRho/ln10
    1251            0 :        write(*,1) 'lnT/ln10', lnT/ln10
    1252            0 :        write(*,1) 'res(i_eta)', res(i_eta)
    1253            0 :        ierr = -1
    1254            0 :        return
    1255              :        call mesa_error(__FILE__,__LINE__,'atm kap_proc')
    1256              :     end if
    1257              : 
    1258              :     return
    1259              : 
    1260              :   end subroutine kap_proc
    1261              : 
    1262              : end module atm_support
        

Generated by: LCOV version 2.0-1