working ESBLOC
authorAdam Sieradzan <adasko@piasek4.chem.univ.gda.pl>
Fri, 11 Aug 2017 08:03:55 +0000 (10:03 +0200)
committerAdam Sieradzan <adasko@piasek4.chem.univ.gda.pl>
Fri, 11 Aug 2017 08:03:55 +0000 (10:03 +0200)
source/unres/control.F90
source/unres/data/energy_data.f90
source/unres/energy.f90
source/unres/io_config.f90

index b851d37..f8f8e9a 100644 (file)
       call int_bounds(nres_molec(1)-2,loc_start,loc_end)
       loc_start=loc_start+1
       loc_end=loc_end+1
+      call int_bounds(nres_molec(2)-2,loc_start_nucl,loc_end_nucl)
+      loc_start_nucl=loc_start_nucl+1+nres_molec(1)
+      loc_end_nucl=loc_end_nucl+1+nres_molec(1)
       call int_bounds(nres_molec(1)-2,ithet_start,ithet_end)
       ithet_start=ithet_start+2
       ithet_end=ithet_end+2
index 44e3d30..97b773c 100644 (file)
        ilip_start,ilip_end,itube_start,itube_end
       integer :: ibond_nucl_start,ibond_nucl_end,iphi_nucl_start,&
        iphi_nucl_end,iphid_nucl_start,iphid_nucl_end,& 
-       ibondp_nucl_start,ibondp_nucl_end,ithet_nucl_start,ithet_nucl_end
+       ibondp_nucl_start,ibondp_nucl_end,ithet_nucl_start,ithet_nucl_end,&
+        loc_start_nucl,loc_end_nucl
       integer,dimension(:),allocatable :: ibond_displ,ibond_count,&
        ithet_displ,ithet_count,iphi_displ,iphi_count,iphi1_displ,&
        iphi1_count,ivec_displ,ivec_count,iset_displ,iset_count,&
 ! Parameters of the SC rotamers (local) term
 !      common/scrot/
       real(kind=8),dimension(:,:),allocatable :: sc_parmin !(maxsccoef,ntyp)
+      real(kind=8),dimension(:,:),allocatable :: sc_parmin_nucl !(maxsccoef,ntyp)
+
 !-----------------------------------------------------------------------------
 ! common.torcnstr
 !      common /torcnstr/
index 051ba09..b20eb96 100644 (file)
         grad_shield,gg_tube,gg_tube_sc,gradafm !(3,maxres)
 !-----------------------------NUCLEIC GRADIENT
       real(kind=8),dimension(:,:),allocatable  ::gradb_nucl,gradbx_nucl, &
-        gvdwpsb1,gelpp,gvdwpsb,gelsbc,gelsbx,gvdwsbx,gvdwsbc
+        gvdwpsb1,gelpp,gvdwpsb,gelsbc,gelsbx,gvdwsbx,gvdwsbc,gsbloc,&
+        gsblocx
 !      real(kind=8),dimension(:,:),allocatable :: gloc,gloc_x !(maxvar,2)
       real(kind=8),dimension(:,:),allocatable :: gel_loc,gel_loc_long,&
         gcorr3_turn,gcorr4_turn,gcorr6_turn,gradb,gradbx !(3,maxres)
 !      call multibody_hb(ecorr,ecorr3,n_corr,n_corr1)
       call epp_nucl_sub(evdwpp,eespp)
       call epsb(evdwpsb,eelpsb)
+      call esb(esbloc)
 
       print *,"after ebend", ebe_nucl
 #ifdef TIMING
@@ -19593,6 +19595,9 @@ write(iout,*) 'Calling CHECK_ECARTIN else.'
       allocate(gelsbx(3,-1:nres))
       allocate(gvdwsbx(3,-1:nres))
       allocate(gvdwsbc(3,-1:nres))
+      allocate(gsbloc(3,-1:nres))
+      allocate(gsblocx(3,-1:nres))
+
 !(3,maxres)
       allocate(grad_shield_side(3,50,nres))
       allocate(grad_shield_loc(3,50,nres))
@@ -20844,6 +20849,232 @@ write(iout,*) 'Calling CHECK_ECARTIN else.'
       enddo
       return
       end subroutine sc_grad_nucl
