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-11-09 20:57:54 Functions: 50.0 % 16 8
Branches: 45.5 % 154 70

             Branch data     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