LCOV - code coverage report
Current view: top level - eos/private - create_EXCOR7_table.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 204 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_EXCOR7_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_EXCOR7_table
      30              :       private
      31              : 
      32              : 
      33              :    contains
      34              : 
      35            0 :    subroutine do_create_EXCOR7_table(fname)
      36              :       character (len=*), intent(in) :: fname
      37              :       real(dp) :: logRS, logRS_min, logRS_max, dlogRS
      38            0 :       real(dp) :: logGAME, logGAME_min, logGAME_max, dlogGAME
      39              :       integer :: nlogRS, nlogGAME, io_unit, i, j
      40            0 :       real(dp) :: RS, GAME, FXC, UXC, PXC, CVXC, SXC, PDTXC, PDRXC
      41              :       include 'formats'
      42              : 
      43            0 :       logRS_min = -3.5d0
      44            0 :       logRS_max = 0.0d0
      45            0 :       dlogRS = 1d-2
      46            0 :       nlogRS = (logRS_max - logRS_min)/dlogRS + 1
      47              : 
      48            0 :       logGAME_min = -2d0
      49            0 :       logGAME_max = 4d0
      50            0 :       dlogGAME = 1d-2
      51            0 :       nlogGAME = (logGAME_max - logGAME_min)/dlogGAME + 1
      52              : 
      53              :       !write(*,'(a)') 'create ' // trim(fname)
      54              : 
      55            0 :       open(newunit=io_unit,file=trim(fname))
      56              : 
      57            0 :       write(io_unit,'(99(a14))') 'num logRS', 'logRS min', 'logRS max', 'del logRS', &
      58            0 :             'num logGAME', 'logGAME min', 'logGAME max', 'del logGAME'
      59              : 
      60              :       write(io_unit,'(2(i10,4x,3(f14.4)),i10)') &
      61            0 :          nlogRS, logRS_min, logRS_max, dlogRS, &
      62            0 :          nlogGAME, logGAME_min, logGAME_max, dlogGAME, 0
      63              : 
      64            0 :       do i = 1, nlogRS
      65            0 :          logRS = logRS_min + (i-1) * dlogRS
      66            0 :          RS = exp10(logRS)
      67            0 :          write(io_unit,'(/,7x,a)') 'logRS'
      68            0 :          write(io_unit,'(2x,f14.6/)') logRS
      69              :          write(io_unit,'(99(a26))') &
      70            0 :             'logGAME', 'FXC', 'UXC', 'PXC', 'CVXC', 'SXC', 'PDTXC', 'PDRXC', 'RS', 'GAME'
      71            0 :          do j = 1, nlogGAME
      72            0 :             logGAME = logGAME_min + (j-1) * dlogGAME
      73            0 :             GAME = exp10(logGAME)
      74            0 :             if (is_bad(GAME)) then
      75            0 :                write(*,3) 'GAME', i, j, GAME, logGAME, logGAME_min, dlogGAME
      76              :             end if
      77            0 :             call EXCOR7(RS, GAME, FXC, UXC, PXC, CVXC, SXC, PDTXC, PDRXC)
      78              :             write(io_unit,'(99(1pd26.16))') &
      79            0 :                logGAME, FXC, UXC, PXC, CVXC, SXC, PDTXC, PDRXC, RS, GAME
      80              :          end do
      81            0 :          write(io_unit,*)
      82              :       end do
      83              : 
      84            0 :       write(io_unit,*)
      85            0 :       write(io_unit,*)
      86            0 :       close(io_unit)
      87              : 
      88            0 :    end subroutine do_create_EXCOR7_table
      89              : 
      90              : 
      91              : ! ==============  ELECTRON EXCHANGE AND CORRELATION   ================ *
      92            0 :       subroutine EXCOR7(RS,GAME,FXC,UXC,PXC,CVXC,SXC,PDTXC,PDRXC)
      93              : !                                                       Version 09.06.07
      94              : ! Exchange-correlation contribution for the electron gas
      95              : ! Stems from TANAKA1 v.03.03.96. Added derivatives.
      96              : ! Input: RS - electron density parameter =electron-sphere radius in a.u.
      97              : !        GAME - electron Coulomb coupling parameter
      98              : ! Output: FXC - excess free energy of e-liquid per kT per one electron
      99              : !             according to Tanaka & Ichimaru 85-87 and Ichimaru 93
     100              : !         UXC - internal energy contr.[per 1 electron, kT]
     101              : !         PXC - pressure contribution divided by (n_e kT)
     102              : !         CVXC - heat capacity divided by N_e k
     103              : !         SXC - entropy divided by N_e k
     104              : !         PDTXC,PDRXC = PXC + d ln PXC / d ln(T,\rho)
     105              :       real(dp), intent(in) :: RS, GAME
     106              :       real(dp), intent(out) :: FXC,UXC,PXC,CVXC,SXC,PDTXC,PDRXC
     107              : 
     108            0 :       real(dp) :: THETA, SQTH, THETA2, THETA3, THETA4, EXP1TH
     109            0 :       real(dp) :: CHT1, SHT1, CHT2, SHT2
     110            0 :       real(dp) :: T1, T2, T1DH, T1DHH, T2DH, T2DHH
     111            0 :       real(dp) :: A0, A0DH, A0DHH, A1, A1DH, A1DHH, A, AH, ADH, ADHH
     112            0 :       real(dp) :: B0, B0DH, B0DHH, B1, B1DH, B1DHH, B, BH, BDH, BDHH
     113            0 :       real(dp) :: C, CDH, CDHH, C3, C3DH, C3DHH
     114            0 :       real(dp) :: D0, D0DH, D0DHH, D1, D1DH, D1DHH, D, DH, DDH, DDHH
     115            0 :       real(dp) :: E0, E0DH, E0DHH, E1, E1DH, E1DHH, E, EH, EDH, EDHH
     116            0 :       real(dp) :: DISCR, DIDH, DIDHH
     117            0 :       real(dp) :: S1, S1H, S1DH, S1DHH, S1DG, S1DHG
     118            0 :       real(dp) :: B2, B2DH, B2DHH, SQGE, B3, B3DH, B3DHH
     119            0 :       real(dp) :: S2, S2H, S2DH, S2DHH, S2DG, S2DGG, S2DHG
     120            0 :       real(dp) :: R3, R3DH, R3DHH, R3DG, R3DGG, R3DHG
     121            0 :       real(dp) :: S3, S3DH, S3DHH, S3DG, S3DGG, S3DHG
     122            0 :       real(dp) :: B4, B4DH, B4DHH
     123            0 :       real(dp) :: C4, C4DH, C4DHH, C4DG, C4DGG, C4DHG
     124            0 :       real(dp) :: S4A, S4AH, S4ADH, S4ADHH
     125            0 :       real(dp) :: S4B, S4BDH, S4BDHH, UP1, DN1, UP2, DN2
     126            0 :       real(dp) :: S4C, S4CDH, S4CDHH, S4CDG, S4CDGG, S4CDHG
     127            0 :       real(dp) :: S4, S4DH, S4DHH, S4DG, S4DGG, S4DHG
     128            0 :       real(dp) :: FXCDH, FXCDHH, FXCDG, FXCDGG, FXCDHG
     129            0 :       real(dp) :: PDLH, PDLG
     130              :       include 'formats'
     131            0 :       THETA=0.543d0*RS/GAME  ! non-relativistic degeneracy parameter
     132            0 :       SQTH=sqrt(THETA)
     133            0 :       THETA2=THETA*THETA
     134            0 :       THETA3=THETA2*THETA
     135            0 :       THETA4=THETA3*THETA
     136            0 :       if (THETA>.005d0) then
     137            0 :          CHT1=cosh(1.d0/THETA)
     138            0 :          SHT1=sinh(1.d0/THETA)
     139            0 :          CHT2=cosh(1.d0/SQTH)
     140            0 :          SHT2=sinh(1.d0/SQTH)
     141            0 :          T1=SHT1/CHT1  ! dtanh(1.d0/THETA)
     142            0 :          T2=SHT2/CHT2  ! dtanh(1./sqrt(THETA))
     143            0 :          T1DH=-1.d0/((THETA*CHT1)*(THETA*CHT1))  ! d T1 / d\theta
     144            0 :          T1DHH=2.d0/pow3(THETA*CHT1)*(CHT1-SHT1/THETA)
     145            0 :          T2DH=-0.5d0*SQTH/((THETA*CHT2)*(THETA*CHT2))
     146            0 :          T2DHH=(0.75d0*SQTH*CHT2-0.5d0*SHT2)/pow3(THETA*CHT2)
     147              :       else
     148              :          T1=1.d0
     149              :          T2=1.d0
     150              :          T1DH=0.d0
     151              :          T2DH=0.d0
     152              :          T1DHH=0.d0
     153              :          T2DHH=0.d0
     154              :       end if
     155            0 :       A0=0.75d0+3.04363d0*THETA2-0.09227d0*THETA3+1.7035d0*THETA4
     156            0 :       A0DH=6.08726d0*THETA-0.27681d0*THETA2+6.814d0*THETA3
     157            0 :       A0DHH=6.08726d0-0.55362d0*THETA+20.442d0*THETA2
     158            0 :       A1=1d0+8.31051d0*THETA2+5.1105d0*THETA4
     159            0 :       A1DH=16.62102d0*THETA+20.442d0*THETA3
     160            0 :       A1DHH=16.62102d0+61.326d0*THETA2
     161            0 :       A=0.610887d0*A0/A1*T1  ! HF fit of Perrot and Dharma-wardana
     162            0 :       AH=A0DH/A0-A1DH/A1+T1DH/T1
     163            0 :       ADH=A*AH
     164              :       ADHH=ADH*AH+A*(A0DHH/A0-pow2(A0DH/A0)-A1DHH/A1+pow2(A1DH/A1) &
     165            0 :          + T1DHH/T1-pow2(T1DH/T1))
     166            0 :       B0=0.341308d0+12.070873d0*THETA2+1.148889d0*THETA4
     167            0 :       B0DH=24.141746d0*THETA+4.595556d0*THETA3
     168            0 :       B0DHH=24.141746d0+13.786668d0*THETA2
     169            0 :       B1=1d0+10.495346d0*THETA2+1.326623d0*THETA4
     170            0 :       B1DH=20.990692d0*THETA+5.306492d0*THETA3
     171            0 :       B1DHH=20.990692d0+15.919476d0*THETA2
     172            0 :       B=SQTH*T2*B0/B1
     173            0 :       BH=0.5d0/THETA+T2DH/T2+B0DH/B0-B1DH/B1
     174            0 :       BDH=B*BH
     175              :       BDHH=BDH*BH+B*(-0.5d0/THETA2+T2DHH/T2-pow2(T2DH/T2) &
     176            0 :          + B0DHH/B0-pow2(B0DH/B0)-B1DHH/B1+pow2(B1DH/B1))
     177            0 :       D0=0.614925d0+16.996055d0*THETA2+1.489056d0*THETA4
     178            0 :       D0DH=33.99211d0*THETA+5.956224d0*THETA3
     179            0 :       D0DHH=33.99211d0+17.868672d0*THETA2
     180            0 :       D1=1d0+10.10935d0*THETA2+1.22184d0*THETA4
     181            0 :       D1DH=20.2187d0*THETA+4.88736d0*THETA3
     182            0 :       D1DHH=20.2187d0+14.66208d0*THETA2
     183            0 :       D=SQTH*T2*D0/D1
     184            0 :       DH=0.5d0/THETA+T2DH/T2+D0DH/D0-D1DH/D1
     185            0 :       DDH=D*DH
     186              :       DDHH=DDH*DH+D*(-0.5d0/THETA2+T2DHH/T2-pow2(T2DH/T2) &
     187            0 :          + D0DHH/D0-pow2(D0DH/D0)-D1DHH/D1+pow2(D1DH/D1))
     188            0 :       E0=0.539409d0+2.522206d0*THETA2+0.178484d0*THETA4
     189            0 :       E0DH=5.044412d0*THETA+0.713936d0*THETA3
     190            0 :       E0DHH=5.044412d0+2.141808d0*THETA2
     191            0 :       E1=1d0+2.555501d0*THETA2+0.146319d0*THETA4
     192            0 :       E1DH=5.111002d0*THETA+0.585276d0*THETA3
     193            0 :       E1DHH=5.111002d0+1.755828d0*THETA2
     194            0 :       E=THETA*T1*E0/E1
     195            0 :       EH=1.d0/THETA+T1DH/T1+E0DH/E0-E1DH/E1
     196            0 :       EDH=E*EH
     197              :       EDHH=EDH*EH+E*(T1DHH/T1-pow2(T1DH/T1)+E0DHH/E0-pow2(E0DH/E0) &
     198            0 :          - E1DHH/E1+pow2(E1DH/E1)-1.0d0/THETA2)
     199            0 :       EXP1TH=exp(-1.d0/THETA)
     200            0 :       C=(0.872496d0+0.025248d0*EXP1TH)*E
     201            0 :       CDH=0.025248d0*EXP1TH/THETA2*E+C*EDH/E
     202              :       CDHH=0.025248d0*EXP1TH/THETA2*(EDH+(1.0d0-2.0d0*THETA)/THETA2*E) &
     203            0 :          + CDH*EDH/E+C*EDHH/E-C*pow2(EDH/E)
     204            0 :       DISCR=SQRT(4.0d0*E-D*D)
     205            0 :       DIDH=0.5d0/DISCR*(4.0d0*EDH-2.0d0*D*DDH)
     206            0 :       DIDHH=(-pow2((2.0d0*EDH-D*DDH)/DISCR)+2.0d0*EDHH-DDH*DDH-D*DDHH)/DISCR
     207            0 :       S1=-C/E*GAME
     208            0 :       S1H=CDH/C-EDH/E
     209            0 :       S1DH=S1*S1H
     210            0 :       S1DHH=S1DH*S1H+S1*(CDHH/C-pow2(CDH/C)-EDHH/E+pow2(EDH/E))
     211            0 :       S1DG=-C/E  ! => S1DGG=0
     212            0 :       S1DHG=S1DG*(CDH/C-EDH/E)
     213            0 :       B2=B-C*D/E
     214            0 :       B2DH=BDH-(CDH*D+C*DDH)/E+C*D*EDH/(E*E)
     215            0 :       B2DHH=BDHH-(CDHH*D+2d0*CDH*DDH+C*DDHH)/E+(2d0*(CDH*D+C*DDH-C*D*EDH/E)*EDH+C*D*EDHH)/(E*E)
     216            0 :       SQGE=SQRT(GAME)
     217            0 :       S2=-2.d0/E*B2*SQGE
     218            0 :       S2H=B2DH/B2-EDH/E
     219            0 :       S2DH=S2*S2H
     220            0 :       S2DHH=S2DH*S2H+S2*(B2DHH/B2-pow2(B2DH/B2)-EDHH/E+pow2(EDH/E))
     221            0 :       S2DG=0.5d0*S2/GAME
     222            0 :       S2DGG=-0.5d0*S2DG/GAME
     223            0 :       S2DHG=0.5d0*S2DH/GAME
     224            0 :       R3=E*GAME+D*SQGE+1.0d0
     225            0 :       R3DH=EDH*GAME+DDH*SQGE
     226            0 :       R3DHH=EDHH*GAME+DDHH*SQGE
     227            0 :       R3DG=E+0.5d0*D/SQGE
     228            0 :       R3DGG=-0.25d0*D/(GAME*SQGE)
     229            0 :       R3DHG=EDH+0.5d0*DDH/SQGE
     230            0 :       B3=A-C/E
     231            0 :       B3DH=ADH-CDH/E+C*EDH/(E*E)
     232            0 :       B3DHH=ADHH-CDHH/E+(2.0d0*CDH*EDH+C*EDHH)/(E*E)-2d0*C*EDH*EDH/pow3(E)
     233            0 :       C3=(D/E*B2-B3)/E
     234            0 :       C3DH=(DDH*B2+D*B2DH+B3*EDH)/(E*E)-2d0*D*B2*EDH/pow3(E)-B3DH/E
     235              :       C3DHH=(-B3DHH &
     236              :          + (DDHH*B2+2d0*DDH*B2DH+D*B2DHH+B3DH*EDH+B3*EDHH+B3DH*EDH)/E &
     237              :          - 2.0d0*((DDH*B2+D*B2DH+B3*EDH+DDH*B2+D*B2DH)*EDH+D*B2*EDHH)/(E*E) &
     238            0 :          + 6.0d0*D*B2*EDH*EDH/pow3(E))/E
     239            0 :       S3=C3*log(R3)
     240            0 :       S3DH=S3*C3DH/C3+C3*R3DH/R3
     241              :       S3DHH=(S3DH*C3DH+S3*C3DHH)/C3-S3*pow2(C3DH/C3) &
     242            0 :          + (C3DH*R3DH+C3*R3DHH)/R3-C3*pow2(R3DH/R3)
     243            0 :       S3DG=C3*R3DG/R3
     244            0 :       S3DGG=C3*(R3DGG/R3-pow2(R3DG/R3))
     245            0 :       S3DHG=(C3DH*R3DG+C3*R3DHG)/R3-C3*R3DG*R3DH/(R3*R3)
     246            0 :       B4=2.d0-D*D/E
     247            0 :       B4DH=EDH*(D/E)*(D/E)-2d0*D*DDH/E
     248              :       B4DHH=EDHH*(D/E)*(D/E)+2d0*EDH*(D/E)*(D/E)*(DDH/D-EDH/E) &
     249            0 :          - 2d0*(DDH*DDH+D*DDHH)/E+2d0*D*DDH*EDH/(E*E)
     250            0 :       C4=2d0*E*SQGE+D
     251            0 :       C4DH=2d0*EDH*SQGE+DDH
     252            0 :       C4DHH=2d0*EDHH*SQGE+DDHH
     253            0 :       C4DG=E/SQGE
     254            0 :       C4DGG=-0.5d0*E/(GAME*SQGE)
     255            0 :       C4DHG=EDH/SQGE
     256            0 :       S4A=2.0d0/E/DISCR
     257            0 :       S4AH=EDH/E+DIDH/DISCR
     258            0 :       S4ADH=-S4A*S4AH
     259            0 :       S4ADHH=-S4ADH*S4AH - S4A*(EDHH/E-(EDH/E)*(EDH/E)+DIDHH/DISCR-pow2(DIDH/DISCR))
     260            0 :       S4B=D*B3+B4*B2
     261            0 :       S4BDH=DDH*B3+D*B3DH+B4DH*B2+B4*B2DH
     262            0 :       S4BDHH=DDHH*B3+2d0*DDH*B3DH+D*B3DHH+B4DHH*B2+2d0*B4DH*B2DH+B4*B2DHH
     263            0 :       S4C=atan(C4/DISCR)-atan(D/DISCR)
     264            0 :       UP1=C4DH*DISCR-C4*DIDH
     265            0 :       DN1=DISCR*DISCR+C4*C4
     266            0 :       UP2=DDH*DISCR-D*DIDH
     267            0 :       DN2=DISCR*DISCR+D*D
     268            0 :       S4CDH=UP1/DN1-UP2/DN2
     269              :       S4CDHH=(C4DHH*DISCR-C4*DIDHH)/DN1 &
     270              :          - UP1*2d0*(DISCR*DIDH+C4*C4DH)/(DN1*DN1) &
     271            0 :          - (DDHH*DISCR-D*DIDHH)/DN2+UP2*2d0*(DISCR*DIDH+D*DDH)/(DN2*DN2)
     272            0 :       S4CDG=C4DG*DISCR/DN1
     273            0 :       S4CDGG=C4DGG*DISCR/DN1-2d0*C4*DISCR*pow2(C4DG/DN1)
     274            0 :       S4CDHG=(C4DHG*DISCR+C4DG*DIDH-C4DG*DISCR/DN1*2d0*(DISCR*DIDH+C4*C4DH))/DN1
     275            0 :       S4=S4A*S4B*S4C
     276            0 :       S4DH=S4ADH*S4B*S4C+S4A*S4BDH*S4C+S4A*S4B*S4CDH
     277              :       S4DHH=S4ADHH*S4B*S4C+S4A*S4BDHH*S4C+S4A*S4B*S4CDHH &
     278            0 :          + 2d0*(S4ADH*S4BDH*S4C+S4ADH*S4B*S4CDH+S4A*S4BDH*S4CDH)
     279            0 :       S4DG=S4A*S4B*S4CDG
     280            0 :       S4DGG=S4A*S4B*S4CDGG
     281            0 :       S4DHG=S4A*S4B*S4CDHG+S4CDG*(S4ADH*S4B+S4A*S4BDH)
     282            0 :       FXC=S1+S2+S3+S4
     283            0 :       FXCDH=S1DH+S2DH+S3DH+S4DH
     284            0 :       FXCDG=S1DG+S2DG+S3DG+S4DG
     285            0 :       FXCDHH=S1DHH+S2DHH+S3DHH+S4DHH
     286            0 :       FXCDGG=S2DGG+S3DGG+S4DGG
     287            0 :       FXCDHG=S1DHG+S2DHG+S3DHG+S4DHG
     288            0 :       PXC=(GAME*FXCDG-2d0*THETA*FXCDH)/3.d0
     289            0 :       UXC=GAME*FXCDG-THETA*FXCDH
     290            0 :       SXC=(GAME*S2DG-S2+GAME*S3DG-S3+S4A*S4B*(GAME*S4CDG-S4C))-THETA*FXCDH
     291            0 :       if (abs(SXC)<1.d-9*abs(THETA*FXCDH)) SXC=0.d0  ! accuracy loss
     292            0 :       CVXC=2d0*THETA*(GAME*FXCDHG-FXCDH)-THETA*THETA*FXCDHH-GAME*GAME*FXCDGG
     293            0 :       if (abs(CVXC)<1.d-9*abs(GAME*GAME*FXCDGG)) CVXC=0.d0  ! accuracy
     294            0 :       PDLH=THETA*(GAME*FXCDHG-2d0*FXCDH-2d0*THETA*FXCDHH)/3.d0
     295            0 :       PDLG=GAME*(FXCDG+GAME*FXCDGG-2d0*THETA*FXCDHG)/3.d0
     296            0 :       PDRXC=PXC+(PDLG-2d0*PDLH)/3.d0
     297            0 :       PDTXC=GAME*(THETA*FXCDHG-GAME*FXCDGG/3.d0)-THETA*(FXCDH/0.75d0+THETA*FXCDHH/1.5d0)
     298            0 :       return
     299              :       end subroutine EXCOR7
     300              : 
     301              : 
     302              :       end module create_EXCOR7_table
        

Generated by: LCOV version 2.0-1