LCOV - code coverage report
Current view: top level - src/62_poisson - m_cutoff_slab.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 33 0
Test Date: 2026-11-12 14:41:44 Functions: 0.0 % 1 0
Branches: 0.0 % 47 0

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_vcoul/m_cutoff_slab
       2                 :             : !! NAME
       3                 :             : !!  m_cutoff_slab
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!
       7                 :             : !! SOURCE
       8                 :             : 
       9                 :             : #if defined HAVE_CONFIG_H
      10                 :             : #include "config.h"
      11                 :             : #endif
      12                 :             : 
      13                 :             : #include "abi_common.h"
      14                 :             : 
      15                 :             : module m_cutoff_slab
      16                 :             : 
      17                 :             :  use defs_basis
      18                 :             :  use m_abicore
      19                 :             :  use m_errors
      20                 :             : 
      21                 :             :  use m_fstrings, only : sjoin, itoa
      22                 :             : 
      23                 :             :  implicit none
      24                 :             : 
      25                 :             :  private
      26                 :             : !!***
      27                 :             : 
      28                 :             :  public :: cutoff_slab
      29                 :             : 
      30                 :             :  !integer,public,parameter :: SURFACE_BEIGI = 1
      31                 :             :  !integer,public,parameter :: SURFACE_ROZZI = 2
      32                 :             : 
      33                 :             : CONTAINS  !========================================================================================
      34                 :             : !!***
      35                 :             : 
      36                 :             : !----------------------------------------------------------------------
      37                 :             : 
      38                 :             : !!****f* m_vcoul/cutoff_slab
      39                 :             : !! NAME
      40                 :             : !! cutoff_slab
      41                 :             : !!
      42                 :             : !! FUNCTION
      43                 :             : !!  Calculate the Fourier components of an effective Coulomb interaction
      44                 :             : !!  within a slab of thickness 2*rcut which is symmetric with respect to the xy plane.
      45                 :             : !!  In this implementation rcut=L_z/2 where L_z is the periodicity along z
      46                 :             : !!
      47                 :             : !! INPUTS
      48                 :             : !!  qpt(3)=q-point
      49                 :             : !!  ng=Number of G vectors.
      50                 :             : !!  gvec(3,ng)=G vectors in reduced coordinates.
      51                 :             : !!  gprimd(3,3)=Dimensional primitive translations in reciprocal space ($\textrm{bohr}^{-1}$).
      52                 :             : !!  gmet(3,3)=Metric in reciprocal space.
      53                 :             : !!
      54                 :             : !! OUTPUT
      55                 :             : !!  vc_cut(ng)=Fourier components of the effective Coulomb interaction.
      56                 :             : !!
      57                 :             : !! NOTES
      58                 :             : !!  The Fourier expression for an interaction truncated along the z-direction (i.e non-zero only if |z|<R) is:
      59                 :             : !!
      60                 :             : !!  vc(q.G) = 4pi/|q+G|^2 * [ 1 + e^{-((q+G)_xy)*R} * ( (q_z+G_z)/(q+G)_xy * sin((q_z+G_z)R) -
      61                 :             : !!   - cos((q_z+G_Z)R)) ]  (1)
      62                 :             : !!
      63                 :             : !!  Equation (1) diverges when q_xy+G_xy --> 0 for any non zero q_z+G_z
      64                 :             : !!  However if we choose R=L/2, where L defines the periodicity along z,
      65                 :             : !!  and we limit ourselves to consider q-points with q_z==0, then sin((q_z+G_z)R)=sin(G_Z 2pi/L)=0 for every G.
      66                 :             : !!  Under these assumptions we obtain
      67                 :             : !!
      68                 :             : !!  v(q,G) = 4pi/|q+G|^2 [1-e^{-(q+G)_xy*L/2}\cos((q_z+G_z)R)]
      69                 :             : !!
      70                 :             : !!  which is always finite when G_z /=0 while it diverges as 4piR/(q+G)_xy as (q+G)_xy -->0
      71                 :             : !!  but only in the x-y plane.
      72                 :             : !!
      73                 :             : !! SOURCE
      74                 :             : 
      75                 :           0 : subroutine cutoff_slab(qpt, ng, gvec, gprimd, rcut, boxcenter, pdir, alpha, vc_cut, method)
      76                 :             : 
      77                 :             : !Arguments ------------------------------------
      78                 :             : !scalars
      79                 :             :  integer,intent(in) :: method,ng
      80                 :             :  real(dp),intent(in) :: rcut
      81                 :             : !arrays
      82                 :             :  integer,intent(in) :: gvec(3,ng),pdir(3)
      83                 :             :  real(dp),intent(in) :: alpha(3),boxcenter(3),gprimd(3,3),qpt(3)
      84                 :             :  real(dp),intent(out) :: vc_cut(ng)
      85                 :             : 
      86                 :             : !Local variables-------------------------------
      87                 :             : !scalars
      88                 :             :  integer :: ig,igs
      89                 :             :  real(dp),parameter :: SMALL=tol4  !@WC: was tol6
      90                 :             :  real(dp) :: qpg2,qpg_para,qpg_perp
      91                 :             :  character(len=500) :: msg
      92                 :             : !arrays
      93                 :             :  real(dp) :: b1(3),b2(3),b3(3),gcart(3),qc(3),qpg(3)
      94                 :             : 
      95                 :             : ! *************************************************************************
      96                 :             : 
      97                 :             :  ABI_UNUSED(pdir)
      98                 :             :  ABI_UNUSED(boxcenter)
      99                 :             : 
     100                 :             :  ! From reduced to cartesian coordinates.
     101         [ #  # ]:           0 :  b1(:)=two_pi*gprimd(:,1)
     102         [ #  # ]:           0 :  b2(:)=two_pi*gprimd(:,2)
     103         [ #  # ]:           0 :  b3(:)=two_pi*gprimd(:,3)
     104                 :             : 
     105         [ #  # ]:           0 :  qc = b1*qpt(1) + b2*qpt(2) + b3*qpt(3)
     106                 :             : 
     107                 :             :  ! Different approaches according to method
     108         [ #  # ]:           0 :  vc_cut = zero
     109                 :             : 
     110                 :           0 :  select case (method)
     111                 :             : 
     112                 :             :  case (1)
     113                 :             :    ! Beigi's expression.
     114                 :             :    ! q-points with non-zero component along the z-axis are not allowed if
     115                 :             :    ! the simplified Eq.1 for the Coulomb interaction is used.
     116   [ #  #  #  #  :           0 :    if (ANY(ABS(qc) > SMALL)) then
                   #  # ]
     117                 :           0 :      write(std_out,*)qc
     118                 :             :      write(msg,'(5a)')&
     119                 :           0 :       'Found q-points with non-zero component along non-periodic direction ',ch10,&
     120                 :           0 :       'This is not allowed, see Notes in cutoff_slab.F90 ',ch10,&
     121                 :           0 :       'ACTION: Modify the q-point sampling '
     122                 :           0 :      ABI_ERROR(msg)
     123                 :             :    end if
     124                 :             : 
     125                 :             :    ! Calculate truncated Coulomb interaction for a infinite surface
     126                 :             :    ! supposing input q-points are different from zero.
     127   [ #  #  #  #  :           0 :    igs=1; if (NORM2(qc)<tol16) igs=2 ! avoid (q=0, G=0)
             #  #  #  # ]
     128         [ #  # ]:           0 :    do ig=igs,ng
     129         [ #  # ]:           0 :      gcart(:) = b1(:)*gvec(1,ig)+b2(:)*gvec(2,ig)+b3(:)*gvec(3,ig)
     130         [ #  # ]:           0 :      qpg(:) = qc(:) + gcart(:)
     131         [ #  # ]:           0 :      qpg2  = DOT_PRODUCT(qpg(:),qpg(:))
     132                 :           0 :      qpg_para = SQRT(qpg(1)**2+qpg(2)**2) ; qpg_perp=qpg(3)
     133                 :           0 :      vc_cut(ig) = four_pi/qpg2*(one-EXP(-qpg_para*rcut)*COS(qpg_perp*rcut))
     134                 :             :    end do
     135                 :             : 
     136                 :             :  case (2)
     137                 :             :    ! Rozzi's method
     138                 :           0 :    ABI_ERROR("Work in progress")
     139                 :             :    ABI_UNUSED(alpha) ! just to keep alpha as an argument
     140                 :             :    !alpha=?? ; ap1sqrt=SQRT(one+alpha**2)
     141         [ #  # ]:           0 :    do ig=1,ng
     142         [ #  # ]:           0 :      gcart(:) = b1(:)*gvec(1,ig)+b2(:)*gvec(2,ig)+b3(:)*gvec(3,ig)
     143         [ #  # ]:           0 :      qpg(:) = qc(:) + gcart(:)
     144         [ #  # ]:           0 :      qpg2  =DOT_PRODUCT(qpg(:),qpg(:))
     145                 :           0 :      qpg_para=SQRT(qpg(1)**2+qpg(2)**2) ; qpg_perp =qpg(3)
     146         [ #  # ]:           0 :      if (qpg_para>SMALL) then
     147                 :           0 :       vc_cut(ig)=four_pi/qpg2*(one+EXP(-qpg_para*rcut)*(qpg_perp/qpg_para*SIN(qpg_perp*rcut)-COS(qpg_perp*rcut)))
     148                 :             :      else
     149         [ #  # ]:           0 :        if (ABS(qpg_perp)>SMALL) then
     150                 :           0 :          vc_cut(ig)=four_pi/qpg_perp**2*(one-COS(qpg_perp*rcut)-qpg_perp*rcut*SIN(qpg_perp*rcut)) ! &
     151                 :             :          ! contribution due to finite slab
     152                 :             :          ! + 8*rcut*SIN(qpg_perp*rcut)/qpg_perp*LOG((alpha+ap1sqrt)*(one+ap1sqrt)/alpha)
     153                 :             :        else
     154                 :           0 :          vc_cut(ig)=-two_pi*rcut**2
     155                 :             :        end if
     156                 :             :      end if
     157                 :             :    end do !ig
     158                 :             : 
     159                 :             :  case default
     160      [ #  #  # ]:           0 :    ABI_BUG(sjoin('Wrong value for method:', itoa(method)))
     161                 :             :  end select
     162                 :             : 
     163                 :           0 : end subroutine cutoff_slab
     164                 :             : !!***
     165                 :             : 
     166                 :             : end module m_cutoff_slab
     167                 :             : !!***
        

Generated by: LCOV version 2.3-1