LCOV - code coverage report
Current view: top level - src/95_drive - m_gwls_sternheimer.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 97.2 % 72 70
Test Date: 2026-09-21 13:49:52 Functions: 100.0 % 1 1

            Line data    Source code
       1              : !!****m* ABINIT/m_gwls_sternheimer
       2              : !! NAME
       3              : !!   m_gwls_sternheimer
       4              : !!
       5              : !! FUNCTION
       6              : !!
       7              : !!
       8              : !! COPYRIGHT
       9              : !!  Copyright (C) 2009-2026 ABINIT group (JLJ, BR, MC)
      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_gwls_sternheimer
      23              : 
      24              :  implicit none
      25              : 
      26              :  private
      27              : !!***
      28              : 
      29              :  public :: gwls_sternheimer
      30              : !!***
      31              : 
      32              : contains
      33              : !!***
      34              : 
      35              : !!****f* ABINIT/gwls_sternheimer
      36              : !! NAME
      37              : !! gwls_sternheimer
      38              : !!
      39              : !! FUNCTION
      40              : !! .
      41              : !!
      42              : !! INPUTS
      43              : !! dtset <type(dataset_type)>=all input variables in this dataset
      44              : !!
      45              : !! OUTPUT
      46              : !!
      47              : !! SOURCE
      48              : 
      49            8 : subroutine gwls_sternheimer(acell_img,amu_img,codvsn,cpui,dtfil,dtset,etotal_img,fcart_img,&
      50            8 : &                           gred_img,iexit,intgres_img,mixalch_img,mpi_enreg,nimage,npwtot,occ_img,&
      51            8 : &                           pawang,pawrad,pawtab,psps,rprim_img,strten_img,vel_cell_img,vel_img,xred_img,&
      52            8 : &                           filnam,filstat,idtset,jdtset,ndtset) ! optional arguments
      53              : 
      54              : use m_gwls_utility,                   only : master_debug, files_status_new, files_status_old
      55              : ! use m_gwls_wf,                        only : norm_k
      56              : use m_gwls_hamiltonian,               only : destroy_H, exchange, g_to_r, eig
      57              : use m_gwls_TimingLog
      58              : use m_gwls_valenceWavefunctions
      59              : use m_gwls_ComputeCorrelationEnergy
      60              : use m_gwls_GenerateEpsilon
      61              : use m_dtset
      62              : 
      63              : use defs_basis
      64              : use defs_wvltypes
      65              : use m_pawang
      66              : use m_pawrad
      67              : use m_pawtab
      68              : use m_abicore
      69              : use m_errors
      70              : use m_dtfil
      71              : 
      72              : use defs_datatypes, only : pseudopotential_type
      73              : use defs_abitypes, only : MPI_type
      74              : use m_time,      only : timab
      75              : use m_gstateimg, only : gstateimg
      76              : 
      77              : !Arguments ------------------------------------
      78              : !scalars
      79              : integer,intent(in) :: nimage
      80              : integer,optional,intent(in) :: idtset,ndtset
      81              : integer,intent(inout) :: iexit
      82              : real(dp),intent(in) :: cpui
      83              : character(len=8),intent(in) :: codvsn
      84              : character(len=fnlen),optional,intent(in) :: filstat
      85              : type(MPI_type),intent(inout) :: mpi_enreg
      86              : type(datafiles_type),target,intent(inout) :: dtfil
      87              : type(dataset_type),intent(inout) :: dtset
      88              : type(pawang_type),intent(inout) :: pawang
      89              : type(pseudopotential_type),intent(inout) :: psps
      90              : !arrays
      91              : integer,optional,intent(in) :: jdtset(:)
      92              : integer,intent(out) :: npwtot(dtset%nkpt)
      93              : character(len=fnlen),optional,intent(in) :: filnam(:)
      94              : real(dp), intent(out) :: etotal_img(nimage),fcart_img(3,dtset%natom,nimage)
      95              : real(dp), intent(out) :: gred_img(3,dtset%natom,nimage),strten_img(6,nimage)
      96              : real(dp), intent(out) :: intgres_img(dtset%nspden,dtset%natom,nimage)
      97              : real(dp),intent(inout) :: acell_img(3,nimage),amu_img(dtset%ntypat,nimage),occ_img(dtset%mband*dtset%nkpt*dtset%nsppol,nimage)
      98              : real(dp),intent(inout) :: mixalch_img(dtset%npspalch,dtset%ntypalch,nimage)
      99              : real(dp),intent(inout) :: rprim_img(3,3,nimage),vel_cell_img(3,3,nimage),vel_img(3,dtset%natom,nimage)
     100              : real(dp),intent(inout) :: xred_img(3,dtset%natom,nimage)
     101              : type(pawrad_type),intent(inout) :: pawrad(psps%ntypat*psps%usepaw)
     102              : type(pawtab_type),intent(inout) :: pawtab(psps%ntypat*psps%usepaw)
     103              : !Local variables ------------------------------
     104              : 
     105              : integer  :: e_index
     106              : real(dp) :: exchange_energy
     107              : real(dp) :: vxc_energy
     108              : real(dp) :: DFT_band_energy
     109            8 :  type(wvl_data) :: wvl
     110              : 
     111              : ! timing
     112              : real(dp) :: tsec(2)
     113              : integer :: GWLS_TIMAB, OPTION_TIMAB
     114              : !END DEBUG
     115              : ! *************************************************************************
     116              : 
     117              : ! initialize to zero
     118              : 
     119              : ! start new increment of the GWLS timer
     120            8 :  GWLS_TIMAB   = 1501
     121            8 :  OPTION_TIMAB = 1
     122            8 :  call timab(GWLS_TIMAB,OPTION_TIMAB,tsec)
     123              : 
     124              : 
     125            8 :  master_debug = .false.
     126              : !master_debug = .true.
     127              : 
     128              : !Governs the status of all opened files formerly with the status 'new' harcoded.
     129              : !It is initialized in the m_gwls_utility module as 'new'; this default is overriden here if desired.
     130            8 :  files_status_new = 'unknown'
     131              : !Governs the status of all opened files formerly with the status 'old' harcoded.
     132              : !It is initialized in the m_gwls_utility module as 'old'; this default is overriden here if desired.
     133            8 :  files_status_old = 'unknown'
     134              : 
     135              : ! Test the input to make sure it is consistent with what
     136              : ! the code can do
     137              : !call test_input(dtset2,psps2)
     138              : 
     139              : !Initializing variables and build the Hamiltonian using build_H
     140              : 
     141            8 :  GWLS_TIMAB   = 1521
     142              :  OPTION_TIMAB = 1
     143            8 :  call timab(GWLS_TIMAB,OPTION_TIMAB,tsec)
     144              : 
     145              : 
     146              :  call gstateimg(acell_img,amu_img,codvsn,cpui,dtfil,dtset,etotal_img,fcart_img,&
     147              : & gred_img,iexit,intgres_img,mixalch_img,mpi_enreg,nimage,npwtot,occ_img,&
     148              : & pawang,pawrad,pawtab,psps,rprim_img,strten_img,vel_cell_img,vel_img,wvl,xred_img,&
     149            8 : & filnam,filstat,idtset,jdtset,ndtset) ! optional arguments
     150              : 
     151            8 :  OPTION_TIMAB = 2
     152            8 :  call timab(GWLS_TIMAB,OPTION_TIMAB,tsec)
     153              : 
     154              : 
     155              : ! tabulate the valence wavefunctions, to be used throughout the code!
     156              : ! TODO : put in build_H and destroy_H
     157            8 :  GWLS_TIMAB   = 1522
     158            8 :  OPTION_TIMAB = 1
     159            8 :  call timab(GWLS_TIMAB,OPTION_TIMAB,tsec)
     160              : 
     161            8 :  call prepareValenceWavefunctions()
     162              : 
     163            8 :  OPTION_TIMAB = 2
     164            8 :  call timab(GWLS_TIMAB,OPTION_TIMAB,tsec)
     165              : 
     166              : 
     167              : 
     168            8 :  e_index         = dtset%gwls_band_index
     169            8 :  DFT_band_energy = eig(e_index)
     170              : 
     171            8 :  write(std_out,10) '                               '
     172            8 :  write(std_out,10) ' GWLS RESULTS                  '
     173            8 :  write(std_out,10) ' ----------------------------- '
     174            8 :  write(std_out,12) ' For orbital |psi_e>, with e : ',e_index
     175            8 :  write(std_out,14) ' DFT eigenenergy             : ',DFT_band_energy,' Ha = ',DFT_band_energy*Ha_eV,' eV'
     176            8 :  flush(std_out)
     177              : 
     178            8 :  write(ab_out,10) '                               '
     179            8 :  write(ab_out,10) ' GWLS RESULTS                  '
     180            8 :  write(ab_out,10) ' ----------------------------- '
     181            8 :  write(ab_out,12) ' For orbital |psi_e>, with e : ',e_index
     182            8 :  write(ab_out,14) ' DFT eigenenergy             : ',DFT_band_energy,' Ha = ',DFT_band_energy*Ha_eV,' eV'
     183              : 
     184            8 :  if (dtset%gwls_exchange /= 0) then
     185              : 
     186            8 :    GWLS_TIMAB   = 1502
     187            8 :    OPTION_TIMAB = 1
     188            8 :    call timab(GWLS_TIMAB,OPTION_TIMAB,tsec)
     189              : 
     190            8 :    call compute_Exchange_and_Correlation_energies(e_index, exchange_energy, Vxc_energy)
     191              : 
     192            8 :    OPTION_TIMAB = 2
     193            8 :    call timab(GWLS_TIMAB,OPTION_TIMAB,tsec)
     194              : 
     195              : 
     196              : 
     197              : 
     198            8 :    write(std_out,14) ' <psi_e |   V_xc  | psi_e>   : ',vxc_energy     ,' Ha = ',vxc_energy     *Ha_eV,' eV'
     199            8 :    write(std_out,14) ' <psi_e | Sigma_x | psi_e>   : ',exchange_energy,' Ha = ',exchange_energy*Ha_eV,' eV'
     200            8 :    flush(std_out)
     201              : 
     202            8 :    write(ab_out,14) ' <psi_e |   V_xc  | psi_e>   : ',vxc_energy     ,' Ha = ',vxc_energy     *Ha_eV,' eV'
     203            8 :    write(ab_out,14) ' <psi_e | Sigma_x | psi_e>   : ',exchange_energy,' Ha = ',exchange_energy*Ha_eV,' eV'
     204              :  else
     205            0 :    exchange_energy  = zero
     206            0 :    Vxc_energy       = zero
     207              : 
     208              :  end if
     209              : 
     210            8 :  if (dtset%gwls_correlation == 3) then
     211              : 
     212            6 :    call setup_timing_log()
     213              : 
     214            6 :    GWLS_TIMAB   = 1503
     215            6 :    OPTION_TIMAB = 1
     216              : 
     217            6 :    call timab(GWLS_TIMAB,OPTION_TIMAB,tsec)
     218              : 
     219            6 :    call compute_correlations_shift_lanczos(dtset, exchange_energy, Vxc_energy,master_debug)
     220              : 
     221            6 :    OPTION_TIMAB = 2
     222            6 :    call timab(GWLS_TIMAB,OPTION_TIMAB,tsec)
     223              : 
     224              : 
     225            6 :    call close_timing_log()
     226              : 
     227            2 :  else if (dtset%gwls_correlation == 4) then
     228            1 :    call setup_timing_log()
     229            1 :    call compute_correlations_no_model_shift_lanczos(dtset, exchange_energy, Vxc_energy,master_debug)
     230            1 :    call close_timing_log()
     231              : 
     232            1 :  else if (dtset%gwls_correlation == 5) then
     233            1 :    call setup_timing_log()
     234            1 :    call Driver_GeneratePrintDielectricEigenvalues(dtset)
     235            1 :    call close_timing_log()
     236              : 
     237              : 
     238              :  end if
     239              : 
     240            8 :  call cleanupValenceWavefunctions()
     241              : 
     242            8 :  call destroy_H()
     243              : 
     244            8 :  GWLS_TIMAB   = 1501
     245            8 :  OPTION_TIMAB = 2
     246            8 :  call timab(GWLS_TIMAB,OPTION_TIMAB,tsec)
     247              : 
     248              : 
     249              :  10 format(A)
     250              :  12 format(A,I6)
     251              :  14 format(A,ES24.16,A,F16.8,A)
     252              : 
     253            8 : end subroutine gwls_sternheimer
     254              : !!***
     255              : 
     256              : end module m_gwls_sternheimer
     257              : !!***
        

Generated by: LCOV version 2.3-1