LCOV - code coverage report
Current view: top level - eos/private - skye_ideal.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 328 328
Test Date: 2025-05-08 18:23:42 Functions: 100.0 % 4 4

            Line data    Source code
       1              : ! ***********************************************************************
       2              : !
       3              : !   Copyright (C) 2010  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 skye_ideal
      21              : 
      22              :    use math_lib
      23              :    use auto_diff
      24              :    use const_def, only: dp, pi, amu, planck_h, avo, crad, kerg
      25              : 
      26              :    implicit none
      27              : 
      28              :    private
      29              :    public :: compute_F_rad
      30              :    public :: compute_F_ideal_ion
      31              :    public :: compute_xne
      32              :    public :: compute_ideal_ele
      33              : 
      34              :    real(dp), parameter :: sifac  = planck_h * planck_h * planck_h / (2d0 * pi * amu * sqrt(2d0 * pi * amu))
      35              : 
      36              :    logical, parameter :: dbg = .false.
      37              : 
      38              :    contains
      39              : 
      40        91040 :    type(auto_diff_real_2var_order3) function compute_F_rad(temp, den) result(Frad)
      41              :       type(auto_diff_real_2var_order3), intent(in) :: temp, den
      42              : 
      43              :       ! F = - P / rho
      44        45520 :       Frad = -crad * pow4(temp) / (3d0 * den)
      45              : 
      46        45520 :    end function compute_F_rad
      47              : 
      48        45520 :    type(auto_diff_real_2var_order3) function compute_F_ideal_ion(temp, den, abar, species, weights, ya) result(F_ideal_ion)
      49              :       type(auto_diff_real_2var_order3), intent(in) :: temp, den
      50              :       integer, intent(in) :: species
      51              :       real(dp), intent(in) :: weights(species), ya(species), abar
      52              : 
      53              :       integer :: j
      54              :       type(auto_diff_real_2var_order3) :: n, nj, nQ, nQj
      55              :       type(auto_diff_real_2var_order3) :: y, yy, z
      56              :       type(auto_diff_real_2var_order3) :: kt, xni, etaion
      57              : 
      58              :       ! Helper quantity
      59        45520 :       kt = kerg * temp
      60        45520 :       n = den / (amu * abar)  ! Number density of ions
      61        45520 :       nQ = pow(kT, 1.5d0) / sifac  ! Quantum density for a 1-amu species
      62              : 
      63        45520 :       F_ideal_ion = 0d0
      64       356434 :       do j=1,species
      65       310914 :          nj = ya(j) * n
      66       310914 :          nQj = nQ * pow(weights(j), 1.5d0)
      67       356434 :          F_ideal_ion = F_ideal_ion + ya(j) * (log(nj / nQj) - 1d0)
      68              :       end do
      69        45520 :       F_ideal_ion = F_ideal_ion * kt / (amu * abar)
      70              : 
      71        45520 :    end function compute_F_ideal_ion
      72              : 
      73        45520 :    type(auto_diff_real_2var_order3) function compute_xne(den, ytot1, zbar) result(xne)
      74              :       type(auto_diff_real_2var_order3), intent(in) :: den
      75              :       real(dp), intent(in) :: ytot1, zbar
      76              :       type(auto_diff_real_2var_order3) :: xni
      77              : 
      78              :       ! xne is the electron density due to matter, and so is proportional to density and independent of temperature
      79              :       ! for a fully ionized system.
      80        45520 :       xni     = avo * ytot1 * den
      81        45520 :       xne    = xni * zbar
      82              : 
      83        45520 :    end function compute_xne
      84              : 
      85        45520 :    subroutine compute_ideal_ele(temp_in, den_in, din_in, logtemp_in, logden_in, &
      86              :                                 zbar, ytot1, ye, ht, F, adr_etaele, adr_xnefer, ierr)
      87              :       use helm_polynomials
      88              :       use eos_def
      89              :       real(dp), intent(in) :: temp_in, den_in, din_in, logtemp_in, logden_in, zbar, ytot1, ye
      90              :       type (Helm_Table), pointer, intent(in) :: ht
      91              : 
      92              :       ! Intermediates
      93        45520 :       real(dp) :: x, y, z, ww, zz, xni
      94        91040 :       real(dp) :: temp, den, din, logtemp, logden
      95              :       integer :: k
      96              : 
      97              :       !..for the interpolations
      98              :       integer          :: iat, jat
      99              :       real(dp) :: dth, dt2, dti, dt2i, dt3i, dd, &
     100      1684240 :                        xt, xd, mxt, mxd, fi(36), &
     101        45520 :                        dindd, dinda, dindz, dindda, dinddz, dindaa, &
     102        45520 :                        dindaz, dindzz, dinddaa, dinddaz, &
     103              :                        w0t, w1t, w2t, w0mt, w1mt, w2mt, &
     104              :                        w0d, w1d, w2d, w0md, w1md, w2md, &
     105              :                        dpepdd_in, dpepddd_in, dpepddt_in
     106              : 
     107        45520 :       real(dp) :: si0t, si1t, si2t, si0mt, si1mt, si2mt, &
     108        45520 :                        si0d, si1d, si2d, si0md, si1md, si2md, &
     109        45520 :                        dsi0t, dsi1t, dsi2t, dsi0mt, dsi1mt, dsi2mt, &
     110        45520 :                        dsi0d, dsi1d, dsi2d, dsi0md, dsi1md, dsi2md, &
     111        45520 :                        ddsi0t, ddsi1t, ddsi2t, ddsi0mt, ddsi1mt, ddsi2mt, &
     112        45520 :                        ddsi0d, ddsi1d, ddsi2d, ddsi0md, ddsi1md, ddsi2md, &
     113        45520 :                        dddsi0t, dddsi1t, dddsi2t, &
     114        45520 :                        dddsi0mt, dddsi1mt, dddsi2mt, &
     115        45520 :                        dddsi0d, dddsi1d, dddsi2d, &
     116        45520 :                        dddsi0md, dddsi1md, dddsi2md
     117              : 
     118              :       ! For some results we don't need, but which helm_electron_positron.dek computes
     119              :       integer :: elemult
     120              : 
     121        45520 :       real(dp) :: detada,detadz
     122        45520 :       real(dp) :: detadda,detaddz
     123        45520 :       real(dp) :: detadta,detadtz,detadaa,detadaz,detadzz
     124        45520 :       real(dp) :: detadddd, detadddt, detaddtt, detadttt
     125              : 
     126              :       real(dp) :: dpepda,dpepdz
     127              :       real(dp) :: dpepdda,dpepddz
     128              :       real(dp) :: dpepdta,dpepdtz,dpepdaa
     129              :       real(dp) :: dpepdaz,dpepdzz
     130              :       real(dp) :: deepda,deepdz
     131              :       real(dp) :: deepdda,deepddz
     132              :       real(dp) :: deepdta,deepdtz,deepdaa
     133              :       real(dp) :: deepdaz,deepdzz
     134              :       real(dp) :: dsepda,dsepdz
     135              :       real(dp) :: dsepdda,dsepddz
     136              :       real(dp) :: dsepdta,dsepdtz,dsepdaa
     137              :       real(dp) :: dsepdaz,dsepdzz
     138              : 
     139              :       real(dp) :: etapos,zeff
     140              : 
     141              :       real(dp) :: dpeledd,dpeledt,dpeleda,dpeledz
     142              :       real(dp) :: dpeleddd,dpeleddt,dpeledda,dpeleddz
     143              :       real(dp) :: dpeledtt,dpeledta,dpeledtz,dpeledaa
     144              :       real(dp) :: dpeledaz,dpeledzz
     145              :       real(dp) :: deeledd,deeledt,deeleda,deeledz
     146              :       real(dp) :: deeleddd,deeleddt,deeledda,deeleddz
     147              :       real(dp) :: deeledtt,deeledta,deeledtz,deeledaa
     148              :       real(dp) :: deeledaz,deeledzz
     149              :       real(dp) :: dseledd,dseledt,dseleda,dseledz
     150              :       real(dp) :: dseleddd,dseleddt,dseledda,dseleddz
     151              :       real(dp) :: dseledtt,dseledta,dseledtz,dseledaa
     152              :       real(dp) :: dseledaz,dseledzz
     153              : 
     154              :       real(dp) :: ppos,dpposdd,dpposdt,dpposda,dpposdz
     155              :       real(dp) :: dpposddd,dpposddt,dpposdda,dpposddz
     156              :       real(dp) :: dpposdtt,dpposdta,dpposdtz,dpposdaa
     157              :       real(dp) :: dpposdaz,dpposdzz
     158              :       real(dp) :: epos,deposdd,deposdt,deposda,deposdz
     159              :       real(dp) :: deposddd,deposddt,deposdda,deposddz
     160              :       real(dp) :: deposdtt,deposdta,deposdtz,deposdaa
     161              :       real(dp) :: deposdaz,deposdzz
     162              :       real(dp) :: spos,dsposdd,dsposdt,dsposda,dsposdz
     163              :       real(dp) :: dsposddd,dsposddt,dsposdda,dsposddz
     164              :       real(dp) :: dsposdtt,dsposdta,dsposdtz,dsposdaa
     165              :       real(dp) :: dsposdaz,dsposdzz
     166              : 
     167              :       real(dp) :: xne
     168        45520 :       real(dp) :: dxnedd,dxnedt,dxneda,dxnedz
     169        45520 :       real(dp) :: dxneddd,dxneddt,dxnedda,dxneddz
     170        45520 :       real(dp) :: dxnedtt,dxnedta,dxnedtz,dxnedaa
     171        45520 :       real(dp) :: dxnedaz,dxnedzz
     172              : 
     173        45520 :       real(dp) :: xnefer,dxneferdd,dxneferdt,dxneferda,dxneferdz
     174              :       real(dp) :: dxneferddd,dxneferddt,dxneferdda,dxneferddz
     175              :       real(dp) :: dxneferdtt,dxneferdta,dxneferdtz,dxneferdaa
     176              :       real(dp) :: dxneferdaz,dxneferdzz
     177              :       real(dp) :: xnpfer,dxnpferdd,dxnpferdt,dxnpferda,dxnpferdz
     178              :       real(dp) :: dxnpferddd,dxnpferddt,dxnpferdda,dxnpferddz
     179              :       real(dp) :: dxnpferdtt,dxnpferdta,dxnpferdtz,dxnpferdaa
     180              :       real(dp) :: dxnpferdaz,dxnpferdzz
     181        45520 :       real(dp) :: dxneferdddd, dxneferdddt, dxneferddtt, dxneferdttt
     182        45520 :       real(dp) :: dxneferddda, dxneferdtta, dxneferddta
     183        45520 :       real(dp) :: dxneferdddz, dxneferdttz, dxneferddtz
     184        45520 :       real(dp) :: detaddda, detadtta, detaddta
     185        45520 :       real(dp) :: detadddz, detadttz, detaddtz
     186              : 
     187              :       ! Results we do need
     188        45520 :       real(dp) :: free, df_d, df_t, df_dd, df_tt, df_dt, &
     189        45520 :                        df_ttt, df_dtt, df_ddt, df_ddd
     190        45520 :       real(dp) :: etaele,detadd,detadt
     191        45520 :       real(dp) :: detaddd,detaddt,detadtt
     192              :       type(auto_diff_real_2var_order3), intent(out) :: adr_etaele, adr_xnefer, F
     193              : 
     194              :       integer, intent(out) :: ierr
     195              : 
     196              : 
     197        45520 :       temp = temp_in
     198        45520 :       logtemp = logtemp_in
     199        45520 :       den = den_in
     200        45520 :       logden = logden_in
     201        45520 :       din = din_in
     202              : 
     203              : 
     204              : !..density derivatives
     205        45520 :         dindd   = ye
     206        45520 :         dinda   = -din*ytot1
     207        45520 :         dindz   = den*ytot1
     208        45520 :         dindda  = -ye*ytot1
     209        45520 :         dinddz  = ytot1
     210        45520 :         ww      = ytot1*ytot1
     211        45520 :         dindaa  = 2.0d0*din*ww
     212        45520 :         dindaz  = -den*ww
     213        45520 :         dinddaa = 2.0d0*ye*ww
     214        45520 :         dinddaz = -ww
     215        45520 :         dindzz = 0.0d0
     216              : 
     217              : 
     218              : !..hash locate this temperature and density
     219        45520 :         jat = int((logtemp - ht% logtlo)*ht% logtstpi) + 1
     220        45520 :         jat = max(1,min(jat,ht% jmax-1))
     221        45520 :         iat = int((log10(din) - ht% logdlo)*ht% logdstpi) + 1
     222        45520 :         iat = max(1,min(iat,ht% imax-1))
     223              : 
     224              : 
     225              : !..access the table locations only once
     226        45520 :         fi(1)  = ht% f(iat,jat)
     227        45520 :         fi(2)  = ht% f(iat+1,jat)
     228        45520 :         fi(3)  = ht% f(iat,jat+1)
     229        45520 :         fi(4)  = ht% f(iat+1,jat+1)
     230        45520 :         fi(5)  = ht% ft(iat,jat)
     231        45520 :         fi(6)  = ht% ft(iat+1,jat)
     232        45520 :         fi(7)  = ht% ft(iat,jat+1)
     233        45520 :         fi(8)  = ht% ft(iat+1,jat+1)
     234        45520 :         fi(9)  = ht% ftt(iat,jat)
     235        45520 :         fi(10) = ht% ftt(iat+1,jat)
     236        45520 :         fi(11) = ht% ftt(iat,jat+1)
     237        45520 :         fi(12) = ht% ftt(iat+1,jat+1)
     238        45520 :         fi(13) = ht% fd(iat,jat)
     239        45520 :         fi(14) = ht% fd(iat+1,jat)
     240        45520 :         fi(15) = ht% fd(iat,jat+1)
     241        45520 :         fi(16) = ht% fd(iat+1,jat+1)
     242        45520 :         fi(17) = ht% fdd(iat,jat)
     243        45520 :         fi(18) = ht% fdd(iat+1,jat)
     244        45520 :         fi(19) = ht% fdd(iat,jat+1)
     245        45520 :         fi(20) = ht% fdd(iat+1,jat+1)
     246        45520 :         fi(21) = ht% fdt(iat,jat)
     247        45520 :         fi(22) = ht% fdt(iat+1,jat)
     248        45520 :         fi(23) = ht% fdt(iat,jat+1)
     249        45520 :         fi(24) = ht% fdt(iat+1,jat+1)
     250        45520 :         fi(25) = ht% fddt(iat,jat)
     251        45520 :         fi(26) = ht% fddt(iat+1,jat)
     252        45520 :         fi(27) = ht% fddt(iat,jat+1)
     253        45520 :         fi(28) = ht% fddt(iat+1,jat+1)
     254        45520 :         fi(29) = ht% fdtt(iat,jat)
     255        45520 :         fi(30) = ht% fdtt(iat+1,jat)
     256        45520 :         fi(31) = ht% fdtt(iat,jat+1)
     257        45520 :         fi(32) = ht% fdtt(iat+1,jat+1)
     258        45520 :         fi(33) = ht% fddtt(iat,jat)
     259        45520 :         fi(34) = ht% fddtt(iat+1,jat)
     260        45520 :         fi(35) = ht% fddtt(iat,jat+1)
     261        45520 :         fi(36) = ht% fddtt(iat+1,jat+1)
     262              : 
     263              : !..various differences
     264        45520 :         xt  = max( (temp - ht% t(jat)) * ht% dti_sav(jat), 0.0d0)
     265        45520 :         xd  = max( (din - ht% d(iat)) * ht% ddi_sav(iat), 0.0d0)
     266        45520 :         mxt = 1.0d0 - xt
     267        45520 :         mxd = 1.0d0 - xd
     268              : 
     269              : !..the six density and six temperature basis functions
     270        45520 :         si0t =   psi0(xt)
     271        45520 :         si1t =   psi1(xt) * ht% dt_sav(jat)
     272        45520 :         si2t =   psi2(xt) * ht% dt2_sav(jat)
     273              : 
     274        45520 :         si0mt =  psi0(mxt)
     275        45520 :         si1mt = -psi1(mxt) * ht% dt_sav(jat)
     276        45520 :         si2mt =  psi2(mxt) * ht% dt2_sav(jat)
     277              : 
     278        45520 :         si0d =   psi0(xd)
     279        45520 :         si1d =   psi1(xd) * ht% dd_sav(iat)
     280        45520 :         si2d =   psi2(xd) * ht% dd2_sav(iat)
     281              : 
     282        45520 :         si0md =  psi0(mxd)
     283        45520 :         si1md = -psi1(mxd) * ht% dd_sav(iat)
     284        45520 :         si2md =  psi2(mxd) * ht% dd2_sav(iat)
     285              : 
     286              : !..first derivatives of the weight functions
     287        45520 :         dsi0t =   dpsi0(xt) * ht% dti_sav(jat)
     288        45520 :         dsi1t =   dpsi1(xt)
     289        45520 :         dsi2t =   dpsi2(xt) * ht% dt_sav(jat)
     290              : 
     291        45520 :         dsi0mt = -dpsi0(mxt) * ht% dti_sav(jat)
     292        45520 :         dsi1mt =  dpsi1(mxt)
     293        45520 :         dsi2mt = -dpsi2(mxt) * ht% dt_sav(jat)
     294              : 
     295        45520 :         dsi0d =   dpsi0(xd) * ht% ddi_sav(iat)
     296        45520 :         dsi1d =   dpsi1(xd)
     297        45520 :         dsi2d =   dpsi2(xd) * ht% dd_sav(iat)
     298              : 
     299        45520 :         dsi0md = -dpsi0(mxd) * ht% ddi_sav(iat)
     300        45520 :         dsi1md =  dpsi1(mxd)
     301        45520 :         dsi2md = -dpsi2(mxd) * ht% dd_sav(iat)
     302              : 
     303              : !..second derivatives of the weight functions
     304        45520 :         ddsi0t =   ddpsi0(xt) * ht% dt2i_sav(jat)
     305        45520 :         ddsi1t =   ddpsi1(xt) * ht% dti_sav(jat)
     306        45520 :         ddsi2t =   ddpsi2(xt)
     307              : 
     308        45520 :         ddsi0mt =  ddpsi0(mxt) * ht% dt2i_sav(jat)
     309        45520 :         ddsi1mt = -ddpsi1(mxt) * ht% dti_sav(jat)
     310        45520 :         ddsi2mt =  ddpsi2(mxt)
     311              : 
     312        45520 :         ddsi0d =   ddpsi0(xd) * ht% dd2i_sav(iat)
     313        45520 :         ddsi1d =   ddpsi1(xd) * ht% ddi_sav(iat)
     314        45520 :         ddsi2d =   ddpsi2(xd)
     315              : 
     316        45520 :         ddsi0md =  ddpsi0(mxd) * ht% dd2i_sav(iat)
     317        45520 :         ddsi1md = -ddpsi1(mxd) * ht% ddi_sav(iat)
     318        45520 :         ddsi2md =  ddpsi2(mxd)
     319              : 
     320              : !..third derivatives of the weight functions
     321        45520 :         dddsi0t =   dddpsi0(xt) * ht% dt3i_sav(jat)
     322        45520 :         dddsi1t =   dddpsi1(xt) * ht% dt2i_sav(jat)
     323        45520 :         dddsi2t =   dddpsi2(xt) * ht% dti_sav(jat)
     324              : 
     325        45520 :         dddsi0mt = -dddpsi0(mxt) * ht% dt3i_sav(jat)
     326        45520 :         dddsi1mt =  dddpsi1(mxt) * ht% dt2i_sav(jat)
     327        45520 :         dddsi2mt = -dddpsi2(mxt) * ht% dti_sav(jat)
     328              : 
     329        45520 :         dddsi0d =   dddpsi0(xd) * ht% dd3i_sav(iat)
     330        45520 :         dddsi1d =   dddpsi1(xd) * ht% dd2i_sav(iat)
     331        45520 :         dddsi2d =   dddpsi2(xd) * ht% ddi_sav(iat)
     332              : 
     333        45520 :         dddsi0md = -dddpsi0(mxd) * ht% dd3i_sav(iat)
     334        45520 :         dddsi1md =  dddpsi1(mxd) * ht% dd2i_sav(iat)
     335        45520 :         dddsi2md = -dddpsi2(mxd) * ht% ddi_sav(iat)
     336              : 
     337              : 
     338              : !..the free energy
     339              :         free  = h5(iat,jat,fi, &
     340              :                 si0t,   si1t,   si2t,   si0mt,   si1mt,   si2mt, &
     341        45520 :                 si0d,   si1d,   si2d,   si0md,   si1md,   si2md)
     342              : 
     343              : !..first derivative with respect to density
     344              :         df_d  = h5(iat,jat,fi, &
     345              :                 si0t,   si1t,   si2t,   si0mt,   si1mt,   si2mt, &
     346        45520 :                 dsi0d,  dsi1d,  dsi2d,  dsi0md,  dsi1md,  dsi2md)
     347              : 
     348              : !..first derivative with respect to temperature
     349              :         df_t = h5(iat,jat,fi, &
     350              :                 dsi0t,  dsi1t,  dsi2t,  dsi0mt,  dsi1mt,  dsi2mt, &
     351        45520 :                 si0d,   si1d,   si2d,   si0md,   si1md,   si2md)
     352              : 
     353              : !..second derivative with respect to density**2
     354              :          df_dd = h5(iat,jat,fi, &
     355              :                 si0t,   si1t,   si2t,   si0mt,   si1mt,   si2mt, &
     356        45520 :                 ddsi0d, ddsi1d, ddsi2d, ddsi0md, ddsi1md, ddsi2md)
     357              : 
     358              : !..second derivative with respect to temperature**2
     359              :         df_tt = h5(iat,jat,fi, &
     360              :               ddsi0t, ddsi1t, ddsi2t, ddsi0mt, ddsi1mt, ddsi2mt, &
     361        45520 :                 si0d,   si1d,   si2d,   si0md,   si1md,   si2md)
     362              : 
     363              : !..second derivative with respect to temperature and density
     364              :         df_dt = h5(iat,jat,fi, &
     365              :                 dsi0t,  dsi1t,  dsi2t,  dsi0mt,  dsi1mt,  dsi2mt, &
     366        45520 :                 dsi0d,  dsi1d,  dsi2d,  dsi0md,  dsi1md,  dsi2md)
     367              : 
     368              : !..third derivative with respect to temperature**3
     369              :         df_ttt = h5(iat,jat,fi, &
     370              :                 dddsi0t, dddsi1t, dddsi2t, dddsi0mt, dddsi1mt, dddsi2mt, &
     371        45520 :                 si0d,   si1d,   si2d,   si0md,   si1md,   si2md)
     372              : 
     373              : !..third derivative with respect to density temperature**2
     374              :         df_dtt = h5(iat,jat,fi, &
     375              :                 ddsi0t, ddsi1t, ddsi2t, ddsi0mt, ddsi1mt, ddsi2mt, &
     376        45520 :                 dsi0d,   dsi1d,   dsi2d,   dsi0md,   dsi1md,   dsi2md)
     377              : 
     378              : !..third derivative with respect to density**2 temperature
     379              :         df_ddt = h5(iat,jat,fi, &
     380              :                 dsi0t, dsi1t, dsi2t, dsi0mt, dsi1mt, dsi2mt, &
     381        45520 :                 ddsi0d, ddsi1d, ddsi2d, ddsi0md, ddsi1md, ddsi2md)
     382              : 
     383              : !..third derivative with respect to density**3
     384              :         df_ddd = h5(iat,jat,fi, &
     385              :                 si0t, si1t, si2t, si0mt, si1mt, si2mt, &
     386        45520 :                 dddsi0d, dddsi1d, dddsi2d, dddsi0md, dddsi1md, dddsi2md)
     387              : 
     388              : !..now get the pressure derivative with density, chemical potential, and
     389              : !..electron positron number densities
     390              : !..get the cubic interpolation weight functions
     391              : 
     392        45520 :         si0t   =  xpsi0(xt)
     393        45520 :         si1t   =  xpsi1(xt) * ht% dt_sav(jat)
     394        45520 :         si0mt  =  xpsi0(mxt)
     395        45520 :         si1mt  =  -xpsi1(mxt) * ht% dt_sav(jat)
     396              : 
     397        45520 :         si0d   =  xpsi0(xd)
     398        45520 :         si1d   =  xpsi1(xd) * ht% dd_sav(iat)
     399        45520 :         si0md  =  xpsi0(mxd)
     400        45520 :         si1md  =  -xpsi1(mxd) * ht% dd_sav(iat)
     401              : 
     402              : !..first derivatives of weight functions
     403        45520 :         dsi0t  = xdpsi0(xt) * ht% dti_sav(jat)
     404        45520 :         dsi1t  = xdpsi1(xt)
     405        45520 :         dsi0mt = -xdpsi0(mxt) * ht% dti_sav(jat)
     406        45520 :         dsi1mt = xdpsi1(mxt)
     407              : 
     408        45520 :         dsi0d  = xdpsi0(xd) * ht% ddi_sav(iat)
     409        45520 :         dsi1d  = xdpsi1(xd)
     410        45520 :         dsi0md = -xdpsi0(mxd) * ht% ddi_sav(iat)
     411        45520 :         dsi1md = xdpsi1(mxd)
     412              : 
     413              : !..second derivatives of weight functions
     414        45520 :         ddsi0t  = xddpsi0(xt) * ht% dt2i_sav(jat)
     415        45520 :         ddsi1t  = xddpsi1(xt) * ht% dti_sav(jat)
     416        45520 :         ddsi0mt = xddpsi0(mxt) * ht% dt2i_sav(jat)
     417        45520 :         ddsi1mt = -xddpsi1(mxt) * ht% dti_sav(jat)
     418              : 
     419        45520 :         ddsi0d  = xddpsi0(xd) * ht% dd2i_sav(iat)
     420        45520 :         ddsi1d  = xddpsi1(xd) * ht% ddi_sav(iat)
     421        45520 :         ddsi0md = xddpsi0(mxd) * ht% dd2i_sav(iat)
     422        45520 :         ddsi1md = -xddpsi1(mxd) * ht% ddi_sav(iat)
     423              : 
     424              : !..third derivatives of weight functions
     425        45520 :         dddsi0t  = xdddpsi0(xt) * ht% dt3i_sav(jat)
     426        45520 :         dddsi1t  = xdddpsi1(xt) * ht% dt2i_sav(jat)
     427        45520 :         dddsi0mt = -xdddpsi0(mxt) * ht% dt3i_sav(jat)
     428        45520 :         dddsi1mt = xdddpsi1(mxt) * ht% dt2i_sav(jat)
     429              : 
     430        45520 :         dddsi0d  = xdddpsi0(xd) * ht% dd3i_sav(iat)
     431        45520 :         dddsi1d  = xdddpsi1(xd) * ht% dd2i_sav(iat)
     432        45520 :         dddsi0md = -xdddpsi0(mxd) * ht% dd3i_sav(iat)
     433        45520 :         dddsi1md = xdddpsi1(mxd) * ht% dd2i_sav(iat)
     434              : 
     435              : !..look in the electron chemical potential table only once
     436        45520 :         fi(1)  = ht% ef(iat,jat)
     437        45520 :         fi(2)  = ht% ef(iat+1,jat)
     438        45520 :         fi(3)  = ht% ef(iat,jat+1)
     439        45520 :         fi(4)  = ht% ef(iat+1,jat+1)
     440        45520 :         fi(5)  = ht% eft(iat,jat)
     441        45520 :         fi(6)  = ht% eft(iat+1,jat)
     442        45520 :         fi(7)  = ht% eft(iat,jat+1)
     443        45520 :         fi(8)  = ht% eft(iat+1,jat+1)
     444        45520 :         fi(9)  = ht% efd(iat,jat)
     445        45520 :         fi(10) = ht% efd(iat+1,jat)
     446        45520 :         fi(11) = ht% efd(iat,jat+1)
     447        45520 :         fi(12) = ht% efd(iat+1,jat+1)
     448        45520 :         fi(13) = ht% efdt(iat,jat)
     449        45520 :         fi(14) = ht% efdt(iat+1,jat)
     450        45520 :         fi(15) = ht% efdt(iat,jat+1)
     451        45520 :         fi(16) = ht% efdt(iat+1,jat+1)
     452              : 
     453              : 
     454              : !..electron chemical potential etaele
     455              :         etaele  = h3(iat,jat,fi, &
     456              :                      si0t,   si1t,   si0mt,   si1mt, &
     457        45520 :                      si0d,   si1d,   si0md,   si1md)
     458              : 
     459              : !..first derivatives
     460              :         x       = h3(iat,jat,fi, &
     461              :                      si0t,   si1t,   si0mt,   si1mt, &
     462        45520 :                     dsi0d,  dsi1d,  dsi0md,  dsi1md)
     463        45520 :         detadd  = ye * x
     464              :         detadt  = h3(iat,jat,fi, &
     465              :                     dsi0t,  dsi1t,  dsi0mt,  dsi1mt, &
     466        45520 :                      si0d,   si1d,   si0md,   si1md)
     467        45520 :        detada = -x * din * ytot1
     468        45520 :        detadz =  x * den * ytot1
     469              : 
     470              : !..second derivatives
     471              :         y       = h3(iat,jat,fi, &
     472              :                     si0t,   si1t,  si0mt,  si1mt, &
     473        45520 :                     ddsi0d,  ddsi1d,  ddsi0md,  ddsi1md)
     474        45520 :         detaddd = ye * ye * y
     475              :         z       = h3(iat,jat,fi, &
     476              :                     dsi0t,   dsi1t,   dsi0mt,   dsi1mt, &
     477        45520 :                     dsi0d,  dsi1d,  dsi0md,  dsi1md)
     478        45520 :         detaddt = ye * z
     479        45520 :         detadda = -ye*ytot1*x + ye*y*dinda
     480        45520 :         detaddz = ytot1*x + ye*y*dindz
     481              :         detadtt   = h3(iat,jat,fi, &
     482              :                     ddsi0t,   ddsi1t,   ddsi0mt,   ddsi1mt, &
     483        45520 :                     si0d,  si1d,  si0md,  si1md)
     484        45520 :         detadta = z * dinda
     485        45520 :         detadtz = z * dindz
     486        45520 :         detadaa = (y*din + 2.0d0*x)*din*ww
     487        45520 :         detadaz = -(y*dindz*din + x*den*ytot1)*ytot1
     488        45520 :         detadzz = y*dindz*den*ytot1
     489              : 
     490              : !..third derivatives
     491              :         y       = h3(iat,jat,fi, &
     492              :                     si0t,   si1t,  si0mt,  si1mt, &
     493        45520 :                     dddsi0d,  dddsi1d,  dddsi0md,  dddsi1md)
     494        45520 :         detadddd = ye * ye * ye * y  ! Actual interpolation variable is ye * rho, so we multiply by ye to get d/d(density)
     495              :                                     !  ! d/drho^3
     496              : 
     497              :         detadttt = h3(iat,jat,fi, &
     498              :                     dddsi0t,   dddsi1t,  dddsi0mt,  dddsi1mt, &
     499        45520 :                     si0d,  si1d,  si0md,  si1md)       ! d/dT^3
     500              : 
     501              :         y       = h3(iat,jat,fi, &
     502              :                     dsi0t,   dsi1t,  dsi0mt,  dsi1mt, &
     503        45520 :                     ddsi0d,  ddsi1d,  ddsi0md,  ddsi1md)
     504        45520 :         detadddt = ye * ye * y  ! d/drho^2 d/dT
     505              : 
     506              :         y       = h3(iat,jat,fi, &
     507              :                     ddsi0t,   ddsi1t,  ddsi0mt,  ddsi1mt, &
     508        45520 :                     dsi0d,  dsi1d,  dsi0md,  dsi1md)
     509              : 
     510        45520 :         detaddtt = ye * y  ! d/drho d/dT^2
     511              : 
     512              :         ! dg/da = dg/d(din) d(din)/da = dg/d(din) d(ye*rho)/da
     513              :         ! = dg/d(din) d(z rho / a)/da = -(z rho / a^2) dg/d(din)
     514              :         ! = -(z rho / a^2) dg/d(Rho) d(Rho)/d(din)
     515              :         ! = -(z rho / a^2) dg/d(Rho) (1 / ye)
     516              :         ! = -(rho / a) dg/d(Rho) = - ytot1 * rho * dg/d(Rho)
     517              :         ! = -ytot1 * den * dg/d(Rho)
     518        45520 :         detaddda = -den * ytot1 * detadddd
     519        45520 :         detadtta = -den * ytot1 * detaddtt
     520        45520 :         detaddta = -den * ytot1 * detadddt
     521              : 
     522              :         ! dg/dz = dg/d(din) d(din)/dz = dg/d(din) d(ye*rho)/dz
     523              :         ! = dg/d(din) d(z rho / a)/dz = (rho / a) dg/d(din)
     524              :         ! = (rho / a) dg/d(Rho) d(Rho)/d(din)
     525              :         ! = (rho / a) dg/d(Rho) (1 / ye)
     526              :         ! = (rho / z) dg/d(Rho)
     527              :         ! = ytot1 * din * dg/d(Rho)
     528        45520 :         detadddz = din * ytot1 * detadddd
     529        45520 :         detadttz = din * ytot1 * detaddtt
     530        45520 :         detaddtz = din * ytot1 * detadddt
     531              : 
     532              : !..look in the number density table only once
     533        45520 :         fi(1)  = ht% xf(iat,jat)
     534        45520 :         fi(2)  = ht% xf(iat+1,jat)
     535        45520 :         fi(3)  = ht% xf(iat,jat+1)
     536        45520 :         fi(4)  = ht% xf(iat+1,jat+1)
     537        45520 :         fi(5)  = ht% xft(iat,jat)
     538        45520 :         fi(6)  = ht% xft(iat+1,jat)
     539        45520 :         fi(7)  = ht% xft(iat,jat+1)
     540        45520 :         fi(8)  = ht% xft(iat+1,jat+1)
     541        45520 :         fi(9)  = ht% xfd(iat,jat)
     542        45520 :         fi(10) = ht% xfd(iat+1,jat)
     543        45520 :         fi(11) = ht% xfd(iat,jat+1)
     544        45520 :         fi(12) = ht% xfd(iat+1,jat+1)
     545        45520 :         fi(13) = ht% xfdt(iat,jat)
     546        45520 :         fi(14) = ht% xfdt(iat+1,jat)
     547        45520 :         fi(15) = ht% xfdt(iat,jat+1)
     548        45520 :         fi(16) = ht% xfdt(iat+1,jat+1)
     549              : 
     550              : !..electron + positron number densities
     551              :        xnefer   = h3(iat,jat,fi, &
     552              :                      si0t,   si1t,   si0mt,   si1mt, &
     553        45520 :                      si0d,   si1d,   si0md,   si1md)
     554              : 
     555              : !..first derivatives
     556              :        x        = h3(iat,jat,fi, &
     557              :                      si0t,   si1t,   si0mt,   si1mt, &
     558        45520 :                     dsi0d,  dsi1d,  dsi0md,  dsi1md)
     559        45520 :        x = max(x,1.0d-30)
     560        45520 :        dxnedd   = ye * x
     561              :        dxnedt   = h3(iat,jat,fi, &
     562              :                     dsi0t,  dsi1t,  dsi0mt,  dsi1mt, &
     563        45520 :                      si0d,   si1d,   si0md,   si1md)
     564        45520 :        dxneda = -x * din * ytot1
     565        45520 :        dxnedz =  x * den * ytot1
     566              : 
     567              : !..second derivatives
     568              :         y       = h3(iat,jat,fi, &
     569              :                     si0t,   si1t,  si0mt,  si1mt, &
     570        45520 :                     ddsi0d,  ddsi1d,  ddsi0md,  ddsi1md)
     571        45520 :         dxneddd = ye * ye * y
     572              :         z       = h3(iat,jat,fi, &
     573              :                     dsi0t,   dsi1t,   dsi0mt,   dsi1mt, &
     574        45520 :                     dsi0d,  dsi1d,  dsi0md,  dsi1md)
     575        45520 :         dxneddt = ye * z
     576        45520 :         dxnedda = -ye*ytot1*x + ye*y*dinda
     577        45520 :         dxneddz = ytot1*x + ye*y*dindz
     578              :         dxnedtt = h3(iat,jat,fi, &
     579              :                     ddsi0t,   ddsi1t,   ddsi0mt,   ddsi1mt, &
     580        45520 :                     si0d,  si1d,  si0md,  si1md)
     581        45520 :         dxnedta = z * dinda
     582        45520 :         dxnedtz = z * dindz
     583        45520 :         dxnedaa = (y*din + 2.0d0*x)*din*ytot1*ytot1
     584        45520 :         dxnedaz = -(y*dindz*din + x*den*ytot1)*ytot1
     585        45520 :         dxnedzz = y*dindz*den*ytot1
     586              : 
     587              : !..third derivatives
     588              :         y       = h3(iat,jat,fi, &
     589              :                     si0t,   si1t,  si0mt,  si1mt, &
     590        45520 :                     dddsi0d,  dddsi1d,  dddsi0md,  dddsi1md)
     591        45520 :         dxneferdddd = ye * ye * ye * y  ! Actual interpolation variable is ye * rho, so we multiply by ye to get d/d(density)
     592              :                                     !  ! d/drho^3
     593              : 
     594              :         dxneferdttt = h3(iat,jat,fi, &
     595              :                     dddsi0t,   dddsi1t,  dddsi0mt,  dddsi1mt, &
     596        45520 :                     si0d,  si1d,  si0md,  si1md)       ! d/dT^3
     597              : 
     598              : 
     599              :         y       = h3(iat,jat,fi, &
     600              :                     dsi0t,   dsi1t,  dsi0mt,  dsi1mt, &
     601        45520 :                     ddsi0d,  ddsi1d,  ddsi0md,  ddsi1md)
     602        45520 :         dxneferdddt = ye * ye * y  ! d/drho^2 d/dT
     603              : 
     604              :         y       = h3(iat,jat,fi, &
     605              :                     ddsi0t,   ddsi1t,  ddsi0mt,  ddsi1mt, &
     606        45520 :                     dsi0d,  dsi1d,  dsi0md,  dsi1md)
     607              : 
     608        45520 :         dxneferddtt = ye * y  ! d/drho d/dT^2
     609              : 
     610              : 
     611              :         ! dg/da = dg/d(din) d(din)/da = dg/d(din) d(ye*rho)/da
     612              :         ! = dg/d(din) d(z rho / a)/da = -(z rho / a^2) dg/d(din)
     613              :         ! = -(z rho / a^2) dg/d(Rho) d(Rho)/d(din)
     614              :         ! = -(z rho / a^2) dg/d(Rho) (1 / ye)
     615              :         ! = -(rho / a) dg/d(Rho) = - ytot1 * rho * dg/d(Rho)
     616              :         ! = -ytot1 * den * dg/d(Rho)
     617        45520 :         dxneferddda = -den * ytot1 * dxneferdddd
     618        45520 :         dxneferdtta = -den * ytot1 * dxneferddtt
     619        45520 :         dxneferddta = -den * ytot1 * dxneferdddt
     620              : 
     621              :         ! dg/dz = dg/d(din) d(din)/dz = dg/d(din) d(ye*rho)/dz
     622              :         ! = dg/d(din) d(z rho / a)/dz = (rho / a) dg/d(din)
     623              :         ! = (rho / a) dg/d(Rho) d(Rho)/d(din)
     624              :         ! = (rho / a) dg/d(Rho) (1 / ye)
     625              :         ! = (rho / z) dg/d(Rho)
     626              :         ! = ytot1 * din * dg/d(Rho)
     627        45520 :         dxneferdddz = din * ytot1 * dxneferdddd
     628        45520 :         dxneferdttz = din * ytot1 * dxneferddtt
     629        45520 :         dxneferddtz = din * ytot1 * dxneferdddt
     630              : 
     631              : 
     632              :       ! Pack quantities into auto_diff types
     633              : 
     634              :       ! Free energy
     635        45520 :       F%val = free * ye
     636              : 
     637        45520 :       F%d1val1 = df_t * ye
     638        45520 :       F%d1val2 = df_d * pow2(ye)
     639              : 
     640        45520 :       F%d2val1 = df_tt * ye
     641        45520 :       F%d1val1_d1val2 = df_dt * pow2(ye)
     642        45520 :       F%d2val2 = df_dd * pow3(ye)
     643              : 
     644        45520 :       F%d3val1 = df_ttt * ye
     645        45520 :       F%d2val1_d1val2 = df_dtt * pow2(ye)
     646        45520 :       F%d1val1_d2val2 = df_ddt * pow3(ye)
     647        45520 :       F%d3val2 = df_ddd * pow4(ye)
     648              : 
     649              : 
     650              :       ! Electron chemical potential
     651        45520 :       adr_etaele = etaele
     652              : 
     653        45520 :       adr_etaele%d1val1 = detadt
     654        45520 :       adr_etaele%d1val2 = detadd
     655              : !      adr_etaele%d1val3 = detada ! d/dabar
     656              : !      adr_etaele%d1val4 = detadz ! d/dzbar
     657              : 
     658        45520 :       adr_etaele%d2val1 = detadtt
     659        45520 :       adr_etaele%d2val2 = detaddd
     660        45520 :       adr_etaele%d1val1_d1val2 = detaddt
     661              : !      adr_etaele%d1val1_d1val3 = detadta ! d/dabar
     662              : !      adr_etaele%d1val1_d1val4 = detadtz ! d/dzbar
     663              : !      adr_etaele%d1val2_d1val3 = detadda ! d/dabar
     664              : !      adr_etaele%d1val2_d1val4 = detaddz ! d/dzbar
     665              : 
     666        45520 :       adr_etaele%d3val1 = detadttt
     667        45520 :       adr_etaele%d2val1_d1val2 = detaddtt
     668        45520 :       adr_etaele%d1val1_d2val2 = detadddt
     669        45520 :       adr_etaele%d3val2 = detadddd
     670              : 
     671              : !      adr_etaele%d2val1_d1val3 = detadtta
     672              : !      adr_etaele%d2val2_d1val3 = detaddda
     673              : !      adr_etaele%d1val1_d1val2_d1val3 = detaddta
     674              : !      adr_etaele%d2val1_d1val4 = detadttz
     675              : !      adr_etaele%d2val2_d1val4 = detadddz
     676              : !      adr_etaele%d1val1_d1val2_d1val4 = detaddtz
     677              : 
     678              :       ! Electron density
     679        45520 :       adr_xnefer = xnefer
     680              : 
     681        45520 :       adr_xnefer%d1val1 = dxnedt
     682        45520 :       adr_xnefer%d1val2 = dxnedd
     683              : !      adr_xnefer%d1val3 = dxneda ! d/dabar
     684              : !      adr_xnefer%d1val4 = dxnedz ! d/dzbar
     685              : 
     686        45520 :       adr_xnefer%d2val1 = dxnedtt
     687        45520 :       adr_xnefer%d2val2 = dxneddd
     688        45520 :       adr_xnefer%d1val1_d1val2 = dxneddt
     689              : !      adr_xnefer%d1val1_d1val3 = dxnedta ! d/dabar
     690              : !      adr_xnefer%d1val1_d1val4 = dxnedtz ! d/dzbar
     691              : !      adr_xnefer%d1val2_d1val3 = dxnedda ! d/dabar
     692              : !      adr_xnefer%d1val2_d1val4 = dxneddz ! d/dzbar
     693              : 
     694        45520 :       adr_xnefer%d3val1 = dxneferdttt
     695        45520 :       adr_xnefer%d2val1_d1val2 = dxneferddtt
     696        45520 :       adr_xnefer%d1val1_d2val2 = dxneferdddt
     697        45520 :       adr_xnefer%d3val2 = dxneferdddd
     698              : 
     699              : !      adr_xnefer%d2val1_d1val3 = dxneferdtta
     700              : !      adr_xnefer%d2val2_d1val3 = dxneferddda
     701              : !      adr_xnefer%d1val1_d1val2_d1val3 = dxneferddta
     702              : !      adr_xnefer%d2val1_d1val4 = dxneferdttz
     703              : !      adr_xnefer%d2val2_d1val4 = dxneferdddz
     704              : !      adr_xnefer%d1val1_d1val2_d1val4 = dxneferddtz
     705              : 
     706        45520 :    end subroutine compute_ideal_ele
     707              : 
     708              : end module skye_ideal
        

Generated by: LCOV version 2.0-1