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

            Line data    Source code
       1              : ! ***********************************************************************
       2              : !
       3              : !   Copyright (C) 2020  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 create_FSCRliq8_table
      21              : 
      22              :       use const_def, only: dp
      23              :       use chem_def
      24              :       use utils_lib, only: is_bad
      25              :       use math_lib
      26              : 
      27              :       implicit none
      28              : 
      29              :       public :: do_create_FSCRliq8_table
      30              :       private
      31              : 
      32              : 
      33              :    contains
      34              : 
      35              : 
      36            0 :    subroutine do_create_FSCRliq8_table(fname,iZion)
      37              :       character (len=*), intent(in) :: fname
      38              :       integer, intent(in) :: iZion
      39              :       real(dp) :: logRS, logRS_min, logRS_max, dlogRS
      40            0 :       real(dp) :: logGAME, logGAME_min, logGAME_max, dlogGAME
      41              :       integer :: nlogRS, nlogGAME, io_unit, i, j, ierr
      42            0 :       real(dp) :: Zion, RS, GAME, FSCR, USCR, PSCR, CVSCR, PDTSCR, PDRSCR
      43              :       include 'formats'
      44              : 
      45            0 :       Zion = iZion
      46              : 
      47            0 :       logRS_min = -3.5d0
      48            0 :       logRS_max = 0.0d0
      49            0 :       dlogRS = 1d-2
      50            0 :       nlogRS = (logRS_max - logRS_min)/dlogRS + 1
      51              : 
      52            0 :       logGAME_min = -2d0
      53            0 :       logGAME_max = 4d0
      54            0 :       dlogGAME = 1d-2
      55            0 :       nlogGAME = (logGAME_max - logGAME_min)/dlogGAME + 1
      56              : 
      57            0 :       io_unit = 40
      58              : 
      59              :       !write(*,'(a)') 'create ' // trim(fname)
      60              : 
      61            0 :       open(unit=io_unit,file=trim(fname))
      62              : 
      63            0 :       write(io_unit,'(99(a14))') 'num logRS', 'logRS min', 'logRS max', 'del logRS', &
      64            0 :             'num logGAME', 'logGAME min', 'logGAME max', 'del logGAME', 'Zion'
      65              : 
      66              :       write(io_unit,'(2(i10,4x,3(f14.4)),i14)') &
      67            0 :          nlogRS, logRS_min, logRS_max, dlogRS, &
      68            0 :          nlogGAME, logGAME_min, logGAME_max, dlogGAME, iZion
      69              : 
      70            0 :       do i = 1, nlogRS
      71            0 :          logRS = logRS_min + (i-1) * dlogRS
      72            0 :          RS = exp10(logRS)
      73            0 :          write(io_unit,'(/,7x,a)') 'logRS'
      74            0 :          write(io_unit,'(2x,f14.6/)') logRS
      75              :          write(io_unit,'(99(a26))') &
      76            0 :             'logGAME', 'FSCR', 'USCR', 'PSCR', 'CVSCR', 'PDTSCR', 'PDRSCR', 'RS', 'GAME'
      77            0 :          do j = 1, nlogGAME
      78            0 :             logGAME = logGAME_min + (j-1) * dlogGAME
      79            0 :             GAME = exp10(logGAME)
      80            0 :             if (is_bad(GAME)) then
      81            0 :                write(*,3) 'GAME', i, j, GAME, logGAME, logGAME_min, dlogGAME
      82              :             end if
      83              :             ierr = 0
      84            0 :             call FSCRliq8(RS, GAME, Zion, FSCR, USCR, PSCR, CVSCR, PDTSCR, PDRSCR, ierr)
      85            0 :             if (ierr /= 0) then
      86            0 :                write(*,*) 'FSCRliq8 error'
      87            0 :                write(*,1) 'RS', RS
      88            0 :                write(*,1) 'GAME', GAME
      89            0 :                write(*,1) 'Zion', Zion
      90            0 :                call mesa_error(__FILE__,__LINE__,'do_create_FSCRliq8_table')
      91              :             end if
      92              :             write(io_unit,'(99(1pd26.16))') &
      93            0 :                logGAME, FSCR, USCR, PSCR, CVSCR, PDTSCR, PDRSCR, RS, GAME
      94              :          end do
      95            0 :          write(io_unit,*)
      96              :       end do
      97              : 
      98            0 :       write(io_unit,*)
      99            0 :       write(io_unit,*)
     100            0 :       close(io_unit)
     101              : 
     102            0 :    end subroutine do_create_FSCRliq8_table
     103              : 
     104              : 
     105            0 :       subroutine FSCRliq8(RS,GAME,Zion, &
     106              :            FSCR,USCR,PSCR,CVSCR,PDTSCR,PDRSCR,ierr)  ! fit to the el.-ion scr.
     107              : !                                                       Version 11.09.08
     108              : !                                                       cleaned 16.06.09
     109              : ! Stems from FSCRliq7 v. 09.06.07. Included a check for RS=0.
     110              : !   INPUT: RS - density parameter, GAME - electron Coulomb parameter,
     111              : !          Zion - ion charge number,
     112              : !   OUTPUT: FSCR - screening (e-i) free energy per kT per 1 ion,
     113              : !           USCR - internal energy per kT per 1 ion (screen.contrib.)
     114              : !           PSCR - pressure divided by (n_i kT) (screen.contrib.)
     115              : !           CVSCR - heat capacity per 1 ion (screen.contrib.)
     116              : !           PDTSCR,PDRSCR = PSCR + d PSCR / d ln(T,\rho)
     117              :       real(dp), intent(in) :: RS,GAME
     118              :       real(dp), intent(in) :: Zion
     119              :       real(dp), intent(out) :: FSCR,USCR,PSCR,CVSCR,PDTSCR,PDRSCR
     120              :       integer, intent(out) :: ierr
     121              : 
     122            0 :       real(dp) :: SQG, SQR, SQZ1, SQZ, CDH0, CDH, ZLN, Z13
     123            0 :       real(dp) :: X, CTF, P01, P03, PTX
     124            0 :       real(dp) :: TX, TXDG, TXDGG, TY1, TY1DG, TY1DGG
     125            0 :       real(dp) :: TY2, TY2DX, TY2DXX, TY, TYX, TYDX, TYDG, P1
     126            0 :       real(dp) :: COR1, COR1DX, COR1DG, COR1DXX, COR1DGG, COR1DXG
     127            0 :       real(dp) :: U0, U0DX, U0DG, U0DXX, U0DGG, U0DXG
     128            0 :       real(dp) :: D0DG, D0, D0DX, D0DXX
     129            0 :       real(dp) :: COR0, COR0DX, COR0DG, COR0DXX, COR0DGG, COR0DXG
     130            0 :       real(dp) :: RELE, Q1, Q2, H1U, H1D, H1, H1X, H1DX, H1DXX
     131            0 :       real(dp) :: UP, UPDX, UPDG, UPDXX, UPDGG, UPDXG
     132            0 :       real(dp) :: DN1, DN1DX, DN1DG, DN1DXX, DN1DGG, DN1DXG
     133            0 :       real(dp) :: DN, DNDX, DNDG, DNDXX, DNDGG, DNDXG
     134            0 :       real(dp) :: FX, FXDG, FDX, FG, FDG, FDGDH, FDXX, FDGG, FDXG
     135              : 
     136              :       real(dp), parameter :: XRS=.0140047d0
     137              :       real(dp), parameter :: TINY=1.d-19
     138              : 
     139            0 :       ierr = 0
     140            0 :       if (RS<0d0) then
     141            0 :          ierr = -1
     142            0 :          return
     143              :          !call mesa_error(__FILE__,__LINE__,'FSCRliq8: RS < 0')
     144              :       end if
     145            0 :       if (RS<TINY) then
     146            0 :          FSCR=0.d0
     147            0 :          USCR=0.d0
     148            0 :          PSCR=0.d0
     149            0 :          CVSCR=0.d0
     150            0 :          PDTSCR=0.d0
     151            0 :          PDRSCR=0.d0
     152            0 :          return
     153              :       end if
     154            0 :       SQG=sqrt(GAME)
     155            0 :       SQR=sqrt(RS)
     156            0 :       SQZ1=sqrt(1d0+Zion)
     157            0 :       SQZ=sqrt(Zion)
     158            0 :       CDH0=Zion/1.73205d0  ! 1.73205=sqrt(3.)
     159            0 :       CDH=CDH0*(SQZ1*SQZ1*SQZ1-SQZ*SQZ*SQZ-1d0)
     160            0 :       SQG=sqrt(GAME)
     161            0 :       ZLN=log(Zion)
     162            0 :       Z13=exp(ZLN/3.d0)  ! Zion**(1./3.)
     163            0 :       X=XRS/RS  ! relativity parameter
     164            0 :       CTF=Zion*Zion*.2513d0*(Z13-1d0+.2d0/sqrt(Z13))
     165              : ! Thomas-Fermi constant; .2513=(18/175)(12/\pi)^{2/3}
     166            0 :       P01=1.11d0*exp(0.475d0*ZLN)
     167            0 :       P03=0.2d0+0.078d0*ZLN*ZLN
     168            0 :       PTX=1.16d0+0.08d0*ZLN
     169            0 :       TX=pow(GAME,PTX)
     170            0 :       TXDG=PTX*TX/GAME
     171            0 :       TXDGG=(PTX-1.d0)*TXDG/GAME
     172            0 :       TY1=1d0/(1.d-3*Zion*Zion+2d0*GAME)
     173            0 :       TY1DG=-2d0*TY1*TY1
     174            0 :       TY1DGG=-4d0*TY1*TY1DG
     175            0 :       TY2=1d0+6d0*RS*RS
     176            0 :       TY2DX=-12d0*RS*RS/X
     177            0 :       TY2DXX=-3d0*TY2DX/X
     178            0 :       TY=RS*RS*RS/TY2*(1d0+TY1)
     179            0 :       TYX=3d0/X+TY2DX/TY2
     180            0 :       TYDX=-TY*TYX
     181            0 :       TYDG=RS*RS*RS*TY1DG/TY2
     182            0 :       P1=(Zion-1d0)/9d0
     183            0 :       COR1=1d0+P1*TY
     184            0 :       COR1DX=P1*TYDX
     185            0 :       COR1DG=P1*TYDG
     186            0 :       COR1DXX=P1*(TY*(3d0/(X*X)+(TY2DX/TY2)*(TY2DX/TY2)-TY2DXX/TY2)-TYDX*TYX)
     187            0 :       COR1DGG=P1*RS*RS*RS*TY1DGG/TY2
     188            0 :       COR1DXG=-P1*TYDG*TYX
     189            0 :       U0=0.78d0*sqrt(GAME/Zion)*RS*RS*RS
     190            0 :       U0DX=-3d0*U0/X
     191            0 :       U0DG=.5d0*U0/GAME
     192            0 :       U0DXX=-4.d0*U0DX/X
     193            0 :       U0DGG=-.5d0*U0DG/GAME
     194            0 :       U0DXG=-3.d0*U0DG/X
     195            0 :       D0DG=Zion*Zion*Zion
     196            0 :       D0=GAME*D0DG+21d0*RS*RS*RS
     197            0 :       D0DX=-63d0*RS*RS*RS/X
     198            0 :       D0DXX=252d0*RS*RS*RS/(X*X)
     199            0 :       COR0=1d0+U0/D0
     200            0 :       COR0DX=(U0DX-U0*D0DX/D0)/D0
     201            0 :       COR0DG=(U0DG-U0*D0DG/D0)/D0
     202            0 :       COR0DXX=(U0DXX-(2d0*U0DX*D0DX+U0*D0DXX)/D0+2d0*(D0DX/D0)*(D0DX/D0))/D0
     203            0 :       COR0DGG=(U0DGG-2d0*U0DG*D0DG/D0+2d0*U0*(D0DG/D0)*(D0DG/D0))/D0
     204            0 :       COR0DXG=(U0DXG-(U0DX*D0DG+U0DG*D0DX)/D0+2d0*U0*D0DX*D0DG/(D0*D0))/D0
     205              : ! Relativism:
     206            0 :       RELE=sqrt(1.d0+X*X)
     207            0 :       Q1=0.18d0/sqrt(sqrt(Zion))
     208            0 :       Q2=0.2d0+0.37d0/sqrt(Zion)
     209            0 :       H1U=1d0+X*X/5.d0
     210            0 :       H1D=1d0+Q1*X+Q2*X*X
     211            0 :       H1=H1U/H1D
     212            0 :       H1X=0.4d0*X/H1U-(Q1+2d0*Q2*X)/H1D
     213            0 :       H1DX=H1*H1X
     214              :       H1DXX=H1DX*H1X &
     215            0 :          + H1*(0.4d0/H1U-(0.4d0*X/H1U)*(0.4d0*X/H1U)-2d0*Q2/H1D+pow2((Q1+2d0*Q2*X)/H1D))
     216            0 :       UP=CDH*SQG+P01*CTF*TX*COR0*H1
     217            0 :       UPDX=P01*CTF*TX*(COR0DX*H1+COR0*H1DX)
     218            0 :       UPDG=.5d0*CDH/SQG+P01*CTF*(TXDG*COR0+TX*COR0DG)*H1
     219            0 :       UPDXX=P01*CTF*TX*(COR0DXX*H1+2d0*COR0DX*H1DX+COR0*H1DXX)
     220              :       UPDGG=-.25d0*CDH/(SQG*GAME) &
     221            0 :          + P01*CTF*(TXDGG*COR0+2d0*TXDG*COR0DG+TX*COR0DGG)*H1
     222              :       UPDXG=P01*CTF*(TXDG*(COR0DX*H1+COR0*H1DX) &
     223            0 :         + TX*(COR0DXG*H1+COR0DG*H1DX))
     224            0 :       DN1=P03*SQG+P01/RS*TX*COR1
     225            0 :       DN1DX=P01*TX*(COR1/XRS+COR1DX/RS)
     226            0 :       DN1DG=.5d0*P03/SQG+P01/RS*(TXDG*COR1+TX*COR1DG)
     227            0 :       DN1DXX=P01*TX/XRS*(2d0*COR1DX+X*COR1DXX)
     228              :       DN1DGG=-.25d0*P03/(GAME*SQG) &
     229            0 :          + P01/RS*(TXDGG*COR1+2d0*TXDG*COR1DG+TX*COR1DGG)
     230            0 :       DN1DXG=P01*(TXDG*(COR1/XRS+COR1DX/RS)+TX*(COR1DG/XRS+COR1DXG/RS))
     231            0 :       DN=1d0+DN1/RELE
     232            0 :       DNDX=DN1DX/RELE-X*DN1/(RELE*RELE*RELE)
     233            0 :       DNDXX=(DN1DXX-((2d0*X*DN1DX+DN1)-3.d0*X*X*DN1/(RELE*RELE))/(RELE*RELE))/RELE
     234            0 :       DNDG=DN1DG/RELE
     235            0 :       DNDGG=DN1DGG/RELE
     236            0 :       DNDXG=DN1DXG/RELE-X*DN1DG/(RELE*RELE*RELE)
     237            0 :       FSCR=-UP/DN*GAME
     238            0 :       FX=(UP*DNDX/DN-UPDX)/DN
     239            0 :       FXDG=((UPDG*DNDX+UPDX*DNDG+UP*DNDXG-2d0*UP*DNDX*DNDG/DN)/DN-UPDXG)/DN
     240            0 :       FDX=FX*GAME
     241            0 :       FG=(UP*DNDG/DN-UPDG)/DN
     242            0 :       FDG=FG*GAME-UP/DN
     243            0 :       FDGDH=SQG*DNDG/(DN*DN)  ! d FDG / d CDH
     244            0 :       FDXX=((UP*DNDXX+2d0*(UPDX*DNDX-UP*DNDX*DNDX/DN))/DN-UPDXX)/DN*GAME
     245            0 :       FDGG=2d0*FG+GAME*((2d0*DNDG*(UPDG-UP*DNDG/DN)+UP*DNDGG)/DN-UPDGG)/DN
     246            0 :       FDXG=FX+GAME*FXDG
     247            0 :       USCR=GAME*FDG
     248            0 :       CVSCR=-GAME*GAME*FDGG
     249            0 :       PSCR=(X*FDX+GAME*FDG)/3.d0
     250            0 :       PDTSCR=-GAME*GAME*(X*FXDG+FDGG)/3.d0
     251            0 :       PDRSCR=(12d0*PSCR+X*X*FDXX+2d0*X*GAME*FDXG+GAME*GAME*FDGG)/9d0
     252            0 :       return
     253              :       end subroutine FSCRliq8
     254              : 
     255              : 
     256              :       end module create_FSCRliq8_table
        

Generated by: LCOV version 2.0-1