LCOV - code coverage report
Current view: top level - src/57_iovars - m_inkpts.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 73.9 % 348 257
Test Date: 2026-11-06 01:31:13 Functions: 100.0 % 2 2
Branches: 66.7 % 538 359

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_inkpts
       2                 :             : !! NAME
       3                 :             : !!  m_inkpts
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!  Routines to initialize k-point and q-point sampling from input file.
       7                 :             : !!
       8                 :             : !! COPYRIGHT
       9                 :             : !!  Copyright (C) 1998-2026 ABINIT group (DCA, XG, GMR)
      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_inkpts
      23                 :             : 
      24                 :             :  use defs_basis
      25                 :             :  use m_abicore
      26                 :             :  use m_errors
      27                 :             :  use m_xmpi
      28                 :             :  use m_nctk
      29                 :             :  use netcdf
      30                 :             :  use m_hdr
      31                 :             : 
      32                 :             :  use m_time,      only : timab
      33                 :             :  use m_fstrings,  only : sjoin, itoa
      34                 :             :  use m_numeric_tools, only : isdiagmat
      35                 :             :  use m_geometry,  only : metric
      36                 :             :  use m_symfind,   only : symfind, symlatt
      37                 :             :  use m_cgtools,   only : set_istwfk
      38                 :             :  use m_parser,    only : intagm
      39                 :             :  use m_kpts,      only : getkgrid, testkgrid, mknormpath
      40                 :             : 
      41                 :             :  implicit none
      42                 :             : 
      43                 :             :  private
      44                 :             : !!***
      45                 :             : 
      46                 :             :  public :: inkpts      ! Initialize k points (list of k points, weights, storage) for one particular dataset.
      47                 :             :  public :: inqpt       ! Initialize the q point for one particular dataset, characterized by jdtset.
      48                 :             : !!***
      49                 :             : 
      50                 :             : contains
      51                 :             : !!***
      52                 :             : 
      53                 :             : !!****f* m_inkpts/inkpts
      54                 :             : !! NAME
      55                 :             : !! inkpts
      56                 :             : !!
      57                 :             : !! FUNCTION
      58                 :             : !! Initialize k points (list of k points, weights, storage)
      59                 :             : !! for one particular dataset, characterized by jdtset.
      60                 :             : !! Note that nkpt (and nkpthf) can be computed by calling this routine with input value of nkpt=0, provided kptopt /= 0.
      61                 :             : !!
      62                 :             : !! INPUTS
      63                 :             : !! bravais(11): bravais(1)=iholohedry
      64                 :             : !!              bravais(2)=center
      65                 :             : !!              bravais(3:11)=coordinates of rprim in the axes of the conventional bravais lattice (*2 if center/=0)
      66                 :             : !! chksymbreak= if 1, will check whether the k point grid is symmetric, and stop if not.
      67                 :             : !! [impose_istwf_1]= (optional argument):
      68                 :             : !!                 0: no restriction on istwfk
      69                 :             : !!                 1: impose istwfk=1 for all k points
      70                 :             : !!                 2: impose istwfk=1 for all k points non equal to zero
      71                 :             : !! iout=unit number for echoed output
      72                 :             : !! iscf= <= 0 => non-SCF, >0 => SCF.
      73                 :             : !! jdtset=number of the dataset looked for
      74                 :             : !! lenstr=actual length of the string
      75                 :             : !! kptopt=option for the generation of k points
      76                 :             : !! msym=default maximal number of symmetries
      77                 :             : !! getkerange_filepath= Path of KERANGE.nc file used to initialize k-point sampling if kptopt == 0 and string != ABI_NOFILE
      78                 :             : !! nqpt=number of q points (0 or 1)
      79                 :             : !! nsym=number of symetries
      80                 :             : !! occopt=option for occupation numbers
      81                 :             : !! qptn(3)=reduced coordinates of eventual q point shift (already normalized).
      82                 :             : !! response=0 if GS case, =1 if RF case.
      83                 :             : !! rprimd(3,3)=dimensional real space primitive translations (bohr)
      84                 :             : !! string*(*)=character string containing all the input data. Initialized previously in instrng.
      85                 :             : !! symafm(nsym)=(anti)ferromagnetic part of symmetry operations
      86                 :             : !! symrel(3,3,nsym)=symmetry operations in real space in terms of primitive translations
      87                 :             : !! vacuum(3)=for each direction, 0 if no vacuum, 1 if vacuum
      88                 :             : !! comm= MPI communicator
      89                 :             : !!
      90                 :             : !! OUTPUT
      91                 :             : !! fockdownsampling(3)=echo of input variable fockdownsampling(3)
      92                 :             : !! kptnrm=normalisation of k points
      93                 :             : !! kptrlatt_orig(3,3)=Original value of kptrlatt as specified in the input file (if kptopt/=0)
      94                 :             : !! kptrlatt(3,3)=k-point lattice specification (if kptopt/=0)
      95                 :             : !! kptrlen=length of the smallest real space supercell vector
      96                 :             : !! nshiftk_orig=Original number of k-point shifts (0 if not read)
      97                 :             : !! nshiftk=actual number of k-point shifts in shiftk (if kptopt/=0)
      98                 :             : !! shiftk(3,MAX_NSHIFTK)=shift vectors for k point generation (if kptopt/=0)
      99                 :             : !! If nkpt/=0  the following arrays are also output:
     100                 :             : !!   istwfk(nkpt)=option parameters that describes the storage of wfs
     101                 :             : !!   kpt(3,nkpt)=reduced coordinates of k points.
     102                 :             : !!   kpthf(3,nkpthf)=reduced coordinates of k points for Fock operator.
     103                 :             : !!   wtk(nkpt)=weight assigned to each k point.
     104                 :             : !! ngkpt(3)=Number of divisions along the three reduced directions
     105                 :             : !!   (0 signals that this variable has not been used.
     106                 :             : !! shiftk_orig(3,MAX_NSHIFTK)=Original shifts read from the input file
     107                 :             : !!   (0 signals that this variable has not been read).
     108                 :             : !!
     109                 :             : !! SIDE EFFECTS
     110                 :             : !! Input/output:
     111                 :             : !! nkpt=number of k points
     112                 :             : !!  if non-zero at input, is only an input variable
     113                 :             : !!  if zero at input, its actual value will be computed
     114                 :             : !! nkpthf=number of k points for Fock operator, computed if nkpt=0 at input
     115                 :             : !!
     116                 :             : !! NOTES
     117                 :             : !! Warning: this routine can be called with nkpt=0 (in which
     118                 :             : !! case it returns the true value of nkpt), which can lead
     119                 :             : !! to strange bugs in the debugging procedure, if one tries to print wtk or istwfk, in this case!
     120                 :             : !!
     121                 :             : !! SOURCE
     122                 :             : 
     123                 :       14052 : subroutine inkpts(bravais,chksymbreak,fockdownsampling,iout,iscf,istwfk,jdtset,&
     124                 :       14052 : & kpt,kpthf,kptopt,kptnrm,kptrlatt_orig,kptrlatt,kptrlen,lenstr,msym, getkerange_filepath, &
     125                 :             : & nkpt,nkpthf,nqpt,ngkpt,nshiftk,nshiftk_orig,shiftk_orig,nsym,&
     126                 :       14052 : & occopt,qptn,response,rprimd,shiftk,string,symafm,symrel,vacuum,wtk,comm,&
     127                 :             : & impose_istwf_1) ! Optional argument
     128                 :             : 
     129                 :             : !Arguments ------------------------------------
     130                 :             : !scalars
     131                 :             :  integer,intent(in) :: chksymbreak,iout,iscf,jdtset,kptopt,lenstr,msym,nqpt,nsym,occopt
     132                 :             :  integer,intent(in) :: response, comm
     133                 :             :  integer,intent(in),optional :: impose_istwf_1
     134                 :             :  integer,intent(inout) :: nkpt,nkpthf
     135                 :             :  integer,intent(out) :: nshiftk,nshiftk_orig
     136                 :             :  integer,intent(out) :: fockdownsampling(3)
     137                 :             :  real(dp),intent(out) :: kptnrm,kptrlen
     138                 :             :  character(len=*),intent(in) :: string
     139                 :             :  character(len=*),intent(in) :: getkerange_filepath
     140                 :             : !arrays
     141                 :             :  integer,intent(in) :: bravais(11),symafm(msym),symrel(3,3,msym),vacuum(3)
     142                 :             :  integer,intent(out) :: istwfk(nkpt),kptrlatt(3,3),kptrlatt_orig(3,3),ngkpt(3)
     143                 :             :  real(dp),intent(in) :: rprimd(3,3),qptn(3)
     144                 :             :  real(dp),intent(out) :: kpt(3,nkpt),kpthf(3,nkpthf),shiftk(3,MAX_NSHIFTK),wtk(nkpt),shiftk_orig(3,MAX_NSHIFTK)
     145                 :             : 
     146                 :             : !Local variables-------------------------------
     147                 :             : !scalars
     148                 :             :  integer,parameter :: master = 0
     149                 :             :  integer :: dkpt,ii,ikpt,jkpt,marr,ndiv_small,nkpt_computed,my_rank,nprocs
     150                 :             :  integer :: nsegment,prtkpt,tread,tread_kptrlatt,tread_ngkpt, ncid, fform, ierr
     151                 :             :  logical :: use_kerange
     152                 :             :  real(dp) :: fraction,norm,ucvol,wtksum
     153                 :             :  character(len=500) :: msg
     154                 :       14052 :  type(hdr_type) :: hdr
     155                 :             : !arrays
     156                 :       14052 :  integer,allocatable :: ndivk(:),intarr(:), krange2ibz(:)
     157                 :             :  real(dp) :: gmet(3,3),gprimd(3,3),kpoint(3),rmet(3,3),tsec(2)
     158                 :       14052 :  real(dp),allocatable :: kptbounds(:,:),dprarr(:)
     159                 :             : 
     160                 :             : ! *************************************************************************
     161                 :             : 
     162                 :       14052 :  call timab(192,1,tsec)
     163                 :             : 
     164                 :       14052 :  my_rank = xmpi_comm_rank(comm); nprocs = xmpi_comm_size(comm)
     165                 :             : 
     166                 :             :  ! Compute the maximum size of arrays intarr and dprarr
     167                 :       14052 :  marr = max(3*nkpt,3*MAX_NSHIFTK)
     168   [ -  +  +  -  :       42156 :  ABI_MALLOC(intarr,(marr))
          +  -  -  +  -  
                      + ]
     169   [ -  +  +  -  :       42156 :  ABI_MALLOC(dprarr,(marr))
          +  -  -  +  -  
                      + ]
     170                 :             : 
     171                 :             :  ! Use zero to signal that these values have not been read.
     172                 :       14052 :  ngkpt = 0
     173                 :       14052 :  shiftk_orig = zero
     174                 :       14052 :  kptrlatt_orig = 0; kptrlatt = 0
     175                 :       14052 :  nshiftk_orig = 1; nshiftk = 1
     176                 :       14052 :  use_kerange = .False.
     177                 :             : 
     178                 :             :  !fockdownsampling(:)=1
     179                 :             :  !kptnrm = one
     180                 :             :  !kpthf = zero
     181                 :             : 
     182                 :             :  ! MG: FIXME These values should be initialized because they are intent(out)
     183                 :             :  ! but several tests fails. So we keep this bug to avoid problems somewhere else
     184                 :             :  ! The initialization of the kpoints should be rewritten in a cleaner way
     185                 :             :  ! without all these side effects!
     186                 :             :  !shiftk = zero
     187                 :             :  ! Initializing these three variables is OK but we keep the bug to preserve the old behavior
     188                 :             :  !wtk = one
     189                 :             :  !kpt = zero
     190                 :             :  !istwfk = 1
     191                 :             : 
     192                 :             :  ! Initialize kptrlen
     193                 :       14052 :  kptrlen=30.0_dp
     194                 :       14052 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'kptrlen',tread,'DPR')
     195         [ +  + ]:       14052 :  if(tread==1)kptrlen=dprarr(1)
     196                 :             : 
     197                 :             :  ! Initialize kpt, kptnrm and wtk according to kptopt.
     198   [ +  +  +  + ]:       14052 :  if (kptopt == 0 .and. getkerange_filepath == ABI_NOFILE) then
     199                 :             :    ! For kptopt==0, one must have nkpt defined.
     200   [ +  +  +  + ]:       48658 :    kpt(:,:)=zero
     201                 :        6394 :    call intagm(dprarr,intarr,jdtset,marr,3*nkpt,string(1:lenstr),'kpt',tread,'DPR')
     202   [ +  +  +  + ]:       11014 :    if(tread==1) kpt(:,:)=reshape( dprarr(1:3*nkpt), [3,nkpt])
     203                 :             : 
     204                 :        6394 :    kptnrm=one
     205                 :        6394 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'kptnrm',tread,'DPR')
     206         [ +  + ]:        6394 :    if(tread==1) kptnrm=dprarr(1)
     207                 :             : 
     208                 :             :    ! Only read wtk when iscf >0 or iscf=-1 or iscf=-3 or (iscf=-2 and response=1)
     209                 :             :    ! (this last option is for Zach Levine)
     210                 :             :    ! Normalize the k-point weights when occopt/=2
     211                 :             :    ! Check that k point weights add to 1 when occopt==2
     212   [ +  +  +  +  :        6394 :    if  (iscf>0.or.iscf==-1.or.iscf==-3.or.(iscf==-2.and.response==1))  then
             +  -  +  + ]
     213         [ +  + ]:       16242 :      wtk = one
     214                 :        6286 :      call intagm(dprarr,intarr,jdtset,marr,nkpt,string(1:lenstr),'wtk',tread,'DPR')
     215   [ +  +  +  + ]:       11588 :      if(tread==1) wtk(1:nkpt)=dprarr(1:nkpt)
     216                 :             : 
     217         [ +  + ]:       16242 :      wtksum=sum(wtk(:))
     218                 :        6286 :      write(msg,'(a,i0,a,f12.6)')' inkpts: Sum of ',nkpt,' k point weights is',wtksum
     219                 :        6286 :      call wrtout(std_out,msg)
     220                 :             : 
     221         [ -  + ]:        6286 :      if (wtksum < tol6) then
     222                 :             :        write(msg, '(3a)' )&
     223                 :           0 :        'This sum is too close to zero. ',ch10,&
     224                 :           0 :        'Action: correct the array wtk in the input file.'
     225                 :           0 :        ABI_ERROR(msg)
     226                 :             :      end if
     227         [ +  + ]:        6286 :      if (abs(wtksum - one) > tol6) then
     228         [ -  + ]:         344 :        if (occopt==2) then
     229                 :             :          write(msg, '(a,1p,e18.8,a,a,a)' )&
     230                 :           0 :           'wtksum= ',wtksum,' /= 1.0 means wts do not add to 1 , while occopt=2.',ch10,&
     231                 :           0 :           'Action: correct the array wtk in input file.'
     232                 :           0 :          ABI_ERROR(msg)
     233                 :             :        else
     234                 :         344 :          write(msg,'(a,i0,a)')' With present occopt= ',occopt,', renormalize it to one'
     235                 :         344 :          call wrtout(std_out,msg)
     236                 :         344 :          norm=one/wtksum
     237         [ +  + ]:        1334 :          wtk(1:nkpt)=wtk(1:nkpt)*norm
     238                 :             :        end if
     239                 :             :      end if
     240                 :             :    end if
     241                 :             : 
     242   [ +  +  +  - ]:        7658 :  else if (kptopt == 0 .and. getkerange_filepath /= ABI_NOFILE) then
     243                 :             :    ! Initialize k-points from kerange_path file.
     244                 :           4 :    use_kerange = .True.
     245   [ -  +  +  -  :          12 :    ABI_MALLOC(krange2ibz, (nkpt))
          +  -  +  -  -  
                +  -  + ]
     246         [ +  - ]:           4 :    if (my_rank == master) then
     247         [ -  + ]:           4 :      NCF_CHECK(nctk_open_read(ncid, getkerange_filepath, xmpi_comm_self))
     248                 :           4 :      call hdr%ncread(ncid, fform)
     249         [ -  + ]:           4 :      ABI_CHECK(fform == fform_from_ext("KERANGE.nc"), sjoin("Error while reading:", getkerange_filepath, ", fform:", itoa(fform)))
     250                 :             :      ! TODO Add code for consistency check
     251                 :             :      !kptopt, nsym, occopt
     252                 :             :      !ABI_CHECK(nkpt == hdr%nkpt, "nkpt from kerange != nkpt")
     253         [ -  + ]:           4 :      NCF_CHECK(nf90_get_var(ncid, nctk_idname(ncid, "krange2ibz"), krange2ibz))
     254         [ -  + ]:           4 :      NCF_CHECK(nf90_close(ncid))
     255                 :             :    end if
     256                 :             : 
     257                 :           4 :    call xmpi_bcast(krange2ibz, master, comm, ierr)
     258                 :           4 :    call hdr%bcast(master, my_rank, comm)
     259                 :             :    ! Hdr contains the kpts in the IBZ. Extract k-points in the pockets via krange2ibz.
     260                 :           4 :    nshiftk = hdr%nshiftk; nshiftk_orig = hdr%nshiftk_orig
     261         [ +  + ]:          38 :    istwfk = hdr%istwfk(krange2ibz(:))
     262   [ +  +  +  +  :         100 :    kptrlatt = hdr%kptrlatt; kptrlatt_orig = hdr%kptrlatt_orig
             +  +  +  + ]
     263         [ -  + ]:           4 :    ABI_CHECK(isdiagmat(hdr%kptrlatt), "kptrlatt is not diagonal!")
     264                 :           4 :    ngkpt(1) = hdr%kptrlatt(1, 1); ngkpt(2) = hdr%kptrlatt(2, 2); ngkpt(3) = hdr%kptrlatt(3, 3)
     265   [ +  +  +  + ]:         140 :    kpt = hdr%kptns(:, krange2ibz(:)) !; kpthf(3,nkpthf)
     266   [ +  +  +  +  :          36 :    shiftk(:,1:nshiftk) = hdr%shiftk; shiftk_orig(:, 1:nshiftk_orig) = hdr%shiftk_orig
             +  +  +  + ]
     267         [ +  + ]:          38 :    wtk = hdr%wtk(krange2ibz(:))
     268                 :           4 :    call hdr%free()
     269                 :           4 :    kptnrm = one
     270         [ -  + ]:           4 :    ABI_FREE(krange2ibz)
     271                 :             : 
     272         [ +  + ]:        7654 :  else if (kptopt < 0) then
     273                 :             :    ! Band structure calculation
     274                 :         284 :    nsegment=abs(kptopt)
     275                 :             : 
     276         [ -  + ]:         284 :    if (iscf /= -2)then
     277                 :             :      write(msg,  '(3a,i0,3a)' ) &
     278                 :           0 :       'For a negative kptopt, iscf must be -2,',ch10,&
     279                 :           0 :       'while it is found to be ',iscf,'.',ch10,&
     280                 :           0 :       'Action: change the value of iscf in your input file, or change kptopt.'
     281                 :           0 :      ABI_ERROR(msg)
     282                 :             :    end if
     283                 :             : 
     284         [ -  + ]:         284 :    if(marr<3*nsegment+3)then
     285                 :           0 :      marr=3*nsegment+3
     286         [ #  # ]:           0 :      ABI_FREE(dprarr)
     287         [ #  # ]:           0 :      ABI_FREE(intarr)
     288   [ #  #  #  #  :           0 :      ABI_MALLOC(dprarr,(marr))
          #  #  #  #  #  
                      # ]
     289   [ #  #  #  #  :           0 :      ABI_MALLOC(intarr,(marr))
          #  #  #  #  #  
                      # ]
     290                 :             :    end if
     291                 :             : 
     292   [ -  +  +  -  :         852 :    ABI_MALLOC(kptbounds,(3,nsegment+1))
          +  -  -  +  -  
                      + ]
     293   [ -  +  +  -  :         852 :    ABI_MALLOC(ndivk,(nsegment))
          +  -  -  +  -  
                      + ]
     294                 :             : 
     295                 :         284 :    call intagm(dprarr,intarr,jdtset,marr,3*nsegment+3,string(1:lenstr),'kptbounds',tread,'DPR')
     296                 :             : 
     297         [ +  - ]:         284 :    if(tread==1)then
     298         [ +  + ]:         852 :      kptbounds(:,:)=reshape( dprarr(1:3*nsegment+3), [3,nsegment+1])
     299                 :             :    else
     300                 :             :      write(msg,'(5a)') &
     301                 :           0 :      'When kptopt is negative, kptbounds must be initialized ',ch10,&
     302                 :           0 :      'in the input file, which is not the case.',ch10,&
     303                 :           0 :      'Action: initialize kptbounds in your input file, or change kptopt.'
     304                 :           0 :      ABI_ERROR(msg)
     305                 :             :    end if
     306                 :             : 
     307                 :         284 :    call intagm(dprarr,intarr,jdtset,marr,nsegment,string(1:lenstr),'ndivk',tread,'INT')
     308         [ +  + ]:         284 :    if(tread==1)then
     309         [ +  + ]:         450 :      ndivk(1:nsegment)=intarr(1:nsegment)
     310                 :             :      ! The 1 stand for the first point
     311         [ +  + ]:         450 :      nkpt_computed=1+sum(ndivk(1:nsegment))
     312                 :             : 
     313                 :             :      ! ndivk and ndivsm are mutually exclusive
     314                 :         214 :      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ndivsm',tread,'INT')
     315         [ -  + ]:         214 :      if (tread == 1) then
     316                 :           0 :        ABI_ERROR("ndivk and ndivsm are mutually exclusive. Choose only one variable")
     317                 :             :      end if
     318                 :             : 
     319                 :             :    else
     320                 :             :      ! Calculate ndivk such as the path is normalized
     321                 :             :      ! Note that if both ndivk and ndivsm are defined in in input file, only ndivk is used !
     322                 :          70 :      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ndivsm',tread,'INT')
     323         [ +  - ]:          70 :      if(tread==1)then
     324                 :          70 :        ndiv_small=intarr(1)
     325                 :          70 :        call metric(gmet,gprimd,std_out,rmet,rprimd,ucvol)
     326                 :          70 :        call mknormpath(nsegment+1,kptbounds,gmet,ndiv_small,ndivk,nkpt_computed)
     327                 :             :      else
     328                 :             :        write(msg,'(5a)') &
     329                 :           0 :         'When kptopt is negative, ndivsm or ndivk must be initialized ',ch10,&
     330                 :           0 :         'in the input file, which is not the case.',ch10,&
     331                 :           0 :         'Action: initialize ndivsm or ndivk in your input file, or change kptopt.'
     332                 :           0 :        ABI_ERROR(msg)
     333                 :             :      end if
     334                 :             :    end if
     335                 :             : 
     336                 :             :    ! Check that the argument nkpt is coherent with nkpt_computed
     337   [ +  +  -  + ]:         284 :    if (nkpt/=0 .and. nkpt /= nkpt_computed) then
     338                 :             :      write(msg,  '(a,i0,5a,i0,7a)' ) &
     339                 :           0 :      'The argument nkpt = ',nkpt,', does not match',ch10,&
     340                 :           0 :      'the number of k points generated by kptopt, ndivk, kptbounds,',ch10,&
     341                 :           0 :      'and the eventual symmetries, that is, nkpt= ',nkpt_computed,'.',ch10,&
     342                 :           0 :      'However, note that it might due to the user,',ch10,&
     343                 :           0 :      'if nkpt is explicitely defined in the input file.',ch10,&
     344                 :           0 :      'In this case, please check your input file.'
     345                 :           0 :      ABI_ERROR(msg)
     346                 :             :    end if
     347                 :             : 
     348         [ +  + ]:         284 :    if (nkpt/=0) then
     349                 :             :      ! The array kpt has the right dimension and we can generate the k-path
     350                 :         143 :      call intagm(dprarr,intarr,jdtset,marr,3*nsegment+3,string(1:lenstr),'kptbounds',tread,'DPR')
     351         [ +  - ]:         143 :      if(tread==1)then
     352         [ +  + ]:         429 :        kptbounds(:,:)=reshape( dprarr(1:3*nsegment+3), [3,nsegment+1])
     353                 :             :      else
     354                 :             :        write(msg, '(5a)') &
     355                 :           0 :        'When kptopt is negative, kptbounds must be initialized ',ch10,&
     356                 :           0 :        'in the input file, which is not the case.',ch10,&
     357                 :           0 :        'Action: initialize kptbounds in your input file, or change kptopt.'
     358                 :           0 :        ABI_ERROR(msg)
     359                 :             :      end if
     360                 :             : 
     361                 :             :      ! First k point
     362                 :         572 :      jkpt=1
     363         [ +  + ]:         572 :      kpt(:,1)=kptbounds(:,1)
     364         [ +  + ]:         523 :      do ii=1,nsegment
     365                 :         380 :        dkpt=ndivk(ii)
     366         [ +  + ]:        3428 :        do ikpt=1,dkpt
     367                 :        3048 :          fraction=dble(ikpt)/dble(dkpt)
     368         [ +  + ]:       12572 :          kpt(:,ikpt+jkpt)=fraction *kptbounds(:,ii+1)+(one-fraction)*kptbounds(:,ii)
     369                 :             :        end do
     370                 :         523 :        jkpt=jkpt+dkpt
     371                 :             :      end do
     372                 :             : 
     373                 :             :    end if
     374                 :             : 
     375                 :         284 :    kptnrm=one
     376                 :         284 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'kptnrm',tread,'DPR')
     377         [ -  + ]:         284 :    if(tread==1) kptnrm=dprarr(1)
     378                 :             : 
     379         [ -  + ]:         284 :    ABI_FREE(kptbounds)
     380         [ -  + ]:         284 :    ABI_FREE(ndivk)
     381                 :             : 
     382         [ +  - ]:        7370 :  else if (kptopt>=1 .and. kptopt<=4) then
     383                 :             :    ! Read ngkpt
     384                 :        7370 :    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ngkpt',tread_ngkpt,'INT')
     385         [ +  + ]:        7370 :    if(tread_ngkpt==1)then
     386         [ +  + ]:       26444 :      ngkpt(1:3)=intarr(1:3)
     387         [ +  + ]:       26444 :      do ii=1,3
     388         [ -  + ]:       26444 :        if(ngkpt(ii)<1)then
     389                 :             :          write(msg,'(a,i0,3a,i0,3a)') &
     390                 :           0 :          'The input variable ngkpt(',ii,') must be strictly positive,',ch10,&
     391                 :           0 :          'while it is found to be ',ngkpt(ii),'.',ch10,&
     392                 :           0 :          'Action: change it in your input file, or change kptopt.'
     393                 :           0 :          ABI_ERROR(msg)
     394                 :             :        end if
     395                 :             :      end do
     396                 :             :    end if
     397                 :             : 
     398                 :        7370 :    call intagm(dprarr,intarr,jdtset,marr,9,string(1:lenstr),'kptrlatt',tread_kptrlatt,'INT')
     399         [ +  + ]:        7370 :    if(tread_kptrlatt==1) kptrlatt(:,:)=reshape(intarr(1:9), [3,3])
     400                 :             : 
     401   [ +  +  -  + ]:        7370 :    if(tread_ngkpt==1 .and. tread_kptrlatt==1)then
     402                 :             :      write(msg, '(5a)') &
     403                 :           0 :      'The input variables ngkpt and kptrlatt cannot both ',ch10,&
     404                 :           0 :      'be defined in the input file.',ch10,&
     405                 :           0 :      'Action: change one of ngkpt or kptrlatt in your input file.'
     406                 :           0 :      ABI_ERROR(msg)
     407         [ +  + ]:        7370 :    else if(tread_ngkpt==1)then
     408                 :        6611 :      kptrlatt(:,:)=0
     409                 :        6611 :      kptrlatt(1,1)=ngkpt(1)
     410                 :        6611 :      kptrlatt(2,2)=ngkpt(2)
     411                 :        6611 :      kptrlatt(3,3)=ngkpt(3)
     412                 :             :      ! Save kptrlatt for reference.
     413                 :        6611 :      kptrlatt_orig = kptrlatt
     414                 :             :    end if
     415                 :             : 
     416                 :        7370 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nshiftk',tread,'INT')
     417         [ +  + ]:        7370 :    if(tread==1)nshiftk=intarr(1)
     418                 :             : 
     419         [ -  + ]:        7370 :    if (nshiftk < 1 .or. nshiftk > MAX_NSHIFTK )then
     420                 :             :      write(msg,  '(a,i0,2a,i0,3a)' )&
     421                 :           0 :      'The only allowed values of nshiftk are between 1 and ',MAX_NSHIFTK,ch10,&
     422                 :           0 :      'while it is found to be',nshiftk,'.',ch10,&
     423                 :           0 :      'Action: change the value of nshiftk in your input file, or change kptopt.'
     424                 :           0 :      ABI_ERROR(msg)
     425                 :             :    end if
     426                 :             : 
     427                 :        7370 :    call intagm(dprarr,intarr,jdtset,marr,3*nshiftk,string(1:lenstr),'shiftk',tread,'DPR')
     428         [ +  + ]:        7370 :    if(tread==1)then
     429         [ +  + ]:       19689 :      shiftk(:,1:nshiftk)=reshape( dprarr(1:3*nshiftk), [3,nshiftk])
     430                 :             :      ! Save input shifts as they will be changes in getkgrid.
     431                 :        6563 :      nshiftk_orig = nshiftk
     432   [ +  +  +  + ]:       66603 :      shiftk_orig(:,1:nshiftk) = shiftk(:,1:nshiftk)
     433                 :             :    else
     434         [ -  + ]:         807 :      if(nshiftk/=1)then
     435                 :             :        write(msg,  '(3a,i0,2a)' )&
     436                 :           0 :        'When nshiftk is not equal to 1, shiftk must be defined in the input file.',ch10,&
     437                 :           0 :        'However, shiftk is not defined, while nshiftk=',nshiftk,ch10,&
     438                 :           0 :        'Action: change the value of nshiftk in your input file, or define shiftk.'
     439                 :           0 :        ABI_ERROR(msg)
     440                 :             :      end if
     441                 :             :      ! Default values used in indefo
     442                 :         807 :      nshiftk_orig = 1
     443   [ +  +  +  + ]:        4035 :      shiftk_orig(:,1:nshiftk) = half
     444                 :             :    end if
     445                 :             : 
     446                 :        7370 :    prtkpt=0
     447                 :        7370 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtkpt',tread,'INT')
     448         [ +  + ]:        7370 :    if(tread==1)prtkpt=intarr(1)
     449                 :             : 
     450   [ +  +  +  +  :       95810 :    if(sum(abs(kptrlatt(:,:)))==0)then
                   +  + ]
     451                 :         197 :      kptrlatt_orig = 0
     452         [ +  + ]:         788 :      do ii=1,3
     453                 :         788 :        kptrlatt_orig(ii,ii) = ngkpt(ii)
     454                 :             :      end do
     455                 :             :      ! The parameters of the k lattice are not known, compute kptrlatt, nshiftk, shiftk.
     456                 :         197 :      call testkgrid(bravais,iout,kptrlatt,kptrlen, msym,nshiftk,nsym,prtkpt,rprimd,shiftk,symafm,symrel,vacuum)
     457                 :             :    end if
     458                 :             : 
     459                 :             :    ! TODO: Avoid call to getkgrid if eph
     460                 :             :    !eph_task = -1
     461                 :             :    !call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_task',tread,'INT')
     462                 :             :    !if(tread==1) eph_task=intarr(1)
     463                 :             : 
     464         [ +  + ]:       29428 :    fockdownsampling(:)=1
     465                 :        7357 :    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'fockdownsampling',tread,'INT')
     466   [ +  +  +  + ]:        7873 :    if(tread==1)fockdownsampling=intarr(1:3)
     467                 :             : 
     468                 :             :    call getkgrid(chksymbreak,0,iscf,kpt,kptopt,kptrlatt,kptrlen,&
     469                 :             :     msym,nkpt,nkpt_computed,nshiftk,nsym,rprimd,&
     470                 :        7357 :     shiftk,symafm,symrel,vacuum,wtk,nkpthf=nkpthf,kpthf=kpthf,downsampling=fockdownsampling)
     471                 :             : 
     472                 :        7356 :    kptnrm=one
     473                 :             : 
     474                 :             :  else
     475                 :             :    write(msg,'(3a,i0,3a)' ) &
     476                 :           0 :    'The only values of kptopt allowed are smaller than 4.',ch10,&
     477                 :           0 :    'The input value of kptopt is: ',kptopt,'.',ch10,&
     478                 :           0 :    'Action: change kptopt in your input file.'
     479                 :           0 :    ABI_ERROR(msg)
     480                 :             :  end if
     481                 :             : 
     482         [ -  + ]:       14038 :  if (kptnrm < tol10) then
     483                 :             :    write(msg, '(5a)' )&
     484                 :           0 :    'The input variable kptnrm is lower than 1.0d-10,',ch10,&
     485                 :           0 :    'while it must be a positive, non-zero number.   ',ch10,&
     486                 :           0 :    'Action: correct the kptnrm in the input file.'
     487                 :           0 :    ABI_ERROR(msg)
     488                 :             :  end if
     489                 :             : 
     490                 :             :  ! The k point number has been computed, and, if nkpt/=0, also the list of k points.
     491                 :             :  ! Also nkpthf has been computed, and, if nkpt/=0, also the list kpthf.
     492                 :             :  ! Now, determine istwfk, and eventually shift the k points by the value of qptn.
     493         [ +  + ]:       14038 :  if (nkpt /= 0) then
     494         [ +  + ]:      138768 :    istwfk(1:nkpt)=0
     495                 :       10533 :    call intagm(dprarr,intarr,jdtset,marr,nkpt,string(1:lenstr),'istwfk',tread,'INT')
     496   [ +  +  +  + ]:       25816 :    if(tread==1) istwfk(1:nkpt)=intarr(1:nkpt)
     497                 :             : 
     498                 :             :    ! Impose istwfk=1 for RF calculations or NSCF calculation with kpts from kerange.
     499   [ +  +  +  +  :       75926 :    if (response == 1 .or. use_kerange) istwfk(1:nkpt)=1
                   +  + ]
     500                 :             : 
     501                 :             :    ! Also impose istwfk=1 for spinor calculations
     502                 :       10533 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nspinor',tread,'INT')
     503   [ +  +  +  +  :       12967 :    if(tread/=0 .and. intarr(1)/=1)istwfk(1:nkpt)=1
                   +  + ]
     504                 :             : 
     505                 :       10533 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawspnorb',tread,'INT')
     506   [ +  +  +  +  :       10674 :    if(tread/=0 .and. intarr(1)/=0)istwfk(1:nkpt)=1
                   +  + ]
     507                 :             : 
     508                 :       10533 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'zora',tread,'INT')
     509   [ +  +  +  +  :       10801 :    if( tread/=0 .and. intarr(1)/=0 .and. intarr(1)/=1)istwfk(1:nkpt)=1
             +  +  +  + ]
     510                 :             : 
     511         [ +  + ]:      138768 :    do ikpt=1,nkpt
     512         [ +  + ]:      128235 :      if(istwfk(ikpt)==0)then
     513   [ +  +  +  +  :      209906 :        kpoint=kpt(:,ikpt)/kptnrm; if (nqpt/=0.and.response==0) kpoint=kpoint+qptn
             +  -  +  + ]
     514                 :       48671 :        istwfk(ikpt) = set_istwfk(kpoint)
     515                 :             :      end if
     516         [ +  + ]:      138768 :      if (present(impose_istwf_1)) then
     517         [ +  + ]:      113711 :        if (impose_istwf_1==1) then
     518                 :        1564 :          istwfk(ikpt)=1
     519   [ +  +  +  +  :      233056 :        else if (impose_istwf_1==2.and.any(kpt(:,ikpt)>tol10)) then
             +  +  +  + ]
     520                 :        1175 :          istwfk(ikpt)=1
     521                 :             :        end if
     522                 :             :      end if
     523                 :             :    end do
     524                 :             :  end if
     525                 :             : 
     526                 :             :  ! If nkpt was to be computed, transfer it from nkpt_computed
     527         [ +  + ]:       14038 :  if (nkpt == 0) nkpt = nkpt_computed
     528                 :             : 
     529         [ -  + ]:       14038 :  ABI_FREE(intarr)
     530         [ -  + ]:       14038 :  ABI_FREE(dprarr)
     531                 :             : 
     532                 :       14038 :  call timab(192,2,tsec)
     533                 :             : 
     534   [ -  +  -  +  :       14038 : end subroutine inkpts
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  -  -  -  -  
          -  -  -  -  -  
             -  -  -  - ]
     535                 :             : !!***
     536                 :             : 
     537                 :             : !!****f* m_inkpts/inqpt
     538                 :             : !! NAME
     539                 :             : !! inqpt
     540                 :             : !!
     541                 :             : !! FUNCTION
     542                 :             : !! Initialize the q point for one particular dataset, characterized by jdtset.
     543                 :             : !!
     544                 :             : !! INPUTS
     545                 :             : !!  chksymbreak= if 1, will check whether the k point grid is symmetric, and stop if not.
     546                 :             : !!  iout=unit number for echoed output
     547                 :             : !!  jdtset=number of the dataset looked for
     548                 :             : !!  lenstr=actual length of the string
     549                 :             : !!  msym=default maximal number of symmetries
     550                 :             : !!  natom=number of atoms
     551                 :             : !!  rprimd(3,3)=dimensional real space primitive translations (bohr)
     552                 :             : !!  spinat(3,1:natom)=spin-magnetization of the atoms
     553                 :             : !!  string*(*)=character string containing all the input data. Initialized previously in instrng.
     554                 :             : !!  typat(natom)=type for each atom
     555                 :             : !!  vacuum(3)=for each direction, 0 if no vacuum, 1 if vacuum
     556                 :             : !!  xred(3,natom,nimage) =reduced coordinates of atoms
     557                 :             : !!
     558                 :             : !! OUTPUT
     559                 :             : !!  qptn(3)=reduced coordinates of eventual q point (normalisation is already included)
     560                 :             : !!  kptrlatt(3,3)=q-point lattice specification (if kptopt/=0)
     561                 :             : !!  wtqc=weigth of the eventual current q point
     562                 :             : !!
     563                 :             : !! SOURCE
     564                 :             : 
     565                 :         714 : subroutine inqpt(chksymbreak,iout,jdtset,lenstr,msym,natom,qptn,wtqc,rprimd,spinat,string,typat,vacuum,xred,qptrlatt)
     566                 :             : 
     567                 :             : !Arguments ------------------------------------
     568                 :             : !scalars
     569                 :             :  integer,intent(in)   :: chksymbreak,iout,jdtset,lenstr,msym,natom
     570                 :             :  real(dp),intent(inout) :: wtqc
     571                 :             :  character(len=*),intent(in) :: string
     572                 :             : !arrays
     573                 :             :  integer,intent(in) :: typat(natom),vacuum(3)
     574                 :             :  real(dp),intent(out) :: qptn(3)
     575                 :             :  integer,intent(inout) :: qptrlatt(3,3) !vz_i
     576                 :             :  real(dp),intent(in) :: rprimd(3,3)
     577                 :             :  real(dp),intent(in) :: spinat(3,natom)
     578                 :             :  real(dp),intent(in) :: xred(3,natom)
     579                 :             : 
     580                 :             : !Local variables-------------------------------
     581                 :             : !scalars
     582                 :             :  integer :: ii,iqpt,iscf_fake,marr,nptsym,nqpt_max,nqpt_computed,nshiftq,nsym_new,qptopt
     583                 :             :  integer :: tread,tread_q_sum,tread_qptrlatt,tread_ngqpt,use_inversion
     584                 :             :  real(dp) :: qptnrm,qptrlen,tolsym,ucvol
     585                 :             :  character(len=500) :: msg
     586                 :             : !arrays
     587                 :             :  integer :: bravais(11), ngqpt(3)
     588                 :         714 :  integer, allocatable :: symafm_new(:), ptsymrel(:,:,:),symrel_new(:,:,:), intarr(:)
     589                 :             :  real(dp) :: gmet(3,3),gprimd(3,3),qpt(3),rmet(3,3),shiftq(3,MAX_NSHIFTK)
     590                 :         714 :  real(dp),allocatable :: qpts(:,:),tnons_new(:,:),wtq(:), dprarr(:)
     591                 :             : 
     592                 :             : ! *************************************************************************
     593                 :             : 
     594                 :             :  ! Compute the maximum size of arrays intarr and dprarr (nshiftq is MAX_NSHIFTK at maximum)
     595                 :         714 :  marr=630
     596         [ -  + ]:         714 :  ABI_MALLOC(intarr,(marr))
     597         [ -  + ]:         714 :  ABI_MALLOC(dprarr,(marr))
     598                 :         714 :  tread_q_sum=0
     599                 :             : 
     600                 :             :  ! Find the method to generate the q-points
     601                 :         714 :  qptopt=0
     602                 :         714 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'qptopt',tread,'INT')
     603                 :         714 :  tread_q_sum=tread_q_sum+tread
     604         [ +  + ]:         714 :  if(tread==1)qptopt=intarr(1)
     605                 :             : 
     606         [ +  + ]:         714 :  if(qptopt==0)then
     607                 :             :    ! Read qpt and qptnrm
     608                 :         616 :    qpt=zero
     609                 :         616 :    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'qpt',tread,'DPR')
     610                 :         616 :    tread_q_sum=tread_q_sum+tread
     611   [ +  +  +  + ]:        3024 :    if(tread==1) qpt(1:3)=dprarr(1:3)
     612                 :             : 
     613                 :         616 :    qptnrm=1.0_dp
     614                 :         616 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'qptnrm',tread,'DPR')
     615                 :         616 :    tread_q_sum=tread_q_sum+tread
     616                 :             : 
     617         [ +  + ]:         616 :    if(tread==1) qptnrm=dprarr(1)
     618         [ +  - ]:           4 :    if(qptnrm<tol10)then
     619                 :             :      write(msg, '(5a)' )&
     620                 :           0 :      'The input variable qptnrm is lower than 1.0d-10,',ch10,&
     621                 :           0 :      'while it must be a positive, non-zero number.   ',ch10,&
     622                 :           0 :      'Action: correct the qptnrm in the input file.'
     623                 :           0 :      ABI_ERROR(msg)
     624                 :             :    end if
     625                 :             : 
     626         [ +  + ]:        2464 :    qptn(:)=qpt(:)/qptnrm
     627                 :             : 
     628                 :             :    ! DBSP: one could want ot define wtq in order to reproduce what is obtained
     629                 :             :    ! with ngqpt but without having to do initialize the qgrid (extremly slow in case of large grid > 50x50x50
     630                 :         616 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wtq',tread,'DPR')
     631                 :         616 :    tread_q_sum=tread_q_sum+tread
     632         [ +  + ]:         616 :    if(tread==1) wtqc=dprarr(1)
     633                 :             : 
     634         [ +  - ]:          98 :  else if (qptopt>=1 .and. qptopt<=4) then
     635                 :          98 :    ngqpt(:)=0
     636                 :          98 :    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ngqpt',tread_ngqpt,'INT')
     637                 :          98 :    tread_q_sum=tread_q_sum+tread_ngqpt
     638                 :             : 
     639         [ +  + ]:          98 :    if(tread_ngqpt==1)then
     640         [ +  + ]:         348 :      ngqpt(1:3)=intarr(1:3)
     641         [ +  + ]:         348 :      do ii=1,3
     642         [ -  + ]:         348 :        if(ngqpt(ii)<1)then
     643                 :             :          write(msg,  '(a,i0,a,a,a,i0,a,a,a)' ) &
     644                 :           0 :          'The input variable ngqpt(',ii,') must be strictly positive,',ch10,&
     645                 :           0 :          'while it is found to be',ngqpt(ii),'.',ch10,&
     646                 :           0 :          'Action: change it in your input file, or change qptopt.'
     647                 :           0 :          ABI_ERROR(msg)
     648                 :             :        end if
     649                 :             :      end do
     650                 :             :    end if
     651                 :             : 
     652                 :          98 :    call intagm(dprarr,intarr,jdtset,marr,9,string(1:lenstr),'qptrlatt',tread_qptrlatt,'INT')
     653         [ +  + ]:          98 :    if(tread_qptrlatt==1) qptrlatt(:,:)=reshape(intarr(1:9), (/3,3/) )
     654                 :          98 :    tread_q_sum=tread_q_sum+tread_qptrlatt
     655                 :             : 
     656   [ +  +  -  + ]:          98 :    if(tread_ngqpt==1 .and. tread_qptrlatt==1)then
     657                 :             :      write(msg, '(5a)' ) &
     658                 :           0 :      'The input variables ngqpt and qptrlatt cannot both ',ch10,&
     659                 :           0 :      'be defined in the input file.',ch10,&
     660                 :           0 :      'Action: change one of ngqpt or qptrlatt in your input file.'
     661                 :           0 :      ABI_ERROR(msg)
     662         [ +  + ]:          98 :    else if(tread_ngqpt==1)then
     663                 :          87 :      qptrlatt(:,:)=0
     664                 :          87 :      qptrlatt(1,1)=ngqpt(1)
     665                 :          87 :      qptrlatt(2,2)=ngqpt(2)
     666                 :          87 :      qptrlatt(3,3)=ngqpt(3)
     667                 :             :    end if
     668                 :             : 
     669                 :          98 :    nshiftq=1
     670                 :          98 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nshiftq',tread,'INT')
     671                 :          98 :    tread_q_sum=tread_q_sum+tread
     672         [ +  + ]:          98 :    if(tread==1)nshiftq=intarr(1)
     673                 :             : 
     674         [ -  + ]:          98 :    if (nshiftq<1 .or. nshiftq>MAX_NSHIFTK) then
     675                 :             :      write(msg,  '(a,i0,2a,i0,3a)' )&
     676                 :           0 :      'The only allowed values of nshiftq are between 1 and,',MAX_NSHIFTK,ch10,&
     677                 :           0 :      'while it is found to be',nshiftq,'.',ch10,&
     678                 :           0 :      'Action: change the value of nshiftq in your input file, or change qptopt.'
     679                 :           0 :      ABI_ERROR(msg)
     680                 :             :    end if
     681                 :             : 
     682                 :          98 :    shiftq=zero
     683                 :          98 :    call intagm(dprarr,intarr,jdtset,marr,3*nshiftq,string(1:lenstr),'shiftq',tread,'DPR')
     684                 :          98 :    tread_q_sum=tread_q_sum+tread
     685                 :             : 
     686         [ +  + ]:          98 :    if(tread==1)then
     687         [ +  + ]:         270 :      shiftq(:,1:nshiftq)=reshape( dprarr(1:3*nshiftq), (/3,nshiftq/) )
     688                 :             :    else
     689         [ -  + ]:           8 :      if(nshiftq/=1)then
     690                 :             :        write(msg,  '(3a,i0,2a)' )&
     691                 :           0 :        'When nshiftq is not equal to 1, shiftq must be defined in the input file.',ch10,&
     692                 :           0 :        'However, shiftq is not defined, while nshiftq=',nshiftq,ch10,&
     693                 :           0 :        'Action: change the value of nshiftq in your input file, or define shiftq.'
     694                 :           0 :        ABI_ERROR(msg)
     695                 :             :      end if
     696                 :             :    end if
     697                 :             : 
     698                 :             :    !write(std_out,'(a)')' m_inkpts%inqpt : before symlatt '
     699                 :             : 
     700                 :             :    ! Re-generate symmetry operations from the lattice and atomic coordinates
     701                 :             :    ! This is a fundamental difference with respect to the k point generation.
     702                 :          98 :    tolsym=tol8
     703   [ -  +  +  -  :         294 :    ABI_MALLOC(ptsymrel,(3,3,msym))
          +  -  +  -  -  
                +  -  + ]
     704   [ -  +  +  -  :         294 :    ABI_MALLOC(symafm_new,(msym))
          +  -  +  -  -  
                +  -  + ]
     705   [ -  +  +  -  :         196 :    ABI_MALLOC(symrel_new,(3,3,msym))
             -  +  -  + ]
     706   [ -  +  +  -  :         294 :    ABI_MALLOC(tnons_new,(3,msym))
          +  -  +  -  -  
                +  -  + ]
     707                 :          98 :    call symlatt(bravais,dev_null,msym,nptsym,ptsymrel,rprimd,tolsym)
     708                 :          98 :    use_inversion=1
     709                 :          98 :    call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
     710                 :             : 
     711                 :             :    !write(std_out,'(a)')' m_inkpts%inqpt : before symfind '
     712                 :             : 
     713                 :             :    call symfind(gprimd,msym,natom,nptsym,1,nsym_new,0,&
     714                 :          98 :     ptsymrel,spinat,symafm_new,symrel_new,tnons_new,tolsym,typat,use_inversion,xred)
     715                 :             : 
     716                 :             :    !write(std_out,'(a)')' m_inkpts%inqpt : after symfind '
     717                 :             : 
     718                 :             :    ! Prepare to compute the q-point grid in the ZB or IZB
     719                 :          98 :    iscf_fake=0 ! Do not need the weights
     720                 :             : 
     721                 :             :    ! Compute the maximum number of q points
     722                 :          98 :    nqpt_max=0
     723         [ -  + ]:          98 :    ABI_MALLOC(qpts,(3,nqpt_max))
     724         [ -  + ]:          98 :    ABI_MALLOC(wtq,(nqpt_max))
     725                 :             :    call getkgrid(chksymbreak,0,iscf_fake,qpts,qptopt,qptrlatt,qptrlen,&
     726                 :             :      msym,nqpt_max,nqpt_computed,nshiftq,nsym_new,rprimd,&
     727                 :          98 :      shiftq,symafm_new,symrel_new,vacuum,wtq)
     728                 :             : 
     729                 :          98 :    nqpt_max=nqpt_computed
     730         [ -  + ]:          98 :    ABI_FREE(qpts)
     731         [ -  + ]:          98 :    ABI_FREE(wtq)
     732                 :             : 
     733                 :             :    ! Find the index of the q point within the set of q points that will be generated
     734                 :          98 :    iqpt=0
     735                 :          98 :    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iqpt',tread,'INT')
     736                 :          98 :    tread_q_sum=tread_q_sum+tread
     737         [ +  - ]:          98 :    if(tread==1)iqpt=intarr(1)
     738                 :             : 
     739                 :             :    ! Checks that iqpt is among the computed q points
     740         [ -  + ]:          98 :    if(iqpt<0)then
     741                 :             :      write(msg, '(a,i0,3a)' )&
     742                 :           0 :       'The input variable iqpt,',iqpt,' is negative, while it should be 0 or positive.',ch10,&
     743                 :           0 :       'Action: correct iqpt in the input file.'
     744                 :           0 :      ABI_ERROR(msg)
     745                 :             :    end if
     746                 :             : 
     747         [ -  + ]:          98 :    if (iqpt > nqpt_computed) then
     748                 :             :      write(msg, '(a,i0,a,i0,7a)' )&
     749                 :           0 :       'The input variable iqpt:',iqpt,' is bigger than the computed number of q-points in the grid which is ',nqpt_max,'.',ch10,&
     750                 :           0 :       'The latter has been computed from the input variables qptrlatt, ngqpt, nshiftq,',ch10,&
     751                 :           0 :       'shiftq, as well as qptopt, the symmetries of the lattice, and spinat.',ch10,&
     752                 :           0 :       'Action: correct iqpt in the input file, or correct the computed q-point grid.'
     753                 :           0 :      ABI_ERROR(msg)
     754                 :             :    end if
     755                 :             : 
     756                 :             :    ! Compute the q-point grid in the BZ or the IBZ
     757   [ -  +  +  -  :         294 :    ABI_MALLOC(qpts,(3,nqpt_max))
          +  -  +  -  -  
                +  -  + ]
     758   [ -  +  +  -  :         294 :    ABI_MALLOC(wtq,(nqpt_max))
          +  -  +  -  -  
                +  -  + ]
     759                 :             : 
     760                 :             :    call getkgrid(chksymbreak,iout,iscf_fake,qpts,qptopt,qptrlatt,qptrlen,&
     761                 :             :     msym,nqpt_max,nqpt_computed,nshiftq,nsym_new,rprimd,&
     762                 :          98 :     shiftq,symafm_new,symrel_new,vacuum,wtq)
     763                 :             : 
     764                 :             :    ! Transfer to qptn, and deallocate
     765                 :          98 :    qptn(:)=zero
     766         [ +  - ]:          98 :    if(iqpt/=0)then
     767         [ +  + ]:         392 :      qptn(:)=qpts(:,iqpt)
     768                 :          98 :      wtqc = wtq(iqpt)
     769                 :             :    end if
     770                 :             : 
     771         [ -  + ]:          98 :    ABI_FREE(ptsymrel)
     772         [ -  + ]:          98 :    ABI_FREE(symafm_new)
     773         [ -  + ]:          98 :    ABI_FREE(symrel_new)
     774         [ -  + ]:          98 :    ABI_FREE(tnons_new)
     775         [ -  + ]:          98 :    ABI_FREE(qpts)
     776         [ -  + ]:         196 :    ABI_FREE(wtq)
     777                 :             : 
     778                 :             :  else
     779                 :             :    write(msg, '(3a,i0,3a)' ) &
     780                 :           0 :     'The only values of qptopt allowed are smaller than 4.',ch10,&
     781                 :           0 :     'The input value of qptopt is',qptopt,'.',ch10,&
     782                 :           0 :     'Action: change qptopt in your input file.'
     783                 :           0 :    ABI_ERROR(msg)
     784                 :             :  end if
     785                 :             : 
     786                 :             : ! See issue #31 on gitlab. Not really a good idea.
     787                 :             : !if(nqpt==0 .and. tread_q_sum/=0)then
     788                 :             : !  write(msg, '(5a)' ) &
     789                 :             : !   'When nqpt is zero, the following input variables cannot be defined :',ch10, &
     790                 :             : !   ' iqpt, ngqpt, nshiftq, qptopt, qpt, qptnrm, qptrlatt, shiftq, wtq . ',ch10, &
     791                 :             : !   'Action: change nqpt to 1, or un-define all the variables above.'
     792                 :             : !  ABI_ERROR(msg)
     793                 :             : !endif
     794                 :             : 
     795         [ -  + ]:         714 :  ABI_FREE(intarr)
     796         [ -  + ]:         714 :  ABI_FREE(dprarr)
     797                 :             : 
     798                 :         714 : end subroutine inqpt
     799                 :             : !!***
     800                 :             : 
     801                 :             : end module m_inkpts
     802                 :             : !!***
        

Generated by: LCOV version 2.3-1