LCOV - code coverage report
Current view: top level - star/private - rsp_step.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 1609 0
Test Date: 2025-05-08 18:23:42 Functions: 0.0 % 50 0

            Line data    Source code
       1              : ! ***********************************************************************
       2              : !
       3              : !   Copyright (C) 2018-2019  Radek Smolec & 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 rsp_step
      21              :       use rsp_def
      22              :       use star_def, only: star_ptr, star_info
      23              :       use const_def, only: dp, qp, i8, crad
      24              :       use utils_lib, only: is_bad
      25              : 
      26              :       implicit none
      27              : 
      28              :       private
      29              :       public :: calculate_energies
      30              :       public :: init_HYD
      31              :       public :: HYD
      32              :       public :: turn_off_time_weighting
      33              :       public :: turn_on_time_weighting
      34              :       public :: eval_vars
      35              :       public :: eval_eqns
      36              :       public :: calc_equations
      37              :       public :: save_start_vars
      38              :       public :: do1_eos_and_kap
      39              :       public :: calc_Fr
      40              :       public :: do1_specific_volume
      41              :       public :: get_Psurf
      42              :       public :: set_f_Edd
      43              :       public :: calc_Prad
      44              :       public :: calc_Hp_face
      45              :       public :: calc_Y_face
      46              :       public :: calc_PII_face
      47              :       public :: calc_Pvsc
      48              :       public :: calc_Pturb
      49              :       public :: calc_Chi
      50              :       public :: calc_Eq
      51              :       public :: calc_source_sink
      52              :       public :: acceleration_eqn
      53              :       public :: calc_cell_equations
      54              :       public :: T_form_of_calc_Fr
      55              :       public :: calc_Lc, calc_Lt
      56              :       public :: rsp_set_Teff
      57              : 
      58              :       logical, parameter :: call_is_bad = .false.
      59              :       integer, parameter :: i_var_Vol = 99  ! for remeshing tests with dfridr
      60              :       integer, parameter :: &
      61              :          i_var_T = 2, i_var_w = 3, i_var_er = 4, i_var_Fr = 5, i_var_R = 6, &  ! R must be last
      62              : 
      63              :          i_r_dr_in2 = 1, &
      64              :          i_r_dT_in = 2, &
      65              :          i_r_dw_in = 3, &
      66              :          i_r_der_in = 4, &
      67              :          i_r_dFr_in = 5, &
      68              : 
      69              :          i_r_dr_in = i_r_dr_in2 + NV, &
      70              :          i_r_dr_00 = i_r_dr_in + NV, &
      71              :          i_r_dr_out = i_r_dr_00 + NV, &
      72              :          i_r_dr_out2 = i_r_dr_out + NV, &
      73              : 
      74              :          i_r_dT_00 = i_r_dT_in + NV, &
      75              :          i_r_dT_out = i_r_dT_00 + NV, &
      76              :          i_r_dT_out2 = i_r_dT_out + NV, &
      77              : 
      78              :          i_r_dw_00 = i_r_dw_in + NV, &
      79              :          i_r_dw_out = i_r_dw_00 + NV, &
      80              :          i_r_dw_out2 = i_r_dw_out + NV, &
      81              : 
      82              :          i_r_der_00 = i_r_der_in + NV, &
      83              :          i_r_der_out = i_r_der_00 + NV, &
      84              :          i_r_der_out2 = i_r_der_out + NV, &
      85              : 
      86              :          i_r_dFr_00 = i_r_dFr_in + NV, &
      87              :          i_r_dFr_out = i_r_dFr_00 + NV, &
      88              :          i_r_dFr_out2 = i_r_dFr_out + NV, &
      89              : 
      90              :          i_T_dT_in2 = 1, &
      91              :          i_T_dw_in2 = 2, &
      92              :          i_T_der_in2 = 3, &
      93              :          i_T_dFr_in2 = 4, &
      94              :          i_T_dr_in2 = 5, &
      95              : 
      96              :          i_T_dT_in = i_T_dT_in2 + NV, &
      97              :          i_T_dT_00 = i_T_dT_in + NV, &
      98              :          i_T_dT_out = i_T_dT_00 + NV, &
      99              :          i_T_dT_out2 = i_T_dT_out + NV, &
     100              : 
     101              :          i_T_dw_in = i_T_dw_in2 + NV, &
     102              :          i_T_dw_00 = i_T_dw_in + NV, &
     103              :          i_T_dw_out = i_T_dw_00 + NV, &
     104              : 
     105              :          i_T_der_in = i_T_der_in2 + NV, &
     106              :          i_T_der_00 = i_T_der_in + NV, &
     107              :          i_T_der_out = i_T_der_00 + NV, &
     108              : 
     109              :          i_T_dFr_in = i_T_dFr_in2 + NV, &
     110              :          i_T_dFr_00 = i_T_dFr_in + NV, &
     111              :          i_T_dFr_out = i_T_dFr_00 + NV, &
     112              : 
     113              :          i_T_dr_in = i_T_dr_in2 + NV, &
     114              :          i_T_dr_00 = i_T_dr_in + NV, &
     115              :          i_T_dr_out = i_T_dr_00 + NV, &
     116              : 
     117              :          i_w_dw_in2 = 1, &
     118              :          i_w_der_in2 = 2, &
     119              :          i_w_dFr_in2 = 3, &
     120              :          i_w_dr_in2 = 4, &
     121              :          i_w_dT_in = 5, &
     122              : 
     123              :          i_w_dw_in = i_w_dw_in2 + NV, &
     124              :          i_w_dw_00 = i_w_dw_in + NV, &
     125              :          i_w_dw_out = i_w_dw_00 + NV, &
     126              :          i_w_dw_out2 = i_w_dw_out + NV, &
     127              : 
     128              :          i_w_der_in = i_w_der_in2 + NV, &
     129              :          i_w_der_00 = i_w_der_in + NV, &
     130              :          i_w_der_out = i_w_der_00 + NV, &
     131              : 
     132              :          i_w_dFr_in = i_w_dFr_in2 + NV, &
     133              :          i_w_dFr_00 = i_w_dFr_in + NV, &
     134              :          i_w_dFr_out = i_w_dFr_00 + NV, &
     135              : 
     136              :          i_w_dr_in = i_w_dr_in2 + NV, &
     137              :          i_w_dr_00 = i_w_dr_in + NV, &
     138              :          i_w_dr_out = i_w_dr_00 + NV, &
     139              : 
     140              :          i_w_dT_00 = i_w_dT_in + NV, &
     141              :          i_w_dT_out = i_w_dT_00 + NV, &
     142              :          i_w_dT_out2 = i_w_dT_out + NV, &
     143              : 
     144              :          i_er_der_in2 = 1, &
     145              :          i_er_dFr_in2 = 2, &
     146              :          i_er_dr_in2 = 3, &
     147              :          i_er_dT_in = 4, &
     148              :          i_er_dw_in = 5, &
     149              : 
     150              :          i_er_der_in = i_er_der_in2 + NV, &
     151              :          i_er_der_00 = i_er_der_in + NV, &
     152              :          i_er_der_out = i_er_der_00 + NV, &
     153              :          i_er_der_out2 = i_er_der_out + NV, &
     154              : 
     155              :          i_er_dFr_in = i_er_dFr_in2 + NV, &
     156              :          i_er_dFr_00 = i_er_dFr_in + NV, &
     157              :          i_er_dFr_out = i_er_dFr_00 + NV, &
     158              : 
     159              :          i_er_dr_in = i_er_dr_in2 + NV, &
     160              :          i_er_dr_00 = i_er_dr_in + NV, &
     161              :          i_er_dr_out = i_er_dr_00 + NV, &
     162              : 
     163              :          i_er_dT_00 = i_er_dT_in + NV, &
     164              :          i_er_dT_out = i_er_dT_00 + NV, &
     165              :          i_er_dT_out2 = i_er_dT_out + NV, &
     166              : 
     167              :          i_er_dw_00 = i_er_dw_in + NV, &
     168              :          i_er_dw_out = i_er_dw_00 + NV, &
     169              :          i_er_dw_out2 = i_er_dw_out + NV, &
     170              : 
     171              :          i_Fr_dFr_in2 = 1, &
     172              :          i_Fr_dr_in2 = 2, &
     173              :          i_Fr_dT_in = 3, &
     174              :          i_Fr_dw_in = 4, &
     175              :          i_Fr_der_in = 5, &
     176              : 
     177              :          i_Fr_dFr_in = i_Fr_dFr_in2 + NV, &
     178              :          i_Fr_dFr_00 = i_Fr_dFr_in + NV, &
     179              :          i_Fr_dFr_out = i_Fr_dFr_00 + NV, &
     180              :          i_Fr_dFr_out2 = i_Fr_dFr_out + NV, &
     181              : 
     182              :          i_Fr_dr_in = i_Fr_dr_in2 + NV, &
     183              :          i_Fr_dr_00 = i_Fr_dr_in + NV, &
     184              :          i_Fr_dr_out = i_Fr_dr_00 + NV, &
     185              : 
     186              :          i_Fr_dT_00 = i_Fr_dT_in + NV, &
     187              :          i_Fr_dT_out = i_Fr_dT_00 + NV, &
     188              :          i_Fr_dT_out2 = i_Fr_dT_out + NV, &
     189              : 
     190              :          i_Fr_dw_00 = i_Fr_dw_in + NV, &
     191              :          i_Fr_dw_out = i_Fr_dw_00 + NV, &
     192              :          i_Fr_dw_out2 = i_Fr_dw_out + NV, &
     193              : 
     194              :          i_Fr_der_00 = i_Fr_der_in + NV, &
     195              :          i_Fr_der_out = i_Fr_der_00 + NV, &
     196              :          i_Fr_der_out2 = i_Fr_der_out + NV
     197              : 
     198              :       integer :: iter, min_k_for_turbulent_flux
     199              : 
     200              :       contains
     201              : 
     202            0 :       subroutine HYD(s,ierr)
     203              :          use star_utils, only: start_time, update_time
     204              :          type (star_info), pointer :: s
     205              :          integer, intent(out) :: ierr
     206            0 :          real(dp) :: DXXT, DXXC, DXXE, DXXL, PREC2, DXH, EZH, &
     207            0 :             P_surf, R_center_start, dt_max, total
     208              :          integer :: &
     209              :             i_min, i_max, num_tries, max_retries, max_iters, k, nz, &
     210              :             kT_max, kW_max, kE_max, kL_max, iter_for_dfridr, test_partials_k
     211              :          integer(i8) :: time0
     212              :          logical :: converged, dbg_msg, trace
     213              :          include 'formats'
     214              : 
     215            0 :          ierr = 0
     216            0 :          dbg_msg = s% report_solver_progress
     217            0 :          trace = s% trace_evolve
     218            0 :          iter = 0
     219            0 :          iter_for_dfridr = - 1
     220            0 :          test_partials_k = s% solver_test_partials_k
     221            0 :          s% solver_test_partials_k = 0
     222              :          if (s% model_number == s% solver_test_partials_call_number &
     223              :               .and. s% solver_test_partials_dx_0 > 0 &
     224              :               .and. s% solver_test_partials_iter_number > 0 &
     225            0 :               .and. test_partials_k > 0) then
     226            0 :             iter_for_dfridr = s% solver_test_partials_iter_number
     227            0 :             s% solver_test_partials_var = 0
     228            0 :             s% solver_test_partials_val = 0
     229            0 :             s% solver_test_partials_dval_dx = 0
     230              :          end if
     231            0 :          nz = s% nz
     232            0 :          i_min = 1
     233            0 :          i_max = nz
     234            0 :          PREC2 = s% RSP_tol_max_corr
     235            0 :          DXH = 0.3d0
     236            0 :          max_retries = s% RSP_max_retries_per_step
     237            0 :          max_iters = s% RSP_max_iters_per_try
     238            0 :          R_center_start = s% R_center
     239            0 :          call save_start_vars(s)
     240            0 :          do k=1,s% nz
     241            0 :             s% L(k) = s% Fr(k)*4*pi*s% r(k)**2 + s% Lc(k) + s% Lt(k)
     242            0 :             s% L_start(k) = s% L(k)
     243              :          end do
     244            0 :          call set_f_Edd(s,ierr)
     245            0 :          if (ierr /= 0) return
     246            0 :          P_surf = get_Psurf(s,ierr)
     247            0 :          if (ierr /= 0) return
     248            0 :          if (ALFAT > 0d0) then
     249            0 :             call set_min_k_for_turbulent_flux
     250              :          else
     251            0 :             min_k_for_turbulent_flux = 0
     252              :          end if
     253              : 
     254            0 :          if (s% v_center > s% v(nz) .and. s% v_center > 0d0) then  ! compressing innermost cell
     255            0 :             dt_max = 1d-2*(s% r(nz) - s% r_center)/(s% v_center - s% v(nz))
     256            0 :             if (s% dt > dt_max) then
     257              :                !write(*,2) 'reduce dt in HYD', s% model_number, s% dt, dt_max
     258              :                !write(*,2) 's% r(nz) - s% r_center', s% model_number, s% r(nz) - s% r_center
     259              :                !write(*,2) 's% v_center - s% v(nz)', s% model_number, s% v_center - s% v(nz)
     260            0 :                if (s% RSP_report_limit_dt) then
     261            0 :                   write(*,4) 'limit dt to avoid over-compressing innermost cell', s% model_number
     262            0 :                   write(*,2) 's% r(nz) - s% r_center', s% model_number, s% r(nz) - s% r_center
     263            0 :                   write(*,2) 's% v_center - s% v(nz)', s% model_number, s% v_center - s% v(nz)
     264            0 :                   write(*,2) 'old dt', s% model_number, s% dt
     265            0 :                   write(*,2) 'reduced dt', s% model_number, dt_max
     266            0 :                   write(*,'(A)')
     267              :                end if
     268            0 :                call mesa_error(__FILE__,__LINE__,'HYD compressing innermost cell')
     269            0 :                s% dt = dt_max
     270              :                if (call_is_bad) then
     271              :                   if (is_bad(s% dt)) then
     272              :                      write(*,1) 'dt', s% dt
     273              :                      call mesa_error(__FILE__,__LINE__,'HYD compressing innermost cell')
     274              :                   end if
     275              :                end if
     276              :             end if
     277              :          end if
     278            0 :          if (s% dt < s% force_timestep_min .and. s% force_timestep_min > 0) &
     279            0 :             s% dt = s% force_timestep_min
     280            0 :          if (s% force_timestep > 0) s% dt = s% force_timestep
     281              : 
     282            0 :          retry_loop: do num_tries = 1, max_retries+1
     283              : 
     284            0 :             converged = .false.
     285            0 :             call set_1st_iter_R_using_v_start(s)
     286            0 :             s% R_center = s% R_center + s% dt*s% v_center
     287              : ! write(*,3) 'RSP HYD w', 22, 0, s% RSP_w(22)
     288              : 
     289            0 :             iter_loop: do iter = 1, max_iters
     290            0 :                s% solver_iter = iter
     291            0 :                if (iter == iter_for_dfridr) then
     292            0 :                   s% solver_test_partials_k = test_partials_k
     293              :                end if
     294            0 :                call eval_vars(s,iter,i_min,i_max,ierr)
     295            0 :                if (ierr /= 0) return
     296            0 :                call eval_eqns(s,P_surf)
     297            0 :                if (iter == iter_for_dfridr) call check_partial()
     298            0 :                if (converged) then
     299            0 :                   s% num_solver_iterations = iter - 1
     300            0 :                   s% solver_test_partials_k = test_partials_k
     301            0 :                   return
     302              :                end if
     303            0 :                if (s% doing_timing) call start_time(s, time0, total)
     304            0 :                call solve_for_corrections(s,iter)
     305              :                call apply_corrections(s, &
     306            0 :                   DXH,DXXT,DXXC,DXXE,DXXL,EZH,kT_max,kW_max,kE_max,kL_max)
     307            0 :                if (s% doing_timing) call update_time(s, time0, total, s% time_solver_matrix)
     308            0 :                if (dbg_msg) call write_msg
     309              : ! write(*,3) 'RSP HYD w', 22, iter, s% RSP_w(22)
     310            0 :                if (iter == 1) cycle iter_loop
     311            0 :                converged = (abs(DXXT) < PREC2 .and. abs(DXXC) < PREC2)
     312              :             end do iter_loop
     313            0 :             call doing_retry
     314              :          end do retry_loop
     315              : 
     316            0 :          write(*,*) ' NO CONVERGENCE IN HYD, TIME STEP: ',s% model_number
     317            0 :          stop
     318              : 
     319              :          contains
     320              : 
     321            0 :          subroutine set_min_k_for_turbulent_flux
     322            0 :             real(dp) :: tau, rmid
     323              :             integer :: k
     324            0 :             tau = 0
     325            0 :             min_k_for_turbulent_flux = nz
     326            0 :             do k = 1, nz-1
     327            0 :                rmid = 0.5d0*(s% r(k) + s% r(k+1))
     328            0 :                tau = tau + s% dm(k)*s% opacity(k)/(4*pi*rmid**2)
     329            0 :                if (tau >= s% RSP_min_tau_for_turbulent_flux) then
     330            0 :                   min_k_for_turbulent_flux = k
     331            0 :                   exit
     332              :                end if
     333              :             end do
     334            0 :          end subroutine set_min_k_for_turbulent_flux
     335              : 
     336            0 :          subroutine doing_retry
     337              :             include 'formats'
     338            0 :             if (num_tries  ==  max_retries+1) then
     339            0 :                write(*,*) 'NO CONVERGENCE IN HYD, TIME STEP num tries, max allowed', &
     340            0 :                   s% model_number, num_tries, max_retries+1
     341            0 :                call mesa_error(__FILE__,__LINE__,'RSP: step num_retries = RSP_max_retries_per_step')
     342              :             end if
     343            0 :             call restore_start_vars(s)
     344            0 :             s% R_center = R_center_start
     345            0 :             s% dt = s% dt/2.d0
     346            0 :             s% num_retries = s% num_retries + 1
     347            0 :             if (s% max_number_retries < 0) return
     348            0 :             if (s% num_retries > s% max_number_retries) then
     349            0 :                write(*,3) 'model max_number_retries', s% model_number, s% max_number_retries
     350            0 :                call mesa_error(__FILE__,__LINE__,'RSP: num_retries > max_number_retries')
     351              :             end if
     352              :          end subroutine doing_retry
     353              : 
     354            0 :          subroutine write_msg
     355              :             include 'formats'
     356              :             !if (EZH < 1d0) write(*,3) 'undercorrection factor', s% model_number, iter, EZH
     357              :             write(*,'(i6, 2x, i3, 4(4x, a, 1x, i4, 1x, 1pe11.4, 1x, 1pe11.4))') &
     358            0 :                s% model_number, iter, &
     359            0 :                'T', kT_max, DXXT, s% T(max(1,kT_max)), &
     360            0 :                'w', kW_max, DXXC, max(1d-99,s% RSP_w(max(1,kW_max))), &
     361            0 :                'erad', kE_max, DXXE, s% erad(max(1,kE_max)), &
     362            0 :                'Fr', kL_max, DXXL, s% Fr(max(1,kL_max))
     363            0 :          end subroutine write_msg
     364              : 
     365            0 :          subroutine check_partial
     366              :             integer :: i_var
     367            0 :             real(dp) :: dvardx_0, dx_0, dvardx, xdum, err
     368              :             include 'formats'
     369            0 :             i_var = s% solver_test_partials_var
     370            0 :             dvardx_0 = s% solver_test_partials_dval_dx  ! analytic partial
     371            0 :             if (i_var <= 0) then
     372            0 :                write(*,2) 'need to set test_partials_var', i_var
     373            0 :                call mesa_error(__FILE__,__LINE__,'check_partial')
     374              :             end if
     375            0 :             dx_0 = get1_val(i_var, s% solver_test_partials_k)
     376            0 :             dx_0 = s% solver_test_partials_dx_0*max(1d-99, abs(dx_0))
     377            0 :             dvardx = dfridr(dx_0,err)
     378            0 :             xdum = (dvardx - dvardx_0)/max(abs(dvardx_0),1d-50)
     379            0 :             write(*,1) 'analytic numeric err rel_diff',dvardx_0,dvardx,err,xdum
     380              :             !write(*,*)
     381            0 :             call mesa_error(__FILE__,__LINE__,'check_partial')
     382            0 :          end subroutine check_partial
     383              : 
     384            0 :          real(dp) function get1_val(i_var,k) result(val)
     385              :             integer, intent(in) :: i_var, k
     386              :             include 'formats'
     387            0 :             if (i_var == i_var_w) then
     388            0 :                val = s% RSP_w(k)
     389              :             else if (i_var == i_var_R) then
     390            0 :                val = s% r(k)
     391              :             else if (i_var == i_var_T) then
     392            0 :                val = s% T(k)
     393              :             else if (i_var == i_var_er) then
     394            0 :                val = s% erad(k)
     395              :             else if (i_var == i_var_Fr) then
     396            0 :                val = s% Fr(k)
     397              :             else if (i_var == i_var_Vol) then
     398            0 :                val = s% Vol(k)
     399              :             else
     400            0 :                write(*,2) 'bad value for solver_test_partials_var', i_var
     401            0 :                call mesa_error(__FILE__,__LINE__,'solver_test_partials')
     402              :             end if
     403            0 :          end function get1_val
     404              : 
     405            0 :          subroutine store1_val(i_var, k, val)
     406              :             integer, intent(in) :: i_var, k
     407              :             real(dp), intent(in) :: val
     408              :             include 'formats'
     409            0 :             if (i_var == i_var_w) then
     410            0 :                s% RSP_w(k) = val
     411              :             else if (i_var == i_var_R) then
     412            0 :                s% r(k) = val
     413            0 :                s% v(k) = 2.d0*(s% r(k) - s% r_start(k))/s% dt - s% v_start(k)
     414              :                ! partials wrt R assume v changes along with R,
     415              :                ! so need to do it here.
     416              :             else if (i_var == i_var_T) then
     417            0 :                s% T(k) = val
     418              :             else if (i_var == i_var_er) then
     419            0 :                s% erad(k) = val
     420              :             else if (i_var == i_var_Fr) then
     421            0 :                s% Fr(k) = val
     422              :             else if (i_var == i_var_Vol) then
     423            0 :                s% Vol(k) = val
     424              :             else
     425            0 :                write(*,2) 'bad value for solver_test_partials_var', i_var
     426            0 :                call mesa_error(__FILE__,__LINE__,'solver_test_partials')
     427              :             end if
     428            0 :          end subroutine store1_val
     429              : 
     430            0 :          real(dp) function dfridr_func(delta_x) result(val)
     431              :             real(dp), intent(in) :: delta_x
     432              :             integer :: i_var, k, ierr
     433              :             real(dp) :: save1
     434              :             include 'formats'
     435            0 :             i_var = s% solver_test_partials_var
     436            0 :             k = s% solver_test_partials_k
     437            0 :             save1 = get1_val(i_var, k)
     438            0 :             call store1_val(i_var, k, save1 + delta_x)
     439            0 :             call eval_vars(s,0,i_min,i_max,ierr)
     440            0 :             if (ierr /= 0) call mesa_error(__FILE__,__LINE__,'failed in eval_vars')
     441            0 :             call eval_eqns(s,P_surf)
     442            0 :             val = s% solver_test_partials_val
     443              :             !write(*,2) 'dfridr val', k, val
     444            0 :             call store1_val(i_var, k, save1)
     445            0 :          end function dfridr_func
     446              : 
     447            0 :          real(dp) function dfridr(hx,err)
     448              :             real(dp), intent(in) :: hx
     449              :             real(dp), intent(out) :: err
     450              :             !  this routine returns the first derivative of a function func(x)
     451              :             !  at the point x, by ridders method of polynomial extrapolation.
     452              :             !  value hx is the initial step size;
     453              :             !  it should be an increment for which func changes substantially.
     454              :             !  an estimate of the error in the first derivative is returned in err.
     455              :             integer, parameter :: ntab = 20
     456              :             integer :: i,j
     457            0 :             real(dp) :: errt,fac,hh,a(ntab,ntab),f1,f2
     458              :             real(dp), parameter :: con2 = 2d0, con = sqrt(con2), big = 1d199, safe = 2d0
     459              :             include 'formats'
     460            0 :             dfridr = 0d0
     461            0 :             hh = hx
     462              :             ! 2nd order central difference
     463            0 :             f1 = dfridr_func(hh)
     464              :             !write(*,2) 'f1', 1, f1, save_dx(i_var,k) + hh
     465            0 :             f2 = dfridr_func( - hh)
     466              :             !write(*,2) 'f2', 1, f2, save_dx(i_var,k) - hh
     467            0 :             a(1,1) = (f1 - f2)/(2d0*hh)
     468              :             !write(*,2) 'dfdx', 1, a(1,1), hh
     469            0 :             err = big
     470              :             ! successive columns in the neville tableu will go to smaller stepsizes
     471              :             ! and higher orders of extrapolation
     472            0 :             do i = 2,ntab
     473            0 :                hh = hh/con
     474            0 :                f1 = dfridr_func(hh)
     475              :                !write(*,2) 'f1', i, f1
     476            0 :                f2 = dfridr_func( - hh)
     477              :                !write(*,2) 'f2', i, f2
     478            0 :                a(1,i) = (f1 - f2)/(2d0*hh)
     479              :                !write(*,2) 'dfdx', i, a(1,i), hh
     480              :                ! compute extrapolations of various orders; the error strategy is to compare
     481              :                ! each new extrapolation to one order lower but both at the same stepsize
     482              :                ! and at the previous stepsize
     483            0 :                fac = con2
     484            0 :                do j = 2,i
     485            0 :                   a(j,i) = (a(j - 1,i)*fac - a(j - 1,i - 1))/(fac - 1d0)
     486            0 :                   fac = con2*fac
     487            0 :                   errt = max(abs(a(j,i) - a(j - 1,i)),abs(a(j,i) - a(j - 1,i - 1)))
     488              :                   !write(*,2) 'errt, err', j, errt, err
     489            0 :                   if (errt <= err) then
     490            0 :                      err = errt
     491            0 :                      dfridr = a(j,i)
     492            0 :                      write(*,3) 'dfridr err', i, j, dfridr, err
     493              :                   end if
     494              :                end do
     495              :                ! if higher order is worse by a significant factor safe, then bail
     496            0 :                if (abs(a(i,i) - a(i - 1,i - 1)) >= safe*err) then
     497              :                   !write(*,1) 'higher order is worse'
     498            0 :                   write(*,'(A)')
     499            0 :                   return
     500              :                end if
     501              :             end do
     502            0 :          end function dfridr
     503              : 
     504              :       end subroutine HYD
     505              : 
     506              : 
     507            0 :       real(dp) function get_Psurf(s,ierr) result(P_surf)
     508              :          use rsp_eval_eos_and_kap, only: get_surf_P_T_kap
     509              :          type (star_info), pointer :: s
     510              :          integer, intent(out) :: ierr
     511            0 :          real(dp) :: kap_guess, T_surf, kap_surf, Teff_atm
     512              :          include 'formats'
     513            0 :          ierr = 0
     514            0 :          if (s% RSP_fixed_Psurf) then
     515            0 :             P_surf = Psurf_from_atm
     516            0 :          else if (s% RSP_use_atm_grey_with_kap_for_Psurf) then
     517              :             ierr = 0
     518            0 :             kap_guess = 1d-2
     519              :             call get_surf_P_T_kap(s, &
     520              :                s% M(1), s% r(1), s% L(1), &
     521              :                (2d0/3d0)*s% tau_factor, kap_guess, &
     522            0 :                T_surf, P_surf, kap_surf, Teff_atm, ierr)
     523            0 :             if (ierr/= 0) then
     524            0 :                write(*,*) 'ierr from get_surf_P_T_kap'
     525            0 :                return
     526              :             end if
     527            0 :          else if (s% RSP_use_Prad_for_Psurf) then
     528            0 :             P_surf = crad*s% T(1)**4/3d0
     529            0 :          else if (s% RSP_Psurf >= 0d0) then
     530            0 :             P_surf = s% RSP_Psurf
     531              :          else
     532            0 :             P_surf = 0d0
     533              :          end if
     534            0 :       end function get_Psurf
     535              : 
     536              : 
     537            0 :       subroutine calculate_energies(s,total_radiation)
     538            0 :          use star_utils, only: cell_specific_KE, cell_specific_PE
     539              :          type (star_info), pointer :: s
     540              :          real(dp), intent(out) :: total_radiation
     541              :          integer :: i, k
     542            0 :          real(dp) :: d_dlnR00, d_dlnRp1, d_dv00, d_dvp1
     543              :          include 'formats'
     544            0 :          EGRV = 0.d0
     545            0 :          ETHE = 0.d0
     546            0 :          EKIN = 0.d0
     547            0 :          ECON = 0.d0
     548            0 :          do i=1,NZN
     549            0 :             k = NZN+1-i
     550            0 :             ETHE = ETHE + (s% egas(k)+s% erad(k))*s% dm(k)
     551            0 :             ECON = ECON + s% RSP_w(k)**2*s% dm(k)
     552            0 :             EKIN = EKIN + cell_specific_KE(s,k,d_dv00,d_dvp1)*s% dm(k)
     553            0 :             EGRV = EGRV + cell_specific_PE(s,k,d_dlnR00,d_dlnRp1)*s% dm(k)
     554              : 
     555              :             !EKIN = EKIN + 0.5d0*s% v(k)**2*s% dm_bar(k)
     556              :             !if (k < NZN) then
     557              :             !   EGRV = EGRV - s% cgrav(k) * (s%m(k)-0.5d0*s%dm(k))*s%dm(k)/(0.5d0*(s%r(k)+s%r(k+1)))
     558              :             !else
     559              :             !   EGRV = EGRV - s% cgrav(k) * (s%m(k)-0.5d0*s%dm(k))*s%dm(k)/(0.5d0*(s%r(k)+s%r_center))
     560              :             !end if
     561              : 
     562              :          end do
     563            0 :          if (s% RSP_hydro_only) then
     564            0 :             total_radiation = 0d0
     565              :          else
     566            0 :             total_radiation = s% dt*(s% L_center - (WTR*s% L(1) + WTR1*s% L_start(1)))
     567              :          end if
     568            0 :          ETOT = ETHE+EKIN+ECON+EGRV
     569            0 :          EDE_start = EDE_start-E0
     570            0 :          if (EKIN > EKMAX) EKMAX = EKIN
     571            0 :          if (EKIN < EKMIN) EKMIN = EKIN
     572              :          !write(*,1) 'ETHE', ETHE
     573              :          !write(*,1) 'ECON', ECON
     574              :          !write(*,1) 'EKIN', EKIN
     575              :          !write(*,1) 'EGRV', EGRV
     576              :          !write(*,1) 'ETOT', ETOT
     577            0 :       end subroutine calculate_energies
     578              : 
     579              : 
     580            0 :       subroutine init_HYD(s,ierr)
     581              :          type (star_info), pointer :: s
     582              :          integer, intent(out) :: ierr
     583              :          integer :: i_min, i_max
     584              :          include 'formats'
     585            0 :          i_min = 1
     586            0 :          i_max = s% nz
     587              :          ! setup so can save start vals in 1st call to HYD
     588            0 :          s% f_Edd(1:NZN) = f_Edd_isotropic  ! fake it for 1st call on eval_vars
     589            0 :          call eval_vars(s,0,i_min,i_max,ierr)
     590            0 :          if (ierr /= 0) return
     591            0 :          call set_f_Edd(s,ierr)  ! needs opacities
     592            0 :          if (ierr /= 0) return
     593            0 :          call save_start_vars(s)  ! needed by eval_eqns
     594            0 :          call eval_eqns(s,0d0)
     595            0 :       end subroutine init_HYD
     596              : 
     597              : 
     598            0 :       subroutine set_1st_iter_R_using_v_start(s)
     599              :          type (star_info), pointer :: s
     600            0 :          real(dp) :: EH1,EHJT
     601              :          integer :: k
     602              :          include 'formats'
     603            0 :          EHJT = 1.d0
     604            0 :          do k = 1,NZN
     605            0 :             if (k /= NZN) then
     606              :                EH1 = - (s% v_start(k) - s% v_start(k+1))*s% dt/ &
     607            0 :                   (s% r_start(k) - s% r_start(k+1))/0.8d0
     608              :             else
     609              :                EH1 = - (s% v_start(k) - s% v_center)*s% dt/ &
     610            0 :                   (s% r_start(k) - s% R_center)/0.8d0
     611              :             end if
     612            0 :             EHJT = 1.d0/max(1.d0/EHJT,EH1,1d0)
     613              :          end do
     614            0 :          do k = 1,NZN
     615            0 :             s% r(k) = s% r_start(k) + EHJT*s% dt*s% v_start(k)  ! initial guess for R
     616            0 :             s% v(k) = (2d0*EHJT - 1d0)*s% v_start(k)  ! initial guess for v
     617              :          end do
     618            0 :       end subroutine set_1st_iter_R_using_v_start
     619              : 
     620              : 
     621            0 :       subroutine rsp_set_Teff(s)
     622              :          use star_utils, only: get_phot_info
     623              :          use atm_lib, only: atm_Teff
     624              :          type (star_info), pointer :: s
     625              :          real(dp) :: r, m, v, L, T_phot, cs, kap, logg, ysum
     626              :          integer :: k_phot
     627              :          include 'formats'
     628            0 :          call get_phot_info(s,r,m,v,L,T_phot,cs,kap,logg,ysum,k_phot)
     629            0 :          s% Teff = atm_Teff(L,r)
     630            0 :       end subroutine rsp_set_Teff
     631              : 
     632              : 
     633            0 :       subroutine set_f_Edd(s, ierr)
     634              :          type (star_info), pointer :: s
     635              :          integer, intent(out) :: ierr
     636              :          include 'formats'
     637            0 :          ierr = 0
     638            0 :          s% g_Edd = 0.5d0
     639            0 :          s% f_Edd(1:NZN) = f_Edd_isotropic
     640            0 :       end subroutine set_f_Edd
     641              : 
     642              : 
     643            0 :       subroutine save_start_vars(s)
     644              :          type (star_info), pointer :: s
     645              :          integer :: I, k
     646            0 :          do I = 1,NZN
     647            0 :             k = NZN+1-i
     648            0 :             s% T_start(k) = s% T(k)
     649            0 :             s% r_start(k) = s% r(k)
     650            0 :             s% Pgas_start(k) = s% Pgas(k)
     651            0 :             s% Prad_start(k) = s% Prad(k)
     652            0 :             s% Pvsc_start(k) = s% Pvsc(k)
     653            0 :             s% Vol_start(k) = s% Vol(k)
     654            0 :             s% csound_start(k) = s% csound(k)
     655            0 :             s% opacity_start(k) = s% opacity(k)
     656            0 :             s% egas_start(k) = s% egas(k)
     657            0 :             s% erad_start(k) = s% erad(k)
     658            0 :             s% RSP_w_start(k) = s% RSP_w(k)
     659            0 :             s% Ptrb_start(k) = s% Ptrb(k)
     660            0 :             s% Chi_start(k) = s% Chi(k)
     661            0 :             s% v_start(k) = s% v(k)
     662            0 :             s% Fr_start(k) = s% Fr(k)
     663            0 :             s% Lc_start(k) = s% Lc(k)
     664            0 :             s% Lt_start(k) = s% Lt(k)
     665            0 :             s% COUPL_start(k) = s% COUPL(k)
     666              :          end do
     667            0 :       end subroutine save_start_vars
     668              : 
     669              : 
     670            0 :       subroutine restore_start_vars(s)
     671              :          type (star_info), pointer :: s
     672              :          integer :: I, k
     673            0 :          do I = 1,NZN
     674            0 :             k = NZN+1-i
     675            0 :             s% T(k) = s% T_start(k)
     676            0 :             s% r(k) = s% r_start(k)
     677            0 :             s% Pgas(k) = s% Pgas_start(k)
     678            0 :             s% Prad(k) = s% Prad_start(k)
     679            0 :             s% Pvsc(k) = s% Pvsc_start(k)
     680            0 :             s% Vol(k) = s% Vol_start(k)
     681            0 :             s% csound(k) = s% csound_start(k)
     682            0 :             s% opacity(k) = s% opacity_start(k)
     683            0 :             s% egas(k) = s% egas_start(k)
     684            0 :             s% erad(k) = s% erad_start(k)
     685            0 :             s% RSP_w(k) = s% RSP_w_start(k)
     686            0 :             s% Ptrb(k) = s% Ptrb_start(k)
     687            0 :             s% Chi(k) = s% Chi_start(k)
     688            0 :             s% v(k) = s% v_start(k)
     689            0 :             s% L(k) = s% L_start(k)
     690            0 :             s% Fr(k) = s% Fr_start(k)
     691            0 :             s% Lc(k) = s% Lc_start(k)
     692            0 :             s% Lt(k) = s% Lt_start(k)
     693            0 :             s% COUPL(k) = s% COUPL_start(k)
     694              :          end do
     695            0 :       end subroutine restore_start_vars
     696              : 
     697              : 
     698            0 :       subroutine eval_vars(s,iter,i_min,i_max,ierr)
     699              :          use star_utils, only: start_time, update_time
     700              :          type (star_info), pointer :: s
     701              :          integer, intent(in) :: iter,i_min,i_max
     702              :          integer, intent(out) :: ierr
     703              :          integer :: i, op_err
     704              :          integer(i8) :: time0
     705            0 :          real(dp) :: total
     706              :          include 'formats'
     707            0 :          ierr = 0
     708            0 :          if (s% doing_timing) call start_time(s, time0, total)
     709            0 :          !$OMP PARALLEL DO PRIVATE(I,op_err) SCHEDULE(dynamic,2)
     710              :          do i = i_min,i_max
     711              :             call do1_specific_volume(s,i)
     712              :             call do1_eos_and_kap(s,i,op_err)
     713              :             if (op_err /= 0) ierr = op_err
     714              :             call calc_Prad(s,i)
     715              :          end do
     716              :          !$OMP END PARALLEL DO
     717            0 :          if (s% doing_timing) call update_time(s, time0, total, s% time_eos)
     718            0 :          if (ierr /= 0) return
     719            0 :          !$OMP PARALLEL DO PRIVATE(I) SCHEDULE(dynamic,2)
     720              :          do i = i_min,i_max
     721              :             call calc_Hp_face(s,i)
     722              :             call calc_Y_face(s,i)
     723              :             call calc_PII_face(s,i)
     724              :             call calc_Pvsc(s,i)
     725              :          end do
     726              :          !$OMP END PARALLEL DO
     727            0 :          if (iter == 1 .and. s% RSP_do_check_omega) then
     728            0 :             do i = i_min,i_max
     729            0 :                call check_omega(s,i)
     730              :             end do
     731              :          end if
     732            0 :          !$OMP PARALLEL DO PRIVATE(I) SCHEDULE(dynamic,2)
     733              :          do i = i_min,i_max
     734              :             call calc_Pturb(s,i)
     735              :             call calc_Chi(s,i)
     736              :             call calc_Eq(s,i)
     737              :             call calc_source_sink(s,i)
     738              :          end do
     739              :          !$OMP END PARALLEL DO
     740            0 :          call zero_boundaries(s)
     741            0 :       end subroutine eval_vars
     742              : 
     743              : 
     744            0 :       subroutine eval_eqns(s,P_surf)
     745              :          type (star_info), pointer :: s
     746              :          real(dp), intent(in) :: P_surf
     747              :          integer :: i
     748              :          include 'formats'
     749            0 :          !$OMP PARALLEL DO PRIVATE(I) SCHEDULE(dynamic,2)
     750              :          do i = 1,NZN
     751              :             call calc_equations(s, i, P_surf)
     752              :          end do
     753              :          !$OMP END PARALLEL DO
     754            0 :       end subroutine eval_eqns
     755              : 
     756              : 
     757            0 :       subroutine do1_specific_volume(s,i)
     758              :          type (star_info), pointer :: s
     759              :          integer, intent(in) :: i
     760              :          integer :: k
     761            0 :          real(dp) :: T1
     762            0 :          real(qp) :: q1, q2, q3, q4
     763              :          include 'formats'
     764            0 :          k = NZN+1-i
     765            0 :          T1 = P43/s% dm(k)
     766            0 :          if (i /= 1) then
     767            0 :             q1 = T1
     768            0 :             q2 = s% r(k)
     769            0 :             q3 = s% r(k+1)
     770            0 :             q4 = q1*(q2**3 - q3**3)
     771            0 :             s% Vol(k) = dble(q4)
     772            0 :             dVol_dr_in(i) = - 3.0d0*T1*s% r(k+1)**2
     773              :          else
     774            0 :             s% Vol(k) = T1*(s% r(k)**3 - s% R_center**3)
     775            0 :             dVol_dr_in(i) = 0d0
     776              :          end if
     777            0 :          if (s% Vol(k) <= 0d0) then
     778            0 :             write(*,2) 'bad Vol', k, s% Vol(k)
     779            0 :             call mesa_error(__FILE__,__LINE__,'do1_specific_volume')
     780              :          end if
     781            0 :          dVol_dr_00(i) = 3.d0*T1*s% r(k)**2
     782            0 :       end subroutine do1_specific_volume
     783              : 
     784              : 
     785            0 :       subroutine solve_for_corrections(s,iter)
     786              :          type (star_info), pointer :: s
     787              :          integer, intent(in) :: iter
     788              :          integer :: i, j, info, IR, IT, IW, IE, IL, N
     789              :          logical :: okay
     790              :          include 'formats'
     791              : 
     792              :          !if (s% model_number >= s% max_model_number-1 .and. iter == 1) then
     793              :          !if (.false. .and. s% model_number == s% max_model_number) then !.and. iter == 1) then
     794              :          if (.false.) then
     795              :             ! this can be useful for finding restart bugs.
     796              :             write(*,*) 'solve_for_corrections'
     797              :             okay = .true.
     798              :             do i = 1,NZN
     799              :                IR = i_var_R + NV*(i-1)
     800              :                IT = i_var_T + NV*(i-1)
     801              :                IW = i_var_w + NV*(i-1)
     802              :                IE = i_var_er + NV*(i-1)
     803              :                IL = i_var_Fr + NV*(i-1)
     804              : 
     805              :                if (is_bad(HR(IR))) then
     806              :                   write(*,4) 'HR(IR)', iter, i, IR, HR(IR)
     807              :                   okay = .false.
     808              :                end if
     809              :                if (is_bad(HR(IT)))  then
     810              :                   write(*,4) 'HR(IT)', iter, i, IT, HR(IT)
     811              :                   okay = .false.
     812              :                end if
     813              :                if (is_bad(HR(IW)))  then
     814              :                   write(*,4) 'HR(IW)', iter, i, IW, HR(IW)
     815              :                   okay = .false.
     816              :                end if
     817              :                if (is_bad(HR(IL)))  then
     818              :                   write(*,4) 'HR(IL)', iter, i, IL, HR(IL)
     819              :                   okay = .false.
     820              :                end if
     821              : 
     822              :                if (.not. okay) call mesa_error(__FILE__,__LINE__,'solve_for_corrections')
     823              : 
     824              :                do j = 1,LD_HD
     825              :                   if (is_bad(HD(j,IR))) then
     826              :                      write(*,5) 'HD(j,IR)', iter, i, j, IR, HD(j,IR)
     827              :                      okay = .false.
     828              :                   end if
     829              :                   if (is_bad(HD(j,IT))) then
     830              :                      write(*,5) 'HD(j,IT)', iter, i, j, IT, HD(j,IT)
     831              :                      okay = .false.
     832              :                   end if
     833              :                   if (is_bad(HD(j,IW))) then
     834              :                      write(*,5) 'HD(j,IW)', iter, i, j, IW, HD(j,IW)
     835              :                      okay = .false.
     836              :                   end if
     837              :                   if (is_bad(HD(j,IE))) then
     838              :                      write(*,5) 'HD(j,IE)', iter, i, j, IE, HD(j,IE)
     839              :                      okay = .false.
     840              :                   end if
     841              :                   if (is_bad(HD(j,IL))) then
     842              :                      write(*,5) 'HD(j,IL)', iter, i, j, IL, HD(j,IL)
     843              :                      okay = .false.
     844              :                   end if
     845              : 
     846              :                   if (.not. okay) call mesa_error(__FILE__,__LINE__,'solve_for_corrections')
     847              : 
     848              :                end do
     849              : 
     850              :                cycle
     851              : 
     852              :                write(*,3) 'HR(IR)', iter, i, HR(IR)
     853              :                write(*,3) 'HR(IT)', iter, i, HR(IT)
     854              :                write(*,3) 'HR(IW)', iter, i, HR(IW)
     855              :                write(*,3) 'HR(IL)', iter, i, HR(IL)
     856              : 
     857              :                do j = 1,13
     858              :                   write(*,5) 'HD(j,IR)', iter, j, IR, i, HD(j,IR)
     859              :                end do
     860              : 
     861              :                do j = 1,13
     862              :                   write(*,5) 'HD(j,IT)', iter, j, IT, i, HD(j,IT)
     863              :                end do
     864              : 
     865              :                do j = 1,13
     866              :                   write(*,5) 'HD(j,IW)', iter, j, IW, i, HD(j,IW)
     867              :                end do
     868              : 
     869              :                write(*,3) 'HR(IE)', iter, i, HR(IE)
     870              :                do j = 1,13
     871              :                   write(*,5) 'HD(j,IE)', iter, j, IE, i, HD(j,IE)
     872              :                end do
     873              : 
     874              :                do j = 1,13
     875              :                   write(*,5) 'HD(j,IL)', iter, j, IL, i, HD(j,IL)
     876              :                end do
     877              : 
     878              :             end do
     879              :             !call mesa_error(__FILE__,__LINE__,'solve_for_corrections')
     880              :          end if
     881              : 
     882            0 :          N = NV*NZN+1
     883              : 
     884              :          if (.false.) then  ! check HR and HD for NaN's
     885              :             do I = 1,N
     886              :                if (is_bad(HR(I))) then
     887              :                   write(*,3) 'HR(I)', iter, I, HR(I)
     888              :                   call mesa_error(__FILE__,__LINE__,'solve_for_corrections')
     889              :                end if
     890              :             end do
     891              :             do I = 1,N
     892              :                do j = 1,LD_HD
     893              :                   if (is_bad(HD(j,i))) then
     894              :                      write(*,4) 'HD(j,i)', iter, j, i, HD(j,i)
     895              :                      call mesa_error(__FILE__,__LINE__,'solve_for_corrections')
     896              :                   end if
     897              :                end do
     898              :             end do
     899              :          end if
     900              : 
     901            0 :          do J = 1,2*NV     ! translate hd into band storage of LAPACK
     902            0 :             do I = 1,N
     903            0 :                ABB(J,I) = 0.0d0
     904              :             end do
     905              :          end do
     906            0 :          do J = 1,2*NV
     907            0 :             do I = 1,N - J
     908            0 :                ABB(LD_HD - J,I + J) = HD(HD_DIAG + J,I)  ! upper diagonals
     909              :             end do
     910              :          end do
     911            0 :          do J = 1,2*NV
     912            0 :             do I = 1,N - J
     913            0 :                ABB(LD_HD + J,I) = HD(HD_DIAG - J,I + J)  ! lower diagonals
     914              :             end do
     915              :          end do
     916            0 :          do I = 1,N
     917            0 :             ABB(LD_HD,I) = HD(HD_DIAG,I)
     918              :          end do
     919              : 
     920            0 :          call DGBTRF(N,N,2*NV,2*NV,ABB,LD_ABB,IPVT,INFO)
     921            0 :          if (INFO/= 0) then
     922            0 :             write(*,*) 'hyd: LAPACK/dgbtrf problem',INFO
     923            0 :             stop
     924              :          end if
     925              : 
     926            0 :          call DGBTRS('n',N,2*NV,2*NV,1,ABB,LD_ABB,IPVT,HR,N,INFO)
     927            0 :          if (INFO/= 0) then
     928            0 :             write(*,*) 'hyd: LAPACK/dgbtrs problem',INFO
     929            0 :             stop
     930              :          end if
     931              : 
     932            0 :          do I = 1,N
     933            0 :             DX(I) = HR(I)
     934            0 :             if (call_is_bad) then
     935              :                if (is_bad(DX(I))) then
     936              :                   write(*,2) 'DX(I)', I, DX(I)
     937              :                   call mesa_error(__FILE__,__LINE__,'solve_for_corrections')
     938              :                end if
     939              :             end if
     940              :          end do
     941              : 
     942            0 :       end subroutine solve_for_corrections
     943              : 
     944              : 
     945            0 :       subroutine apply_corrections(s, &
     946              :             DXH, XXT, XXC, XXE, XXL, EZH, &
     947              :             kT_max, kW_max, kE_max, kL_max)
     948              :          use star_utils, only: rand
     949              :          type (star_info), pointer :: s
     950              :          real(dp), intent(in) :: DXH
     951              :          real(dp), intent(out) :: XXT, XXC, XXE, XXL, EZH
     952              :          integer, intent(out) :: kT_max,kW_max,kE_max,kL_max
     953              :          integer :: i, k, IR, IT, IW, IE, IL, kEZH, &
     954              :             iTM, kTM, iRM, kRM, iEM, kEM, iCM, kCM, iLM, kLM
     955            0 :          real(dp) :: old_w, XXR, DXXT, DXXC, DXXE, DXXL, DXRM, DXR, &
     956            0 :             EZH1, XXTM, XXCM, XXRM, XXEM, XXLM, DXKT, DXKC, DXKE, DXKL
     957              :          include 'formats'
     958            0 :          EZH = 1.0d0; kEZH = 0
     959            0 :          XXTM = 0d0; kTM = 0; iTM = 0
     960            0 :          XXRM = 0d0; kRM = 0; iRM = 0
     961            0 :          XXEM = 0d0; kEM = 0; iEM = 0
     962            0 :          XXCM = 0d0; kCM = 0; iCM = 0
     963            0 :          XXLM = 0d0; kLM = 0; iLM = 0
     964            0 :          do I = 1,NZN
     965            0 :             k = NZN+1-i
     966            0 :             IR = i_var_R + NV*(i-1)
     967            0 :             IT = i_var_T + NV*(i-1)
     968            0 :             IW = i_var_w + NV*(i-1)
     969            0 :             IE = i_var_er + NV*(i-1)
     970            0 :             IL = i_var_Fr + NV*(i-1)
     971            0 :             if (s% RSP_w(k) > (1.d+2)*EFL0) then
     972            0 :                XXC = abs(DX(IW)/s% RSP_w(k))/DXH
     973            0 :                if (XXC > XXCM) then
     974            0 :                   XXCM = XXC; kCM = k; iCM = IW
     975              :                end if
     976              :             else
     977            0 :                XXC = 0d0
     978              :             end if
     979            0 :             if (i == 1) then
     980            0 :                DXR = -DX(IR)
     981            0 :                XXR = (DXR/(s% r(k) - s% r_center))/DXH
     982            0 :                if (XXR > XXRM) then
     983            0 :                   DXRM = DXR/(s% r(k) - s% r_center)
     984            0 :                   XXRM = XXR; kRM = k; iRM = IR
     985              :                end if
     986              :             else
     987            0 :                DXR = DX(IR-NV) - DX(IR)
     988            0 :                XXR = (DXR/(s% r(k) - s% r(k+1)))/DXH
     989            0 :                if (XXR > XXRM) then
     990            0 :                   DXRM = DXR/(s% r(k) - s% r(k+1))
     991            0 :                   XXRM = XXR; kRM = k; iRM = IR
     992              :                end if
     993              :             end if
     994            0 :             XXE = abs(DX(IE)/s% erad(k))/DXH
     995            0 :             if (XXE > XXEM) then
     996            0 :                XXEM = XXE; kEM = k; iEM = IE
     997              :             end if
     998            0 :             XXL = abs(DX(IL)/s% Fr(k))/DXH
     999            0 :             if (XXL > XXLM) then
    1000            0 :                XXLM = XXL; kLM = k; iLM = IL
    1001              :             end if
    1002            0 :             XXT = abs(DX(IT)/s% T(k))/DXH
    1003            0 :             if (XXT > XXTM) then
    1004            0 :                XXTM = XXT; kTM = k; iTM = IT
    1005              :             end if
    1006            0 :             EZH1 = EZH
    1007            0 :             EZH = 1.d0/max(1.d0/EZH,XXR,XXT,XXC,XXE)
    1008            0 :             if (EZH1 /= EZH) kEZH = k
    1009              :          end do
    1010              : 
    1011            0 :          if (EZH < 1d0 .and. s% RSP_report_undercorrections) then
    1012              :             write(*,'(i6, 2x, i3, 6(4x, a, 1x, i4, 1x, 1pe10.3))') &
    1013            0 :                s% model_number, iter, &
    1014            0 :                'EZH', kEZH, EZH, &
    1015            0 :                'r', kRM, DXRM, &
    1016            0 :                'T', kTM, DX(iTM)/s% T(kTM), &
    1017            0 :                'w', kCM, DX(iCM)/max(1d-99,s% RSP_w(kCM)), &
    1018            0 :                'erad', kEM, DX(iEM)/s% erad(kEM), &
    1019            0 :                'Fr', kLM, DX(iLM)/s% Fr(kLM)
    1020              :          end if
    1021              : 
    1022            0 :          DXXT = 0.0d0
    1023            0 :          DXXC = 0.0d0
    1024            0 :          DXXE = 0.0d0
    1025            0 :          DXXL = 0.0d0
    1026            0 :          XXT = 0.0d0
    1027            0 :          XXC = 0.0d0
    1028            0 :          XXE = 0.0d0
    1029            0 :          XXL = 0.0d0
    1030            0 :          kT_max = 0
    1031            0 :          kW_max = 0
    1032            0 :          kE_max = 0
    1033            0 :          kL_max = 0
    1034              : 
    1035            0 :          do I = 1,NZN
    1036            0 :             k = NZN+1-i
    1037            0 :             IT = i_var_T + NV*(i-1)
    1038            0 :             IR = i_var_R + NV*(i-1)
    1039            0 :             IW = i_var_w + NV*(i-1)
    1040            0 :             IE = i_var_er + NV*(i-1)
    1041            0 :             IL = i_var_Fr + NV*(i-1)
    1042            0 :             s% T(k) = s% T(k) + EZH*DX(IT)
    1043            0 :             s% erad(k) = s% erad(k) + EZH*DX(IE)
    1044            0 :             if (I > IBOTOM .and. I < NZN)then
    1045            0 :                if ((s% RSP_w(k) + EZH*DX(IW)) <= 0d0)then
    1046            0 :                   old_w = s% RSP_w(k)
    1047            0 :                   s% RSP_w(k) = EFL0*rand(s)*1d-6  ! RSP NEEDS THIS to give seed for SOURCE
    1048              :                   !write(*,3) 'rand RSP_w', k, iter, s% model_number, &
    1049              :                   !   s% RSP_w(k), old_w, EZH*DX(IW), EZH
    1050              :                else
    1051            0 :                   s% RSP_w(k) = s% RSP_w(k) + EZH*DX(IW)
    1052              :                end if
    1053              :             end if
    1054              :             s% v(k) = s% v(k) - &
    1055              :                (s% v(k) + s% v_start(k)) + &
    1056            0 :                 2.d0/s% dt*(EZH*DX(IR) + (s% r(k) - s% r_start(k)))
    1057            0 :             s% r(k) = s% r(k) + EZH*DX(IR)
    1058            0 :             s% Fr(k) = s% Fr(k) + EZH*DX(IL)
    1059            0 :             s% Lr(k) = s% Fr(k)*4d0*pi*s% r(k)**2
    1060            0 :             DXKT = DXXT
    1061            0 :             DXKC = DXXC
    1062            0 :             DXKE = DXXE
    1063            0 :             DXKL = DXXL
    1064            0 :             DXXT = max(DXXT,abs(DX(IT)/s% T(k)))
    1065            0 :             DXXE = max(DXXE,abs(DX(IE)/s% erad(k)))
    1066            0 :             DXXL = max(DXXL,abs(DX(IL)/s% Fr(k)))
    1067            0 :             if (s% RSP_w(k) > (1.d-2)*EFL0) &
    1068            0 :                DXXC = max(DXXC,abs(DX(IW)/s% RSP_w(k)))
    1069            0 :             if (DXXC > DXKC) then
    1070            0 :                kW_max = k; XXC = DX(IW)/max(1d-99,s% RSP_w(k))
    1071              :             end if
    1072            0 :             if (DXXT > DXKT) then
    1073            0 :                kT_max = k; XXT = DX(IT)/s% T(k)
    1074              :             end if
    1075            0 :             if (DXXE > DXKE) then
    1076            0 :                kE_max = k; XXE = DX(IE)/s% erad(k)
    1077              :             end if
    1078            0 :             if (DXXL > DXKL) then
    1079            0 :                kL_max = k; XXL = DX(IL)/s% Fr(k)
    1080              :             end if
    1081              :          end do
    1082              : 
    1083            0 :       end subroutine apply_corrections
    1084              : 
    1085              : 
    1086            0 :       subroutine do1_eos_and_kap(s,i,ierr)
    1087            0 :          use rsp_eval_eos_and_kap, only : eval_mesa_eos_and_kap
    1088              :          type (star_info), pointer :: s
    1089              :          integer, intent(in) :: i
    1090              :          integer, intent(out) :: ierr
    1091              :          real(dp) :: Prad, d_Pr_dT, erad, d_erad_dVol, d_erad_dT
    1092              :          integer :: k
    1093              :          include 'formats'
    1094            0 :          k = NZN + 1 - i
    1095              :          call eval_mesa_eos_and_kap(&
    1096              :             s, k, s% T(k), s% Vol(k), &
    1097              :             s% Pgas(k), d_Pg_dVol(I), d_Pg_dT(I), &
    1098              :             Prad, d_Pr_dT, &
    1099              :             s% egas(k), d_egas_dVol(I), d_egas_dT(I), &
    1100              :             erad, d_erad_dVol, d_erad_dT, &
    1101              :             s% csound(k), s% Cp(k), dCp_dVol(I), dCp_dT(I), &
    1102              :             s% QQ(k), dQQ_dVol(I), dQQ_dT(I), &
    1103            0 :             s% opacity(k), dK_dVol(I), dK_dT(I),ierr)
    1104            0 :          if (ierr /= 0) return
    1105            0 :          d_Pg_dr_00(I) = d_Pg_dVol(I)*dVol_dr_00(I)
    1106            0 :          d_Pg_dr_in(I) = d_Pg_dVol(I)*dVol_dr_in(I)
    1107            0 :          d_egas_dr_00(I) = d_egas_dVol(I)*dVol_dr_00(I)
    1108            0 :          d_egas_dr_in(I) = d_egas_dVol(I)*dVol_dr_in(I)
    1109            0 :          dCp_dr_00(I) = dCp_dVol(I)*dVol_dr_00(I)
    1110            0 :          dCp_dr_in(I) = dCp_dVol(I)*dVol_dr_in(I)
    1111            0 :          dQQ_dr_00(I) = dQQ_dVol(I)*dVol_dr_00(I)
    1112            0 :          dQQ_dr_in(I) = dQQ_dVol(I)*dVol_dr_in(I)
    1113            0 :          dK_dr_00(I) = dK_dVol(I)*dVol_dr_00(I)
    1114            0 :          dK_dr_in(I) = dK_dVol(I)*dVol_dr_in(I)
    1115              :          if (call_is_bad) then
    1116              :             if (is_bad(s% opacity(k))) then
    1117              : !$omp critical (rsp_step_1)
    1118              :                write(*,2) 's% opacity(k)', k, s% opacity(k)
    1119              :                call mesa_error(__FILE__,__LINE__,'do1_eos_and_kap')
    1120              : !$omp end critical (rsp_step_1)
    1121              :             end if
    1122              :          end if
    1123            0 :       end subroutine do1_eos_and_kap
    1124              : 
    1125              : 
    1126            0 :       subroutine calc_Prad(s,i)
    1127              :          type (star_info), pointer :: s
    1128              :          integer, intent(in) :: i
    1129              :          integer :: k
    1130            0 :          real(dp) :: V
    1131              :          logical :: test_partials
    1132              :          include 'formats'
    1133            0 :          k = NZN+1-i
    1134            0 :          V = s% Vol(k)
    1135            0 :          s% Prad(k) = s% f_Edd(k)*s% erad(k)/V
    1136            0 :          d_Pr_der(i) = s% f_Edd(k)/V
    1137            0 :          d_Pr_dVol(i) = -s% Prad(k)/V
    1138            0 :          d_Pr_dr_00(i) = d_Pr_dVol(i)*dVol_dr_00(i)
    1139            0 :          d_Pr_dr_in(i) = d_Pr_dVol(i)*dVol_dr_in(i)
    1140              : 
    1141              :          !test_partials = (k == s% solver_test_partials_k)
    1142            0 :          test_partials = .false.
    1143              : 
    1144              :          if (test_partials) then
    1145              :             s% solver_test_partials_val = s% Prad(k)
    1146              :             s% solver_test_partials_var = i_var_er
    1147              :             s% solver_test_partials_dval_dx = d_Pr_der(i)
    1148              :             write(*,*) 'calc_Prad', s% solver_test_partials_var
    1149              :             write(*,2) 'erad Prad f_Edd', k, s% erad(k), s% Prad(k), s% f_Edd(k)
    1150              :          end if
    1151              : 
    1152            0 :       end subroutine calc_Prad
    1153              : 
    1154              : 
    1155            0 :       subroutine calc_Hp_face(s,i)
    1156              :          type (star_info), pointer :: s
    1157              :          integer, intent(in) :: I
    1158            0 :          real(dp) :: POM
    1159              :          integer :: k
    1160              :          logical :: test_partials
    1161              :          include 'formats'
    1162            0 :          k = NZN+1-i
    1163            0 :          if (I < NZN) then
    1164              : 
    1165            0 :             POM = (s% r(k)**2)/(2.d0*s% cgrav(k)*s% m(k))
    1166              :             s% Hp_face(k) = POM*( &
    1167              :                (s% Pgas(k) + s% Prad(k))*s% Vol(k) &
    1168            0 :              + (s% Pgas(k-1) + s% Prad(k-1))*s% Vol(k-1))
    1169              : 
    1170              :             dHp_dVol_00(I) = POM*( &
    1171              :                + s% Vol(k)*(d_Pg_dVol(i) + d_Pr_dVol(i)) &
    1172            0 :                + s% Pgas(k) + s% Prad(k))
    1173              :             dHp_dVol_out(I) = POM*( &
    1174              :                + s% Vol(k-1)*(d_Pg_dVol(i+1) + d_Pr_dVol(i+1)) &
    1175            0 :                + s% Pgas(k-1) + s% Prad(k-1))
    1176              : 
    1177              :             dHp_dr_in(I) = POM*( &
    1178              :                (s% Pgas(k) + s% Prad(k))*dVol_dr_in(I) &
    1179            0 :              + (d_Pg_dr_in(I) + d_Pr_dr_in(I))*s% Vol(k))  !
    1180              :             dHp_dr_00(I) = 2.d0*s% Hp_face(k)/s% r(k) + POM*( &
    1181              :                 (s% Pgas(k) + s% Prad(k))*dVol_dr_00(I) &
    1182              :               + (d_Pg_dr_00(I) + d_Pr_dr_00(I))*s% Vol(k) &
    1183              :               + (s% Pgas(k-1) + s% Prad(k-1))*dVol_dr_in(i+1) &
    1184            0 :               + (d_Pg_dr_in(i+1) + d_Pr_dr_in(i+1))*s% Vol(k-1))  !
    1185              :             dHp_dr_out(I) = POM*( &
    1186              :                (s% Pgas(k-1) + s% Prad(k-1))*dVol_dr_00(i+1) &
    1187            0 :              + (d_Pg_dr_00(i+1) + d_Pr_dr_00(i+1))*s% Vol(k-1))  !
    1188              : 
    1189            0 :             dHp_dT_00(I) = POM*s% Vol(k)*d_Pg_dT(I)  !
    1190            0 :             dHp_dT_out(I) = POM*s% Vol(k-1)*d_Pg_dT(I+1)  !
    1191              : 
    1192            0 :             dHp_der_00(I) = POM*s% Vol(k)*d_Pr_der(I)  !
    1193            0 :             dHp_der_out(I) = POM*s% Vol(k-1)*d_Pr_der(I+1)  !
    1194              : 
    1195              :          else  ! surface
    1196              : 
    1197            0 :             POM = (s% r(k)**2)/(s% cgrav(k)*s% M(k))
    1198            0 :             s% Hp_face(k) = POM*(s% Pgas(k) + s% Prad(k))*s% Vol(k)
    1199              : 
    1200              :             dHp_dVol_00(I) = POM*( &
    1201              :                + s% Vol(k)*(d_Pg_dVol(i) + d_Pr_dVol(i)) &
    1202            0 :                + s% Pgas(k) + s% Prad(k))
    1203            0 :             dHp_dVol_out(I) = 0d0
    1204              : 
    1205              :             dHp_dr_in(i) = POM*( &
    1206              :                (s% Pgas(k) + s% Prad(k))*dVol_dr_in(i) &
    1207            0 :              + (d_Pg_dr_in(i) + d_Pr_dr_in(i))*s% Vol(k))
    1208              :             dHp_dr_00(i) = 2.d0*s% Hp_face(k)/s% r(k) + POM*( &
    1209              :                (s% Pgas(k) + s% Prad(k))*dVol_dr_00(i) &
    1210            0 :              + (d_Pg_dr_00(i) + d_Pr_dr_00(i))*s% Vol(k))
    1211            0 :             dHp_dr_out(i) = 0.d0
    1212            0 :             dHp_dT_00(i) = POM*s% Vol(k)*d_Pg_dT(i)
    1213            0 :             dHp_dT_out(i) = 0.d0
    1214            0 :             dHp_der_00(i) = POM*s% Vol(k)*d_Pr_der(i)
    1215            0 :             dHp_der_out(i) = 0.d0
    1216              : 
    1217              :          end if
    1218              : 
    1219              :          !test_partials = (k-1 == s% solver_test_partials_k)
    1220            0 :          test_partials = .false.
    1221              :          if (test_partials) then
    1222              :             s% solver_test_partials_val = s% Hp_face(k)
    1223              :             s% solver_test_partials_var = i_var_Vol
    1224              :             s% solver_test_partials_dval_dx = dHp_dVol_out(I)
    1225              :             write(*,*) 'calc_Hp_face', s% solver_test_partials_var
    1226              :          end if
    1227              : 
    1228            0 :       end subroutine calc_Hp_face
    1229              : 
    1230              : 
    1231            0 :       subroutine calc_Y_face(s,i)
    1232              :          type (star_info), pointer :: s
    1233              :          integer, intent(in) :: I
    1234            0 :          real(dp) :: POM, POM2, &
    1235            0 :             Y1, d_Y1_dr_00, d_Y1_dr_in, d_Y1_dr_out, &
    1236            0 :             d_Y1_dVol_00, d_Y1_dVol_out, &
    1237            0 :             d_Y1_dT_00, d_Y1_dT_out, &
    1238            0 :             d_Y1_der_00, d_Y1_der_out, &
    1239            0 :             Y2, d_Y2_dr_00, d_Y2_dr_in, d_Y2_dr_out, &
    1240            0 :             d_Y2_dVol_00, d_Y2_dVol_out, &
    1241            0 :             d_Y2_dT_00, d_Y2_dT_out, &
    1242            0 :             d_Y2_der_00, d_Y2_der_out
    1243              :          integer :: k
    1244              :          logical :: test_partials
    1245              :          include 'formats'
    1246            0 :          k = NZN+1-i
    1247            0 :          if (i < NZN .and. ALFA /= 0d0) then
    1248            0 :             POM = 0.5d0*(s% QQ(k)/s% Cp(k) + s% QQ(k-1)/s% Cp(k-1))
    1249            0 :             POM2 = 0.5d0*((s% Pgas(k-1) + s% Prad(k-1)) - (s% Pgas(k) + s% Prad(k)))
    1250              :             Y1 = &
    1251              :                0.5d0*(s% QQ(k)/s% Cp(k)+ s% QQ(k-1)/s% Cp(k-1))* &
    1252              :                      ((s% Pgas(k-1) + s% Prad(k-1)) - (s% Pgas(k) + s% Prad(k))) &
    1253            0 :                - (s% lnT(k-1) - s% lnT(k))
    1254              : 
    1255              :             d_Y1_dVol_00 = &
    1256              :                - POM*(d_Pg_dVol(i) + d_Pr_dVol(i)) &
    1257            0 :                + POM2*(dQQ_dVol(i) - s% QQ(k)*dCp_dVol(i)/s% Cp(k))/s% Cp(k)
    1258              :             d_Y1_dVol_out = &
    1259              :                + POM*(d_Pg_dVol(i+1) + d_Pr_dVol(i+1)) &
    1260            0 :                + POM2*(dQQ_dVol(i+1) - s% QQ(k-1)*dCp_dVol(i+1)/s% Cp(k-1))/s% Cp(k-1)
    1261              : 
    1262              :             d_Y1_dr_00 = &
    1263              :                POM2*( &
    1264              :                   (dQQ_dr_00(I) - s% QQ(k)/s% Cp(k)*dCp_dr_00(I))/s% Cp(k)&
    1265              :                  +(dQQ_dr_in(i+1) - s% QQ(k-1)/s% Cp(k-1)*dCp_dr_in(i+1))/s% Cp(k-1)) &
    1266            0 :               + POM*(d_Pg_dr_in(i+1) - d_Pg_dr_00(I) + d_Pr_dr_in(i+1) - d_Pr_dr_00(I))
    1267              : 
    1268              :             d_Y1_dr_in = &
    1269              :                  POM2*(dQQ_dr_in(I) - s% QQ(k)/s% Cp(k)*dCp_dr_in(I))/s% Cp(k) &
    1270            0 :                + POM*(- d_Pg_dr_in(I) - d_Pr_dr_in(I))
    1271              : 
    1272              :             d_Y1_dr_out = &
    1273              :                  POM2*(dQQ_dr_00(i+1) - s% QQ(k-1)/s% Cp(k-1)*dCp_dr_00(i+1))/s% Cp(k-1) &
    1274            0 :                + POM*(d_Pg_dr_00(i+1) + d_Pr_dr_00(i+1))
    1275              : 
    1276              :             d_Y1_dT_00 = &
    1277              :                  POM2*(dQQ_dT(I) - s% QQ(k)/s% Cp(k)*dCp_dT(I))/s% Cp(k) &
    1278              :                - POM*d_Pg_dT(I) &
    1279            0 :                + 1.d0/s% T(k)
    1280              : 
    1281              :             d_Y1_dT_out = &
    1282              :                  POM2*(dQQ_dT(i+1) - s% QQ(k-1)/s% Cp(k-1)*dCp_dT(i+1))/s% Cp(k-1) &
    1283              :                + POM*d_Pg_dT(I+1) &
    1284            0 :                - 1.d0/s% T(k-1)
    1285              : 
    1286            0 :             d_Y1_der_00 = -POM*d_Pr_der(I)
    1287              : 
    1288            0 :             d_Y1_der_out = POM*d_Pr_der(I+1)
    1289              : 
    1290            0 :             POM = 2.d0/(s% Vol(k) + s% Vol(k-1))
    1291            0 :             POM2 = 8.d0*PI*(s% r(k)**2)/s% dm_bar(k)*s% Hp_face(k)
    1292            0 :             Y2 = 4.d0*PI*(s% r(k)**2)*s% Hp_face(k)*POM/s% dm_bar(k)
    1293              : 
    1294              :             d_Y2_dVol_00 = &
    1295              :                + Y2/s% Hp_face(k)*dHp_dVol_00(i) &
    1296            0 :                - POM2/(s% Vol(k) + s% Vol(k-1))**2
    1297              :             d_Y2_dVol_out = &
    1298              :                + Y2/s% Hp_face(k)*dHp_dVol_out(i) &
    1299            0 :                - POM2/(s% Vol(k) + s% Vol(k-1))**2
    1300              : 
    1301              :             d_Y2_dr_00 = 2.d0*Y2/s% r(k) &
    1302              :                + Y2/s% Hp_face(k)*dHp_dr_00(I) &
    1303            0 :                - POM2/(s% Vol(k) + s% Vol(k-1))**2*(dVol_dr_00(I) + dVol_dr_in(i+1))
    1304              : 
    1305              :             d_Y2_dr_in = - POM2/(s% Vol(k) &
    1306              :                + s% Vol(k-1))**2*dVol_dr_in(I) &
    1307            0 :                + Y2/s% Hp_face(k)*dHp_dr_in(I)
    1308              : 
    1309              :             d_Y2_dr_out = - POM2/(s% Vol(k) &
    1310              :                + s% Vol(k-1))**2*dVol_dr_00(i+1) &
    1311            0 :                + Y2/s% Hp_face(k)*dHp_dr_out(I)
    1312              : 
    1313            0 :             d_Y2_dT_00 = Y2/s% Hp_face(k)*dHp_dT_00(I)
    1314              : 
    1315            0 :             d_Y2_dT_out = Y2/s% Hp_face(k)*dHp_dT_out(I)
    1316              : 
    1317            0 :             d_Y2_der_00 = Y2/s% Hp_face(k)*dHp_der_00(I)
    1318              : 
    1319            0 :             d_Y2_der_out = Y2/s% Hp_face(k)*dHp_der_out(I)
    1320              : 
    1321            0 :             s% Y_face(k) = Y1*Y2
    1322              : 
    1323            0 :             if (k==-35 .and. iter == 1) then
    1324            0 :                write(*,3) 'RSP Y_face Y1 Y2', k, s% solver_iter, s% Y_face(k), Y1, Y2
    1325            0 :                write(*,3) 'Peos', k, s% solver_iter, s% Pgas(k) + s% Prad(k)
    1326            0 :                write(*,3) 'Peos', k-1, s% solver_iter, s% Pgas(k-1) + s% Prad(k-1)
    1327            0 :                write(*,3) 'QQ', k, s% solver_iter, s% QQ(k)
    1328            0 :                write(*,3) 'QQ', k-1, s% solver_iter, s% QQ(k-1)
    1329            0 :                write(*,3) 'Cp', k, s% solver_iter, s% Cp(k)
    1330            0 :                write(*,3) 'Cp', k-1, s% solver_iter, s% Cp(k-1)
    1331            0 :                write(*,3) 'lgT', k, s% solver_iter, s% lnT(k)/ln10
    1332            0 :                write(*,3) 'lgT', k-1, s% solver_iter, s% lnT(k-1)/ln10
    1333            0 :                write(*,3) 'lgd', k, s% solver_iter, log(1d0/s% Vol(k))/ln10
    1334            0 :                write(*,3) 'lgd', k-1, s% solver_iter, log(1d0/s% Vol(k-1))/ln10
    1335              :             end if
    1336              : 
    1337            0 :             dY_dr_00(I) = Y1*d_Y2_dr_00 + Y2*d_Y1_dr_00  !
    1338            0 :             dY_dr_in(I) = Y1*d_Y2_dr_in + Y2*d_Y1_dr_in  !
    1339            0 :             dY_dr_out(I) = Y1*d_Y2_dr_out + Y2*d_Y1_dr_out  !
    1340            0 :             dY_dVol_00(I) = Y1*d_Y2_dVol_00 + Y2*d_Y1_dVol_00  !
    1341            0 :             dY_dVol_out(I) = Y1*d_Y2_dVol_out + Y2*d_Y1_dVol_out  !
    1342            0 :             dY_dT_00(I) = Y1*d_Y2_dT_00 + Y2*d_Y1_dT_00  !
    1343            0 :             dY_dT_out(I) = Y1*d_Y2_dT_out + Y2*d_Y1_dT_out  !
    1344            0 :             dY_der_00(I) = Y1*d_Y2_der_00 + Y2*d_Y1_der_00  !
    1345            0 :             dY_der_out(I) = Y1*d_Y2_der_out + Y2*d_Y1_der_out  !
    1346              : 
    1347              :             if (call_is_bad) then
    1348            0 :                if (is_bad(s% Y_face(k))) then
    1349              :                   !$omp critical (rsp_step_2)
    1350              :                   write(*,2) 's% Y_face(k)', k, s% Y_face(k)
    1351              :                   write(*,2) 'Y1', k, Y1
    1352              :                   write(*,2) 'Y2', k, Y2
    1353              :                   write(*,2) 's% QQ(k)', k, s% QQ(k)
    1354              :                   write(*,2) 's% Cp(k)', k, s% Cp(k)
    1355              :                   write(*,2) 's% Pgas(k)', k, s% Pgas(k)
    1356              :                   write(*,2) 's% Prad(k)', k, s% Prad(k)
    1357              :                   write(*,2) 's% T(k)', k, s% T(k)
    1358              :                   call mesa_error(__FILE__,__LINE__,'calc_Y_face')
    1359              :                   !$omp end critical (rsp_step_2)
    1360              :                end if
    1361              :             end if
    1362              : 
    1363              :          else
    1364            0 :             s% Y_face(k) = 0
    1365            0 :             dY_dr_00(I) = 0
    1366            0 :             dY_dr_in(I) = 0
    1367            0 :             dY_dr_out(I) = 0
    1368            0 :             dY_dVol_00(I) = 0
    1369            0 :             dY_dVol_out(I) = 0
    1370            0 :             dY_dT_00(I) = 0
    1371            0 :             dY_dT_out(I) = 0
    1372            0 :             dY_der_00(I) = 0
    1373            0 :             dY_der_out(I) = 0
    1374              :          end if
    1375              : 
    1376              :          !test_partials = (k == s% solver_test_partials_k)
    1377            0 :          test_partials = .false.
    1378              :          if (test_partials) then
    1379              :             s% solver_test_partials_val = s% Y_face(k)
    1380              :             s% solver_test_partials_var = i_var_Vol
    1381              :             s% solver_test_partials_dval_dx = dY_dVol_00(I)
    1382              :             write(*,*) 'calc_Y_face', s% solver_test_partials_var
    1383              :          end if
    1384              : 
    1385            0 :       end subroutine calc_Y_face
    1386              : 
    1387              : 
    1388            0 :       subroutine calc_PII_face(s,i)
    1389              :          type (star_info), pointer :: s
    1390              :          integer, intent(in) :: I
    1391            0 :          real(dp) :: POM, POM2
    1392              :          integer :: k
    1393              :          logical :: test_partials
    1394              :          include 'formats'
    1395            0 :          k = NZN+1-i
    1396            0 :          if (k == 1 .or. k == s% nz .or. ALFA == 0d0) then
    1397            0 :             s% PII(k) = 0
    1398            0 :             dPII_dr_00(I) = 0
    1399            0 :             dPII_dr_in(I) = 0
    1400            0 :             dPII_dr_out(I) = 0
    1401            0 :             dPII_dVol_00(I) = 0
    1402            0 :             dPII_dVol_out(I) = 0
    1403            0 :             dPII_dT_00(I) = 0
    1404            0 :             dPII_dT_out(I) = 0
    1405            0 :             dPII_der_00(I) = 0
    1406            0 :             dPII_der_out(I) = 0
    1407              :          else
    1408            0 :             POM = ALFAS*ALFA
    1409            0 :             POM2 = 0.5d0*(s% Cp(k) + s% Cp(k-1))
    1410            0 :             s% PII(k) = POM*POM2*s% Y_face(k)
    1411              : 
    1412              :             dPII_dVol_00(I) = &
    1413            0 :                POM*(POM2*dY_dVol_00(I) + s% Y_face(k)*0.5d0*dCp_dVol(I))
    1414              :             dPII_dVol_out(I) = &
    1415            0 :                POM*(POM2*dY_dVol_out(I) + s% Y_face(k)*0.5d0*dCp_dVol(I+1))
    1416              :             dPII_dr_in(I) = &  !
    1417            0 :                POM*(POM2*dY_dr_in(I) + s% Y_face(k)*0.5d0*dCp_dr_in(I))
    1418              :             dPII_dr_00(I) = &  !
    1419            0 :                POM*(POM2*dY_dr_00(I) + s% Y_face(k)*0.5d0*(dCp_dr_00(I) + dCp_dr_in(i+1)))
    1420              :             dPII_dr_out(I) = &  !
    1421            0 :                POM*(POM2*dY_dr_out(I) + s% Y_face(k)*0.5d0*dCp_dr_00(i+1))
    1422              :             dPII_dT_00(I) = &  !
    1423            0 :                POM*(POM2*dY_dT_00(I) + s% Y_face(k)*0.5d0*dCp_dT(I))
    1424              :             dPII_dT_out(I) = &  !
    1425            0 :                POM*(POM2*dY_dT_out(I) + s% Y_face(k)*0.5d0*dCp_dT(i+1))
    1426            0 :             dPII_der_00(I) = POM*POM2*dY_der_00(I)  !
    1427            0 :             dPII_der_out(I) = POM*POM2*dY_der_out(I)  !
    1428              :          end if
    1429              : 
    1430              :          !test_partials = (k-1 == s% solver_test_partials_k)
    1431            0 :          test_partials = .false.
    1432              :          if (test_partials) then
    1433              :             s% solver_test_partials_val = s% PII(k)
    1434              :             s% solver_test_partials_var = i_var_Vol
    1435              :             s% solver_test_partials_dval_dx = dPII_dVol_out(I)
    1436              :             write(*,*) 'calc_PII_face', s% solver_test_partials_var
    1437              :          end if
    1438              : 
    1439            0 :       end subroutine calc_PII_face
    1440              : 
    1441              : 
    1442            0 :       subroutine calc_Pvsc(s,i)
    1443              :          type (star_info), pointer :: s
    1444              :          integer, intent(in) :: I
    1445              :          real(dp) :: &
    1446            0 :             dv, dv1, P, dP_dT, dP_der, dP_dr_in, dP_dr_00, V, sqrt_PV, &
    1447            0 :             d_PV_dT, d_PV_der, d_PV_dr_in, d_PV_dr_00, &
    1448            0 :             d_sqrt_PV_dT, d_sqrt_PV_der, d_sqrt_PV_dr_in, d_sqrt_PV_dr_00, &
    1449            0 :             d_dv_dT, d_dv_der, d_dv_dr_in, d_dv_dr_00, &
    1450            0 :             dP_dVol, d_PV_dVol, d_sqrt_PV_dVol, d_dv_dVol
    1451              :          integer :: k
    1452              :          logical :: test_partials
    1453              :          include 'formats'
    1454            0 :          k = NZN+1-i
    1455            0 :          if (CQ == 0d0) then
    1456            0 :             s% Pvsc(k) = 0d0
    1457            0 :             d_Pvsc_dVol(i) = 0d0
    1458            0 :             d_Pvsc_dT(i) = 0d0
    1459            0 :             d_Pvsc_der(i) = 0d0
    1460            0 :             d_Pvsc_dr_in(i) = 0d0
    1461            0 :             d_Pvsc_dr_00(i) = 0d0
    1462            0 :             return
    1463              :          end if
    1464            0 :          if (I > 1) then
    1465            0 :             dv = s% v(k+1) - s% v(k)
    1466              :          else
    1467            0 :             dv = s% v_center - s% v(NZN)
    1468              :          end if
    1469            0 :          P = s% Pgas(k) + s% Prad(k)
    1470            0 :          dP_dT = d_Pg_dT(I)
    1471            0 :          dP_dVol = d_Pg_dVol(I) + d_Pr_dVol(I)
    1472            0 :          dP_der = d_Pr_der(I)
    1473            0 :          dP_dr_in = d_Pg_dr_in(I) + d_Pr_dr_in(I)
    1474            0 :          dP_dr_00 = d_Pg_dr_00(I) + d_Pr_dr_00(I)
    1475            0 :          V = s% Vol(k)
    1476            0 :          sqrt_PV = sqrt(P*V)
    1477            0 :          if (dv <= ZSH*sqrt_PV) then
    1478            0 :             s% Pvsc(k) = 0d0
    1479            0 :             d_Pvsc_dVol(i) = 0d0
    1480            0 :             d_Pvsc_dT(i) = 0d0
    1481            0 :             d_Pvsc_der(i) = 0d0
    1482            0 :             d_Pvsc_dr_in(i) = 0d0
    1483            0 :             d_Pvsc_dr_00(i) = 0d0
    1484            0 :             return
    1485              :          end if
    1486              : 
    1487            0 :          d_PV_dT = dP_dT*V
    1488            0 :          d_PV_dVol = P + dP_dVol*V
    1489            0 :          d_PV_der = dP_der*V
    1490            0 :          d_PV_dr_in = dP_dr_in*V + P*dVol_dr_in(I)
    1491            0 :          d_PV_dr_00 = dP_dr_00*V + P*dVol_dr_00(I)
    1492              : 
    1493            0 :          d_sqrt_PV_dT = 0.5d0*d_PV_dT/sqrt_PV
    1494            0 :          d_sqrt_PV_dVol = 0.5d0*d_PV_dVol/sqrt_PV
    1495            0 :          d_sqrt_PV_der = 0.5d0*d_PV_der/sqrt_PV
    1496            0 :          d_sqrt_PV_dr_in = 0.5d0*d_PV_dr_in/sqrt_PV
    1497            0 :          d_sqrt_PV_dr_00 = 0.5d0*d_PV_dr_00/sqrt_PV
    1498              : 
    1499            0 :          dv1 = dv
    1500            0 :          dv = dv - ZSH*sqrt_PV
    1501              : 
    1502            0 :          d_dv_dT = - ZSH*d_sqrt_PV_dT
    1503            0 :          d_dv_dVol = - ZSH*d_sqrt_PV_dVol
    1504            0 :          d_dv_der = - ZSH*d_sqrt_PV_der
    1505              : 
    1506            0 :          d_dv_dr_in = 2d0/s% dt - ZSH*d_sqrt_PV_dr_in  ! not used if I == 1
    1507            0 :          d_dv_dr_00 = -2d0/s% dt - ZSH*d_sqrt_PV_dr_00
    1508              : 
    1509              :          ! Pvsc = CQ*P*(dv1/sqrt_PV - cut)^2  eqn 3.60
    1510              :          !     = CQ*P*((dv1 - cut*sqrt_PV)/sqrt_PV)^2
    1511              :          !     = CQ*P/(P*V)*dv^2
    1512              :          !     = CQ/V*dv^2
    1513              : 
    1514            0 :          s% Pvsc(k) = CQ/V*dv**2
    1515            0 :          d_Pvsc_dVol(i) = -s% Pvsc(k)/V + 2d0*d_dv_dVol*CQ/V*dv
    1516            0 :          d_Pvsc_dT(i) = CQ/V*2d0*dv*d_dv_dT
    1517            0 :          d_Pvsc_der(i) = CQ/V*2d0*dv*d_dv_der
    1518            0 :          d_Pvsc_dr_in(i) = CQ/V*2d0*dv*d_dv_dr_in - CQ*dv**2*dVol_dr_in(I)/V**2
    1519            0 :          d_Pvsc_dr_00(i) = CQ/V*2d0*dv*d_dv_dr_00 - CQ*dv**2*dVol_dr_00(I)/V**2
    1520              : 
    1521              :          !test_partials = (k == s% solver_test_partials_k)
    1522            0 :          test_partials = .false.
    1523              :          if (test_partials) then
    1524              :             s% solver_test_partials_val = s% Pvsc(k)
    1525              :             s% solver_test_partials_var = i_var_T
    1526              :             s% solver_test_partials_dval_dx = d_Pvsc_dT(i)
    1527              :             write(*,*) 'calc_Pvsc', s% solver_test_partials_var
    1528              :          end if
    1529              :       end subroutine calc_Pvsc
    1530              : 
    1531              : 
    1532            0 :       subroutine check_omega(s,i)
    1533              :          type (star_info), pointer :: s
    1534              :          integer, intent(in) :: i
    1535            0 :          real(dp) :: SOURS, DAMPS, DAMPRS, DELTA, SOL, POM, POM2, POM3, POM4, w_start
    1536              :          integer :: k
    1537              :          include 'formats'
    1538            0 :          if (I > IBOTOM .and. I < NZN .and. ALFA /= 0d0) then
    1539              :          !     JAK OKRESLIC OMEGA DLA PIERWSZEJ ITERACJI
    1540            0 :             k = NZN+1-i
    1541            0 :             if (s% RSP_w(k) > EFL0) return
    1542            0 :             w_start = s% RSP_w(k)
    1543            0 :             POM = (s% PII(k)/s% Hp_face(k) + s% PII(k+1)/s% Hp_face(k+1))*0.5d0
    1544            0 :             POM2 = s% T(k)*(s% Pgas(k) + s% Prad(k))*s% QQ(k)/s% Cp(k)
    1545            0 :             SOURS = POM*POM2
    1546            0 :             DAMPS = (CEDE/ALFA)/((s% Hp_face(k) + s% Hp_face(k+1))*0.5d0)
    1547            0 :             POM3 = (GAMMAR**2)/(ALFA**2)*4.d0*SIG
    1548            0 :             POM4 = (s% T(k)**3)*(s% Vol(k)**2)/(s% Cp(k)*s% opacity(k))
    1549            0 :             DAMPRS = POM3*POM4/((s% Hp_face(k)**2 + s% Hp_face(k+1)**2)*0.5d0)
    1550            0 :             DELTA = DAMPRS**2 + 4.d0*DAMPS*SOURS
    1551              :             if (k==-35) then
    1552              :                write(*,2) 'del', k, DELTA
    1553              :                write(*,2) 'DAMPR', k, DAMPRS
    1554              :                write(*,2) 'DAMP', k, DAMPS
    1555              :                write(*,2) 'SOURCE', k, SOURS
    1556              :                write(*,2) 'POM', k, POM
    1557              :                write(*,2) 'POM2', k, POM2
    1558              :                write(*,2) 's% Hp_face(k)', k, s% Hp_face(k)
    1559              :                write(*,2) 's% Hp_face(k+1)', k+1, s% Hp_face(k+1)
    1560              :                write(*,2) 's% PII(k)', k, s% PII(k)
    1561              :                write(*,2) 's% PII(k+1)', k+1, s% PII(k+1)
    1562              :                write(*,2) 's% Y_face(k)', k, s% Y_face(k)
    1563              :                write(*,2) 's% Y_face(k+1)', k+1, s% Y_face(k+1)
    1564              :             end if
    1565            0 :             if (DELTA >= 0.d0) SOL = ( - DAMPRS + sqrt(DELTA))/(2.d0*DAMPS)
    1566            0 :             if (DELTA < 0.d0) SOL = - 99.99d0
    1567            0 :             if (SOL >= 0.d0) SOL = SOL**2
    1568            0 :             if (SOL > 0.d0) then
    1569            0 :                s% RSP_w(k) = sqrt(SOL)
    1570            0 :                if (s% RSP_report_check_omega_changes) &
    1571            0 :                   write(*,3) 'RSP_w modified initial guess vs initial', k, s% model_number, &
    1572            0 :                      s% RSP_w(k), w_start
    1573              :             end if
    1574              :          end if
    1575              :       end subroutine check_omega
    1576              : 
    1577              : 
    1578            0 :       subroutine calc_Pturb(s,i)  ! TURBULENT PRESSURE (ZONE)
    1579              :          type (star_info), pointer :: s
    1580              :          integer, intent(in) :: I
    1581            0 :          real(dp) :: TEM1, Vol
    1582              :          integer :: k
    1583              :          logical :: test_partials
    1584              :          include 'formats'
    1585            0 :          k = NZN+1-i
    1586              :          if (ALFA == 0d0 .or. ALFAP == 0d0 .or. &
    1587            0 :              I <= IBOTOM .or. I >= NZN) then
    1588            0 :             s% Ptrb(k) = 0.d0
    1589            0 :             dPtrb_dVol_00(I) = 0.d0
    1590            0 :             dPtrb_dw_00(I) = 0.d0
    1591            0 :             dPtrb_dr_00(I) = 0.d0
    1592            0 :             dPtrb_dr_in(I) = 0.d0
    1593              :          else
    1594            0 :             Vol = s% Vol(k)
    1595            0 :             s% Ptrb(k) = ALFAP*s% RSP_w(k)**2/Vol
    1596            0 :             dPtrb_dVol_00(I) = -s% Ptrb(k)/Vol
    1597            0 :             dPtrb_dw_00(I) = 2.d0*ALFAP*s% RSP_w(k)/Vol
    1598            0 :             TEM1 = - ALFAP*s% RSP_w(k)**2/Vol**2
    1599            0 :             dPtrb_dr_00(I) = TEM1*dVol_dr_00(I)
    1600            0 :             dPtrb_dr_in(I) = TEM1*dVol_dr_in(I)
    1601              :          end if
    1602              :          !test_partials = (k == s% solver_test_partials_k)
    1603            0 :          test_partials = .false.
    1604              :          if (test_partials) then
    1605              :             s% solver_test_partials_val = 0  ! residual
    1606              :             s% solver_test_partials_var = i_var_R
    1607              :             s% solver_test_partials_dval_dx = 0  ! d_residual_dr_00
    1608              :             write(*,*) 'calc_Pturb', s% solver_test_partials_var
    1609              :          end if
    1610            0 :       end subroutine calc_Pturb
    1611              : 
    1612              : 
    1613            0 :       subroutine calc_Chi(s,i)  ! eddy viscosity (Kuhfuss 1986)
    1614              :          type (star_info), pointer :: s
    1615              :          integer, intent(in) :: I
    1616            0 :          real(dp) :: POM, POM1, POM2, POM3, POM4, &
    1617            0 :             POMT1, POMT2, POMT3, POMT4, Vol
    1618              :          integer :: k
    1619              :          logical :: test_partials
    1620              :          include 'formats'
    1621            0 :          k = NZN+1-i
    1622            0 :          if (ALFA == 0d0 .or. I <= IBOTOM .or. I >= NZN) then
    1623            0 :             s% Chi(k) = 0
    1624            0 :             dChi_dT_out(I) = 0
    1625            0 :             dChi_dT_00(I) = 0
    1626            0 :             dChi_dT_in(I) = 0
    1627            0 :             dChi_der_out(I) = 0
    1628            0 :             dChi_der_00(I) = 0
    1629            0 :             dChi_der_in(I) = 0
    1630            0 :             dChi_dw_00(I) = 0
    1631            0 :             dChi_dr_out(I) = 0
    1632            0 :             dChi_dr_00(I) = 0
    1633            0 :             dChi_dr_in(I) = 0
    1634            0 :             dChi_dr_in2(I) = 0
    1635              :             !s% profile_extra(k,2) = 0
    1636              :             !s% profile_extra(k,3) = 0
    1637              :             !s% profile_extra(k,4) = 0
    1638              :          else
    1639            0 :             POM = (16.d0/3.d0)*PI*ALFA*ALFAM/s% dm(k)
    1640            0 :             Vol = s% Vol(k)
    1641            0 :             POM1 = s% RSP_w(k)/Vol**2
    1642            0 :             POM2 = 0.5d0*(s% r(k)**6 + s% r(k+1)**6)
    1643            0 :             POM4 = 0.5d0*(s% Hp_face(k) + s% Hp_face(k+1))
    1644            0 :             POM3 = s% v(k)/s% r(k) - s% v(k+1)/s% r(k+1)
    1645            0 :             POMT3 = POM*POM1*POM2*POM4
    1646            0 :             POMT1 = POM*POM2*POM3*POM4
    1647            0 :             POMT2 = POM*POM1*POM3*POM4
    1648            0 :             POMT4 = POM*POM1*POM2*POM3
    1649              : 
    1650            0 :             s% Chi(k) = POMT1*POM1
    1651              : 
    1652              :             if (call_is_bad) then
    1653              :                if (is_bad(s% Chi(k))) then
    1654              :                   !$omp critical (rsp_step_3)
    1655              :                   write(*,2) 'POM', k, POM
    1656              :                   write(*,2) 'POM1', k, POM1
    1657              :                   write(*,2) 'POM2', k, POM2
    1658              :                   write(*,2) 'POM3', k, POM3
    1659              :                   write(*,2) 'POM4', k, POM4
    1660              :                   write(*,2) 's% RSP_w(k)', k, s% RSP_w(k)
    1661              :                   write(*,2) 's% Volk)', k, s% Vol(k)
    1662              :                   write(*,2) 's% r(k)', k, s% r(k)
    1663              :                   write(*,2) 's% r(k+1)', k+1, s% r(k+1)
    1664              :                   write(*,2) 's% v(k)', k, s% v(k)
    1665              :                   write(*,2) 's% v(k+1)', k+1, s% v(k+1)
    1666              :                   write(*,2) 's% Vol(k+1)', k+1, s% Vol(k+1)
    1667              :                   write(*,2) 's% rho(k+1)', k+1, s% rho(k+1)
    1668              :                   call mesa_error(__FILE__,__LINE__,'calc_Chi')
    1669              :                   !$omp end critical (rsp_step_3)
    1670              :                end if
    1671              :             end if
    1672              : 
    1673              :             dChi_dVol_out(I) = &
    1674            0 :                  POMT4*0.5d0*dHp_dVol_out(I)
    1675              :             dChi_dVol_00(I) = &
    1676              :                + POMT4*0.5d0*(dHp_dVol_00(I) + dHp_dVol_out(i-1)) &
    1677            0 :                - 2d0*s% Chi(k)/Vol
    1678              :             dChi_dVol_in(I) = &
    1679            0 :                  POMT4*0.5d0*dHp_dVol_00(i-1)
    1680              : 
    1681            0 :             dChi_dT_out(I) = POMT4*0.5d0*dHp_dT_out(I)  !
    1682            0 :             dChi_dT_00(I) = POMT4*0.5d0*(dHp_dT_00(I) + dHp_dT_out(i-1))  !
    1683            0 :             dChi_dT_in(I) = POMT4*0.5d0*dHp_dT_00(i-1)  !
    1684              : 
    1685            0 :             dChi_der_out(I) = POMT4*0.5d0*(dHp_der_out(I))  !
    1686            0 :             dChi_der_00(I) = POMT4*0.5d0*(dHp_der_00(I) + dHp_der_out(i-1))  !
    1687            0 :             dChi_der_in(I) = POMT4*0.5d0*(dHp_der_00(i-1))  !
    1688              : 
    1689            0 :             dChi_dw_00(I) = POMT1/Vol**2  !
    1690              : 
    1691            0 :             dChi_dr_out(I) = POMT4*0.5d0*(dHp_dr_out(I))  !
    1692              :             dChi_dr_00(I) = &
    1693              :                - 2.d0*s% Chi(k)/Vol*dVol_dr_00(I) &  !
    1694              :                + POMT2*3.d0*s% r(k)**5 &
    1695              :                + POMT3*(2.d0/s% dt/s% r(k) - s% v(k)/s% r(k)**2) &
    1696            0 :                + POMT4*0.5d0*(dHp_dr_00(I) + dHp_dr_out(i-1))
    1697              :             dChi_dr_in(I) = &
    1698              :                - 2.d0*s% Chi(k)/Vol*dVol_dr_in(I) &  !
    1699              :                + POMT2*3.d0*s% r(k+1)**5 &
    1700              :                - POMT3*(2.d0/s% dt/s% r(k+1) - s% v(k+1)/s% r(k+1)**2) &
    1701            0 :                + POMT4*0.5d0*(dHp_dr_in(I) + dHp_dr_00(i-1))
    1702            0 :             dChi_dr_in2(I) = POMT4*0.5d0*dHp_dr_in(i-1)  !
    1703              : 
    1704              :             if (call_is_bad) then
    1705              :                if (is_bad(dChi_dr_in(I))) then
    1706              :                   !$omp critical (rsp_step_4)
    1707              :                   write(*,2) 's% Chi(k)', k, s% Chi(k)
    1708              :                   write(*,2) 'Vol', k, Vol
    1709              :                   write(*,2) 'POMT2', k, POMT2
    1710              :                   write(*,2) 'POMT3', k, POMT3
    1711              :                   write(*,2) 'POMT4', k, POMT4
    1712              :                   write(*,2) 'dVol_dr_in(I)', I, dVol_dr_in(I)
    1713              :                   write(*,2) 'dChi_dr_in(I)', I, dChi_dr_in(I)
    1714              :                   write(*,2) 'dHp_dr_00(i-1)', I-1, dHp_dr_00(i-1)
    1715              :                   write(*,2) 'dHp_dr_in(I)', I, dHp_dr_in(I)
    1716              :                   write(*,2) 's% r(k+1)', k+1, s% r(k+1)
    1717              :                   write(*,2) 's% v(k+1)', k+1, s% v(k+1)
    1718              :                   call mesa_error(__FILE__,__LINE__,'calc_Chi')
    1719              :                   !$omp end critical (rsp_step_4)
    1720              :                end if
    1721              :             end if
    1722              : 
    1723              :          end if
    1724              : 
    1725              :             !if (k==194) then
    1726              :             !   write(*,2) 'RSP Chi', k, s% Chi(k)
    1727              :             !end if
    1728              : 
    1729              :          !test_partials = (k-1 == s% solver_test_partials_k)
    1730            0 :          test_partials = .false.
    1731              :          if (test_partials) then
    1732              :             s% solver_test_partials_val = s% Chi(k)
    1733              :             s% solver_test_partials_var = i_var_Vol
    1734              :             s% solver_test_partials_dval_dx = dChi_dVol_out(I)
    1735              :             write(*,*) 'calc_Chi', s% solver_test_partials_var
    1736              :          end if
    1737            0 :       end subroutine calc_Chi
    1738              : 
    1739              : 
    1740            0 :       subroutine calc_Eq(s,i)
    1741              :          type (star_info), pointer :: s
    1742              :          integer, intent(in) :: I
    1743            0 :          real(dp) :: RRI, RRM, UUI, UUM, POM, POM2
    1744              :          integer :: k
    1745              :          logical :: test_partials
    1746              :          include 'formats'
    1747            0 :          k = NZN+1-i
    1748            0 :          if (ALFA == 0d0 .or. I <= IBOTOM .or. I >= NZN) then
    1749            0 :             s% Eq(k) = 0
    1750            0 :             dEq_dr_out(I) = 0
    1751            0 :             dEq_dr_00(I) = 0
    1752            0 :             dEq_dr_in(I) = 0
    1753            0 :             dEq_dr_in2(I) = 0
    1754            0 :             dEq_dVol_out(I) = 0
    1755            0 :             dEq_dVol_00(I) = 0
    1756            0 :             dEq_dVol_in(I) = 0
    1757            0 :             dEq_dT_out(I) = 0
    1758            0 :             dEq_dT_00(I) = 0
    1759            0 :             dEq_dT_in(I) = 0
    1760            0 :             dEq_der_out(I) = 0
    1761            0 :             dEq_der_00(I) = 0
    1762            0 :             dEq_der_in(I) = 0
    1763            0 :             dEq_dw_00(I) = 0
    1764              :          else
    1765              : 
    1766            0 :             RRI = 0.5d0*(s% r(k) + s% r_start(k))
    1767            0 :             RRM = 0.5d0*(s% r(k+1) + s% r_start(k+1))
    1768            0 :             UUI = 0.5d0*(s% v(k) + s% v_start(k))
    1769            0 :             UUM = 0.5d0*(s% v(k+1) + s% v_start(k+1))
    1770              : 
    1771            0 :             POM = P4/s% dm(k)*(UUI/RRI - UUM/RRM)
    1772            0 :             POM2 = P4/s% dm(k)*(THETAU*s% Chi(k) + THETAU1*s% Chi_start(k))
    1773              : 
    1774            0 :             s% Eq(k) = POM*(THETAU*s% Chi(k) + THETAU1*s% Chi_start(k))
    1775              : 
    1776            0 :             POM = POM*THETAU
    1777              : 
    1778            0 :             dEq_dVol_out(I) = POM*THETAU*dChi_dVol_out(i)
    1779            0 :             dEq_dVol_00(I) = POM*THETAU*dChi_dVol_00(i)
    1780            0 :             dEq_dVol_in(I) = POM*THETAU*dChi_dVol_in(i)
    1781              : 
    1782            0 :             dEq_dr_out(I) = POM*dChi_dr_out(I)  !
    1783              :             dEq_dr_00(I) = POM*dChi_dr_00(I) &  !
    1784            0 :                + POM2*(1.d0/(RRI*s% dt) - 0.5d0*UUI/(RRI**2))
    1785              :             dEq_dr_in(I) = POM*dChi_dr_in(I) &  !
    1786            0 :                - POM2*(1.d0/(RRM*s% dt) - 0.5d0*UUM/(RRM**2))
    1787            0 :             dEq_dr_in2(I) = POM*dChi_dr_in2(I)  !
    1788            0 :             dEq_dT_out(I) = POM*dChi_dT_out(I)  !
    1789            0 :             dEq_dT_00(I) = POM*dChi_dT_00(I)  !
    1790            0 :             dEq_dT_in(I) = POM*dChi_dT_in(I)  !
    1791            0 :             dEq_der_out(I) = POM*dChi_der_out(I)  !
    1792            0 :             dEq_der_00(I) = POM*dChi_der_00(I)  !
    1793            0 :             dEq_der_in(I) = POM*dChi_der_in(I)  !
    1794            0 :             dEq_dw_00(I) = POM*dChi_dw_00(I)  !
    1795              :          end if
    1796              : 
    1797              :          !test_partials = (k+1 == s% solver_test_partials_k)
    1798            0 :          test_partials = .false.
    1799              :          if (test_partials) then
    1800              :             s% solver_test_partials_val = s% Eq(k)
    1801              :             s% solver_test_partials_var = i_var_Vol
    1802              :             s% solver_test_partials_dval_dx = dEq_dVol_in(I)
    1803              :             write(*,*) 'calc_Eq', s% solver_test_partials_var
    1804              :          end if
    1805            0 :       end subroutine calc_Eq
    1806              : 
    1807              : 
    1808            0 :       subroutine calc_source_sink(s,i)
    1809              :          type (star_info), pointer :: s
    1810              :          integer, intent(in) :: I
    1811            0 :          real(dp) :: POM, POM2, POM3, POM4, TEM1, TEMI, TEMM, &
    1812            0 :             dsrc_dr_in2, dsrc_dr_in, dsrc_dr_00, dsrc_dr_out, &
    1813            0 :             dsrc_dVol_out, dsrc_dVol_00, dsrc_dVol_in, &
    1814            0 :             dsrc_dT_out, dsrc_dT_00, dsrc_dT_in, &
    1815            0 :             dsrc_der_out, dsrc_der_00, dsrc_der_in, &
    1816            0 :             dsrc_dw_00, &
    1817            0 :             d_damp_dr_in2, d_damp_dr_in, d_damp_dr_00, d_damp_dr_out, &
    1818            0 :             d_damp_dVol_out, d_damp_dVol_00, d_damp_dVol_in, &
    1819            0 :             d_damp_dT_out, d_damp_dT_00, d_damp_dT_in, &
    1820            0 :             d_damp_der_out, d_damp_der_00, d_damp_der_in, &
    1821            0 :             d_damp_dw_00, &
    1822            0 :             d_dampR_dr_in2, d_dampR_dr_in, d_dampR_dr_00, d_dampR_dr_out, &
    1823            0 :             d_dampR_dVol_out, d_dampR_dVol_00, d_dampR_dVol_in, &
    1824            0 :             d_dampR_dT_out, d_dampR_dT_00, d_dampR_dT_in, &
    1825            0 :             d_dampR_der_out, d_dampR_der_00, d_dampR_der_in, &
    1826            0 :             d_dampR_dw_00, d_POM_dVol_00, d_POM_dVol_in, &
    1827            0 :             d_QQ_div_Cp_d_Vol_00, d_POM2_dVol_00, QQ_div_Cp, &
    1828            0 :             POM2a, POM2b, d_POM2a_dVol_00, d_POM2b_dVol_00, &
    1829            0 :             d_POM4_dVol_00
    1830              :          integer :: k
    1831              :          logical :: test_partials
    1832              :          include 'formats'
    1833            0 :          k = NZN+1-i
    1834            0 :          if (ALFA == 0d0 .or. I <= IBOTOM .or. I >= NZN) then
    1835            0 :             s% SOURCE(k) = 0
    1836            0 :             s% DAMP(k) = 0
    1837            0 :             s% DAMPR(k) = 0
    1838            0 :             s% COUPL(k) = 0
    1839              :          else
    1840              :             ! SOURCE TERM
    1841            0 :             POM = 0.5d0*(s% PII(k)/s% Hp_face(k) + s% PII(k+1)/s% Hp_face(k+1))
    1842            0 :             QQ_div_Cp = s% QQ(k)/s% Cp(k)
    1843            0 :             POM2 = s% T(k)*(s% Pgas(k) + s% Prad(k))*QQ_div_Cp
    1844            0 :             POM3 = s% RSP_w(k)
    1845            0 :             s% SOURCE(k) = POM*POM2*POM3
    1846              : 
    1847              :             ! P*QQ/Cp = grad_ad
    1848            0 :             if (k==-109) write(*,3) 'w grada PII_00 PII_p1 SOURCE', k, s% solver_iter, &
    1849            0 :                s% RSP_w(k), (s% Pgas(k) + s% Prad(k))*QQ_div_Cp, s% PII(k), &
    1850            0 :                s% PII(k+1), s% SOURCE(k)
    1851              : 
    1852            0 :             TEM1 = POM2*POM3*0.5d0
    1853            0 :             TEMI = - s% PII(k)/s% Hp_face(k)**2
    1854            0 :             TEMM = - s% PII(k+1)/s% Hp_face(k+1)**2
    1855              : 
    1856              :             d_POM_dVol_00 =  &
    1857              :                0.5d0*(dPII_dVol_00(I) - s% PII(k)/s% Hp_face(k)*dHp_dVol_00(I))/s% Hp_face(k) + &
    1858            0 :                0.5d0*(dPII_dVol_out(I-1) - s% PII(k+1)/s% Hp_face(k+1)*dHp_dVol_out(I-1))/s% Hp_face(k+1)
    1859              :             d_POM_dVol_in = 0.5d0*( &
    1860            0 :                dPII_dVol_00(I-1) - s% PII(k+1)/s% Hp_face(k+1)*dHp_dVol_00(I-1))/s% Hp_face(k+1)
    1861            0 :             d_QQ_div_Cp_d_Vol_00 = (dQQ_dVol(i) - dCp_dVol(i)*s% QQ(k)/s% Cp(k))/s% Cp(k)
    1862              :             d_POM2_dVol_00 = s% T(k)*( &
    1863              :                   (d_Pg_dVol(i) + d_Pr_dVol(i))*QQ_div_Cp + &
    1864            0 :                   (s% Pgas(k) + s% Prad(k))*d_QQ_div_Cp_d_Vol_00)
    1865              :             dsrc_dVol_out = TEM1*( &  ! ok
    1866              :                   dPII_dVol_out(I)/s% Hp_face(k) &
    1867            0 :                 + TEMI*dHp_dVol_out(I))
    1868            0 :             dsrc_dVol_00 = POM3*(d_POM_dVol_00*POM2 + POM*d_POM2_dVol_00)
    1869              :             dsrc_dVol_in = TEM1*( &  ! ok
    1870              :                   dPII_dVol_00(i-1)/s% Hp_face(k+1) &
    1871            0 :                 + TEMM*dHp_dVol_00(i-1))
    1872              : 
    1873              :             dsrc_dr_out = TEM1*(dPII_dr_out(I)/s% Hp_face(k) &
    1874            0 :                + TEMI*dHp_dr_out(I))
    1875              :             dsrc_dr_00 = TEM1*(dPII_dr_00(I)/s% Hp_face(k) + dPII_dr_out(i-1)/s% Hp_face(k+1) &
    1876            0 :                + TEMI*dHp_dr_00(I) + TEMM*dHp_dr_out(i-1))
    1877              :             dsrc_dr_in = TEM1*(dPII_dr_in(I)/s% Hp_face(k) + dPII_dr_00(i-1)/s% Hp_face(k+1) &
    1878            0 :                + TEMI*dHp_dr_in(I) + TEMM*dHp_dr_00(i-1))
    1879              :             dsrc_dr_in2 = TEM1*(dPII_dr_in(i-1)/s% Hp_face(k+1) &
    1880            0 :                + TEMM*dHp_dr_in(i-1))
    1881              : 
    1882              :             dsrc_dT_out = TEM1*( &
    1883              :                   dPII_dT_out(I)/s% Hp_face(k) &
    1884            0 :                 + TEMI*dHp_dT_out(I))
    1885              :             dsrc_dT_00 = TEM1*( &
    1886              :                   dPII_dT_00(I)/s% Hp_face(k) &
    1887              :                 + dPII_dT_out(i-1)/s% Hp_face(k+1) &
    1888              :                 + TEMI*dHp_dT_00(I) &
    1889            0 :                 + TEMM*dHp_dT_out(i-1))
    1890              :             dsrc_dT_in = TEM1*( &
    1891              :                   dPII_dT_00(i-1)/s% Hp_face(k+1) &
    1892            0 :                 + TEMM*dHp_dT_00(i-1))
    1893              : 
    1894              :             dsrc_der_out = TEM1*( &
    1895              :                   dPII_der_out(I)/s% Hp_face(k) &
    1896            0 :                 + TEMI*dHp_der_out(I))
    1897              :             dsrc_der_00 = TEM1*( &
    1898              :                   dPII_der_00(I)/s% Hp_face(k) &
    1899              :                 + dPII_der_out(i-1)/s% Hp_face(k+1) &
    1900              :                 + TEMI*dHp_der_00(I) &
    1901            0 :                 + TEMM*dHp_der_out(i-1))
    1902              :             dsrc_der_in = TEM1*( &
    1903              :                   dPII_der_00(i-1)/s% Hp_face(k+1) &
    1904            0 :                 + TEMM*dHp_der_00(i-1))
    1905              : 
    1906            0 :             dsrc_dw_00 = POM*POM2
    1907              : 
    1908            0 :             POM = POM*POM3
    1909              : 
    1910              :             dsrc_dT_00 = dsrc_dT_00 + POM/s% Cp(k)*( &
    1911              :                  (s% Pgas(k) + s% Prad(k))*s% QQ(k) &
    1912              :                + s% T(k)*s% QQ(k)*d_Pg_dT(I) &
    1913              :                + s% T(k)*(s% Pgas(k) + s% Prad(k))*dQQ_dT(I) &
    1914            0 :                - s% T(k)*(s% Pgas(k) + s% Prad(k))*s% QQ(k)/s% Cp(k)*dCp_dT(I))
    1915              : 
    1916              :             dsrc_der_00 = dsrc_der_00 &
    1917            0 :                + POM/s% Cp(k)*s% T(k)*s% QQ(k)*d_Pr_der(I)
    1918              : 
    1919              :             dsrc_dr_00 = dsrc_dr_00 + POM*s% T(k)/s% Cp(k)*( &
    1920              :                  s% QQ(k)*(d_Pg_dr_00(I) + d_Pr_dr_00(I)) &
    1921              :                + (s% Pgas(k) + s% Prad(k))*dQQ_dr_00(I) &
    1922            0 :                - (s% Pgas(k) + s% Prad(k))*s% QQ(k)/s% Cp(k)*dCp_dr_00(I))
    1923              :             dsrc_dr_in = dsrc_dr_in + POM*s% T(k)/s% Cp(k)*( &
    1924              :                  s% QQ(k)*(d_Pg_dr_in(I) + d_Pr_dr_in(I)) &
    1925              :                + (s% Pgas(k) + s% Prad(k))*dQQ_dr_in(I) &
    1926            0 :                - (s% Pgas(k) + s% Prad(k))*s% QQ(k)/s% Cp(k)*dCp_dr_in(I))
    1927              : 
    1928              :             ! DAMP TERM
    1929            0 :             POM = (CEDE/ALFA)*(s% RSP_w(k)**3 - EFL0**3)
    1930            0 :             POM2 = 0.5d0*(s% Hp_face(k) + s% Hp_face(k+1))
    1931            0 :             s% DAMP(k) = POM/POM2
    1932              : 
    1933            0 :             TEM1 = - 0.5d0*POM/POM2**2
    1934              : 
    1935            0 :             d_damp_dVol_out = TEM1*dHp_dVol_out(I)
    1936            0 :             d_damp_dVol_00 = TEM1*(dHp_dVol_00(I) + dHp_dVol_out(i-1))
    1937            0 :             d_damp_dVol_in = TEM1*dHp_dVol_00(i-1)
    1938            0 :             d_damp_dr_out = TEM1*dHp_dr_out(I)
    1939            0 :             d_damp_dr_00 = TEM1*(dHp_dr_00(I) + dHp_dr_out(i-1))
    1940            0 :             d_damp_dr_in = TEM1*(dHp_dr_in(I) + dHp_dr_00(i-1))
    1941            0 :             d_damp_dr_in2 = TEM1*(dHp_dr_in(i-1))
    1942            0 :             d_damp_dT_00 = TEM1*(dHp_dT_00(I) + dHp_dT_out(i-1))
    1943            0 :             d_damp_dT_out = TEM1*dHp_dT_out(I)
    1944            0 :             d_damp_dT_in = TEM1*dHp_dT_00(i-1)
    1945            0 :             d_damp_der_00 = TEM1*(dHp_der_00(I) + dHp_der_out(i-1))
    1946            0 :             d_damp_der_out = TEM1*dHp_der_out(I)
    1947            0 :             d_damp_der_in = TEM1*dHp_der_00(i-1)
    1948            0 :             d_damp_dw_00 = 3.0d0*(CEDE/ALFA)/POM2*s% RSP_w(k)**2
    1949              : 
    1950              :             ! RADIATIVE DAMP TERM
    1951            0 :             if (GAMMAR == 0.d0)then
    1952            0 :                s% DAMPR(k) = 0.d0
    1953            0 :                d_dampR_dr_out = 0.d0
    1954            0 :                d_dampR_dr_00 = 0.d0
    1955            0 :                d_dampR_dr_in = 0.d0
    1956            0 :                d_dampR_dr_in2 = 0.d0
    1957            0 :                d_dampR_dVol_out = 0.d0
    1958            0 :                d_dampR_dVol_in = 0.d0
    1959            0 :                d_dampR_dVol_00 = 0.d0
    1960            0 :                d_dampR_dT_out = 0.d0
    1961            0 :                d_dampR_dT_in = 0.d0
    1962            0 :                d_dampR_dT_00 = 0.d0
    1963            0 :                d_dampR_der_out = 0.d0
    1964            0 :                d_dampR_der_in = 0.d0
    1965            0 :                d_dampR_der_00 = 0.d0
    1966            0 :                d_dampR_dw_00 = 0.d0
    1967              :             else
    1968            0 :                POM = (GAMMAR**2)/(ALFA**2)*4.d0*SIG
    1969            0 :                POM2a = s% T(k)**3*s% Vol(k)**2
    1970            0 :                POM2b = 1d0/(s% Cp(k)*s% opacity(k))
    1971            0 :                POM2 = POM2a*POM2b
    1972            0 :                POM3 = s% RSP_w(k)**2
    1973            0 :                POM4 = 0.5d0*(s% Hp_face(k)**2 + s% Hp_face(k+1)**2)
    1974            0 :                s% DAMPR(k) = POM*POM2*POM3/POM4
    1975              : 
    1976            0 :                TEM1 = - s% DAMPR(k)/POM4
    1977              : 
    1978            0 :                d_POM2a_dVol_00 = 2d0*s% T(k)**3*s% Vol(k)
    1979              :                d_POM2b_dVol_00 = &
    1980            0 :                   -POM2b*(dCp_dVol(i)/s% Cp(k) + dK_dVol(i)/s% opacity(k))
    1981            0 :                d_POM2_dVol_00 = d_POM2a_dVol_00*POM2b + POM2a*d_POM2b_dVol_00
    1982              :                d_POM4_dVol_00 = &
    1983              :                   s% Hp_face(k)*dHp_dVol_00(I) + &
    1984            0 :                   s% Hp_face(k+1)*dHp_dVol_out(I-1)
    1985              : 
    1986            0 :                d_dampR_dVol_out = TEM1*s% Hp_face(k)*dHp_dVol_out(I)
    1987              :                d_dampR_dVol_00 = POM*POM3*( &
    1988            0 :                   d_POM2_dVol_00 - POM2*d_POM4_dVol_00/POM4)/POM4
    1989              : 
    1990            0 :                d_dampR_dVol_in = TEM1*s% Hp_face(k+1)*dHp_dVol_00(i-1)
    1991              : 
    1992            0 :                d_dampR_dr_out = TEM1*s% Hp_face(k)*dHp_dr_out(I)
    1993              :                d_dampR_dr_00 = TEM1*(s% Hp_face(k)*dHp_dr_00(I) &
    1994            0 :                   + s% Hp_face(k+1)*dHp_dr_out(i-1))
    1995              :                d_dampR_dr_in = TEM1*(s% Hp_face(k)*dHp_dr_in(I) &
    1996            0 :                   + s% Hp_face(k+1)*dHp_dr_00(i-1))
    1997            0 :                d_dampR_dr_in2 = TEM1*s% Hp_face(k+1)*dHp_dr_in(i-1)
    1998              : 
    1999            0 :                d_dampR_dT_out = TEM1*s% Hp_face(k)*dHp_dT_out(I)
    2000              :                d_dampR_dT_00 = TEM1*(s% Hp_face(k)*dHp_dT_00(I) &
    2001            0 :                   + s% Hp_face(k+1)*dHp_dT_out(i-1))
    2002            0 :                d_dampR_dT_in = TEM1*s% Hp_face(k+1)*dHp_dT_00(i-1)
    2003              : 
    2004            0 :                d_dampR_der_out = TEM1*s% Hp_face(k)*dHp_der_out(I)
    2005              :                d_dampR_der_00 = TEM1*(s% Hp_face(k)*dHp_der_00(I) &
    2006            0 :                   + s% Hp_face(k+1)*dHp_der_out(i-1))
    2007            0 :                d_dampR_der_in = TEM1*s% Hp_face(k+1)*dHp_der_00(i-1)
    2008              : 
    2009            0 :                d_dampR_dw_00 = POM*POM2/POM4*2.d0*s% RSP_w(k)
    2010              : 
    2011            0 :                TEM1 = POM*POM3/POM4
    2012              :                d_dampR_dr_00 = d_dampR_dr_00 &
    2013              :                   + TEM1*s% T(k)**3*(2.d0*s% Vol(k)*dVol_dr_00(I) &
    2014              :                   - s% Vol(k)**2*(1.d0/s% Cp(k)*dCp_dr_00(I) &
    2015              :                   + 1.d0/s% opacity(k)*dK_dr_00(I))) &
    2016            0 :                   /(s% Cp(k)*s% opacity(k))
    2017              : 
    2018              :                d_dampR_dr_in = d_dampR_dr_in &
    2019              :                   + TEM1*s% T(k)**3*(&
    2020              :                        2.d0*s% Vol(k)*dVol_dr_in(I) &
    2021              :                      - s% Vol(k)**2* &
    2022              :                         (dCp_dr_in(I)/s% Cp(k) + dK_dr_in(I)/s% opacity(k))) &
    2023            0 :                   /(s% Cp(k)*s% opacity(k))
    2024              : 
    2025              :                d_dampR_dT_00 = d_dampR_dT_00 &
    2026              :                   + TEM1*s% Vol(k)**2*(3.d0*s% T(k)**2 &
    2027              :                   - s% T(k)**3*(1.d0/s% Cp(k)*dCp_dT(I) &
    2028              :                   + 1.d0/s% opacity(k)*dK_dT(I))) &
    2029            0 :                   /(s% Cp(k)*s% opacity(k))
    2030              : 
    2031              :             end if
    2032              : 
    2033            0 :             s% COUPL(k) = s% SOURCE(k) - s% DAMP(k) - s% DAMPR(k)
    2034            0 :             dC_dr_00(I) = dsrc_dr_00 - d_damp_dr_00 - d_dampR_dr_00  !
    2035            0 :             dC_dr_out(I) = dsrc_dr_out - d_damp_dr_out - d_dampR_dr_out  !
    2036            0 :             dC_dr_in(I) = dsrc_dr_in - d_damp_dr_in - d_dampR_dr_in  !
    2037            0 :             dC_dr_in2(I) = dsrc_dr_in2 - d_damp_dr_in2 - d_dampR_dr_in2  !
    2038            0 :             dC_dVol_00(I) = dsrc_dVol_00 - d_damp_dVol_00 - d_dampR_dVol_00  !
    2039            0 :             dC_dVol_out(I) = dsrc_dVol_out - d_damp_dVol_out - d_dampR_dVol_out  !
    2040            0 :             dC_dVol_in(I) = dsrc_dVol_in - d_damp_dVol_in - d_dampR_dVol_in  !
    2041            0 :             dC_dT_00(I) = dsrc_dT_00 - d_damp_dT_00 - d_dampR_dT_00  !
    2042            0 :             dC_dT_out(I) = dsrc_dT_out - d_damp_dT_out - d_dampR_dT_out  !
    2043            0 :             dC_dT_in(I) = dsrc_dT_in - d_damp_dT_in - d_dampR_dT_in  !
    2044            0 :             dC_der_00(I) = dsrc_der_00 - d_damp_der_00 - d_dampR_der_00  !
    2045            0 :             dC_der_out(I) = dsrc_der_out - d_damp_der_out - d_dampR_der_out  !
    2046            0 :             dC_der_in(I) = dsrc_der_in - d_damp_der_in - d_dampR_der_in  !
    2047            0 :             dC_dw_00(I) = dsrc_dw_00 - d_damp_dw_00 - d_dampR_dw_00  !
    2048              : 
    2049              :          !test_partials = (k == s% solver_test_partials_k)
    2050            0 :          test_partials = .false.
    2051              :          if (test_partials) then
    2052              :             s% solver_test_partials_val = s% COUPL(k)
    2053              :             s% solver_test_partials_var = i_var_Vol
    2054              :             s% solver_test_partials_dval_dx = dC_dVol_00(I)
    2055              :             write(*,*) 'calc_source_sink', s% solver_test_partials_var
    2056              :          end if
    2057              : 
    2058              :          end if
    2059              : 
    2060            0 :       end subroutine calc_source_sink
    2061              : 
    2062              : 
    2063            0 :       subroutine zero_boundaries(s)
    2064              :          type (star_info), pointer :: s
    2065              :          integer :: I, k
    2066            0 :          do I = 1,IBOTOM
    2067            0 :             k = NZN+1-i
    2068            0 :             s% Eq(k) = 0.d0
    2069            0 :             dEq_dr_in2(I) = 0.d0
    2070            0 :             dEq_dr_in(I) = 0.d0
    2071            0 :             dEq_dr_00(I) = 0.d0
    2072            0 :             dEq_dr_out(I) = 0.d0
    2073            0 :             dEq_dT_in(I) = 0.d0
    2074            0 :             dEq_dT_00(I) = 0.d0
    2075            0 :             dEq_dT_out(I) = 0.d0
    2076            0 :             dEq_dw_00(I) = 0.d0  ! -
    2077            0 :             s% Chi(k) = 0.d0
    2078            0 :             dChi_dr_in2(I) = 0.d0
    2079            0 :             dChi_dr_in(I) = 0.d0
    2080            0 :             dChi_dr_00(I) = 0.d0
    2081            0 :             dChi_dr_out(I) = 0.d0
    2082            0 :             dChi_dT_in(I) = 0.d0
    2083            0 :             dChi_dT_00(I) = 0.d0
    2084            0 :             dChi_dT_out(I) = 0.d0
    2085            0 :             dChi_dw_00(I) = 0.d0  ! -
    2086            0 :             s% COUPL(k) = 0.d0
    2087            0 :             dC_dr_00(I) = 0.d0
    2088            0 :             dC_dr_out(I) = 0.d0
    2089            0 :             dC_dr_in(I) = 0.d0
    2090            0 :             dC_dr_in2(I) = 0.d0
    2091            0 :             dC_dT_in(I) = 0.d0
    2092            0 :             dC_dT_00(I) = 0.d0
    2093            0 :             dC_dT_out(I) = 0.d0
    2094            0 :             dC_dw_00(I) = 0.d0  ! -
    2095            0 :             s% Ptrb(k) = 0.d0
    2096            0 :             dPtrb_dr_00(I) = 0.d0
    2097            0 :             dPtrb_dr_in(I) = 0.d0
    2098            0 :             dPtrb_dw_00(I) = 0.d0  ! -
    2099              :          end do
    2100            0 :          do I = NZN,NZN
    2101            0 :             k = NZN+1-i
    2102            0 :             s% Eq(k) = 0.d0
    2103            0 :             dEq_dr_in2(I) = 0.d0
    2104            0 :             dEq_dr_in(I) = 0.d0
    2105            0 :             dEq_dr_00(I) = 0.d0
    2106            0 :             dEq_dr_out(I) = 0.d0
    2107            0 :             dEq_dT_in(I) = 0.d0
    2108            0 :             dEq_dT_00(I) = 0.d0
    2109            0 :             dEq_dT_out(I) = 0.d0
    2110            0 :             dEq_dw_00(I) = 0.d0  ! -
    2111            0 :             s% Chi(k) = 0.d0
    2112            0 :             dChi_dr_in2(I) = 0.d0
    2113            0 :             dChi_dr_in(I) = 0.d0
    2114            0 :             dChi_dr_00(I) = 0.d0
    2115            0 :             dChi_dr_out(I) = 0.d0
    2116            0 :             dChi_dT_in(I) = 0.d0
    2117            0 :             dChi_dT_00(I) = 0.d0
    2118            0 :             dChi_dT_out(I) = 0.d0
    2119            0 :             dChi_dw_00(I) = 0.d0  ! -
    2120            0 :             s% COUPL(k) = 0.d0
    2121            0 :             dC_dr_00(I) = 0.d0
    2122            0 :             dC_dr_out(I) = 0.d0
    2123            0 :             dC_dr_in(I) = 0.d0
    2124            0 :             dC_dr_in2(I) = 0.d0
    2125            0 :             dC_dT_in(I) = 0.d0
    2126            0 :             dC_dT_00(I) = 0.d0
    2127            0 :             dC_dT_out(I) = 0.d0
    2128            0 :             dC_dw_00(I) = 0.d0  ! -
    2129            0 :             s% Ptrb(k) = 0.d0
    2130            0 :             dPtrb_dr_00(I) = 0.d0
    2131            0 :             dPtrb_dr_in(I) = 0.d0
    2132            0 :             dPtrb_dw_00(I) = 0.d0  ! -
    2133              :          end do
    2134            0 :       end subroutine zero_boundaries
    2135              : 
    2136              : 
    2137            0 :       subroutine calc_Lt(s,i,Lt_00, &
    2138              :             dLt_dr_00, dLt_dr_in, dLt_dr_out, &
    2139              :             dLt_dVol_00, dLt_dVol_out, &
    2140              :             dLt_dT_00, dLt_dT_out, &
    2141              :             dLt_der_00, dLt_der_out, &
    2142              :             dLt_dw_00, dLt_dw_out)
    2143              :          type (star_info), pointer :: s
    2144              :          integer, intent(in) :: I
    2145              :          real(dp), intent(out) :: &
    2146              :             Lt_00, &
    2147              :             dLt_dr_00, dLt_dr_in, dLt_dr_out, &
    2148              :             dLt_dVol_00, dLt_dVol_out, &
    2149              :             dLt_dT_00, dLt_dT_out, &
    2150              :             dLt_der_00, dLt_der_out, &
    2151              :             dLt_dw_00, dLt_dw_out
    2152            0 :          real(dp) :: POM, POM2, POM3, TEM1, TEM2, &
    2153            0 :             d_POM2_dVol_00, d_POM2_dVol_out, rho2_face
    2154              :          integer :: k
    2155              :          logical :: test_partials
    2156              :          include 'formats'
    2157            0 :          k = NZN+1-i
    2158              :          if (I <= IBOTOM .or. I == NZN .or. ALFA == 0d0 .or. &
    2159            0 :              ALFAT == 0.d0 .or. k < min_k_for_turbulent_flux) then
    2160            0 :             Lt_00 = 0.d0
    2161            0 :             dLt_dr_00 = 0.d0
    2162            0 :             dLt_dr_in = 0.d0
    2163            0 :             dLt_dr_out = 0.d0
    2164            0 :             dLt_dVol_00 = 0.d0
    2165            0 :             dLt_dVol_out = 0.d0
    2166            0 :             dLt_dT_00 = 0.d0
    2167            0 :             dLt_dT_out = 0.d0
    2168            0 :             dLt_der_00 = 0.d0
    2169            0 :             dLt_der_out = 0.d0
    2170            0 :             dLt_dw_00 = 0.d0
    2171            0 :             dLt_dw_out = 0.d0
    2172              :          else
    2173            0 :             POM3 = (s% RSP_w(k-1)**3 - s% RSP_w(k)**3)/s% dm_bar(k)
    2174            0 :             POM = - 2.d0/3.d0*ALFA*ALFAT*(P4*(s% r(k)**2))**2
    2175            0 :             rho2_face = 0.5d0*(1.d0/s% Vol(k)**2 + 1.d0/s% Vol(k-1)**2)
    2176            0 :             POM2 = s% Hp_face(k)*rho2_face
    2177            0 :             Lt_00 = POM*POM2*POM3
    2178              : 
    2179            0 :             TEM1 = Lt_00/s% Hp_face(k)
    2180            0 :             TEM2 = Lt_00/POM2*s% Hp_face(k)
    2181              : 
    2182            0 :             d_POM2_dVol_00 = dHp_dVol_00(i)*rho2_face - s% Hp_face(k)/s% Vol(k)**3
    2183            0 :             d_POM2_dVol_out = dHp_dVol_out(i)*rho2_face - s% Hp_face(k)/s% Vol(k-1)**3
    2184            0 :             dLt_dVol_00 = POM*POM3*d_POM2_dVol_00
    2185            0 :             dLt_dVol_out = POM*POM3*d_POM2_dVol_out
    2186              : 
    2187              :             dLt_dr_00 = 4.d0*Lt_00/s% r(k) &  !
    2188              :                - TEM2/s% Vol(k)**3*dVol_dr_00(I) &
    2189              :                - TEM2/s% Vol(k-1)**3*dVol_dr_in(i+1) &
    2190            0 :                + TEM1*dHp_dr_00(I)
    2191              :             dLt_dr_in = &
    2192              :                - TEM2/s% Vol(k)**3*dVol_dr_in(I) &  !
    2193            0 :                + TEM1*dHp_dr_in(I)
    2194              :             dLt_dr_out = &
    2195              :                - TEM2/s% Vol(k-1)**3*dVol_dr_00(i+1) &  !
    2196            0 :                + TEM1*dHp_dr_out(I)
    2197            0 :             dLt_dT_00 = TEM1*dHp_dT_00(I)  !
    2198            0 :             dLt_dT_out = TEM1*dHp_dT_out(I)  !
    2199            0 :             dLt_der_00 = TEM1*dHp_der_00(I)  !
    2200            0 :             dLt_der_out = TEM1*dHp_der_out(I)  !
    2201            0 :             TEM1 = POM*POM2*3.0d0/s% dm_bar(k)
    2202            0 :             dLt_dw_00 = -TEM1*s% RSP_w(k)**2  !
    2203            0 :             dLt_dw_out = TEM1*s% RSP_w(k-1)**2  !
    2204              :          end if
    2205            0 :          if (i > 0) s% Lt(k) = Lt_00
    2206              : 
    2207              :          !test_partials = (k-1 == s% solver_test_partials_k)
    2208            0 :          test_partials = .false.
    2209              :          if (test_partials) then
    2210              :             s% solver_test_partials_val = Lt_00
    2211              :             s% solver_test_partials_var = i_var_Vol
    2212              :             s% solver_test_partials_dval_dx = dLt_dVol_out
    2213              :             write(*,*) 'calc_Lt', s% solver_test_partials_var
    2214              :          end if
    2215            0 :       end subroutine calc_Lt
    2216              : 
    2217              : 
    2218            0 :       subroutine calc_Lc(s,i,Lc_00, &
    2219              :             dLc_dr_in, dLc_dr_00, dLc_dr_out, &
    2220              :             dLc_dVol_00, dLc_dVol_out, &
    2221              :             dLc_dT_00, dLc_dT_out, &
    2222              :             dLc_der_00, dLc_der_out, &
    2223              :             dLc_dw_00, dLc_dw_out)
    2224              :          type (star_info), pointer :: s
    2225              :          integer, intent(in) :: I
    2226              :          real(dp), intent(out) :: &
    2227              :             Lc_00, dLc_dr_in, dLc_dr_00, dLc_dr_out, &
    2228              :             dLc_dVol_00, dLc_dVol_out, &
    2229              :             dLc_dT_00, dLc_dT_out, &
    2230              :             dLc_der_00, dLc_der_out, &
    2231              :             dLc_dw_00, dLc_dw_out
    2232            0 :          real(dp) :: POM,POM2,POM3
    2233              :          integer :: k
    2234              :          logical :: test_partials
    2235              :          include 'formats'
    2236            0 :          k = NZN+1-i
    2237            0 :          if (I <= IBOTOM .or. I == NZN .or. ALFA == 0d0)then
    2238            0 :             Lc_00 = 0.d0  !DODANE SMOLEC
    2239            0 :             dLc_dr_in = 0.d0
    2240            0 :             dLc_dr_00 = 0.d0
    2241            0 :             dLc_dr_out = 0.d0
    2242            0 :             dLc_dVol_00 = 0.d0
    2243            0 :             dLc_dVol_out = 0.d0
    2244            0 :             dLc_dT_00 = 0.d0
    2245            0 :             dLc_dT_out = 0.d0
    2246            0 :             dLc_der_00 = 0.d0
    2247            0 :             dLc_der_out = 0.d0
    2248            0 :             dLc_dw_00 = 0.d0
    2249            0 :             dLc_dw_out = 0.d0  ! -
    2250            0 :          else if (s% RSP_w(k) < EFL0*1d-8)then
    2251            0 :             Lc_00 = 0.d0
    2252            0 :             dLc_dr_00 = 0.d0
    2253            0 :             dLc_dr_in = 0.d0
    2254            0 :             dLc_dr_out = 0.d0
    2255            0 :             dLc_dVol_00 = 0.d0
    2256            0 :             dLc_dVol_out = 0.d0
    2257            0 :             dLc_dT_00 = 0.d0
    2258            0 :             dLc_dT_out = 0.d0
    2259            0 :             dLc_der_00 = 0.d0
    2260            0 :             dLc_der_out = 0.d0
    2261            0 :             dLc_dw_00 = 0.d0
    2262            0 :             dLc_dw_out = 0.d0
    2263              :          else
    2264              : 
    2265            0 :             POM3 = 0.5d0*(s% RSP_w(k) + s% RSP_w(k-1))
    2266              : 
    2267              :             POM = P4*(s% r(k)**2)*(ALFAC/ALFAS)* &
    2268            0 :                0.5d0*(s% T(k)/s% Vol(k) + s% T(k-1)/s% Vol(k-1))
    2269            0 :             Lc_00 = POM*s% PII(k)*POM3
    2270              : 
    2271            0 :             dLc_dw_00 = POM*s% PII(k)*0.5d0  !
    2272            0 :             if (I >= NZN - 1) then
    2273            0 :                dLc_dw_out = 0.d0
    2274              :             else
    2275            0 :                dLc_dw_out = POM*s% PII(k)*0.5d0  !
    2276              :             end if
    2277              : 
    2278            0 :             POM2 = P4*(s% r(k)**2)*s% PII(k)*POM3*0.5d0*(ALFAC/ALFAS)
    2279            0 :             POM = POM*POM3
    2280              : 
    2281              :             dLc_dr_00 = &  !
    2282              :                  POM*dPII_dr_00(I) &
    2283              :                + 2.d0*Lc_00/s% r(k) &
    2284              :                - POM2*(s% T(k)/(s% Vol(k)**2)*dVol_dr_00(I) + &
    2285            0 :                         s% T(k-1)/(s% Vol(k-1)**2)*dVol_dr_in(i+1))
    2286              :             dLc_dr_in = &
    2287              :                  POM*dPII_dr_in(I) &
    2288            0 :                - POM2*s% T(k)/(s% Vol(k)**2)*dVol_dr_in(I)  !
    2289              :             dLc_dr_out = &
    2290              :                  POM*dPII_dr_out(I) &
    2291            0 :                - POM2*s% T(k-1)/(s% Vol(k-1)**2)*dVol_dr_00(i+1)  !
    2292              : 
    2293              :             dLc_dVol_00 = &
    2294              :                  POM*dPII_dVol_00(I) &
    2295            0 :                - POM2*s% T(k)/(s% Vol(k)**2)  !
    2296              :             dLc_dVol_out = &
    2297              :                  POM*dPII_dVol_out(I) &
    2298            0 :                - POM2*s% T(k-1)/(s% Vol(k-1)**2)  !
    2299              : 
    2300            0 :             dLc_dT_00 = POM*dPII_dT_00(I) + POM2/s% Vol(k)  !
    2301            0 :             dLc_dT_out = POM*dPII_dT_out(I) + POM2/s% Vol(k-1)  !
    2302              : 
    2303            0 :             dLc_der_00 = POM*dPII_der_00(I)  !
    2304            0 :             dLc_der_out = POM*dPII_der_out(I)  !
    2305              : 
    2306              :          end if
    2307              : 
    2308            0 :          if (i > 0) s% Lc(k) = Lc_00
    2309              : 
    2310              :          !test_partials = (k-1 == s% solver_test_partials_k)
    2311            0 :          test_partials = .false.
    2312              :          if (test_partials) then
    2313              :             s% solver_test_partials_val = Lc_00
    2314              :             s% solver_test_partials_var = i_var_Vol
    2315              :             s% solver_test_partials_dval_dx = dLc_dVol_out
    2316              :             write(*,*) 'calc_Lc', s% solver_test_partials_var
    2317              :          end if
    2318            0 :       end subroutine calc_Lc
    2319              : 
    2320              :       ! in diffusion limit, radiative flux equation reduces to Fr calculated from d_erad_dm as below.
    2321              :       ! note that can have nonequilibrium diffusion regime with different T for gas and photons.
    2322              :       ! this happens when absorption mean opacity is different than Planck mean opacity.
    2323            0 :       subroutine calc_Fr(s, i, Fr_00, &  !rs Stellingwerf 1975, Appendix A
    2324              :             dFr_dr_out, dFr_dr_00, dFr_dr_in, &
    2325              :             dFr_dVol_out, dFr_dVol_00, &
    2326              :             dFr_dT_out, dFr_dT_00, &
    2327              :             dFr_der_out, dFr_der_00)
    2328              :          type (star_info), pointer :: s
    2329              :          integer, intent(in) :: I
    2330              :          real(dp), intent(out) :: &
    2331              :             Fr_00, dFr_dr_out, dFr_dr_00, dFr_dr_in, &
    2332              :             dFr_dVol_out, dFr_dVol_00, &
    2333              :             dFr_dT_out, dFr_dT_00, &
    2334              :             dFr_der_out, dFr_der_00
    2335              :          real(dp) :: &
    2336            0 :             W_00, d_W_00_dr_in, d_W_00_dr_00, d_W_00_dVol_00, d_W_00_der_00, &
    2337            0 :             W_out, d_W_out_dr_00, d_W_out_dr_out, d_W_out_dVol_out, d_W_out_der_out, &
    2338            0 :             Prad_factor, Fr2a, d_Fr2a_dW_00, d_Fr2a_dW_out, &
    2339            0 :             Fr2b, d_Fr2b_dW_00, d_Fr2b_dW_out, &
    2340            0 :             BW, kap_00, kap_out, BK, Fr1, Fr2, Fr3, &
    2341            0 :             d_Fr_dK_00, d_Fr_dK_out, d_Fr_dW_00, d_Fr_dW_out
    2342              :          integer :: k
    2343              :          logical :: test_partials
    2344              :          include 'formats'
    2345              : 
    2346            0 :          k = NZN+1-i
    2347              : 
    2348            0 :          if (i < 1) then
    2349            0 :             if (s% RSP_hydro_only) then
    2350            0 :                Fr_00 = 0d0
    2351              :             else
    2352            0 :                Fr_00 = s% L_center
    2353              :             end if
    2354            0 :             Fr_00 = Fr_00/(4d0*pi*s% r_center**2)
    2355            0 :             dFr_dr_out = 0
    2356            0 :             dFr_dr_00 = 0
    2357            0 :             dFr_dr_in = 0
    2358            0 :             dFr_dVol_out = 0
    2359            0 :             dFr_dVol_00 = 0
    2360            0 :             dFr_dT_out = 0
    2361            0 :             dFr_dT_00 = 0
    2362            0 :             dFr_der_out = 0
    2363            0 :             dFr_der_00 = 0
    2364            0 :             return
    2365              :          end if
    2366              : 
    2367            0 :          Prad_factor = 3d0/crad  ! 3d0 to cancel the 1/3d0 factor in CL below
    2368            0 :          W_00 = Prad_factor*s% Prad(k)  ! replaces s% T(k)**4
    2369            0 :          d_W_00_dVol_00 = Prad_factor*d_Pr_dVol(i)
    2370            0 :          d_W_00_dr_in = Prad_factor*d_Pr_dr_in(i)
    2371            0 :          d_W_00_dr_00 = Prad_factor*d_Pr_dr_00(i)
    2372            0 :          d_W_00_der_00 = Prad_factor*d_Pr_der(i)
    2373              : 
    2374            0 :          if (k == 1) then  ! surface
    2375            0 :             Fr1 = s% g_Edd*4d0*SIG
    2376            0 :             Fr_00 = Fr1*W_00  ! s% T(k)**4 => W_00
    2377            0 :             dFr_dr_out = 0
    2378            0 :             dFr_dr_in = Fr1*d_W_00_dr_in
    2379            0 :             dFr_dr_00 = Fr1*d_W_00_dr_00
    2380            0 :             dFr_dVol_out = 0
    2381            0 :             dFr_dVol_00 = Fr1*d_W_00_dVol_00
    2382            0 :             dFr_dT_out = 0
    2383            0 :             dFr_dT_00 = 0
    2384            0 :             dFr_der_out = 0
    2385            0 :             dFr_der_00 = Fr1*d_W_00_der_00
    2386            0 :             return
    2387              :          end if
    2388              : 
    2389            0 :          W_out = Prad_factor*s% Prad(k-1)  ! replaces s% T(k-1)**4
    2390            0 :          d_W_out_dVol_out = Prad_factor*d_Pr_dVol(i+1)
    2391            0 :          d_W_out_dr_00 = Prad_factor*d_Pr_dr_in(i+1)
    2392            0 :          d_W_out_dr_out = Prad_factor*d_Pr_dr_00(i+1)
    2393            0 :          d_W_out_der_out = Prad_factor*d_Pr_der(i+1)
    2394              : 
    2395            0 :          BW = log(W_out/W_00)
    2396            0 :          if (abs(BW) < 1d-30) then
    2397            0 :             Fr_00 = 0
    2398            0 :             dFr_dr_out = 0
    2399            0 :             dFr_dr_in = 0
    2400            0 :             dFr_dr_00 = 0
    2401            0 :             dFr_dVol_out = 0
    2402            0 :             dFr_dVol_00 = 0
    2403            0 :             dFr_dT_out = 0
    2404            0 :             dFr_dT_00 = 0
    2405            0 :             dFr_der_out = 0
    2406            0 :             dFr_der_00 = 0
    2407            0 :             return
    2408              :          end if
    2409              : 
    2410            0 :          kap_00 = s% opacity(k)
    2411            0 :          kap_out = s% opacity(k-1)
    2412            0 :          BK = log(kap_out/kap_00)
    2413              : 
    2414            0 :          Fr1 = -CL*s% r(k)**2/(4d0*pi*s% dm_bar(k))   ! CL = 4d0*(4d0*PI)**2*SIG/3d0
    2415              : 
    2416            0 :          Fr2a = W_out/kap_out - W_00/kap_00
    2417            0 :          d_Fr2a_dW_00 = -1d0/kap_00
    2418            0 :          d_Fr2a_dW_out = 1d0/kap_out
    2419              : 
    2420            0 :          Fr2b = 1d0 - BK/BW
    2421            0 :          d_Fr2b_dW_00 = -BK/BW**2/W_00
    2422            0 :          d_Fr2b_dW_out = BK/BW**2/W_out
    2423              : 
    2424            0 :          Fr2 = Fr2a/Fr2b
    2425            0 :          Fr_00 = Fr1*Fr2
    2426            0 :          d_Fr_dW_00 = Fr1*(d_Fr2a_dW_00 - Fr2*d_Fr2b_dW_00)/Fr2b
    2427            0 :          d_Fr_dW_out = Fr1*(d_Fr2a_dW_out - Fr2*d_Fr2b_dW_out)/Fr2b
    2428              : 
    2429            0 :          Fr3 = Fr1/(BW - BK)
    2430            0 :          d_Fr_dK_00 = (Fr3/kap_00)*(W_00*BW/kap_00 - Fr2)
    2431            0 :          d_Fr_dK_out = -(Fr3/kap_out)*(W_out*BW/kap_out - Fr2)
    2432              : 
    2433              :          dFr_dr_in = &  !
    2434              :             + d_Fr_dK_00*dK_dr_in(i) &
    2435            0 :             + d_Fr_dW_00*d_W_00_dr_in
    2436              :          dFr_dr_00 = 2d0*Fr_00/s% r(k) &  !
    2437              :             + d_Fr_dK_00*dK_dr_00(i) &
    2438              :             + d_Fr_dK_out*dK_dr_in(i+1) &
    2439              :             + d_Fr_dW_00*d_W_00_dr_00 &
    2440            0 :             + d_Fr_dW_out*d_W_out_dr_00
    2441              :          dFr_dr_out = &  !
    2442              :             + d_Fr_dK_out*dK_dr_00(i+1) &
    2443            0 :             + d_Fr_dW_out*d_W_out_dr_out
    2444              : 
    2445              :          dFr_dVol_00 = &
    2446              :             + d_Fr_dK_00*dK_dVol(i) &
    2447            0 :             + d_Fr_dW_00*d_W_00_dVol_00
    2448              :          dFr_dVol_out = &
    2449              :             + d_Fr_dK_out*dK_dVol(i+1) &
    2450            0 :             + d_Fr_dW_out*d_W_out_dVol_out
    2451              : 
    2452              :          dFr_dT_out = &  !
    2453            0 :             + d_Fr_dK_out*dK_dT(i+1)
    2454              :          dFr_dT_00 = &  !
    2455            0 :             + d_Fr_dK_00*dK_dT(i)
    2456              : 
    2457              :          dFr_der_out = &  !
    2458            0 :             + d_Fr_dW_out*d_W_out_der_out
    2459              :          dFr_der_00 = &  !
    2460            0 :             + d_Fr_dW_00*d_W_00_der_00
    2461              : 
    2462              :          !test_partials = (k-1 == s% solver_test_partials_k)
    2463            0 :          test_partials = .false.
    2464              :          if (test_partials) then
    2465              :             s% solver_test_partials_val = Fr_00
    2466              :             s% solver_test_partials_var = i_var_Vol
    2467              :             s% solver_test_partials_dval_dx = dFr_dVol_out
    2468              :             write(*,*) 'calc_Fr', s% solver_test_partials_var
    2469              :          end if
    2470              : 
    2471              :          if (call_is_bad) then
    2472              :             if (is_bad(Fr_00)) then
    2473              :    !$omp critical (rsp_step_5)
    2474              :             write(*,2) 'Fr_00', k, Fr_00
    2475              :             write(*,2) 'Fr1', k, Fr1
    2476              :             write(*,2) 'Fr2', k, Fr2
    2477              :             write(*,2) 'Fr2a', k, Fr2a
    2478              :             write(*,2) 'Fr2b', k, Fr2b
    2479              :             write(*,2) 'W_00', k, W_00
    2480              :             write(*,2) 'W_out', k, W_out
    2481              :             write(*,2) 'kap_00', k, kap_00
    2482              :             write(*,2) 'kap_out', k, kap_out
    2483              :             write(*,2) 'r(k)', k, s% r(k)
    2484              :             write(*,2) 'dm_bar(k)', k, s% dm_bar(k)
    2485              :             write(*,2) 'erad(k)', k, s% erad(k)
    2486              :             write(*,2) 'erad(k-1)', k-1, s% erad(k-1)
    2487              :             write(*,2) 'BK', k, BK
    2488              :             write(*,2) 'BW', k, BW
    2489              :             write(*,2) 'nz', s% nz
    2490              :             call mesa_error(__FILE__,__LINE__,'calc_Fr')
    2491              :    !$omp end critical (rsp_step_5)
    2492              :             end if
    2493              :          end if
    2494              : 
    2495              :       end subroutine calc_Fr
    2496              : 
    2497              : 
    2498            0 :       subroutine rsp_calc_XP(s, P_surf, i, with_Prad, &  ! time weighted combined pressure
    2499              :             XP, d_XP_dVol_00, d_XP_dT_00, d_XP_der_00, &
    2500              :             d_XP_dw_00, d_XP_dr_in, d_XP_dr_00)
    2501              :          type (star_info), pointer :: s
    2502              :          real(dp), intent(in) :: P_surf
    2503              :          integer, intent(in) :: i
    2504              :          logical, intent(in) :: with_Prad
    2505              :          real(dp), intent(out) :: &
    2506              :             XP, d_XP_dVol_00, d_XP_dT_00, d_XP_der_00, &
    2507              :             d_XP_dw_00, d_XP_dr_in, d_XP_dr_00
    2508            0 :          real(dp) :: T_surf, Prad_factor
    2509              :          logical :: test_partials
    2510              :          integer :: k
    2511              :          include 'formats'
    2512              : 
    2513            0 :          k = NZN+1-i
    2514            0 :          if (k == 0) then  ! pressure outside of surface
    2515            0 :             if (s% RSP_use_atm_grey_with_kap_for_Psurf) then
    2516            0 :                XP = P_surf
    2517            0 :             else if (s% RSP_use_Prad_for_Psurf) then
    2518            0 :                T_surf = s% T_start(1)
    2519            0 :                XP = crad*T_surf**4/3d0
    2520              :             else
    2521            0 :                XP = 0.0d0
    2522              :             end if
    2523            0 :             d_XP_dVol_00 = 0d0
    2524            0 :             d_XP_dT_00 = 0d0
    2525            0 :             d_XP_der_00 = 0d0
    2526            0 :             d_XP_dw_00 = 0d0
    2527            0 :             d_XP_dr_in = 0d0
    2528            0 :             d_XP_dr_00 = 0d0
    2529              :             return
    2530              :          end if
    2531            0 :          if (with_Prad) then
    2532              :             Prad_factor = 1d0
    2533              :          else
    2534            0 :             Prad_factor = 0d0
    2535              :          end if
    2536              : 
    2537              :          XP = THETA*(s% Pgas(k) + Prad_factor*s% Prad(k)) &
    2538              :             + THETA1*(s% Pgas_start(k) + Prad_factor*s% Prad_start(k)) &
    2539              :             + THETAQ*s% Pvsc(k) + THETAQ1*s% Pvsc_start(k) &
    2540            0 :             + THETAT*s% Ptrb(k) + THETAT1*s% Ptrb_start(k)
    2541              :          d_XP_dVol_00 = &
    2542              :               THETA*(d_Pg_dVol(i) + Prad_factor*d_Pr_dVol(i)) &
    2543              :             + THETAQ*d_Pvsc_dVol(i) &
    2544            0 :             + THETAT*dPtrb_dVol_00(i)
    2545            0 :          d_XP_dT_00 = THETA*d_Pg_dT(i) + THETAQ*d_Pvsc_dT(i)  !
    2546            0 :          d_XP_der_00 = THETA*Prad_factor*d_Pr_der(i)  !
    2547            0 :          d_XP_dw_00 = THETAT*dPtrb_dw_00(i)  !
    2548              :          d_XP_dr_in = &  !
    2549              :               THETA*(d_Pg_dr_in(i) + Prad_factor*d_Pr_dr_in(i)) &
    2550              :             + THETAQ*d_Pvsc_dr_in(i) &
    2551            0 :             + THETAT*dPtrb_dr_in(i)
    2552              :          d_XP_dr_00 = &  !
    2553              :               THETA*(d_Pg_dr_00(i) + Prad_factor*d_Pr_dr_00(i)) &
    2554              :             + THETAQ*d_Pvsc_dr_00(i) &
    2555            0 :             + THETAT*dPtrb_dr_00(i)
    2556              : 
    2557              :          if (call_is_bad) then
    2558              :             if (is_bad(XP)) then
    2559              :    !$omp critical (rsp_step_6)
    2560              :                write(*,2) 'XP', k, XP
    2561              :                write(*,2) 's% Pgas(k)', k, s% Pgas(k)
    2562              :                write(*,2) 's% Prad(k)', k, s% Prad(k)
    2563              :                write(*,2) 's% Pvsc(k)', k, s% Pvsc(k)
    2564              :                write(*,2) 's% Ptrb(k)', k, s% Ptrb(k)
    2565              :                write(*,2) 'THETA', k, THETA
    2566              :                write(*,2) 'THETAQ', k, THETAQ
    2567              :                write(*,2) 'THETAT', k, THETAT
    2568              :                call mesa_error(__FILE__,__LINE__,'rsp_calc_XP')
    2569              :    !$omp end critical (rsp_step_6)
    2570              :             end if
    2571              :          end if
    2572              : 
    2573              :          !test_partials = (k == s% solver_test_partials_k)
    2574            0 :          test_partials = .false.
    2575              : 
    2576              :          if (test_partials) then
    2577              :             s% solver_test_partials_val = XP
    2578              :             s% solver_test_partials_var = i_var_Vol
    2579              :             s% solver_test_partials_dval_dx = d_XP_dVol_00
    2580              :             write(*,*) 'rsp_calc_XP', s% solver_test_partials_var
    2581              :          end if
    2582              :       end subroutine rsp_calc_XP
    2583              : 
    2584              : 
    2585            0 :       subroutine calc_equations(s,i,P_surf)
    2586              :          type (star_info), pointer :: s
    2587              :          integer, intent(in) :: i
    2588              :          real(dp), intent(in) :: P_surf
    2589            0 :          call calc_face_equations(s,i,P_surf)
    2590            0 :          call calc_cell_equations(s,i,P_surf,.true.,.true.,.true.)
    2591            0 :       end subroutine calc_equations
    2592              : 
    2593              : 
    2594            0 :       subroutine calc_face_equations(s,i,P_surf)
    2595              :          type (star_info), pointer :: s
    2596              :          integer, intent(in) :: i
    2597              :          real(dp), intent(in) :: P_surf
    2598            0 :          call acceleration_eqn(s,i,P_surf)
    2599            0 :          call Fr_eqn(s,i)
    2600            0 :       end subroutine calc_face_equations
    2601              : 
    2602              : 
    2603            0 :       subroutine calc_cell_equations( &
    2604              :             s, i, P_surf, do_etot, do_eturb, do_erad)
    2605              :          type (star_info), pointer :: s
    2606              :          integer, intent(in) :: i
    2607              :          real(dp), intent(in) :: P_surf
    2608              :          logical, intent(in) :: do_etot, do_eturb, do_erad
    2609              :          integer :: k
    2610              :          real(dp) :: &
    2611            0 :             Lt_00, Lt_00_start, Lt_in, Lt_in_start, &
    2612            0 :             dLt_00_dr_00, dLt_00_dr_in, dLt_00_dr_out, &
    2613            0 :             dLt_00_dVol_00, dLt_00_dVol_out, &
    2614            0 :             dLt_00_dT_00, dLt_00_dT_out, &
    2615            0 :             dLt_00_der_00, dLt_00_der_out, &
    2616            0 :             dLt_00_dw_00, dLt_00_dw_out, &
    2617            0 :             dLt_in_dr_in, dLt_in_dr_in2, dLt_in_dr_00, &
    2618            0 :             dLt_in_dVol_in, dLt_in_dVol_00, &
    2619            0 :             dLt_in_dT_in, dLt_in_dT_00, &
    2620            0 :             dLt_in_der_in, dLt_in_der_00, &
    2621            0 :             dLt_in_dw_in, dLt_in_dw_00
    2622              : 
    2623              :          include 'formats'
    2624              : 
    2625              :          ! HR = -residual
    2626              :          ! partials of residual go in HD
    2627              : 
    2628            0 :          k = NZN+1-i
    2629              : 
    2630            0 :          call get_Lt
    2631              : 
    2632            0 :          if (do_etot) call total_energy_eqn(s, i, P_surf, &
    2633              :             Lt_00, Lt_00_start, Lt_in, Lt_in_start, &
    2634              :             dLt_00_dr_00, dLt_00_dr_in, dLt_00_dr_out, &
    2635              :             dLt_00_dVol_00, dLt_00_dVol_out, &
    2636              :             dLt_00_dT_00, dLt_00_dT_out, &
    2637              :             dLt_00_der_00, dLt_00_der_out, &
    2638              :             dLt_00_dw_00, dLt_00_dw_out, &
    2639              :             dLt_in_dr_in, dLt_in_dr_in2, dLt_in_dr_00, &
    2640              :             dLt_in_dVol_in, dLt_in_dVol_00, &
    2641              :             dLt_in_dT_in, dLt_in_dT_00, &
    2642              :             dLt_in_der_in, dLt_in_der_00, &
    2643            0 :             dLt_in_dw_in, dLt_in_dw_00)
    2644              : 
    2645            0 :          if (do_eturb) call turbulent_energy_eqn(s, i, &
    2646              :             Lt_00, Lt_00_start, Lt_in, Lt_in_start, &
    2647              :             dLt_00_dr_00, dLt_00_dr_in, dLt_00_dr_out, &
    2648              :             dLt_00_dVol_00, dLt_00_dVol_out, &
    2649              :             dLt_00_dT_00, dLt_00_dT_out, &
    2650              :             dLt_00_der_00, dLt_00_der_out, &
    2651              :             dLt_00_dw_00, dLt_00_dw_out, &
    2652              :             dLt_in_dr_in, dLt_in_dr_in2, dLt_in_dr_00, &
    2653              :             dLt_in_dVol_in, dLt_in_dVol_00, &
    2654              :             dLt_in_dT_in, dLt_in_dT_00, &
    2655              :             dLt_in_der_in, dLt_in_der_00, &
    2656            0 :             dLt_in_dw_in, dLt_in_dw_00)
    2657              : 
    2658            0 :          if (do_erad) call erad_eqn(s,i)
    2659              : 
    2660            0 :          if (I == 1) call inner_boundary_eqn
    2661              : 
    2662              :          contains
    2663              : 
    2664            0 :          subroutine inner_boundary_eqn
    2665            0 :             HR(1) = 0.d0
    2666            0 :             HD(1:LD_HD,1) = 0.d0
    2667            0 :             HD(i_r_dr_00,1) = 1.d0
    2668            0 :          end subroutine inner_boundary_eqn
    2669              : 
    2670            0 :          subroutine get_Lt
    2671              :             integer :: k
    2672            0 :             k = NZN+1-i
    2673              :             call calc_Lt(s,i - 1,Lt_in, &
    2674              :                dLt_in_dr_in, dLt_in_dr_in2, dLt_in_dr_00, &
    2675              :                dLt_in_dVol_in, dLt_in_dVol_00, &
    2676              :                dLt_in_dT_in, dLt_in_dT_00, &
    2677              :                dLt_in_der_in, dLt_in_der_00, &
    2678            0 :                dLt_in_dw_in, dLt_in_dw_00)
    2679              :             call calc_Lt(s,i,Lt_00, &
    2680              :                dLt_00_dr_00, dLt_00_dr_in, dLt_00_dr_out, &
    2681              :                dLt_00_dVol_00, dLt_00_dVol_out, &
    2682              :                dLt_00_dT_00, dLt_00_dT_out, &
    2683              :                dLt_00_der_00, dLt_00_der_out, &
    2684              :                dLt_00_dw_00, dLt_00_dw_out)
    2685            0 :             if (I == NZN) then
    2686            0 :                Lt_00_start = 0.d0
    2687              :             else
    2688            0 :                Lt_00_start = s% Lt_start(k)
    2689              :             end if
    2690            0 :             if (i == 1) then
    2691            0 :                Lt_in_start = 0
    2692              :             else
    2693            0 :                Lt_in_start = s% Lt_start(k+1)
    2694              :             end if
    2695            0 :          end subroutine get_Lt
    2696              : 
    2697              :       end subroutine calc_cell_equations
    2698              : 
    2699              : 
    2700            0 :       subroutine acceleration_eqn(s, i, P_surf)
    2701              :          type (star_info), pointer :: s
    2702              :          integer, intent(in) :: i
    2703              :          real(dp), intent(in) :: P_surf
    2704              :          integer :: IR, k
    2705            0 :          real(dp) :: dt, dm_bar, residual, area, d_area_dr_00, &
    2706            0 :             grav, dXP_dm, Uq1, A_dm, R_00, dv_dr, dvdt_factor, &
    2707            0 :             XP_00, dXP_00_dVol_00, dXP_00_dT_00, dXP_00_der_00, &
    2708            0 :             dXP_00_dw_00, dXP_00_dr_in, dXP_00_dr_00, &
    2709            0 :             XP_out, dXP_out_dVol_out, dXP_out_dT_out, dXP_out_der_out, &
    2710              :             dXP_out_dw_out, dXP_out_dr_00, dXP_out_dr_out, &
    2711            0 :             Chi_00, Chi_out, d_Chi_out_dVol_00, &
    2712            0 :             d_Chi_out_dr_in, d_Chi_out_dr_00, d_Chi_out_dr_out, d_Chi_out_dr_out2, &
    2713            0 :             d_Chi_out_dT_00, d_Chi_out_dT_out, d_Chi_out_dT_out2, &
    2714            0 :             d_Chi_out_der_00, d_Chi_out_der_out, d_Chi_out_der_out2, &
    2715            0 :             d_Chi_out_dw_out, &
    2716            0 :             d_Chi_00_dr_in2, d_Chi_00_dr_in, d_Chi_00_dr_00, d_Chi_00_dr_out, &
    2717            0 :             d_Chi_00_dT_in, d_Chi_00_dT_00, d_Chi_00_dT_out, &
    2718            0 :             d_Chi_00_der_in, d_Chi_00_der_00, d_Chi_00_der_out, &
    2719            0 :             d_Chi_00_dw_00, d_Chi_00_dVol_00, &
    2720            0 :             d_Uq1_dr_00, d_Uq_dVol_00, d_Uq_dr_in2, d_Uq_dw_00, d_Uq_dw_out, &
    2721            0 :             d_Uq_dT_in, d_Uq_dT_00, d_Uq_dT_out, d_Uq_dT_out2, &
    2722            0 :             d_Uq_der_in, d_Uq_der_00, d_Uq_der_out, d_Uq_der_out2, &
    2723            0 :             d_Uq_dr_in, d_Uq_dr_00, d_Uq_dr_out, d_Uq_dr_out2, &
    2724            0 :             kap_face, d_kap_dVol_00, d_kap_dT_00, d_kap_dT_out, &
    2725            0 :             d_kap_dr_in, d_kap_dr_00, d_kap_dr_out, &
    2726            0 :             Fr_tw, Fr_term, d_Fr_term_dFr_00, d_Fr_term_dVol_00, d_Fr_term_dT_00, d_Fr_term_dT_out, &
    2727            0 :             d_Fr_term_dr_in, d_Fr_term_dr_00, d_Fr_term_dr_out
    2728              :          logical :: test_partials, use_Prad
    2729              : 
    2730              :          include 'formats'
    2731              : 
    2732            0 :          use_Prad = .true.  ! s% RSP_accel_eqn_use_Prad_instead_of_Fr_term
    2733              : 
    2734            0 :          dvdt_factor = 1d0
    2735              : 
    2736            0 :          k = NZN+1-i
    2737            0 :          IR = i_var_R + NV*(i-1)
    2738            0 :          HD(1:LD_HD,IR) = 0.d0
    2739              : 
    2740            0 :          dt = s% dt
    2741              :          !if (s% use_compression_outer_BC .and. I == NZN) then
    2742              :          !   call mesa_error(__FILE__,__LINE__,'no rsp support for use_compression_outer_BC')
    2743              :          !end if
    2744              : 
    2745              :          ! XP doesn't include Prad for acceleration equation
    2746              :          ! instead introduce term using Fr
    2747              : 
    2748              :          call rsp_calc_XP(s, P_surf, i+1, use_Prad, &
    2749              :             XP_out, dXP_out_dVol_out, dXP_out_dT_out, dXP_out_der_out, &
    2750            0 :             dXP_out_dw_out, dXP_out_dr_00, dXP_out_dr_out)
    2751              : 
    2752              :          call rsp_calc_XP(s, P_surf, i, use_Prad, &
    2753              :             XP_00, dXP_00_dVol_00, dXP_00_dT_00, dXP_00_der_00, &
    2754            0 :             dXP_00_dw_00, dXP_00_dr_in, dXP_00_dr_00)
    2755              : 
    2756            0 :          area = P43*(s% r(k)**2 + s% r(k)*s% r_start(k) + s% r_start(k)**2)
    2757            0 :          d_area_dr_00 = P43*(2d0*s% r(k) + s% r_start(k))
    2758            0 :          dm_bar = s% dm_bar(k)
    2759            0 :          A_dm = area/dm_bar
    2760            0 :          dv_dr = 2d0/dt
    2761            0 :          dXP_dm = (XP_out - XP_00)/dm_bar
    2762            0 :          grav = - s% cgrav(k)*s% m(k)/(s% r(k)*s% r_start(k))
    2763              : 
    2764            0 :          R_00 = 0.5d0*(s% r(k) + s% r_start(k))
    2765            0 :          Uq1 = P4/(dm_bar*R_00)
    2766            0 :          d_Uq1_dr_00 = -Uq1*0.5d0/R_00
    2767              : 
    2768            0 :          Chi_00 = THETAU*s% Chi(k) + THETAU1*s% Chi_start(k)
    2769            0 :          d_Chi_00_dVol_00 = THETAU*dChi_dVol_00(i)
    2770            0 :          d_Chi_00_dT_in = THETAU*dChi_dT_in(i)
    2771            0 :          d_Chi_00_dT_00 = THETAU*dChi_dT_00(i)
    2772            0 :          d_Chi_00_dT_out = THETAU*dChi_dT_out(i)
    2773            0 :          d_Chi_00_der_in = THETAU*dChi_der_in(i)
    2774            0 :          d_Chi_00_der_00 = THETAU*dChi_der_00(i)
    2775            0 :          d_Chi_00_der_out = THETAU*dChi_der_out(i)
    2776            0 :          d_Chi_00_dw_00 = THETAU*dChi_dw_00(i)
    2777            0 :          d_Chi_00_dr_in2 = THETAU*dChi_dr_in2(i)
    2778            0 :          d_Chi_00_dr_in = THETAU*dChi_dr_in(i)
    2779            0 :          d_Chi_00_dr_00 = THETAU*dChi_dr_00(i)
    2780            0 :          d_Chi_00_dr_out = THETAU*dChi_dr_out(i)
    2781            0 :          if (I == NZN) then
    2782            0 :             Chi_out = 0d0
    2783            0 :             d_Chi_out_dVol_00 = 0d0
    2784            0 :             d_Chi_out_dT_00 = 0d0
    2785            0 :             d_Chi_out_dT_out = 0d0
    2786            0 :             d_Chi_out_dT_out2 = 0d0
    2787            0 :             d_Chi_out_der_00 = 0d0
    2788            0 :             d_Chi_out_der_out = 0d0
    2789            0 :             d_Chi_out_der_out2 = 0d0
    2790            0 :             d_Chi_out_dw_out = 0d0
    2791            0 :             d_Chi_out_dr_in = 0d0
    2792            0 :             d_Chi_out_dr_00 = 0d0
    2793            0 :             d_Chi_out_dr_out = 0d0
    2794            0 :             d_Chi_out_dr_out2 = 0d0
    2795              :          else
    2796            0 :             Chi_out = THETAU*s% Chi(k-1) + THETAU1*s% Chi_start(k-1)
    2797            0 :             d_Chi_out_dVol_00 = THETAU*dChi_dVol_in(i+1)
    2798            0 :             d_Chi_out_dT_00 = THETAU*dChi_dT_in(i+1)
    2799            0 :             d_Chi_out_dT_out = THETAU*dChi_dT_00(i+1)
    2800            0 :             d_Chi_out_dT_out2 = THETAU*dChi_dT_out(i+1)
    2801            0 :             d_Chi_out_der_00 = THETAU*dChi_der_in(i+1)
    2802            0 :             d_Chi_out_der_out = THETAU*dChi_der_00(i+1)
    2803            0 :             d_Chi_out_der_out2 = THETAU*dChi_der_out(i+1)
    2804            0 :             d_Chi_out_dw_out = THETAU*dChi_dw_00(i+1)
    2805            0 :             d_Chi_out_dr_in = THETAU*dChi_dr_in2(i+1)
    2806            0 :             d_Chi_out_dr_00 = THETAU*dChi_dr_in(i+1)
    2807            0 :             d_Chi_out_dr_out = THETAU*dChi_dr_00(i+1)
    2808            0 :             d_Chi_out_dr_out2 = THETAU*dChi_dr_out(i+1)
    2809              :          end if
    2810              : 
    2811            0 :          s% Uq(k) = Uq1*(Chi_out - Chi_00)
    2812            0 :          d_Uq_dVol_00 = Uq1*(d_Chi_out_dVol_00 - d_Chi_00_dVol_00)
    2813            0 :          d_Uq_dT_in = -Uq1*d_Chi_00_dT_in
    2814            0 :          d_Uq_dT_00 = Uq1*(d_Chi_out_dT_00 - d_Chi_00_dT_00)
    2815            0 :          d_Uq_dT_out = Uq1*(d_Chi_out_dT_out - d_Chi_00_dT_out)
    2816            0 :          d_Uq_dT_out2 = Uq1*d_Chi_out_dT_out2
    2817            0 :          d_Uq_der_in = -Uq1*d_Chi_00_der_in
    2818            0 :          d_Uq_der_00 = Uq1*(d_Chi_out_der_00 - d_Chi_00_der_00)
    2819            0 :          d_Uq_der_out = Uq1*(d_Chi_out_der_out - d_Chi_00_der_out)
    2820            0 :          d_Uq_der_out2 = Uq1*d_Chi_out_der_out2
    2821            0 :          d_Uq_dw_00 = -Uq1*d_Chi_00_dw_00
    2822            0 :          d_Uq_dw_out = Uq1*d_Chi_out_dw_out
    2823            0 :          d_Uq_dr_in2 = -Uq1*d_Chi_00_dr_in2
    2824            0 :          d_Uq_dr_in = Uq1*(d_Chi_out_dr_in - d_Chi_00_dr_in)
    2825              :          d_Uq_dr_00 = &
    2826              :               Uq1*(d_Chi_out_dr_00 - d_Chi_00_dr_00) &
    2827            0 :             + d_Uq1_dr_00*(Chi_out - Chi_00)
    2828            0 :          d_Uq_dr_out = Uq1*(d_Chi_out_dr_out - d_Chi_00_dr_out)
    2829            0 :          d_Uq_dr_out2 = Uq1*d_Chi_out_dr_out2
    2830              : 
    2831              :          if (use_Prad) then
    2832            0 :             Fr_term = 0
    2833            0 :             d_Fr_term_dFr_00 = 0
    2834            0 :             d_Fr_term_dVol_00 = 0
    2835            0 :             d_Fr_term_dT_00 = 0
    2836            0 :             d_Fr_term_dT_out = 0
    2837            0 :             d_Fr_term_dr_in = 0
    2838              :             d_Fr_term_dr_00 = 0
    2839              :             d_Fr_term_dr_out = 0
    2840              :          else  ! include radiative force, Fr*kap_face/clight
    2841              :             if (k == 1) then
    2842              :                kap_face = s% opacity(k)
    2843              :                d_kap_dVol_00 = dK_dVol(i)
    2844              :                d_kap_dT_00 = dK_dT(i)
    2845              :                d_kap_dT_out = 0d0
    2846              :                d_kap_dr_in = dK_dr_in(i)
    2847              :                d_kap_dr_00 = dK_dr_00(i)
    2848              :                d_kap_dr_out = 0d0
    2849              :             else
    2850              :                kap_face = 0.5d0*(s% opacity(k) + s% opacity(k-1))
    2851              :                d_kap_dVol_00 = 0.5d0*dK_dVol(i)
    2852              :                d_kap_dT_00 = 0.5d0*dK_dT(i)
    2853              :                d_kap_dT_out = 0.5d0*dK_dT(i+1)
    2854              :                d_kap_dr_in = 0.5d0*dK_dr_in(i)
    2855              :                d_kap_dr_00 = 0.5d0*(dK_dr_00(i) + dK_dr_in(i+1))
    2856              :                d_kap_dr_out = 0.5d0*dK_dr_00(i+1)
    2857              :             end if
    2858              :             Fr_tw = WTR*s% Fr(k) + WTR1*s% Fr_start(k)
    2859              :             Fr_term = Fr_tw*kap_face/clight
    2860              :             d_Fr_term_dFr_00 = WTR*kap_face/clight
    2861              :             d_Fr_term_dVol_00 = Fr_term*d_kap_dVol_00/kap_face
    2862              :             d_Fr_term_dT_00 = Fr_term*d_kap_dT_00/kap_face
    2863              :             d_Fr_term_dT_out = Fr_term*d_kap_dT_out/kap_face
    2864              :             d_Fr_term_dr_in = Fr_term*d_kap_dr_in/kap_face
    2865              :             d_Fr_term_dr_00 = Fr_term*d_kap_dr_00/kap_face
    2866              :             d_Fr_term_dr_out = Fr_term*d_kap_dr_out/kap_face
    2867              :          end if
    2868              : 
    2869              :          residual = &
    2870              :             dvdt_factor*(s% v(k) - s% v_start(k))/dt &
    2871            0 :            + area*dXP_dm - grav - s% Uq(k) - Fr_term
    2872            0 :          HR(IR) = -residual
    2873              : 
    2874              :          !s% xtra1_array(k) = s% Pgas(k) + s% Prad(k)
    2875              :          !s% xtra2_array(k) = s% Vol(k)
    2876              :          !s% xtra3_array(k) = s% T(k)
    2877              :          !s% xtra4_array(k) = s% v(k)
    2878              :          !s% xtra5_array(k) = s% RSP_w(k)**2
    2879              :          !s% xtra6_array(k) = s% r(k)
    2880              : 
    2881            0 :          HD(i_r_dFr_00,IR) = - d_Fr_term_dFr_00
    2882              : 
    2883              :          HD(i_r_dT_in,IR) = &
    2884            0 :             - d_Uq_dT_in
    2885              :          HD(i_r_dT_00,IR) = &
    2886              :             + A_dm*(-dXP_00_dT_00) &
    2887              :             - d_Uq_dT_00 &
    2888            0 :             - d_Fr_term_dT_00
    2889              :          HD(i_r_dT_out,IR) = &
    2890              :             + A_dm*dXP_out_dT_out &
    2891              :             - d_Uq_dT_out &
    2892            0 :             - d_Fr_term_dT_out
    2893              :          HD(i_r_dT_out2,IR) = &
    2894            0 :             - d_Uq_dT_out2
    2895              : 
    2896            0 :          HD(i_r_dr_in2,IR) = - d_Uq_dr_in2
    2897              :          HD(i_r_dr_in,IR) = &  !
    2898              :             + A_dm*(-dXP_00_dr_in) &
    2899              :             - d_Uq_dr_in &
    2900            0 :             - d_Fr_term_dr_in
    2901              :          HD(i_r_dr_00,IR) = &
    2902              :             dvdt_factor*dv_dr/dt &
    2903              :             + d_area_dr_00*dXP_dm &
    2904              :             + A_dm*(dXP_out_dr_00 - dXP_00_dr_00) &
    2905              :             + grav/s% r(k) &
    2906              :             - d_Uq_dr_00 &
    2907            0 :             - d_Fr_term_dr_00
    2908              :          HD(i_r_dr_00,IR) = &
    2909            0 :             HD(i_r_dr_00,IR) + 0.5d0*Uq1/R_00*(Chi_out - Chi_00)
    2910              :          HD(i_r_dr_out,IR) = &
    2911              :             + A_dm*dXP_out_dr_out &
    2912              :             - d_Uq_dr_out &
    2913            0 :             - d_Fr_term_dr_out
    2914              :          HD(i_r_dr_out2,IR) = &  !
    2915            0 :             - d_Uq_dr_out2
    2916              : 
    2917              :          HD(i_r_der_in,IR) = &
    2918            0 :             - d_Uq_der_in
    2919              :          HD(i_r_der_00,IR) = &
    2920              :             + A_dm*(-dXP_00_der_00) &
    2921            0 :             - d_Uq_der_00
    2922              :          HD(i_r_der_out,IR) = &
    2923              :             + A_dm*dXP_out_der_out &
    2924            0 :             - d_Uq_der_out
    2925              :          HD(i_r_der_out2,IR) = &
    2926            0 :             - d_Uq_der_out2
    2927              : 
    2928            0 :          HD(i_r_dw_in,IR) = 0.d0
    2929            0 :          if (I <= IBOTOM .or. I == NZN) then
    2930            0 :             HD(i_r_dw_00,IR) = 0.d0
    2931              :          else
    2932              :             HD(i_r_dw_00,IR) = &
    2933              :                + A_dm*(-dXP_00_dw_00) &
    2934            0 :                - d_Uq_dw_00
    2935              :          end if
    2936            0 :          if (I <= IBOTOM - 1 .or. I >= NZN - 1) then
    2937            0 :             HD(i_r_dw_out,IR) = 0.d0
    2938              :          else
    2939              :             HD(i_r_dw_out,IR) = &
    2940              :                + A_dm*dXP_out_dw_out &
    2941            0 :                - d_Uq_dw_out
    2942              :          end if
    2943            0 :          HD(i_r_dw_out2,IR) = 0.0d0
    2944              : 
    2945              :          !call check_is_bad
    2946              : 
    2947              : 
    2948              :          !HD(i_r_dr_in2,IR) !
    2949              :          !HD(i_r_dr_in,IR) ! ok
    2950              :          !HD(i_r_dr_00,IR) !  ok
    2951              :          !HD(i_r_dr_out,IR) ! ok
    2952              :          !HD(i_r_dr_out2,IR) !
    2953              : 
    2954              :          !HD(i_r_dT_in,IR) ! 0
    2955              :          !HD(i_r_dT_00,IR) ! ok
    2956              :          !HD(i_r_dT_out,IR) ! need 1d-3 like for er
    2957              :          !HD(i_r_dT_out2,IR) ! 0
    2958              : 
    2959              :          ! NOTE: may need solver_test_partials_dx_0 = 1d-3 for er
    2960              :          !HD(i_r_der_in,IR) !
    2961              :          !HD(i_r_der_00,IR) ! 0
    2962              :          !HD(i_r_der_out,IR) ! 0
    2963              :          !HD(i_r_der_out2,IR) !
    2964              : 
    2965              :          !HD(i_r_dw_00,IR) !
    2966              :          !HD(i_r_dw_out,IR) !
    2967              : 
    2968              :          !test_partials = (k == s% solver_test_partials_k)
    2969            0 :          test_partials = .false.
    2970              : 
    2971            0 :          if (test_partials) then
    2972              :             s% solver_test_partials_val = residual
    2973              :             s% solver_test_partials_var = i_var_r
    2974              :             s% solver_test_partials_dval_dx = i_r_dr_00
    2975              :             write(*,*) 'acceleration_eqn', s% solver_test_partials_var
    2976              :          end if
    2977              : 
    2978              :          contains
    2979              : 
    2980              :          subroutine check_is_bad
    2981              :             include 'formats'
    2982              :             if (is_bad(residual)) then
    2983              :             !$omp critical (rsp_step_7)
    2984              :                write(*,2) 'residual', k, residual
    2985              :                write(*,2) 's% v(k)', k, s% v(k)
    2986              :                write(*,2) 's% v_start(k)', k, s% v_start(k)
    2987              :                write(*,2) 'area', k, area
    2988              :                write(*,2) 'dXP_dm', k, dXP_dm
    2989              :                write(*,2) 'XP_out', k, XP_out
    2990              :                write(*,2) 'XP_00', k, XP_00
    2991              :                write(*,2) 's% dm_bar(k)', k, s% dm_bar(k)
    2992              :                write(*,2) 'grav', k, grav
    2993              :                write(*,2) 's% Uq(k)', k, s% Uq(k)
    2994              :                write(*,2) 'Fr_term', k, Fr_term
    2995              :                write(*,2) 'dt', k, dt
    2996              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    2997              :             !$omp end critical (rsp_step_7)
    2998              :             end if
    2999              : 
    3000              :             if (is_bad(HD(i_r_dr_in2,IR))) then
    3001              :             !$omp critical (rsp_step_8)
    3002              :                write(*,2) 'HD(i_r_dr_in2,IR)', k, HD(i_r_dr_in2,IR)
    3003              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3004              :             !$omp end critical (rsp_step_8)
    3005              :             end if
    3006              : 
    3007              :             if (is_bad(HD(i_r_dr_in,IR))) then
    3008              :             !$omp critical (rsp_step_9)
    3009              :                write(*,2) 'HD(i_r_dr_in,IR)', k, HD(i_r_dr_in,IR)
    3010              :                write(*,2) 'dXP_00_dr_in', k, dXP_00_dr_in
    3011              :                write(*,2) 'd_Uq_dr_in', k, d_Uq_dr_in
    3012              :                write(*,2) 'd_Fr_term_dr_in', k, d_Fr_term_dr_in
    3013              :                write(*,2) 'd_Chi_out_dr_in', k, d_Chi_out_dr_in
    3014              :                write(*,2) 'd_Chi_00_dr_in', k, d_Chi_00_dr_in
    3015              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3016              :             !$omp end critical (rsp_step_9)
    3017              :             end if
    3018              : 
    3019              :             if (is_bad(HD(i_r_dr_00,IR))) then
    3020              :             !$omp critical (rsp_step_10)
    3021              :                write(*,2) 'HD(i_r_dr_00,IR)', k, HD(i_r_dr_00,IR)
    3022              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3023              :             !$omp end critical (rsp_step_10)
    3024              :             end if
    3025              : 
    3026              :             if (is_bad(HD(i_r_dr_out,IR))) then
    3027              :             !$omp critical (rsp_step_11)
    3028              :                write(*,2) 'HD(i_r_dr_out,IR)', k, HD(i_r_dr_out,IR)
    3029              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3030              :             !$omp end critical (rsp_step_11)
    3031              :             end if
    3032              : 
    3033              :             if (is_bad(HD(i_r_dr_out2,IR))) then
    3034              :             !$omp critical (rsp_step_12)
    3035              :                write(*,2) 'HD(i_r_dr_out2,IR)', k, HD(i_r_dr_out2,IR)
    3036              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3037              :             !$omp end critical (rsp_step_12)
    3038              :             end if
    3039              : 
    3040              :             if (is_bad(HD(i_r_dT_in,IR))) then
    3041              :             !$omp critical (rsp_step_13)
    3042              :                write(*,2) 'HD(i_r_dT_in,IR)', k, HD(i_r_dT_in,IR)
    3043              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3044              :             !$omp end critical (rsp_step_13)
    3045              :             end if
    3046              : 
    3047              :             if (is_bad(HD(i_r_dT_00,IR))) then
    3048              :             !$omp critical (rsp_step_14)
    3049              :                write(*,2) 'HD(i_r_dT_00,IR)', k, HD(i_r_dT_00,IR)
    3050              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3051              :             !$omp end critical (rsp_step_14)
    3052              :             end if
    3053              : 
    3054              :             if (is_bad(HD(i_r_dT_out,IR))) then
    3055              :             !$omp critical (rsp_step_15)
    3056              :                write(*,2) 'HD(i_r_dT_out,IR)', k, HD(i_r_dT_out,IR)
    3057              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3058              :             !$omp end critical (rsp_step_15)
    3059              :             end if
    3060              : 
    3061              :             if (is_bad(HD(i_r_dT_out2,IR))) then
    3062              :             !$omp critical (rsp_step_16)
    3063              :                write(*,2) 'HD(i_r_dT_out2,IR)', k, HD(i_r_dT_out2,IR)
    3064              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3065              :             !$omp end critical (rsp_step_16)
    3066              :             end if
    3067              : 
    3068              :             if (is_bad(HD(i_r_der_in,IR))) then
    3069              :             !$omp critical (rsp_step_17)
    3070              :                write(*,2) 'HD(i_r_der_in,IR)', k, HD(i_r_der_in,IR)
    3071              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3072              :             !$omp end critical (rsp_step_17)
    3073              :             end if
    3074              : 
    3075              :             if (is_bad(HD(i_r_der_00,IR))) then
    3076              :             !$omp critical (rsp_step_18)
    3077              :                write(*,2) 'HD(i_r_der_00,IR)', k, HD(i_r_der_00,IR)
    3078              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3079              :             !$omp end critical (rsp_step_18)
    3080              :             end if
    3081              : 
    3082              :             if (is_bad(HD(i_r_der_out,IR))) then
    3083              :             !$omp critical (rsp_step_19)
    3084              :                write(*,2) 'HD(i_r_der_out,IR)', k, HD(i_r_der_out,IR)
    3085              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3086              :             !$omp end critical (rsp_step_19)
    3087              :             end if
    3088              : 
    3089              :             if (is_bad(HD(i_r_der_out2,IR))) then
    3090              :             !$omp critical (rsp_step_20)
    3091              :                write(*,2) 'HD(i_r_der_out2,IR)', k, HD(i_r_der_out2,IR)
    3092              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3093              :             !$omp end critical (rsp_step_20)
    3094              :             end if
    3095              : 
    3096              :             if (is_bad(HD(i_r_dw_00,IR))) then
    3097              :             !$omp critical (rsp_step_21)
    3098              :                write(*,2) 'HD(i_r_dw_00,IR)', k, HD(i_r_dw_00,IR)
    3099              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3100              :             !$omp end critical (rsp_step_21)
    3101              :             end if
    3102              : 
    3103              :             if (is_bad(HD(i_r_dw_out,IR))) then
    3104              :             !$omp critical (rsp_step_22)
    3105              :                write(*,2) 'HD(i_r_dw_out,IR)', k, HD(i_r_dw_out,IR)
    3106              :                call mesa_error(__FILE__,__LINE__,'acceleration_eqn')
    3107              :             !$omp end critical (rsp_step_22)
    3108              :             end if
    3109              :          end subroutine check_is_bad
    3110              : 
    3111              :       end subroutine acceleration_eqn
    3112              : 
    3113              : 
    3114            0 :       subroutine total_energy_eqn(s, i, P_surf, &
    3115              :             Lt_00, Lt_00_start, Lt_in, Lt_in_start, &
    3116              :             dLt_00_dr_00, dLt_00_dr_in, dLt_00_dr_out, &
    3117              :             dLt_00_dVol_00, dLt_00_dVol_out, &
    3118              :             dLt_00_dT_00, dLt_00_dT_out, &
    3119              :             dLt_00_der_00, dLt_00_der_out, &
    3120              :             dLt_00_dw_00, dLt_00_dw_out, &
    3121              :             dLt_in_dr_in, dLt_in_dr_in2, dLt_in_dr_00, &
    3122              :             dLt_in_dVol_in, dLt_in_dVol_00, &
    3123              :             dLt_in_dT_in, dLt_in_dT_00, &
    3124              :             dLt_in_der_in, dLt_in_der_00, &
    3125              :             dLt_in_dw_in, dLt_in_dw_00)
    3126              :          type (star_info), pointer :: s
    3127              :          integer, intent(in) :: i
    3128              :          real(dp), intent(in) :: P_surf, &
    3129              :             Lt_00, Lt_00_start, Lt_in, Lt_in_start, &
    3130              :             dLt_00_dr_00, dLt_00_dr_in, dLt_00_dr_out, &
    3131              :             dLt_00_dVol_00, dLt_00_dVol_out, &
    3132              :             dLt_00_dT_00, dLt_00_dT_out, &
    3133              :             dLt_00_der_00, dLt_00_der_out, &
    3134              :             dLt_00_dw_00, dLt_00_dw_out, &
    3135              :             dLt_in_dr_in, dLt_in_dr_in2, dLt_in_dr_00, &
    3136              :             dLt_in_dVol_in, dLt_in_dVol_00, &
    3137              :             dLt_in_dT_in, dLt_in_dT_00, &
    3138              :             dLt_in_der_in, dLt_in_der_00, &
    3139              :             dLt_in_dw_in, dLt_in_dw_00
    3140              :          integer :: IT, k
    3141            0 :          real(dp) :: dt, dm, residual, erad, erad_tw, DV, dt_div_dm, &
    3142            0 :             area_00, area_00_start, area_in, area_in_start, &
    3143            0 :             L_00, Lr_00, Lr_00_start, d_Lr_00_dFr_00, d_Lr_00_dr_00, &
    3144            0 :             L_in, Lr_in, Lr_in_start, d_Lr_in_dFr_in, d_Lr_in_dr_in, &
    3145            0 :             Lc_00, Lc_00_start, Lc_in, Lc_in_start, &
    3146              :             dLc_in_dr_in, dLc_in_dr_in2, dLc_in_dr_00, &
    3147              :             dLc_in_dVol_in, dLc_in_dVol_00, &
    3148              :             dLc_in_dT_in, dLc_in_dT_00, &
    3149              :             dLc_in_der_in, dLc_in_der_00, &
    3150              :             dLc_in_dw_in, dLc_in_dw_00, &
    3151              :             dLc_00_dr_00, dLc_00_dr_in, dLc_00_dr_out, &
    3152              :             dLc_00_dVol_00, dLc_00_dVol_out, &
    3153              :             dLc_00_dT_00, dLc_00_dT_out, &
    3154              :             dLc_00_der_00, dLc_00_der_out, &
    3155              :             dLc_00_dw_00, dLc_00_dw_out, &
    3156              :             XP_00, dXP_00_dr_00, dXP_00_dr_in, &
    3157              :             dXP_00_dVol_00, dXP_00_dT_00, dXP_00_der_00, dXP_00_dw_00, &
    3158            0 :             u_div_r, d_u_div_r_dr_00, d_u_div_r_dr_in, u_div_r_factor
    3159              :          logical :: test_partials
    3160              : 
    3161              :          include 'formats'
    3162              : 
    3163            0 :          k = NZN+1-i
    3164              : 
    3165            0 :          IT = i_var_T + NV*(i-1)
    3166            0 :          HD(1:LD_HD,IT) = 0.d0
    3167              : 
    3168              :          call calc_Lc(s, i-1, Lc_in, &
    3169              :             dLc_in_dr_in2, dLc_in_dr_in, dLc_in_dr_00, &
    3170              :             dLc_in_dVol_in, dLc_in_dVol_00, &
    3171              :             dLc_in_dT_in, dLc_in_dT_00, &
    3172              :             dLc_in_der_in, dLc_in_der_00, &
    3173            0 :             dLc_in_dw_in, dLc_in_dw_00)
    3174              :          call calc_Lc(s, i, Lc_00, &
    3175              :             dLc_00_dr_in, dLc_00_dr_00, dLc_00_dr_out, &
    3176              :             dLc_00_dVol_00, dLc_00_dVol_out, &
    3177              :             dLc_00_dT_00, dLc_00_dT_out, &
    3178              :             dLc_00_der_00, dLc_00_der_out, &
    3179            0 :             dLc_00_dw_00, dLc_00_dw_out)
    3180              : 
    3181            0 :          if (I == NZN) then
    3182              :             Lc_00_start = 0.d0
    3183              :          else
    3184            0 :             Lc_00_start = s% Lc_start(k)
    3185              :          end if
    3186            0 :          if (i == 1) then
    3187              :             Lc_in_start = 0
    3188              :          else
    3189            0 :             Lc_in_start = s% Lc_start(k+1)
    3190              :          end if
    3191              : 
    3192            0 :          area_00 = 4d0*pi*s% r(k)**2
    3193            0 :          Lr_00 = s% Fr(k)*area_00
    3194            0 :          d_Lr_00_dFr_00 = area_00
    3195            0 :          d_Lr_00_dr_00 = 2d0*Lr_00/s% r(k)
    3196            0 :          area_00_start = 4d0*pi*s% r_start(k)**2
    3197            0 :          Lr_00_start = s% Fr_start(k)*area_00_start
    3198            0 :          if (i == 1) then
    3199            0 :             if (s% RSP_hydro_only) then
    3200              :                Lr_in = 0d0
    3201              :             else
    3202            0 :                Lr_in = s% L_center
    3203              :             end if
    3204              :             d_Lr_in_dFr_in = 0d0
    3205              :             d_Lr_in_dr_in = 0d0
    3206              :             Lr_in_start = Lr_in
    3207              :          else
    3208            0 :             area_in = 4d0*pi*s% r(k+1)**2
    3209            0 :             Lr_in = s% Fr(k+1)*area_in
    3210            0 :             d_Lr_in_dFr_in = area_in
    3211            0 :             d_Lr_in_dr_in = 2d0*Lr_in/s% r(k+1)
    3212            0 :             area_in_start = 4d0*pi*s% r_start(k+1)**2
    3213            0 :             Lr_in_start = s% Fr_start(k+1)*area_in_start
    3214              :          end if
    3215              : 
    3216              :          L_00 = &
    3217              :             WTR*Lr_00 + WTC*Lc_00 + WTT*Lt_00 + &
    3218            0 :             WTR1*Lr_00_start + WTC1*Lc_00_start + WTT1*Lt_00_start
    3219              :          L_in = &
    3220              :             WTR*Lr_in + WTC*Lc_in + WTT*Lt_in + &
    3221            0 :             WTR1*Lr_in_start + WTC1*Lc_in_start + WTT1*Lt_in_start
    3222              : 
    3223            0 :          dt = s% dt
    3224            0 :          dm = s% dm(k)
    3225            0 :          dt_div_dm = dt/dm
    3226            0 :          DV = s% Vol(k) - s% Vol_start(k)
    3227              : 
    3228            0 :          if (s% f_Edd(k) == f_Edd_isotropic .or. k == NZN) then
    3229              :             u_div_r = 0d0
    3230              :             d_u_div_r_dr_00 = 0d0
    3231              :             d_u_div_r_dr_in = 0d0
    3232              :             u_div_r_factor = 0d0
    3233              :          else
    3234            0 :             u_div_r = 0.5d0*(s% v(k)/s% r(k) + s% v(k+1)/s% r(k+1))
    3235            0 :             d_u_div_r_dr_00 = 0.5d0*(2d0/dt - s% v(k)/s% r(k))/s% r(k)
    3236            0 :             d_u_div_r_dr_in = 0.5d0*(2d0/dt - s% v(k+1)/s% r(k+1))/s% r(k+1)
    3237            0 :             u_div_r_factor = dt*(1d0 - 3d0*s% f_Edd(k))
    3238              :          end if
    3239              : 
    3240            0 :          erad = s% erad(k)
    3241            0 :          erad_tw = THETAE*erad + THETAE1*s% erad_start(k)
    3242              : 
    3243              :          call rsp_calc_XP(s, P_surf, i, .true., &
    3244              :             XP_00, dXP_00_dVol_00, dXP_00_dT_00, dXP_00_der_00, &
    3245            0 :             dXP_00_dw_00, dXP_00_dr_in, dXP_00_dr_00)
    3246              : 
    3247              :          residual = &
    3248              :               s% egas(k) - s% egas_start(k) &
    3249              :             + erad - s% erad_start(k) &
    3250              :             + s% RSP_w(k)**2 - s% RSP_w_start(k)**2 &
    3251              :             + dt_div_dm*(L_00 - L_in) &
    3252              :             + XP_00*DV &
    3253              :             + erad_tw*u_div_r_factor*u_div_r &
    3254            0 :             - dt*s% Eq(k)
    3255              : 
    3256            0 :          s% ergs_error(k) = s% dm(k)*residual
    3257              : 
    3258            0 :          HR(IT) = -residual
    3259              : 
    3260            0 :          HD(i_T_dFr_in,IT) = -dt_div_dm*WTR*d_Lr_in_dFr_in
    3261            0 :          HD(i_T_dFr_00,IT) =  dt_div_dm*WTR*d_Lr_00_dFr_00
    3262              : 
    3263              :          HD(i_T_dr_in2,IT) = &
    3264              :             - dt_div_dm*WTC*dLc_in_dr_in2 &
    3265              :             - dt_div_dm*WTT*dLt_in_dr_in2 &
    3266            0 :             - dt*dEq_dr_in2(I)
    3267              :          HD(i_T_dr_in,IT) = &
    3268              :             + d_egas_dr_in(i) &
    3269              :             - dt_div_dm*WTR*d_Lr_in_dr_in &
    3270              :             + dt_div_dm*WTC*(dLc_00_dr_in - dLc_in_dr_in) &
    3271              :             + dt_div_dm*WTT*(dLt_00_dr_in - dLt_in_dr_in) &
    3272              :             + dVol_dr_in(I)*XP_00 &
    3273              :             + DV*dXP_00_dr_in &
    3274              :             + erad_tw*u_div_r_factor*d_u_div_r_dr_in &
    3275            0 :             - dt*dEq_dr_in(I)
    3276              :          HD(i_T_dr_00,IT) = &
    3277              :             + d_egas_dr_00(i) &
    3278              :             + dt_div_dm*WTR*d_Lr_00_dr_00 &
    3279              :             + dt_div_dm*WTC*(dLc_00_dr_00 - dLc_in_dr_00) &
    3280              :             + dt_div_dm*WTT*(dLt_00_dr_00 - dLt_in_dr_00) &
    3281              :             + dVol_dr_00(I)*XP_00 &
    3282              :             + DV*dXP_00_dr_00 &
    3283              :             + erad_tw*u_div_r_factor*d_u_div_r_dr_00 &
    3284            0 :             - dt*dEq_dr_00(I)
    3285              :          HD(i_T_dr_out,IT) = &
    3286              :           + dt_div_dm*WTC*dLc_00_dr_out &
    3287              :           + dt_div_dm*WTT*dLt_00_dr_out &
    3288            0 :           - dt*dEq_dr_out(I)
    3289              : 
    3290              :          HD(i_T_dT_in,IT) = &
    3291              :             - dt_div_dm*WTC*dLc_in_dT_in &
    3292              :             - dt_div_dm*WTT*dLt_in_dT_in &
    3293            0 :             - dt*dEq_dT_in(I)
    3294              :          HD(i_T_dT_00,IT) = &
    3295              :               d_egas_dT(i) &
    3296              :             + DV*dXP_00_dT_00 &
    3297              :             + dt_div_dm*WTC*(dLc_00_dT_00 - dLc_in_dT_00) &
    3298              :             + dt_div_dm*WTT*(dLt_00_dT_00 - dLt_in_dT_00) &
    3299            0 :             - dt*dEq_dT_00(I)
    3300              :          HD(i_T_dT_out,IT) = &  !
    3301              :             + dt_div_dm*WTC*dLc_00_dT_out &
    3302              :             + dt_div_dm*WTT*dLt_00_dT_out &
    3303            0 :             - dt*dEq_dT_out(I)
    3304              : 
    3305              :          HD(i_T_der_in,IT) = &
    3306              :             - dt_div_dm*WTC*dLc_in_der_in &
    3307              :             - dt_div_dm*WTT*dLt_in_der_in &
    3308            0 :             - dt*dEq_der_in(I)
    3309              :          HD(i_T_der_00,IT) = &
    3310              :               1d0 &
    3311              :             + DV*dXP_00_der_00 &
    3312              :             + dt_div_dm*WTC*(dLc_00_der_00 - dLc_in_der_00) &
    3313              :             + dt_div_dm*WTT*(dLt_00_der_00 - dLt_in_der_00) &
    3314              :             + THETAE*u_div_r_factor*u_div_r &
    3315            0 :             - dt*dEq_der_00(I)
    3316              :          HD(i_T_der_out,IT) = &  !
    3317              :             + dt_div_dm*WTC*dLc_00_der_out &
    3318              :             + dt_div_dm*WTT*dLt_00_der_out &
    3319            0 :             - dt*dEq_der_out(I)
    3320              : 
    3321            0 :          if (I <= IBOTOM + 1) then
    3322            0 :             HD(i_T_dw_in,IT) = 0.d0
    3323              :          else
    3324              :             HD(i_T_dw_in,IT) = &
    3325              :                - dt_div_dm*WTC*dLc_in_dw_in &
    3326            0 :                - dt_div_dm*WTT*dLt_in_dw_in
    3327              :          end if
    3328            0 :          if (I <= IBOTOM .or. I == NZN) then
    3329            0 :             HD(i_T_dw_00,IT) = 0.d0
    3330              :          else
    3331              :             HD(i_T_dw_00,IT) = &
    3332              :                2.d0*s% RSP_w(k) &
    3333              :                + dt_div_dm*WTC*(dLc_00_dw_00 - dLc_in_dw_00) &
    3334              :                + dt_div_dm*WTT*(dLt_00_dw_00 - dLt_in_dw_00) &
    3335              :                + DV*dXP_00_dw_00 &
    3336            0 :                - dt*dEq_dw_00(I)
    3337              :          end if
    3338            0 :          if (I <= IBOTOM - 1 .or. I >= NZN - 1) then
    3339            0 :             HD(i_T_dw_out,IT) = 0.d0
    3340              :          else
    3341              :             HD(i_T_dw_out,IT) = &
    3342              :                dt_div_dm*WTT*dLt_00_dw_out &
    3343            0 :                + dt_div_dm*WTC*dLc_00_dw_out
    3344              :          end if
    3345              : 
    3346            0 :          if (i == -6 .and. s% model_number == s% max_model_number) then
    3347            0 :             write(*,5) 'HD(i_T_dw_00,IT)', k, i, iter, s% model_number, HD(i_T_dw_00,IT)
    3348            0 :             write(*,5) 's% RSP_w(k)', k, i, iter, s% model_number, s% RSP_w(k)
    3349            0 :             write(*,5) 'dt_div_dm', k, i, iter, s% model_number, dt_div_dm
    3350            0 :             write(*,5) 'WTC', k, i, iter, s% model_number, WTC
    3351            0 :             write(*,5) 'WTT', k, i, iter, s% model_number, WTT
    3352            0 :             write(*,5) 'DV', k, i, iter, s% model_number, DV
    3353            0 :             write(*,5) 'dt', k, i, iter, s% model_number, dt
    3354            0 :             write(*,5) 'dLc_00_dw_00', k, i, iter, s% model_number, dLc_00_dw_00
    3355            0 :             write(*,5) 'dLc_in_dw_00', k, i, iter, s% model_number, dLc_in_dw_00
    3356            0 :             write(*,5) 'dLt_00_dw_00', k, i, iter, s% model_number, dLt_00_dw_00
    3357            0 :             write(*,5) 'dLt_in_dw_00', k, i, iter, s% model_number, dLt_in_dw_00
    3358            0 :             write(*,5) 'dXP_00_dw_00', k, i, iter, s% model_number, dXP_00_dw_00
    3359            0 :             write(*,5) 'dEq_dw_00(I)', k, i, iter, s% model_number, dEq_dw_00(I)
    3360              :          end if
    3361              : 
    3362              :          !HD(i_T_dr_in2,IT) !
    3363              :          !HD(i_T_dr_in,IT) ! ok
    3364              :          !HD(i_T_dr_00,IT) ! ok
    3365              :          !HD(i_T_dr_out,IT) !
    3366              : 
    3367              :          !HD(i_T_dT_in,IT) ! 0
    3368              :          !HD(i_T_dT_00,IT) ! ok
    3369              :          !HD(i_T_dT_out,IT) ! 0
    3370              : 
    3371              :          !HD(i_T_der_in,IT) !
    3372              :          !HD(i_T_der_00,IT) ! ok
    3373              :          !HD(i_T_der_out,IT) !
    3374              : 
    3375              :          !HD(i_T_dw_in,IT) !
    3376              :          !HD(i_T_dw_00,IT) !
    3377              :          !HD(i_T_dw_out,IT) !
    3378              : 
    3379              :          !test_partials = (k+1 == s% solver_test_partials_k)
    3380            0 :          test_partials = .false.
    3381              : 
    3382              :          if (test_partials) then
    3383              :             s% solver_test_partials_val = residual
    3384              :             s% solver_test_partials_var = i_var_r
    3385              :             s% solver_test_partials_dval_dx = HD(i_T_dr_00,IT)
    3386              :             write(*,*) 'total_energy_eqn', s% solver_test_partials_var
    3387              :          end if
    3388              : 
    3389            0 :       end subroutine total_energy_eqn
    3390              : 
    3391              : 
    3392            0 :       subroutine turbulent_energy_eqn(s, i, &
    3393              :             Lt_00, Lt_00_start, Lt_in, Lt_in_start, &
    3394              :             dLt_00_dr_00, dLt_00_dr_in, dLt_00_dr_out, &
    3395              :             dLt_00_dVol_00, dLt_00_dVol_out, &
    3396              :             dLt_00_dT_00, dLt_00_dT_out, &
    3397              :             dLt_00_der_00, dLt_00_der_out, &
    3398              :             dLt_00_dw_00, dLt_00_dw_out, &
    3399              :             dLt_in_dr_in, dLt_in_dr_in2, dLt_in_dr_00, &
    3400              :             dLt_in_dVol_in, dLt_in_dVol_00, &
    3401              :             dLt_in_dT_in, dLt_in_dT_00, &
    3402              :             dLt_in_der_in, dLt_in_der_00, &
    3403              :             dLt_in_dw_in, dLt_in_dw_00)
    3404              :          type (star_info), pointer :: s
    3405              :          integer, intent(in) :: i
    3406              :          real(dp), intent(in) :: &
    3407              :             Lt_00, Lt_00_start, Lt_in, Lt_in_start, &
    3408              :             dLt_00_dr_00, dLt_00_dr_in, dLt_00_dr_out, &
    3409              :             dLt_00_dVol_00, dLt_00_dVol_out, &
    3410              :             dLt_00_dT_00, dLt_00_dT_out, &
    3411              :             dLt_00_der_00, dLt_00_der_out, &
    3412              :             dLt_00_dw_00, dLt_00_dw_out, &
    3413              :             dLt_in_dr_in, dLt_in_dr_in2, dLt_in_dr_00, &
    3414              :             dLt_in_dVol_in, dLt_in_dVol_00, &
    3415              :             dLt_in_dT_in, dLt_in_dT_00, &
    3416              :             dLt_in_der_in, dLt_in_der_00, &
    3417              :             dLt_in_dw_in, dLt_in_dw_00
    3418              :          integer :: IW, k
    3419            0 :          real(dp) :: dt, dm, residual, Ptrb_tw, DV, dt_div_dm, L_00, L_in
    3420              :          logical :: test_partials
    3421              : 
    3422              :          include 'formats'
    3423              : 
    3424            0 :          k = NZN+1-i
    3425              : 
    3426            0 :          IW = i_var_w + NV*(i-1)
    3427            0 :          HD(1:LD_HD,IW) = 0.d0
    3428              : 
    3429            0 :          if (ALFA == 0d0 .or. I <= IBOTOM .or. I == NZN) then
    3430            0 :             HD(i_w_dw_00,IW) = 1.d0
    3431            0 :             HR(IW) = 0.d0
    3432            0 :             return
    3433              :          end if
    3434              : 
    3435            0 :          L_00 = WTT*Lt_00 + WTT1*Lt_00_start
    3436            0 :          L_in = WTT*Lt_in + WTT1*Lt_in_start
    3437              : 
    3438            0 :          dt = s% dt
    3439            0 :          dm = s% dm(k)
    3440            0 :          dt_div_dm = dt/dm
    3441            0 :          DV = s% Vol(k) - s% Vol_start(k)
    3442            0 :          Ptrb_tw = THETAT*s% Ptrb(k) + THETAT1*s% Ptrb_start(k)
    3443              : 
    3444              :          residual = &
    3445              :             (s% RSP_w(k)**2 - s% RSP_w_start(k)**2) &
    3446              :             + dt_div_dm*(L_00 - L_in) &
    3447              :             + DV*Ptrb_tw &
    3448            0 :             - dt*(GAM*s% COUPL(k) + GAM1*s% COUPL_start(k) + s% Eq(k))
    3449            0 :          HR(IW) = -residual
    3450              : 
    3451            0 :          if (k==-35) then
    3452            0 :             write(*,3) 'RSP w dEt PdV dtC dtEq', k, iter, &
    3453            0 :                s% RSP_w(k), s% RSP_w(k)**2 - s% RSP_w_start(k)**2, DV*Ptrb_tw, &
    3454            0 :                dt*(GAM*s% COUPL(k) + GAM1*s% COUPL_start(k)), dt*s% Eq(k)
    3455              :             !write(*,2) 'RSP w COUPL SOURCE DAMP DAMPR', k, &
    3456              :             !   s% RSP_w(k), s% COUPL(k), s% SOURCE(k), s% DAMP(k), s% DAMPR(k)
    3457              :             !write(*,2) 'RSP w SOURCE PII/Hp P*QQ_div_Cp P T', k, &
    3458              :             !   s% RSP_w(k), s% SOURCE(k), &
    3459              :             !   0.5d0*(s% PII(k)/s% Hp_face(k) + s% PII(k+1)/s% Hp_face(k+1)), &
    3460              :             !   (s% Pgas(k) + s% Prad(k))*s% QQ(k)/s% Cp(k), s% Pgas(k) + s% Prad(k), s% T(k)
    3461              :             !write(*,2) 'RSP PII_00 PII_p1 Hp_00 Hp_p1', k, &
    3462              :             !   s% PII(k), s% PII(k+1), s% Hp_face(k), s% Hp_face(k+1)
    3463              :          end if
    3464              : 
    3465            0 :          HD(i_w_dw_in2,IW) = 0.d0
    3466            0 :          HD(i_w_dw_in,IW) = - dt_div_dm*WTT*dLt_in_dw_in
    3467              :          HD(i_w_dw_00,IW) = &
    3468              :             2.d0*s% RSP_w(k) &
    3469              :             - dt*GAM*dC_dw_00(I) &
    3470              :             - dt*dEq_dw_00(I) &
    3471              :             + dt_div_dm*WTT*(dLt_00_dw_00 - dLt_in_dw_00) &
    3472            0 :             + DV*THETAT*dPtrb_dw_00(I)
    3473            0 :          HD(i_w_dw_out,IW) = dt_div_dm*WTT*dLt_00_dw_out
    3474            0 :          HD(i_w_dw_out2,IW) = 0.d0
    3475              : 
    3476              :          HD(i_w_dr_in2,IW) = &
    3477              :             - dt*GAM*dC_dr_in2(I) &
    3478              :             - dt_div_dm*WTT*dLt_in_dr_in2 &
    3479            0 :             - dt*dEq_dr_in2(I)
    3480              :          HD(i_w_dr_in,IW) = &
    3481              :             - dt*GAM*dC_dr_in(I) &
    3482              :             - dt*dEq_dr_in(I) &
    3483              :             + dt_div_dm*WTT*(dLt_00_dr_in - dLt_in_dr_in) &
    3484              :             + DV*THETAT*dPtrb_dr_in(I) &
    3485            0 :             + (THETAT*s% Ptrb(k) + THETAT1*s% Ptrb_start(k))*dVol_dr_in(I)
    3486              :          HD(i_w_dr_00,IW) = &
    3487              :             - dt*GAM*dC_dr_00(I) &
    3488              :             - dt*dEq_dr_00(I) &
    3489              :             + dt_div_dm*WTT*(dLt_00_dr_00 - dLt_in_dr_00) &
    3490              :             + DV*THETAT*dPtrb_dr_00(I) &
    3491            0 :             + (THETAT*s% Ptrb(k) + THETAT1*s% Ptrb_start(k))*dVol_dr_00(I)
    3492              :          HD(i_w_dr_out,IW) = &
    3493              :             - dt*GAM*dC_dr_out(I) &
    3494              :             + dt_div_dm*WTT*dLt_00_dr_out &
    3495            0 :             - dt*dEq_dr_out(I)
    3496              : 
    3497            0 :          if (I <= IBOTOM + 1) then
    3498            0 :             HD(i_w_dT_in,IW) = 0.d0
    3499              :          else
    3500              :             HD(i_w_dT_in,IW) = &
    3501              :                - dt_div_dm*WTT*dLt_in_dT_in &
    3502              :                - dt*dEq_dT_in(I) &
    3503            0 :                - dt*GAM*dC_dT_in(I)
    3504              :          end if
    3505              :          HD(i_w_dT_00,IW) = &
    3506              :             - dt*GAM*dC_dT_00(I) &
    3507              :             - dt*dEq_dT_00(I) &
    3508            0 :             + dt_div_dm*WTT*(dLt_00_dT_00 - dLt_in_dT_00)
    3509            0 :          if (I <= IBOTOM - 1 .or. I >= NZN - 1) then
    3510            0 :             HD(i_w_dT_out,IW) = 0.d0
    3511              :          else
    3512              :             HD(i_w_dT_out,IW) = &
    3513              :                - dt*GAM*dC_dT_out(I) &
    3514              :                + dt_div_dm*WTT*dLt_00_dT_out &
    3515            0 :                - dt*dEq_dT_out(I)
    3516              :          end if
    3517              : 
    3518            0 :          if (I <= IBOTOM + 1) then
    3519            0 :             HD(i_w_der_in,IW) = 0.d0
    3520              :          else
    3521              :             HD(i_w_der_in,IW) = &
    3522              :                - dt_div_dm*WTT*dLt_in_der_in &
    3523              :                - dt*dEq_der_in(I) &
    3524            0 :                - dt*GAM*dC_der_in(I)
    3525              :          end if
    3526              :          HD(i_w_der_00,IW) = &
    3527              :             - dt*GAM*dC_der_00(I) &
    3528              :             - dt*dEq_der_00(I) &
    3529            0 :             + dt_div_dm*WTT*(dLt_00_der_00 - dLt_in_der_00)
    3530            0 :          if (I <= IBOTOM - 1 .or. I >= NZN - 1) then
    3531            0 :             HD(i_w_der_out,IW) = 0.d0
    3532              :          else
    3533              :             HD(i_w_der_out,IW) = &
    3534              :                - dt*GAM*dC_der_out(I) &
    3535              :                + dt_div_dm*WTT*dLt_00_der_out &
    3536            0 :                - dt*dEq_der_out(I)
    3537              :          end if
    3538              : 
    3539              :          !HD(i_w_dw_in,IW) !
    3540              :          !HD(i_w_dw_00,IW) !
    3541              :          !HD(i_w_dw_out,IW) !
    3542              : 
    3543              :          !HD(i_w_dr_in2,IW) !
    3544              :          !HD(i_w_dr_in,IW) !
    3545              :          !HD(i_w_dr_00,IW) !
    3546              :          !HD(i_w_dr_out,IW) !
    3547              : 
    3548              :          !HD(i_w_dT_in,IW) !
    3549              :          !HD(i_w_dT_00,IW) !
    3550              :          !HD(i_w_dT_out,IW) !
    3551              : 
    3552              :          !HD(i_w_der_in,IW) !
    3553              :          !HD(i_w_der_00,IW) !
    3554              :          !HD(i_w_der_out,IW) !
    3555              : 
    3556              :          !test_partials = (k+1 == s% solver_test_partials_k)
    3557            0 :          test_partials = .false.
    3558              : 
    3559              :          if (test_partials) then
    3560              :             s% solver_test_partials_val = residual
    3561              :             s% solver_test_partials_var = i_var_r
    3562              :             s% solver_test_partials_dval_dx = HD(i_w_dr_00,IW)
    3563              :             write(*,*) 'turbulent_energy_eqn', s% solver_test_partials_var
    3564              :          end if
    3565              : 
    3566              :       end subroutine turbulent_energy_eqn
    3567              : 
    3568              : 
    3569            0 :       subroutine erad_eqn(s, i)
    3570              :          use const_def, only: crad, clight
    3571              :          type (star_info), pointer :: s
    3572              :          integer, intent(in) :: i
    3573              :          include 'formats'
    3574              : 
    3575            0 :          call T_form_of_erad_eqn(s, i)
    3576              : 
    3577            0 :       end subroutine erad_eqn
    3578              : 
    3579              : 
    3580            0 :       subroutine Fr_eqn(s, i)
    3581              :          use const_def, only: clight
    3582              :          type (star_info), pointer :: s
    3583              :          integer, intent(in) :: i
    3584              :          integer :: IL, k
    3585            0 :          real(dp) :: residual
    3586              : 
    3587              :          include 'formats'
    3588              : 
    3589            0 :          if (s% RSP_hydro_only) then
    3590            0 :             k = NZN+1-i
    3591            0 :             IL = i_var_Fr + NV*(i-1)
    3592            0 :             HD(1:LD_HD,IL) = 0d0
    3593            0 :             residual = - s% Fr(k)  ! want Fr = 0d0
    3594            0 :             HR(IL) = -residual
    3595            0 :             HD(i_Fr_dFr_00,IL) = -1d0
    3596            0 :             return
    3597              :          end if
    3598              : 
    3599            0 :          call T_form_of_Fr_eqn(s,i)
    3600              : 
    3601              :       end subroutine Fr_eqn
    3602              : 
    3603              : 
    3604              :       subroutine d_Prad_dm_Fr_eqn(s,i)
    3605              :          type (star_info), pointer :: s
    3606              :          integer, intent(in) :: i
    3607              :          integer :: IL, k
    3608              :          real(dp) :: residual, Fr_00, &
    3609              :             dFr_dr_out, dFr_dr_00, dFr_dr_in, &
    3610              :             dFr_dVol_out, dFr_dVol_00, &
    3611              :             dFr_dT_out, dFr_dT_00, &
    3612              :             dFr_der_out, dFr_der_00
    3613              : 
    3614              :          logical :: test_partials
    3615              : 
    3616              :          include 'formats'
    3617              : 
    3618              :          k = NZN+1-i
    3619              :          IL = i_var_Fr + NV*(i-1)
    3620              :          HD(1:LD_HD,IL) = 0d0
    3621              : 
    3622              :          call calc_Fr(s, i, Fr_00, &
    3623              :             dFr_dr_out, dFr_dr_00, dFr_dr_in, &
    3624              :             dFr_dVol_out, dFr_dVol_00, &
    3625              :             dFr_dT_out, dFr_dT_00, &
    3626              :             dFr_der_out, dFr_der_00)
    3627              : 
    3628              :          residual = Fr_00 - s% Fr(k)
    3629              :          HR(IL) = -residual
    3630              : 
    3631              :          HD(i_Fr_der_00,IL) = dFr_der_00
    3632              :          HD(i_Fr_der_out,IL) = dFr_der_out
    3633              :          HD(i_Fr_dr_in,IL) = dFr_dr_in  !
    3634              :          HD(i_Fr_dr_00,IL) = dFr_dr_00  !
    3635              :          HD(i_Fr_dr_out,IL) = dFr_dr_out  !
    3636              :          HD(i_Fr_dT_00,IL) = dFr_dT_00
    3637              :          HD(i_Fr_dT_out,IL) = dFr_dT_out
    3638              :          HD(i_Fr_dFr_00,IL) = -1d0
    3639              : 
    3640              :          !test_partials = (k == s% solver_test_partials_k)
    3641              :          test_partials = .false.
    3642              : 
    3643              :          if (test_partials) then
    3644              :             s% solver_test_partials_val = residual
    3645              :             s% solver_test_partials_var = i_var_er
    3646              :             s% solver_test_partials_dval_dx = dFr_der_00
    3647              :             write(*,*) 'd_Prad_dm_Fr_eqn', s% solver_test_partials_var
    3648              :          end if
    3649              : 
    3650              :       end subroutine d_Prad_dm_Fr_eqn
    3651              : 
    3652              : 
    3653            0 :       subroutine T_form_of_erad_eqn(s,i)
    3654              :          type (star_info), pointer :: s
    3655              :          integer, intent(in) :: i
    3656              :          integer :: IE, k
    3657            0 :          real(dp) :: T, V, erad_expected, residual
    3658              :          logical :: test_partials
    3659              : 
    3660              :          include 'formats'
    3661              : 
    3662            0 :          k = NZN+1-i
    3663            0 :          IE = i_var_er + NV*(i-1)
    3664            0 :          HD(1:LD_HD,IE) = 0.d0
    3665              : 
    3666            0 :          T = s% T(k)
    3667            0 :          V = s% Vol(k)
    3668            0 :          erad_expected = crad*T**4*V  ! ergs/gm
    3669            0 :          residual = erad_expected - s% erad(k)
    3670              : 
    3671            0 :          HR(IE) = -residual
    3672              : 
    3673            0 :          HD(i_er_der_00,IE) = -1d0
    3674            0 :          HD(i_er_dT_00,IE) = 4d0*crad*T**3*V
    3675            0 :          HD(i_er_dr_00,IE) = crad*T**4*dVol_dr_00(i)
    3676            0 :          HD(i_er_dr_in,IE) = crad*T**4*dVol_dr_in(i)
    3677              : 
    3678              :          !test_partials = (k == s% solver_test_partials_k)
    3679            0 :          test_partials = .false.
    3680              : 
    3681              :          if (test_partials) then
    3682              :             s% solver_test_partials_val = residual
    3683              :             s% solver_test_partials_var = i_var_T
    3684              :             s% solver_test_partials_dval_dx = HD(i_er_dT_00,IE)
    3685              :             write(*,*) 'T_form_of_erad_eqn', s% solver_test_partials_var
    3686              :          end if
    3687            0 :       end subroutine T_form_of_erad_eqn
    3688              : 
    3689              : 
    3690            0 :       subroutine T_form_of_calc_Fr(s, i, Fr_00, &  !rs Stellingwerf 1975, Appendix A
    3691              :             dFr_dr_out, dFr_dr_in, dFr_dr_00, &
    3692              :             dFr_dT_out, dFr_dT_00, dFr_dVol_00)
    3693              :          type (star_info), pointer :: s
    3694              :          integer, intent(in) :: I
    3695              :          real(dp), intent(out) :: &
    3696              :             Fr_00, dFr_dr_out, dFr_dr_in, &
    3697              :             dFr_dr_00, dFr_dT_out, dFr_dT_00, dFr_dVol_00
    3698            0 :          real(dp) :: dFr_dK_00, dFr_dK_out, W, WP, BW, BK, T1, T2, T3
    3699              :          integer :: k
    3700              :          logical :: test_partials
    3701              :          include 'formats'
    3702            0 :          k = NZN+1-i
    3703            0 :          if (i < 1) then
    3704            0 :             if (s% RSP_hydro_only) then
    3705            0 :                Fr_00 = 0d0
    3706              :             else
    3707            0 :                Fr_00 = s% L_center
    3708              :             end if
    3709            0 :             Fr_00 = Fr_00/(4d0*pi*s% r_center**2)
    3710            0 :             dFr_dr_00 = 0
    3711            0 :             dFr_dT_00 = 0
    3712            0 :             dFr_dK_00 = 0
    3713            0 :             dFr_dK_out = 0
    3714            0 :             dFr_dr_out = 0
    3715            0 :             dFr_dr_in = 0
    3716            0 :             dFr_dT_out = 0
    3717            0 :          else if (i == NZN) then
    3718            0 :             Fr_00 = 2d0*SIG*s% T(k)**4  !EDDI
    3719            0 :             dFr_dT_00 = 4.d0*Fr_00/s% T(k)
    3720            0 :             dFr_dK_00 = 0
    3721            0 :             dFr_dK_out = 0
    3722            0 :             dFr_dr_out = 0
    3723            0 :             dFr_dr_in = 0
    3724            0 :             dFr_dr_00 = 0
    3725            0 :             dFr_dT_out = 0
    3726              :          else
    3727            0 :             Fr_00 = 0d0
    3728            0 :             dFr_dr_00 = 0d0
    3729            0 :             dFr_dT_00 = 0d0
    3730            0 :             dFr_dK_00 = 0d0
    3731            0 :             dFr_dK_out = 0d0
    3732            0 :             dFr_dr_out = 0d0
    3733            0 :             dFr_dr_in = 0d0
    3734            0 :             dFr_dT_out = 0d0
    3735            0 :             W = s% T(k)**4
    3736            0 :             WP = s% T(k-1)**4
    3737            0 :             BW = 4d0*(s% lnT(k-1) - s% lnT(k))  ! log(WP/W)
    3738            0 :             if (abs(BW) < 1d-20) return
    3739            0 :             BK = log(s% opacity(k-1)/s% opacity(k))
    3740            0 :             if (abs(1.d0 - BK/BW) < 1d-15 .or. abs(BW - BK) < 1d-15) return
    3741            0 :             T1 = - CL*s% r(k)**2/(4d0*pi*s% dm_bar(k))   ! CL = 4d0*(4d0*PI)**2*SIG/3d0
    3742            0 :             T2 = (WP/s% opacity(k-1) - W/s% opacity(k))/(1.d0 - BK/BW)
    3743            0 :             Fr_00 = T1*T2
    3744            0 :             T3 = T1/(BW - BK)
    3745              :             !rs radiative luminosity derivatives
    3746            0 :             dFr_dK_00 = (T3/s% opacity(k))*(W*BW/s% opacity(k) - T2)
    3747            0 :             dFr_dK_out = -(T3/s% opacity(k-1))*(WP*BW/s% opacity(k-1) - T2)
    3748            0 :             dFr_dr_out = dFr_dK_out*dK_dr_00(i+1)  !
    3749            0 :             dFr_dr_in = dFr_dK_00*dK_dr_in(I)  !
    3750              :             dFr_dr_00 = 2d0*Fr_00/s% r(k) &  !
    3751              :                + dFr_dK_00*dK_dr_00(I) &
    3752            0 :                + dFr_dK_out*dK_dr_in(i+1)
    3753              :             dFr_dT_out = &  !
    3754              :                  4.d0*(T3/s% T(k-1))*(WP*BW/s% opacity(k-1) &
    3755            0 :                - T2*BK/BW) + dFr_dK_out*dK_dT(i+1)
    3756              :             dFr_dT_00 = &  !
    3757              :                - 4.d0*(T3/s% T(k))*(W*BW/s% opacity(k) - T2*BK/BW) &
    3758            0 :                + dFr_dK_00*dK_dT(I)
    3759              : 
    3760              :             if (call_is_bad) then
    3761              :                if (is_bad(dFr_dT_out + dFr_dT_00)) then
    3762              :                   write(*,3) 'dFr_dT_out', i, k, dFr_dT_out
    3763              :                   write(*,3) 'dFr_dT_00', i, k, dFr_dT_00
    3764              :                   write(*,3) 's% T(k-1)', i, k, s% T(k-1)
    3765              :                   write(*,3) 's% T(k)', i, k, s% T(k)
    3766              :                   write(*,3) 's% opacity(k-1)', i, k, s% opacity(k-1)
    3767              :                   write(*,3) 's% opacity(k)', i, k, s% opacity(k)
    3768              :                   write(*,3) 'dK_dT(I)', i, k, dK_dT(I)
    3769              :                   write(*,3) 'dK_dT(i+1)', i, k, dK_dT(i+1)
    3770              :                   write(*,3) 'T2', i, k, T2
    3771              :                   write(*,3) 'T3', i, k, T3
    3772              :                   write(*,3) 'BK', i, k, BK
    3773              :                   write(*,3) 'BW', i, k, BW
    3774              :                   write(*,3) '1.d0 - BK/BW', i, k, 1.d0 - BK/BW
    3775              :                   write(*,3) 'W', i, k, W
    3776              :                   write(*,3) 'WP', i, k, WP
    3777              :                   call mesa_error(__FILE__,__LINE__,'T_form_of_calc_Fr')
    3778              :                end if
    3779              :             end if
    3780              : 
    3781            0 :             dFr_dVol_00 = dFr_dK_00*dK_dVol(I)
    3782              :          end if
    3783              : 
    3784              :          !test_partials = (k-1 == s% solver_test_partials_k)
    3785              :          test_partials = .false.
    3786              :          if (test_partials) then
    3787              :             s% solver_test_partials_val = Fr_00
    3788              :             s% solver_test_partials_var = i_var_T
    3789              :             s% solver_test_partials_dval_dx = dFr_dT_out
    3790              :             write(*,*) 'T_form_of_calc_Fr', s% solver_test_partials_var
    3791              :          end if
    3792              :       end subroutine T_form_of_calc_Fr
    3793              : 
    3794              : 
    3795            0 :       subroutine T_form_of_Fr_eqn(s,i)
    3796              :          type (star_info), pointer :: s
    3797              :          integer, intent(in) :: i
    3798              :          integer :: IL, k
    3799            0 :          real(dp) :: residual, Fr_00, &
    3800              :             dFr_00_dr_out, dFr_00_dr_in, dFr_00_dr_00, &
    3801              :             dFr_00_dT_out, dFr_00_dT_00, dFr_dVol_00
    3802              :          logical :: test_partials
    3803              : 
    3804              :          include 'formats'
    3805              : 
    3806            0 :          k = NZN+1-i
    3807            0 :          IL = i_var_Fr + NV*(i-1)
    3808            0 :          HD(1:LD_HD,IL) = 0d0
    3809              : 
    3810              :          call T_form_of_calc_Fr(s, i, Fr_00, &
    3811              :             dFr_00_dr_out, dFr_00_dr_in, dFr_00_dr_00, &
    3812            0 :             dFr_00_dT_out, dFr_00_dT_00, dFr_dVol_00)
    3813              : 
    3814            0 :          residual = Fr_00 - s% Fr(k)
    3815            0 :          HR(IL) = -residual
    3816              : 
    3817            0 :          HD(i_Fr_dFr_00,IL) = -1d0
    3818            0 :          HD(i_Fr_dr_in,IL) = dFr_00_dr_in
    3819            0 :          HD(i_Fr_dr_00,IL) = dFr_00_dr_00
    3820            0 :          HD(i_Fr_dr_out,IL) = dFr_00_dr_out
    3821            0 :          HD(i_Fr_dT_00,IL) = dFr_00_dT_00
    3822            0 :          HD(i_Fr_dT_out,IL) = dFr_00_dT_out
    3823              :          !test_partials = (k == s% solver_test_partials_k)
    3824            0 :          test_partials = .false.
    3825              : 
    3826              :          if (test_partials) then
    3827              :             s% solver_test_partials_val = residual
    3828              :             s% solver_test_partials_var = i_var_T
    3829              :             s% solver_test_partials_dval_dx = HD(i_Fr_dT_00,IL)
    3830              :             write(*,*) 'T_form_of_Fr_eqn', s% solver_test_partials_var
    3831              :          end if
    3832            0 :       end subroutine T_form_of_Fr_eqn
    3833              : 
    3834              :       end module rsp_step
        

Generated by: LCOV version 2.0-1