LCOV - code coverage report
Current view: top level - src/49_gw_toolbox_oop - m_gwdefs.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 94.4 % 71 67
Test Date: 2026-09-19 17:42:43 Functions: 50.0 % 16 8

            Line data    Source code
       1              : !!****m* ABINIT/m_gwdefs
       2              : !! NAME
       3              : !! m_gwdefs
       4              : !!
       5              : !! FUNCTION
       6              : !! This module contains definitions for a number of named constants used in the GW part of abinit
       7              : !!
       8              : !! COPYRIGHT
       9              : !! Copyright (C) 2008-2026 ABINIT group (MG, FB, GMR, VO, LR, RWG)
      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_gwdefs
      23              : 
      24              :  use defs_basis
      25              :  use m_abicore
      26              :  use m_errors
      27              : 
      28              :  use m_fstrings, only : sjoin, itoa
      29              :  use m_nctk,     only : etsfio_charlen
      30              : 
      31              :  implicit none
      32              : 
      33              :  private
      34              : 
      35              : ! Unit number for formatted files produced by GW calculations.
      36              : ! These files are not supposed to be read by abinit therefore
      37              : ! their names and unit numbers are not defined in the Dtfil% structure.
      38              :  integer,public,parameter :: unt_gw  = 21  ! GW corrections
      39              :  integer,public,parameter :: unt_sig = 22  ! Self-energy as a function of frequency
      40              :  integer,public,parameter :: unt_sgr = 23  ! Derivative wrt omega of the Self-energy
      41              :  integer,public,parameter :: unt_sgm = 20  ! Sigma on the Matsubara axis
      42              :  integer,public,parameter :: unt_sigc = 24 ! Sigma_c as a function of (epsilon_i) MRM
      43              :  integer,public,parameter :: unt_gwdiag  = 40 ! GW diagonal
      44              : 
      45              :  real(dp),public,parameter :: GW_TOLQ =0.0001_dp
      46              :  ! Tolerance below which two BZ points are considered equal within a RL vector:
      47              :  ! for each red. direct. the abs value of the difference btw the two coord must be smaller that tolq.
      48              : 
      49              :  real(dp),public,parameter :: GW_TOLQ0=0.001_dp
      50              :  ! Tolerance below which a q-point is treated as zero (long wavelength limit)
      51              : 
      52              :  real(dp),public,parameter :: GW_TOL_DOCC=0.01_dp
      53              :  ! Tolerance on the difference between two occupation numbers.
      54              :  ! below this value, the contribution of the transition is neglected in the evaluation of chi0
      55              : 
      56              :  real(dp),public,parameter :: GW_TOL_W0=0.001_dp
      57              :  ! Tolerance on the real part of the frequency appearing in the denominator of the
      58              :  ! non-interacting Green function G0. Above this value, a small purely imaginary
      59              :  ! complex shift is added to the denominator during the evaluation of chi0.
      60              : 
      61              :  real(gwp),public,parameter :: one_gw  = 1._gwp
      62              :  real(gwp),public,parameter :: zero_gw = 0._gwp
      63              : 
      64              :  complex(gwp),public,parameter :: czero_gw = (0._gwp,0._gwp)
      65              :  complex(gwp),public,parameter :: cone_gw  = (1._gwp,0._gwp)
      66              :  complex(gwp),public,parameter :: j_gw     = (0._gwp,1._gwp)
      67              : 
      68              : !arrays
      69              :  real(dp),public,parameter :: GW_Q0_DEFAULT(3) = [0.00001_dp, 0.00002_dp, 0.00003_dp]
      70              : 
      71              : ! Weights and nodes for Gauss-Kronrod integration rules
      72              : ! Gauss 7 Kronrod 15
      73              :  real(dp),public,parameter :: Kron15N(15) = (/-0.991455371120812639206854697526328516642040_dp, &
      74              : & -0.949107912342758524526189684047851262400770_dp,-0.864864423359769072789712788640926201210972_dp, &
      75              : & -0.741531185599394439863864773280788407074150_dp,-0.586087235467691130294144838258729598436780_dp, &
      76              : & -0.405845151377397166906606412076961463347382_dp,-0.207784955007898467600689403773244913479780_dp, &
      77              : &  0.000000000000000000000000000000000000000000_dp, 0.207784955007898467600689403773244913479780_dp, &
      78              : &  0.405845151377397166906606412076961463347382_dp, 0.586087235467691130294144838258729598436780_dp, &
      79              : &  0.741531185599394439863864773280788407074150_dp, 0.864864423359769072789712788640926201210972_dp, &
      80              : &  0.949107912342758524526189684047851262400770_dp, 0.991455371120812639206854697526328516642040_dp/)
      81              : 
      82              :  real(dp),public,parameter :: Kron15W(15) = (/0.022935322010529224963732008058969591993561_dp, &
      83              : & 0.063092092629978553290700663189204286665070_dp,0.104790010322250183839876322541518017443757_dp, &
      84              : & 0.140653259715525918745189590510237920399890_dp,0.169004726639267902826583426598550284106245_dp, &
      85              : & 0.190350578064785409913256402421013682826078_dp,0.204432940075298892414161999234649084716518_dp, &
      86              : & 0.209482141084727828012999174891714263697760_dp,0.204432940075298892414161999234649084716518_dp, &
      87              : & 0.190350578064785409913256402421013682826078_dp,0.169004726639267902826583426598550284106245_dp, &
      88              : & 0.140653259715525918745189590510237920399890_dp,0.104790010322250183839876322541518017443757_dp, &
      89              : & 0.063092092629978553290700663189204286665070_dp,0.022935322010529224963732008058969591993561_dp/)
      90              : 
      91              :  real(dp),public,parameter :: Gau7W(7) = (/0.12948496616886969327061143267908201832859_dp, &
      92              : & 0.279705391489276667901467771423779582486925_dp,0.38183005050511894495036977548897513387837_dp, &
      93              : & 0.417959183673469387755102040816326530612245_dp,0.38183005050511894495036977548897513387837_dp, &
      94              : & 0.279705391489276667901467771423779582486925_dp,0.12948496616886969327061143267908201832859_dp/)
      95              : 
      96              : ! Gauss 11 Kronrod 23
      97              :  real(dp),public,parameter :: Kron23N(23) = (/-0.996369613889542634360164573335160773367030_dp, &
      98              : & -0.978228658146056992803938001122857390771420_dp,-0.941677108578067946455396730352134962188750_dp, &
      99              : & -0.887062599768095299075157769303927266631680_dp,-0.816057456656220942392261355192625879277860_dp, &
     100              : & -0.730152005574049324093416252031153458049643_dp,-0.630599520161965092168263312405390318822425_dp, &
     101              : & -0.519096129206811815925725669458609554480227_dp,-0.397944140952377573675073943298232277259112_dp, &
     102              : & -0.269543155952344972331531985400861524679620_dp,-0.136113000799361815798364355994952934344660_dp, &
     103              : &  0.000000000000000000000000000000000000000000_dp, 0.136113000799361815798364355994952934344660_dp, &
     104              : &  0.269543155952344972331531985400861524679620_dp, 0.397944140952377573675073943298232277259112_dp, &
     105              : &  0.519096129206811815925725669458609554480227_dp, 0.630599520161965092168263312405390318822425_dp, &
     106              : &  0.730152005574049324093416252031153458049643_dp, 0.816057456656220942392261355192625879277860_dp, &
     107              : &  0.887062599768095299075157769303927266631680_dp, 0.941677108578067946455396730352134962188750_dp, &
     108              : &  0.978228658146056992803938001122857390771420_dp, 0.996369613889542634360164573335160773367030_dp/)
     109              : 
     110              :  real(dp),public,parameter :: Kron23W(23) = (/0.00976544104596075802247917260964352216369_dp, &
     111              : & 0.027156554682104262051721401617851679412810_dp,0.04582937856442641598526161637154832107050_dp, &
     112              : & 0.063097424750374906584540530495371467781318_dp,0.07866457193222732928421712412387330212537_dp, &
     113              : & 0.092953098596900827769293667912429161939839_dp,0.10587207448138939648189189823198112055496_dp, &
     114              : & 0.116739502461047270810811060893282832324909_dp,0.125158799100319505060067189609770147044437_dp, &
     115              : & 0.131280684229805644255977537339957161670610_dp,0.135193572799884533184261853141533217156135_dp, &
     116              : & 0.136577794711118301018953895305516133510830_dp,0.135193572799884533184261853141533217156135_dp, &
     117              : & 0.131280684229805644255977537339957161670610_dp,0.125158799100319505060067189609770147044437_dp, &
     118              : & 0.116739502461047270810811060893282832324909_dp,0.10587207448138939648189189823198112055496_dp, &
     119              : & 0.092953098596900827769293667912429161939839_dp,0.07866457193222732928421712412387330212537_dp, &
     120              : & 0.063097424750374906584540530495371467781318_dp,0.04582937856442641598526161637154832107050_dp, &
     121              : & 0.027156554682104262051721401617851679412810_dp,0.00976544104596075802247917260964352216369_dp/)
     122              : 
     123              :  real(dp),public,parameter :: Gau11W(11) = (/0.0556685671161736664827537204425485787285_dp, &
     124              : & 0.125580369464904624634694299223940100197616_dp,0.186290210927734251426097641431655891691285_dp, &
     125              : & 0.233193764591990479918523704843175139431800_dp,0.262804544510246662180688869890509195372765_dp, &
     126              : & 0.272925086777900630714483528336342189156042_dp,0.262804544510246662180688869890509195372765_dp, &
     127              : & 0.233193764591990479918523704843175139431800_dp,0.186290210927734251426097641431655891691285_dp, &
     128              : & 0.125580369464904624634694299223940100197616_dp,0.055668567116173666482753720442548578728500_dp/)
     129              : 
     130              : ! Gauss 15 Kronrod 31
     131              :  real(dp),public,parameter :: Kron31N(31) = (/-0.998002298693397060285172840152271209073410_dp, &
     132              : & -0.987992518020485428489565718586612581146970_dp,-0.967739075679139134257347978784337225283360_dp, &
     133              : & -0.937273392400705904307758947710209471244000_dp,-0.897264532344081900882509656454495882831780_dp, &
     134              : & -0.848206583410427216200648320774216851366260_dp,-0.790418501442465932967649294817947346862140_dp, &
     135              : & -0.724417731360170047416186054613938009630900_dp,-0.650996741297416970533735895313274692546948_dp, &
     136              : & -0.570972172608538847537226737253910641238390_dp,-0.485081863640239680693655740232350612866339_dp, &
     137              : & -0.394151347077563369897207370981045468362750_dp,-0.299180007153168812166780024266388962661603_dp, &
     138              : & -0.201194093997434522300628303394596207812836_dp,-0.101142066918717499027074231447392338787451_dp, &
     139              : &  0.000000000000000000000000000000000000000000_dp, 0.101142066918717499027074231447392338787451_dp, &
     140              : &  0.201194093997434522300628303394596207812836_dp, 0.299180007153168812166780024266388962661603_dp, &
     141              : &  0.394151347077563369897207370981045468362750_dp, 0.485081863640239680693655740232350612866339_dp, &
     142              : &  0.570972172608538847537226737253910641238390_dp, 0.650996741297416970533735895313274692546948_dp, &
     143              : &  0.724417731360170047416186054613938009630900_dp, 0.790418501442465932967649294817947346862140_dp, &
     144              : &  0.848206583410427216200648320774216851366260_dp, 0.897264532344081900882509656454495882831780_dp, &
     145              : &  0.937273392400705904307758947710209471244000_dp, 0.967739075679139134257347978784337225283360_dp, &
     146              : &  0.987992518020485428489565718586612581146970_dp, 0.998002298693397060285172840152271209073410_dp/)
     147              : 
     148              :  real(dp),public,parameter :: Kron31W(31) = (/0.0053774798729233489877920514301276498183100_dp, &
     149              : & 0.0150079473293161225383747630758072680946390_dp, 0.0254608473267153201868740010196533593972700_dp, &
     150              : & 0.0353463607913758462220379484783600481226300_dp, 0.0445897513247648766082272993732796902232570_dp, &
     151              : & 0.0534815246909280872653431472394302967715500_dp, 0.0620095678006706402851392309608029321904000_dp, &
     152              : & 0.0698541213187282587095200770991474757860450_dp, 0.0768496807577203788944327774826590067221100_dp, &
     153              : & 0.0830805028231330210382892472861037896015540_dp, 0.0885644430562117706472754436937743032122700_dp, &
     154              : & 0.0931265981708253212254868727473457185619300_dp, 0.0966427269836236785051799076275893351366570_dp, &
     155              : & 0.0991735987217919593323931734846031310595673_dp, 0.1007698455238755950449466626175697219163500_dp, &
     156              : & 0.1013300070147915490173747927674925467709270_dp, 0.1007698455238755950449466626175697219163500_dp, &
     157              : & 0.0991735987217919593323931734846031310595673_dp, 0.0966427269836236785051799076275893351366570_dp, &
     158              : & 0.0931265981708253212254868727473457185619300_dp, 0.0885644430562117706472754436937743032122700_dp, &
     159              : & 0.0830805028231330210382892472861037896015540_dp, 0.0768496807577203788944327774826590067221100_dp, &
     160              : & 0.0698541213187282587095200770991474757860450_dp, 0.0620095678006706402851392309608029321904000_dp, &
     161              : & 0.0534815246909280872653431472394302967715500_dp, 0.0445897513247648766082272993732796902232570_dp, &
     162              : & 0.0353463607913758462220379484783600481226300_dp, 0.0254608473267153201868740010196533593972700_dp, &
     163              : & 0.0150079473293161225383747630758072680946390_dp, 0.0053774798729233489877920514301276498183100_dp/)
     164              : 
     165              :  real(dp),public,parameter :: Gau15W(15) = (/0.030753241996117268354628393577204417721700_dp, &
     166              : 0.070366047488108124709267416450667338466710_dp, 0.107159220467171935011869546685869303415544_dp, &
     167              : 0.139570677926154314447804794511028322520850_dp, 0.166269205816993933553200860481208811130900_dp, &
     168              : 0.186161000015562211026800561866422824506226_dp, 0.198431485327111576456118326443839324818693_dp, &
     169              : 0.202578241925561272880620199967519314838662_dp, 0.198431485327111576456118326443839324818693_dp, &
     170              : 0.186161000015562211026800561866422824506226_dp, 0.166269205816993933553200860481208811130900_dp, &
     171              : 0.139570677926154314447804794511028322520850_dp, 0.107159220467171935011869546685869303415544_dp, &
     172              : 0.070366047488108124709267416450667338466710_dp, 0.030753241996117268354628393577204417721700_dp/)
     173              : 
     174              : 
     175              : ! Flags for self-consistent GW calculations used in gw_driver and for parsing the input file.
     176              :  integer,public,parameter :: GWSC_one_shot      =1
     177              :  integer,public,parameter :: GWSC_only_W        =2
     178              :  integer,public,parameter :: GWSC_only_G        =3
     179              :  integer,public,parameter :: GWSC_both_G_and_W  =4
     180              : 
     181              : ! Flags defining the approximation used for the self-energy (used in csigme).
     182              :  integer,public,parameter :: SIG_GW_PPM      =0  ! standard GW with PPM
     183              :  integer,public,parameter :: SIG_GW_AC       =1  ! standard GW without PPM (analytical continuation)
     184              :  integer,public,parameter :: SIG_GW_CD       =2  ! standard GW without PPM (contour deformation)
     185              :  integer,public,parameter :: SIG_HF          =5  ! Hartree-Fock calculation
     186              :  integer,public,parameter :: SIG_SEX         =6  ! Screened Exchange calculation
     187              :  integer,public,parameter :: SIG_COHSEX      =7  ! COHSEX calculation
     188              :  integer,public,parameter :: SIG_QPGW_PPM    =8  ! model GW with PPM
     189              :  integer,public,parameter :: SIG_QPGW_CD     =9  ! model GW without PPM
     190              : 
     191              :  public :: sigma_type_from_key
     192              :  public :: g0g0w
     193              : 
     194              : ! Private variables
     195              :  integer,private,parameter :: STR_LEN=500
     196              : !!***
     197              : 
     198              : !----------------------------------------------------------------------
     199              : 
     200              : !!****t* m_gwdefs/em1params_t
     201              : !! NAME
     202              : !! em1params_t
     203              : !!
     204              : !! FUNCTION
     205              : !! For the GW part of ABINIT, the em1params_t structured datatype
     206              : !! gather different parameters used to calculate the inverse dielectric matrix in SCREENING
     207              : !!
     208              : !! SOURCE
     209              : 
     210              :  type,public :: em1params_t
     211              : 
     212              : !scalars
     213              :   integer :: awtr                   ! If 1 the Adler-Wiser expression for Chi_0 is evaluated
     214              :                                     ! taking advantage of time-reversal symmetry
     215              :   integer :: gwcalctyp              ! Calculation type (see input variable)
     216              :   integer :: gwcomp                 ! 1 if extrapolar technique is used. 0 otherwise.
     217              :   integer :: inclvkb                ! Integer flag related to the evaluation of the commutator for q-->0
     218              :   integer :: spmeth                 ! Method used to approximate the delta function in the expression for Im Chi_0
     219              :   integer :: nI                     ! Number of components (rows) in the chi0 matrix.
     220              :   integer :: nJ                     ! Number of components (columns) in the chi0 matrix.
     221              :   integer :: npwvec                 ! Max between npwe and npwwfn, used to pass the dimension of arrays e.g gvec
     222              :   integer :: npwwfn                 ! Number of planewaves for wavefunctions
     223              :   integer :: npwe                   ! Number of planewaves for $\tilde \epsilon$
     224              :   integer :: npwepG0                ! Number of planewaves in the enlarged sphere G-G0, to account for umklapp G0 vectors
     225              :   integer :: nbnds                  ! Number of bands used to evaluate $\tilde \epsilon$
     226              :   integer :: nkibz                  ! Number of k-points in the IBZ
     227              :   integer :: nsppol                 ! 1 for spin unpolarized, 2 for collinear spin polarized
     228              :   integer :: nqcalc                 ! Number of q-points that are calculated (subset of qibz)
     229              :   integer :: nqibz                  ! Number of q-points in the IBZ
     230              :   integer :: nqlwl                  ! Number of directions to analyze the non analytical behavior for q-->0
     231              :   integer :: nomega                 ! Number of frequencies where evaluate $\tilde \epsilon (\omega)$
     232              :   integer :: nomegaer,nomegaei      ! Number of real and imaginary frequencies, respectively
     233              :   integer :: nomegaec               ! Number of frequencies on a grid in the complex plane nomegaec = nomegaei*(nomegaer-1)
     234              :   integer :: nomegasf               ! Number of frequencies used for the spectral function
     235              :   integer :: symchi                 ! 0 ==> do not use symmetries to reduce the k-points summed over in chi0
     236              :                                     ! 1 ==> take advantage of point group symmetries as well as time-reversal
     237              : 
     238              :   real(dp) :: gwencomp              ! Extrapolar energy used if gwcomp==1.
     239              :   real(dp) :: omegaermin            ! Minimum real frequency used in the contour deformation method
     240              :   real(dp) :: omegaermax            ! Maximum real frequency used in the contour deformation method
     241              :   real(dp) :: mbpt_sciss            ! Scissor energy used in chi0
     242              :   real(dp) :: spsmear               ! Smearing of the delta in case of spmeth==2
     243              :   real(dp) :: zcut                  ! Small imaginary shift to avoid poles in chi0
     244              : 
     245              :   logical :: analytic_continuation  ! if true calculate chi0 only along the imaginary axis
     246              :   logical :: contour_deformation    ! if true calculate chi0 both along the real and the imaginary axis
     247              :   logical :: plasmon_pole_model     ! if true a plasmonpole model is used (only 1 or 2 frequencies are calculated)
     248              : 
     249              : !arrays
     250              :   integer :: mG0(3)
     251              :   ! For each reduced direction gives the max G0 component to account for umklapp processes
     252              : 
     253              :   real(dp),allocatable :: qcalc(:,:)
     254              :   ! (3,nqcalc)
     255              :   ! q-points that are explicitely calculated (subset of qibz).
     256              : 
     257              :   real(dp),allocatable :: qibz(:,:)
     258              :   ! (3,nqibz)
     259              :   ! q-points in the IBZ.
     260              : 
     261              :   real(dp),allocatable :: qlwl(:,:)
     262              :   ! (3,nqlwl)
     263              :   ! q-points used for the long-wavelength limit.
     264              : 
     265              :   real(dp),allocatable :: omegasf(:)
     266              :   ! (nomegasf)
     267              :   ! real frequencies used to calculate the imaginary part of chi0.
     268              : 
     269              :   complex(dp),allocatable :: omega(:)
     270              :   ! (nomega)
     271              :   ! real and imaginary frequencies in chi0, epsilon and epsilonm1.
     272              : 
     273              :   real(dp),allocatable :: omega_wgs(:)
     274              :   ! (nomega)
     275              :   ! Weights for numerical integration, used for instance for minimax meshes.
     276              : 
     277              :   character(len=etsfio_charlen) :: iw_mesh_type="None", rw_mesh_type="None", cw_mesh_type="None"
     278              :   ! String defining the kind of sampling for imaginary (iw), real (rw) and complex (cw) frequencies
     279              : 
     280              :  contains
     281              :    procedure :: free => em1params_free
     282              :  end type em1params_t
     283              : !!***
     284              : 
     285              :  type,public :: sigij_col_t
     286              :    integer :: size1
     287              :    integer,allocatable :: bidx(:)
     288              :  end type sigij_col_t
     289              : 
     290              :  type,public :: sigijtab_t
     291              :    type(sigij_col_t),allocatable :: col(:)
     292              :  end type sigijtab_t
     293              : 
     294              :  public :: sigijtab_free
     295              : 
     296              : !----------------------------------------------------------------------
     297              : 
     298              : !!****t* m_gwdefs/sigparams_t
     299              : !! NAME
     300              : !! sigparams_t
     301              : !!
     302              : !! FUNCTION
     303              : !! For the GW part of ABINIT, the sigparams_t structured datatype
     304              : !! gather different parameters that characterize the calculation of the matrix
     305              : !! elements of the self-energy operator.
     306              : !!
     307              : !! SOURCE
     308              : 
     309              :  type,public :: sigparams_t
     310              : 
     311              :   integer :: gwcalctyp                   ! Calculation type
     312              : 
     313              :   integer :: gwgamma                     ! If 1 include vertex correction (GWGamma)
     314              :   integer :: gwcomp                      ! 1 if the extrapolar technique is used.
     315              : 
     316              :   integer :: minbdgw,maxbdgw             ! Minimum and maximum band index (considering the spin) defining
     317              :                                          ! The set of bands where GW corrections are evaluated
     318              : 
     319              :   integer :: mG0(3)                      ! For each reduced direction gives the max G0 component
     320              :                                          ! to account for umklapp processes
     321              : 
     322              :   integer :: npwvec                      ! Max betwenn npwe and npwwfn, used to pass the dimension of arrays e.g gvec
     323              :   integer :: npwwfn                      ! No. of planewaves for wavefunctions
     324              :   integer :: npwx                        ! No. of planewaves for $\Sigma_x$
     325              :   integer :: npwc                        ! No. of planewaves for $\Sigma_c$ and W
     326              :   integer :: nbnds                       ! No. of bands summed over.
     327              :   integer :: nomegasr                    ! No. of frequencies on the real axis to evaluate the spectral function
     328              :   integer :: nomegasrd                   ! No. of frequencies on the real axis to evaluate $\Sigma(E)$
     329              :   integer :: nomegasi                    ! No. of frequencies along the imaginary axis for Sigma in case of AC
     330              :   integer :: nsig_ab                     ! No. of components in the self-energy operator (1 if nspinor==1, 4 if nspinor==2)
     331              :   integer :: nspinor                     ! No. of spinorial components.
     332              :   integer :: nsppol                      ! 1 for unpolarized, 2 for spin-polarized calculation
     333              :   integer :: nkptgw                      ! No. of k-points where GW corrections have been calculated
     334              :   integer :: ppmodel                     ! Integer defining the plasmon pole model used, 0 for None.
     335              :   integer :: symsigma                    ! 0 ==> do not use symmetries to reduce the k-points summed over in sigma
     336              :                                          ! 1 ==> take advantage of space group symmetries as well as time-reversal
     337              :   integer :: use_sigxcore                ! 1 if core contribution to sigma is estimated by using Hartree-Fock
     338              : 
     339              :   real(dp) :: deltae                     ! Energy step used to evaluate numerically the derivative of the self energy
     340              :                                          ! $\frac{\partial \Re \Sigma(E)}{\partial E_o}$
     341              :   real(dp) :: ecutwfn                    ! cutoff energy for the wavefunctions.
     342              :   real(dp) :: ecutsigx                   ! cutoff energy for the the exchange parth of Sigma.
     343              :   real(dp) :: ecuteps                    ! cutoff energy for W
     344              : 
     345              :   real(dp) :: gwencomp                   ! Extrapolar energy used if gwcomp==1.
     346              : 
     347              :   real(dp) :: mbpt_sciss                 ! Scissor energy used in G0
     348              : 
     349              :   real(dp) :: minomega_r                 ! Minimum real frequency for the evaluation of the spectral function
     350              :   real(dp) :: maxomega_r                 ! Maximum real frequency for the evaluation of the spectral function
     351              :   real(dp) :: maxomega4sd                ! Maximum displacement around the KS energy where evaluate the diagonal
     352              :                                          ! Elements of $ \Sigma(E)$
     353              :   real(dp) :: omegasimax                 ! Max omega for Sigma along the imag axis in case of analytic continuation
     354              :   real(dp) :: omegasimin                 ! min omega for Sigma along the imag axis in case of analytic continuation
     355              : 
     356              :   real(dp) :: sigma_mixing               ! Global factor that multiplies Sigma to give the final matrix element.
     357              :                                          ! Usually one, except for the hybrid functionals.
     358              : 
     359              :   real(dp) :: zcut                       ! Value of $\delta$ used to avoid the divergences (see related input variable)
     360              : 
     361              :   integer,allocatable :: kptgw2bz(:)
     362              :   ! (nkptgw)
     363              :   ! For each k-point where GW corrections are calculated, the corresponding index in the BZ.
     364              : 
     365              :   integer,allocatable :: minbnd(:,:), maxbnd(:,:)
     366              :   ! (nkptgw, nsppol)
     367              :   ! For each k-point at which GW corrections are calculated, the min and Max band index considered
     368              :   ! (see also input variable dtset%bdgw).
     369              : 
     370              :   real(dp),allocatable :: kptgw(:,:)
     371              :   ! (3, nkptgw)
     372              :   ! k-points for the GW corrections in reduced coordinates.
     373              : 
     374              :   !TODO should be removed, everything should be in Sr%
     375              : 
     376              :   complex(dp),allocatable :: omegasi(:)
     377              :   ! (nomegasi)
     378              :   ! Frequencies along the imaginary axis used for the analytical continuation.
     379              : 
     380              :   complex(dp),allocatable :: omega_r(:)
     381              :   ! (nomegasr)
     382              :   ! Frequencies used to evaluate the spectral function.
     383              : 
     384              :   type(sigijtab_t),allocatable :: Sigcij_tab(:,:)
     385              :   ! (nkptgw, nsppol)%col(kb)%bidx(ii) gives the index of the left wavefunction.
     386              :   ! in the <i,kgw,s|\Sigma_c|j,kgw,s> matrix elements that has to be calculated in cisgme.
     387              :   ! in the case of self-consistent GW on wavefunctions.
     388              : 
     389              :   type(sigijtab_t),allocatable :: Sigxij_tab(:,:)
     390              :   ! Save as Sigcij_tab but for the Hermitian \Sigma_x where only the upper triangle is needed.
     391              : 
     392              :   contains
     393              :     procedure :: free => sigparams_free
     394              :     procedure :: is_herm => sigma_is_herm
     395              :     procedure :: needs_w => sigma_needs_w
     396              :     procedure :: needs_ppm => sigma_needs_ppm
     397              :  end type sigparams_t
     398              : !!***
     399              : 
     400              : CONTAINS  !==============================================================================
     401              : !!***
     402              : 
     403              : !----------------------------------------------------------------------
     404              : 
     405              : !!****f* m_gwdefs/em1params_free
     406              : !! NAME
     407              : !! em1params_free
     408              : !!
     409              : !! FUNCTION
     410              : !!  Free dynamic memory allocated in the structure.
     411              : !!
     412              : !! SOURCE
     413              : 
     414          148 : subroutine em1params_free(Ep)
     415              : 
     416              : !Arguments ------------------------------------
     417              :  class(em1params_t),intent(inout) :: Ep
     418              : ! *************************************************************************
     419              : 
     420              : !real
     421          148 :  ABI_SFREE(Ep%qcalc)
     422          148 :  ABI_SFREE(Ep%qibz)
     423          148 :  ABI_SFREE(Ep%qlwl)
     424          148 :  ABI_SFREE(Ep%omegasf)
     425          148 :  ABI_SFREE(Ep%omega_wgs)
     426              : 
     427              : !complex
     428          148 :  ABI_SFREE(Ep%omega)
     429              : 
     430          148 : end subroutine em1params_free
     431              : !!***
     432              : 
     433              : !----------------------------------------------------------------------
     434              : 
     435              : !!****f* m_gwdefs/sigijtab_free
     436              : !! NAME
     437              : !! sigijtab_free
     438              : !!
     439              : !! FUNCTION
     440              : !!   deallocate all memory in a sigijtab_t datatype.
     441              : !!
     442              : !! SOURCE
     443              : 
     444          402 : subroutine sigijtab_free(Sigijtab)
     445              : 
     446              : !Arguments ------------------------------------
     447              : !scalars
     448              :  type(sigijtab_t),intent(inout) :: Sigijtab(:,:)
     449              : 
     450              : !Local variables
     451              :  integer :: ii,jj,kk,ilow,iup
     452              : ! *************************************************************************
     453              : 
     454              :  !@sigijtab_t
     455          812 :   do jj=1,SIZE(Sigijtab,DIM=2)
     456         2106 :     do ii=1,SIZE(Sigijtab,DIM=1)
     457              : 
     458         1294 :       ilow=LBOUND(Sigijtab(ii,jj)%col,DIM=1)
     459         1294 :       iup =UBOUND(Sigijtab(ii,jj)%col,DIM=1)
     460        12196 :       do kk=ilow,iup
     461        12196 :         ABI_FREE(Sigijtab(ii,jj)%col(kk)%bidx)
     462              :       end do
     463        12606 :       ABI_FREE(Sigijtab(ii,jj)%col)
     464              : 
     465              :     end do
     466              :   end do
     467              : 
     468          402 : end subroutine sigijtab_free
     469              : !!***
     470              : 
     471              : !----------------------------------------------------------------------
     472              : 
     473              : !!****f* m_gwdefs/sigparams_free
     474              : !! NAME
     475              : !! sigparams_free
     476              : !!
     477              : !! FUNCTION
     478              : !!  Free dynamic memory allocated in the structure.
     479              : !!
     480              : !! SOURCE
     481              : 
     482          201 : subroutine sigparams_free(Sigp)
     483              : 
     484              : !Arguments ------------------------------------
     485              :  class(sigparams_t),intent(inout) :: Sigp
     486              : ! *************************************************************************
     487              : 
     488              : !integer
     489          201 :  ABI_SFREE(Sigp%kptgw2bz)
     490          201 :  ABI_SFREE(Sigp%minbnd)
     491          201 :  ABI_SFREE(Sigp%maxbnd)
     492              : !real
     493          201 :  ABI_FREE(Sigp%kptgw)
     494              : !complex
     495          201 :  ABI_SFREE(Sigp%omegasi)
     496          201 :  ABI_SFREE(Sigp%omega_r)
     497              : 
     498          201 :  if (allocated(Sigp%Sigcij_tab)) then
     499          201 :    call sigijtab_free(Sigp%Sigcij_tab)
     500          848 :    ABI_FREE(Sigp%Sigcij_tab)
     501              :  end if
     502              : 
     503          201 :  if (allocated(Sigp%Sigxij_tab)) then
     504          201 :    call sigijtab_free(Sigp%Sigxij_tab)
     505          848 :    ABI_FREE(Sigp%Sigxij_tab)
     506              :  end if
     507              : 
     508          201 : end subroutine sigparams_free
     509              : !!***
     510              : 
     511              : !----------------------------------------------------------------------
     512              : 
     513              : !!****f* m_gwdefs/sigma_type_from_key
     514              : !! NAME
     515              : !! sigma_type_from_key
     516              : !!
     517              : !! FUNCTION
     518              : !!  Return a string definining the particular approximation used for the self-energy.
     519              : !!  Stops if the key is not in the list of allowed possibilities.
     520              : !!
     521              : !! INPUTS
     522              : !!  key=Integer
     523              : !!
     524              : !! OUTPUT
     525              : !!
     526              : !! SOURCE
     527              : 
     528          656 : character(len=STR_LEN) function sigma_type_from_key(key) result(sigma_type)
     529              : 
     530              : !Arguments ------------------------------------
     531              :  integer,intent(in) :: key
     532              : !************************************************************************
     533              : 
     534          656 :  sigma_type = "None"
     535          656 :  if (key==SIG_GW_PPM  )  sigma_type = ' standard GW with PPM'
     536          656 :  if (key==SIG_GW_AC   )  sigma_type = ' standard GW without PPM (analytical continuation)'
     537          656 :  if (key==SIG_GW_CD   )  sigma_type = ' standard GW without PPM (contour deformation)'
     538          656 :  if (key==SIG_HF      )  sigma_type = ' Hartree-Fock calculation'
     539          656 :  if (key==SIG_SEX     )  sigma_type = ' Screened Exchange calculation'
     540          656 :  if (key==SIG_COHSEX  )  sigma_type = ' COHSEX calculation'
     541          656 :  if (key==SIG_QPGW_PPM)  sigma_type = ' model GW with PPM'
     542          656 :  if (key==SIG_QPGW_CD )  sigma_type = ' model GW without PPM'
     543              : 
     544          656 :  if (sigma_type == "None") then
     545            0 :    ABI_ERROR(sjoin("Unknown value for key: ", itoa(key)))
     546              :  end if
     547              : 
     548          656 : end function sigma_type_from_key
     549              : !!***
     550              : 
     551              : !----------------------------------------------------------------------
     552              : 
     553              : !!****f* m_gwdefs/sigma_is_herm
     554              : !! NAME
     555              : !! sigma_is_herm
     556              : !!
     557              : !! FUNCTION
     558              : !!  Return .TRUE. if the approximated self-energy is hermitian.
     559              : !!
     560              : !! INPUTS
     561              : !!  Sigp<sigparams_t>=datatype gathering data and info on the self-energy run.
     562              : !!
     563              : !! SOURCE
     564              : 
     565          201 : pure logical function sigma_is_herm(Sigp)
     566              : 
     567              : !Arguments ------------------------------
     568              :  class(sigparams_t),intent(in) :: Sigp
     569              : 
     570              : !Local variables ------------------------------
     571              :  integer :: mod10
     572              : !************************************************************************
     573              : 
     574          201 :  mod10 = MOD(Sigp%gwcalctyp,10)
     575          201 :  sigma_is_herm = ANY(mod10 == [SIG_HF, SIG_SEX, SIG_COHSEX])
     576              : 
     577          201 : end function sigma_is_herm
     578              : !!***
     579              : 
     580              : !----------------------------------------------------------------------
     581              : 
     582              : !!****f* m_gwdefs/sigma_needs_w
     583              : !! NAME
     584              : !! sigma_needs_w
     585              : !!
     586              : !! FUNCTION
     587              : !!  Return .TRUE. if self-energy requires the screened interaction W.
     588              : !!  For example HF does not need the SCR file.
     589              : !!
     590              : !! INPUTS
     591              : !!  Sigp<sigparams_t>=datatype gathering data and info on the self-energy run.
     592              : !!
     593              : !! SOURCE
     594              : 
     595          575 : pure logical function sigma_needs_w(Sigp)
     596              : 
     597              : !Arguments ------------------------------
     598              :  class(sigparams_t),intent(in) :: Sigp
     599              : 
     600              : !Local variables ------------------------------
     601              :  integer :: mod10
     602              : !************************************************************************
     603              : 
     604          575 :  mod10=MOD(Sigp%gwcalctyp,10)
     605          575 :  sigma_needs_w = (mod10/=SIG_HF)
     606              : 
     607          575 : end function sigma_needs_w
     608              : !!***
     609              : 
     610              : !----------------------------------------------------------------------
     611              : 
     612              : !!****f* m_gwdefs/sigma_needs_ppm
     613              : !! NAME
     614              : !! sigma_needs_ppm
     615              : !!
     616              : !! FUNCTION
     617              : !!  Return .TRUE. if the self-energy run requires a plasmon-pole model.
     618              : !!
     619              : !! INPUTS
     620              : !!  Sigp<sigparams_t>=datatype gathering data and info on the self-energy run.
     621              : !!
     622              : !! SOURCE
     623              : 
     624        40169 : pure logical function sigma_needs_ppm(Sigp)
     625              : 
     626              : !Arguments ------------------------------
     627              :  class(sigparams_t),intent(in) :: Sigp
     628              : 
     629              : !Local variables ------------------------------
     630              :  integer :: mod10
     631              : !************************************************************************
     632              : 
     633        40169 :  mod10=MOD(Sigp%gwcalctyp,10)
     634              :  sigma_needs_ppm = (ANY(mod10 == [SIG_GW_PPM, SIG_QPGW_PPM]) .or.  &
     635              :                     Sigp%gwcomp==1                                 &
     636        40169 :                    )
     637              : 
     638        40169 : end function sigma_needs_ppm
     639              : !!***
     640              : 
     641              : !----------------------------------------------------------------------
     642              : 
     643              : !!****f* m_gwdefs/g0g0w
     644              : !! NAME
     645              : !! g0g0w
     646              : !!
     647              : !! FUNCTION
     648              : !!  Calculates the frequency-dependent part of the RPA polarizability G0G0.
     649              : !!
     650              : !! INPUTS
     651              : !!
     652              : !! OUTPUT
     653              : !!
     654              : !! SOURCE
     655              : 
     656      5110683 : complex(dp) function g0g0w(omega, numerator, delta_ene, zcut, TOL_W0, opt_poles)
     657              : 
     658              : !Arguments ------------------------------------
     659              : !scalars
     660              :  integer,intent(in):: opt_poles
     661              :  real(dp),intent(in) :: TOL_W0,delta_ene,numerator,zcut
     662              :  complex(dp),intent(in) :: omega
     663              : 
     664              : !Local variables ------------------------------
     665              : !scalars
     666              :  real(dp) :: sgn
     667              :  character(len=500) :: msg
     668              : !************************************************************************
     669              : 
     670      5110683 :  if (delta_ene**2 > tol14) then
     671      5108335 :    sgn = SIGN(1.0_dp,delta_ene)
     672              : 
     673      5108335 :    if (opt_poles == 2) then
     674              :      ! Resonant and anti-resonant contributions.
     675      3975713 :      if (DABS(REAL(omega)) > TOL_W0) then
     676              :        ! omega on the real axis
     677              :        g0g0w =  numerator / (omega + delta_ene - j_dpc*sgn*zcut) &
     678       921910 :                -numerator / (omega - delta_ene + j_dpc*sgn*zcut)
     679              :      else
     680              :        ! omega on the imag axis (g0g0w is purely real)
     681              :        g0g0w =  numerator / (omega + delta_ene) &
     682      3053803 :                -numerator / (omega - delta_ene)
     683              :      end if
     684              : 
     685      1132622 :    else if (opt_poles == 1) then
     686              :      ! Only resonant contribution is included.
     687      1132622 :      if (DABS(REAL(omega)) > TOL_W0) then
     688       426848 :        g0g0w =  numerator / (omega + delta_ene - j_dpc*sgn*zcut)
     689              :      else
     690       705774 :        g0g0w =  numerator / (omega + delta_ene)
     691              :      end if
     692              : 
     693              :    else
     694            0 :      write(msg,'(a,i0)')" Wrong value for opt_poles: ",opt_poles
     695            0 :      ABI_ERROR(msg)
     696              :    end if ! opt_poles
     697              : 
     698              :  else
     699              :    ! delta_ene**2 < tol14
     700              :    g0g0w = czero
     701              :  end if
     702              : 
     703      5110683 : end function g0g0w
     704              : !!***
     705              : 
     706            0 : end module m_gwdefs
     707              : !!***
        

Generated by: LCOV version 2.3-1