C> \ingroup nwint
C> @{
C>
C> \brief Compute 1-electron Gaussian periodic kinetic energy
C> integral derivatives
C>
C> See [1] for details.
C>
C> [1] JE Jaffe, AC Hess,
C> "Gaussian basis density functional theory for systems
C> periodic in two or three dimensions: Energy and forces",
C> J.Chem.Phys. 105, 10983-10998 (1996), DOI:
C>
C> 10.1063/1.472866
C>
subroutine intpd_1eke(i_basis,ish,j_basis,jsh,R,lscr,scr,
& lKea,Kea,idatom)
*
* $Id$
*
implicit none
#include "stdio.fh"
#include "errquit.fh"
#include "nwc_const.fh"
#include "basP.fh"
#include "basdeclsP.fh"
#include "geomP.fh"
#include "geobasmapP.fh"
#include "mafdecls.fh"
#include "bas_exndcf_dec.fh"
#include "bas_ibs_dec.fh"
#include "int_nbf.fh"
c::external subroutines used
c... errquit
c::functions
logical cando_nw_1e
logical cando_nw
logical int_chk_init
logical int_chk_sh
external int_chk_init
external int_chk_sh
external cando_nw_1e
external cando_nw
integer int_nint_cart
external int_nint_cart
c::passed
integer i_basis !< [Input] basis set handle for ish functions
integer j_basis !< [Input] basis set handle for jsh functions
integer ish !< [Input] lexical contraction/shell index
integer jsh !< [Input] lexical contraction/shell index
integer lscr !< [Input] length of the scratch array
integer lKea !< [Input] length of the integral array
double precision Kea(lKea) !< [Output] kinetic energy integral array
double precision scr(lscr) !< [Scratch] scratch array
double precision R(3) !< [Input] translational vector fractional coordinates
integer idatom(*) !< [Output] array identifying centers for derivatives
!< e.g.,
!< - the first nint*3 derivatives go to center idatom(1)
!< - the second nint*3 derivatives go to center idatom(2)
c::local
logical shells_ok
integer i_geom, j_geom, ibas, jbas, ucont, mynint
integer Li, i_prim, i_gen, i_iexp, i_icfp, i_cent
integer Lj, j_prim, j_gen, j_iexp, j_icfp, j_cent
double precision xyz_new(3) ! new coordinates for jsh function center
*rak: integer jjj
c
logical inline_chk_sh
integer WarnP
save WarnP
data WarnP /0/
c
#include "bas_exndcf_sfn.fh"
#include "bas_ibs_sfn.fh"
c... statement function for int_chk_sh
inline_chk_sh(ibas,ish) =
$ ((ish.gt.0) .and. (ish.le.ncont_tot_gb(ibas)))
c
c check initialization and shells
c
if (.not.int_chk_init('intpd_1eke'))
& call errquit('intpd_1eke: int_init was not called' ,0,
& INT_ERR)
c
ibas = i_basis + BASIS_HANDLE_OFFSET
jbas = j_basis + BASIS_HANDLE_OFFSET
c
shells_ok = inline_chk_sh(ibas,ish)
shells_ok = shells_ok .and. inline_chk_sh(jbas,jsh)
if (.not.shells_ok)
& call errquit('intpd_1eke: invalid contraction/shell',0,
& BASIS_ERR)
c
ucont = (sf_ibs_cn2ucn(ish,ibas))
Li = infbs_cont(CONT_TYPE ,ucont,ibas)
i_prim = infbs_cont(CONT_NPRIM,ucont,ibas)
i_gen = infbs_cont(CONT_NGEN ,ucont,ibas)
i_iexp = infbs_cont(CONT_IEXP ,ucont,ibas)
i_icfp = infbs_cont(CONT_ICFP ,ucont,ibas)
i_cent = (sf_ibs_cn2ce(ish,ibas))
i_geom = ibs_geom(ibas)
c
ucont = (sf_ibs_cn2ucn(jsh,jbas))
Lj = infbs_cont(CONT_TYPE ,ucont,jbas)
j_prim = infbs_cont(CONT_NPRIM,ucont,jbas)
j_gen = infbs_cont(CONT_NGEN ,ucont,jbas)
j_iexp = infbs_cont(CONT_IEXP ,ucont,jbas)
j_icfp = infbs_cont(CONT_ICFP ,ucont,jbas)
j_cent = (sf_ibs_cn2ce(jsh,jbas))
j_geom = ibs_geom(jbas)
c
mynint = int_nint_cart(i_basis,ish,j_basis,jsh,0,0,0,0)
if (i_cent.eq.j_cent) then
* write(luout,*)' automatic zero '
call ifill(2,0,idatom,1)
call dcopy((mynint*3*2),0.0d00,0,Kea,1)
return
endif
idatom(1) = i_cent
idatom(2) = j_cent
c
if (i_geom.ne.j_geom.and.WarnP.eq.0) then
write(luout,*)
& 'intpd_1eke: WARNING: possible geometry inconsistency'
write(luout,*)'i_basis geometry handle:',i_geom
write(luout,*)'j_basis geometry handle:',j_geom
WarnP = 1
endif
c
c.. translate coordinates based on R
call intp_txyz(j_cent,j_geom,R,xyz_new)
c
if (cando_nw(i_basis,ish,0).and.cando_nw(j_basis,jsh,0)) then
call hf1d(
& coords(1,i_cent,i_geom),dbl_mb(mb_exndcf(i_iexp,ibas)),
& dbl_mb(mb_exndcf(i_icfp,ibas)), i_prim, i_gen, Li, i_cent,
& xyz_new,dbl_mb(mb_exndcf(j_iexp,jbas)),
& dbl_mb(mb_exndcf(j_icfp,jbas)), j_prim, j_gen, Lj, j_cent,
& coords(1,1,i_geom),charge(1,i_geom),
& geom_invnucexp(1,i_geom),ncenter(i_geom),
c.............................. doS doT doV canonical
& scr,Kea,scr,mynint,.false.,.true.,.false.,.false.,
c........... dryrun
& .false.,scr,lscr)
if (bas_spherical(ibas).or.bas_spherical(jbas)) then
if (Li.eq.-1) i_gen = 1
if (Lj.eq.-1) j_gen = 1
call spcart_2cBtran(Kea,scr,lscr,
& int_nbf_x(Li),int_nbf_s(Li),Li,i_gen,bas_spherical(ibas),
& int_nbf_x(Lj),int_nbf_s(Lj),Lj,j_gen,bas_spherical(jbas),
& (3*2),.false.)
endif
else
call errquit('intpd_1eke: could not do sp or nw integrals',0,
& INT_ERR)
endif
c
end
C> @}