C program POPopt_mi_2023 C C Polarized one-electron potential (POP) fitting (Matrix Inversion) C C June 1992 - Feb 2021 by S. Nakagawa C C 2023 2/22 Cleaned up the source code. C 2/23 A model in which the positive charge of the induced dipole is C placed on the atom is added (ictat=1). c --------------------------------------------------------- c irest = 3 intra & intermolecular atom polarizability fit simple scaling c = 4 thole exponential model van duijnen type a**3/8piexp(-au) c = 5 thole exponential model ponder type 3a/4piexp(-au**3) C = 6 Masia's model Gaussian density screening Atom Type a=0.926 C =43 Thole exponential model van duijnen type a**3/8piexp(-au) C with simple scaling C =53 Thole exponential model ponder type 3a/4piexp(-au**3) C with simple scaling C =63 Masia's model Gaussian density screening Atom Type a=0.926 C with simple scaling C =73 Thole Linear model fe=4v**3-3v**4 ft=v**4 (rij 120.0 ',al C%SN else if(ier.eq.132) then write(7,38) else if(ier.ne. 0 ) then write(7,48) ier endif write(7,2) nsig,xdifmx,ieps,sqdif,idelta,erl2*2 c 2 format(//28x,'*** results of levenberg-marquardt algorithm ***', *//22x,'convergence limit for the variables =',' 1.d-0',i1,e15.3 * /22x,'convergence limit for the ssq =',' 1.d-0',i1,e15.3 * /22x,'convergence limit for the norm of g =',' 1.d-0',i1,e15.3) 8 format(/10x,'failed to recover from singular jacobian') 18 format(/10x,'one of m,n,parm,is incorrect') 28 format(/10x,'marquardt parameter exceeded') 38 format(/10x,'the solution cycled backto singularity') 48 format(/10x,'error indicating parameter =',i5) return end c********************************************************************** subroutine luelmp (a,b,n,x) implicit real*8(a-h,o-z) c dimension a(1),b(1),x(1) c c ----- solution of ly = b ----- c ip=1 iw = 0 do 15 i=1,n t=b(i) im1 = i-1 if(iw .eq. 0) go to 9 ip=ip+iw-1 do 5 k=iw,im1 t = t-a(ip)*x(k) ip=ip+1 5 continue go to 10 9 if(t .ne. 0.d0) iw = i ip = ip+im1 10 x(i)=t*a(ip) ip=ip+1 15 continue c c ----- solution of ux = y ----- c n1 = n+1 do 30 i = 1,n ii = n1-i ip=ip-1 is=ip iq=ii+1 t=x(ii) if(n.lt.iq) go to 25 kk = n do 20 k=iq,n t = t - a(is) * x(kk) kk = kk-1 is = is-kk 20 continue 25 x(ii)=t*a(is) 30 continue return end c********************************************************************** subroutine ludecp (a,ul,n,d1,d2,ier) implicit real*8(a-h,o-z) c dimension a(1),ul(1) c kount=0 d1=1.d0 d2=0.d0 rn = 1.d0/(float(n)*16.d0) ip = 1 ier=0 do 45 i = 1,n iq = ip ir = 1 do 40 j = 1,i x = a(ip) if(j .eq. 1) go to 10 do 5 k=iq,ip1 x = x - ul(k) * ul(ir) ir = ir+1 5 continue 10 if(i.ne.j) go to 30 d1 = d1*x if(a(ip) + x*rn .le. a(ip)) go to 50 15 if(dabs(d1).le.1.d0) go to 20 d1 = d1 * 0.0625d0 d2 = d2 + 4.d0 go to 15 20 if(dabs(d1) .ge. 0.0625d0) go to 25 d1 = d1 * 16.d0 d2 = d2 - 4.d0 go to 20 25 ul(ip) = 1.d0/dsqrt(x) go to 35 30 ul(ip) = x * ul(ir) 35 ip1 = ip ip = ip+1 ir = ir+1 40 continue 45 continue go to 60 50 ier = 129 60 continue return end c********************************************************************** subroutine prepol c c preparation for bond polarizability fit c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/espdat/esfact,iestat,irest,ictat common/comp12/cxnp(i340),cynp(i340),cznp(i340), & fpcx(i340),fpcy(i340),fpcz(i340), & qupot(i340,i340,i20) c common/pdpol1/ibon(i200),jbon(i200),ieqbon(i200),ibpair,iptyp, & nvarp,ivarp(i200),iestah,iatid, & iatm(i200), & nvara,nvart,nvaran,ishl,nvarh, & ifit,ifld,jfld,isym2(i340) common/pdpol2/ & fpchrg(i20),pkpt(i200*2,4), & eqatmi(i200),varai(i200), & alptrn(i200),alpani(i200),alpatm(i200) c common/prpol/ xmid(i200),ymid(i200),zmid(i200), & trnx1(i340,i200),trny1(i340,i200),trnz1(i340,i200), & trnx2(i340,i200),trny2(i340,i200),trnz2(i340,i200), & bonx(i200),bony(i200),bonz(i200),bonlen(i200), & fldlen(i340,i200),anifac(i340,i200),ealen(i340,i200), & falen(i340,i200), & signa(i340,i200),ftmp(i340), & atmx1(i340,i200),atmy1(i340,i200),atmz1(i340,i200), & atmx2(i340,i200),atmy2(i340,i200),atmz2(i340,i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt data zero/0.0d0/ c c midpoint of bond xmid,ymid,zmid c do i=1,ibpair xmid(i)=0.5d0*(xkpt(ibon(i))+xkpt(jbon(i))) ymid(i)=0.5d0*(ykpt(ibon(i))+ykpt(jbon(i))) zmid(i)=0.5d0*(zkpt(ibon(i))+zkpt(jbon(i))) enddo c c electrostatic potential for fixed parameters c do i=1,iestah sump=zero do j=1,iuniq xc =cxnp(i)-xkpt(j) yc =cynp(i)-ykpt(j) zc =cznp(i)-zkpt(j) ealen(i,j)=dsqrt(xc*xc+yc*yc+zc*zc) sump =sump-qkpt(j)/ealen(i,j) enddo ftmp(i) = -sump enddo c c atom atom distances and intramolecular charge field c if(irest.eq.3.or.irest.eq.4.or.irest.eq.5.or.irest.eq.6 & .or.irest.eq.43.or.irest.eq.53 & .or.irest.eq.63.or.irest.eq.73) then do i=1,iuniq do j=1,iuniq ax(i,j)=xkpt(i)-xkpt(j) ay(i,j)=ykpt(i)-ykpt(j) az(i,j)=zkpt(i)-zkpt(j) ar(i,j)=sqrt(ax(i,j)**2+ay(i,j)**2+az(i,j)**2) enddo enddo call imcfld do l=1,ishl do k=1,ifld do j=1,iuniq fldx0(l,k,j)=zero fldy0(l,k,j)=zero fldz0(l,k,j)=zero pfldx(l,k,j)=cfldx(j) pfldy(l,k,j)=cfldy(j) pfldz(l,k,j)=cfldz(j) enddo enddo enddo endif if(irest.eq.3.or.irest.eq.4.or.irest.eq.5.or.irest.eq.6 & .or.irest.eq.43.or.irest.eq.53 & .or.irest.eq.63.or.irest.eq.73) then do l=1,ishl do k=1,ifld do j=1,iuniq xc =fpcx(k)-xkpt(j) yc =fpcy(k)-ykpt(j) zc =fpcz(k)-zkpt(j) falen(k,j)=dsqrt(xc*xc+yc*yc+zc*zc) r3=falen(k,j)*falen(k,j)*falen(k,j) fldx0(l,k,j)=fldx0(l,k,j)+fpchrg(l)*xc/r3 fldy0(l,k,j)=fldy0(l,k,j)+fpchrg(l)*yc/r3 fldz0(l,k,j)=fldz0(l,k,j)+fpchrg(l)*zc/r3 pfldx(l,k,j)=pfldx(l,k,j)+fpchrg(l)*xc/r3 pfldy(l,k,j)=pfldy(l,k,j)+fpchrg(l)*yc/r3 pfldz(l,k,j)=pfldz(l,k,j)+fpchrg(l)*zc/r3 enddo enddo enddo c else do i=1,ifld sump=0.d0 do j=1,iuniq xc =fpcx(i)-xkpt(j) yc =fpcy(i)-ykpt(j) zc =fpcz(i)-zkpt(j) falen(i,j)=dsqrt(xc*xc+yc*yc+zc*zc) fldl2=falen(i,j)*2.d0 atmx1(i,j)=xkpt(j)-xc/fldl2 atmx2(i,j)=xkpt(j)+xc/fldl2 atmy1(i,j)=ykpt(j)-yc/fldl2 atmy2(i,j)=ykpt(j)+yc/fldl2 atmz1(i,j)=zkpt(j)-zc/fldl2 atmz2(i,j)=zkpt(j)+zc/fldl2 enddo enddo endif c c bond length c do i=1,ibpair bonx(i)=xkpt(ibon(i))-xkpt(jbon(i)) bony(i)=ykpt(ibon(i))-ykpt(jbon(i)) bonz(i)=zkpt(ibon(i))-zkpt(jbon(i)) bonlen(i)=dsqrt(bonx(i)**2+bony(i)**2+bonz(i)**2) enddo c c electric field length & anisotoropy factor & c x y z coordinates of transverse induced dipoles c do i=1,ifld do j=1,ibpair fldx=fpcx(i)-xmid(j) fldy=fpcy(i)-ymid(j) fldz=fpcz(i)-zmid(j) fldlen(i,j)=dsqrt(fldx**2+fldy**2+fldz**2) if(falen(i,ibon(j)).ge.falen(i,jbon(j))) & then anifac(i,j)=(-bonx(j)*fldx-bony(j)*fldy & -bonz(j)*fldz)/(fldlen(i,j)*bonlen(j)) signa(i,j)=1.0d0 else anifac(i,j)=(bonx(j)*fldx+bony(j)*fldy & +bonz(j)*fldz)/(fldlen(i,j)*bonlen(j)) signa(i,j)=-1.0d0 endif fldl2=fldlen(i,j)*2.d0 trnx1(i,j)=xmid(j)-fldx/fldl2 trnx2(i,j)=xmid(j)+fldx/fldl2 trny1(i,j)=ymid(j)-fldy/fldl2 trny2(i,j)=ymid(j)+fldy/fldl2 trnz1(i,j)=zmid(j)-fldz/fldl2 trnz2(i,j)=zmid(j)+fldz/fldl2 enddo enddo return end *********************************************************************** subroutine lnkplz c c preparation for connectivity and optimized esp charges c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/espdat/esfact,iestat,irest,ictat common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt character*4 title(20) dimension lnk1234(i200,i200,3),ln(90),kk(i200),k3(i200),kk2(i200) dimension lnk12bf(i200,i200,3) data zero/0.0d0/,one/1.0d0/ C C initial clear or set & distance check C read(4,'(20a4)') title write(6,*) title read(4,*) allcc,alldd,cutc,cutd,factt write(6,*) allcc,alldd,cutc,cutd,factt numc=0 numd=0 do i=1,iuniq do j=1,iuniq flnkc(i,j)=allcc flnkd(i,j)=alldd if(i.eq.j)then flnkc(i,j)=zero flnkd(i,j)=zero endif dis=dsqrt((xkpt(i)-xkpt(j))**2+(ykpt(i)-ykpt(j))**2+ & (zkpt(i)-zkpt(j))**2) if(dis.gt.cutc) then flnkc(i,j)=one numc=numc+1 endif if(dis.gt.cutd) then flnkd(i,j)=zero numd=numd+1 endif enddo enddo write(7,*) ' ' write(7,'(a31,f6.2,a34,f7.2,a12,i6)') & ' initial clear charge ', & allcc,' distance > cut distance set 1.0 ',cutc, & ' cut number ',numc write(7,'(a31,f6.2,a34,f7.2,a12,i6)') & ' initial clear induced dipole ', & alldd,' distance > cut distance set 0.0 ',cutd, & ' cut number ',numd write(7,*) ' ' C C read 1-2 bond data C read(4,'(20a4)') title read(4,*) facc(1),facd(1) write(7,*) ' ' write(7,'(a34,2f7.4)') ' s-factor charge & induced dipole', & facc(1),facd(1) write(7,*) ' ' do i=1,iuniq read(4,'(200i4)') (lnk1234(i,j,1),j=1,iuniq) enddo do i=1,iuniq kk(i)=0 do j=1,iuniq if(lnk1234(i,j,1).ne.0)then kk(i)=kk(i)+1 ln(kk(i))=lnk1234(i,j,1) endif enddo write(7,'(i4,a5,90i4)') kk(i),'%1-2 ',(ln(k),k=1,kk(i)) enddo C C make for & back 1-2 bond data C do i=1,iuniq kk2(i)=kk(i) do j=1,iuniq lnk12bf(i,j,1)=lnk1234(i,j,1) enddo enddo do i=1,iuniq do j=2,iuniq if(lnk1234(i,j,1).ne.0)then k2=lnk1234(i,j,1) kk2(k2)=kk2(k2)+1 lnk12bf(k2,kk2(k2),1)=lnk1234(i,1,1) endif enddo enddo C do i=1,iuniq C write(7,'(i4,a5,90i4)') kk2(i),'%1-2b', C & (lnk12bf(i,k,1),k=1,kk2(i)) C enddo C C make 1-3 data from 1-2 C do i=1,iuniq lnk12bf(i,1,2)=i lnk1234(i,1,2)=i do j=2,iuniq lnk12bf(i,j,2)=0 lnk1234(i,j,2)=0 enddo enddo C do i=1,iuniq k3(i)=1 enddo do i=1,iuniq do j=2,iuniq if(lnk12bf(i,j,1).ne.0)then do k=1,iuniq if(lnk12bf(i,j,1).eq.lnk12bf(k,1,1))then do l=2,kk2(k) if(lnk12bf(k,l,1).ne.lnk12bf(i,1,1))then k3(i)=k3(i)+1 lnk12bf(i,k3(i),2)=lnk12bf(k,l,1) endif enddo endif enddo endif enddo enddo C do i=1,iuniq kka=1 do j=2,iuniq if(lnk12bf(i,j,2).gt.lnk12bf(i,1,2))then kka=kka+1 lnk1234(i,kka,2)=lnk12bf(i,j,2) endif enddo enddo C do i=1,iuniq kka=0 do j=1,iuniq if(lnk1234(i,j,2).ne.0)then kka=kka+1 ln(kka)=lnk1234(i,j,2) endif enddo write(7,'(i4,a5,90i4)') kka,'%1-3 ',(lnk1234(i,j,2),j=1,kka) enddo C C make 1-4 data from 1-3 C do i=1,iuniq lnk12bf(i,1,3)=i lnk1234(i,1,3)=i do j=2,iuniq lnk12bf(i,j,3)=0 lnk1234(i,j,3)=0 enddo enddo C do i=1,iuniq k3(i)=1 enddo do i=1,iuniq do j=2,iuniq if(lnk12bf(i,j,2).ne.0)then do k=1,iuniq if(lnk12bf(i,j,2).eq.lnk12bf(k,1,1))then do l=2,kk2(k) mk=0 do m=2,iuniq if(lnk12bf(k,l,1).eq.lnk12bf(i,m,1))then mk=1 endif enddo if(mk.eq.0)then k3(i)=k3(i)+1 lnk12bf(i,k3(i),3)=lnk12bf(k,l,1) endif enddo endif enddo endif enddo enddo C do i=1,iuniq kka=1 do j=2,iuniq if(lnk12bf(i,j,3).gt.lnk12bf(i,1,3))then kka=kka+1 lnk1234(i,kka,3)=lnk12bf(i,j,3) endif enddo enddo C do i=1,iuniq kka=0 do j=1,iuniq C C for 5 menber ring C if(j.ne.1)then do k=2,iuniq if(lnk1234(i,j,3).eq.lnk1234(i,k,2)) lnk1234(i,j,3)=0 enddo endif C C for 6 menber ring C do k=j+1,iuniq if(lnk1234(i,j,3).eq.lnk1234(i,k,3)) lnk1234(i,k,3)=0 enddo C% if(lnk1234(i,j,3).ne.0)then kka=kka+1 ln(kka)=lnk1234(i,j,3) endif enddo C% do j=1,iuniq lnk1234(i,j,3)=0 enddo do j=1,kka lnk1234(i,j,3)=ln(j) enddo C% write(7,'(i4,a5,90i4)') kka,'%1-4 ',(lnk1234(i,j,3),j=1,kka) enddo C C set scaling 1 1-2 C 2 1-3 C 3 1-4 C do k=2,3 read(4,'(20a4)') title read(4,*) facc(k),facd(k) write(7,*) ' ' write(7,'(a34,2f7.4)') ' s-factor charge & induced dipole', & facc(k),facd(k) write(7,*) ' ' enddo do k=3,1,-1 do i=1,iuniq do j=2,iuniq if(lnk1234(i,j,k).ne.0)then flnkc(lnk1234(i,1,k),lnk1234(i,j,k))=facc(k) flnkd(lnk1234(i,1,k),lnk1234(i,j,k))=facd(k) endif enddo enddo do i=1,iuniq do j=i,iuniq flnkc(j,i)=flnkc(i,j) flnkd(j,i)=flnkd(i,j) enddo enddo enddo C C atomic charge read C read(4,'(20a4)') title pchtot=zero do i=1,iuniq read(4,'(i6,3x,f12.6)') lnk,pch pchin(lnk)=pch pchtot=pchtot+pch enddo if(pchtot.ne.zero)then write(7,*) 'total of esp charges is not zero! ',pchtot endif if(allcc.ne.zero.or.facc(1).ne.zero.or. & facc(2).ne.zero.or.facc(3).ne.zero)then write(7,*) ' ' write(7,*) & ' scale factor for intramolecular charge interaction ' do i=1,iuniq write(7,'(a5,200f5.2)') ' %c ',(flnkc(i,j),j=1,iuniq) enddo endif write(7,*) ' ' c c set default dumping value a c if(irest.eq.4.or.irest.eq.5.or.irest.eq.6 & .or.irest.eq.43.or.irest.eq.53 & .or.irest.eq.63.or.irest.eq.73) then if(factt.lt.zero)then if(irest.eq.4.or.irest.eq.43) factt=1.9088d0 if(irest.eq.5.or.irest.eq.53) factt=0.39d0 if(irest.eq.6) factt=0.8456d0 if(irest.eq.63) factt=0.8456d0 if(irest.eq.73) factt=1.7823d0 endif write(7,*) ' ' write(7,*) 'irest=',irest,' % Dumping Parameter a=', & factt else write(7,*) ' ' write(7,*) & ' scale factor for intramolecular induced dipole interaction' iiu1=1 iiu30=30 numr=iuniq/iiu30 write(7,*) numr numx=iuniq-numr*30 do ii=1,numr write(7,'(i5,a5,i5)') iiu1,' --- ',iiu30 do i=1,iuniq write(7,'(a5,i4,90f4.1)') ' %d ',i,(flnkd(i,j),j=iiu1,iiu30) enddo iiu1=iiu1+30 iiu30=iiu30+30 enddo write(7,'(i5,a5,i5)') iiu1,' --- ',iiu1+numx-1 do i=1,iuniq write(7,'(a5,i4,200f4.1)') ' %d ', & i,(flnkd(i,j),j=iiu1,iiu1+numx-1) enddo endif if(allcc.ne.zero.or.facc(1).ne.zero.or. & facc(2).ne.zero.or.facc(3).ne.zero)then write(7,*) ' ' write(7,*)' scaled charge ' do i=1,iuniq write(7,'(i4,f10.5)') i,pchin(i) enddo endif write(7,*) ' ' return end *********************************************************************** subroutine imcfld c c calculation for intramolecular atomic charge field c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension x(i200,i200),y(i200,i200),z(i200,i200),r3(i200,i200) data zero /0.0d0/ do i=1,iuniq cfldx(i)=zero cfldy(i)=zero cfldz(i)=zero enddo do i=1,iuniq do j=i,iuniq if(i.ne.j)then x(i,j)=xkpt(i)-xkpt(j) x(j,i)=-x(i,j) y(i,j)=ykpt(i)-ykpt(j) y(j,i)=-y(i,j) z(i,j)=zkpt(i)-zkpt(j) z(j,i)=-z(i,j) r3(i,j)=(dsqrt(x(i,j)**2+y(i,j)**2+z(j,i)**2))**3 r3(j,i)=r3(i,j) else x(i,j)=zero y(i,j)=zero z(i,j)=zero r3(i,j)=zero endif enddo enddo do i=1,iuniq do j=1,iuniq if(i.ne.j)then cfldx(i)=cfldx(i)+flnkc(i,j)*pchin(j)*x(i,j)/r3(i,j) cfldy(i)=cfldy(i)+flnkc(i,j)*pchin(j)*y(i,j)/r3(i,j) cfldz(i)=cfldz(i)+flnkc(i,j)*pchin(j)*z(i,j)/r3(i,j) endif enddo enddo return end *********************************************************************** subroutine implst(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c intramolecular polarization last c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/espdat/esfact,iestat,irest,ictat common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & odipx(i200),odipy(i200),odipz(i200),dipmom(i200) data zero /0.0d0/ c c adipx adipy adipz intramolecular induced dipole moments c if(irest.eq.63)then call lstfldms(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) else if(irest.eq.73)then call lstfldli(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) else if(irest.eq.4)then call lstfldt(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) else if(irest.eq.5)then call lstfldp(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) else if(irest.eq.6)then call lstfldm(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) else if(irest.eq.43)then call lstfldts(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) else if(irest.eq.53)then call lstfldps(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) else if(irest.eq.3)then call lstflds(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) endif return end *********************************************************************** subroutine impcyc(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c intramolecular polarization cycle c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/espdat/esfact,iestat,irest,ictat common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & odipx(i200),odipy(i200),odipz(i200),dipmom(i200) data zero /0.0d0/ c c adipx adipy adipz intramolecular induced dipole moments c if(irest.eq.63)then call imdfldms(ll,kk,alpi,xdip,ydip,zdip) else if(irest.eq.73)then call imdfldli(ll,kk,alpi,xdip,ydip,zdip) else if(irest.eq.4)then call imdfldt(ll,kk,alpi,xdip,ydip,zdip) else if(irest.eq.5)then call imdfldp(ll,kk,alpi,xdip,ydip,zdip) else if(irest.eq.6)then call imdfldm(ll,kk,alpi,xdip,ydip,zdip) else if(irest.eq.43)then call imdfldts(ll,kk,alpi,xdip,ydip,zdip) else if(irest.eq.53)then call imdfldps(ll,kk,alpi,xdip,ydip,zdip) else if(irest.eq.3)then call imdflds(ll,kk,alpi,xdip,ydip,zdip) endif C return end *********************************************************************** subroutine imdfldt(ll,kk,alpi,xdip,ydip,zdip) c c irest=4 Matrix Inversion c c calculations for intramolecular dipole field c thole's dipole field tensor scaling c C dumping r3: 1-(a2u2/2+au+1)e(-au) C r5: 1-(a3u3/6+a2u2/2+au+1)e(-au) C C a=2.089 A Thole chem. phys. 59 (1981) 341-350. C a=1.9088 A Duijnen & Swart J. Phys. Chem. A 102 (1998) 2399-2407. C implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/tens/ & txx(i200,i200),txy(i200,i200), & txz(i200,i200), & tyx(i200,i200),tyy(i200,i200), & tyz(i200,i200), & tzx(i200,i200),tzy(i200,i200), & tzz(i200,i200) dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) !*-------------------------------------------------------------------------- dimension A(i200*3,i200*3),DA(i200*3) !*-------------------------------------------------------------------------- data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/ c c thole's exponential scaling parameter is 2.089. c van duijinen 1.9088 c do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=(alpi(i)*alpi(j)) C%SN C%SN avoid /zero 2019.3.31 C%SN if(aa.gt.0.00001d0)then aa=aa**(one/six) u=rx/(aa*bohr) ar1=factt*u ar2=ar1*ar1 ar3=ar1*ar2 ex=exp(-ar1) s0=ar2/two+ar1+one s1=(one-s0*ex)/r3 s2=three*(one-(ar3/six+s0)*ex)/r5 else s1=one/r3 s2=three/r5 endif C txx(i,j)=-(s2*ax(i,j)*ax(i,j)-s1) txy(i,j)=-(s2*ax(i,j)*ay(i,j)) txz(i,j)=-(s2*ax(i,j)*az(i,j)) tyx(i,j)=-(s2*ay(i,j)*ax(i,j)) tyy(i,j)=-(s2*ay(i,j)*ay(i,j)-s1) tyz(i,j)=-(s2*ay(i,j)*az(i,j)) tzx(i,j)=-(s2*az(i,j)*ax(i,j)) tzy(i,j)=-(s2*az(i,j)*ay(i,j)) tzz(i,j)=-(s2*az(i,j)*az(i,j)-s1) C else txx(i,j)=one/alpi(i) txy(i,j)=zero txz(i,j)=zero tyx(i,j)=zero tyy(i,j)=one/alpi(i) tyz(i,j)=zero tzx(i,j)=zero tzy(i,j)=zero tzz(i,j)=one/alpi(i) endif enddo enddo !*---------------------------------------------------------- !* Matrix A !*---------------------------------------------------------- k=1 do i=1,iuniq l=1 do j=1,iuniq A(k,l)=txx(i,j) A(k,l+1)=txy(i,j) A(k,l+2)=txz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+1,l)=tyx(i,j) A(k+1,l+1)=tyy(i,j) A(k+1,l+2)=tyz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+2,l)=tzx(i,j) A(k+2,l+1)=tzy(i,j) A(k+2,l+2)=tzz(i,j) l=l+3 enddo k=k+3 enddo !* call houhol0(ll,kk,iuniq,A,DA) !* !*---------------------------------------------------------- j=0 do i=1,iuniq*3,3 j=j+1 xdip(j)=DA(i) ydip(j)=DA(i+1) zdip(j)=DA(i+2) enddo !*---------------------------------------------------------- return end *********************************************************************** subroutine imdfldp(ll,kk,alpi,xdip,ydip,zdip) c c irest=5 Matrix Inversion c c calculations for intramolecular dipole field c thole's dipole field tensor scaling c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/tens/ & txx(i200,i200),txy(i200,i200), & txz(i200,i200), & tyx(i200,i200),tyy(i200,i200), & tyz(i200,i200), & tzx(i200,i200),tzy(i200,i200), & tzz(i200,i200) dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) !*-------------------------------------------------------------------------- dimension A(i200*3,i200*3),DA(i200*3) !*-------------------------------------------------------------------------- data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,four/4.0d0/ c c Thole's expo -au3 scaling parameter is 0.572 c Ren & Ponder 0.39 c C r3: 1-e(-au3) C r5: 1-(1+au3)e(-au3) C do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=alpi(i)*alpi(j) if(aa.gt.0.00001d0)then aa=aa**(one/six) u=rx/(aa*bohr) au3=factt*u*u*u ex=exp(-au3) s1=(one-ex)/r3 s2=three*(one-(one+au3)*ex)/r5 else s1=one/r3 s2=three/r5 endif C txx(i,j)=-(s2*ax(i,j)*ax(i,j)-s1) txy(i,j)=-(s2*ax(i,j)*ay(i,j)) txz(i,j)=-(s2*ax(i,j)*az(i,j)) tyx(i,j)=-(s2*ax(i,j)*ay(i,j)) tyy(i,j)=-(s2*ay(i,j)*ay(i,j)-s1) tyz(i,j)=-(s2*ay(i,j)*az(i,j)) tzx(i,j)=-(s2*ax(i,j)*az(i,j)) tzy(i,j)=-(s2*ay(i,j)*az(i,j)) tzz(i,j)=-(s2*az(i,j)*az(i,j)-s1) C else txx(i,j)=one/alpi(i) txy(i,j)=zero txz(i,j)=zero tyx(i,j)=zero tyy(i,j)=one/alpi(i) tyz(i,j)=zero tzx(i,j)=zero tzy(i,j)=zero tzz(i,j)=one/alpi(i) endif enddo enddo !*---------------------------------------------------------- !* Matrix A !*---------------------------------------------------------- k=1 do i=1,iuniq l=1 do j=1,iuniq A(k,l)=txx(i,j) A(k,l+1)=txy(i,j) A(k,l+2)=txz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+1,l)=tyx(i,j) A(k+1,l+1)=tyy(i,j) A(k+1,l+2)=tyz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+2,l)=tzx(i,j) A(k+2,l+1)=tzy(i,j) A(k+2,l+2)=tzz(i,j) l=l+3 enddo k=k+3 enddo !* call houhol0(ll,kk,iuniq,A,DA) !* !*---------------------------------------------------------- c calculation for intramolecular induced dipoles !*---------------------------------------------------------- j=0 do i=1,iuniq*3,3 j=j+1 xdip(j)=DA(i) ydip(j)=DA(i+1) zdip(j)=DA(i+2) enddo !*---------------------------------------------------------- return end *********************************************************************** subroutine imdfldli(ll,kk,alpi,xdip,ydip,zdip) c c irest=73 Matrix Inversion c c calculations for intramolecular dipole field c thole's dipole field tensor Linear scaling c C dumping r3: 4v**3-3v**4 C r5: v**4 C C a=1.662 Thole chem. phys. 59 (1981) 341-350. C a=1.7823 Duijnen & Swart J. Phys. Chem. A 102 (1998) 2399-2407. C implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/tens/ & txx(i200,i200),txy(i200,i200), & txz(i200,i200), & tyx(i200,i200),tyy(i200,i200), & tyz(i200,i200), & tzx(i200,i200),tzy(i200,i200), & tzz(i200,i200) dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) !*-------------------------------------------------------------------------- dimension A(i200*3,i200*3),DA(i200*3) !*-------------------------------------------------------------------------- data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,four/4.0d0/ c c thole's exponential scaling parameter is 1.662 c van duijinen 1.7823 c c do i=1,iuniq c xf(i)=pfldx(ll,kk,i) c yf(i)=pfldy(ll,kk,i) c zf(i)=pfldz(ll,kk,i) c enddo do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=(alpi(i)*alpi(j)) C%SN C%SN avoid /zero 2019.3.31 C%SN if(aa.gt.0.0001d0)then aa=aa**(one/six) s=factt*aa v=r1/s if(r1.lt.s) then s1=(four*(v**3)-three*(v**4))/r3 s2=three*(v**4)/r5 else s1=one/r3 s2=three/r5 endif else s1=one/r3 s2=three/r5 endif C txx(i,j)=-(s2*ax(i,j)*ax(i,j)-s1)*flnkd(i,j) txy(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) txz(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tyx(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) tyy(i,j)=-(s2*ay(i,j)*ay(i,j)-s1)*flnkd(i,j) tyz(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzx(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tzy(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzz(i,j)=-(s2*az(i,j)*az(i,j)-s1)*flnkd(i,j) C else txx(i,j)=one/alpi(i) txy(i,j)=zero txz(i,j)=zero tyx(i,j)=zero tyy(i,j)=one/alpi(i) tyz(i,j)=zero tzx(i,j)=zero tzy(i,j)=zero tzz(i,j)=one/alpi(i) endif enddo enddo !*---------------------------------------------------------- !* Matrix A !*---------------------------------------------------------- k=1 do i=1,iuniq l=1 do j=1,iuniq A(k,l)=txx(i,j) A(k,l+1)=txy(i,j) A(k,l+2)=txz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+1,l)=tyx(i,j) A(k+1,l+1)=tyy(i,j) A(k+1,l+2)=tyz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+2,l)=tzx(i,j) A(k+2,l+1)=tzy(i,j) A(k+2,l+2)=tzz(i,j) l=l+3 enddo k=k+3 enddo !* call houhol0(ll,kk,iuniq,A,DA) !* !*---------------------------------------------------------- c calculation for intramolecular induced dipoles !*---------------------------------------------------------- j=0 do i=1,iuniq*3,3 j=j+1 xdip(j)=DA(i) ydip(j)=DA(i+1) zdip(j)=DA(i+2) enddo !*---------------------------------------------------------- return end *********************************************************************** subroutine imdfldts(ll,kk,alpi,xdip,ydip,zdip) c c irest=43 Matrix Inversion c c calculations for intramolecular dipole field c thole's dipole field tensor scaling c C dumping r3: 1-(a2u2/2+au+1)e(-au) C r5: 1-(a3u3/6+a2u2/2+au+1)e(-au) C C a=2.089 A Thole chem. phys. 59 (1981) 341-350. C a=1.9088 A Duijnen & Swart J. Phys. Chem. A 102 (1998) 2399-2407. C implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/tens/ & txx(i200,i200),txy(i200,i200), & txz(i200,i200), & tyx(i200,i200),tyy(i200,i200), & tyz(i200,i200), & tzx(i200,i200),tzy(i200,i200), & tzz(i200,i200) dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) !*-------------------------------------------------------------------------- dimension A(i200*3,i200*3),DA(i200*3) !*-------------------------------------------------------------------------- data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/ c c thole's exponential scaling parameter is 2.089. c van duijinen 1.9088 c c do i=1,iuniq c xf(i)=pfldx(ll,kk,i) c yf(i)=pfldy(ll,kk,i) c zf(i)=pfldz(ll,kk,i) c enddo do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=(alpi(i)*alpi(j)) C C avoid /zero 2019.3.31 C if(aa.gt.0.0001d0)then aa=aa**(one/six) u=rx/(aa*bohr) ar1=factt*u ar2=ar1*ar1 ar3=ar1*ar2 ex=exp(-ar1) s0=ar2/two+ar1+one s1=(one-s0*ex)/r3 s2=three*(one-(ar3/six+s0)*ex)/r5 else s1=one/r3 s2=three/r5 endif C txx(i,j)=-(s2*ax(i,j)*ax(i,j)-s1)*flnkd(i,j) txy(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) txz(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tyx(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) tyy(i,j)=-(s2*ay(i,j)*ay(i,j)-s1)*flnkd(i,j) tyz(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzx(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tzy(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzz(i,j)=-(s2*az(i,j)*az(i,j)-s1)*flnkd(i,j) C else txx(i,j)=one/alpi(i) txy(i,j)=zero txz(i,j)=zero tyx(i,j)=zero tyy(i,j)=one/alpi(i) tyz(i,j)=zero tzx(i,j)=zero tzy(i,j)=zero tzz(i,j)=one/alpi(i) endif enddo enddo !*---------------------------------------------------------- !* Matrix A !*---------------------------------------------------------- k=1 do i=1,iuniq l=1 do j=1,iuniq A(k,l)=txx(i,j) A(k,l+1)=txy(i,j) A(k,l+2)=txz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+1,l)=tyx(i,j) A(k+1,l+1)=tyy(i,j) A(k+1,l+2)=tyz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+2,l)=tzx(i,j) A(k+2,l+1)=tzy(i,j) A(k+2,l+2)=tzz(i,j) l=l+3 enddo k=k+3 enddo !* call houhol0(ll,kk,iuniq,A,DA) !* !*---------------------------------------------------------- c calculation for intramolecular induced dipoles !*---------------------------------------------------------- j=0 do i=1,iuniq*3,3 j=j+1 xdip(j)=DA(i) ydip(j)=DA(i+1) zdip(j)=DA(i+2) enddo !*---------------------------------------------------------- return end *********************************************************************** subroutine imdfldps(ll,kk,alpi,xdip,ydip,zdip) c c irest=53 Matrix Inversion c c calculations for intramolecular dipole field c thole's dipole field tensor scaling c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/tens/ & txx(i200,i200),txy(i200,i200), & txz(i200,i200), & tyx(i200,i200),tyy(i200,i200), & tyz(i200,i200), & tzx(i200,i200),tzy(i200,i200), & tzz(i200,i200) dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) !*-------------------------------------------------------------------------- dimension A(i200*3,i200*3),DA(i200*3) !*-------------------------------------------------------------------------- data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,four/4.0d0/ c c Thole's expo -au3 scaling parameter is 0.572 c Ren & Ponder 0.39 c C r3: 1-e(-au3) C r5: 1-(1+au3)e(-au3) C do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=alpi(i)*alpi(j) if(aa.gt.0.0001d0)then aa=aa**(one/six) u=rx/(aa*bohr) au3=factt*u*u*u ex=exp(-au3) s1=(one-ex)/r3 s2=three*(one-(one+au3)*ex)/r5 else s1=one/r3 s2=three/r5 endif C txx(i,j)=-(s2*ax(i,j)*ax(i,j)-s1)*flnkd(i,j) txy(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) txz(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tyx(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) tyy(i,j)=-(s2*ay(i,j)*ay(i,j)-s1)*flnkd(i,j) tyz(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzx(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tzy(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzz(i,j)=-(s2*az(i,j)*az(i,j)-s1)*flnkd(i,j) C else txx(i,j)=one/alpi(i) txy(i,j)=zero txz(i,j)=zero tyx(i,j)=zero tyy(i,j)=one/alpi(i) tyz(i,j)=zero tzx(i,j)=zero tzy(i,j)=zero tzz(i,j)=one/alpi(i) endif enddo enddo !*---------------------------------------------------------- !* Matrix A !*---------------------------------------------------------- k=1 do i=1,iuniq l=1 do j=1,iuniq A(k,l)=txx(i,j) A(k,l+1)=txy(i,j) A(k,l+2)=txz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+1,l)=tyx(i,j) A(k+1,l+1)=tyy(i,j) A(k+1,l+2)=tyz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+2,l)=tzx(i,j) A(k+2,l+1)=tzy(i,j) A(k+2,l+2)=tzz(i,j) l=l+3 enddo k=k+3 enddo !* call houhol0(ll,kk,iuniq,A,DA) !* !*---------------------------------------------------------- c calculation for intramolecular induced dipoles !*---------------------------------------------------------- j=0 do i=1,iuniq*3,3 j=j+1 xdip(j)=DA(i) ydip(j)=DA(i+1) zdip(j)=DA(i+2) enddo !*---------------------------------------------------------- * write(6,'(a27,10f13.6)') '1 xyzdip alpi pfldxyz xyzf ', * & xdip(1),ydip(1),zdip(1),alpi(1), * & pfldx(ll,kk,1),pfldy(ll,kk,1),pfldz(ll,kk,1), * & xf(1),yf(1),zf(1) return end *********************************************************************** subroutine imdfldm(ll,kk,alpi,xdip,ydip,zdip) c c irest=6 Matrix Inversion c c calculations for intramolecular dipole field C Masia's model Gaussian density screening Atom Type a=0.8456 C 0.8456 from J. Wang st al. JCTC 2019 15 1146 c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/tens/ & txx(i200,i200),txy(i200,i200), & txz(i200,i200), & tyx(i200,i200),tyy(i200,i200), & tyz(i200,i200), & tzx(i200,i200),tzy(i200,i200), & tzz(i200,i200) dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) !*-------------------------------------------------------------------------- dimension A(i200*3,i200*3),DA(i200*3) !*-------------------------------------------------------------------------- data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,pa/3.1415926d0/ C co0=two/(three*dsqrt(two*pa)) othr=one/three co1=co0**(-othr) co2=two/(dsqrt(pa)) C do i=1,iuniq do j=1,iuniq if(i.ne.j)then r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 C bi=factt*co1*(alpi(i)**(-othr)) bj=factt*co1*(alpi(j)**(-othr)) bibj=dsqrt(bi**2+bj**2) bij=bi*bj/bibj sij=bij*r1 ex=co2*sij*exp(-(sij**2)) eef=derf(sij) epa=one+(two*(sij**2)/three) if(bibj.gt.0.0001d0)then s1=(eef-ex)/r3 s2=three*(eef-ex*epa)/r5 else s1=one/r3 s2=three/r5 endif C txx(i,j)=-(s2*ax(i,j)*ax(i,j)-s1) txy(i,j)=-(s2*ax(i,j)*ay(i,j)) txz(i,j)=-(s2*ax(i,j)*az(i,j)) tyx(i,j)=-(s2*ax(i,j)*ay(i,j)) tyy(i,j)=-(s2*ay(i,j)*ay(i,j)-s1) tyz(i,j)=-(s2*ay(i,j)*az(i,j)) tzx(i,j)=-(s2*ax(i,j)*az(i,j)) tzy(i,j)=-(s2*ay(i,j)*az(i,j)) tzz(i,j)=-(s2*az(i,j)*az(i,j)-s1) C else txx(i,j)=one/alpi(i) txy(i,j)=zero txz(i,j)=zero tyx(i,j)=zero tyy(i,j)=one/alpi(i) tyz(i,j)=zero tzx(i,j)=zero tzy(i,j)=zero tzz(i,j)=one/alpi(i) endif enddo enddo !*---------------------------------------------------------- !* Matrix A !*---------------------------------------------------------- k=1 do i=1,iuniq l=1 do j=1,iuniq A(k,l)=txx(i,j) A(k,l+1)=txy(i,j) A(k,l+2)=txz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+1,l)=tyx(i,j) A(k+1,l+1)=tyy(i,j) A(k+1,l+2)=tyz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+2,l)=tzx(i,j) A(k+2,l+1)=tzy(i,j) A(k+2,l+2)=tzz(i,j) l=l+3 enddo k=k+3 enddo !* call houhol0(ll,kk,iuniq,A,DA) !* !*---------------------------------------------------------- c calculation for intramolecular induced dipoles !*---------------------------------------------------------- j=0 do i=1,iuniq*3,3 j=j+1 xdip(j)=DA(i) ydip(j)=DA(i+1) zdip(j)=DA(i+2) enddo !*---------------------------------------------------------- return end *********************************************************************** subroutine imdfldms(ll,kk,alpi,xdip,ydip,zdip) c c irest=63 Matrix Inversion c c calculations for intramolecular dipole field C Masia's model Gaussian density screening Atom Type a=0.8456 C 0.8456 from J. Wang st al. JCTC 2019 15 1146 c with simple scaling c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/tens/ & txx(i200,i200),txy(i200,i200), & txz(i200,i200), & tyx(i200,i200),tyy(i200,i200), & tyz(i200,i200), & tzx(i200,i200),tzy(i200,i200), & tzz(i200,i200) dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) !*-------------------------------------------------------------------------- dimension A(i200*3,i200*3),DA(i200*3) !*-------------------------------------------------------------------------- data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,pa/3.1415926d0/ C co0=two/(three*dsqrt(two*pa)) othr=one/three co1=co0**(-othr) co2=two/(dsqrt(pa)) C do i=1,iuniq do j=1,iuniq if(i.ne.j)then r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 C bi=factt*co1*(alpi(i)**(-othr)) bj=factt*co1*(alpi(j)**(-othr)) bibj=dsqrt(bi**2+bj**2) bij=bi*bj/bibj sij=bij*r1 ex=co2*sij*exp(-(sij**2)) eef=derf(sij) epa=one+(two*(sij**2)/three) if(bibj.gt.0.0001d0)then s1=(eef-ex)/r3 s2=three*(eef-ex*epa)/r5 else s1=one/r3 s2=three/r5 endif C txx(i,j)=-(s2*ax(i,j)*ax(i,j)-s1)*flnkd(i,j) txy(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) txz(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tyx(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) tyy(i,j)=-(s2*ay(i,j)*ay(i,j)-s1)*flnkd(i,j) tyz(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzx(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tzy(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzz(i,j)=-(s2*az(i,j)*az(i,j)-s1)*flnkd(i,j) C else txx(i,j)=one/alpi(i) txy(i,j)=zero txz(i,j)=zero tyx(i,j)=zero tyy(i,j)=one/alpi(i) tyz(i,j)=zero tzx(i,j)=zero tzy(i,j)=zero tzz(i,j)=one/alpi(i) endif enddo enddo !*---------------------------------------------------------- !* Matrix A !*---------------------------------------------------------- k=1 do i=1,iuniq l=1 do j=1,iuniq A(k,l)=txx(i,j) A(k,l+1)=txy(i,j) A(k,l+2)=txz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+1,l)=tyx(i,j) A(k+1,l+1)=tyy(i,j) A(k+1,l+2)=tyz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+2,l)=tzx(i,j) A(k+2,l+1)=tzy(i,j) A(k+2,l+2)=tzz(i,j) l=l+3 enddo k=k+3 enddo !* call houhol0(ll,kk,iuniq,A,DA) !* !*---------------------------------------------------------- c calculation for intramolecular induced dipoles !*---------------------------------------------------------- j=0 do i=1,iuniq*3,3 j=j+1 xdip(j)=DA(i) ydip(j)=DA(i+1) zdip(j)=DA(i+2) enddo !*---------------------------------------------------------- return end *********************************************************************** subroutine indchg(adipx,adipy,adipz,xp,yp,zp,xm,ym,zm,q) c c Calculations for induced charges and positions ictat=0 c induced dipole length is 1.0 c The center of the induced dipole is placed on the atom. (- 0.5 atm 0.5 +) c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) dimension adipx(i200),adipy(i200),adipz(i200), & xp(i200),yp(i200),zp(i200),xm(i200),ym(i200),zm(i200), & q(i200) data d05/0.5d0/,zero/0.0d0/ do i=1,iuniq q(i)=dsqrt(adipx(i)**2+adipy(i)**2+adipz(i)**2) if(q(i).eq.zero)then xh=zero yh=zero zh=zero else xh=d05*adipx(i)/q(i) yh=d05*adipy(i)/q(i) zh=d05*adipz(i)/q(i) endif xp(i)=xkpt(i)+xh yp(i)=ykpt(i)+yh zp(i)=zkpt(i)+zh xm(i)=xkpt(i)-xh ym(i)=ykpt(i)-yh zm(i)=zkpt(i)-zh enddo return end *********************************************************************** subroutine indchga(adipx,adipy,adipz,xp,yp,zp,xm,ym,zm,q) c c Calculations for induced charges and positions ictat=1 c induced dipole length is 1.0 c The center of the induced dipole is placed on the atom. C A + delta charge is placed on the atom. C A - delta charge is located 1 Bohr from the atom. c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) dimension adipx(i200),adipy(i200),adipz(i200), & xp(i200),yp(i200),zp(i200),xm(i200),ym(i200),zm(i200), & q(i200) data d05/0.5d0/,zero/0.0d0/ do i=1,iuniq q(i)=dsqrt(adipx(i)**2+adipy(i)**2+adipz(i)**2) if(q(i).eq.zero)then xh=zero yh=zero zh=zero else xh=adipx(i)/q(i) yh=adipy(i)/q(i) zh=adipz(i)/q(i) endif xp(i)=xkpt(i)+xh yp(i)=ykpt(i)+yh zp(i)=zkpt(i)+zh xm(i)=xkpt(i) ym(i)=ykpt(i) zm(i)=zkpt(i) enddo return end *********************************************************************** subroutine intrapop(jfirs,f) c c In addition to a field test charge, intramolecular polarization c from esp charges & induced dipoles is included. c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/espdat/esfact,iestat,irest,ictat common/comp12/cxnp(i340),cynp(i340),cznp(i340), & fpcx(i340),fpcy(i340),fpcz(i340), & qupot(i340,i340,i20) c common/pdpol1/ibon(i200),jbon(i200),ieqbon(i200),ibpair,iptyp, & nvarp,ivarp(i200),iestah,iatid, & iatm(i200), & nvara,nvart,nvaran,ishl,nvarh, & ifit,ifld,jfld,isym2(i340) common/pdpol2/ & fpchrg(i20),pkpt(i200*2,4), & eqatmi(i200),varai(i200), & alptrn(i200),alpani(i200),alpatm(i200) c common/prpol/ xmid(i200),ymid(i200),zmid(i200), & trnx1(i340,i200),trny1(i340,i200),trnz1(i340,i200), & trnx2(i340,i200),trny2(i340,i200),trnz2(i340,i200), & bonx(i200),bony(i200),bonz(i200),bonlen(i200), & fldlen(i340,i200),anifac(i340,i200),ealen(i340,i200), & falen(i340,i200), & signa(i340,i200),ftmp(i340), & atmx1(i340,i200),atmy1(i340,i200),atmz1(i340,i200), & atmx2(i340,i200),atmy2(i340,i200),atmz2(i340,i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/odipl/oxdip(i20,i340,i200),oydip(i20,i340,i200), & ozdip(i20,i340,i200) dimension var(1),f(1) dimension dltaq(i200) dimension dx(i200),dy(i200),dz(i200),xp(i200),yp(i200),zp(i200), & xm(i200),ym(i200),zm(i200),q(i200),alpi(i200), & ddx(i200),ddy(i200),ddz(i200) data aukcal /627.509541d0/ c kk=0 do l=1,ishl do k=1,ifld do j=1,iatid jj=jfirs+j alpi(j)=pkpt(jj,1) dx(j)=alpi(j)*pfldx(l,k,j) dy(j)=alpi(j)*pfldy(l,k,j) dz(j)=alpi(j)*pfldz(l,k,j) enddo call impcyc(l,k,dx,dy,dz,alpi,ddx,ddy,ddz) C C dipole moment --> common odipl --> subr potout C do j=1,iatid oxdip(l,k,j)=ddx(j) oydip(l,k,j)=ddy(j) ozdip(l,k,j)=ddz(j) enddo C if(ictat.eq.1)then call indchga(ddx,ddy,ddz,xp,yp,zp,xm,ym,zm,q) else call indchg(ddx,ddy,ddz,xp,yp,zp,xm,ym,zm,q) endif C do i=1,iestah kk=kk+1 do j=1,iatid xa =cxnp(i)-xp(j) ya =cynp(i)-yp(j) za =cznp(i)-zp(j) ra =dsqrt(xa*xa+ya*ya+za*za) xb =cxnp(i)-xm(j) yb =cynp(i)-ym(j) zb =cznp(i)-zm(j) rb =dsqrt(xb*xb+yb*yb+zb*zb) f(kk)=f(kk)-q(j)/ra+q(j)/rb enddo enddo enddo enddo return end *********************************************************************** subroutine intralst(jfirs,f) c c in addition to a field test charge, intramolecular polarization c from esp charges & induced dipoles is included. c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/espdat/esfact,iestat,irest,ictat common/comp12/cxnp(i340),cynp(i340),cznp(i340), & fpcx(i340),fpcy(i340),fpcz(i340), & qupot(i340,i340,i20) c common/pdpol1/ibon(i200),jbon(i200),ieqbon(i200),ibpair,iptyp, & nvarp,ivarp(i200),iestah,iatid, & iatm(i200), & nvara,nvart,nvaran,ishl,nvarh, & ifit,ifld,jfld,isym2(i340) common/pdpol2/ & fpchrg(i20),pkpt(i200*2,4), & eqatmi(i200),varai(i200), & alptrn(i200),alpani(i200),alpatm(i200) c common/prpol/ xmid(i200),ymid(i200),zmid(i200), & trnx1(i340,i200),trny1(i340,i200),trnz1(i340,i200), & trnx2(i340,i200),trny2(i340,i200),trnz2(i340,i200), & bonx(i200),bony(i200),bonz(i200),bonlen(i200), & fldlen(i340,i200),anifac(i340,i200),ealen(i340,i200), & falen(i340,i200), & signa(i340,i200),ftmp(i340), & atmx1(i340,i200),atmy1(i340,i200),atmz1(i340,i200), & atmx2(i340,i200),atmy2(i340,i200),atmz2(i340,i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/enedip/ upol(i340,i20), & cdpx(i340,i20),cdpy(i340,i20),cdpz(i340,i20) dimension dltaq(i200) dimension dx(i200),dy(i200),dz(i200),xp(i200),yp(i200),zp(i200), & xm(i200),ym(i200),zm(i200),q(i200),alpi(i200), & ddx(i200),ddy(i200),ddz(i200) data aukcal /627.509541d0/ c kk=0 do l=1,ishl do k=1,ifld do j=1,iatid jj=jfirs+j fldx=pfldx(l,k,j) fldy=pfldy(l,k,j) fldz=pfldz(l,k,j) alpi(j)=pkpt(jj,1) dx(j)=alpi(j)*fldx dy(j)=alpi(j)*fldy dz(j)=alpi(j)*fldz enddo call implst(l,k,dx,dy,dz,alpi,ddx,ddy,ddz) do j=1,iatid cdpx(k,l)=cdpx(k,l)-ddx(j) cdpy(k,l)=cdpy(k,l)-ddy(j) cdpz(k,l)=cdpz(k,l)-ddz(j) ene=ddx(j)*fldx0(l,k,j)+ddy(j)*fldy0(l,k,j) & +ddz(j)*fldz0(l,k,j) upol(k,l)=upol(k,l)-0.5d0*ene enddo enddo enddo return end *********************************************************************** subroutine lstflds(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c irest=3 last c c calculations for intramolecular dipole field c simple scaling model c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/tens/ & txx(i200,i200),txy(i200,i200), & txz(i200,i200), & tyx(i200,i200),tyy(i200,i200), & tyz(i200,i200), & tzx(i200,i200),tzy(i200,i200), & tzz(i200,i200) dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/ c do i=1,iuniq xf(i)=pfldx(ll,kk,i) yf(i)=pfldy(ll,kk,i) zf(i)=pfldz(ll,kk,i) enddo do i=1,iuniq do j=1,iuniq if(i.ne.j)then r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 s1=one/r3 s2=three/r5 C txx(i,j)=-(s2*ax(i,j)*ax(i,j)-s1)*flnkd(i,j) txy(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) txz(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tyx(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) tyy(i,j)=-(s2*ay(i,j)*ay(i,j)-s1)*flnkd(i,j) tyz(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzx(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tzy(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzz(i,j)=-(s2*az(i,j)*az(i,j)-s1)*flnkd(i,j) C xf(i)=xf(i)-(txx(i,j)*adipx(j)+ & txy(i,j)*adipy(j)+ & txz(i,j)*adipz(j)) yf(i)=yf(i)-(tyx(i,j)*adipx(j)+ & tyy(i,j)*adipy(j)+ & tyz(i,j)*adipz(j)) zf(i)=zf(i)-(tzx(i,j)*adipx(j)+ & tzy(i,j)*adipy(j)+ & tzz(i,j)*adipz(j)) else txx(i,j)=one/alpi(i) txy(i,j)=zero txz(i,j)=zero tyx(i,j)=zero tyy(i,j)=one/alpi(i) tyz(i,j)=zero tzx(i,j)=zero tzy(i,j)=zero tzz(i,j)=one/alpi(i) endif enddo enddo c c calculation for intramolecular induced dipoles c do i=1,iuniq xdip(i)=alpi(i)*xf(i) ydip(i)=alpi(i)*yf(i) zdip(i)=alpi(i)*zf(i) enddo return end *********************************************************************** subroutine lstfldt(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c irest=4 c c calculations for intramolecular dipole field c thole's dipole field tensor scaling c C dumping r3: 1-(a2u2/2+au+1)e(-au) C r5: 1-(a3u3/6+a2u2/2+au+1)e(-au) C C a=2.089 A Thole chem. phys. 59 (1981) 341-350. C a=1.9088 A Duijnen & Swart J. Phys. Chem. A 102 (1998) 2399-2407. C implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/ c c thole's exponential scaling parameter is 2.089. c van duijinen 1.9088 c do i=1,iuniq xf(i)=pfldx(ll,kk,i) yf(i)=pfldy(ll,kk,i) zf(i)=pfldz(ll,kk,i) enddo do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=(alpi(i)*alpi(j)) C%SN C%SN avoid /zero 2019.3.31 C%SN if(aa.gt.0.00001d0)then aa=aa**(one/six) u=rx/(aa*bohr) ar1=factt*u ar2=ar1*ar1 ar3=ar1*ar2 ex=exp(-ar1) s0=ar2/two+ar1+one s1=(one-s0*ex)/r3 s2=three*(one-(ar3/six+s0)*ex)/r5 else s1=one/r3 s2=three/r5 endif C%SN xf(i)=xf(i)+((s2*ax(i,j)*ax(i,j)-s1)*adipx(j)+ & s2*ax(i,j)*ay(i,j)*adipy(j)+ & s2*ax(i,j)*az(i,j)*adipz(j)) yf(i)=yf(i)+ (s2*ax(i,j)*ay(i,j)*adipx(j)+ & (s2*ay(i,j)*ay(i,j)-s1)*adipy(j)+ & s2*ay(i,j)*az(i,j)*adipz(j)) zf(i)=zf(i)+ (s2*ax(i,j)*az(i,j)*adipx(j)+ & s2*ay(i,j)*az(i,j)*adipy(j)+ & (s2*az(i,j)*az(i,j)-s1)*adipz(j)) endif enddo enddo c c calculation for intramolecular induced dipoles c do i=1,iuniq xdip(i)=alpi(i)*xf(i) ydip(i)=alpi(i)*yf(i) zdip(i)=alpi(i)*zf(i) enddo return end *********************************************************************** subroutine lastfldp(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c irest=5 c c calculations for intramolecular dipole field c thole's dipole field tensor scaling c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,four/4.0d0/ c c Thole's expo -au3 scaling parameter is 0.572 c Ren & Ponder 0.39 c C r3: 1-e(-au3) C r5: 1-(1+au3)e(-au3) C do i=1,iuniq xf(i)=pfldx(ll,kk,i) yf(i)=pfldy(ll,kk,i) zf(i)=pfldz(ll,kk,i) enddo do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=alpi(i)*alpi(j) if(aa.gt.0.00001d0)then aa=aa**(one/six) u=rx/(aa*bohr) au3=factt*u*u*u ex=exp(-au3) s1=(one-ex)/r3 s2=three*(one-(one+au3)*ex)/r5 else s1=one/r3 s2=three/r5 endif xf(i)=xf(i)+((s2*ax(i,j)*ax(i,j)-s1)*adipx(j)+ & s2*ax(i,j)*ay(i,j)*adipy(j)+ & s2*ax(i,j)*az(i,j)*adipz(j)) yf(i)=yf(i)+ (s2*ax(i,j)*ay(i,j)*adipx(j)+ & (s2*ay(i,j)*ay(i,j)-s1)*adipy(j)+ & s2*ay(i,j)*az(i,j)*adipz(j)) zf(i)=zf(i)+ (s2*ax(i,j)*az(i,j)*adipx(j)+ & s2*ay(i,j)*az(i,j)*adipy(j)+ & (s2*az(i,j)*az(i,j)-s1)*adipz(j)) endif enddo enddo c c calculation for intramolecular induced dipoles c do i=1,iuniq xdip(i)=alpi(i)*xf(i) ydip(i)=alpi(i)*yf(i) zdip(i)=alpi(i)*zf(i) enddo return end *********************************************************************** subroutine lstfldli(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c irest=73 2020.12.18 c c calculations for intramolecular dipole field c thole's dipole field tensor Linear scaling c C dumping r3: 4v**3-3v**4 C r5: v**4 C C a=1.662 Thole chem. phys. 59 (1981) 341-350. C a=1.7823 Duijnen & Swart J. Phys. Chem. A 102 (1998) 2399-2407. C implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,four/4.0d0/ c c thole's exponential scaling parameter is 1.662 c van duijinen 1.7823 c do i=1,iuniq xf(i)=pfldx(ll,kk,i) yf(i)=pfldy(ll,kk,i) zf(i)=pfldz(ll,kk,i) enddo do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=(alpi(i)*alpi(j)) C%SN C%SN avoid /zero 2019.3.31 C%SN if(aa.gt.0.0001d0)then aa=aa**(one/six) s=factt*aa v=r1/s if(r1.lt.s) then s1=(four*(v**3)-three*(v**4))/r3 s2=three*(v**4)/r5 else s1=one/r3 s2=three/r5 endif else s1=one/r3 s2=three/r5 endif C%SN xf(i)=xf(i)+((s2*ax(i,j)*ax(i,j)-s1)*adipx(j)+ & s2*ax(i,j)*ay(i,j)*adipy(j)+ & s2*ax(i,j)*az(i,j)*adipz(j))*flnkd(i,j) yf(i)=yf(i)+ (s2*ax(i,j)*ay(i,j)*adipx(j)+ & (s2*ay(i,j)*ay(i,j)-s1)*adipy(j)+ & s2*ay(i,j)*az(i,j)*adipz(j))*flnkd(i,j) zf(i)=zf(i)+ (s2*ax(i,j)*az(i,j)*adipx(j)+ & s2*ay(i,j)*az(i,j)*adipy(j)+ & (s2*az(i,j)*az(i,j)-s1)*adipz(j))*flnkd(i,j) endif enddo enddo c c calculation for intramolecular induced dipoles c do i=1,iuniq xdip(i)=alpi(i)*xf(i) ydip(i)=alpi(i)*yf(i) zdip(i)=alpi(i)*zf(i) enddo return end *********************************************************************** subroutine lstfldts(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c irest=43 2019.8.15 9.21 dabs c c calculations for intramolecular dipole field c thole's dipole field tensor scaling c C dumping r3: 1-(a2u2/2+au+1)e(-au) C r5: 1-(a3u3/6+a2u2/2+au+1)e(-au) C C a=2.089 A Thole chem. phys. 59 (1981) 341-350. C a=1.9088 A Duijnen & Swart J. Phys. Chem. A 102 (1998) 2399-2407. C implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/ c c thole's exponential scaling parameter is 2.089. c van duijinen 1.9088 c do i=1,iuniq xf(i)=pfldx(ll,kk,i) yf(i)=pfldy(ll,kk,i) zf(i)=pfldz(ll,kk,i) enddo do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=(alpi(i)*alpi(j)) C%SN C%SN avoid /zero 2019.3.31 C%SN if(aa.gt.0.0001d0)then aa=aa**(one/six) u=rx/(aa*bohr) ar1=factt*u ar2=ar1*ar1 ar3=ar1*ar2 ex=exp(-ar1) s0=ar2/two+ar1+one s1=(one-s0*ex)/r3 s2=three*(one-(ar3/six+s0)*ex)/r5 else s1=one/r3 s2=three/r5 endif C%SN xf(i)=xf(i)+((s2*ax(i,j)*ax(i,j)-s1)*adipx(j)+ & s2*ax(i,j)*ay(i,j)*adipy(j)+ & s2*ax(i,j)*az(i,j)*adipz(j))*flnkd(i,j) yf(i)=yf(i)+ (s2*ax(i,j)*ay(i,j)*adipx(j)+ & (s2*ay(i,j)*ay(i,j)-s1)*adipy(j)+ & s2*ay(i,j)*az(i,j)*adipz(j))*flnkd(i,j) zf(i)=zf(i)+ (s2*ax(i,j)*az(i,j)*adipx(j)+ & s2*ay(i,j)*az(i,j)*adipy(j)+ & (s2*az(i,j)*az(i,j)-s1)*adipz(j))*flnkd(i,j) endif enddo enddo c c calculation for intramolecular induced dipoles c do i=1,iuniq xdip(i)=alpi(i)*xf(i) ydip(i)=alpi(i)*yf(i) zdip(i)=alpi(i)*zf(i) enddo return end *********************************************************************** subroutine lstfldps(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c irest=53 2019.8.15 9.21 dabs c c calculations for intramolecular dipole field c thole's dipole field tensor scaling c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,four/4.0d0/ c c Thole's expo -au3 scaling parameter is 0.572 c Ren & Ponder 0.39 c C r3: 1-e(-au3) C r5: 1-(1+au3)e(-au3) C do i=1,iuniq xf(i)=pfldx(ll,kk,i) yf(i)=pfldy(ll,kk,i) zf(i)=pfldz(ll,kk,i) enddo * write(6,'(16f10.5)') (alpi(i),i=1,16) do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=alpi(i)*alpi(j) if(aa.gt.0.0001d0)then aa=aa**(one/six) u=rx/(aa*bohr) au3=factt*u*u*u ex=exp(-au3) s1=(one-ex)/r3 s2=three*(one-(one+au3)*ex)/r5 else s1=one/r3 s2=three/r5 endif xf(i)=xf(i)+((s2*ax(i,j)*ax(i,j)-s1)*adipx(j)+ & s2*ax(i,j)*ay(i,j)*adipy(j)+ & s2*ax(i,j)*az(i,j)*adipz(j))*flnkd(i,j) yf(i)=yf(i)+ (s2*ax(i,j)*ay(i,j)*adipx(j)+ & (s2*ay(i,j)*ay(i,j)-s1)*adipy(j)+ & s2*ay(i,j)*az(i,j)*adipz(j))*flnkd(i,j) zf(i)=zf(i)+ (s2*ax(i,j)*az(i,j)*adipx(j)+ & s2*ay(i,j)*az(i,j)*adipy(j)+ & (s2*az(i,j)*az(i,j)-s1)*adipz(j))*flnkd(i,j) endif enddo enddo c c calculation for intramolecular induced dipoles c do i=1,iuniq xdip(i)=alpi(i)*xf(i) ydip(i)=alpi(i)*yf(i) zdip(i)=alpi(i)*zf(i) enddo return end *********************************************************************** subroutine lstfldm(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c irest=6 2019.9.17 ---> 2020.8.4 Sij=Betajj*rij c c calculations for intramolecular dipole field C Masia's model Gaussian density screening Atom Type a=0.8456 C 0.8456 from J. Wang st al. JCTC 2019 15 1146 c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,pa/3.1415926d0/ c do i=1,iuniq xf(i)=pfldx(ll,kk,i) yf(i)=pfldy(ll,kk,i) zf(i)=pfldz(ll,kk,i) enddo C co0=two/(three*dsqrt(two*pa)) othr=one/three co1=co0**(-othr) co2=two/(dsqrt(pa)) c osix=one/six C do i=1,iuniq do j=1,iuniq if(i.ne.j)then r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 C bi=factt*co1*(alpi(i)**(-othr)) bj=factt*co1*(alpi(j)**(-othr)) bij=bi*bj/(dsqrt(bi**2+bj**2)) sij=bij*r1 ex=co2*sij*exp(-(sij**2)) eef=derf(sij) epa=one+(two*(sij**2)/three) s1=(eef-ex)/r3 s2=three*(eef-ex*epa)/r5 C xf(i)=xf(i)+((s2*ax(i,j)*ax(i,j)-s1)*adipx(j)+ & s2*ax(i,j)*ay(i,j)*adipy(j)+ & s2*ax(i,j)*az(i,j)*adipz(j)) yf(i)=yf(i)+ (s2*ax(i,j)*ay(i,j)*adipx(j)+ & (s2*ay(i,j)*ay(i,j)-s1)*adipy(j)+ & s2*ay(i,j)*az(i,j)*adipz(j)) zf(i)=zf(i)+ (s2*ax(i,j)*az(i,j)*adipx(j)+ & s2*ay(i,j)*az(i,j)*adipy(j)+ & (s2*az(i,j)*az(i,j)-s1)*adipz(j)) endif enddo enddo c c calculation for intramolecular induced dipoles c do i=1,iuniq xdip(i)=alpi(i)*xf(i) ydip(i)=alpi(i)*yf(i) zdip(i)=alpi(i)*zf(i) enddo return end *********************************************************************** subroutine lstfldms(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c irest=63 2019.9.2 C 2020.8.4 c c calculations for intramolecular dipole field C Masia's model Gaussian density screening Atom Type a=0.8456 C 0.8456 from J. Wang st al. JCTC 2019 15 1146 c with simple scaling c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,pa/3.1415926d0/ c do i=1,iuniq xf(i)=pfldx(ll,kk,i) yf(i)=pfldy(ll,kk,i) zf(i)=pfldz(ll,kk,i) enddo C co0=two/(three*dsqrt(two*pa)) othr=one/three co1=co0**(-othr) co2=two/(dsqrt(pa)) C do i=1,iuniq do j=1,iuniq if(i.ne.j)then r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 C bi=factt*co1*(alpi(i)**(-othr)) bj=factt*co1*(alpi(j)**(-othr)) bij=bi*bj/(dsqrt(bi**2+bj**2)) sij=bij*r1 ex=co2*sij*exp(-(sij**2)) eef=derf(sij) epa=one+(two*(sij**2)/three) s1=(eef-ex)/r3 s2=three*(eef-ex*epa)/r5 C xf(i)=xf(i)+((s2*ax(i,j)*ax(i,j)-s1)*adipx(j)+ & s2*ax(i,j)*ay(i,j)*adipy(j)+ & s2*ax(i,j)*az(i,j)*adipz(j))*flnkd(i,j) yf(i)=yf(i)+ (s2*ax(i,j)*ay(i,j)*adipx(j)+ & (s2*ay(i,j)*ay(i,j)-s1)*adipy(j)+ & s2*ay(i,j)*az(i,j)*adipz(j))*flnkd(i,j) zf(i)=zf(i)+ (s2*ax(i,j)*az(i,j)*adipx(j)+ & s2*ay(i,j)*az(i,j)*adipy(j)+ & (s2*az(i,j)*az(i,j)-s1)*adipz(j))*flnkd(i,j) endif enddo enddo c c calculation for intramolecular induced dipoles c do i=1,iuniq xdip(i)=alpi(i)*xf(i) ydip(i)=alpi(i)*yf(i) zdip(i)=alpi(i)*zf(i) enddo return end *********************************************************************** subroutine lstfldp(ll,kk,adipx,adipy,adipz,alpi,xdip,ydip,zdip) c c irest=5 c c calculations for intramolecular dipole field c thole's dipole field tensor scaling c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/,bohr/0.52917706d0/,four/4.0d0/ c c Thole's expo -au3 scaling parameter is 0.572 c Ren & Ponder 0.39 c C r3: 1-e(-au3) C r5: 1-(1+au3)e(-au3) C do i=1,iuniq xf(i)=pfldx(ll,kk,i) yf(i)=pfldy(ll,kk,i) zf(i)=pfldz(ll,kk,i) enddo * write(6,'(16f10.5)') (alpi(i),i=1,16) do i=1,iuniq do j=1,iuniq if(i.ne.j)then rx=ar(i,j)*bohr r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 aa=alpi(i)*alpi(j) if(aa.gt.0.00001d0)then aa=aa**(one/six) u=rx/(aa*bohr) au3=factt*u*u*u ex=exp(-au3) s1=(one-ex)/r3 s2=three*(one-(one+au3)*ex)/r5 else s1=one/r3 s2=three/r5 endif xf(i)=xf(i)+((s2*ax(i,j)*ax(i,j)-s1)*adipx(j)+ & s2*ax(i,j)*ay(i,j)*adipy(j)+ & s2*ax(i,j)*az(i,j)*adipz(j)) yf(i)=yf(i)+ (s2*ax(i,j)*ay(i,j)*adipx(j)+ & (s2*ay(i,j)*ay(i,j)-s1)*adipy(j)+ & s2*ay(i,j)*az(i,j)*adipz(j)) zf(i)=zf(i)+ (s2*ax(i,j)*az(i,j)*adipx(j)+ & s2*ay(i,j)*az(i,j)*adipy(j)+ & (s2*az(i,j)*az(i,j)-s1)*adipz(j)) endif enddo enddo c c calculation for intramolecular induced dipoles c do i=1,iuniq xdip(i)=alpi(i)*xf(i) ydip(i)=alpi(i)*yf(i) zdip(i)=alpi(i)*zf(i) enddo return end *********************************************************************** !* Ref.: "Méthodes de calcul numérique - Tome 2 - By Claude * !* Nowakowski, PSI Editions, 1984". * !* * !* Fortran 90 Version By J-P Moreau, Paris. * !* (www.jpmoreau.fr) * !*************************************************************** CProgram Householder !* 1. dimension up !* dimension*8 A(50, 100), A0(50, 50), V(50) -> dimension*8 A(50, 100), A0(50, 50), V(50) !* 2. inverse matrix -> Alpha_mol AM !* *********1*********2*********3*********4*********5*********6*********7** Subroutine houhol(is,if,nn,C,E,AM,DI) implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) C integer n !size of matrix A dimension A(i200*3, i200*2*3), A0(i200*3, i200*3), V(i200*3) dimension B(i200*3), AI(i200*3, i200*3), & AP(i200*3, i200*3), X(i200*3) dimension AM(3, 3), F(i340*i20, i200*3), & DD(i340*i20, i200*3), DI(i340*i20,3) dimension C(i200*3,i200*3),E(i340*i20, i200*3) data aukcal /627.509541d0/,zero/0.0d0/,debye/2.54158059d0/ C !read matrix to be inverted C !Open input/output text files !* n=nn*3 do i=1,n do j=1,n A(i,j)=C(i,j) enddo enddo !* l=is*if do i=1,l do j=1,n F(i,j)=E(i,j) enddo enddo !* do i = 1, n do j = 1, n A(i, j + n) = 0.d0 A0(i, j) = A(i, j) end do A(i, i + n) = 1.d0 end do C !Transform A into triangular matrix call S1000(n,A,V) C !N linear systems to solve do k = 1, n do i = 1, n B(i) = A(i, K + n) end do C !Solve triangular system call S2000(n,A,B,X) do i = 1, n AI(i, K) = X(i) end do end do !k loop C !Calculate determinant call S4000(n,A,D) C !Check AP=A*A^-1=Unity Matrix call S3000(n,A0,AI,AP) ! ! Alpha_mol ! C ! TENSOR AM lower matrix elements write(7,*) ' ' call molpol(n,AI,AM) TAM=(AM(1,1)+AM(2,2)+AM(3,3))/3.0d0 write(7,30) AM(1,1),AM(2,1),AM(2,2),AM(3,1),AM(3,2),AM(3,3),TAM ! ! Dipole moment ! write(7,*) ' ' call dipf(n,l,AI,F,DD,DI) ! ! 10 format(' ',f10.5) 20 format('Determinant: ',f10.5) 30 format(' Molecular Polarizability (Bohr**3):',6f10.4, & ' isotropic',f10.4) return End !of main program Subroutine S1000(n,A,V) implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) C integer n dimension A(i200*3,i200*2*3),V(i200*3) C dimension S,XA,XB,XG,XL do k = 1, n - 1 S = 0.d0 do i = k, n S = S + A(i, K) * A(i, K) end do XL = -sign(1.d0,A(K, K)) * dsqrt(S) XA = XL * (XL - A(K, K)) V(K) = A(K, K) - XL do i = k + 1, n V(i) = A(i, K) end do do j = k + 1, 2*n XB = 0 do i = k, n XB = XB + V(i) * A(i, j) end do XG = XB / XA do i = k, n A(i, j) = A(i, j) - XG * V(i) end do end do A(K, K) = XL do i = k + 1, n A(i, K) = 0.d0 end do end do !k loop return End Subroutine S2000(n,A,B,X) implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) C integer n dimension A(i200*3,i200*2*3),B(i200*3),X(i200*3) C integer i, j C dimension S do i = n, 1, -1 j = n S = 0.d0 20 If (i == j) goto 40 S = S - A(i, j) * X(j) j = j - 1 goto 20 40 X(i) = (B(i) + S) / A(i, i) end do return End Subroutine S3000(n,A0,AI,AP) implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) C integer n dimension A0(i200*3,i200*3),AI(i200*3,i200*3),AP(i200*3,i200*3) C dimension S do i = 1, n do j = 1, n S = 0.d0 do k = 1, n S = S + A0(i, k) * AI(k, j) end do AP(i, j) = S end do end do return End Subroutine S4000(n,A,D) implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) C integer n dimension A(i200*3,i200*2*3) C , D D = 1.d0 do i = 1, n D = D * A(i, i) end do return End Subroutine molpol(n,A,AM) implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) C integer n dimension A(i200*3,i200*2*3), AM(3,3), A1(i200*3,3) k=1 do i = 1, n A1(i,1)=0.0d0 A1(i,2)=0.0d0 A1(i,3)=0.0d0 do j = 1,n,3 A1(i,1)=A1(i,1)+A(i,j) A1(i,2)=A1(i,2)+A(i,j+1) A1(i,3)=A1(i,3)+A(i,j+2) end do end do do i=1,3 do j=1,3 AM(i,j)=0.0d0 end do end do do i = 1, n, 3 do j = 1,3 AM(1,j)=AM(1,j)+A1(i,j) AM(2,j)=AM(2,j)+A1(i+1,j) AM(3,j)=AM(3,j)+A1(i+2,j) end do end do return End Subroutine dipf(n,m,A,F,D,DI) implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) C integer n, m dimension A(i200*3,i200*3),F(i340*i20,i200*3), & D(i340*i20,i200*3),DI(i340*i20,3) k=1 do i = 1, m do j = 1, n D(i,j)=0.0d0 end do end do do i = 1,n do j=1,m do k=1,n D(j,k)=D(j,k)+A(i,k)*F(j,k) end do end do end do ! do i = 1, m do j = 1, 3 DI(i,j)=0.0d0 end do end do do i=1,m do j=1,n,3 DI(i,1)=DI(i,1)+D(i,j) DI(i,2)=DI(i,2)+D(i,j+1) DI(i,3)=DI(i,3)+D(i,j+2) end do end do return End !end of file householder.f90 *********************************************************************** subroutine imdflds(ll,kk,alpi,xdip,ydip,zdip) c c irest=3 Matrix Inversion c c calculations for intramolecular dipole field c simple scaling model c implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) common/chcor/iateq(i200,4),jateq(i200,4),neq(5), & iuniq,nvar,ifix & ,iatom(i200),ivary(i200,4),xkpt(i200),ykpt(i200),zkpt(i200) & ,qkpt (i200) common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt common/tens/ & txx(i200,i200),txy(i200,i200), & txz(i200,i200), & tyx(i200,i200),tyy(i200,i200), & tyz(i200,i200), & tzx(i200,i200),tzy(i200,i200), & tzz(i200,i200) dimension adipx(i200),adipy(i200),adipz(i200),alpi(i200), & xdip(i200),ydip(i200),zdip(i200), & xf(i200),yf(i200),zf(i200) !*-------------------------------------------------------------------------- dimension A(i200*3,i200*3),DA(i200*3) !*-------------------------------------------------------------------------- data zero/0.0d0/,tho/2.089d0/,one/1.0d0/,two/2.0d0/,six/6.0d0/, & three/3.0d0/ c do i=1,iuniq do j=1,iuniq if(i.ne.j)then r1=ar(i,j) r2=r1*r1 r3=r1*r2 r5=r1*r2*r2 s1=one/r3 s2=three/r5 C txx(i,j)=-(s2*ax(i,j)*ax(i,j)-s1)*flnkd(i,j) txy(i,j)=-(s2*ax(i,j)*ay(i,j))*flnkd(i,j) txz(i,j)=-(s2*ax(i,j)*az(i,j))*flnkd(i,j) tyx(i,j)=-(s2*ay(i,j)*ax(i,j))*flnkd(i,j) tyy(i,j)=-(s2*ay(i,j)*ay(i,j)-s1)*flnkd(i,j) tyz(i,j)=-(s2*ay(i,j)*az(i,j))*flnkd(i,j) tzx(i,j)=-(s2*az(i,j)*ax(i,j))*flnkd(i,j) tzy(i,j)=-(s2*az(i,j)*ay(i,j))*flnkd(i,j) tzz(i,j)=-(s2*az(i,j)*az(i,j)-s1)*flnkd(i,j) C else txx(i,j)=one/alpi(i) txy(i,j)=zero txz(i,j)=zero tyx(i,j)=zero tyy(i,j)=one/alpi(i) tyz(i,j)=zero tzx(i,j)=zero tzy(i,j)=zero tzz(i,j)=one/alpi(i) endif enddo enddo !*---------------------------------------------------------- !* Matrix A !*---------------------------------------------------------- k=1 do i=1,iuniq l=1 do j=1,iuniq A(k,l)=txx(i,j) A(k,l+1)=txy(i,j) A(k,l+2)=txz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+1,l)=tyx(i,j) A(k+1,l+1)=tyy(i,j) A(k+1,l+2)=tyz(i,j) l=l+3 enddo l=1 do j=1,iuniq A(k+2,l)=tzx(i,j) A(k+2,l+1)=tzy(i,j) A(k+2,l+2)=tzz(i,j) l=l+3 enddo k=k+3 enddo !* call houhol0(ll,kk,iuniq,A,DA) !* !*---------------------------------------------------------- c calculation for intramolecular induced dipoles c j=0 do i=1,iuniq*3,3 j=j+1 xdip(j)=DA(i) ydip(j)=DA(i+1) zdip(j)=DA(i+2) enddo return end *********************************************************************** Subroutine houhol0(ll,kk,nn,C,DI) implicit real*8(a-h,o-z) parameter (i200=60,i340=240,i20=30,i100=98) C integer n !size of matrix A common/poplnk/flnkc(i200,i200),flnkd(i200,i200),facc(3),facd(3), & pchin(i200),cfldx(i200),cfldy(i200),cfldz(i200), & pfldx(i20,i340,i200),pfldy(i20,i340,i200),pfldz(i20,i340,i200), & fldx0(i20,i340,i200),fldy0(i20,i340,i200),fldz0(i20,i340,i200), & ax(i200,i200),ay(i200,i200),az(i200,i200),ar(i200,i200),factt dimension A(i200*3, i200*2*3), A0(i200*3, i200*3), V(i200*3) dimension B(i200*3), AI(i200*3, i200*3), & AP(i200*3, i200*3), X(i200*3) dimension F(i200*3), DI(i200*3),C(i200*3,i200*3) !* !* A Matrix to be inverted !* n=nn*3 do i=1,n do j=1,n A(i,j)=C(i,j) enddo enddo !* !* is if F Field from a fld charge k=1 do i=1,n,3 F(i)=pfldx(ll,kk,k) F(i+1)=pfldy(ll,kk,k) F(i+2)=pfldz(ll,kk,k) k=k+1 enddo !* !* A Matrix !* do i = 1, n do j = 1, n A(i, j + n) = 0.d0 A0(i, j) = A(i, j) end do A(i, i + n) = 1.d0 end do c C !Transform A into triangular matrix call S1000(n,A,V) C !N linear systems to solve do k = 1, n do i = 1, n B(i) = A(i, K + n) end do C !Solve triangular system call S2000(n,A,B,X) do i = 1, n AI(i, K) = X(i) end do end do !k loop C !Calculate determinant call S4000(n,A,D) C !Check AP=A*A^-1=Unity Matrix call S3000(n,A0,AI,AP) !* !* AI Inverted Matrix !* DI Induced Dipole Moment/atom a.u. !* F Field from a fld charge do i=1,n DI(i)=0.0D0 enddo do i=1,n do j=1,n DI(i)=DI(i)+AI(i,j)*F(j) enddo enddo return End