c c c ################################################### c ## COPYRIGHT (C) 2003 by Jay William Ponder ## c ## All Rights Reserved ## c ################################################### c c ################################################################## c ## ## c ## subroutine epitors -- pi-system torsion potential energy ## c ## ## c ################################################################## c c c "epitors" calculates the pi-system torsion potential energy c c subroutine epitors use atoms use bound use energi use group use pitors use torpot use usage implicit none integer i,ia,ib,ic integer id,ie,ig real*8 e,rdc,fgrp real*8 xt,yt,zt,rt2 real*8 xu,yu,zu,ru2 real*8 xtu,ytu,ztu,rtru real*8 v2,c2,s2,phi2 real*8 sine,cosine real*8 sine2,cosine2 real*8 xia,yia,zia real*8 xib,yib,zib real*8 xic,yic,zic real*8 xid,yid,zid real*8 xie,yie,zie real*8 xig,yig,zig real*8 xip,yip,zip real*8 xiq,yiq,ziq real*8 xad,yad,zad real*8 xbd,ybd,zbd real*8 xec,yec,zec real*8 xgc,ygc,zgc real*8 xcp,ycp,zcp real*8 xdc,ydc,zdc real*8 xqd,yqd,zqd logical proceed c c c zero out the pi-system torsion potential energy c ept = 0.0d0 if (npitors .eq. 0) return c c OpenMP directives for the major loop structure c !$OMP PARALLEL default(private) shared(npitors,ipit, !$OMP& use,x,y,z,kpit,ptorunit,use_group,use_polymer) !$OMP& shared(ept) !$OMP DO reduction(+:ept) schedule(guided) c c calculate the pi-system torsion angle energy term c do i = 1, npitors ia = ipit(1,i) ib = ipit(2,i) ic = ipit(3,i) id = ipit(4,i) ie = ipit(5,i) ig = ipit(6,i) c c decide whether to compute the current interaction c proceed = .true. if (use_group) call groups (proceed,fgrp,ia,ib,ic,id,ie,ig) if (proceed) proceed = (use(ia) .or. use(ib) .or. use(ic) .or. & use(id) .or. use(ie) .or. use(ig)) c c compute the value of the pi-system torsion angle c if (proceed) then xia = x(ia) yia = y(ia) zia = z(ia) xib = x(ib) yib = y(ib) zib = z(ib) xic = x(ic) yic = y(ic) zic = z(ic) xid = x(id) yid = y(id) zid = z(id) xie = x(ie) yie = y(ie) zie = z(ie) xig = x(ig) yig = y(ig) zig = z(ig) xad = xia - xid yad = yia - yid zad = zia - zid xbd = xib - xid ybd = yib - yid zbd = zib - zid xec = xie - xic yec = yie - yic zec = zie - zic xgc = xig - xic ygc = yig - yic zgc = zig - zic if (use_polymer) then call image (xad,yad,zad) call image (xbd,ybd,zbd) call image (xec,yec,zec) call image (xgc,ygc,zgc) end if xip = yad*zbd - ybd*zad + xic yip = zad*xbd - zbd*xad + yic zip = xad*ybd - xbd*yad + zic xiq = yec*zgc - ygc*zec + xid yiq = zec*xgc - zgc*xec + yid ziq = xec*ygc - xgc*yec + zid xcp = xic - xip ycp = yic - yip zcp = zic - zip xdc = xid - xic ydc = yid - yic zdc = zid - zic xqd = xiq - xid yqd = yiq - yid zqd = ziq - zid if (use_polymer) then call image (xcp,ycp,zcp) call image (xdc,ydc,zdc) call image (xqd,yqd,zqd) end if xt = ycp*zdc - ydc*zcp yt = zcp*xdc - zdc*xcp zt = xcp*ydc - xdc*ycp xu = ydc*zqd - yqd*zdc yu = zdc*xqd - zqd*xdc zu = xdc*yqd - xqd*ydc xtu = yt*zu - yu*zt ytu = zt*xu - zu*xt ztu = xt*yu - xu*yt rt2 = xt*xt + yt*yt + zt*zt ru2 = xu*xu + yu*yu + zu*zu rtru = sqrt(rt2 * ru2) if (rtru .ne. 0.0d0) then rdc = sqrt(xdc*xdc + ydc*ydc + zdc*zdc) cosine = (xt*xu + yt*yu + zt*zu) / rtru sine = (xdc*xtu + ydc*ytu + zdc*ztu) / (rdc*rtru) c c set the pi-system torsion parameters for this angle c v2 = kpit(i) c2 = -1.0d0 s2 = 0.0d0 c c compute the multiple angle trigonometry and the phase terms c cosine2 = cosine*cosine - sine*sine sine2 = 2.0d0 * cosine * sine phi2 = 1.0d0 + (cosine2*c2 + sine2*s2) c c calculate the pi-system torsion energy for this angle c e = ptorunit * v2 * phi2 c c scale the interaction based on its group membership c if (use_group) e = e * fgrp c c increment the total pi-system torsion angle energy c ept = ept + e end if end if end do c c OpenMP directives for the major loop structure c !$OMP END DO !$OMP END PARALLEL return end