LCOV - code coverage report
Current view: top level - src/77_ddb - m_eliashberg_1d.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 98.3 % 120 118
Test Date: 2026-09-20 15:27:41 Functions: 100.0 % 4 4

            Line data    Source code
       1              : !!****m* ABINIT/m_eliashberg_1d
       2              : !! NAME
       3              : !!  m_eliashberg_1d
       4              : !!
       5              : !! FUNCTION
       6              : !!  Solve the Eliashberg equations in the isotropic case
       7              : !!
       8              : !! COPYRIGHT
       9              : !!  Copyright (C) 2008-2026 ABINIT group (MVer)
      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_eliashberg_1d
      23              : 
      24              :  use defs_basis
      25              :  use defs_elphon
      26              :  use m_errors
      27              :  use m_abicore
      28              :  use m_io_tools
      29              :  use m_abicore
      30              : 
      31              :  use m_numeric_tools,   only : simpson_int
      32              : 
      33              :  implicit none
      34              : 
      35              :  private
      36              : !!***
      37              : 
      38              :  public :: eliashberg_1d
      39              : !!***
      40              : 
      41              : contains
      42              : !!***
      43              : 
      44              : !!****f* m_eliashberg_1d/eliashberg_1d
      45              : !!
      46              : !! NAME
      47              : !! eliashberg_1d
      48              : !!
      49              : !! FUNCTION
      50              : !!  Solve the Eliashberg equations in the isotropic case
      51              : !!  First the linearized case, which allows the estimation of Tc
      52              : !!  then the full case which gives the gap as a function of temperature.
      53              : !!
      54              : !! INPUTS
      55              : !!  a2f_1d = alpha^2F function averaged over the FS (only energy dependence)
      56              : !!  elph_ds = datastructure with phonon matrix elements
      57              : !!  gkk2 = gkk2 matrix elements on full FS grid for each phonon mode
      58              : !!  natom = number of atoms
      59              : !!
      60              : !! OUTPUT
      61              : !!
      62              : !! NOTES
      63              : !!  na2f = number of frequency points for alpha^2F function
      64              : !!
      65              : !! SOURCE
      66              : 
      67           15 : subroutine eliashberg_1d(a2f_1d,elph_ds,mustar)
      68              : 
      69              : !Arguments ------------------------------------
      70              : !scalars
      71              :  real(dp),intent(in) :: mustar
      72              :  type(elph_type),intent(in) :: elph_ds
      73              : !arrays
      74              :  real(dp),intent(in) :: a2f_1d(elph_ds%na2f)
      75              : 
      76              : !Local variables-------------------------------
      77              :   ! for diagonalization of gammma matrix
      78              :   ! output variables for gtdyn9+dfpt_phfrq
      79              : !scalars
      80              :  integer :: iiter,imatsu
      81              :  integer :: maxiter,nmatsu,unit_del,unit_lam,unit_z
      82              :  real(dp) :: maxeigval,omega_cutoff
      83              :  real(dp) :: tc
      84              :  character(len=fnlen) :: fname
      85              : !arrays
      86           15 :  real(dp),allocatable :: delta_1d(:),lambda_1d(:),mm_1d(:,:),z_1d(:)
      87              : 
      88              : ! *********************************************************************
      89              : 
      90           15 :  call wrtout(std_out,'Solving the 1-D Eliashberg equation (isotropic case)',"COLL")
      91              : 
      92           15 :  if (elph_ds%nsppol /= 1) then
      93            1 :    write(std_out,*) 'eliashberg_1d is not coded for nsppol > 1 yet'
      94              :    return
      95              :  end if
      96              : 
      97              : !maximum number of iterations to find T_c
      98           14 :  maxiter=30
      99              : 
     100              : !Fix nmatsu. Should add test in iiter loop to check if
     101              : !omega_cutoff is respected
     102           14 :  nmatsu = 50
     103              : !write(std_out,*) ' eliashberg_1d : nmatsu = ', nmatsu
     104              : 
     105           14 :  ABI_MALLOC(lambda_1d,(-nmatsu:nmatsu))
     106           14 :  ABI_MALLOC(z_1d,(-nmatsu:nmatsu))
     107           14 :  ABI_MALLOC(delta_1d,(-nmatsu:nmatsu))
     108           14 :  ABI_MALLOC(mm_1d,(-nmatsu:nmatsu,-nmatsu:nmatsu))
     109              : 
     110           14 :  unit_lam=get_unit()
     111           14 :  fname=trim(elph_ds%elph_base_name) // "_LAM"
     112           14 :  open (UNIT=unit_lam,FILE=fname,STATUS='REPLACE')
     113           14 :  unit_z=get_unit()
     114           14 :  fname=trim(elph_ds%elph_base_name) // "_Z"
     115           14 :  open (UNIT=unit_z,FILE=fname,STATUS='REPLACE')
     116           14 :  unit_del=get_unit()
     117           14 :  fname=trim(elph_ds%elph_base_name) // "_DEL"
     118           14 :  open (UNIT=unit_del,FILE=fname,STATUS='REPLACE')
     119              : 
     120              : !
     121              : !1) use linearized Eliashberg equation to find Tc
     122              : !! \sum_j \mathbf{M}_{ij} \Delta_j = \zeta \cdot \Delta_i $ $i,j = 1 .. n_{\mathrm{Matsubara}}$
     123              : !$\zeta = 1$ gives T$_c$ $\beta = \frac{1}{\mathrm{T}}$ $\omega_i = (2 i + 1) \pi \mathrm{T}$
     124              : !! \mathbf{M}_{ij} = \frac{\pi}{\beta} \frac{\lambda (\omega_i - \omega_j)}{Z (\omega_i)}$
     125              : !! Z (\omega_i) = 1 + \frac{\pi}{\beta \omega_i} \sum_j \lambda(\omega_i - \omega_j) \mathrm{sgn}(\omega_j)$
     126              : !
     127              : 
     128              : !initial guess for T$_c$ in Hartree (1Ha =3.067e5 K)
     129           14 :  tc = 0.0001
     130              : !
     131              : !big iterative loop
     132              : !
     133          352 :  do iiter=1,maxiter
     134              : 
     135          345 :    omega_cutoff = (two*nmatsu+one) * pi * tc
     136              : 
     137              : !
     138              : !  calculate array of lambda values
     139              : !
     140          345 :    call eli_lambda_1d (a2f_1d,elph_ds,lambda_1d,nmatsu,tc)
     141          345 :    write (unit_lam,'(a)') '#'
     142          345 :    write (unit_lam,'(a)') '# ABINIT package : lambda file'
     143          345 :    write (unit_lam,'(a)') '#'
     144          345 :    write (unit_lam,'(a,I10,a)') '# lambda_1d array containing 2*', nmatsu, '+1 Matsubara frequency points'
     145          345 :    write (unit_lam,'(a,E16.6,a,E16.6)') '#  from ', -omega_cutoff, ' to ', omega_cutoff
     146          345 :    write (unit_lam,'(a)') '#  lambda_1d is the frequency dependent coupling constant '
     147          345 :    write (unit_lam,'(a)') '#  in the Eliashberg equations '
     148          345 :    write (unit_lam,'(a)') '#'
     149        35190 :    do imatsu=-nmatsu,nmatsu
     150        35190 :      write (unit_lam,*) imatsu,lambda_1d(imatsu)
     151              :    end do
     152          345 :    write (unit_lam,*)
     153              : 
     154              : !
     155              : !  calculate array of z values
     156              : !
     157          345 :    call eli_z_1d (lambda_1d,nmatsu,z_1d)
     158          345 :    write (unit_z,'(a)') '#'
     159          345 :    write (unit_z,'(a)') '# ABINIT package : Z file'
     160          345 :    write (unit_z,'(a)') '#'
     161          345 :    write (unit_z,'(a,I10,a)') '# z_1d array containing 2*', nmatsu, '+1 Matsubara frequency points'
     162          345 :    write (unit_z,'(a,E16.6,a,E16.6)') '# from ', -omega_cutoff, ' to ', omega_cutoff
     163          345 :    write (unit_z,'(a)') '# z_1d is the renormalization factor in the Eliashberg equations'
     164          345 :    write (unit_z,'(a)') '#'
     165        35190 :    do imatsu=-nmatsu,nmatsu
     166        35190 :      write (unit_z,*) imatsu,z_1d(imatsu)
     167              :    end do
     168              : 
     169              : !  !
     170              : !  ! apply M matrix until a maximal eigenvalue is found.
     171              : !  !
     172              : !  call eli_m_iter_1d (delta_1d,lambda_1d,maxeigval,nmatsu,z_1d)
     173              : 
     174              : !
     175              : !  diagonalize M brute forcefully
     176              : !
     177          345 :    call eli_diag_m_1d(delta_1d,lambda_1d,maxeigval,mustar,nmatsu,tc,z_1d)
     178              : 
     179          345 :    write (unit_del,'(a)') '#'
     180          345 :    write (unit_del,'(a)') '# eliashberg_1d : delta_1d = '
     181          345 :    write (unit_del,'(a)') '#'
     182          345 :    write (unit_del,'(a,i6,a)') '# delta_1d array containing 2*', nmatsu, '+1 Matsubara frequency points'
     183          345 :    write (unit_z,'(a,E16.6,a,E16.6)') '# from ', -omega_cutoff, ' to ', omega_cutoff
     184          345 :    write (unit_z,'(a)') '# delta_1d is the gap function in the Eliashberg equations'
     185          345 :    write (unit_z,'(a)') '#'
     186        35190 :    do imatsu=-nmatsu,nmatsu
     187        35190 :      write (unit_del,*) imatsu,delta_1d(imatsu)
     188              :    end do
     189          345 :    write (unit_del,*)
     190              : 
     191              : !  if eigenvalue is < 1 increase T
     192              : !  else if eigenvalue is > 1 decrease T
     193              : !  if eigenvalue ~= 1 stop
     194              : !
     195          697 :    if (abs(maxeigval-one) < tol8) then
     196            7 :      write(std_out,*) 'Eliashberg Tc found = ', tc, ' (Ha) = ', tc/kb_HaK, ' (K)'
     197            7 :      exit
     198          338 :    else if (maxeigval > 0.001_dp) then
     199          338 :      tc = tc * maxeigval
     200              :    else
     201            0 :      write(std_out,*) 'maxeigval is very small'
     202            0 :      tc = tc * 1000.0_dp
     203              :    end if
     204              : 
     205              : 
     206              :  end do
     207              : !end iiter do
     208              : 
     209           14 :  if (abs(maxeigval-one) > tol8) then
     210            7 :    write(std_out,*) 'eliashberg_1d : Tc not converged. ', maxeigval, ' /= 1'
     211            7 :    write(std_out,*) 'Eliashberg Tc nonetheless = ', tc, ' (Ha) = ', tc/kb_HaK, ' (K)'
     212              :  end if
     213              : 
     214           14 :  ABI_FREE(lambda_1d)
     215           14 :  ABI_FREE(z_1d)
     216           14 :  ABI_FREE(delta_1d)
     217           14 :  ABI_FREE(mm_1d)
     218              : 
     219           14 :  close (UNIT=unit_z)
     220           14 :  close (UNIT=unit_lam)
     221           14 :  close (UNIT=unit_del)
     222              : 
     223           14 :  write(std_out,*) ' eliashberg_1d : end '
     224              : 
     225              : end subroutine eliashberg_1d
     226              : !!***
     227              : 
     228              : !!****f* m_eliashberg_1d/eli_app_m_1d
     229              : !!
     230              : !! NAME
     231              : !! eli_app_m_1d
     232              : !!
     233              : !! FUNCTION
     234              : !!   Apply the linearized Eliashberg matrix once to the input vector.
     235              : !!
     236              : !! INPUTS
     237              : !!   lambda_1d = coupling constant as a function of frequency
     238              : !!   nmatsu = number of Matsubara frequencies
     239              : !!   tc = guess for critical temperature
     240              : !!   z_1d = renormalization Z as a function of frequency
     241              : !!
     242              : !! SIDE EFFECTS
     243              : !!   delta_1d = imaginary gap function as a function of frequency changed
     244              : !!
     245              : !! SOURCE
     246              : 
     247              : 
     248              : subroutine eli_app_m_1d (delta_1d,lambda_1d,nmatsu,z_1d)
     249              : 
     250              : !Arguments ------------------------------------
     251              : !scalars
     252              :  integer,intent(in) :: nmatsu
     253              : !arrays
     254              :  real(dp),intent(in) :: lambda_1d(-nmatsu:nmatsu),z_1d(-nmatsu:nmatsu)
     255              :  real(dp),intent(inout) :: delta_1d(-nmatsu:nmatsu)
     256              : 
     257              : !Local variables-------------------------------
     258              : !scalars
     259              :  integer :: imatsu,jmatsu,miguelflag
     260              :  real(dp) :: zfact
     261              : !arrays
     262              :  real(dp) :: delta_tmp(-nmatsu:nmatsu),freqfact(-nmatsu:nmatsu)
     263              : 
     264              : ! *********************************************************************
     265              : 
     266              :  miguelflag = 0
     267              : 
     268              : 
     269              :  do imatsu=-nmatsu,nmatsu
     270              :    freqfact(imatsu) = one / abs(two*imatsu+one)
     271              :  end do
     272              : 
     273              :  delta_tmp(:) = delta_1d(:)
     274              : 
     275              :  if (miguelflag == 1) then
     276              :    do imatsu=-nmatsu,nmatsu
     277              : !    zfact = pi*tc / z_1d(imatsu)
     278              :      zfact = one / z_1d(imatsu)
     279              : 
     280              :      do jmatsu=max(-nmatsu,-nmatsu+imatsu),min(nmatsu,nmatsu+imatsu)
     281              :        delta_tmp(imatsu) = delta_tmp(imatsu) &
     282              : &       + delta_1d(jmatsu) &
     283              : &       * lambda_1d(imatsu-jmatsu) &
     284              : &       * freqfact(jmatsu)
     285              :      end do
     286              :      delta_tmp(imatsu) = delta_tmp(imatsu)*zfact
     287              :    end do
     288              : 
     289              :  else
     290              : 
     291              : !  i < 0
     292              :    do imatsu=-nmatsu,-1
     293              : 
     294              : !    j < 0
     295              :      do jmatsu=max(-nmatsu,-nmatsu+imatsu),-1
     296              :        delta_tmp(imatsu) = delta_tmp(imatsu) &
     297              : &       + lambda_1d(imatsu-jmatsu)*delta_1d(jmatsu)*freqfact(jmatsu) &
     298              : &       - lambda_1d(imatsu-jmatsu)*delta_1d(imatsu)*freqfact(imatsu)
     299              :      end do
     300              : !    j > 0
     301              :      do jmatsu=0,min(nmatsu,nmatsu+imatsu)
     302              :        delta_tmp(imatsu) = delta_tmp(imatsu) &
     303              : &       + lambda_1d(imatsu-jmatsu)*delta_1d(jmatsu)*freqfact(jmatsu) &
     304              : &       + lambda_1d(imatsu-jmatsu)*delta_1d(imatsu)*freqfact(imatsu)
     305              :      end do
     306              : 
     307              :    end do
     308              : 
     309              : !  i > 0
     310              :    do imatsu=0,nmatsu
     311              : 
     312              : !    j < 0
     313              :      do jmatsu=max(-nmatsu,-nmatsu+imatsu),-1
     314              :        delta_tmp(imatsu) = delta_tmp(imatsu) &
     315              : &       + lambda_1d(imatsu-jmatsu)*delta_1d(jmatsu)*freqfact(jmatsu) &
     316              : &       + lambda_1d(imatsu-jmatsu)*delta_1d(imatsu)*freqfact(imatsu)
     317              :      end do
     318              : !    j > 0
     319              :      do jmatsu=0,min(nmatsu,nmatsu+imatsu)
     320              :        delta_tmp(imatsu) = delta_tmp(imatsu) &
     321              : &       + lambda_1d(imatsu-jmatsu)*delta_1d(jmatsu)*freqfact(jmatsu) &
     322              : &       - lambda_1d(imatsu-jmatsu)*delta_1d(imatsu)*freqfact(imatsu)
     323              :      end do
     324              : 
     325              :    end do
     326              : 
     327              :  end if
     328              : 
     329              :  delta_1d(:) = delta_tmp(:)
     330              : 
     331              : end subroutine eli_app_m_1d
     332              : !!***
     333              : 
     334              : !!****f* m_eliashberg_1d/eli_diag_m_1d
     335              : !!
     336              : !! NAME
     337              : !! eli_diag_m_1d
     338              : !!
     339              : !! FUNCTION
     340              : !!  diagonalize M matrix. Heavy and should be avoided for production.
     341              : !!  Actually, since M is not symmetrical, diagonalize M^{t} M and
     342              : !!  get right-eigenvalues and vectors
     343              : !!
     344              : !! INPUTS
     345              : !!   lambda_1d = coupling constant as a function of frequency
     346              : !!   mustar = Coulomb potential parameter in Eliashberg equation
     347              : !!   nmatsu = number of Matsubara frequencies
     348              : !!   tc = guess for critical temperature
     349              : !!   z_1d = renormalization Z as a function of frequency
     350              : !!
     351              : !! OUTPUT
     352              : !!   maxeigval = estimation for maximum eigenvalue of M
     353              : !!
     354              : !! SIDE EFFECTS
     355              : !!   delta_1d = imaginary gap function as a function of frequency
     356              : !!
     357              : !! SOURCE
     358              : 
     359          345 : subroutine eli_diag_m_1d (delta_1d,lambda_1d,maxeigval,mustar,nmatsu,tc,z_1d)
     360              : 
     361              :  use m_linalg_interfaces
     362              : 
     363              : !Arguments ------------------------------------
     364              : !scalars
     365              :  integer,intent(in) :: nmatsu
     366              :  real(dp),intent(in) :: mustar,tc
     367              :  real(dp),intent(out) :: maxeigval
     368              : !arrays
     369              :  real(dp),intent(in) :: lambda_1d(-nmatsu:nmatsu),z_1d(-nmatsu:nmatsu)
     370              :  real(dp),intent(inout) :: delta_1d(-nmatsu:nmatsu)
     371              : 
     372              : !Local variables-------------------------------
     373              : !scalars
     374              :  integer :: imatsu,info,jmatsu,kmatsu,lwork,tmiguel
     375              :  real(dp) :: si,sj,sqtimat,sqtjmat
     376              : !arrays
     377          690 :  real(dp) :: mtm_eig(2*nmatsu+1),symm_mtm(-nmatsu:nmatsu,-nmatsu:nmatsu)
     378          690 :  real(dp) :: work(3*(2*nmatsu+1))
     379              : 
     380              : ! *********************************************************************
     381              : 
     382          345 :  tmiguel = 0
     383              : 
     384              :  if (tmiguel == 1) then
     385              :    do imatsu=-nmatsu,nmatsu
     386              :      do jmatsu=-nmatsu,nmatsu
     387              : 
     388              :        symm_mtm(imatsu,jmatsu) = zero
     389              :        do kmatsu=max(-nmatsu+imatsu,-nmatsu+jmatsu,-nmatsu),min(nmatsu+imatsu,nmatsu+jmatsu,nmatsu)
     390              :          symm_mtm(imatsu,jmatsu) = symm_mtm(imatsu,jmatsu) &
     391              : &         +  lambda_1d(kmatsu-imatsu)*lambda_1d(kmatsu-jmatsu) &
     392              : &         /  ( z_1d(kmatsu)*z_1d(kmatsu) )
     393              :        end do
     394              : !      symm_mtm(imatsu,jmatsu) = symm_mtm(imatsu,jmatsu) / ((two*imatsu+one)*(two*jmatsu+one))
     395              :        symm_mtm(imatsu,jmatsu) = symm_mtm(imatsu,jmatsu) * pi * tc * pi * tc
     396              :      end do
     397              :    end do
     398              : 
     399              :  else
     400              : 
     401      3554535 :    symm_mtm(:,:) = -mustar
     402              : 
     403              :    si = -one
     404        35190 :    do imatsu=-nmatsu,nmatsu
     405        34845 :      sqtimat = one / sqrt(two*abs(imatsu)+one)
     406        34845 :      if (imatsu == 0) si = one
     407        34845 :      sj = -one
     408      2674785 :      do jmatsu=max(-nmatsu,-nmatsu+imatsu),min(nmatsu,nmatsu+imatsu)
     409      2639595 :        sqtjmat = one / sqrt(two*abs(jmatsu)+one)
     410      2639595 :        if (jmatsu == 0) sj = one
     411              : 
     412              :        symm_mtm(imatsu,jmatsu) = symm_mtm(imatsu,jmatsu) &
     413      2639595 : &       + lambda_1d(imatsu-jmatsu)*sqtimat*sqtjmat
     414              : 
     415              :        symm_mtm(imatsu,imatsu) = symm_mtm(imatsu,imatsu) &
     416      2674440 : &       - lambda_1d(imatsu-jmatsu)*si*sj*sqtimat*sqtimat
     417              :      end do
     418              :    end do
     419              : 
     420              :  end if
     421              : 
     422          345 :  lwork = 3*(2*nmatsu+1)
     423          345 :  call DSYEV('V', 'U', 2*nmatsu+1, symm_mtm, 2*nmatsu+1, mtm_eig, work, lwork, info )
     424              : 
     425          345 :  write(std_out,*) 'last eigenvalues = '
     426          345 :  write(std_out,*) mtm_eig(2*nmatsu-9:2*nmatsu+1)
     427              : 
     428        35190 :  do imatsu=-nmatsu,nmatsu
     429        35190 :    delta_1d(imatsu) = symm_mtm(imatsu,nmatsu)*sqrt(two*abs(imatsu)+one)
     430              :  end do
     431              : 
     432          345 :  maxeigval = mtm_eig(2*nmatsu+1)
     433              : 
     434          345 : end subroutine eli_diag_m_1d
     435              : !!***
     436              : 
     437              : !!****f* m_eliashberg_1d/eli_lambda_1d
     438              : !!
     439              : !! NAME
     440              : !! eli_lambda_1d
     441              : !!
     442              : !! FUNCTION
     443              : !!  In the solving of the 1D (energy only) Eliashberg equations, calculate
     444              : !!  the lambda, which is the e-p coupling strength. See Allen and Mitrovic
     445              : !!  Solid State Physics vol 37 ed Ehrenreich Seitz and Turnbull, p.45 [[cite:Allen1983c]]
     446              : !!
     447              : !! INPUTS
     448              : !!   a2f_1d = 1D alpha2F function
     449              : !!   elph_ds = elphon dataset
     450              : !!   nmatsu = number of Matsubara frequencies
     451              : !!   tc = guess for critical temperature
     452              : !!
     453              : !! OUTPUT
     454              : !!   lambda_1d = coupling constant as a function of frequency
     455              : !!
     456              : !! NOTES
     457              : !!  lambda is used at points which are differences of Matsubara freqs,
     458              : !!  and hence is tabulated on points going through 0.
     459              : !!
     460              : !! SOURCE
     461              : 
     462          345 : subroutine eli_lambda_1d (a2f_1d,elph_ds,lambda_1d,nmatsu,tc)
     463              : 
     464              : !Arguments ------------------------------------
     465              : !scalars
     466              :  integer,intent(in) :: nmatsu
     467              :  real(dp),intent(in) :: tc
     468              :  type(elph_type),intent(in) :: elph_ds
     469              : !arrays
     470              :  real(dp),intent(in) :: a2f_1d(elph_ds%na2f)
     471              :  real(dp),intent(out) :: lambda_1d(-nmatsu:nmatsu)
     472              : 
     473              : !Local variables-------------------------------
     474              : !scalars
     475              :  integer :: imatsu,iomega
     476              :  real(dp) :: nu_matsu,nu_matsu2,omega,domega
     477              : !arrays
     478          690 :  real(dp) :: lambda_int(elph_ds%na2f),tmplambda(elph_ds%na2f)
     479              : 
     480              : ! *********************************************************************
     481              : !
     482              : !MG: the step should be calculated locally using nomega and the extrema of the spectrum.
     483              : !One should not rely on previous calls for the setup of elph_ds%domega
     484              : !I will remove elph_ds%domega since mka2f.F90 will become a method of gamma_t
     485          345 :  domega =elph_ds%domega
     486              : 
     487        35190 :  do imatsu=-nmatsu,nmatsu
     488        34845 :    nu_matsu = (two*imatsu)*pi*tc
     489        34845 :    nu_matsu2 = nu_matsu*nu_matsu
     490              : 
     491     13972845 :    tmplambda(:) = zero
     492        34845 :    omega=domega
     493     13938000 :    do iomega=2,elph_ds%na2f
     494     13903155 :      tmplambda(iomega) = a2f_1d(iomega) * two * omega / (nu_matsu2 + omega*omega)
     495     13938000 :      omega=omega+domega
     496              :    end do
     497        34845 :    call simpson_int(elph_ds%na2f,domega,tmplambda,lambda_int)
     498              : 
     499        35190 :    lambda_1d(imatsu) = lambda_int(elph_ds%na2f)
     500              :  end do
     501              : 
     502          345 : end subroutine eli_lambda_1d
     503              : !!***
     504              : 
     505              : !!****f* m_eliashberg_1d/eli_m_iter_1d
     506              : !! NAME
     507              : !! eli_m_iter_1d
     508              : !!
     509              : !! FUNCTION
     510              : !!  Find largest eigenvalue of M matrix, to deduce superconducting Tc
     511              : !!
     512              : !! INPUTS
     513              : !!   lambda_1d = coupling constant as a function of frequency
     514              : !!   nmatsu = number of Matsubara frequencies
     515              : !!   tc = guess for critical temperature
     516              : !!   z_1d = renormalization Z as a function of frequency
     517              : !!
     518              : !! OUTPUT
     519              : !!   maxeigval = estimation for maximum eigenvalue of M
     520              : !!
     521              : !! SIDE EFFECTS
     522              : !!   delta_1d = imaginary gap function as a function of frequency
     523              : !!
     524              : !! SOURCE
     525              : 
     526              : subroutine eli_m_iter_1d (delta_1d,lambda_1d,maxeigval,nmatsu,z_1d)
     527              : 
     528              : !Arguments ------------------------------------
     529              : !scalars
     530              :  integer,intent(in) :: nmatsu
     531              :  real(dp),intent(out) :: maxeigval
     532              : !arrays
     533              :  real(dp),intent(in) :: lambda_1d(-nmatsu:nmatsu),z_1d(-nmatsu:nmatsu)
     534              :  real(dp),intent(inout) :: delta_1d(-nmatsu:nmatsu)
     535              : 
     536              : !Local variables-------------------------------
     537              : !scalars
     538              :  integer :: iiterm,imatsu,nfilter,ngeteig
     539              :  real(dp) :: dnewnorm,dnorm,fact
     540              : !arrays
     541              :  real(dp) :: delta_old(-nmatsu:nmatsu)
     542              : 
     543              : ! *********************************************************************
     544              : 
     545              :  nfilter = 10
     546              :  ngeteig = 10
     547              : 
     548              : 
     549              : !
     550              : !1) apply M matrix enough times to filter out largest eigenvalue
     551              : !
     552              :  do iiterm=1,nfilter
     553              :    call eli_app_m_1d (delta_1d,lambda_1d,nmatsu,z_1d)
     554              : 
     555              : !  DEBUG
     556              : !  dnorm=zero
     557              : !  do imatsu=-nmatsu,nmatsu
     558              : !  dnorm = dnorm + delta_1d(imatsu)*delta_1d(imatsu)/(two*imatsu+one)
     559              : !  end do
     560              : !  dnorm = sqrt(dnorm)
     561              : !  write(std_out,*) 'eli_m_iter_1d : dnorm ', dnorm
     562              : !  ENDDEBUG
     563              :  end do
     564              : 
     565              : !
     566              : !2) calculate norm
     567              : !
     568              :  dnorm=zero
     569              :  do imatsu=-nmatsu,nmatsu
     570              :    dnorm = dnorm + delta_1d(imatsu)*delta_1d(imatsu)/abs(two*imatsu+one)
     571              :  end do
     572              :  dnorm = sqrt(dnorm)
     573              : 
     574              : !normalize delta_1d
     575              :  delta_1d(:) = delta_1d(:) / dnorm
     576              : 
     577              :  delta_old = delta_1d
     578              : 
     579              : !DEBUG
     580              : !dnewnorm=zero
     581              : !do imatsu=-nmatsu,nmatsu
     582              : !dnewnorm = dnewnorm + delta_1d(imatsu)*delta_1d(imatsu)/abs(two*imatsu+one)
     583              : !end do
     584              : !dnewnorm = sqrt(dnewnorm)
     585              : !write(std_out,*) 'eli_m_iter_1d : dnewnorm1 ', dnewnorm
     586              : !ENDDEBUG
     587              : 
     588              : !
     589              : !3) re-apply M matrix ngeteig times
     590              : !
     591              :  do iiterm=1,ngeteig
     592              :    call eli_app_m_1d (delta_1d,lambda_1d,nmatsu,z_1d)
     593              : !  DEBUG
     594              : !  dnewnorm=zero
     595              : !  do imatsu=-nmatsu,nmatsu
     596              : !  dnewnorm = dnewnorm + delta_1d(imatsu)*delta_1d(imatsu)/abs(two*imatsu+one)
     597              : !  end do
     598              : !  dnewnorm = sqrt(dnewnorm)
     599              : !  write(std_out,*) 'eli_m_iter_1d : dnewnorm ', dnewnorm
     600              : !
     601              : !  do imatsu=-nmatsu,nmatsu
     602              : !  write (112,*) imatsu,delta_1d(imatsu)/delta_old(imatsu)
     603              : !  end do
     604              : !  write (112,*)
     605              : !  delta_old = delta_1d
     606              : !  ENDDEBUG
     607              :  end do
     608              : 
     609              : !
     610              : !4) calculate new norm and estimate eigenvalue
     611              : !
     612              :  dnewnorm=zero
     613              :  do imatsu=-nmatsu,nmatsu
     614              :    dnewnorm = dnewnorm + delta_1d(imatsu)*delta_1d(imatsu)/abs(two*imatsu+one)
     615              :  end do
     616              :  dnewnorm = sqrt(dnewnorm)
     617              : 
     618              : !maxeigval = exp ( log(dnewnorm/dnorm) / ngeteig )
     619              :  maxeigval = exp ( log(dnewnorm) / ngeteig )
     620              : 
     621              :  write(std_out,*) 'eli_m_iter_1d : maxeigval =' , maxeigval
     622              : !fact = exp(-log(maxeigval) * (ngeteig+nfilter))
     623              :  fact = exp(-log(maxeigval) * (ngeteig))
     624              :  do imatsu=-nmatsu,nmatsu
     625              :    delta_1d(imatsu) = delta_1d(imatsu) * fact
     626              :  end do
     627              : 
     628              : end subroutine eli_m_iter_1d
     629              : !!***
     630              : 
     631              : !!****f* m_eliashberg_1d/eli_z_1d
     632              : !!
     633              : !! NAME
     634              : !! eli_z_1d
     635              : !!
     636              : !! FUNCTION
     637              : !!  In the solving of the 1D (energy only) Eliashberg equations, calculate
     638              : !!  the Z function, which is the renormalization factor. See Allen and Mitrovic
     639              : !!  Solid State Physics vol 37 ed Ehrenreich Seitz and Turnbull [[cite:Allen1983c]]
     640              : !!
     641              : !! INPUTS
     642              : !!   lambda_1d = coupling constant as a function of frequency
     643              : !!   nmatsu = number of Matsubara frequencies
     644              : !!
     645              : !! OUTPUT
     646              : !!   z_1d = renormalizing Z as a function of frequency
     647              : !!
     648              : !! NOTES
     649              : !!  Because Z only depends on lambda(n-n'), and lambda(omega)
     650              : !!   is an even function, Z is symmetrical in n and -n
     651              : !!   hence only calculate for n>0 and complete the rest
     652              : !!
     653              : !! SOURCE
     654              : 
     655          345 : subroutine eli_z_1d (lambda_1d,nmatsu,z_1d)
     656              : 
     657              : !Arguments ------------------------------------
     658              : !scalars
     659              :  integer,intent(in) :: nmatsu
     660              : !arrays
     661              :  real(dp),intent(in) :: lambda_1d(-nmatsu:nmatsu)
     662              :  real(dp),intent(out) :: z_1d(-nmatsu:nmatsu)
     663              : 
     664              : !Local variables-------------------------------
     665              : !scalars
     666              :  integer :: imatsu,jmatsu
     667              : 
     668              : ! *********************************************************************
     669              : 
     670              : 
     671        17940 :  do imatsu=0,nmatsu
     672              : 
     673        17595 :    z_1d(imatsu) = zero
     674              : !  count $\mathrm{sign}(omega_{Matsubara})$
     675       457470 :    do jmatsu=-nmatsu+imatsu,-1
     676       457470 :      z_1d(imatsu) = z_1d(imatsu) - lambda_1d(imatsu-jmatsu)
     677              :    end do
     678       914940 :    do jmatsu=0,nmatsu
     679       914940 :      z_1d(imatsu) = z_1d(imatsu) + lambda_1d(imatsu-jmatsu)
     680              :    end do
     681              : 
     682              : !  NOTE: the pi*Tc factor in Z cancels the one in the Matsubara frequency.
     683        17595 :    z_1d(imatsu) = one + z_1d(imatsu) / (two*imatsu+one)
     684        17940 :    z_1d(-imatsu) = z_1d(imatsu)
     685              :  end do
     686              : 
     687          345 : end subroutine eli_z_1d
     688              : !!***
     689              : 
     690              : end module m_eliashberg_1d
     691              : !!***
        

Generated by: LCOV version 2.3-1