Merge branch 'devel' into AFM
[unres.git] / source / unres / src_Eshel / SRC-SURPLUS / q_measure1.F
diff --git a/source/unres/src_Eshel/SRC-SURPLUS/q_measure1.F b/source/unres/src_Eshel/SRC-SURPLUS/q_measure1.F
new file mode 100644 (file)
index 0000000..9c1546d
--- /dev/null
@@ -0,0 +1,470 @@
+      double precision function qwolynes(seg1,seg2,flag,seg3,seg4)
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.CHAIN' 
+      include 'COMMON.INTERACT'
+      include 'COMMON.VAR'
+      include 'COMMON.MD'
+      integer i,j,jl,k,l,il,kl,nl,np,seg1,seg2,seg3,seg4,secseg
+      integer nsep /3/
+      double precision dist,qm
+      double precision qq,qqij,qqijCM,dij,d0ij,dijCM,d0ijCM
+      logical lprn /.false./
+      logical flag
+      qq = 0.0d0
+      nl=0 
+      do i=0,nres
+        do j=1,3
+          dqwol(j,i)=0.0d0
+          dxqwol(j,i)=0.0d0
+        enddo
+      enddo 
+      if (lprn) then
+      write (iout,*) "seg1",seg1," seg2",seg2," seg3",seg3," seg4",seg4,
+     & " flag",flag
+      call flush(iout)
+      endif
+      if (flag) then
+        do il=seg1+nsep,seg2
+          do jl=seg1,il-nsep
+            nl=nl+1
+            if (itype(il).ne.10) then
+              ilnres=il+nres
+            else
+              ilnres=il
+            endif
+            if (itype(jl).ne.10) then
+              jlnres=jl+nres
+            else
+              jlnres=jl
+            endif
+            qqijCM = qcontrib(il,jl,ilnres,jlnres)
+            qq = qq+qqijCM
+            if (lprn) then
+              write (iout,*) "qqijCM",qqijCM
+              call flush(iout)
+            endif
+          enddo
+        enddo
+        if (lprn) then
+          write (iout,*) "nl",nl," qq",qq
+          call flush(iout)
+        endif 
+      else
+        do il=seg1,seg2
+          if((seg3-il).lt.3) then
+             secseg=il+3
+          else
+             secseg=seg3
+          endif 
+          do jl=secseg,seg4
+            nl=nl+1
+            if (itype(il).ne.10) then
+              ilnres=il+nres
+            else
+              ilnres=il
+            endif
+            if (itype(jl).ne.10) then
+              jlnres=jl+nres
+            else
+              jlnres=jl
+            endif
+            qqijCM = qcontrib(il,jl,ilnres,jlnres)
+            qq = qq+qqijCM
+            if (lprn) then
+              write (iout,*) "qqijCM",qqijCM
+              call flush(iout)
+            endif
+          enddo
+        enddo
+      endif
+      qq = qq/nl
+      qwolynes=1.0d0-qq
+      do i=0,nres
+        do j=1,3
+          dqwol(j,i)=dqwol(j,i)/nl
+          dxqwol(j,i)=dxqwol(j,i)/nl
+        enddo
+      enddo
+      return 
+      end
+c-------------------------------------------------------------------
+      subroutine qwol_num(seg1,seg2,flag,seg3,seg4)
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.CHAIN' 
+      include 'COMMON.INTERACT'
+      include 'COMMON.VAR'
+      include 'COMMON.MD'
+      integer seg1,seg2,seg3,seg4
+      logical flag
+      double precision qwolan(3,0:maxres),cdummy(3,0:maxres2),
+     & qwolxan(3,0:maxres),q1,q2
+      double precision delta /1.0d-7/
+      write (iout,*) "seg1",seg1," seg2",seg2," seg3",seg3," seg4",seg4
+      write(iout,*) "dQ/dc backbone "
+       do i=0,nres
+        write(iout,'(i5,3e15.5)') i, (dqwol(j,i),j=1,3)
+      enddo      
+      write(iout,*) "dQ/dX side chain "
+      do i=1,nres
+            write(iout,'(i5,3e15.5)') i,(dxqwol(j,i),j=1,3)
+      enddo
+      do i=1,nres
+        do j=1,3
+          cdummy(j,i)=c(j,i)
+          c(j,i)=c(j,i)-delta
+          q1=qwolynes(seg1,seg2,flag,seg3,seg4)
+          c(j,i)=cdummy(j,i)+delta
+          q2=qwolynes(seg1,seg2,flag,seg3,seg4)
+          qwolan(j,i)=0.5d0*(q2-q1)/delta
+          c(j,i)=cdummy(j,i)
+c          write (iout,*) "i",i," j",j," q1",q1," a2",q2
+        enddo
+      enddo
+      do i=1,nres
+        do j=1,3
+          cdummy(j,i+nres)=c(j,i+nres)
+          c(j,i+nres)=c(j,i+nres)-delta
+          q1=qwolynes(seg1,seg2,flag,seg3,seg4)
+          c(j,i+nres)=cdummy(j,i+nres)+delta
+          q2=qwolynes(seg1,seg2,flag,seg3,seg4)
+          qwolxan(j,i)=0.5d0*(q2-q1)/delta
+          c(j,i+nres)=cdummy(j,i+nres)
+        enddo
+      enddo  
+      write(iout,*) "Numerical Q cartesian gradients backbone: "
+      do i=0,nres
+        write(iout,'(i5,3e15.5)') i, (qwolan(j,i),j=1,3)
+      enddo
+      write(iout,*) "Numerical Q cartesian gradients side-chain: "
+      do i=0,nres
+        write(iout,'(i5,3e15.5)') i, (qwolxan(j,i),j=1,3)
+      enddo 
+      return
+      end
+c------------------------------------------------------------------------  
+      subroutine EconstrQ
+c     MD with umbrella_sampling using Wolyne's distance measure as a constraint
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.CONTROL'
+      include 'COMMON.VAR'
+      include 'COMMON.MD'
+#ifndef LANG0
+      include 'COMMON.LANGEVIN'
+#else
+      include 'COMMON.LANGEVIN.lang0'
+#endif
+      include 'COMMON.CHAIN'
+      include 'COMMON.DERIV'
+      include 'COMMON.GEO'
+      include 'COMMON.LOCAL'
+      include 'COMMON.INTERACT'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.NAMES'
+      include 'COMMON.TIME1'
+      double precision uzap1,uzap2,hm1,hm2,hmnum
+      double precision ucdelan,dUcartan(3,0:MAXRES)
+     & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES),
+     &  duconst(3,0:MAXRES),duxconst(3,0:MAXRES)
+      integer kstart,kend,lstart,lend,idummy
+      double precision delta /1.0d-7/
+      do i=0,nres
+         do j=1,3
+            duconst(j,i)=0.0d0
+            dudconst(j,i)=0.0d0
+            duxconst(j,i)=0.0d0
+            dudxconst(j,i)=0.0d0
+         enddo
+      enddo
+      Uconst=0.0d0
+      do i=1,nfrag
+         qfrag(i)=qwolynes(ifrag(1,i,iset),ifrag(2,i,iset),.true.
+     &   ,idummy,idummy)
+         Uconst=Uconst+wfrag(i,iset)*harmonic(qfrag(i),qinfrag(i,iset))
+c Calculating the derivatives of Constraint energy with respect to Q
+         Ucdfrag=wfrag(i,iset)*harmonicprim(qfrag(i),qinfrag(i,iset))
+c Calculating the derivatives of Q with respect to cartesian coordinates
+         do ii=0,nres
+            do j=1,3
+               duconst(j,ii)=dUconst(j,ii)+ucdfrag*dqwol(j,ii)
+               dUxconst(j,ii)=dUxconst(j,ii)+ucdfrag*dxqwol(j,ii)
+            enddo
+         enddo
+c      write (iout,*) "Calling qwol_num"
+c      call qwol_num(ifrag(1,i),ifrag(2,i),.true.,idummy,idummy)
+      enddo
+      do i=1,npair
+         kstart=ifrag(1,ipair(1,i,iset),iset)
+         kend=ifrag(2,ipair(1,i,iset),iset)
+         lstart=ifrag(1,ipair(2,i,iset),iset)
+         lend=ifrag(2,ipair(2,i,iset),iset)
+         qpair(i)=qwolynes(kstart,kend,.false.,lstart,lend)
+         Uconst=Uconst+wpair(i,iset)*harmonic(qpair(i),qinpair(i,iset))
+c  Calculating dU/dQ
+         Ucdpair=wpair(i,iset)*harmonicprim(qpair(i),qinpair(i,iset))
+c Calculating dQ/dXi
+         do ii=0,nres
+            do j=1,3
+               duconst(j,ii)=dUconst(j,ii)+ucdpair*dqwol(j,ii)
+               dUxconst(j,ii)=dUxconst(j,ii)+ucdpair*dxqwol(j,ii)
+            enddo
+         enddo
+      enddo
+c      write(iout,*) "Uconst inside subroutine ", Uconst
+c Transforming the gradients from Cs to dCs for the backbone
+      do i=0,nres
+         do j=i+1,nres
+           do k=1,3
+             dudconst(k,i)=dudconst(k,i)+duconst(k,j)+duxconst(k,j)
+           enddo
+         enddo
+      enddo
+c  Transforming the gradients from Cs to dCs for the side chains      
+      do i=1,nres
+         do j=1,3
+           dudxconst(j,i)=duxconst(j,i)
+         enddo
+      enddo
+c      write(iout,*) "dU/dc backbone "
+c       do ii=0,nres
+c        write(iout,'(i5,3e15.5)') ii, (duconst(j,ii),j=1,3)
+c      enddo      
+c      write(iout,*) "dU/dX side chain "
+c      do ii=1,nres
+c            write(iout,'(i5,3e15.5)') ii,(duxconst(j,ii),j=1,3)
+c      enddo
+c      write(iout,*) "dU/ddc backbone "
+c       do ii=0,nres
+c        write(iout,'(i5,3e15.5)') ii, (dudconst(j,ii),j=1,3)
+c      enddo      
+c      write(iout,*) "dU/ddX side chain "
+c      do ii=1,nres
+c            write(iout,'(i5,3e15.5)') ii,(dudxconst(j,ii),j=1,3)
+c      enddo
+c Calculating numerical gradients of dUconst/ddc and dUconst/ddx
+c      call dEconstrQ_num      
+      return
+      end
+c-----------------------------------------------------------------------
+      subroutine dEconstrQ_num
+c Calculating numerical dUconst/ddc and dUconst/ddx      
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.CONTROL'
+      include 'COMMON.VAR'
+      include 'COMMON.MD'
+#ifndef LANG0
+      include 'COMMON.LANGEVIN'
+#else
+      include 'COMMON.LANGEVIN.lang0'
+#endif
+      include 'COMMON.CHAIN'
+      include 'COMMON.DERIV'
+      include 'COMMON.GEO'
+      include 'COMMON.LOCAL'
+      include 'COMMON.INTERACT'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.NAMES'
+      include 'COMMON.TIME1'
+      double precision uzap1,uzap2
+      double precision dUcartan(3,0:MAXRES)
+     & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES)
+      integer kstart,kend,lstart,lend,idummy
+      double precision delta /1.0d-7/
+c     For the backbone
+      do i=0,nres-1
+         do j=1,3
+            dUcartan(j,i)=0.0d0
+            cdummy(j,i)=dc(j,i)
+            dc(j,i)=dc(j,i)+delta
+            call chainbuild_cart
+            uzap2=0.0d0
+            do ii=1,nfrag
+               qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset),
+     &         .true.,idummy,idummy)
+               uzap2=uzap2+wfrag(ii,iset)*harmonic(qfrag(ii),
+     &            qinfrag(ii,iset))
+            enddo
+            do ii=1,npair
+               kstart=ifrag(1,ipair(1,ii,iset),iset)
+               kend=ifrag(2,ipair(1,ii,iset),iset)
+               lstart=ifrag(1,ipair(2,ii,iset),iset)
+               lend=ifrag(2,ipair(2,ii,iset),iset)
+               qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend)
+               uzap2=uzap2+wpair(ii,iset)*
+     &             harmonic(qpair(ii),qinpair(ii,iset))
+            enddo
+            dc(j,i)=cdummy(j,i)
+            call chainbuild_cart
+            uzap1=0.0d0
+             do ii=1,nfrag
+               qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset),
+     &         .true.,idummy,idummy)
+               uzap1=uzap1+wfrag(ii,iset)*
+     &                 harmonic(qfrag(ii),qinfrag(ii,iset))
+            enddo
+            do ii=1,npair
+               kstart=ifrag(1,ipair(1,ii,iset),iset)
+               kend=ifrag(2,ipair(1,ii,iset),iset)
+               lstart=ifrag(1,ipair(2,ii,iset),iset)
+               lend=ifrag(2,ipair(2,ii,iset),iset)
+               qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend)
+               uzap1=uzap1+wpair(ii,iset)*
+     &            harmonic(qpair(ii),qinpair(ii,iset))
+            enddo
+            ducartan(j,i)=(uzap2-uzap1)/(delta)
+         enddo
+      enddo
+c Calculating numerical gradients for dU/ddx
+      do i=0,nres-1
+         do j=1,3
+           duxcartan(j,i)=0.0d0
+         enddo
+         do j=1,3
+            cdummy(j,i)=dc(j,i+nres)
+            dc(j,i+nres)=dc(j,i+nres)+delta
+            call chainbuild_cart
+            uzap2=0.0d0
+            do ii=1,nfrag
+               qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset),
+     &         .true.,idummy,idummy)
+               uzap2=uzap2+wfrag(ii,iset)*
+     &            harmonic(qfrag(ii),qinfrag(ii,iset))
+            enddo
+            do ii=1,npair
+               kstart=ifrag(1,ipair(1,ii,iset),iset)
+               kend=ifrag(2,ipair(1,ii,iset),iset)
+               lstart=ifrag(1,ipair(2,ii,iset),iset)
+               lend=ifrag(2,ipair(2,ii,iset),iset)
+               qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend)
+               uzap2=uzap2+wpair(ii,iset)*
+     &             harmonic(qpair(ii),qinpair(ii,iset))
+            enddo
+            dc(j,i+nres)=cdummy(j,i)
+            call chainbuild_cart
+            uzap1=0.0d0
+             do ii=1,nfrag
+               qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset),
+     &         .true.,idummy,idummy)
+               uzap1=uzap1+wfrag(ii,iset)*
+     &            harmonic(qfrag(ii),qinfrag(ii,iset))
+            enddo
+            do ii=1,npair
+               kstart=ifrag(1,ipair(1,ii,iset),iset)
+               kend=ifrag(2,ipair(1,ii,iset),iset)
+               lstart=ifrag(1,ipair(2,ii,iset),iset)
+               lend=ifrag(2,ipair(2,ii,iset),iset)
+               qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend)
+               uzap1=uzap1+wpair(ii,iset)*
+     &               harmonic(qpair(ii),qinpair(ii,iset))
+            enddo
+            duxcartan(j,i)=(uzap2-uzap1)/(delta)
+         enddo
+      enddo    
+      write(iout,*) "Numerical dUconst/ddc backbone "
+      do ii=0,nres
+        write(iout,'(i5,3e15.5)') ii,(dUcartan(j,ii),j=1,3)
+      enddo
+      write(iout,*) "Numerical dUconst/ddx side-chain "
+      do ii=1,nres
+         write(iout,'(i5,3e15.5)') ii,(dUxcartan(j,ii),j=1,3)
+      enddo 
+      return
+      end
+c--------------------------------------------------------------------------- 
+      double precision function qcontrib(il,jl,il1,jl1)
+      implicit none
+      include 'DIMENSIONS'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.CHAIN'
+      include 'COMMON.INTERACT'
+      include 'COMMON.MD'
+      integer i,j,k,il,jl,il1,jl1,nd
+      double precision dist
+      external dist
+      double precision dij1,dij2,dij3,dij4,d0ij1,d0ij2,d0ij3,d0ij4,fac,
+     &  fac1,ddave,ssij,ddqij
+      logical lprn /.false./
+      d0ij1=dsqrt((cref(1,jl)-cref(1,il))**2+
+     &           (cref(2,jl)-cref(2,il))**2+
+     &           (cref(3,jl)-cref(3,il))**2)
+      dij1=dist(il,jl)
+      ddave=(dij1-d0ij1)**2
+      nd=1
+      if (jl1.ne.jl) then
+        d0ij2=dsqrt((cref(1,jl1)-cref(1,il))**2+
+     &           (cref(2,jl1)-cref(2,il))**2+
+     &           (cref(3,jl1)-cref(3,il))**2)
+        dij2=dist(il,jl1)
+        ddave=ddave+(dij2-d0ij2)**2
+        nd=nd+1
+      endif
+      if (il1.ne.il) then
+        d0ij3=dsqrt((cref(1,jl)-cref(1,il1))**2+
+     &           (cref(2,jl)-cref(2,il1))**2+
+     &           (cref(3,jl)-cref(3,il1))**2)
+        dij3=dist(il1,jl)
+        ddave=ddave+(dij3-d0ij3)**2
+        nd=nd+1
+      endif
+      if (il1.ne.il .and. jl1.ne.jl) then
+        d0ij4=dsqrt((cref(1,jl1)-cref(1,il1))**2+
+     &           (cref(2,jl1)-cref(2,il1))**2+
+     &           (cref(3,jl1)-cref(3,il1))**2)
+        dij4=dist(il1,jl1)
+        ddave=ddave+(dij4-d0ij4)**2
+        nd=nd+1
+      endif
+      ddave=ddave/nd
+      if (lprn) then
+        write (iout,*) "il",il," jl",jl,
+     &  " itype",itype(il),itype(jl)," nd",nd
+        write (iout,*)"d0ij",d0ij1,d0ij2,d0ij3,d0ij4,
+     &  " dij",dij1,dij2,dij3,dij4," ddave",ddave
+        call flush(iout)
+      endif
+c      ssij = (0.25d0*d0ij1)**2
+      if (il.ne.il1 .and. jl.ne.jl1) then
+        ssij = 16.0d0/(d0ij1*d0ij4)
+      else
+        ssij = 16.0d0/(d0ij1*d0ij1)
+      endif
+      qcontrib = dexp(-0.5d0*ddave*ssij)
+c Compute gradient
+      fac1 = qcontrib*ssij/nd
+      fac = fac1*(dij1-d0ij1)/dij1
+      do k=1,3
+        ddqij = (c(k,il)-c(k,jl))*fac
+        dqwol(k,il)=dqwol(k,il)+ddqij
+        dqwol(k,jl)=dqwol(k,jl)-ddqij
+      enddo
+      if (jl1.ne.jl) then
+        fac = fac1*(dij2-d0ij2)/dij2
+        do k=1,3
+          ddqij = (c(k,il)-c(k,jl1))*fac
+          dqwol(k,il)=dqwol(k,il)+ddqij
+          dxqwol(k,jl)=dxqwol(k,jl)-ddqij
+        enddo
+      endif
+      if (il1.ne.il) then
+        fac = fac1*(dij3-d0ij3)/dij3
+        do k=1,3
+          ddqij = (c(k,il1)-c(k,jl))*fac
+          dxqwol(k,il)=dxqwol(k,il)+ddqij
+          dqwol(k,jl)=dqwol(k,jl)-ddqij
+        enddo
+      endif
+      if (il1.ne.il .and. jl1.ne.jl) then
+        fac = fac1*(dij4-d0ij4)/dij4
+        do k=1,3
+          ddqij = (c(k,il1)-c(k,jl1))*fac
+          dxqwol(k,il)=dxqwol(k,il)+ddqij
+          dxqwol(k,jl)=dxqwol(k,jl)-ddqij
+        enddo
+      endif
+      return
+      end