LCOV - code coverage report
Current view: top level - src/67_common - m_vtorhotf.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 84.5 % 103 87
Test Date: 2026-09-20 15:27:41 Functions: 100.0 % 5 5

            Line data    Source code
       1              : !!****m* ABINIT/m_vtorhotf
       2              : !! NAME
       3              : !!  m_vtorhotf
       4              : !!
       5              : !! FUNCTION
       6              : !! Computes the new density from a fixed potential (vtrial) using the Thomas-Fermi functional
       7              : !!
       8              : !! COPYRIGHT
       9              : !!  Copyright (C) 1998-2026 ABINIT group (DCA, XG, GMR, MF, AR, MM)
      10              : !!  This file is distributed under the terms of the
      11              : !!  GNU General Public License, see ~abinit/COPYING
      12              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      13              : !!
      14              : !! SOURCE
      15              : 
      16              : #if defined HAVE_CONFIG_H
      17              : #include "config.h"
      18              : #endif
      19              : 
      20              : #include "abi_common.h"
      21              : 
      22              : module m_vtorhotf
      23              : 
      24              :  use defs_basis
      25              :  use m_abicore
      26              :  use m_errors
      27              :  use m_xmpi
      28              :  use m_dtset
      29              : 
      30              :  use defs_abitypes, only : MPI_type
      31              :  use m_time,     only : timab
      32              :  use m_spacepar,  only : symrhg
      33              : 
      34              :  implicit none
      35              : 
      36              :  private
      37              : !!***
      38              : 
      39              :  public :: vtorhotf
      40              : !!***
      41              : 
      42              : contains
      43              : !!***
      44              : 
      45              : !!****f* ABINIT/vtorhotf
      46              : !! NAME
      47              : !! vtorhotf
      48              : !!
      49              : !! FUNCTION
      50              : !! This routine computes the new density from a fixed potential (vtrial)
      51              : !! using the Thomas-Fermi functional
      52              : !!
      53              : !! INPUTS
      54              : !!  dtset <type(dataset_type)>=all input variables for this dataset
      55              : !!  gprimd(3,3)=dimensional reciprocal space primitive translations
      56              : !!  irrzon(nfft**(1-1/nsym),2,(nspden/nsppol)-3*(nspden/4))=irreducible zone data
      57              : !!  mpi_enreg=information about MPI parallelization
      58              : !!  natom=number of atoms in cell.
      59              : !!  nfft=number of fft grid points
      60              : !!  nspden=number of spin-density components
      61              : !!  nsppol=1 for unpolarized, 2 for spin-polarized
      62              : !!  nsym=number of symmetry elements in space group
      63              : !!  phnons(2,nfft**(1-1/nsym),(nspden/nsppol)-3*(nspden/4))=nonsymmorphic translation phases
      64              : !!  gprimd(3,3)=dimensional real space primitive translations
      65              : !!  ucvol=unit cell volume in bohr**3.
      66              : !!  vtrial(nfft,nspden)=INPUT Vtrial(r).
      67              : !!
      68              : !! OUTPUT
      69              : !!  ek=kinetic energy part of total energy.
      70              : !!  enlx=nonlocal psp + potential Fock ACE part of total energy.
      71              : !!  entropy=entropy due to the occupation number smearing (if metal)
      72              : !!  fermie=fermi energy (Hartree)
      73              : !!  grnl(3*natom)=stores grads of nonlocal energy wrt length scales
      74              : !!   (3x3 tensor) and grads wrt atomic coordinates (3*natom)
      75              : !!
      76              : !! SIDE EFFECTS
      77              : !!  rhog(2,nfft)=array for Fourier transform of electron density
      78              : !!  rhor(nfft,nspden)=array for electron density in electrons/bohr**3.
      79              : !!
      80              : !! SOURCE
      81              : 
      82          277 : subroutine vtorhotf(dtset,ek,enlx,entropy,fermie,gprimd,grnl,&
      83          277 : &  irrzon,mpi_enreg,natom,nfft,nspden,nsppol,nsym,phnons,rhog,rhor,rprimd,ucvol,vtrial)
      84              : 
      85              : !Arguments ------------------------------------
      86              : !scalars
      87              :  integer,intent(in) :: natom,nfft,nspden,nsppol,nsym
      88              :  real(dp),intent(in) :: ucvol
      89              :  real(dp),intent(out) :: ek,enlx,entropy,fermie
      90              :  type(MPI_type),intent(in) :: mpi_enreg
      91              :  type(dataset_type),intent(in) :: dtset
      92              : !arrays
      93              :  integer,intent(in) :: irrzon((dtset%ngfft(1)*dtset%ngfft(1)*dtset%ngfft(1))**(1-1/nsym),2,(nspden/nsppol)-3*(nspden/4))
      94              :  real(dp),intent(in) :: gprimd(3,3)
      95              :  real(dp),intent(in) :: phnons(2,(dtset%ngfft(1)*dtset%ngfft(1)*dtset%ngfft(1))**(1-1/nsym),(nspden/nsppol)-3*(nspden/4))
      96              :  real(dp),intent(in) :: rprimd(3,3),vtrial(nfft,nspden)
      97              :  real(dp),intent(inout) :: rhog(2,nfft),rhor(nfft,nspden)
      98              :  real(dp),intent(out) :: grnl(3*natom)
      99              : 
     100              : !Local variables-------------------------------
     101              : !scalars
     102              :  integer,parameter :: jdichomax=20,level=111
     103              :  integer :: i1,i2,i3,ierr,ifft,ii,ir,iscf,jdicho
     104              :  integer :: me_fft,n1,n2,n3,nfftot,nproc_fft,prtvol
     105              :  real(dp),save :: cktf,fermie_tol,nelect_mid
     106              :  real(dp) :: dnelect_mid_dx,dxrtnewt,eektemp,eektf,feektemp,feektf
     107              :  real(dp) :: rtnewt,sum_rhor_mid,sum_rhor_middx
     108              :  logical,save :: lfirst_time_tf=.true.
     109              :  logical :: lnewtonraphson
     110              :  character(len=500) :: message
     111              : !arrays
     112              :  real(dp) :: tsec(2)
     113          277 :  real(dp),allocatable :: betamumoinsV(:),rhor_mid(:),rhor_middx(:)
     114              : 
     115              : ! *************************************************************************
     116              : 
     117              : !Keep track of total time spent in vtorho
     118          277 :  call timab(21,1,tsec)
     119              : 
     120              : !Structured debugging if prtvol==-level
     121          277 :  prtvol=dtset%prtvol
     122          277 :  if(prtvol==-level)then
     123            0 :    write(message,'(80a,a,a)') ('=',ii=1,80),ch10,' vtorho : enter '
     124            0 :    call wrtout(std_out,message,'COLL')
     125              :  end if
     126              : 
     127          277 :  n1=dtset%ngfft(1) ; n2=dtset%ngfft(2) ; n3=dtset%ngfft(3)
     128          277 :  me_fft=dtset%ngfft(11) ; nproc_fft=dtset%ngfft(10)
     129          277 :  iscf=dtset%iscf
     130              : !Debugging : print vtrial and rhor
     131          277 :  if(prtvol==-level)then
     132            0 :    write(message,'(a)') '   ir              vtrial(ir)     rhor(ir) '
     133            0 :    call wrtout(std_out,message,'COLL')
     134            0 :    do ir=1,nfft
     135              : !    if(ir<=11 .or. mod(ir,301)==0 )then
     136            0 :      i3=(ir-1)/n1/(n2/nproc_fft)
     137            0 :      i2=(ir-1-i3*n1*n2/nproc_fft)/n1
     138            0 :      i1=ir-1-i3*n1*n2/nproc_fft-(i2-me_fft)*n1
     139            0 :      write(message,'(i5,3i3,a,2d13.6)')ir,i1,i2,i3,' ',vtrial(ir,1),rhor(ir,1)
     140            0 :      call wrtout(std_out,message,'COLL')
     141            0 :      if(nspden>=2)then
     142            0 :        write(message,'(a,2d13.6)')'               ',vtrial(ir,2),rhor(ir,2)
     143            0 :        call wrtout(std_out,message,'COLL')
     144              :      end if
     145              : !    end if
     146              :    end do
     147              :  end if
     148              : 
     149          277 :  ek=zero
     150          277 :  enlx=zero
     151        26869 :  grnl(:)=zero
     152              : 
     153              : !Initialize rhor if needed
     154     12255962 :  if(iscf>0) rhor(:,:)=zero
     155              : 
     156              : !call Thomas-Fermi for the density
     157          277 :  call tf
     158              : !Compute energy terms
     159          277 :  call tfek
     160              : 
     161          277 :  call timab(21,2,tsec)
     162              : !End thomas fermi
     163              : 
     164              :  contains
     165              : !!***
     166              : 
     167              : !!****f* vtorhotf/tf
     168              : !! NAME
     169              : !! tf
     170              : !!
     171              : !! FUNCTION
     172              : !!
     173              : !! INPUTS
     174              : !!
     175              : !! OUTPUT
     176              : !!
     177              : !! SOURCE
     178          277 :   subroutine tf()
     179              : 
     180              : ! *************************************************************************
     181              : 
     182          831 :    ABI_MALLOC(rhor_mid,(nfft))
     183          831 :    ABI_MALLOC(rhor_middx,(nfft))
     184          277 :    fermie_tol=1.e-10_dp
     185          277 :    cktf=one/two/pi**2*(two*dtset%tphysel)**1.5_dp
     186              : 
     187              : !  Should be made an input variable, if TF really needed for production
     188              : !  rtnewt=dtset%userra
     189          277 :    rtnewt=zero
     190              : 
     191              : !  Newton Raphson
     192          277 :    if (lfirst_time_tf) then
     193            4 :      lfirst_time_tf=.false.
     194              :    end if
     195          277 :    jdicho=0
     196          277 :    lnewtonraphson=.false.
     197         4641 :    do while (.not.lnewtonraphson)
     198         2182 :      jdicho=jdicho+1
     199              : !    do ifft=1,nfft
     200              : !    rhor_mid(ifft)=cktf*zfermi12((rtnewt-vtrial(ifft,1))/dtset%tphysel)
     201              : !    rhor_middx(ifft)=cktf*zfermim12((rtnewt-vtrial(ifft,1))/dtset%tphysel)
     202              : !    end do
     203              :      call fm12a1t(cktf,rtnewt,dtset%tphysel,vtrial(:,1),rhor_middx,rhor_mid,&
     204         2182 : &     nfft)
     205     97127446 :      sum_rhor_mid=sum(rhor_mid(:))
     206     97127446 :      sum_rhor_middx=sum(rhor_middx(:))
     207              :      call xmpi_sum(sum_rhor_mid,mpi_enreg%comm_fft ,ierr)
     208              :      call xmpi_sum(sum_rhor_middx,mpi_enreg%comm_fft ,ierr)
     209         2182 :      nelect_mid=sum_rhor_mid*ucvol/(nfft*nproc_fft)-dtset%nelect
     210         2182 :      dnelect_mid_dx=sum_rhor_middx*ucvol/(nfft*nproc_fft)/dtset%tphysel/two
     211         2182 :      dxrtnewt=nelect_mid/dnelect_mid_dx
     212         2182 :      rtnewt=rtnewt-dxrtnewt
     213         2182 :      if (abs(nelect_mid) < fermie_tol/2._dp) then
     214          277 :        lnewtonraphson=.true.
     215              :      end if
     216         2459 :      if (jdicho > jdichomax) then
     217            0 :        ABI_ERROR('NEWTON RAPHSON NOT CONVERGED')
     218              :      end if
     219              :    end do
     220          277 :    fermie=rtnewt
     221     12255685 :    rhor(:,1)=rhor_mid(:)
     222          277 :    ABI_FREE(rhor_mid)
     223          277 :    ABI_FREE(rhor_middx)
     224              : 
     225              : !  DEBUG
     226              : !  write(std_out,*)'fmid,nmid,jdicho',fermie,nelect_mid,jdicho
     227              : !  ENDDEBUG
     228              : 
     229              : !  Compute rhog
     230          277 :    call timab(70,1,tsec)
     231              : 
     232          277 :    nfftot=dtset%ngfft(1)*dtset%ngfft(2)*dtset%ngfft(3)
     233              :    call symrhg(1,gprimd,irrzon,mpi_enreg,nfft,nfftot,dtset%ngfft,nspden,nsppol,nsym,phnons,&
     234          277 : &   rhog,rhor,rprimd,dtset%symafm,dtset%symrel,dtset%tnons)
     235              : 
     236              : !  We now have both rho(r) and rho(G), symmetrized, and if nsppol=2
     237              : !  we also have the spin-up density, symmetrized, in rhor(:,2).
     238              : 
     239          277 :    call timab(70,2,tsec)
     240              : 
     241          277 : end subroutine tf
     242              : !!***
     243              : 
     244              : !!****f* vtorhotf/tfek
     245              : !! NAME
     246              : !! tfek
     247              : !!
     248              : !! FUNCTION
     249              : !! This is the calculation of the kinetic energy for Thomas Fermi
     250              : !! Energy and free energy must be distinguished
     251              : !!
     252              : !! INPUTS
     253              : !!
     254              : !! OUTPUT
     255              : !!
     256              : !! SOURCE
     257              : 
     258          277 :   subroutine tfek()
     259              : 
     260              : ! *************************************************************************
     261              : 
     262          831 :    ABI_MALLOC(betamumoinsV,(nfft))
     263          277 :    cktf=one/two/pi**2*(two*dtset%tphysel)**1.5_dp
     264          277 :    eektf=zero
     265          277 :    feektf=zero
     266     12255685 :    do ifft=1,nfft
     267              : 
     268              : !    betamumoinsv(ifft)=ifermi12(rhor(ifft,1)/cktf)
     269     12255408 :      betamumoinsv(ifft)=(rtnewt-vtrial(ifft,1))/dtset%tphysel
     270              : !    eektemp=zfermi32(betamumoinsV(ifft))/zfermi12(betamumoinsV(ifft))
     271     12255408 :      eektemp=fp32a1(betamumoinsV(ifft))/rhor(ifft,1)*cktf
     272     12255408 :      feektemp=betamumoinsV(ifft)-two/three*eektemp
     273     12255408 :      feektf=feektf+feektemp*rhor(ifft,1)
     274     12255685 :      eektf=eektf+eektemp*rhor(ifft,1)
     275              :    end do
     276              : !  Init mpi_comm
     277          277 :    call timab(48,1,tsec)
     278              :    call xmpi_sum(eektf,mpi_enreg%comm_fft ,ierr)
     279              :    call xmpi_sum(feektf,mpi_enreg%comm_fft ,ierr)
     280          277 :    call timab(48,2,tsec)
     281          277 :    eektf=eektf*dtset%tphysel
     282          277 :    eektf=eektf*ucvol/dble(nfft*nproc_fft)
     283          277 :    feektf=feektf*dtset%tphysel
     284          277 :    feektf=feektf*ucvol/dble(nfft*nproc_fft)
     285              : !  DEBUG
     286              : !  write(std_out,*)'eektf',eektf
     287              : !  stop ('vtorhotf')
     288              : !  ENDDEBUG
     289          277 :    ek=eektf
     290          277 :    entropy=(eektf-feektf)/dtset%tphysel
     291          277 :    ABI_FREE(betamumoinsV)
     292          277 :  end subroutine tfek
     293              : !!***
     294              : 
     295              : !!****f* ABINIT/zfermim12
     296              : !! NAME
     297              : !! zfermim12
     298              : !!
     299              : !! FUNCTION
     300              : !!..file contains fermi-dirac integral routines:
     301              : !!..
     302              : !!..function zfermim12 does a rational function fit for the order -1/2 integral
     303              : !!..function zfermi12 does a rational function fit for the order 1/2 integral
     304              : !!..function zfermi1 does a rational function fit for the order 1 integral
     305              : !!..function zfermi32 does a rational function fit for the order 3/2 integral
     306              : !!..function zfermi2 does a rational function fit for the order 2 integral
     307              : !!..function zfermi52 does a rational function fit for the order 5/2 integral
     308              : !!..function zfermi3 does a rational function fit for the order 3 integral
     309              : !!..
     310              : !!..function ifermim12 is a rational function fit for the inverse of order -1/2
     311              : !!..function ifermi12 is a rational function fit for the inverse of order 1/2
     312              : !!..function ifermi32 is a rational function fit for the inverse of order 3/2
     313              : !!..function ifermi52 is a rational function fit for the inverse of order 5/2
     314              : !!
     315              : !!..this routine applies a rational function expansion to get the fermi-dirac
     316              : !!..integral of order -1/2 evaluated at x. maximum error is 1.23d-12.
     317              : !!..reference: antia apjs 84,101 1993
     318              : !!
     319              : !! INPUTS
     320              : !!
     321              : !! OUTPUT
     322              : !!
     323              : !! SOURCE
     324              : 
     325              :  function zfermim12(xx)
     326              : 
     327              : !Arguments -------------------------------
     328              :  real(dp), intent(in) :: xx
     329              :  real(dp) :: zfermim12
     330              : 
     331              : !Local variables-------------------------------
     332              :  integer ::  ii,m1,k1,m2,k2
     333              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
     334              : !..load the coefficients of the expansion
     335              :  data  an,m1,k1,m2,k2 /-0.5e0_dp, 7, 7, 11, 11/
     336              :  data  (a1(ii),ii=1,8)/ 1.71446374704454e7_dp,    3.88148302324068e7_dp,&
     337              : & 3.16743385304962e7_dp,    1.14587609192151e7_dp,&
     338              : & 1.83696370756153E6_dp,    1.14980998186874e5_dp,&
     339              : & 1.98276889924768e3_dp,    1.0e0_dp/
     340              :  data  (b1(ii),ii=1,8)/ 9.67282587452899e6_dp,    2.87386436731785e7_dp,&
     341              : & 3.26070130734158e7_dp,    1.77657027846367e7_dp,&
     342              : & 4.81648022267831e6_dp,    6.13709569333207e5_dp,&
     343              : & 3.13595854332114e4_dp,    4.35061725080755e2_dp/
     344              :  data (a2(ii),ii=1,12)/-4.46620341924942e-15_dp, -1.58654991146236e-12_dp,&
     345              : & -4.44467627042232e-10_dp, -6.84738791621745e-8_dp,&
     346              : & -6.64932238528105e-6_dp,  -3.69976170193942e-4_dp,&
     347              : & -1.12295393687006e-2_dp,  -1.60926102124442e-1_dp,&
     348              : & -8.52408612877447e-1_dp,  -7.45519953763928e-1_dp,&
     349              : & 2.98435207466372e0_dp,    1.0e0_dp/
     350              :  data (b2(ii),ii=1,12)/-2.23310170962369e-15_dp, -7.94193282071464e-13_dp,&
     351              : & -2.22564376956228e-10_dp, -3.43299431079845e-8_dp,&
     352              : & -3.33919612678907e-6_dp,  -1.86432212187088e-4_dp,&
     353              : & -5.69764436880529e-3_dp,  -8.34904593067194e-2_dp,&
     354              : & -4.78770844009440e-1_dp,  -4.99759250374148e-1_dp,&
     355              : & 1.86795964993052e0_dp,    4.16485970495288e-1_dp/
     356              : 
     357              : ! *************************************************************************
     358              : 
     359              :  if (xx .lt. 2.0e0_dp) then
     360              :    xx1 = exp(xx)
     361              :    rn = xx1 + a1(m1)
     362              :    do ii=m1-1,1,-1
     363              :      rn = rn*xx1 + a1(ii)
     364              :    end do
     365              :    den = b1(k1+1)
     366              :    do ii=k1,1,-1
     367              :      den = den*xx1 + b1(ii)
     368              :    end do
     369              :    zfermim12 = xx1 * rn/den
     370              : !  ..
     371              :  else
     372              :    xx1 = one/(xx*xx)
     373              :    rn = xx1 + a2(m2)
     374              :    do ii=m2-1,1,-1
     375              :      rn = rn*xx1 + a2(ii)
     376              :    end do
     377              :    den = b2(k2+1)
     378              :    do ii=k2,1,-1
     379              :      den = den*xx1 + b2(ii)
     380              :    end do
     381              :    zfermim12 = sqrt(xx)*rn/den
     382              :  end if
     383              : 
     384              : end function zfermim12
     385              : !!***
     386              : 
     387              : !!****f* ABINIT/zfermi12
     388              : !! NAME
     389              : !! zfermi12
     390              : !!
     391              : !! FUNCTION
     392              : !!
     393              : !! INPUTS
     394              : !!
     395              : !! OUTPUT
     396              : !!
     397              : !! SOURCE
     398              : 
     399              :  function zfermi12(xx)
     400              : !..
     401              : !..this routine applies a rational function expansion to get the fermi-dirac
     402              : !..integral of order 1/2 evaluated at x. maximum error is 5.47d-13.
     403              : !..reference: antia apjs 84,101 1993
     404              : !..
     405              : !..declare
     406              : 
     407              : !Arguments -------------------------------
     408              :  real(dp), intent(in) :: xx
     409              :  real(dp):: zfermi12
     410              : 
     411              : !Local variables-------------------------------
     412              :  integer ::         ii,m1,k1,m2,k2
     413              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
     414              : 
     415              : !..load the coefficients of the expansion
     416              :  data  an,m1,k1,m2,k2 /0.5e0_dp, 7, 7, 10, 11/
     417              :  data  (a1(ii),ii=1,8)/5.75834152995465e6_dp,   1.30964880355883e7_dp,&
     418              : & 1.07608632249013e7_dp,   3.93536421893014e6_dp,&
     419              : & 6.42493233715640e5_dp,   4.16031909245777e4_dp,&
     420              : & 7.77238678539648e2_dp,   1.0e0_dp/
     421              :  data  (b1(ii),ii=1,8)/6.49759261942269e6_dp,   1.70750501625775e7_dp,&
     422              : & 1.69288134856160e7_dp,   7.95192647756086e6_dp,&
     423              : & 1.83167424554505e6_dp,   1.95155948326832e5_dp,&
     424              : & 8.17922106644547e3_dp,   9.02129136642157e1_dp/
     425              :  data (a2(ii),ii=1,11)/4.85378381173415e-14_dp, 1.64429113030738e-11_dp,&
     426              : & 3.76794942277806e-9_dp,  4.69233883900644e-7_dp,&
     427              : & 3.40679845803144e-5_dp,  1.32212995937796e-3_dp,&
     428              : & 2.60768398973913e-2_dp,  2.48653216266227e-1_dp,&
     429              : & 1.08037861921488e0_dp,   1.91247528779676e0_dp,&
     430              : & 1.0e0_dp/
     431              :  data (b2(ii),ii=1,12)/7.28067571760518e-14_dp, 2.45745452167585e-11_dp,&
     432              : & 5.62152894375277e-9_dp,  6.96888634549649e-7_dp,&
     433              : & 5.02360015186394e-5_dp,  1.92040136756592e-3_dp,&
     434              : & 3.66887808002874e-2_dp,  3.24095226486468e-1_dp,&
     435              : & 1.16434871200131e0_dp,   1.34981244060549e0_dp,&
     436              : & 2.01311836975930e-1_dp, -2.14562434782759e-2_dp/
     437              : 
     438              : ! *************************************************************************
     439              : 
     440              :  if (xx .lt. two) then
     441              :    xx1 = exp(xx)
     442              :    rn = xx1 + a1(m1)
     443              :    do ii=m1-1,1,-1
     444              :      rn = rn*xx1 + a1(ii)
     445              :    end do
     446              :    den = b1(k1+1)
     447              :    do ii=k1,1,-1
     448              :      den = den*xx1 + b1(ii)
     449              :    end do
     450              :    zfermi12 = xx1 * rn/den
     451              : 
     452              :  else
     453              :    xx1 = one/(xx*xx)
     454              :    rn = xx1 + a2(m2)
     455              :    do ii=m2-1,1,-1
     456              :      rn = rn*xx1 + a2(ii)
     457              :    end do
     458              :    den = b2(k2+1)
     459              :    do ii=k2,1,-1
     460              :      den = den*xx1 + b2(ii)
     461              :    end do
     462              :    zfermi12 = xx*sqrt(xx)*rn/den
     463              :  end if
     464              : 
     465              : end function zfermi12
     466              : !!***
     467              : 
     468              : !!****f* ABINIT/zfermi1
     469              : !! NAME
     470              : !! zfermi1
     471              : !!
     472              : !! FUNCTION
     473              : !!
     474              : !! INPUTS
     475              : !!
     476              : !! OUTPUT
     477              : !!
     478              : !! SOURCE
     479              : 
     480              :  function zfermi1(xx)
     481              : !..
     482              : !..this routine applies a rational function expansion to get the fermi-dirac
     483              : !..integral of order 1 evaluated at x. maximum error is 1.0e-8.
     484              : !..reference: antia  priv comm. 11sep94
     485              : !..
     486              : !..declare
     487              : 
     488              : !Arguments -------------------------------
     489              :  real(dp), intent(in) :: xx
     490              :  real(dp):: zfermi1
     491              : !Local variables-------------------------------
     492              :  integer ::  ii,m1,k1,m2,k2
     493              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
     494              : 
     495              : !..load the coefficients of the expansion
     496              :  data  an,m1,k1,m2,k2 /1.0_dp, 7, 4, 9, 5/
     497              :  data  (a1(ii),ii=1,8)/-7.606458638543e7_dp,  -1.143519707857e8_dp,&
     498              : & -5.167289383236e7_dp,  -7.304766495775e6_dp,&
     499              : & -1.630563622280e5_dp,   3.145920924780e3_dp,&
     500              : & -7.156354090495e1_dp,   1.0_dp/
     501              :  data  (b1(ii),ii=1,5)/-7.606458639561e7_dp,  -1.333681162517e8_dp,&
     502              : & -7.656332234147e7_dp,  -1.638081306504e7_dp,&
     503              : & -1.044683266663e6_dp/
     504              :  data (a2(ii),ii=1,10)/-3.493105157219e-7_dp, -5.628286279892e-5_dp,&
     505              : & -5.188757767899e-3_dp, -2.097205947730e-1_dp,&
     506              : & -3.353243201574_dp,    -1.682094530855e1_dp,&
     507              : & -2.042542575231e1_dp,   3.551366939795_dp,&
     508              : & -2.400826804233_dp,     1.0_dp/
     509              :  data  (b2(ii),ii=1,6)/-6.986210315105e-7_dp, -1.102673536040e-4_dp,&
     510              : & -1.001475250797e-2_dp, -3.864923270059e-1_dp,&
     511              : & -5.435619477378_dp,    -1.563274262745e1_dp/
     512              : 
     513              : ! *************************************************************************
     514              : 
     515              :  if (xx .lt. 2.0_dp) then
     516              :    xx1 = exp(xx)
     517              :    rn = xx1 + a1(m1)
     518              :    do ii=m1-1,1,-1
     519              :      rn = rn*xx1 + a1(ii)
     520              :    end do
     521              :    den = b1(k1+1)
     522              :    do ii=k1,1,-1
     523              :      den = den*xx1 + b1(ii)
     524              :    end do
     525              :    zfermi1 = xx1 * rn/den
     526              : 
     527              :  else
     528              :    xx1 = 1.0_dp/(xx*xx)
     529              :    rn = xx1 + a2(m2)
     530              :    do ii=m2-1,1,-1
     531              :      rn = rn*xx1 + a2(ii)
     532              :    end do
     533              :    den = b2(k2+1)
     534              :    do ii=k2,1,-1
     535              :      den = den*xx1 + b2(ii)
     536              :    end do
     537              :    zfermi1 = xx*xx*rn/den
     538              :  end if
     539              : 
     540              : end function zfermi1
     541              : !!***
     542              : 
     543              : !!****f* ABINIT/zfermi32
     544              : !! NAME
     545              : !! zfermi32
     546              : !!
     547              : !! FUNCTION
     548              : !!  this routine applies a rational function expansion to get the fermi-dirac
     549              : !!  integral of order 3/2 evaluated at x. maximum error is 5.07d-13.
     550              : !!  reference: antia apjs 84,101 1993
     551              : !!
     552              : !! INPUTS
     553              : !!
     554              : !! OUTPUT
     555              : !!
     556              : !! SOURCE
     557              : 
     558              :  function zfermi32(xx)
     559              : 
     560              : !Arguments -------------------------------
     561              :  real(dp), intent(in) :: xx
     562              :  real(dp) :: zfermi32
     563              : 
     564              : !Local variables-------------------------------
     565              :  integer :: ii,m1,k1,m2,k2
     566              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
     567              : 
     568              : !..load the coefficients of the expansion
     569              :  data  an,m1,k1,m2,k2 /1.5e0_dp, 6, 7, 9, 10/
     570              :  data  (a1(ii),ii=1,7)/4.32326386604283e4_dp,   8.55472308218786e4_dp,&
     571              : & 5.95275291210962e4_dp,   1.77294861572005e4_dp,&
     572              : & 2.21876607796460e3_dp,   9.90562948053193e1_dp,&
     573              : & 1.0e0_dp/
     574              :  data  (b1(ii),ii=1,8)/3.25218725353467e4_dp,   7.01022511904373e4_dp,&
     575              : & 5.50859144223638e4_dp,   1.95942074576400e4_dp,&
     576              : & 3.20803912586318e3_dp,   2.20853967067789e2_dp,&
     577              : & 5.05580641737527e0_dp,   1.99507945223266e-2_dp/
     578              :  data (a2(ii),ii=1,10)/2.80452693148553e-13_dp, 8.60096863656367e-11_dp,&
     579              : & 1.62974620742993e-8_dp,  1.63598843752050e-6_dp,&
     580              : & 9.12915407846722e-5_dp,  2.62988766922117e-3_dp,&
     581              : & 3.85682997219346e-2_dp,  2.78383256609605e-1_dp,&
     582              : & 9.02250179334496e-1_dp,  1.0e0_dp/
     583              :  data (b2(ii),ii=1,11)/7.01131732871184e-13_dp, 2.10699282897576e-10_dp,&
     584              : & 3.94452010378723e-8_dp,  3.84703231868724e-6_dp,&
     585              : & 2.04569943213216e-4_dp,  5.31999109566385e-3_dp,&
     586              : & 6.39899717779153e-2_dp,  3.14236143831882e-1_dp,&
     587              : & 4.70252591891375e-1_dp, -2.15540156936373e-2_dp,&
     588              : & 2.34829436438087e-3_dp/
     589              : 
     590              : ! *************************************************************************
     591              : 
     592              :  if (xx .lt. 2.0e0_dp) then
     593              :    xx1 = exp(xx)
     594              :    rn = xx1 + a1(m1)
     595              :    do ii=m1-1,1,-1
     596              :      rn = rn*xx1 + a1(ii)
     597              :    end do
     598              :    den = b1(k1+1)
     599              :    do ii=k1,1,-1
     600              :      den = den*xx1 + b1(ii)
     601              :    end do
     602              :    zfermi32 = xx1 * rn/den
     603              : 
     604              :  else
     605              :    xx1 = one/(xx*xx)
     606              :    rn = xx1 + a2(m2)
     607              :    do ii=m2-1,1,-1
     608              :      rn = rn*xx1 + a2(ii)
     609              :    end do
     610              :    den = b2(k2+1)
     611              :    do ii=k2,1,-1
     612              :      den = den*xx1 + b2(ii)
     613              :    end do
     614              :    zfermi32 = xx*xx*sqrt(xx)*rn/den
     615              :  end if
     616              : 
     617              : end function zfermi32
     618              : !!***
     619              : 
     620              : !!****f* ABINIT/zfermi2
     621              : !! NAME
     622              : !! zfermi2
     623              : !!
     624              : !! FUNCTION
     625              : !!
     626              : !!  this routine applies a rational function expansion to get the fermi-dirac
     627              : !!  integral of order 2 evaluated at x. maximum error is 1.0e-8.
     628              : !!  reference: antia  priv comm. 11sep94
     629              : !!
     630              : !! INPUTS
     631              : !!
     632              : !! OUTPUT
     633              : !!
     634              : !! SOURCE
     635              : 
     636              :  function zfermi2(xx)
     637              : 
     638              : !Arguments -------------------------------
     639              :  real(dp), intent(in) :: xx
     640              :  real(dp) :: zfermi2
     641              : !Local variables-------------------------------
     642              :  integer ::  ii,m1,k1,m2,k2
     643              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
     644              : 
     645              : !..load the coefficients of the expansion
     646              :  data  an,m1,k1,m2,k2 /2.0_dp, 7, 4, 5, 9/
     647              :  data  (a1(ii),ii=1,8)/-1.434885992395e8_dp,  -2.001711155617e8_dp,&
     648              : & -8.507067153428e7_dp,  -1.175118281976e7_dp,&
     649              : & -3.145120854293e5_dp,   4.275771034579e3_dp,&
     650              : & -8.069902926891e1_dp,   1.0e0_dp/
     651              :  data  (b1(ii),ii=1,5)/-7.174429962316e7_dp,  -1.090535948744e8_dp,&
     652              : & -5.350984486022e7_dp,  -9.646265123816e6_dp,&
     653              : & -5.113415562845e5_dp/
     654              :  data  (a2(ii),ii=1,6)/ 6.919705180051e-8_dp,  1.134026972699e-5_dp,&
     655              : & 7.967092675369e-4_dp,  2.432500578301e-2_dp,&
     656              : & 2.784751844942e-1_dp,  1.0e0_dp/
     657              :  data (b2(ii),ii=1,10)/ 2.075911553728e-7_dp,  3.197196691324e-5_dp,&
     658              : & 2.074576609543e-3_dp,  5.250009686722e-2_dp,&
     659              : & 3.171705130118e-1_dp, -1.147237720706e-1_dp,&
     660              : & 6.638430718056e-2_dp, -1.356814647640e-2_dp,&
     661              : & -3.648576227388e-2_dp,  3.621098757460e-2_dp/
     662              : 
     663              : ! *************************************************************************
     664              : 
     665              :  if (xx .lt. 2.0e0_dp) then
     666              :    xx1 = exp(xx)
     667              :    rn = xx1 + a1(m1)
     668              :    do ii=m1-1,1,-1
     669              :      rn = rn*xx1 + a1(ii)
     670              :    end do
     671              :    den = b1(k1+1)
     672              :    do ii=k1,1,-1
     673              :      den = den*xx1 + b1(ii)
     674              :    end do
     675              :    zfermi2 = xx1 * rn/den
     676              : 
     677              :  else
     678              :    xx1 = one/(xx*xx)
     679              :    rn = xx1 + a2(m2)
     680              :    do ii=m2-1,1,-1
     681              :      rn = rn*xx1 + a2(ii)
     682              :    end do
     683              :    den = b2(k2+1)
     684              :    do ii=k2,1,-1
     685              :      den = den*xx1 + b2(ii)
     686              :    end do
     687              :    zfermi2 = xx*xx*xx*rn/den
     688              :  end if
     689              : 
     690              : end function zfermi2
     691              : !!***
     692              : 
     693              : !!****f* ABINIT/zfermi52
     694              : !! NAME
     695              : !! zfermi52
     696              : !!
     697              : !! FUNCTION
     698              : !!  this routine applies a rational function expansion to get the fermi-dirac
     699              : !!  integral of order 5/2 evaluated at x. maximum error is 2.47d-13.
     700              : !!  reference: antia apjs 84,101 1993
     701              : !!
     702              : !! INPUTS
     703              : !!
     704              : !! OUTPUT
     705              : !!
     706              : !! SOURCE
     707              : 
     708              :  function zfermi52(xx)
     709              : 
     710              : !Arguments -------------------------------
     711              :  real(dp), intent(in) :: xx
     712              :  real(dp) :: zfermi52
     713              : 
     714              : !Local variables-------------------------------
     715              :  integer :: ii,m1,k1,m2,k2
     716              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
     717              : 
     718              : !..load the coefficients of the expansion
     719              :  data  an,m1,k1,m2,k2 /2.5e0_dp, 6, 7, 10, 9/
     720              :  data  (a1(ii),ii=1,7)/6.61606300631656e4_dp,   1.20132462801652e5_dp,&
     721              : & 7.67255995316812e4_dp,   2.10427138842443e4_dp,&
     722              : & 2.44325236813275e3_dp,   1.02589947781696e2_dp,&
     723              : & 1.0e0_dp/
     724              :  data  (b1(ii),ii=1,8)/1.99078071053871e4_dp,   3.79076097261066e4_dp,&
     725              : & 2.60117136841197e4_dp,   7.97584657659364e3_dp,&
     726              : & 1.10886130159658e3_dp,   6.35483623268093e1_dp,&
     727              : & 1.16951072617142e0_dp,   3.31482978240026e-3_dp/
     728              :  data (a2(ii),ii=1,11)/8.42667076131315e-12_dp, 2.31618876821567e-9_dp,&
     729              : & 3.54323824923987e-7_dp,  2.77981736000034e-5_dp,&
     730              : & 1.14008027400645e-3_dp,  2.32779790773633e-2_dp,&
     731              : & 2.39564845938301e-1_dp,  1.24415366126179e0_dp,&
     732              : & 3.18831203950106e0_dp,   3.42040216997894e0_dp,&
     733              : & 1.0e0_dp/
     734              :  data (b2(ii),ii=1,10)/2.94933476646033e-11_dp, 7.68215783076936e-9_dp,&
     735              : & 1.12919616415947e-6_dp,  8.09451165406274e-5_dp,&
     736              : & 2.81111224925648e-3_dp,  3.99937801931919e-2_dp,&
     737              : & 2.27132567866839e-1_dp,  5.31886045222680e-1_dp,&
     738              : & 3.70866321410385e-1_dp,  2.27326643192516e-2_dp/
     739              : 
     740              : ! *************************************************************************
     741              : 
     742              :  if (xx .lt. two) then
     743              :    xx1 = exp(xx)
     744              :    rn = xx1 + a1(m1)
     745              :    do ii=m1-1,1,-1
     746              :      rn = rn*xx1 + a1(ii)
     747              :    end do
     748              :    den = b1(k1+1)
     749              :    do ii=k1,1,-1
     750              :      den = den*xx1 + b1(ii)
     751              :    end do
     752              :    zfermi52 = xx1 * rn/den
     753              : 
     754              :  else
     755              :    xx1 = one/(xx*xx)
     756              :    rn = xx1 + a2(m2)
     757              :    do ii=m2-1,1,-1
     758              :      rn = rn*xx1 + a2(ii)
     759              :    end do
     760              :    den = b2(k2+1)
     761              :    do ii=k2,1,-1
     762              :      den = den*xx1 + b2(ii)
     763              :    end do
     764              :    zfermi52 = xx*xx*xx*sqrt(xx)*rn/den
     765              :  end if
     766              : 
     767              : end function zfermi52
     768              : !!***
     769              : 
     770              : !!****f* ABINIT/zfermi3
     771              : !! NAME
     772              : !! zfermi3
     773              : !!
     774              : !! FUNCTION
     775              : !!  this routine applies a rational function expansion to get the fermi-dirac
     776              : !!  integral of order 3 evaluated at x. maximum error is 1.0e-8.
     777              : !!  reference: antia  priv comm. 11sep94
     778              : !!
     779              : !! INPUTS
     780              : !!
     781              : !! OUTPUT
     782              : !!
     783              : !! SOURCE
     784              : 
     785              :  function zfermi3(xx)
     786              : 
     787              : !Arguments -------------------------------
     788              :  real(dp), intent(in) :: xx
     789              :  real(dp):: zfermi3
     790              : 
     791              : !Local variables-------------------------------
     792              :  integer :: ii,m1,k1,m2,k2
     793              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,xx1
     794              : 
     795              : !..load the coefficients of the expansion
     796              :  data  an,m1,k1,m2,k2 /3.0, 4, 6, 7, 7/
     797              :  data  (a1(ii),ii=1,5)/ 6.317036716422e2_dp,    7.514163924637e2_dp,&
     798              : & 2.711961035750e2_dp,    3.274540902317e1_dp,&
     799              : & 1.0_dp/
     800              :  data  (b1(ii),ii=1,7)/ 1.052839452797e2_dp,    1.318163114785e2_dp,&
     801              : & 5.213807524405e1_dp,    7.500064111991_dp,&
     802              : & 3.383020205492e-1_dp,   2.342176749453e-3_dp,&
     803              : & -8.445226098359e-6_dp/
     804              :  data  (a2(ii),ii=1,8)/ 1.360999428425e-8_dp,   1.651419468084e-6_dp,&
     805              : & 1.021455604288e-4_dp,   3.041270709839e-3_dp,&
     806              : & 4.584298418374e-2_dp,   3.440523212512e-1_dp,&
     807              : & 1.077505444383_dp,    1.0_dp/
     808              :  data  (b2(ii),ii=1,8)/ 5.443997714076e-8_dp,   5.531075760054e-6_dp,&
     809              : & 2.969285281294e-4_dp,   6.052488134435e-3_dp,&
     810              : & 5.041144894964e-2_dp,   1.048282487684e-1_dp,&
     811              : & 1.280969214096e-2_dp,  -2.851555446444e-3_dp/
     812              : 
     813              : ! *************************************************************************
     814              : 
     815              :  if (xx .lt. two) then
     816              :    xx1 = exp(xx)
     817              :    rn = xx1 + a1(m1)
     818              :    do ii=m1-1,1,-1
     819              :      rn = rn*xx1 + a1(ii)
     820              :    end do
     821              :    den = b1(k1+1)
     822              :    do ii=k1,1,-1
     823              :      den = den*xx1 + b1(ii)
     824              :    end do
     825              :    zfermi3 = xx1 * rn/den
     826              : 
     827              :  else
     828              :    xx1 = one/(xx*xx)
     829              :    rn = xx1 + a2(m2)
     830              :    do ii=m2-1,1,-1
     831              :      rn = rn*xx1 + a2(ii)
     832              :    end do
     833              :    den = b2(k2+1)
     834              :    do ii=k2,1,-1
     835              :      den = den*xx1 + b2(ii)
     836              :    end do
     837              :    zfermi3 = xx*xx*xx*xx*rn/den
     838              :  end if
     839              : 
     840              : end function zfermi3
     841              : !!***
     842              : 
     843              : !!****f* ABINIT/ifermim12
     844              : !! NAME
     845              : !! ifermim12
     846              : !!
     847              : !! FUNCTION
     848              : !!  this routine applies a rational function expansion to get the inverse
     849              : !!  fermi-dirac integral of order -1/2 when it is equal to f.
     850              : !!  maximum error is 3.03d-9.   reference: antia apjs 84,101 1993
     851              : !!
     852              : !! INPUTS
     853              : !!
     854              : !! OUTPUT
     855              : !!
     856              : !! SOURCE
     857              : 
     858              :  function ifermim12(ff)
     859              : 
     860              : !Arguments -------------------------------
     861              :  real(dp), intent(in) :: ff
     862              :  real(dp) :: ifermim12
     863              : !Local variables-------------------------------
     864              :  integer :: ii,m1,k1,m2,k2
     865              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,ff1
     866              : 
     867              : !..load the coefficients of the expansion
     868              :  data  an,m1,k1,m2,k2 /-0.5e0_dp, 5, 6, 6, 6/
     869              :  data  (a1(ii),ii=1,6)/-1.570044577033e4_dp,   1.001958278442e4_dp,&
     870              : & -2.805343454951e3_dp,   4.121170498099e2_dp,&
     871              : & -3.174780572961e1_dp,   1.0e0_dp/
     872              :  data  (b1(ii),ii=1,7)/-2.782831558471e4_dp,   2.886114034012e4_dp,&
     873              : & -1.274243093149e4_dp,   3.063252215963e3_dp,&
     874              : & -4.225615045074e2_dp,   3.168918168284e1_dp,&
     875              : & -1.008561571363e0_dp/
     876              :  data  (a2(ii),ii=1,7)/ 2.206779160034e-8_dp,  -1.437701234283e-6_dp,&
     877              : & 6.103116850636e-5_dp,  -1.169411057416e-3_dp,&
     878              : & 1.814141021608e-2_dp,  -9.588603457639e-2_dp,&
     879              : & 1.0e0_dp/
     880              :  data  (b2(ii),ii=1,7)/ 8.827116613576e-8_dp,  -5.750804196059e-6_dp,&
     881              : & 2.429627688357e-4_dp,  -4.601959491394e-3_dp,&
     882              : & 6.932122275919e-2_dp,  -3.217372489776e-1_dp,&
     883              : & 3.124344749296e0_dp/
     884              : 
     885              : ! *************************************************************************
     886              : 
     887              :  if (ff .lt. 4.0e0_dp) then
     888              :    rn = ff + a1(m1)
     889              :    do ii=m1-1,1,-1
     890              :      rn = rn*ff + a1(ii)
     891              :    end do
     892              :    den = b1(k1+1)
     893              :    do ii=k1,1,-1
     894              :      den = den*ff + b1(ii)
     895              :    end do
     896              :    ifermim12 = log(ff * rn/den)
     897              : 
     898              :  else
     899              :    ff1 = one/ff**(one/(one + an))
     900              :    rn = ff1 + a2(m2)
     901              :    do ii=m2-1,1,-1
     902              :      rn = rn*ff1 + a2(ii)
     903              :    end do
     904              :    den = b2(k2+1)
     905              :    do ii=k2,1,-1
     906              :      den = den*ff1 + b2(ii)
     907              :    end do
     908              :    ifermim12 = rn/(den*ff1)
     909              :  end if
     910              : 
     911              : end function ifermim12
     912              : !!***
     913              : 
     914              : !!****f* ABINIT/ifermi12
     915              : !! NAME
     916              : !! ifermi12
     917              : !!
     918              : !! FUNCTION
     919              : !!   this routine applies a rational function expansion to get the inverse
     920              : !!   fermi-dirac integral of order 1/2 when it is equal to f.
     921              : !!   maximum error is 4.19d-9.   reference: antia apjs 84,101 1993
     922              : !!
     923              : !! INPUTS
     924              : !!
     925              : !! OUTPUT
     926              : !!
     927              : !! SOURCE
     928              : 
     929              :  function ifermi12(ff)
     930              : 
     931              : !Arguments -------------------------------
     932              :  real(dp), intent(in) :: ff
     933              :  real(dp) :: ifermi12
     934              : !Local variables-------------------------------
     935              :  integer :: ii,m1,k1,m2,k2
     936              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,ff1
     937              : 
     938              : !..load the coefficients of the expansion
     939              :  data  an,m1,k1,m2,k2 /0.5e0_dp, 4, 3, 6, 5/
     940              :  data  (a1(ii),ii=1,5)/ 1.999266880833e4_dp,   5.702479099336e3_dp,&
     941              : & 6.610132843877e2_dp,   3.818838129486e1_dp,&
     942              : & 1.0e0_dp/
     943              :  data  (b1(ii),ii=1,4)/ 1.771804140488e4_dp,  -2.014785161019e3_dp,&
     944              : & 9.130355392717e1_dp,  -1.670718177489e0_dp/
     945              :  data  (a2(ii),ii=1,7)/-1.277060388085e-2_dp,  7.187946804945e-2_dp,&
     946              : & -4.262314235106e-1_dp,  4.997559426872e-1_dp,&
     947              : & -1.285579118012e0_dp,  -3.930805454272e-1_dp,&
     948              : & 1.0e0_dp/
     949              :  data  (b2(ii),ii=1,6)/-9.745794806288e-3_dp,  5.485432756838e-2_dp,&
     950              : & -3.299466243260e-1_dp,  4.077841975923e-1_dp,&
     951              : & -1.145531476975e0_dp,  -6.067091689181e-2_dp/
     952              : 
     953              : ! *************************************************************************
     954              : 
     955              :  if (ff .lt. 4.0e0_dp) then
     956              :    rn = ff + a1(m1)
     957              :    do ii=m1-1,1,-1
     958              :      rn = rn*ff + a1(ii)
     959              :    end do
     960              :    den = b1(k1+1)
     961              :    do ii=k1,1,-1
     962              :      den = den*ff + b1(ii)
     963              :    end do
     964              :    ifermi12 = log(ff * rn/den)
     965              : 
     966              :  else
     967              :    ff1 = one/ff**(one/(one + an))
     968              :    rn = ff1 + a2(m2)
     969              :    do ii=m2-1,1,-1
     970              :      rn = rn*ff1 + a2(ii)
     971              :    end do
     972              :    den = b2(k2+1)
     973              :    do ii=k2,1,-1
     974              :      den = den*ff1 + b2(ii)
     975              :    end do
     976              :    ifermi12 = rn/(den*ff1)
     977              :  end if
     978              : 
     979              : end function ifermi12
     980              : !!***
     981              : 
     982              : !!****f* ABINIT/ifermi32
     983              : !! NAME
     984              : !! ifermi32
     985              : !!
     986              : !! FUNCTION
     987              : !!   this routine applies a rational function expansion to get the inverse
     988              : !!   fermi-dirac integral of order 3/2 when it is equal to f.
     989              : !!   maximum error is 2.26d-9.   reference: antia apjs 84,101 1993
     990              : !!
     991              : !! INPUTS
     992              : !!
     993              : !! OUTPUT
     994              : !!
     995              : !! SOURCE
     996              : 
     997              :  function ifermi32(ff)
     998              : 
     999              : !Arguments -------------------------------
    1000              :  real(dp), intent(in) :: ff
    1001              :  real(dp) :: ifermi32
    1002              : !Local variables-------------------------------
    1003              :  integer :: ii,m1,k1,m2,k2
    1004              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,ff1
    1005              : 
    1006              : !..load the coefficients of the expansion
    1007              :  data  an,m1,k1,m2,k2 /1.5e0_dp, 3, 4, 6, 5/
    1008              :  data  (a1(ii),ii=1,4)/ 1.715627994191e2_dp,   1.125926232897e2_dp,&
    1009              : & 2.056296753055e1_dp,   1.0e0_dp/
    1010              :  data  (b1(ii),ii=1,5)/ 2.280653583157e2_dp,   1.193456203021e2_dp,&
    1011              : & 1.167743113540e1_dp,  -3.226808804038e-1_dp,&
    1012              : & 3.519268762788e-3_dp/
    1013              :  data  (a2(ii),ii=1,7)/-6.321828169799e-3_dp, -2.183147266896e-2_dp,&
    1014              : & -1.057562799320e-1_dp, -4.657944387545e-1_dp,&
    1015              : & -5.951932864088e-1_dp,  3.684471177100e-1_dp,&
    1016              : & 1.0e0_dp/
    1017              :  data  (b2(ii),ii=1,6)/-4.381942605018e-3_dp, -1.513236504100e-2_dp,&
    1018              : & -7.850001283886e-2_dp, -3.407561772612e-1_dp,&
    1019              : & -5.074812565486e-1_dp, -1.387107009074e-1_dp/
    1020              : 
    1021              : ! *************************************************************************
    1022              : 
    1023              :  if (ff .lt. 4.0e0_dp) then
    1024              :    rn = ff + a1(m1)
    1025              :    do ii=m1-1,1,-1
    1026              :      rn = rn*ff + a1(ii)
    1027              :    end do
    1028              :    den = b1(k1+1)
    1029              :    do ii=k1,1,-1
    1030              :      den = den*ff + b1(ii)
    1031              :    end do
    1032              :    ifermi32 = log(ff * rn/den)
    1033              : 
    1034              :  else
    1035              :    ff1 = one/ff**(one/(one + an))
    1036              :    rn = ff1 + a2(m2)
    1037              :    do ii=m2-1,1,-1
    1038              :      rn = rn*ff1 + a2(ii)
    1039              :    end do
    1040              :    den = b2(k2+1)
    1041              :    do ii=k2,1,-1
    1042              :      den = den*ff1 + b2(ii)
    1043              :    end do
    1044              :    ifermi32 = rn/(den*ff1)
    1045              :  end if
    1046              : 
    1047              : end function ifermi32
    1048              : !!***
    1049              : 
    1050              : !!****f* ABINIT/ifermi52
    1051              : !! NAME
    1052              : !! ifermi52
    1053              : !!
    1054              : !! FUNCTION
    1055              : !!   this routine applies a rational function expansion to get the inverse
    1056              : !!   fermi-dirac integral of order 5/2 when it is equal to f.
    1057              : !!   maximum error is 6.17d-9.   reference: antia apjs 84,101 1993
    1058              : !!
    1059              : !! INPUTS
    1060              : !!
    1061              : !! OUTPUT
    1062              : !!
    1063              : !! SOURCE
    1064              : 
    1065              :  function ifermi52(ff)
    1066              : 
    1067              : !Arguments -------------------------------
    1068              :  real(dp), intent(in) :: ff
    1069              :  real(dp) :: ifermi52
    1070              : 
    1071              : !Local variables-------------------------------
    1072              :  integer :: ii,m1,k1,m2,k2
    1073              :  real(dp) :: an,a1(12),b1(12),a2(12),b2(12),rn,den,ff1
    1074              : 
    1075              : !..load the coefficients of the expansion
    1076              :  data  an,m1,k1,m2,k2 /2.5e0_dp, 2, 3, 6, 6/
    1077              :  data  (a1(ii),ii=1,3)/ 2.138969250409e2_dp,   3.539903493971e1_dp,&
    1078              : & 1.0e0_dp/
    1079              :  data  (b1(ii),ii=1,4)/ 7.108545512710e2_dp,   9.873746988121e1_dp,&
    1080              : & 1.067755522895e0_dp,  -1.182798726503e-2_dp/
    1081              :  data  (a2(ii),ii=1,7)/-3.312041011227e-2_dp,  1.315763372315e-1_dp,&
    1082              : & -4.820942898296e-1_dp,  5.099038074944e-1_dp,&
    1083              : & 5.495613498630e-1_dp, -1.498867562255e0_dp,&
    1084              : & 1.0e0_dp/
    1085              :  data  (b2(ii),ii=1,7)/-2.315515517515e-2_dp,  9.198776585252e-2_dp,&
    1086              : & -3.835879295548e-1_dp,  5.415026856351e-1_dp,&
    1087              : & -3.847241692193e-1_dp,  3.739781456585e-2_dp,&
    1088              : & -3.008504449098e-2_dp/
    1089              : 
    1090              : ! *************************************************************************
    1091              : 
    1092              :  if (ff .lt. 4.0e0_dp) then
    1093              :    rn = ff + a1(m1)
    1094              :    do ii=m1-1,1,-1
    1095              :      rn = rn*ff + a1(ii)
    1096              :    end do
    1097              :    den = b1(k1+1)
    1098              :    do ii=k1,1,-1
    1099              :      den = den*ff + b1(ii)
    1100              :    end do
    1101              :    ifermi52 = log(ff * rn/den)
    1102              : 
    1103              :  else
    1104              :    ff1 = one/ff**(one/(one + an))
    1105              :    rn = ff1 + a2(m2)
    1106              :    do ii=m2-1,1,-1
    1107              :      rn = rn*ff1 + a2(ii)
    1108              :    end do
    1109              :    den = b2(k2+1)
    1110              :    do ii=k2,1,-1
    1111              :      den = den*ff1 + b2(ii)
    1112              :    end do
    1113              :    ifermi52 = rn/(den*ff1)
    1114              :  end if
    1115              : 
    1116              : end function ifermi52
    1117              : !!***
    1118              : 
    1119              : !!****f* ABINIT/fp12a1
    1120              : !! NAME
    1121              : !! fp12a1
    1122              : !!
    1123              : !! FUNCTION
    1124              : !!
    1125              : !! INPUTS
    1126              : !!
    1127              : !! OUTPUT
    1128              : !!
    1129              : !! SOURCE
    1130              : 
    1131              :  function fp12a1 (x)
    1132              : 
    1133              : ! Arguments -------------------------------
    1134              :  real(dp),intent(in) :: x
    1135              :  real(dp) :: fp12a1
    1136              : 
    1137              :  real(dp) :: y
    1138              : 
    1139              : !**********************************************************************
    1140              : !*                                                                    *
    1141              : !*               Integrale de Fermi d'ordre 1/2                       *
    1142              : !*    Fp12(x) = somme de 0 a l'infini de (dt*t**1/2)/(1+exp(t-x))     *
    1143              : !*                                                                    *
    1144              : !**********************************************************************
    1145              : !
    1146              : !H. M. Antia, Astrophys. J. Suppl. 84, 101 (1993)
    1147              : !Erreur relative maximum annoncee 5.54 e-5
    1148              : !Erreur relative maximum constatee : -5.53e-5 pour eta = 2
    1149              : !
    1150              :  if (x.lt.2._dp) then
    1151              :    y=exp(x)
    1152              :    fp12a1=y*(21.8168_dp+y*(13.1693_dp+y))&
    1153              : &   /(24.6180_dp+y*(23.5546_dp+y*(4.76290_dp+y*0.134481_dp)))
    1154              :  else
    1155              :    y=one/(x*x)
    1156              :    fp12a1=x*sqrt(x)*(0.0473011_dp+y*(0.548433_dp+y))&
    1157              : &   /(0.0709478_dp+y*(0.737041_dp+y*0.382065_dp))
    1158              :  end if
    1159              : !
    1160              : !**********************************************************************
    1161              :  end function fp12a1
    1162              : !!***
    1163              : 
    1164              : !!****f* ABINIT/fp32a1
    1165              : !! NAME
    1166              : !! fp32a1
    1167              : !!
    1168              : !! FUNCTION
    1169              : !!
    1170              : !! INPUTS
    1171              : !!
    1172              : !! OUTPUT
    1173              : !!
    1174              : !! SOURCE
    1175              : 
    1176     12255408 :  function fp32a1 (x)
    1177              : 
    1178              : !Arguments -------------------------------
    1179              :  real(dp),intent(in) :: x
    1180              :  real(dp) :: fp32a1
    1181              : 
    1182              :  real(dp) :: y,x2
    1183              : 
    1184              : !
    1185              : !**********************************************************************
    1186              : !*                                                                    *
    1187              : !*               Integrale de Fermi d'ordre 3/2                       *
    1188              : !*    Fp32(x) = somme de 0 a l'infini de (dt*t**3/2)/(1+exp(t-x))     *
    1189              : !*                                                                    *
    1190              : !**********************************************************************
    1191              : !
    1192              : !H. M. Antia, Astrophys. J. Suppl. 84, 101 (1993)
    1193              : !Erreur relative maximum annoncee 6.54 e-5
    1194              : !Erreur relative maximum constatee : -5.84e-5 pour eta = -5
    1195              : !
    1196     12255408 :  if (x.lt.two) then
    1197            0 :    y=exp(x)
    1198            0 :    fp32a1=y*(135.863_dp+y*(49.2764_dp+y))/(102.210_dp+y*(55.0312_dp+y*4.23365_dp))
    1199              :  else
    1200     12255408 :    x2=x*x
    1201     12255408 :    y=1._dp/x2
    1202              :    fp32a1=x2*sqrt(x)*(0.154699_dp+y*(1.20037_dp+y))&
    1203     12255408 : &   /(0.386765_dp+y*(0.608119_dp-y*0.165665_dp))
    1204              :  end if
    1205              : !
    1206              : !**********************************************************************
    1207     12255408 :  end function fp32a1
    1208              : !!***
    1209              : 
    1210              : !!****f* ABINIT/xp12a1
    1211              : !! NAME
    1212              : !! xp12a1
    1213              : !!
    1214              : !! FUNCTION
    1215              : !!
    1216              : !! INPUTS
    1217              : !!
    1218              : !! OUTPUT
    1219              : !!
    1220              : !! SOURCE
    1221              : 
    1222              :  function xp12a1 (y)
    1223              : 
    1224              : !Arguments -------------------------------
    1225              :  real(dp) :: xp12a1
    1226              :  real(dp),intent(in) :: y
    1227              : 
    1228              :  real(dp),parameter :: deux=2._dp,deuxs3=deux/3._dp
    1229              :  real(dp) :: top,den,z
    1230              : 
    1231              : !
    1232              : !**********************************************************************
    1233              : !*                                                                    *
    1234              : !*              Calcul de eta tel que fp12 (eta) = y                  *
    1235              : !*          ou fp12 est l'integrale de Fermi d'ordre +1/2             *
    1236              : !*                                                                    *
    1237              : !**********************************************************************
    1238              : !
    1239              : !H. M. Antia, Astrophys. J. Suppl. 84, 101 (1993)
    1240              : !Erreur relative maximum annoncee sur exp(eta) : 3.02 e-5
    1241              : !
    1242              :  if (y.lt.4._dp) then
    1243              :    top=44.593646_dp+y*(11.288764_dp+y)
    1244              :    den=39.519346_dp+y*(-5.7517464_dp+y*0.26594291_dp)
    1245              :    xp12a1=log(y*top/den)
    1246              :  else
    1247              :    z=y**(-deuxs3)
    1248              :    top=34.873722_dp+z*(-26.922515_dp+z)
    1249              :    den=26.612832_dp+z*(-20.452930_dp+z*11.808945_dp)
    1250              :    xp12a1=top/(z*den)
    1251              :  end if
    1252              : !
    1253              : !**********************************************************************
    1254              :  end function xp12a1
    1255              : !!***
    1256              : 
    1257              : !!****f* ABINIT/fm12a1
    1258              : !! NAME
    1259              : !! fm12a1
    1260              : !!
    1261              : !! FUNCTION
    1262              : !!
    1263              : !! INPUTS
    1264              : !!
    1265              : !! OUTPUT
    1266              : !!
    1267              : !! SOURCE
    1268              : 
    1269              :  function fm12a1 (x)
    1270              : 
    1271              : !Arguments -------------------------------
    1272              :  real(dp),intent(in) :: x
    1273              :  real(dp) :: fm12a1
    1274              : 
    1275              :  real(dp) :: y
    1276              : 
    1277              : !
    1278              : !**********************************************************************
    1279              : !*                                                                    *
    1280              : !*               Integrale de Fermi d'ordre -1/2                      *
    1281              : !*    Fm12(x) = somme de 0 a l'infini de (dt*t**-1/2)/(1+exp(t-x))    *
    1282              : !*                                                                    *
    1283              : !**********************************************************************
    1284              : !
    1285              : !H. M. Antia, Astrophys. J. Suppl. 84, 101 (1993)
    1286              : !Erreur relative maximum annoncee 4.75 e-5
    1287              : !
    1288              :  if (x.lt.2._dp) then
    1289              :    y=exp(x)
    1290              :    fm12a1=y*(23.1456_dp+y*(13.7820_dp+y))&
    1291              : &   /(13.0586_dp+y*(17.0048_dp+y*(5.07527_dp+y*0.236620_dp)))
    1292              :  else
    1293              :    y=1./(x*x)
    1294              :    fm12a1=sqrt(x)*(0.0153602_dp+y*(0.146815_dp+y))&
    1295              : &   /(0.00768015_dp+y*(0.0763700_dp+y*0.570485_dp))
    1296              :  end if
    1297              : !
    1298              : !**********************************************************************
    1299              :  end function fm12a1
    1300              : !!***
    1301              : 
    1302              : !!****f* ABINIT/fm12a1t
    1303              : !! NAME
    1304              : !! fm12a1t
    1305              : !!
    1306              : !! FUNCTION
    1307              : !!
    1308              : !! INPUTS
    1309              : !!
    1310              : !! OUTPUT
    1311              : !!
    1312              : !! SOURCE
    1313              : 
    1314         2182 :  subroutine fm12a1t (cktf,rtnewt,tphysel,vtrial,rhor_middx,rhor_mid,nfft)
    1315              : 
    1316              :  integer,intent(in) :: nfft
    1317              :  real(dp),intent(in) :: tphysel,rtnewt,cktf
    1318              :  real(dp),intent(in) :: vtrial(nfft)
    1319              :  real(dp),intent(out) :: rhor_middx(nfft),rhor_mid(nfft)
    1320              : 
    1321              :  !intrinsic exp,sqrt
    1322              :  integer :: ifft
    1323              :  real(dp) :: x,y,sqrtx
    1324              : 
    1325              : !
    1326              : !**********************************************************************
    1327              : !*                                                                    *
    1328              : !*               Integrale de Fermi d'ordre -1/2                      *
    1329              : !*    Fm12(x) = somme de 0 a l'infini de (dt*t**-1/2)/(1+exp(t-x))    *
    1330              : !*                      ....                                              *
    1331              : !**********************************************************************
    1332              : !
    1333              : !H. M. Antia, Astrophys. J. Suppl. 84, 101 (1993)
    1334              : !Erreur relative maximum annoncee 4.75 e-5
    1335              : !
    1336     97127446 :  do ifft=1,nfft
    1337     97125264 :    x=(rtnewt-vtrial(ifft))/tphysel
    1338     97127446 :    if (x.lt.2._dp) then
    1339      9875783 :      y=exp(x)
    1340              :      rhor_middx(ifft)=cktf*y*(23.1456e0_dp+y*(13.7820e0_dp+y))&
    1341      9875783 : &     /(13.0586e0_dp+y*(17.0048e0_dp+y*(5.07527e0_dp+y*0.236620e0_dp)))
    1342              :      rhor_mid(ifft)=cktf*y*(21.8168_dp+y*(13.1693_dp+y))&
    1343      9875783 : &     /(24.6180+y*(23.5546_dp+y*(4.76290_dp+y*0.134481_dp)))
    1344              :    else
    1345     87249481 :      y=1._dp/(x*x)
    1346     87249481 :      sqrtx=sqrt(x)
    1347              :      rhor_middx(ifft)=cktf*sqrtx*(0.0153602e0_dp+y*(0.146815e0_dp+y))&
    1348     87249481 : &     /(0.00768015e0_dp+y*(0.0763700e0_dp+y*0.570485e0_dp))
    1349              :      rhor_mid(ifft)=cktf*x*sqrtx*(0.0473011_dp+y*(0.548433_dp+y))&
    1350     87249481 : &     /(0.0709478_dp+y*(0.737041_dp+y*0.382065_dp))
    1351              :    end if
    1352              :  end do
    1353              : !
    1354              : !**********************************************************************
    1355         2182 :  end subroutine fm12a1t
    1356              : !!***
    1357              : 
    1358              : end subroutine vtorhotf
    1359              : !!***
    1360              : 
    1361              : end module m_vtorhotf
    1362              : !!***
        

Generated by: LCOV version 2.3-1