+!-----------------------------------------------------------------------
+      subroutine esb(esbloc)
+!C Calculate the local energy of a side chain and its derivatives in the
+!C corresponding virtual-bond valence angles THETA and the spherical angles 
+!C ALPHA and OMEGA derived from AM1 all-atom calculations.
+!C added by Urszula Kozlowska. 07/11/2007
+!C
+      real(kind=8),dimension(3):: x_prime,y_prime,z_prime
+      real(kind=8),dimension(9):: x
+     real(kind=8) :: sumene,dsc_i,dp2_i,xx,yy,zz,sumene1, &
+      sumene2,sumene3,sumene4,s1,s1_6,s2,s2_6,&
+      de_dxx,de_dyy,de_dzz,de_dt,s1_t,s1_6_t,s2_t,s2_6_t
+      real(kind=8),dimension(3):: dXX_Ci1,dYY_Ci1,dZZ_Ci1,dXX_Ci,&
+       dYY_Ci,dZZ_Ci,dXX_XYZ,dYY_XYZ,dZZ_XYZ,dt_dCi,dt_dCi1
+       real(kind=8) :: esbloc,delta,cosfac2,cosfac,sinfac2,sinfac,de_dtt,&
+       cossc,cossc1,cosfac2xx,sinfac2yy,pom1,pom
+       integer::it,nlobit,i,j,k
+!      common /sccalc/ time11,time12,time112,theti,it,nlobit
+      delta=0.02d0*pi
+      esbloc=0.0D0
+      do i=loc_start_nucl,loc_end_nucl
+        if (itype(i,2).eq.ntyp1_molec(2)) cycle
+        costtab(i+1) =dcos(theta(i+1))
+        sinttab(i+1) =dsqrt(1-costtab(i+1)*costtab(i+1))
+        cost2tab(i+1)=dsqrt(0.5d0*(1.0d0+costtab(i+1)))
+        sint2tab(i+1)=dsqrt(0.5d0*(1.0d0-costtab(i+1)))
+        cosfac2=0.5d0/(1.0d0+costtab(i+1))
+        cosfac=dsqrt(cosfac2)
+        sinfac2=0.5d0/(1.0d0-costtab(i+1))
+        sinfac=dsqrt(sinfac2)
+        it=itype(i,2)
+        if (it.eq.10) goto 1
+
+!c
+!C  Compute the axes of tghe local cartesian coordinates system; store in
+!c   x_prime, y_prime and z_prime 
+!c
+        do j=1,3
+          x_prime(j) = 0.00
+          y_prime(j) = 0.00
+          z_prime(j) = 0.00
+        enddo
+!C        write(2,*) "dc_norm", dc_norm(1,i+nres),dc_norm(2,i+nres),
+!C     &   dc_norm(3,i+nres)
+        do j = 1,3
+          x_prime(j) = (dc_norm(j,i) - dc_norm(j,i-1))*cosfac
+          y_prime(j) = (dc_norm(j,i) + dc_norm(j,i-1))*sinfac
+        enddo
+        do j = 1,3
+          z_prime(j) = -uz(j,i-1)
+        enddo
+
+        xx=0.0d0
+        yy=0.0d0
+        zz=0.0d0
+        do j = 1,3
+          xx = xx + x_prime(j)*dc_norm(j,i+nres)
+          yy = yy + y_prime(j)*dc_norm(j,i+nres)
+          zz = zz + z_prime(j)*dc_norm(j,i+nres)
+        enddo
+
+        xxtab(i)=xx
+        yytab(i)=yy
+        zztab(i)=zz
+         it=itype(i,2)
+        do j = 1,9
+          x(j) = sc_parmin_nucl(j,it)
+        enddo
+#ifdef CHECK_COORD
+!Cc diagnostics - remove later
+        xx1 = dcos(alph(2))
+        yy1 = dsin(alph(2))*dcos(omeg(2))
+        zz1 = -dsin(alph(2))*dsin(omeg(2))
+        write(2,'(3f8.1,3f9.3,1x,3f9.3)') &
+         alph(2)*rad2deg,omeg(2)*rad2deg,theta(3)*rad2deg,xx,yy,zz,&
+         xx1,yy1,zz1
+!C,"  --- ", xx_w,yy_w,zz_w
+!c end diagnostics
+#endif
+        sumene = enesc_nucl(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1))
+        esbloc = esbloc + sumene
+        if (energy_dec) write(iout,*) "i",i," esbloc",sumene,esbloc,xx,yy,zz
+        if (energy_dec) write(iout,*) "x",(x(k),k=1,9)
+#ifdef DEBUG
+        write (2,*) "x",(x(k),k=1,9)
+!C
+!C This section to check the numerical derivatives of the energy of ith side
+!C chain in xx, yy, zz, and theta. Use the -DDEBUG compiler option or insert
+!C #define DEBUG in the code to turn it on.
+!C
+        write (2,*) "sumene               =",sumene
+        aincr=1.0d-7
+        xxsave=xx
+        xx=xx+aincr
+        write (2,*) xx,yy,zz
+        sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1))
+        de_dxx_num=(sumenep-sumene)/aincr
+        xx=xxsave
+        write (2,*) "xx+ sumene from enesc=",sumenep,sumene
+        yysave=yy
+        yy=yy+aincr
+        write (2,*) xx,yy,zz
+        sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1))
+        de_dyy_num=(sumenep-sumene)/aincr
+        yy=yysave
+        write (2,*) "yy+ sumene from enesc=",sumenep,sumene
+        zzsave=zz
+        zz=zz+aincr
+        write (2,*) xx,yy,zz
+        sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1))
+        de_dzz_num=(sumenep-sumene)/aincr
+        zz=zzsave
+        write (2,*) "zz+ sumene from enesc=",sumenep,sumene
+        costsave=cost2tab(i+1)
+        sintsave=sint2tab(i+1)
+        cost2tab(i+1)=dcos(0.5d0*(theta(i+1)+aincr))
+        sint2tab(i+1)=dsin(0.5d0*(theta(i+1)+aincr))
+        sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1))
+        de_dt_num=(sumenep-sumene)/aincr
+        write (2,*) " t+ sumene from enesc=",sumenep,sumene
+        cost2tab(i+1)=costsave
+        sint2tab(i+1)=sintsave
+!C End of diagnostics section.
+#endif
+!C        
+!C Compute the gradient of esc
+!C
+        de_dxx=x(1)+2*x(4)*xx+x(7)*zz+x(8)*yy
+        de_dyy=x(2)+2*x(5)*yy+x(8)*xx+x(9)*zz
+        de_dzz=x(3)+2*x(6)*zz+x(7)*xx+x(9)*yy
+        de_dtt=0.0d0
+#ifdef DEBUG
+        write (2,*) "x",(x(k),k=1,9)
+        write (2,*) "xx",xx," yy",yy," zz",zz
+        write (2,*) "de_xx   ",de_xx," de_yy   ",de_yy,&
+          " de_zz   ",de_zz," de_tt   ",de_tt
+        write (2,*) "de_xx_num",de_dxx_num," de_yy_num",de_dyy_num,&
+          " de_zz_num",de_dzz_num," de_dt_num",de_dt_num
+#endif
+!C
+       cossc=scalar(dc_norm(1,i),dc_norm(1,i+nres))
+       cossc1=scalar(dc_norm(1,i-1),dc_norm(1,i+nres))
+       cosfac2xx=cosfac2*xx
+       sinfac2yy=sinfac2*yy
+       do k = 1,3
+         dt_dCi(k) = -(dc_norm(k,i-1)+costtab(i+1)*dc_norm(k,i))*&
+           vbld_inv(i+1)
+         dt_dCi1(k)= -(dc_norm(k,i)+costtab(i+1)*dc_norm(k,i-1))*&
+           vbld_inv(i)
+         pom=(dC_norm(k,i+nres)-cossc*dC_norm(k,i))*vbld_inv(i+1)
+         pom1=(dC_norm(k,i+nres)-cossc1*dC_norm(k,i-1))*vbld_inv(i)
+!c         write (iout,*) "i",i," k",k," pom",pom," pom1",pom1,
+!c     &    " dt_dCi",dt_dCi(k)," dt_dCi1",dt_dCi1(k)
+!c         write (iout,*) "dC_norm",(dC_norm(j,i),j=1,3),
+!c     &   (dC_norm(j,i-1),j=1,3)," vbld_inv",vbld_inv(i+1),vbld_inv(i)
+         dXX_Ci(k)=pom*cosfac-dt_dCi(k)*cosfac2xx
+         dXX_Ci1(k)=-pom1*cosfac-dt_dCi1(k)*cosfac2xx
+         dYY_Ci(k)=pom*sinfac+dt_dCi(k)*sinfac2yy
+         dYY_Ci1(k)=pom1*sinfac+dt_dCi1(k)*sinfac2yy
+         dZZ_Ci1(k)=0.0d0
+         dZZ_Ci(k)=0.0d0
+         do j=1,3
+           dZZ_Ci(k)=dZZ_Ci(k)-uzgrad(j,k,2,i-1)*dC_norm(j,i+nres)
+           dZZ_Ci1(k)=dZZ_Ci1(k)-uzgrad(j,k,1,i-1)*dC_norm(j,i+nres)
+         enddo
+
+         dXX_XYZ(k)=vbld_inv(i+nres)*(x_prime(k)-xx*dC_norm(k,i+nres))
+         dYY_XYZ(k)=vbld_inv(i+nres)*(y_prime(k)-yy*dC_norm(k,i+nres))
+         dZZ_XYZ(k)=vbld_inv(i+nres)*(z_prime(k)-zz*dC_norm(k,i+nres))
+!c
+         dt_dCi(k) = -dt_dCi(k)/sinttab(i+1)
+         dt_dCi1(k)= -dt_dCi1(k)/sinttab(i+1)
+       enddo
+
+       do k=1,3
+         dXX_Ctab(k,i)=dXX_Ci(k)
+         dXX_C1tab(k,i)=dXX_Ci1(k)
+         dYY_Ctab(k,i)=dYY_Ci(k)
+         dYY_C1tab(k,i)=dYY_Ci1(k)
+         dZZ_Ctab(k,i)=dZZ_Ci(k)
+         dZZ_C1tab(k,i)=dZZ_Ci1(k)
+         dXX_XYZtab(k,i)=dXX_XYZ(k)
+         dYY_XYZtab(k,i)=dYY_XYZ(k)
+         dZZ_XYZtab(k,i)=dZZ_XYZ(k)
+       enddo
+       do k = 1,3
+!c         write (iout,*) "k",k," dxx_ci1",dxx_ci1(k)," dyy_ci1",
+!c     &    dyy_ci1(k)," dzz_ci1",dzz_ci1(k)
+!c         write (iout,*) "k",k," dxx_ci",dxx_ci(k)," dyy_ci",
+!c     &    dyy_ci(k)," dzz_ci",dzz_ci(k)
+!c         write (iout,*) "k",k," dt_dci",dt_dci(k)," dt_dci",
+!c     &    dt_dci(k)
+!c         write (iout,*) "k",k," dxx_XYZ",dxx_XYZ(k)," dyy_XYZ",
+!c     &    dyy_XYZ(k)," dzz_XYZ",dzz_XYZ(k) 
+         gsbloc(k,i-1)=gsbloc(k,i-1)+de_dxx*dxx_ci1(k) &
+         +de_dyy*dyy_ci1(k)+de_dzz*dzz_ci1(k)+de_dt*dt_dCi1(k)
+         gsbloc(k,i)=gsbloc(k,i)+de_dxx*dxx_Ci(k) &
+         +de_dyy*dyy_Ci(k)+de_dzz*dzz_Ci(k)+de_dt*dt_dCi(k)
+         gsblocx(k,i)=                 de_dxx*dxx_XYZ(k)&
+         +de_dyy*dyy_XYZ(k)+de_dzz*dzz_XYZ(k)
+       enddo
+!c       write(iout,*) "ENERGY GRAD = ", (gsbloc(k,i-1),k=1,3),
+!c     &  (gsbloc(k,i),k=1,3),(gsblocx(k,i),k=1,3)  
+
+!C to check gradient call subroutine check_grad
+
+    1 continue
+      enddo
+      return
+      end subroutine esb
+!=-------------------------------------------------------
+      real(kind=8) function enesc_nucl(x,xx,yy,zz,cost2,sint2)
+!      implicit none
+      real(kind=8),dimension(9):: x(9)
+       real(kind=8) :: xx,yy,zz,cost2,sint2,sumene1,sumene2, &
+      sumene3,sumene4,sumene,dsc_i,dp2_i,dscp1,dscp2,s1,s1_6,s2,s2_6
+      integer i
+!c      write (2,*) "enesc"
+!c      write (2,*) "x",(x(i),i=1,9)
+!c      write(2,*)"xx",xx," yy",yy," zz",zz," cost2",cost2," sint2",sint2
+      sumene=x(1)*xx+x(2)*yy+x(3)*zz+x(4)*xx**2 &
+        + x(5)*yy**2+x(6)*zz**2+x(7)*xx*zz+x(8)*xx*yy &
+        + x(9)*yy*zz
+      enesc_nucl=sumene
+      return
+      end function enesc_nucl
 
 !----------------------------------------------------------------------------
 !-----------------------------------------------------------------------------
index e6b7f0a..6ae8cfd 100644 (file)
          enddo  
        endif
       enddo
+!---------reading nucleic acid parameters for rotamers-------------------
+      allocate(sc_parmin_nucl(9,ntyp_molec(2)))      !(maxsccoef,ntyp)
+      do i=1,ntyp_molec(2)
+        read (irotam_nucl,*,end=112,err=112)
+        do j=1,9
+          read(irotam_nucl,*,end=112,err=112) sc_parmin_nucl(j,i)
+        enddo
+      enddo
+      close(irotam_nucl)
+      if (lprint) then
+        write (iout,*)
+        write (iout,*) "Base rotamer parameters"
+        do i=1,ntyp_molec(2)
+          write (iout,'(a)') restyp(i,2)
+          write (iout,'(i5,f10.5)') (i,sc_parmin_nucl(j,i),j=1,9)
+        enddo
+      endif
+
 !
 ! Read the parameters of the probability distribution/energy expression
 ! of the side chains.