LCOV - code coverage report
Current view: top level - rates/private - pycno.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 61.2 % 121 74
Test Date: 2025-05-08 18:23:42 Functions: 100.0 % 1 1

            Line data    Source code
       1              : ! ***********************************************************************
       2              : !
       3              : !   Copyright (C) 2010-2019  The MESA Team
       4              : !
       5              : !   This program is free software: you can redistribute it and/or modify
       6              : !   it under the terms of the GNU Lesser General Public License
       7              : !   as published by the Free Software Foundation,
       8              : !   either version 3 of the License, or (at your option) any later version.
       9              : !
      10              : !   This program is distributed in the hope that it will be useful,
      11              : !   but WITHOUT ANY WARRANTY; without even the implied warranty of
      12              : !   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
      13              : !   See the GNU Lesser General Public License for more details.
      14              : !
      15              : !   You should have received a copy of the GNU Lesser General Public License
      16              : !   along with this program. If not, see <https://www.gnu.org/licenses/>.
      17              : !
      18              : ! ***********************************************************************
      19              : 
      20              :       module pycno
      21              : 
      22              :       use rates_def
      23              :       use utils_lib
      24              :       use const_def, only: dp
      25              :       use math_lib
      26              : 
      27              :       implicit none
      28              : 
      29              :       contains
      30              : 
      31            2 :       subroutine FL_epsnuc_3alf(T, Rho, Y, UE, r, drdT, drdRho)
      32              :          real(dp), intent(in) :: T  ! temperature
      33              :          real(dp), intent(in) :: Rho  ! density
      34              :          real(dp), intent(in) :: Y  ! helium mass fraction
      35              :          real(dp), intent(in) :: UE  ! electron molecular weight
      36              :          real(dp), intent(out) :: r  ! rate in ergs/g/sec
      37              :          real(dp), intent(out) :: drdT  ! partial wrt temperature
      38              :          real(dp), intent(out) :: drdRho  ! partial wrt density
      39              : 
      40            2 :          real(dp) :: T6, R6, R6T, R6T13, R6T16, T62, T612, T623, T653, T632, T613, U, AF
      41            2 :          real(dp) :: G1, dG1dRho, dG1dT, G2, dG2dRho, dG2dT
      42            2 :          real(dp) :: B1, dB1dRho, dB1dT, B2, dB2dRho, dB2dT
      43            2 :          real(dp) :: dUdT, dUdRho, U32, U52, dAFdT, dAFdRho
      44            2 :          real(dp) :: E1, dE1dT, dE1dRho, E2, dE2dT, dE2dRho
      45            2 :          real(dp) :: F1, dF1dT, dF1dRho, F2, dF2dT, dF2dRho
      46            2 :          real(dp) :: dR6dRho, dR6TdRho, dR6T13dRho, dR6T16dRho
      47            2 :          real(dp) :: dT6dT, dT612dT, dT62dT, dT613dT, dT623dT, dT632dT, dT653dT
      48              : 
      49              :          ! DEBUG
      50              :          real(dp), parameter :: AF_0  =  1.9005324047511074D+00
      51              :          real(dp), parameter :: B1_denom_0  =  2.9602238143383192D-01
      52              :          real(dp), parameter :: B1_0  =  1.2227955158250397D-08
      53              :          real(dp), parameter :: B2_denom_0  =  1.7563773044362474D+00
      54              :          real(dp), parameter :: B2_0  =  1.0173166567483392D-14
      55              :          real(dp), parameter :: E1_0  =  -2.2308014220480969D+00
      56              :          real(dp), parameter :: F1_0  =  1.5176626709750911D-04
      57              :          real(dp), parameter :: E2_0  =  -2.2350904778008243D+01
      58              :          real(dp), parameter :: F2_0  =  2.7741209323605414D-13
      59              :          real(dp), parameter :: T_0  =  7.9432823472428218D+07
      60              :          real(dp), parameter :: RHO_0  =  3.1622776917911558D+09
      61              :          real(dp), parameter :: r_0  =  2.2348420508311778D+20
      62              :          real(dp), parameter :: G1_0  =  1.5177849505266735D-04
      63              :          real(dp), parameter :: G2_0  =  2.8758525980353755D-13
      64              :          real(dp), parameter :: U_0  =  1.0723431204522564D+00
      65              : 
      66            2 :          real(dp) :: tmp, &
      67            2 :                B1_denom, dB1_denom_dRho, dB1_denom_dT, &
      68            2 :                B2_denom, dB2_denom_dRho, dB2_denom_dT
      69            2 :          real(dp) :: A1, dA1dT, B1_numerator, dB1_numerator_dT
      70            2 :          real(dp) :: A2, dA2dT, B2_numerator, dB2_numerator_dT
      71              : 
      72              :          include 'formats'
      73              : 
      74            2 :          R6=RHO*1d-6
      75            2 :          dR6dRho = 1d-6
      76            2 :          R6T=2d0*R6/UE
      77            2 :          dR6TdRho = 2d0*dR6dRho/UE
      78              : 
      79            2 :          R6T16=pow(R6T,1d0/6d0)
      80            2 :          dR6T16dRho = (1d0/6d0)*dR6TdRho*R6T16/R6T
      81            2 :          R6T13=R6T16*R6T16
      82            2 :          dR6T13dRho = 2*R6T16*dR6T16dRho
      83            2 :          T6=T*1d-6
      84            2 :          dT6dT=1d-6
      85            2 :          dT62dT=2d0*T6*dT6dT
      86            2 :          T613=pow(T6,1d0/3d0)
      87            2 :          dT613dT=(1d0/3d0)*dT6dT*T613/T6
      88            2 :          T623=T613*T613
      89            2 :          dT623dT=2*T613*dT613dT
      90            2 :          T653=T623*T6
      91            2 :          dT653dT = dT623dT*T6 + T623*dT6dT
      92              : 
      93            2 :          T62=T6*T6
      94            2 :          T612=sqrt(T6)
      95            2 :          dT612dT=0.5d0*dT6dT/T612
      96            2 :          T632=T6*T612
      97            2 :          dT632dT=1.5d0*T612*dT6dT
      98              : 
      99            2 :          U=1.35D0*R6T13/T623
     100            2 :          dUdT = -U * dT623dT / T623
     101            2 :          dUdRho = U * dR6T13dRho / R6T13
     102              : 
     103            2 :          U32 = U*sqrt(U)
     104            2 :          U52 = U*U32
     105              : 
     106            2 :          if (U < 1) then  ! strong screening regime, eqn 4.8a in F&L
     107              : 
     108            0 :             A1 = pow2(1d0-4.222D-2*T623) + 2.643D-5*T653
     109            0 :             dA1dT = -2d0*4.222d-2*dT623dT*(1d0 - 4.222D-2*T623) + 2.643D-5*dT653dT
     110              : 
     111            0 :             B1_denom=A1*T623
     112            0 :             dB1_denom_dT = dA1dT*T623 + A1*dT623dT
     113              : 
     114            0 :             B1_numerator = 16.16D0*exp(-134.92d0/T613)
     115            0 :             dB1_numerator_dT = B1_numerator*134.92d0*dT613dT/(T613*T613)
     116              : 
     117            0 :             B1=B1_numerator/B1_denom
     118            0 :             dB1dT = dB1_numerator_dT/B1_denom - B1*dB1_denom_dT/B1_denom
     119              : 
     120            0 :             A2 = pow2(1d0-2.807D-2*T623) + 2.704D-6*T653
     121            0 :             dA2dT = -2*2.807D-2*dT623dT*(1d0-2.807D-2*T623) + 2.704D-6*dT653dT
     122              : 
     123            0 :             B2_denom=A2*T623
     124            0 :             dB2_denom_dT = dA2dT*T623 + A2*dT623dT
     125              : 
     126            0 :             B2_numerator = 244.6D0*pow5(1D0+3.528D-3*T623) * exp(-235.72D0/T613)
     127              :             dB2_numerator_dT = B2_numerator* &
     128            0 :                   (5D0*3.528D-3*dT623dT/(1D0+3.528D-3*T623) + 235.72D0*dT613dT/T623)
     129              : 
     130            0 :             B2=B2_numerator/B2_denom
     131            0 :             dB2dT = dB2_numerator_dT/B2_denom - B2*dB2_denom_dT/B2_denom
     132              : 
     133            0 :             if (5.458D3 > R6T) then
     134              : 
     135            0 :                E1 = -1065.1D0/T6
     136            0 :                dE1dT = -E1 * dT6dT / T6
     137              : 
     138            0 :                F1 = exp(E1)/T632
     139            0 :                dF1dT = F1 * (dE1dT - dT632dT/T632)
     140              : 
     141            0 :                B1=B1+F1
     142            0 :                dB1dT = dB1dT + dF1dT
     143              : 
     144              :             end if
     145              : 
     146            0 :             if (1.836D4 > R6T) then
     147              : 
     148            0 :                E2 = -3336.4D0/T6
     149            0 :                dE2dT = -E2 * dT6dT / T6
     150              : 
     151            0 :                F2 = exp(E2)/T632
     152            0 :                dF2dT = F2 * (dE2dT - dT632dT/T632)
     153              : 
     154            0 :                B2=B2+F2
     155            0 :                dB2dT = dB2dT + dF2dT
     156              : 
     157              :             end if
     158              : 
     159            0 :             G1=B1*exp(60.492D0*R6T13/T6)
     160            0 :             dG1dT = G1*(dB1dT/B1 - 60.492D0*R6T13*dT6dT/(T6*T6))
     161            0 :             dG1dRho=0
     162              : 
     163            0 :             G2=B2*exp(106.35D0*R6T13/T6)
     164            0 :             dG2dT = G2*(dB2dT/B2 - 106.35D0*R6T13*dT6dT/(T6*T6))
     165            0 :             dG2dRho=0
     166              : 
     167              :          else  ! pycnonuclear regime, eqn 4.8b in F&L
     168              : 
     169            2 :             AF=1d0/U32 + 1d0
     170            2 :             dAFdT = -1.5d0 * dUdT/U52
     171            2 :             dAFdRho = -1.5d0 * dUdRho/U52
     172              : 
     173            2 :             B1_denom=T612*(pow2(1.0d0-5.680D-2*R6T13)+8.815D-7*T62)
     174            2 :             dB1_denom_dT = B1_denom*dT612dT/T612 + T612*8.815D-7*dT62dT
     175            2 :             dB1_denom_dRho = -2*5.680D-2*(1.0d0-5.680D-2*R6T13)*T612*dR6T13dRho
     176              : 
     177            2 :             B1=1.178D0*AF*exp(-77.554d0/R6T16)/B1_denom
     178            2 :             dB1dT = B1 * (dAFdT/AF - dB1_denom_dT/B1_denom)
     179            2 :             dB1dRho = B1 * (dAFdRho/AF + 77.554d0*dR6T16dRho/(R6T16*R6T16) - dB1_denom_dRho/B1_denom)
     180              : 
     181            2 :             B2_denom=T612*(pow2(1.0d0-3.791D-2*R6T13)+5.162D-8*T62)
     182            2 :             dB2_denom_dT = B2_denom*dT612dT/T612 + T612*5.162D-8*dT62dT
     183              : 
     184            2 :             tmp = pow(Rho/UE,1d0/3d0)
     185            2 :             dB2_denom_dRho = T612*(-0.000252733d0 + 9.58112d-8*tmp)*tmp/Rho
     186              : 
     187            2 :             B2=13.48D0*AF*pow5(1.0d0+5.070D-3*R6T13)*exp(-135.08D0/R6T16)/B2_denom
     188            2 :             dB2dT = B2 * (dAFdT/AF - dB2_denom_dT/B2_denom)
     189            2 :             dB2dRho = B2 * (dAFdRho/AF + 135.08D0*dR6T16dRho/(R6T16*R6T16) - dB2_denom_dRho/B2_denom)
     190              : 
     191            2 :             if (5.458D3 > R6T) then
     192              : 
     193            0 :                E1 = (60.492d0*R6T13 - 1065.1D0)/T6
     194            0 :                dE1dT = -E1 * dT6dT / T6
     195            0 :                dE1dRho = 60.492d0*dR6T13dRho/T6
     196              : 
     197            0 :                F1 = exp(E1)/T632
     198            0 :                dF1dT = F1 * (dE1dT - dT632dT/T632)
     199            0 :                dF1dRho = F1 * dE1dRho
     200              : 
     201              :                !write(*,1) 'E1', E1
     202              :                !write(*,1) 'F1', F1
     203              : 
     204            0 :                G1=B1+F1
     205            0 :                dG1dT = dB1dT + dF1dT
     206            0 :                dG1dRho = dB1dRho + dF1dRho
     207              : 
     208              :             else
     209              : 
     210              :                G1=B1; dG1dRho = dB1dRho; dG1dT = dB1dT
     211              : 
     212              :             end if
     213              : 
     214            2 :             if (1.836D4 > R6T) then
     215              : 
     216            2 :                E2 = (106.35D0*R6T13 - 3336.4D0)/T6
     217            2 :                dE2dT = -E2 * dT6dT / T6
     218            2 :                dE2dRho = 106.35D0*dR6T13dRho/T6
     219              : 
     220            2 :                F2 = exp(E2)/T632
     221            2 :                dF2dT = F2 * (dE2dT - dT632dT/T632)
     222            2 :                dF2dRho = F2 * dE2dRho
     223              : 
     224              :                !write(*,1) 'E2', E2
     225              :                !write(*,1) 'F2', F2
     226              : 
     227            2 :                G2=B2+F2
     228            2 :                dG2dT = dB2dT + dF2dT
     229            2 :                dG2dRho = dB2dRho + dF2dRho
     230              : 
     231              :             else
     232              : 
     233              :                G2=B2; dG2dRho = dB2dRho; dG2dT = dB2dT
     234              : 
     235              :             end if
     236              : 
     237              :          end if
     238              : 
     239            2 :          r=5.120D29*G1*G2*Y*Y*Y*R6*R6  ! ergs/g/sec, eqn 4.7 in F&L
     240              : 
     241            2 :          if (r < 1d-99 .or. G1 < 1d-99 .or. G2 < 1d-99) then
     242            0 :             drdT = 0
     243            0 :             drdRho = 0
     244              :          else
     245            2 :             drdT = r * (dG1dT/G1 + dG2dT/G2)
     246            2 :             drdRho = r * (dG1dRho/G1 + dG2dRho/G2 + 2*dR6dRho/R6)
     247              : 
     248            2 :             return
     249              : 
     250              :             write(*,1) 'T', T
     251              :             write(*,1) 'RHO', RHO
     252              :             write(*,1) 'r', r
     253              :             write(*,1) 'G1', G1
     254              :             write(*,1) 'G2', G2
     255              :             write(*,1) 'U', U
     256              :             write(*,'(A)')
     257              : 
     258              :             write(*,1) 'abs(Rho_0 - Rho)', abs(Rho_0 - Rho)
     259              : 
     260              :             if (.true. .and. abs(Rho_0 - Rho) > 1d-2) then
     261              :                write(*,'(A)')
     262              :                write(*,1) 'analytic drdRho', drdRho
     263              :                write(*,1) 'numeric drdRho', (r_0 - r) / (Rho_0 - Rho)
     264              :                write(*,'(A)')
     265              :                write(*,1) 'analytic dG1dRho', dG1dRho
     266              :                write(*,1) 'numeric dG1dRho', (G1_0 - G1) / (Rho_0 - Rho)
     267              :                write(*,'(A)')
     268              :                write(*,1) 'analytic dG2dRho', dG2dRho
     269              :                write(*,1) 'numeric dG2dRho', (G2_0 - G2) / (Rho_0 - Rho)
     270              :                write(*,'(A)')
     271              :                write(*,1) 'analytic dUdRho', dUdRho
     272              :                write(*,1) 'numeric dUdRho', (U_0 - U) / (Rho_0 - Rho)
     273              :                write(*,'(A)')
     274              :                write(*,1) 'analytic AF', dAFdRho
     275              :                write(*,1) 'numeric AF', (AF_0 - AF) / (Rho_0 - Rho)
     276              :                write(*,'(A)')
     277              :                write(*,1) 'analytic B1_denom', dB1_denom_dRho
     278              :                write(*,1) 'numeric B1_denom', (B1_denom_0 - B1_denom) / (Rho_0 - Rho)
     279              :                write(*,'(A)')
     280              :                write(*,1) 'analytic B1', dB1dRho
     281              :                write(*,1) 'numeric B1', (B1_0 - B1) / (Rho_0 - Rho)
     282              :                write(*,'(A)')
     283              :                write(*,1) 'analytic B2_denom', dB2_denom_dRho
     284              :                write(*,1) 'numeric B2_denom', (B2_denom_0 - B2_denom) / (Rho_0 - Rho)
     285              :                write(*,'(A)')
     286              :                write(*,1) 'analytic B2', dB2dRho
     287              :                write(*,1) 'numeric B2', (B2_0 - B2) / (Rho_0 - Rho)
     288              :                write(*,'(A)')
     289              :                write(*,1) 'analytic E1', dE1dRho
     290              :                write(*,1) 'numeric E1', (E1_0 - E1) / (Rho_0 - Rho)
     291              :                write(*,'(A)')
     292              :                write(*,1) 'analytic F1', dF1dRho
     293              :                write(*,1) 'numeric F1', (F1_0 - F1) / (Rho_0 - Rho)
     294              :                write(*,'(A)')
     295              :                write(*,1) 'analytic E2', dE2dRho
     296              :                write(*,1) 'numeric E2', (E2_0 - E2) / (Rho_0 - Rho)
     297              :                write(*,'(A)')
     298              :                write(*,1) 'analytic F2', dF2dRho
     299              :                write(*,1) 'numeric F2', (F2_0 - F2) / (Rho_0 - Rho)
     300              :                write(*,'(A)')
     301              :                call mesa_error(__FILE__,__LINE__,'FL_epsnuc_3alf')
     302              :             end if
     303              : 
     304              :          end if
     305              : 
     306              :       end subroutine FL_epsnuc_3alf
     307              : 
     308              :       end module pycno
        

Generated by: LCOV version 2.0-1