C -*- Fortran -*- C C DELCD Debug C DELCR compare with Dalton integrals C DELCX all integrals via the 4-index transformation C C integral generator - no symmetry, kinetic, Hamilton and C bi-electronic integrals C C..FILE 'common_syst.h' C C..FILE 'common_flow.h' C..FILE 'constants.h' C C..FILE 'common_spheri.h' C C..FILE 'common_locat.h' C C..FILE 'common_polyta.h' C C..FILE 'common_tabaux.h' C C..FILE 'common_integ.h' C..FILE 'dimens_intu.h' C C $Log: intcal.r,v $ C Revision 1.31 2011/03/18 15:32:41 edrisse C Include option for penetration integrals PEN_INT, C as bielectronic integrals (aa|aa) and (aa|bb) C C Revision 1.30 2011/03/13 21:19:11 reinh C DIPY in the dipole integrals corrected (was already corrected but not C included in the sources) C C Revision 1.29 2011/03/13 00:15:35 reinh C Cartesian bielectronic integrals in the same order as C in Dalton C C Revision 1.28 2011/01/31 01:10:17 reinh C Some corrections in the cartesian part, which should not affect the calculations in solid harmonics. C C Revision 1.27 2009/03/17 22:40:49 reinh C Option LKINET added for having only kinetic-energy integrals C C Revision 1.26 2008/10/06 19:43:21 reinh C spherical harmonics for g-functions added C C Revision 1.25 2008/04/30 11:40:45 reinh C reprogrammed completely the Gamma function C C Revision 1.24 2008/04/29 23:52:50 reinh C now we are at the same position as with the CRYSTAL Gamma function C C Revision 1.23 2008/04/29 23:29:03 reinh C nearly finished, the replacement of BUXTAB/GAMF88 C C Revision 1.22 2008/04/29 18:06:55 reinh C own Gamma table routine C C Revision 1.21 2008/04/28 18:02:30 reinh C Do not touch BUXTAB ! C C Revision 1.20 2008/04/17 14:23:35 reinh C Added dipole integrals C C Revision 1.19 2008/04/16 13:28:07 reinh C more polite error message C C Revision 1.18 2008/04/16 13:25:54 reinh C no f functions calculatable C C Revision 1.17 2008/04/16 13:04:23 reinh C litte y removed C C Revision 1.16 2008/04/16 13:01:24 reinh C The working version, finally !! C C Revision 1.15 2008/04/15 19:32:39 reinh C Add Hamilton and kinetic to write to HAMILTO C C Revision 1.14 2008/04/15 19:19:56 reinh C This sould be the final version, still puzling about the f C C Revision 1.13 2008/04/14 21:30:13 reinh C seems working, only problems for the (f0 f0 | f3 f3) integrals C C Revision 1.12 2008/04/14 08:45:44 reinh C working for (ss|ss), (ss|cd) and (ab|ss) C C Revision 1.11 2008/04/11 16:27:33 reinh C only one :log C C Revision 1.10 2008/04/11 16:26:35 reinh C Still at (ss|ss), but closer to the goal C C Revision 1.9 2008/04/11 00:33:21 reinh C works still for s only C C C $Id: intcal.r,v 1.31 2011/03/18 15:32:41 edrisse Exp $ C PROGRAM INTCAL C INCLUDE 'param.h' COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),POS(3,NATMX),NZ(NATMX) $ ,NSH(NATMX),NPRIM(NSHLMX),IL(NSHLMX),NZENTR(NSHLMX) $ ,NPST(NSHLMX),NSHLT,LMAX C.. INCLUDE 'common_syst.h' COMMON /FLOW/ THRESH,MULINT,LFORM,LMONO,LBIEL,LCART,LKINET LOGICAL LFORM,LMONO,LBIEL,LCART,LKINET C.. INCLUDE 'common_flow.h' C integrals in hermitian Gaussians COMMON /INTEGH/ R000(LHMAX) C.. INCLUDE 'common_integ.h' COMMON /LOCAT/ EXA,EXB,EXC,EXD,XA(3),XB(3),XAB(3),XC(3),XD(3) $ ,XCD(3),P,Q,ALPHA,XP(3),XQ(3),F(4*NLMAX+1),LA,LB,LC,LD $ ,NPRIMA,NPRIMB,NPRIMC,NPRIMD,NPSTA,NPSTB,NPSTC,NPSTD C.. INCLUDE 'common_locat.h' COMMON /SPHERI/ SPHCAR(0:NLMAX,NCMAX,NSPMAX),NCART(0:NLMAX) $ ,CARMUL(0:NLMAX,(NLMAX+1)*(NLMAX+2)/2) C.. INCLUDE 'common_spheri.h' COMMON /CONST/ PI,ANTOAU,TP25,ONE C.. INCLUDE 'constants.h' C CHARACTER*8 PNAME LOGICAL LREAD,LN8,LN5 CHARACTER*3 CLSTRG(0:NLMAX-1,NLMAX+NLMAX+1),CBSTR(NBASM) CHARACTER*1 CSTYP(0:5) DATA CSTYP /'S','P','D','F','G','H'/ INCLUDE 'compiler_stamp' X=CPTIME(3) PNAME='INTCAL ' CALL DATING(PNAME,1) WRITE(6,*) WRITE(6,*) ' I N T C A L ' WRITE(6,*) ' integral generator ' WRITE(6,*) ' molecular case ' WRITE(6,*) ' P.Reinhardt, Paris 6/2002, 4/2008 ' WRITE(6,*) WRITE(6,*) C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C ORTHO - programs for ab-initio calculations in localized orbitals C Copyright (C) 2008 Peter Reinhardt (Univ. Paris VI, France) C C This program is free software: you can redistribute it and/or modify C it under the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. C C This program is distributed in the hope that it will be useful, C but WITHOUT ANY WARRANTY; without even the implied warranty of C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License C along with this program. If not, see . C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C CLSTRG(0,1)='S ' CLSTRG(1,1)='PX ' CLSTRG(1,2)='PY ' CLSTRG(1,3)='PZ ' CLSTRG(2,1)='D-2' CLSTRG(2,2)='D-1' CLSTRG(2,3)='D 0' CLSTRG(2,4)='D 1' CLSTRG(2,5)='D 2' CLSTRG(3,1)='F-3' CLSTRG(3,2)='F-2' CLSTRG(3,3)='F-1' CLSTRG(3,4)='F 0' CLSTRG(3,5)='F 1' CLSTRG(3,6)='F 2' CLSTRG(3,7)='F 3' CLSTRG(4,1)='G-4' CLSTRG(4,2)='G-3' CLSTRG(4,3)='G-2' CLSTRG(4,4)='G-1' CLSTRG(4,5)='G 0' CLSTRG(4,6)='G 1' CLSTRG(4,7)='G 2' CLSTRG(4,8)='G 3' CLSTRG(4,9)='G 4' C C numerical value - worse for comparison with Dalton c$$$ PI=3.141592653589793238D0 c$$$ TP25=34.98683665524972567962 PI=2.D0*ACOS(0.D0) TP25=2.D0*(PI**2.5D0) ONE=1.D0 C CALL RDINP C C reading options C WRITE(6,*) WRITE(6,*) ' INTEGRAL THRESHOLD IS ',THRESH WRITE(6,*) IF (LFORM) THEN WRITE(6,*) ' BIELECTRONIC INTEGRALS ARE WRITTEN FORMATTED ' ELSE WRITE(6,*) ' BIELECTRONIC INTEGRALS ARE WRITTEN UNFORMATTED ' END IF WRITE(6,*) IF (LKINET) THEN WRITE(6,*) ' Calculating only kinetic-energy integrals ' LMONO=.FALSE. LBIEL=.FALSE. END IF C IF (LMONO) THEN WRITE(6,*) ' OVERLAP and KINETIC ENERGY INTEGRALS' WRITE(6,*) ' ELECTRON-NUCLEUS INTERACTION INTEGRALS ' END IF IF (LBIEL) THEN WRITE(6,*) ' ELECTRON-ELECTRON REPULSION INTEGRALS ' END IF IF (LCART) THEN WRITE(6,*) ' INTEGRALS ARE OVER CARTESIAN FUNCTIONS (6D, 10F) ' ELSE WRITE(6,*) ' INTEGRALS ARE OVER SPHERICAL HARMONICS (5D, 7F) ' END IF C C ---------------------------------------------------------------- C IWFILE=22 IUNITR=26 ANTOAU=0.529177247D0 PI=2.D0*ACOS(0.0D0) C C read information on system C OPEN(UNIT=IUNITR,FILE='SYSTEM.ORTHO',STATUS='OLD', - FORM='FORMATTED',ERR=901) READ(IUNITR,*) NATOM WRITE(6,*) NSHLT=0 NBAS=1 LMAX=0 NST=1 ISHL=0 DO IAT=1,NATOM C atomic positions are in a.u. READ(IUNITR,*) NUCKEL,NSHLAT,(POS(J,IAT),J=1,3) NZ(IAT)=NUCKEL NSH(IAT)=NSHLAT NSHLT=NSHLT+NSHLAT 9931 FORMAT(' Atom No ',I3,' at ',3F20.12,/,' Nuclear charge ',I3 $ ,' No of shells ',I5) WRITE(6,9931) IAT,(POS(J,IAT),J=1,3),NUCKEL,NSHLAT DO ISH=1,NSHLAT ISHL=ISHL+1 NZENTR(ISHL)=IAT NPST(ISHL)=NST READ(IUNITR,*) ITYPE,NPRIMM 9932 FORMAT(' Shell No ',I3,' of type ',A1,' with ',I4,' primiti $ves ') C folded 1 (fixf $Revision: 1.3 $) WRITE(6,9932) ISH,CSTYP(ITYPE),NPRIMM IL(ISHL)=ITYPE NPRIM(ISHL)=NPRIMM LMAX=MAX(LMAX,ITYPE) IF (LCART) THEN NBAS=NBAS+(ITYPE+1)*(ITYPE+2)/2 ELSE DO I=1,ITYPE+ITYPE+1 CBSTR(NBAS)=CLSTRG(ITYPE,I) NBAS=NBAS+1 END DO END IF DO III=1,NPRIMM READ(IUNITR,*) EXX(NST),COEFF(NST) NST=NST+1 END DO END DO END DO NST=NST-1 NBAS=NBAS-1 CLOSE(IUNITR) C C write information C WRITE(6,*) CD WRITE(6,*) ' atomic information ' CD DO I=1,NATOM CD WRITE(6,9901) I,NSH(I),NZ(I),(POS(J,I),J=1,3) 9901 FORMAT(' ATOM ',I4,': NSH ',I4,' NZ ',I4,' at (a.u.) ',3F20.12) CD END DO CD WRITE(6,*) CD WRITE(6,*) ' information per shell' CD DO I=1,NSHLT CD WRITE(6,9902) I,NPRIM(I),IL(I),NZENTR(I),NPST(I) 9902 FORMAT(' SHELL ',I4,' NPRIM',I4,' L',I2,' NZENTR',I4 $ ,' NPST ',I4) CD END DO CD WRITE(6,*) CD WRITE(6,*) ' information per primitive' CD DO I=1,NST CD WRITE(6,9903) I,EXX(I),COEFF(I) 9903 FORMAT(' primitive ',I4,' EXPONENT ',G20.12,' COEFF ',G20.12) CD END DO C WRITE(6,*) WRITE(6,*) ' READ INFORMATION ON SYSTEM ' WRITE(6,9946) NATOM,NATMX,NSHLT,NSHLMX,NBAS,NBASM,LMAX,NLMAX 9946 FORMAT(' ACTUAL MAXIMUM ',/, - ' NATOMS ',2I8,/, - ' NSHLT ',2I8,/, - ' NBAS ',2I8,/, - ' LMAX ',2I8) IF (NBAS.GT.NBASM) THEN WRITE(6,*) ' NBAS (',NBAS,' ) > NBASM (',NBASM,' )' STOP 'INCREASE NBASM' END IF IF (NSHLT.GT.NSHLMX) THEN WRITE(6,*) ' NSHLT (',NSHLT,' ) > NSHLMX (',NSHLMX,' )' STOP 'INCREASE NSHLMX' END IF c$$$ IF (LMAX.GT.2) THEN c$$$ WRITE(6,*) c$$$ WRITE(6,*) ' we cannot calculate with f functions or beynd ' c$$$ WRITE(6,*) ' ... there is still an error for ' c$$$ $ ,'the integrals (f0 f0 | f3 f3) ' c$$$ WRITE(6,*) c$$$ WRITE(6,*) ' and g-functions are not yet implemented ' c$$$ WRITE(6,*) c$$$ STOP ' sorry ' c$$$ END IF C C information on basis sets C c$$$ IF (.NOT.LCART) THEN c$$$ WRITE(6,*) c$$$ IBAS=0 c$$$ ISHL=0 c$$$ DO IAT=1,NATOM c$$$ DO IISHL=1,NSH(IAT) c$$$ ISHL=ISHL+1 c$$$ L=IL(ISHL) c$$$ DO I=1,L+L+1 c$$$ IBAS=IBAS+1 c$$$ WRITE(6,9226) IBAS,CBSTR(IBAS),NZENTR(ISHL) c$$$ END DO c$$$ END DO c$$$ END DO c$$$ END IF 9226 FORMAT(' AO No ',I5,' (',A3,') is on atom ',I4) WRITE(6,*) C C prepare tables for the recursions WRITE(6,*) WRITE(6,*) ' PREPARING TABLES ' CALL PREPA C C normalizing all primitives C we suppose that contractions ARE already normalized to 1 C WRITE(6,*) ' NORMALIZING PRIMITIVES ' WRITE(6,*) DO ISHLA=1,NSHLT LA=IL(ISHLA) C the number and start address for the primitives NPRIMA=NPRIM(ISHLA) NPSTA =NPST (ISHLA) IF (NPRIMA.EQ.1) THEN EXA=EXX(NPSTA) CALL NORM_PRIM(EXA,LA,XNORM) COEFF(NPSTA)=XNORM ELSE DO IIA=1,NPRIMA IA=NPSTA+IIA-1 EXA=EXX(IA) CALL NORM_PRIM(EXA,LA,XNORM) COEFF(IA)=COEFF(IA)*XNORM END DO END IF END DO CALL TIMING('PREP') IF (LMONO.OR.LKINET) THEN CALL MONINT CALL TIMING('ONE ') END IF IF (LBIEL) THEN CALL TWOINT CALL TIMING('TWO ') END IF C that were the mono-electronic integrals, now the bi-electronic ones X=CPTIME(4) CALL DATING(PNAME,2) STOP 901 CONTINUE WRITE(6,*) ' NO FILE FOUND, PLEASE PROVIDE ' STOP 902 CONTINUE WRITE(6,*) ' NO FILE FOUND, PLEASE PROVIDE ' STOP 903 CONTINUE WRITE(6,*) ' NO FILE FOUND, PLEASE PROVIDE ' STOP C END C SUBROUTINE RDINP INCLUDE 'param.h' COMMON /FLOW/ THRESH,MULINT,LFORM,LMONO,LBIEL,LCART,LKINET LOGICAL LFORM,LMONO,LBIEL,LCART,LKINET C.. INCLUDE 'common_flow.h' CHARACTER*4 KEYW(2),STR3 CHARACTER*6 KEYOPT(10),STR6 CHARACTER*80 LINE DATA KEYW /'*INT','*END'/ DATA KEYOPT /'NOMONO','THRESH','FORMAT','NOBIEL','CARTES', - 'MULINT','KINONL','XXXXXX','XXXXXX','XXXXXX'/ C C DEFAULTS THRESH=1.D-12 LFORM=.FALSE. LMONO=.TRUE. LBIEL=.TRUE. LCART=.FALSE. LKINET=.FALSE. C IOINP=83 OPEN(UNIT=IOINP,FILE='INPUT.INT',ERR=2217,FORM='FORMATTED', - STATUS='OLD') C first, look for keyword '*INT' 1 CONTINUE READ(IOINP,'(A4)',END=22,ERR=921) STR3 IF (STR3.EQ.KEYW(1)) THEN 11 CONTINUE READ(IOINP,'(A6)',END=23,ERR=921) STR6 C WRITE(6,*) ' READ STRING: |',STR6,'|' C keyword *END IF (STR6(1:4).EQ.KEYW(2)) GO TO 2 IF (STR6.EQ.KEYOPT(1)) THEN LMONO=.FALSE. ELSE IF (STR6.EQ.KEYOPT(2)) THEN READ(IOINP,*) THRESH ELSE IF (STR6.EQ.KEYOPT(3)) THEN LFORM=.TRUE. ELSE IF (STR6.EQ.KEYOPT(4)) THEN LBIEL=.FALSE. ELSE IF (STR6.EQ.KEYOPT(5)) THEN LCART=.TRUE. ELSE IF (STR6.EQ.KEYOPT(6)) THEN READ(IOINP,*) MULINT WRITE(6,*) ' option MULINT without action, beyond ' - ,'dipole not yet implemented ' ELSE IF (STR6.EQ.KEYOPT(7)) THEN LKINET=.TRUE. ELSE WRITE(6,*) ' POSSIBLE OPTIONS IN THE BLOCK *INT ... *END ARE:' WRITE(6,*) WRITE(6,*) ' ',KEYOPT(1) WRITE(6,*) ' ',KEYOPT(2) WRITE(6,*) ' ',KEYOPT(3) WRITE(6,*) ' ',KEYOPT(4) WRITE(6,*) ' ',KEYOPT(5) WRITE(6,*) ' ',KEYOPT(6) WRITE(6,*) ' ',KEYOPT(7) STOP ' CHOOSE CORRECT OPTION ' END IF GO TO 11 END IF GO TO 1 2 CONTINUE CLOSE(IOINP) RETURN 921 CONTINUE CLOSE(IOINP) STOP ' ERROR IN INPUT' 23 CONTINUE CLOSE(IOINP) WRITE(6,*) ' YOU SHOULD TERMINATE THE BLOCK <*INT> BY <*END> ' RETURN 22 CONTINUE WRITE(6,*) ' NO KEYWORD <*INT>, USING THE DEFAULT VALUES' RETURN 2217 CONTINUE WRITE(6,*) ' NO FILE , USING THE DEFAULT VALUES' RETURN END C SUBROUTINE NORM_PRIM(EXPON,LVAL,FACNOR) INCLUDE 'param.h' COMMON /CONST/ PI,ANTOAU,TP25,ONE C.. INCLUDE 'constants.h' COMMON /POLYTA/ FAC(NLMAX+NLMAX+2),FACC(NLMAX+1) C.. INCLUDE 'common_polyta.h' C C here we normalize a primitive Gaussian function C C sqrt[ C l-dependent: C 2^l*(2a)^(l+3/2)/(pi^3/2 (2l-1)!!) C m-dependent: (not used here) C [(l-|m|)!/(l+|m|)!] * (2-delta_m0) C ] C XVAL=DBLE(LVAL) PIF=FACC(LVAL+1)*(PI**1.5D0) CD WRITE(6,*) ' FACC, PI ',FACC(LVAL+1),PI PIF=(2.D0**XVAL)/PIF CCC=(2.D0*EXPON)**(XVAL+1.5D0) FACNOR=SQRT(PIF*CCC) CD WRITE(6,*) ' NORM_PRIM: L,EXPON,FACNOR ',LVAL,EXPON,FACNOR RETURN END C SUBROUTINE RMCMUR(R000,F,RPC,NMAX) INCLUDE 'param.h' DIMENSION RPC(3),F(NMAX+1),R000(*) DIMENSION RU(2,0:12),RV(2,0:12),RT(2,0:12) C C nmax = l_a + l_b ; also von 0 .. 8 ; l_max=4 C C in this routine we perform the recursion C from R(000;klm) to R(tuv;000) C C the result is communicated via the common block /INTEG/ C NUMHER is the number of hermitian integrals produced C C no need for recursion for IF (NMAX.EQ.0) THEN R000(1)=F(1) RETURN END IF INDX=0 IIT=1 IIU=1 IIV=1 IIT2=2 IIU2=2 IIV2=2 XPC=RPC(1) YPC=RPC(2) ZPC=RPC(3) DO 2 I=0,NMAX RR=F(I+1) RT(1,I)=RR RT(2,I)=0.D0 RU(1,I)=RR RU(2,I)=0.D0 RV(1,I)=RR RV(2,I)=0.D0 CD WRITE (6,*) 'I, RV(1,I) = F(I+1) ', I,RV(1,I) 2 CONTINUE DO 11 IT=0,NMAX DO 111 I=0,NMAX RU(IIU,I)=RT(IIT,I) 111 CONTINUE DO 12 IU=0,NMAX-IT DO 121 I=0,NMAX RV(IIV,I)=RU(IIU,I) 121 CONTINUE DO 13 IV=0,NMAX-IT-IU INDX=INDX+1 C we fill R000 as result of the operation R000(INDX)=RV(IIV,0) DO 131 K=0,NMAX-IT-IU-IV-1 RV(IIV2,K)=RV(IIV2,K+1)*DBLE(IV)+ZPC*RV(IIV,K+1) 131 CONTINUE IDUM=IIV IIV=IIV2 IIV2=IDUM 13 CONTINUE DO 122 K=0,NMAX-IT-IU-1 RU(IIU2,K)=RU(IIU2,K+1)*DBLE(IU)+YPC*RU(IIU,K+1) 122 CONTINUE IDUM=IIU IIU=IIU2 IIU2=IDUM 12 CONTINUE DO 112 K=0,NMAX-IT-1 RT(IIT2,K)=RT(IIT2,K+1)*DBLE(IT)+XPC*RT(IIT,K+1) 112 CONTINUE IDUM=IIT IIT=IIT2 IIT2=IDUM 11 CONTINUE C CD WRITE(6,*) CD WRITE(6,*) ' we produced ',INDX,' hermitian intermediates' CD WRITE(6,*) ' NMAX = ',NMAX C RETURN END C C we prepare arrays, the Gamma table, the transformation Cart -> spherical C SUBROUTINE PREPA INCLUDE 'param.h' COMMON /CONST/ PI,ANTOAU,TP25,ONE C.. INCLUDE 'constants.h' COMMON /FLOW/ THRESH,MULINT,LFORM,LMONO,LBIEL,LCART,LKINET LOGICAL LFORM,LMONO,LBIEL,LCART,LKINET C.. INCLUDE 'common_flow.h' COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),POS(3,NATMX),NZ(NATMX) $ ,NSH(NATMX),NPRIM(NSHLMX),IL(NSHLMX),NZENTR(NSHLMX) $ ,NPST(NSHLMX),NSHLT,LMAX C.. INCLUDE 'common_syst.h' CALL FILSPH CALL FFCAL C Table for the Gamma function MXABCD=LMAX*4+1 CALL GAMTAB(MXABCD) RETURN END C SUBROUTINE FFCAL INCLUDE 'param.h' COMMON /POLYTA/ FAC(NLMAX+NLMAX+2),FACC(NLMAX+1) C.. INCLUDE 'common_polyta.h' C C the (2l-1)!! and the (l+|m|)! C first the (2l-1)!! C FAC(1)=1.D0 FAC(2)=1.D0 DO I=3,NLMAX+NLMAX+2 XMLT=DBLE(I-1) FAC(I)=XMLT*FAC(I-1) END DO C L=1 FACC(1)=1.D0 CD WRITE(6,*) ' L, FACC(L) ',L-1,FACC(L) DO L=2,NLMAX+1 FACC(L)=FACC(L-1)*DBLE(L+L-3) CD WRITE(6,*) ' L, FACC(L) ',L-1,FACC(L) END DO C CD DO L=1,NLMAX CD WRITE(6,*) ' L, FAC(L), FACC(L) ',L-1,FAC(L),FACC(L) CD END DO CD DO L=1+NLMAX,NLMAX+NLMAX CD WRITE(6,*) ' L, FAC(L) ',L-1,FAC(L) CD END DO C RETURN END C SUBROUTINE FILSPH INCLUDE 'param.h' COMMON /SPHERI/ SPHCAR(0:NLMAX,NCMAX,NSPMAX),NCART(0:NLMAX) $ ,CARMUL(0:NLMAX,(NLMAX+1)*(NLMAX+2)/2) C.. INCLUDE 'common_spheri.h' COMMON /POLYTA/ FAC(NLMAX+NLMAX+2),FACC(NLMAX+1) C.. INCLUDE 'common_polyta.h' COMMON /FLOW/ THRESH,MULINT,LFORM,LMONO,LBIEL,LCART,LKINET LOGICAL LFORM,LMONO,LBIEL,LCART,LKINET C.. INCLUDE 'common_flow.h' COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),POS(3,NATMX),NZ(NATMX) $ ,NSH(NATMX),NPRIM(NSHLMX),IL(NSHLMX),NZENTR(NSHLMX) $ ,NPST(NSHLMX),NSHLT,LMAX C.. INCLUDE 'common_syst.h' COMMON /CONST/ PI,ANTOAU,TP25,ONE C.. INCLUDE 'constants.h' C INCR=1 NCART(0)=1 DO L=1,LMAX INCR=INCR+1 NCART(L)=NCART(L-1)+INCR END DO do l=0,lmax do m=1,(l+1)*(l+2)/2 carmul(l,m)=1.d0 end do end do C proper normalization factors for cartesian d functions carmul(2,2)=sqrt(3.d0) carmul(2,4)=sqrt(3.d0) carmul(2,5)=sqrt(3.d0) C proper normalization factors for cartesian f functions carmul(3,2)=sqrt(5.d0) carmul(3,3)=sqrt(5.d0) carmul(3,5)=sqrt(5.d0) carmul(3,6)=sqrt(15.d0) carmul(3,7)=sqrt(5.d0) carmul(3,8)=sqrt(5.d0) carmul(3,9)=sqrt(5.d0) C DO I=0,LMAX DO J=1,NCART(I) DO K=1,I+I+1 SPHCAR(I,J,K)=0.D0 END DO END DO END DO IF (LMAX.GE.0) THEN C s C cartesian: C 1 C 1 C 000 SPHCAR(0,1,1)=1.D0 IF (LMAX.GE.1) THEN C p spherical harmonics: C m -1 0 1 C x z y C cartesian: C 1 2 3 C z y x C 001 010 100 C C we put them in the order x, y, z C for both cases C SPHCAR(1,1,3)=1.D0 SPHCAR(1,2,2)=1.D0 SPHCAR(1,3,1)=1.D0 IF (LMAX.GE.2) THEN C d spherical harmonics: C m -2 -1 0 1 2 C xy, yz, 3z2-r2, xz, x2-y2 C C cartesian: C 1 2 3 4 5 6 C zz yz yy xz xy xx C 002 011 020 101 110 200 C SPHCAR(2,5,1)= SQRT(3.D0) SPHCAR(2,2,2)= SQRT(3.D0) c$$$ SPHCAR(2,1,3)= SQRT(3.D0)*2.D0/SQRT(12.D0) c$$$ SPHCAR(2,3,3)=-SQRT(3.D0)/SQRT(12.D0) c$$$ SPHCAR(2,6,3)=-SQRT(3.D0)/SQRT(12.D0) SPHCAR(2,1,3)= 1.D0 SPHCAR(2,3,3)=-0.5D0 SPHCAR(2,6,3)=-0.5D0 SPHCAR(2,4,4)= SQRT(3.D0) SPHCAR(2,6,5)= SQRT(3.D0)/2.D0 SPHCAR(2,3,5)=-SQRT(3.D0)/2.D0 IF (LMAX.GE.3) THEN C C f C m -3 -2 -1 0 1 2 3 C 33s 32s 31s 30 31c 32c 33c C 3xxy-yyy xyz 4yzz-xxy-yyy 5zzz-3zrr 4xzz-xxx-xyy z(xx-yy) xxx-3xyy C C 1 2 3 4 5 6 7 8 9 10 C zzz yzz yyz yyy xzz xyz xyy xxz xxy xxx C 003 012 021 030 102 111 120 201 210 300 C SPHCAR(3, 9,1) = 3.D0*SQRT(10.D0)/4.D0 SPHCAR(3, 4,1) = -SQRT(10.D0)/4.D0 SPHCAR(3, 6,2) = SQRT(15.D0) SPHCAR(3, 2,3) = SQRT(6.D0) SPHCAR(3, 9,3) = -SQRT(6.D0)/4.D0 SPHCAR(3, 4,3) = -SQRT(6.D0)/4.D0 C this is the convention of Helgaker et al, table 6.3 C but leading to negative monoelectronic integrals C with respect to Dalton c$$$ SPHCAR(3, 1,4) = 1.D0 c$$$ SPHCAR(3, 8,4) = -1.5D0 c$$$ SPHCAR(3, 3,4) = -1.5D0 C this is the convention used as well in Dalton SPHCAR(3, 1,4) = -1.D0 SPHCAR(3, 8,4) = 1.5D0 SPHCAR(3, 3,4) = 1.5D0 SPHCAR(3, 5,5) = SQRT(6.D0) SPHCAR(3,10,5) =-SQRT(6.D0)/4.D0 SPHCAR(3, 7,5) =-SQRT(6.D0)/4.D0 SPHCAR(3, 8,6) = SQRT(15.D0)/2.D0 SPHCAR(3, 3,6) =-SQRT(15.D0)/2.D0 C this is the convention of Helgaker et al, table 6.3 c$$$ SPHCAR(3, 7,7) = -3.D0*SQRT(10.D0)/4.D0 c$$$ SPHCAR(3,10,7) = SQRT(10.D0)/4.D0 C this is the convention used as well in Dalton SPHCAR(3, 7,7) = 3.D0*SQRT(10.D0)/4.D0 SPHCAR(3,10,7) = -SQRT(10.D0)/4.D0 IF (LMAX.GE.4) THEN C C g functions C m -4 -3 -2 -1 0 1 2 3 4 C C cartesian C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 C zzzz yzzz yyzz yyyz yyyy xzzz xyzz xyyz xyyy xxzz xxyz xxyy xxxz xxxy xxxx C 004 013 022 031 040 103 112 121 130 202 211 220 301 310 400 C C we took the Dalton table which is printed with .PRINT with 9 SPHCAR(4,14,1)= SQRT(35.D0)/2.D0 SPHCAR(4,9, 1)=-SQRT(35.D0)/2.D0 SPHCAR(4, 4,2)=-1.D0*SQRT(35.D0/8.D0) SPHCAR(4,11,2)= 3.D0*SQRT(35.D0/8.D0) SPHCAR(4,14,3)= -1.D0*sqrt(5.D0)/2.D0 SPHCAR(4, 9,3)= -1.D0*sqrt(5.D0)/2.D0 SPHCAR(4, 7,3)= 6.D0*sqrt(5.D0)/2.D0 SPHCAR(4,11,4)= -1.D0/sqrt(8.d0/45.d0) SPHCAR(4, 4,4)= -1.D0/sqrt(8.d0/45.d0) SPHCAR(4, 2,4)= 4.D0/3.D0/sqrt(8.d0/45.d0) C the same as above, the sign is opposite to that of Helgaker, table 6.3 SPHCAR(4,15,5)= -1.D0/8.D0*3.D0 SPHCAR(4,12,5)= -1.D0/4.D0*3.D0 SPHCAR(4,10,5)= 1.D0*3.D0 SPHCAR(4, 5,5)= -1.D0/8.D0*3.D0 SPHCAR(4, 3,5)= 1.D0*3.D0 SPHCAR(4, 1,5)= -1.D0/3.D0*3.D0 SPHCAR(4,13,6)= -1.D0/sqrt(8.d0/45.d0) SPHCAR(4, 8,6)= -1.D0/sqrt(8.d0/45.d0) SPHCAR(4, 6,6)= 4.D0/3.D0/sqrt(8.d0/45.d0) SPHCAR(4,15,7)= -1.D0*sqrt(5.D0)/4 SPHCAR(4,10,7)= 6.D0*sqrt(5.D0)/4 SPHCAR(4, 5,7)= 1.D0*sqrt(5.D0)/4 SPHCAR(4, 3,7)= -6.D0*sqrt(5.D0)/4 C the same as above, the sign is opposite to that of Helgaker, table 6.3 SPHCAR(4,13,8)= -1.D0/3.D0*sqrt(35.D0)*3.D0/4.D0*sqrt(2. $D0) C folded 1 (fixf $Revision: 1.3 $) SPHCAR(4, 8,8)= 1.D0*sqrt(35.D0)*3.D0/4.D0*sqrt(2.D0) SPHCAR(4,15,9)= -1.D0/6.d0*sqrt(35.D0)*3.D0/4.D0 SPHCAR(4,12,9)= 1.D0*sqrt(35.D0)*3.D0/4.D0 SPHCAR(4, 5,9)= -1.D0/6.d0*sqrt(35.D0)*3.D0/4.D0 END IF END IF END IF END IF END IF DO I=0,LMAX DO K=1,I+I+1 DO J=1,NCART(I) IF (ABS(SPHCAR(I,J,K)).GT.1.D-9) THEN WRITE(6,9901) I,J,K,SPHCAR(I,J,K) 9901 FORMAT(' L= ',I3,' CART = ',I3,' SPH= ',I3,' : ',F20.12) end if END DO END DO WRITE(6,*) END DO write(6,*) RETURN END C SUBROUTINE SPHHAM(XINTC,XINTS) INCLUDE 'param.h' COMMON /LOCAT/ EXA,EXB,EXC,EXD,XA(3),XB(3),XAB(3),XC(3),XD(3) $ ,XCD(3),P,Q,ALPHA,XP(3),XQ(3),F(4*NLMAX+1),LA,LB,LC,LD $ ,NPRIMA,NPRIMB,NPRIMC,NPRIMD,NPSTA,NPSTB,NPSTC,NPSTD C.. INCLUDE 'common_locat.h' COMMON /SPHERI/ SPHCAR(0:NLMAX,NCMAX,NSPMAX),NCART(0:NLMAX) $ ,CARMUL(0:NLMAX,(NLMAX+1)*(NLMAX+2)/2) C.. INCLUDE 'common_spheri.h' DIMENSION XINTC(NCMAX,NCMAX) DIMENSION XINTS(NSPMAX,NSPMAX) C C transformation from cartesian coordinates on spherical harmonics C DO I=1,LA+LA+1 DO J=1,LB+LB+1 XINTS(I,J)=0.D0 END DO END DO C DO MA=1,LA+LA+1 DO I=1,NCART(LA) XMA=SPHCAR(LA,I,MA) IF (ABS(XMA).GT.1.D-12) THEN DO MB=1,LB+LB+1 DO J=1,NCART(LB) XMB=SPHCAR(LB,J,MB) XINTS(MA,MB) =XINTS(MA,MB)+XMA*XMB*XINTC(I,J) END DO END DO END IF END DO END DO C RETURN END SUBROUTINE MONINT INCLUDE 'param.h' COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),POS(3,NATMX),NZ(NATMX) $ ,NSH(NATMX),NPRIM(NSHLMX),IL(NSHLMX),NZENTR(NSHLMX) $ ,NPST(NSHLMX),NSHLT,LMAX C.. INCLUDE 'common_syst.h' COMMON /LOCAT/ EXA,EXB,EXC,EXD,XA(3),XB(3),XAB(3),XC(3),XD(3) $ ,XCD(3),P,Q,ALPHA,XP(3),XQ(3),F(4*NLMAX+1),LA,LB,LC,LD $ ,NPRIMA,NPRIMB,NPRIMC,NPRIMD,NPSTA,NPSTB,NPSTC,NPSTD C.. INCLUDE 'common_locat.h' C integrals in hermitian Gaussians COMMON /INTEGH/ R000(LHMAX) C.. INCLUDE 'common_integ.h' C static quantities for generating the tables and the interpolation form C of the incomplete gamma function PARAMETER (NTABG=20000) COMMON/TABAUX/TABGAM(NTABG),NVALS,NSEGM,NSEGM2,NSEGM3,NSEGM4 - ,NSEGM5,NSEGM6 C.. INCLUDE 'common_tabaux.h' COMMON /SPHERI/ SPHCAR(0:NLMAX,NCMAX,NSPMAX),NCART(0:NLMAX) $ ,CARMUL(0:NLMAX,(NLMAX+1)*(NLMAX+2)/2) C.. INCLUDE 'common_spheri.h' COMMON /POLYTA/ FAC(NLMAX+NLMAX+2),FACC(NLMAX+1) C.. INCLUDE 'common_polyta.h' COMMON /CONST/ PI,ANTOAU,TP25,ONE C.. INCLUDE 'constants.h' COMMON /FLOW/ THRESH,MULINT,LFORM,LMONO,LBIEL,LCART,LKINET LOGICAL LFORM,LMONO,LBIEL,LCART,LKINET C.. INCLUDE 'common_flow.h' C C integrals in cartesians COMMON /INTEGC/ POTC(NCMAX,NCMAX),OVERL(NCMAX,NCMAX) $ ,EKIN(NCMAX,NCMAX),DIPXC(NCMAX,NCMAX),DIPYC(NCMAX,NCMAX) $ ,DIPZC(NCMAX,NCMAX),NUMCAR C integrals in spherical harmonics COMMON /INTEGS/ POTS(NSPMAX,NSPMAX),OVERS(NSPMAX,NSPMAX) $ ,EKINS(NSPMAX,NSPMAX),DIPXS(NSPMAX,NSPMAX),DIPYS(NSPMAX $ ,NSPMAX),DIPZS(NSPMAX,NSPMAX) C final one-electron integrals COMMON /INTU/ VPOT(NBASM,NBASM),TKIN(NBASM,NBASM),S(NBASM,NBASM) $ ,DIPX(NBASM,NBASM),DIPY(NBASM,NBASM),DIPZ(NBASM,NBASM) C.. INCLUDE 'dimens_intu.h' DIMENSION XPA(3),XPB(3),XPC(3) DIMENSION SS(3,-1:NLMAX+2,-1:NLMAX) DIMENSION DD(3,0:NLMAX,0:NLMAX) do i=1,3 do j=-1,lmax+2 do k=-1,lmax ss(i,j,k)=0.d0 end do end do end do CR LOGICAL LERR CR DIMENSION SREAD(NBASM,NBASM),TREAD(NBASM,NBASM),VREAD(NBASM,NBASM) C we read the DALTON integrals for comparison C CR DO I=1,NBAS CR DO J=1,NBAS CR SREAD(I,J)=0.D0 CR TREAD(I,J)=0.D0 CR VREAD(I,J)=0.D0 CR END DO CR END DO CR OPEN(UNIT=15,File='OVERLAP',STATUS='OLD',FORM='FORMATTED') 107 CONTINUE CR READ(15,*,IOSTAT=KK) I,J,XDUM CR IF (KK.NE.0) GO TO 108 CR SREAD(I,J)=XDUM CR SREAD(J,I)=XDUM CR GO TO 107 108 CONTINUE CR CLOSE(15) CR OPEN(UNIT=15,File='KINETIC',STATUS='OLD',FORM='FORMATTED') 207 CONTINUE CR READ(15,*,IOSTAT=KK) I,J,XDUM CR IF (KK.NE.0) GO TO 208 CR TREAD(I,J)=XDUM CR TREAD(J,I)=XDUM CR GO TO 207 208 CONTINUE CR CLOSE(15) CR OPEN(UNIT=15,File='HAMILTO',STATUS='OLD',FORM='FORMATTED') 307 CONTINUE CR READ(15,*,IOSTAT=KK) I,J,XDUM CR IF (KK.NE.0) GO TO 308 CR VREAD(I,J)=XDUM CR VREAD(J,I)=XDUM CR GO TO 307 308 CONTINUE CR CLOSE(15) C CR DO I=1,NBAS CR DO J=1,NBAS CR VREAD(I,J)=VREAD(I,J)-TREAD(I,J) CR END DO CR END DO C CR DO I=1,NBAS CR DO J=I,NBAS CR WRITE(6,9777) I,J,SREAD(I,J),TREAD(I,J),VREAD(I,J) CR END DO CR END DO C DO I=1,NBAS DO J=1,NBAS VPOT(I,J)=0.D0 TKIN(I,J)=0.D0 S (I,J)=0.D0 DIPX(I,J)=0.D0 DIPY(I,J)=0.D0 DIPZ(I,J)=0.D0 END DO END DO TWOPI=2.D0*PI C C the loop over atomic shells C C the real work ISTA=1 DO ISHLA=1,NSHLT CD WRITE(6,*) ' TREATING SHELL A = ',ISHLA C the atom IATA=NZENTR(ISHLA) C get the position DO I=1,3 XA(I)=POS(I,IATA) END DO C the angular momentum LA=IL(ISHLA) C the number and start address for the primitives NPRIMA=NPRIM(ISHLA) NPSTA =NPST (ISHLA) ISTB=ISTA DO ISHLB=ISHLA,NSHLT CD WRITE(6,*) ' TREATING SHELL B = ',ISHLB IATB=NZENTR(ISHLB) C get the angular momentum, the position, the primitives and the C coefficients DO I=1,3 XB(I)=POS(I,IATB) XAB(I)=XA(I)-XB(I) END DO LB=IL(ISHLB) C the number and start address for the primitives NPRIMB=NPRIM(ISHLB) NPSTB =NPST (ISHLB) CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C Overlap and Kinetic energy integrals C CD WRITE(6,*) CD WRITE(6,*) ' ------------------------------------------------' CD WRITE(6,*) C C C set cartesian integrals to zero C DO I=1,NCART(LA) DO J=1,NCART(LB) OVERL(I,J)=0.D0 EKIN (I,J)=0.D0 POTC (I,J)=0.D0 DIPXC(I,J)=0.D0 DIPYC(I,J)=0.D0 DIPZC(I,J)=0.D0 END DO END DO LAB=LA+LB C IA=NPSTA DO IIA=1,NPRIMA EXA=EXX(IA) CCA=COEFF(IA) IA=IA+1 IB=NPSTB DO IIB=1,NPRIMB EXB=EXX(IB) COEFFP=CCA*COEFF(IB) IB=IB+1 C P=EXA+EXB XMU=EXA*EXB/P RAB=0.D0 DO I=1,3 XP(I)=(EXA*XA(I)+EXB*XB(I))/P XPA(I)=-EXB/P*XAB(I) XPB(I)= EXA/P*XAB(I) RAB=RAB+XAB(I)*XAB(I) SS(I,0,0)=SQRT(PI/P) SS(I,1,0)=XPA(I)*SS(I,0,0) SS(I,0,1)=XPB(I)*SS(I,0,0) END DO EMU=EXP(-XMU*RAB) COEFFP=COEFFP*EMU DO I=1,3 DO L=2,LA+LB+2 JJ=0 IF (L.LE.LA+2) THEN SS(I,L,0)=XPA(I)*SS(I,L-1,0)+0.5D0/P*DBLE(L-1)*SS(I,L-2,0) END IF IF (L.LE.LB) THEN SS(I,0,L)=XPB(I)*SS(I,0,L-1)+0.5D0/P*DBLE(L-1)*SS(I,0,L-2) END IF C horizontal recurrence - we create all intermediates i+j=l DO JJ=1,L-1 II=L-JJ IF (II.LE.LA+2.AND.JJ.LE.LB) THEN YYY=DBLE(II)*SS(I,II-1,JJ-1) IF (JJ.GE.2) THEN YYY=YYY+DBLE(JJ-1)*SS(I,II,JJ-2) END IF SS(I,II,JJ)=XPB(I)*SS(I,II,JJ-1)+0.5D0/P*YYY END IF END DO END DO END DO C DO I=1,3 DO L2=0,LB DO L1=0,LA DD(I,L1,L2)=2.D0*EXA*(2.D0*EXA*SS(I,L1+2,L2)-DBLE(2*L1+1) $ *SS(I,L1,L2)) IF (L1.GE.2) THEN DD(I,L1,L2)=DD(I,L1,L2) + DBLE(L1*(L1-1))*SS(I,L1-2,L2) END IF END DO END DO END DO C INDX1=0 DO I=0,LA DO J=0,LA-I INDX1=INDX1+1 INDX2=0 DO II=0,LB DIPXH=XP(1)*SS(1,I,II)+0.5D0/P*(DBLE(I)*SS(1,I-1,II) $ +DBLE(II-1)*SS(1,I,II-1)) DO JJ=0,LB-II INDX2=INDX2+1 K =LA-I-J KK=LB-II-JJ OVERL(INDX1,INDX2)=OVERL(INDX1,INDX2)+ COEFFP*SS(1,I,II) $ *SS(2,J,JJ)*SS(3,K,KK) DIPXH=XP(1)*SS(1,I,II)+0.5D0/P*(DBLE(I)*SS(1,I-1,II) $ +DBLE(II)*SS(1,I,II-1)) DIPYH=XP(2)*SS(2,J,JJ)+0.5D0/P*(DBLE(J)*SS(2,J-1,JJ) $ +DBLE(JJ)*SS(2,J,JJ-1)) DIPZH=XP(3)*SS(3,K,KK)+0.5D0/P*(DBLE(K)*SS(3,K-1,KK) $ +DBLE(KK)*SS(3,K,KK-1)) DIPXC(INDX1,INDX2)=DIPXC(INDX1,INDX2) + - COEFFP*DIPXH*SS(2,J,JJ)*SS(3,K,KK) DIPYC(INDX1,INDX2)=DIPYC(INDX1,INDX2) + - COEFFP*SS(1,I,II)*DIPYH*SS(3,K,KK) DIPZC(INDX1,INDX2)=DIPZC(INDX1,INDX2) + - COEFFP*SS(1,I,II)*SS(2,J,JJ)*DIPZH EKIN(INDX1,INDX2)=EKIN(INDX1,INDX2) -COEFFP*0.5D0*(DD(1,I $ ,II)*SS(2,J,JJ)*SS(3,K,KK)+SS(1,I,II)*DD(2,J,JJ)*SS(3 $ ,K,KK)+SS(1,I,II)*SS(2,J,JJ)*DD(3,K,KK)) CD WRITE(6,*) ' INDX1, INDX2, S (',I,J,K,') (',II,JJ,KK,') ' CD $ ,OVERL(INDX1,INDX2),EKIN(INDX1,INDX2) END DO END DO END DO END DO C C loop over atomic positions C we do not need el-n integrals in the case LKINET IF (.NOT.LKINET) THEN PIKALL=COEFFP*TWOPI/P DO IAT=1,NATOM IF (NZ(IAT).NE.0) THEN DO I=1,3 XC(I)=POS(I,IAT) END DO CD WRITE(6,*) ' POSITION OF NUCLEUS: ',(XC(J),J=1,3) C C adapt quantities to common block PQCON C RRPC=0.D0 DO I=1,3 XPC(I)=XP(I)-XC(I) RRPC=RRPC+XPC(I)*XPC(I) END DO ARG=P*RRPC C CD WRITE(6,*) CD WRITE(6,*) ' entering BUXG for the incomplete Gamma function' CD WRITE(6,*) ' P * RRPC = ',PRRPC CD WRITE(6,*) ' Prefactors = ',EMU,COEFFP,XMU CD WRITE(6,*) NMAX=LAB+1 DO L=1,NMAX F(L)=0.D0 END DO CALL GAMF(F,ARG,NMAX) C AMUL=1.D0 I=1 CD WRITE(6,*) ' I, F(I) = ',I,F(I) DO I=2,LAB+1 AMUL=-(P+P)*AMUL F(I)=F(I)*AMUL CD WRITE(6,*) ' I, F(I) = ',I,F(I) CD WRITE(6,*) C END DO C C that were the preparations C CALL RMCMUR(R000,F,XPC,LAB) PIK=DBLE(NZ(IAT))*PIKALL C we accumulate the e-n interaction for each nucleus in POTC CALL PHIREC(POTC,R000,XAB,EXA,EXB,PIK,LA,LB) C END IF END DO C close IF of LKINET END IF C close loops over primitives EXA and EXB END DO END DO C C if cartesian integrals are demanded we have all here C we come from the recursion with xx, xy, xz, yy, yz, zz and so on C IF (LCART) THEN DO IMA=1,NCART(LA) IALPH=ISTA+ICARCAR(LA,IMA)-1 DO IMB=1,NCART(LB) IBETA=ISTB+ICARCAR(LB,IMB)-1 XMULT=CARMUL(LA,IMA)*CARMUL(LB,IMB) TKIN(IALPH,IBETA)=EKIN (IMA,IMB)*XMULT S (IALPH,IBETA)=OVERL(IMA,IMB)*XMULT VPOT(IALPH,IBETA)=POTC (IMA,IMB)*XMULT DIPX(IALPH,IBETA)=DIPXC(IMA,IMB)*XMULT DIPY(IALPH,IBETA)=DIPYC(IMA,IMB)*XMULT DIPZ(IALPH,IBETA)=DIPZC(IMA,IMB)*XMULT CD WRITE(6,*) CD WRITE(6,9777) IALPH,IBETA,S(IALPH,IBETA),TKIN(IALPH,IBETA) CD $ ,VPOT(IALPH,IBETA) CD WRITE(6,*) END DO END DO ISTB=ISTB+NCART(LB) ELSE C C transformation onto spherical harmonics C CALL SPHHAM(EKIN ,EKINS) IF (.NOT.LKINET) THEN CALL SPHHAM(OVERL,OVERS) CALL SPHHAM(POTC ,POTS ) CALL SPHHAM(DIPXC,DIPXS) CALL SPHHAM(DIPYC,DIPYS) CALL SPHHAM(DIPZC,DIPZS) END IF DO IMA=1,1+LA+LA IALPH=ISTA+IMA-1 DO IMB=1,1+LB+LB IBETA=ISTB+IMB-1 IF (.NOT.LKINET) THEN TKIN(IALPH,IBETA)=EKINS(IMA,IMB) S (IALPH,IBETA)=OVERS(IMA,IMB) VPOT(IALPH,IBETA)=POTS (IMA,IMB) DIPX(IALPH,IBETA)=DIPXS(IMA,IMB) DIPY(IALPH,IBETA)=DIPYS(IMA,IMB) DIPZ(IALPH,IBETA)=DIPZS(IMA,IMB) END IF CD WRITE(6,*) CD WRITE(6,9777) IALPH,IBETA,S(IALPH,IBETA),TKIN(IALPH,IBETA) CD $ ,VPOT(IALPH,IBETA) 9777 FORMAT(' I=',I3,' J=',I3,' S=',F18.11,' T=',F18.11,' V=' $ ,F18.11) CD WRITE(6,*) END DO END DO ISTB=ISTB+LB+LB+1 END IF C C close loops over shells C END DO IF (LCART) THEN ISTA=ISTA+NCART(LA) ELSE ISTA=ISTA+LA+LA+1 END IF c$$$ CALL TIMING('SH A') END DO C CR WRITE(6,*) CR WRITE(6,*) ' DIFFERENCE TO READ VALUES: ( > 1.D-8 ) ' CR WRITE(6,*) CR LERR=.FALSE. CR DO I=1,NBAS CR DO J=I,NBAS CR IF (ABS(VREAD(I,J)-VPOT(I,J)).GT.1.D-8) THEN CR WRITE(6,9877) I,J,VPOT(I,J)-VREAD(I,J),VPOT(I,J),VREAD(I,J) CR LERR=.TRUE. CR END IF CR IF (I.EQ.50.AND.J.EQ.51) WRITE(6,*) ' VVV ',I,J,VPOT(I,J) CR IF (I.EQ.50.AND.J.EQ.51) WRITE(6,*) ' TTT ',I,J,TKIN(I,J) CR IF (ABS(SREAD(I,J)-S(I,J)).GT.1.D-8) THEN CR WRITE(6,9878) I,J,S(I,J)-SREAD(I,J),S(I,J),SREAD(I,J) CR LERR=.TRUE. CR END IF CR IF (ABS(TREAD(I,J)-TKIN(I,J)).GT.1.D-8) THEN CR WRITE(6,9879) I,J,TKIN(I,J)-TREAD(I,J),TKIN(I,J),TREAD(I,J) CR LERR=.TRUE. CR END IF CR END DO CR END DO CR IF (.NOT.LERR) THEN CR WRITE(6,*) ' NO DIFFERENCE TO REPORT !!! ' CR END IF 9877 FORMAT('V I',I3,' J',I3,' DIFF=',F18.11,' C=',F18.11,' R=' $ ,F18.11) 9878 FORMAT('S I',I3,' J',I3,' DIFF=',F18.11,' C=',F18.11,' R=' $ ,F18.11) 9879 FORMAT('T I',I3,' J',I3,' DIFF=',F18.11,' C=',F18.11,' R=' $ ,F18.11) C write the integrals to file C--SKIPCR WRITE(6,*) ' WRITING FILE ' OPEN(UNIT=16,FILE='KINETIC',FORM='FORMATTED',STATUS='UNKNOWN') DO I=1,NBAS DO J=I,NBAS IF (ABS(TKIN(I,J)).GT.THRESH) - WRITE(16,'(2I5,F22.12)') J,I,TKIN(I,J) END DO END DO CLOSE(16) IF (.NOT.LKINET) THEN WRITE(6,*) ' WRITING FILE ' WRITE(6,*) ' WRITING FILE ' WRITE(6,*) ' WRITING FILE ' WRITE(6,*) ' WRITING FILE ' WRITE(6,*) ' WRITING FILE ' OPEN(UNIT=14,FILE='OVERLAP',FORM='FORMATTED',STATUS='UNKNOWN') OPEN(UNIT=15,FILE='HAMILTO',FORM='FORMATTED',STATUS='UNKNOWN') OPEN(UNIT=17,FILE='DIPOL_X',FORM='FORMATTED',STATUS='UNKNOWN') OPEN(UNIT=18,FILE='DIPOL_Y',FORM='FORMATTED',STATUS='UNKNOWN') OPEN(UNIT=19,FILE='DIPOL_Z',FORM='FORMATTED',STATUS='UNKNOWN') DO I=1,NBAS DO J=I,NBAS IF (ABS(S(I,J)).GT.THRESH) - WRITE(14,'(2I5,F22.12)') J,I,S(I,J) VDUM=VPOT(I,J)+TKIN(I,J) IF (ABS(VDUM).GT.THRESH) - WRITE(15,'(2I5,F22.12)') J,I,VDUM IF (ABS(TKIN(I,J)).GT.THRESH) - WRITE(16,'(2I5,F22.12)') J,I,TKIN(I,J) IF (ABS(DIPX(I,J)).GT.THRESH) - WRITE(17,'(2I5,F22.12)') J,I,DIPX(I,J) IF (ABS(DIPY(I,J)).GT.THRESH) - WRITE(18,'(2I5,F22.12)') J,I,DIPY(I,J) IF (ABS(DIPZ(I,J)).GT.THRESH) - WRITE(19,'(2I5,F22.12)') J,I,DIPZ(I,J) END DO END DO CLOSE(14) CLOSE(15) CLOSE(17) CLOSE(18) CLOSE(19) END IF C//ENDCR RETURN END SUBROUTINE TWOINT INCLUDE 'param.h' COMMON /FLOW/ THRESH,MULINT,LFORM,LMONO,LBIEL,LCART,LKINET LOGICAL LFORM,LMONO,LBIEL,LCART,LKINET C.. INCLUDE 'common_flow.h' COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),POS(3,NATMX),NZ(NATMX) $ ,NSH(NATMX),NPRIM(NSHLMX),IL(NSHLMX),NZENTR(NSHLMX) $ ,NPST(NSHLMX),NSHLT,LMAX C.. INCLUDE 'common_syst.h' COMMON /LOCAT/ EXA,EXB,EXC,EXD,XA(3),XB(3),XAB(3),XC(3),XD(3) $ ,XCD(3),P,Q,ALPHA,XP(3),XQ(3),F(4*NLMAX+1),LA,LB,LC,LD $ ,NPRIMA,NPRIMB,NPRIMC,NPRIMD,NPSTA,NPSTB,NPSTC,NPSTD C.. INCLUDE 'common_locat.h' C integrals in hermitian Gaussians COMMON /INTEGH/ R000(LHMAX) C.. INCLUDE 'common_integ.h' COMMON /SPHERI/ SPHCAR(0:NLMAX,NCMAX,NSPMAX),NCART(0:NLMAX) $ ,CARMUL(0:NLMAX,(NLMAX+1)*(NLMAX+2)/2) C.. INCLUDE 'common_spheri.h' COMMON /POLYTA/ FAC(NLMAX+NLMAX+2),FACC(NLMAX+1) C.. INCLUDE 'common_polyta.h' COMMON /CONST/ PI,ANTOAU,TP25,ONE C.. INCLUDE 'constants.h' C DIMENSION XPA(3),XPB(3) DIMENSION SS(3,0:NLMAX+2,0:NLMAX) DIMENSION DD(3,0:NLMAX,0:NLMAX) LOGICAL LTAKE LOGICAL LOCANC C C with f functions we have at most 2401 possibilities in spherical C harmonics, but 10000 for cartesian functions for the (ff|ff) C integrals C DIMENSION HHHBUF(NCMAX*NCMAX*NCMAX*NCMAX) IF (LFORM) THEN OPEN(UNIT=14,FILE='AOTWOINT_FORMATTED',STATUS='UNKNOWN',FORM $ ='FORMATTED') ELSE CALL WOPEN(4,1) END IF XDUMP=0.D0 XCALC=0.D0 XSSSS=0.D0 XSSCD=0.D0 XABSS=0.D0 XABCD=0.D0 INDXA=0 DO ISHLA=1,NSHLT CD WRITE(6,*) ' TREATING SHELL A = ',ISHLA C the atom IATA=NZENTR(ISHLA) DO I=1,3 XA(I)=POS(I,IATA) END DO LA=IL(ISHLA) NPRIMA=NPRIM(ISHLA) NPSTA =NPST (ISHLA) IF (LCART) THEN NINDA=NCART(LA) ELSE NINDA=LA+LA+1 END IF INDXB=INDXA DO ISHLB=ISHLA,NSHLT CD WRITE(6,*) ' TREATING SHELL B = ',ISHLB C the atom IATB=NZENTR(ISHLB) DO I=1,3 XB(I)=POS(I,IATB) END DO LB=IL(ISHLB) NPRIMB=NPRIM(ISHLB) NPSTB =NPST (ISHLB) IF (LCART) THEN NINDB=NCART(LB) ELSE NINDB=LB+LB+1 END IF LAB=LA+LB INDXC=INDXA DO ISHLC=ISHLA,NSHLT CD WRITE(6,*) ' TREATING SHELL C = ',ISHLC C the atom IATC=NZENTR(ISHLC) DO I=1,3 XC(I)=POS(I,IATC) END DO LC=IL(ISHLC) NPRIMC=NPRIM(ISHLC) NPSTC =NPST (ISHLC) IF (LCART) THEN NINDC=NCART(LC) ELSE NINDC=LC+LC+1 END IF LABC=LAB+LC INDXD=INDXC DO ISHLD=ISHLC,NSHLT CD WRITE(6,*) ' TREATING SHELL D = ',ISHLA,ISHLB,ISHLC,ISHLD CD WRITE(6,*) ' LA LB LC LD = ',LA,LB,LC,LD C the atom IATD=NZENTR(ISHLD) DO I=1,3 XD(I)=POS(I,IATD) END DO LD=IL(ISHLD) NPRIMD=NPRIM(ISHLD) NPSTD =NPST (ISHLD) IF (LCART) THEN NINDD=NCART(LD) ELSE NINDD=LD+LD+1 END IF CD WRITE(6,*) ' IATA IATB IATC IATD = ',IATA,IATB,IATC,IATD LABCD=LABC+LD LCD=LC+LD IF (LABCD.EQ.0) THEN C this is the simplest of the integrals CALL SSSS(HHH) I=INDXA+1 J=INDXB+1 K=INDXC+1 L=INDXD+1 IF (LOCANC(I,J,K,L)) THEN XMULT=FACTOR(I,J,K,L) HHH=XMULT*HHH CD WRITE(6,9901) I,J,K,L,HHH XSSSS=XSSSS+1.D0 IF (ABS(HHH).GE.THRESH) THEN XDUMP=XDUMP+1.D0 IF (LFORM) THEN WRITE(14,'(4I5,E24.16)') I,J,K,L,HHH 9901 FORMAT(' wrote integral ',4I5,E24.16) ELSE CALL WADD(I,J,K,L,HHH) END IF END IF END IF ELSE IF (LAB.EQ.0) THEN IF (LABCD.EQ.0) STOP ' why 1 ' C this is for integrals (ss|cd) CALL SSCD(HHHBUF) C distribute the integrals INDX=0 DO IC=1,NINDC DO ID=1,NINDD INDX=INDX+1 I=INDXA+1 J=INDXB+1 K=INDXC+IC L=INDXD+ID CD WRITE(6,*) ' I J K L: ',I,J,K,L IF (LOCANC(I,J,K,L)) THEN HHH=HHHBUF(INDX) XMULT=FACTOR(I,J,K,L) HHH=XMULT*HHHBUF(INDX) CD WRITE(6,9901) I,J,K,L,HHH XSSCD=XSSCD+1.D0 IF (ABS(HHH).GE.THRESH) THEN XDUMP=XDUMP+1.D0 IF (LFORM) THEN WRITE(14,'(4I5,E24.16)') I,J,K,L,HHH ELSE CALL WADD(I,J,K,L,HHH) END IF END IF END IF END DO END DO ELSE IF (LCD.EQ.0) THEN IF (LABCD.EQ.0) STOP ' why 2 ' C this is for integrals (ab|ss) CALL ABSS(HHHBUF) C distribute the integrals INDX=0 DO IA=1,NINDA DO IB=1,NINDB INDX=INDX+1 I=INDXA+IA J=INDXB+IB IF (I.LE.J) THEN C as I and K come from different shells, the outer loop ensures that C I < K and K <= L K=INDXC+1 L=INDXD+1 CD WRITE(6,*) ' I J K L: ',I,J,K,L IF (LOCANC(I,J,K,L)) THEN HHH=HHHBUF(INDX) XMULT=FACTOR(I,J,K,L) HHH=XMULT*HHHBUF(INDX) CD WRITE(6,9901) I,J,K,L,HHH XABSS=XABSS+1.D0 IF (ABS(HHH).GE.THRESH) THEN XDUMP=XDUMP+1.D0 IF (LFORM) THEN WRITE(14,'(4I5,E24.16)') I,J,K,L,HHH ELSE CALL WADD(I,J,K,L,HHH) END IF END IF END IF END IF END DO END DO ELSE IF (LABCD.EQ.0) STOP ' why 3 ' C the general case with the double recursion C calculate the integrals over this quadruplet of shells CALL CALBI(HHHBUF) CD WRITE(6,*) ' INDXA INDXB INDXC INDXD: ',INDXA,INDXB,INDXC CD $ ,INDXD INDX=0 DO IA=1,NINDA DO IB=1,NINDB DO IC=1,NINDC DO ID=1,NINDD INDX=INDX+1 I=INDXA+IA J=INDXB+IB K=INDXC+IC L=INDXD+ID CD WRITE(6,*) ' I J K L: ',I,J,K,L IF (LOCANC(I,J,K,L)) THEN HHH=HHHBUF(INDX) XMULT=FACTOR(I,J,K,L) HHH=XMULT*HHHBUF(INDX) CD WRITE(6,9901) I,J,K,L,HHH XABCD=XABCD+1.D0 IF (ABS(HHH).GE.THRESH) THEN XDUMP=XDUMP+1.D0 IF (LFORM) THEN WRITE(14,'(4I5,E24.16)') I,J,K,L,HHH ELSE CALL WADD(I,J,K,L,HHH) END IF END IF END IF END DO END DO END DO END DO C close IF (abss) ... END IF C close IF (sscd) ... END IF C close IF (ssss) ... END IF INDXD=INDXD+NINDD END DO INDXC=INDXC+NINDC END DO INDXB=INDXB+NINDB END DO INDXA=INDXA+NINDA END DO WRITE(6,*) ' Bielectronic integrals : ' XCALC=XSSSS+XSSCD+XABSS+XABCD WRITE(6,9941) XSSSS,XSSCD,XABSS,XABCD,XCALC,XDUMP 9941 FORMAT(' we calculated ',F23.0,' (ss|ss) integrals ',/ $ ,' we calculated ',F23.0,' (ss|cd) integrals ',/, $ ' we calculated ',F23.0,' (ab|ss) integrals ',/ $ ,' we calculated ',F23.0,' (ab|cd) integrals ',/ $ ,' we calculated in total ',F15.0,' integrals ',/ $ ,' of these we stored ',F19.0,' integrals ') IF (LFORM) THEN CLOSE(UNIT=14) ELSE CALL WCLOS(1) END IF RETURN END C FUNCTION FACTOR(I,J,K,L) IMPLICIT NONE DOUBLE PRECISION FACTOR INTEGER I,J,K,L,IDUM LOGICAL LIJ,LKL,LIK,LJL C C canonical ordering: C C we do not need to test or exchange, as we have the function LOCANC c$$$C i (00v-1;ijkiijjkk) C DO KKK=0,LAB-I-J-K-II-JJ-KK-1 PVV(IIVV,KKK)=TP*PVV(IVV,KKK+1)+QZ*QB*PVV(IVV,KKK)+ - DBLE(KKK)*PVV(IVV,KKK-1) END DO IDUM=IIVV IIVV=IVV IVV=IDUM END DO C C (00v;ijkiijj0) -> (00v-1;ijkiijj0) C DO KKK=0,LAB-I-J-K-II-JJ-1 PV(IIV,KKK)=TP*PV(IV,KKK+1)- - QZ*QA*PV(IV,KKK)+DBLE(KKK)*PV(IV,KKK-1) END DO IDUM=IIV IIV=IV IV=IDUM END DO C C (0uv;ij0iijj0) -> (0u-1v;ij0iijj0) C DO JJJ=0,LAB-I-II-J-JJ-1 DO KKK=0,LAB-JJJ-1 PUU(IIUU,JJJ,KKK)=TP*PUU(IUU,JJJ+1,KKK)+ - QY*QB*PUU(IUU,JJJ,KKK)+DBLE(JJJ)*PUU(IUU,JJJ-1,KKK) END DO END DO IDUM=IIUU IIUU=IUU IUU=IDUM END DO C C (0uv;ij0ii00) -> (0u-1v;ij0ii00) C DO JJJ=0,LAB-I-II-J-1 DO KKK=0,LAB-JJJ-1 PU(IIU,JJJ,KKK)=TP*PU(IU,JJJ+1,KKK)- - QY*QA*PU(IU,JJJ,KKK)+DBLE(JJJ)*PU(IU,JJJ-1,KKK) END DO END DO IDUM=IIU IIU=IU IU=IDUM END DO C C (tuv;i00ii00) -> (t-1uv;i00ii00) C DO III=0,LAB-I-II-1 DO JJJ=0,LAB-III-1 DO KKK=0,LAB-III-JJJ-1 PTT(IITT,III,JJJ,KKK)=TP*PTT(ITT,III+1,JJJ,KKK)+ - QX*QB*PTT(ITT,III,JJJ,KKK)+DBLE(III)*PTT(ITT,III-1,JJJ $ ,KKK) END DO END DO END DO INDJ=INDJ+LB-II+1 IDUM=IITT IITT=ITT ITT=IDUM END DO C C (tuv;i00000) -> (t-1uv;i00000) C DO III=0,LAB-I-1 DO JJJ=0,LAB-III-1 DO KKK=0,LAB-III-JJJ-1 PT(IIT,III,JJJ,KKK)=TP*PT(IT,III+1,JJJ,KKK)- - QX*QA*PT(IT,III,JJJ,KKK)+ - DBLE(III)*PT(IT,III-1,JJJ,KKK) END DO END DO END DO INDI=INDI+LA-I+1 IDUM=IIT IIT=IT IT=IDUM END DO C C that was all C RETURN END C SUBROUTINE SSCD(HHHBUF) INCLUDE 'param.h' COMMON /LOCAT/ EXA,EXB,EXC,EXD,XA(3),XB(3),XAB(3),XC(3),XD(3) $ ,XCD(3),P,Q,ALPHA,XP(3),XQ(3),F(4*NLMAX+1),LA,LB,LC,LD $ ,NPRIMA,NPRIMB,NPRIMC,NPRIMD,NPSTA,NPSTB,NPSTC,NPSTD C.. INCLUDE 'common_locat.h' COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),POS(3,NATMX),NZ(NATMX) $ ,NSH(NATMX),NPRIM(NSHLMX),IL(NSHLMX),NZENTR(NSHLMX) $ ,NPST(NSHLMX),NSHLT,LMAX C.. INCLUDE 'common_syst.h' C integrals in hermitian Gaussians COMMON /INTEGH/ R000(LHMAX) C.. INCLUDE 'common_integ.h' COMMON /SPHERI/ SPHCAR(0:NLMAX,NCMAX,NSPMAX),NCART(0:NLMAX) $ ,CARMUL(0:NLMAX,(NLMAX+1)*(NLMAX+2)/2) C.. INCLUDE 'common_spheri.h' COMMON /FLOW/ THRESH,MULINT,LFORM,LMONO,LBIEL,LCART,LKINET LOGICAL LFORM,LMONO,LBIEL,LCART,LKINET C.. INCLUDE 'common_flow.h' COMMON /CONST/ PI,ANTOAU,TP25,ONE C.. INCLUDE 'constants.h' DIMENSION HHHBUF(*) DIMENSION XPQ(3) DIMENSION RCART(NCMAX,NCMAX) DIMENSION RSPHER(NSPMAX,NSPMAX) C C the case (ss|cd) C C for the first couple we have no recursion, only for the second C one we do the McMurchie-Davidson and the Hermite->cartesian->spherical C harmonics C LCD=LC+LD LCFIN=NCART(LC) LDFIN=NCART(LD) IF (LCART) THEN NUMINT=LCFIN*LDFIN ELSE NUMINT=(2*LC+1)*(2*LD+1) END IF DO I=1,NUMINT HHHBUF(I)=0.D0 END DO C DO I=1,LCFIN DO J=1,LDFIN RCART(I,J)=0.D0 END DO END DO C common quantities RRAB=0.D0 RRCD=0.D0 DO I=1,3 XAB(I)=XA(I)-XB(I) XCD(I)=XC(I)-XD(I) RRAB=RRAB+XAB(I)*XAB(I) RRCD=RRCD+XCD(I)*XCD(I) END DO C loop over contractions INDXA=NPSTA DO IPRIMA=1,NPRIMA EXA=EXX(INDXA) COEFFA=COEFF(INDXA) INDXA=INDXA+1 INDXB=NPSTB DO IPRIMB=1,NPRIMB EXB=EXX(INDXB) COEFFB=COEFF(INDXB) INDXB=INDXB+1 P=EXA+EXB DO I=1,3 XP(I)=(EXA*XA(I)+EXB*XB(I))/P END DO XMU=EXA*EXB/P CAB=COEFFA*COEFFB EMU=EXP(-XMU*RRAB) CAB=CAB*EMU INDXC=NPSTC DO IPRIMC=1,NPRIMC EXC=EXX(INDXC) COEFFC=COEFF(INDXC) INDXC=INDXC+1 CABC=CAB*COEFFC INDXD=NPSTD DO IPRIMD=1,NPRIMD EXD=EXX(INDXD) COEFFD=COEFF(INDXD) INDXD=INDXD+1 CABCD=CABC*COEFFD Q=EXC+EXD XNU=EXC*EXD/Q ENU=EXP(-XNU*RRCD) CABCD=CABCD*ENU ALPHA=P*Q/(P+Q) RRPQ=0.D0 DO I=1,3 XQ(I)=(EXC*XC(I)+EXD*XD(I))/Q XPQ(I)=XP(I)-XQ(I) RRPQ=RRPQ+XPQ(I)*XPQ(I) END DO C the arguments for the gamma function PRRPQ=ALPHA*RRPQ NMAX=LCD+1 CALL GAMF(F,PRRPQ,NMAX) CD IONE=1 CD WRITE(6,*) ' 1, F(1) = ',IONE,F(1) C BCON=TP25/(P*Q*SQRT(P+Q)) PIK=-CABCD*BCON CD I=1 CD WRITE(6,*) ' I, F(I) = ',I,F(I) AMUL=1.D0 ACON=ALPHA+ALPHA DO I=2,LCD+1 AMUL=-ACON*AMUL F(I)=F(I)*AMUL CD WRITE(6,*) ' I, F(I) = ',I,F(I) CD WRITE(6,*) C END DO C CALL RMCMUR(R000,F,XPQ,LCD) C C add the correct sign to the R000s C INDX=0 ASIGN=1.D0 DO I=0,LCD BSIGN=ASIGN DO J=0,LCD-I CSIGN=BSIGN DO K=0,LCD-I-J INDX=INDX+1 R000(INDX)=CSIGN*R000(INDX) CSIGN=-CSIGN END DO BSIGN=-BSIGN END DO ASIGN=-ASIGN END DO C C the common factor the cartesian recursion is PIK C CALL PHIREC(RCART,R000,XCD,EXC,EXD,PIK,LC,LD) C C close the loop over the contractions END DO END DO END DO END DO C C C for cartesians we just have to copy the integrals to HHHBUF C IF (LCART) THEN INDX=0 DO I=1,LCFIN II=ICARCAR(LC,I) DO J=1,LDFIN JJ=ICARCAR(LD,J) xmult=carmul(lc,ii)*carmul(ld,jj) INDX=INDX+1 HHHBUF(INDX)=RCART(II,JJ)*xmult END DO END DO ELSE C otherwise we transform the block on spherical harmonics C C the routine transforms via the angular momenta LA and LB C LA=LC LB=LD CALL SPHHAM(RCART,RSPHER) C restore the momenta LA=0 LB=0 INDX=0 DO II=1,2*LC+1 DO JJ=1,2*LD+1 INDX=INDX+1 HHHBUF(INDX)=RSPHER(II,JJ) END DO END DO END IF C RETURN END C SUBROUTINE ABSS(HHHBUF) INCLUDE 'param.h' COMMON /LOCAT/ EXA,EXB,EXC,EXD,XA(3),XB(3),XAB(3),XC(3),XD(3) $ ,XCD(3),P,Q,ALPHA,XP(3),XQ(3),F(4*NLMAX+1),LA,LB,LC,LD $ ,NPRIMA,NPRIMB,NPRIMC,NPRIMD,NPSTA,NPSTB,NPSTC,NPSTD C.. INCLUDE 'common_locat.h' COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),POS(3,NATMX),NZ(NATMX) $ ,NSH(NATMX),NPRIM(NSHLMX),IL(NSHLMX),NZENTR(NSHLMX) $ ,NPST(NSHLMX),NSHLT,LMAX C.. INCLUDE 'common_syst.h' C integrals in hermitian Gaussians COMMON /INTEGH/ R000(LHMAX) C.. INCLUDE 'common_integ.h' COMMON /SPHERI/ SPHCAR(0:NLMAX,NCMAX,NSPMAX),NCART(0:NLMAX) $ ,CARMUL(0:NLMAX,(NLMAX+1)*(NLMAX+2)/2) C.. INCLUDE 'common_spheri.h' COMMON /FLOW/ THRESH,MULINT,LFORM,LMONO,LBIEL,LCART,LKINET LOGICAL LFORM,LMONO,LBIEL,LCART,LKINET C.. INCLUDE 'common_flow.h' COMMON /CONST/ PI,ANTOAU,TP25,ONE C.. INCLUDE 'constants.h' DIMENSION HHHBUF(*) DIMENSION XPQ(3) DIMENSION RCART(NCMAX,NCMAX) DIMENSION RSPHER(NSPMAX,NSPMAX) C C the case (ab|ss) C LAB=LA+LB LAFIN=NCART(LA) LBFIN=NCART(LB) IF (LCART) THEN NUMINT=LAFIN*LBFIN ELSE NUMINT=(2*LA+1)*(2*LB+1) END IF DO I=1,NUMINT HHHBUF(I)=0.D0 END DO C C we should set RCART2 as well to zero as we accumulate for LAB=0 c or LCD=0 through PHIREC C DO I=1,LAFIN DO J=1,LBFIN RCART(I,J)=0.D0 END DO END DO C common quantities RRAB=0.D0 RRCD=0.D0 DO I=1,3 XAB(I)=XA(I)-XB(I) XCD(I)=XC(I)-XD(I) RRAB=RRAB+XAB(I)*XAB(I) RRCD=RRCD+XCD(I)*XCD(I) END DO C loop over contractions INDXA=NPSTA DO IPRIMA=1,NPRIMA EXA=EXX(INDXA) COEFFA=COEFF(INDXA) INDXA=INDXA+1 INDXB=NPSTB DO IPRIMB=1,NPRIMB EXB=EXX(INDXB) COEFFB=COEFF(INDXB) INDXB=INDXB+1 P=EXA+EXB DO I=1,3 XP(I)=(EXA*XA(I)+EXB*XB(I))/P END DO XMU=EXA*EXB/P CAB=COEFFA*COEFFB EMU=EXP(-XMU*RRAB) CAB=CAB*EMU INDXC=NPSTC DO IPRIMC=1,NPRIMC EXC=EXX(INDXC) COEFFC=COEFF(INDXC) INDXC=INDXC+1 CABC=CAB*COEFFC INDXD=NPSTD DO IPRIMD=1,NPRIMD EXD=EXX(INDXD) COEFFD=COEFF(INDXD) INDXD=INDXD+1 CABCD=CABC*COEFFD Q=EXC+EXD XNU=EXC*EXD/Q ENU=EXP(-XNU*RRCD) CABCD=CABCD*ENU ALPHA=P*Q/(P+Q) RRPQ=0.D0 DO I=1,3 XQ(I)=(EXC*XC(I)+EXD*XD(I))/Q XPQ(I)=XP(I)-XQ(I) RRPQ=RRPQ+XPQ(I)*XPQ(I) END DO C the arguments for the gamma function PRRPQ=ALPHA*RRPQ NMAX=LAB+1 CALL GAMF(F,PRRPQ,NMAX) CD IONE=1 CD WRITE(6,*) ' 1, F(1) = ',IONE,F(1) C BCON=TP25/(P*Q*SQRT(P+Q)) PIK=-CABCD*BCON C CD I=1 CD WRITE(6,*) ' I, F(I) = ',I,F(I) AMUL=1.D0 ACON=ALPHA+ALPHA DO I=2,LAB+1 AMUL=-ACON*AMUL F(I)=F(I)*AMUL CD WRITE(6,*) ' I, F(I) = ',I,F(I) CD WRITE(6,*) C END DO C CALL RMCMUR(R000,F,XPQ,LAB) C C in this case we do not need to take care of the sign t'+u'+v' C CALL PHIREC(RCART,R000,XAB,EXA,EXB,PIK,LA,LB) C close the four loops over the four contractions (or shells) END DO END DO END DO END DO C C For cartesians we just have to copy the integrals to HHHBUF IF (LCART) THEN INDX=0 DO I=1,LAFIN II=ICARCAR(LA,I) DO J=1,LBFIN JJ=ICARCAR(LB,J) xmult=carmul(la,ii)*carmul(lb,jj) INDX=INDX+1 HHHBUF(INDX)=RCART(II,JJ)*xmult END DO END DO ELSE C C we have to transform the accumulated Cartesian integrals C on spherical harmonics if it were not integrals (ss|ss) C CALL SPHHAM(RCART,RSPHER) INDX=0 DO II=1,2*LA+1 DO JJ=1,2*LB+1 INDX=INDX+1 HHHBUF(INDX)=RSPHER(II,JJ) END DO END DO END IF C RETURN END C SUBROUTINE CALBI(HHHBUF) INCLUDE 'param.h' COMMON /LOCAT/ EXA,EXB,EXC,EXD,XA(3),XB(3),XAB(3),XC(3),XD(3) $ ,XCD(3),P,Q,ALPHA,XP(3),XQ(3),F(4*NLMAX+1),LA,LB,LC,LD $ ,NPRIMA,NPRIMB,NPRIMC,NPRIMD,NPSTA,NPSTB,NPSTC,NPSTD C.. INCLUDE 'common_locat.h' COMMON /SYST/ NATOM,NBAS,NOCC,NVIRT COMMON /BAS/ EXX(NPRIMX),COEFF(NPRIMX),POS(3,NATMX),NZ(NATMX) $ ,NSH(NATMX),NPRIM(NSHLMX),IL(NSHLMX),NZENTR(NSHLMX) $ ,NPST(NSHLMX),NSHLT,LMAX C.. INCLUDE 'common_syst.h' C integrals in hermitian Gaussians COMMON /INTEGH/ R000(LHMAX) C.. INCLUDE 'common_integ.h' COMMON /SPHERI/ SPHCAR(0:NLMAX,NCMAX,NSPMAX),NCART(0:NLMAX) $ ,CARMUL(0:NLMAX,(NLMAX+1)*(NLMAX+2)/2) C.. INCLUDE 'common_spheri.h' COMMON /FLOW/ THRESH,MULINT,LFORM,LMONO,LBIEL,LCART,LKINET LOGICAL LFORM,LMONO,LBIEL,LCART,LKINET C.. INCLUDE 'common_flow.h' COMMON /CONST/ PI,ANTOAU,TP25,ONE C.. INCLUDE 'constants.h' DIMENSION HHHBUF(*) DIMENSION XPQ(3),XTMP(3) DIMENSION RCART(NCMAX,NCMAX) C DIMENSION RCARTH(NCMAX,NCMAX,165) DIMENSION RCARTF(NCMAX,NCMAX,NCMAX,NCMAX) DIMENSION RCACCU(NCMAX,NCMAX,NCMAX,NCMAX) DIMENSION RSPHER(NSPMAX,NSPMAX) DIMENSION RSAVEH(0:20,0:20,0:20) C we try to program Reine, Tellgren, Helgaker PCCP 9 (2007) 4771 C programming eq 67 and 96, the McMurchie scheme C C well, it is more the lecture notes of the C Sostrup Slot Summer School C C for s functions we have straightforward C (ss|ss) = 2/(pq sqrt(p+q)) pi^5/2 * F_0(alpha RRPQ) C C for (ss|cd) we do the cartesion and spherical recursion on C and D C for (ab|ss) we do the cartesion and spherical recursion on A and B C from the R000(tuv) in these couples C C in general we create all R000(t+t',u+u',v+v') C then we extract all the R000(t+t',u+u',v+v') for a common t',u',v' C into an array R000(tuv) and do the cartesian recursion on that C for all t',u',v' done we get R000(t'u'v') for a common cartesian C couple (jik,lmn) and do the recursion for (i'j'k',l'm'n') C C ---------------------------------------------------------------- C C how many integrals in this batch ? C limits in cartesian indices C save LA and LB c$$$ WRITE(6,*) ' entering CALBI LA,LB,LC,LD = ',LA,LB,LC,LD C C save LA and LB for the transformation cartesian -> spherical C LAS=LA LBS=LB LAB=LA+LB LCD=LC+LD LABCD=LA+LB+LC+LD LAFIN=NCART(LA) LBFIN=NCART(LB) LCFIN=NCART(LC) LDFIN=NCART(LD) IF (LCART) THEN NUMINT=LAFIN*LBFIN*LCFIN*LDFIN ELSE NUMINT=(2*LA+1)*(2*LB+1)*(2*LC+1)*(2*LD+1) END IF DO I=1,NUMINT HHHBUF(I)=0.D0 END DO C C we should set RCART2 as well to zero as we accumulate for LAB=0 c or LCD=0 through PHIREC C NCOUPL=NPRIMA*NPRIMB*NPRIMC*NPRIMD CD WRITE(6,*) NCOUPL,' integrals (ab|cd) ',NUMINT C set the array for the accumulation to zero DO I=1,LAFIN DO J=1,LBFIN DO K=1,LCFIN DO L=1,LDFIN RCACCU(I,J,K,L)=0.D0 END DO END DO END DO END DO C common quantities RRAB=0.D0 RRCD=0.D0 DO I=1,3 XAB(I)=XA(I)-XB(I) XCD(I)=XC(I)-XD(I) RRAB=RRAB+XAB(I)*XAB(I) RRCD=RRCD+XCD(I)*XCD(I) END DO C loop over contractions INDXA=NPSTA DO IPRIMA=1,NPRIMA EXA=EXX(INDXA) COEFFA=COEFF(INDXA) INDXA=INDXA+1 INDXB=NPSTB DO IPRIMB=1,NPRIMB EXB=EXX(INDXB) COEFFB=COEFF(INDXB) INDXB=INDXB+1 P=EXA+EXB DO I=1,3 XP(I)=(EXA*XA(I)+EXB*XB(I))/P END DO XMU=EXA*EXB/P CAB=COEFFA*COEFFB EMU=EXP(-XMU*RRAB) CAB=CAB*EMU INDXC=NPSTC DO IPRIMC=1,NPRIMC EXC=EXX(INDXC) COEFFC=COEFF(INDXC) INDXC=INDXC+1 CABC=CAB*COEFFC INDXD=NPSTD DO IPRIMD=1,NPRIMD EXD=EXX(INDXD) COEFFD=COEFF(INDXD) INDXD=INDXD+1 CABCD=CABC*COEFFD Q=EXC+EXD XNU=EXC*EXD/Q ENU=EXP(-XNU*RRCD) CABCD=CABCD*ENU ALPHA=P*Q/(P+Q) RRPQ=0.D0 DO I=1,3 XQ(I)=(EXC*XC(I)+EXD*XD(I))/Q XPQ(I)=XP(I)-XQ(I) RRPQ=RRPQ+XPQ(I)*XPQ(I) END DO C the arguments for the gamma function PRRPQ=ALPHA*RRPQ NMAX=LABCD+1 CALL GAMF(F,PRRPQ,NMAX) CD IONE=1 CD WRITE(6,*) ' 1, F(1) = ',IONE,F(1) C BCON=TP25/(P*Q*SQRT(P+Q)) PIK=-CABCD*BCON C C for integrals (ss|ss) we have already all C CD I=1 CD WRITE(6,*) ' I, F(I) = ',I,F(I) AMUL=1.D0 ACON=ALPHA+ALPHA DO I=2,LABCD+1 AMUL=-ACON*AMUL F(I)=F(I)*AMUL CD WRITE(6,*) ' I, F(I) = ',I,F(I) CD WRITE(6,*) C END DO C C now we have to do the McMurchie-Davidson reccurrence C we should calculate R_{t+t',u+u',v+v'}(alpha,RPQ) via recursion C C t + u + v =l_a+l_b C t'+ u'+ v'=l_c+l_d -> R_{T,U,V} with T+U+V=l_a+l_b+l_c+l_d C C thus we have to do the same recurrence in RMCMUR, but for higher C indices C C the difference to the 1-electronic integrals comes in the recurrence C of the hermite -> cartesian transformation. C CALL RMCMUR(R000,F,XPQ,LABCD) C C we have the array R(t+t',u+u',v+v') which we have to transform to C cartesian Gaussians Phi(ijk,lmn,IJK,LMN), perhaps in 2 steps: C R(t+t',u+u',v+v') -> PhiH(t,u,v,IJK,LMN) -> Phi(ijk,lmn,IJK,LMN) C C Hermite,Hermite C these we transform via recursion to cartesian integrals C C if l_a+l_b=0 we have to recurse only on C and D C C in the same sense, if lc+ld=0, the recursion runs only over A and B C C we have to transform A+B and C+D C INDX=0 DO I=0,LABCD DO J=0,LABCD-I DO K=0,LABCD-I-J INDX=INDX+1 RSAVEH(I,J,K)=R000(INDX) END DO END DO END DO C C we transform C and D first C INDX2=0 DO I=0,LAB DO J=0,LAB-I DO K=0,LAB-I-J INDX2=INDX2+1 C C for these indices tuv we have to get all the t' u' v' with t'+u'+v'.le C .lc+ld; we have to take care of the sign (-1)^(t'+u'+v') C we fill these in R000, adapt the common locat and transform for C and C D C INDX=0 ASIGN=1.D0 DO II=0,LCD BSIGN=ASIGN DO JJ=0,LCD-II CSIGN=BSIGN DO KK=0,LCD-II-JJ INDX=INDX+1 R000(INDX)=RSAVEH(I+II,J+JJ,K+KK) CSIGN=-CSIGN END DO BSIGN=-BSIGN END DO ASIGN=-ASIGN END DO C set the cartesians to zero DO II=1,LCFIN DO JJ=1,LDFIN RCARTH(II,JJ,INDX2)=0.D0 END DO END DO C recursion for transforming C and D on cartesians DO III=1,3 XTMP(III)=-XCD(III) END DO CALL PHIREC(RCARTH(1,1,INDX2),R000,XTMP,EXC,EXD,-PIK,LC,LD) END DO END DO END DO C C all integrals are half-transformed C C the second halftransformation C DO I=1,LCFIN DO J=1,LDFIN C C the sign is +1 C INDX=0 DO II=0,LAB DO JJ=0,LAB-II DO KK=0,LAB-II-JJ INDX=INDX+1 R000(INDX)=RCARTH(I,J,INDX) END DO END DO END DO C C initialize to zero DO II=1,LAFIN DO JJ=1,LBFIN RCART(II,JJ)=0.D0 END DO END DO C for the second recursion in PHIREC we use PIK C C the sign of the integrals is determined by lc+ld C C the sign seems to be (-1)^LCD IF (MOD(LCD,2).EQ.0) THEN XFACT= 1.D0 ELSE XFACT=-1.D0 END IF CALL PHIREC(RCART,R000,XAB,EXA,EXB,XFACT,LA,LB) DO II=1,LAFIN DO JJ=1,LBFIN RCACCU(II,JJ,I,J)=RCACCU(II,JJ,I,J)+RCART(II,JJ) END DO END DO END DO END DO C C close the four loops over the four contractions (or shells) END DO END DO END DO END DO C C For cartesians we just have to copy the integrals to HHHBUF IF (LCART) THEN INDX=0 DO I=1,LAFIN II=ICARCAR(LA,I) DO J=1,LBFIN JJ=ICARCAR(LB,J) DO K=1,LCFIN KK=ICARCAR(LC,K) DO L=1,LDFIN LL=ICARCAR(LD,L) C normalize correctly xmult=carmul(la,ii)*carmul(lb,jj)*carmul(lc,kk)*carmul(ld,ll) INDX=INDX+1 HHHBUF(INDX)=RCACCU(II,JJ,KK,LL)*xmult END DO END DO END DO END DO ELSE C C we may use the cartesian array RCARTF, as we have less spherical than C cartesian integrals C C save LA, LB LAS=LA LBS=LB DO I=1,LCFIN DO J=1,LDFIN C transform A and B CALL SPHHAM(RCACCU(1,1,I,J),RSPHER) DO II=1,2*LA+1 DO JJ=1,2*LB+1 RCARTF(I,J,II,JJ)=RSPHER(II,JJ) END DO END DO END DO END DO C adapt LA and LB in common locat LA=LC LB=LD INDX=0 DO I=1,2*LAS+1 DO J=1,2*LBS+1 C transform C and D CALL SPHHAM(RCARTF(1,1,I,J),RSPHER) DO II=1,2*LC+1 DO JJ=1,2*LD+1 INDX=INDX+1 HHHBUF(INDX)=RSPHER(II,JJ) END DO END DO END DO END DO C restore LA and LB LA=LAS LB=LBS END IF C RETURN END C FUNCTION LOCANC(I,J,K,L) IMPLICIT NONE INTEGER I,J,K,L LOGICAL LOCANC C C test of canonical ordering C LOCANC=.TRUE. C canonical ordering: C C i 30 SQPIFAC=0.5D0*SQRT(PI/ARG) F(1)=SQPIFAC C upward recursion EXPFAC=EXP(-ARG) TWOARG=2.D0*ARG DO J=1,JMAX-1 F(J+1)=(DBLE(2*J-1)*F(J)-EXPFAC)/DBLE(TWOARG) END DO END IF END IF RETURN END FUNCTION ICARCAR(L,I) IMPLICIT NONE INTEGER ICARCAR,I,L,LL C IF (L.NE.1) THEN LL=(L+1)*(L+2)/2 ICARCAR=LL-I+1 C ELSE C ICARCAR=I C END IF RETURN END