update
[unres.git] / source / cluster / wham / src-M / energy_p_new.F
index c02d085..66d6a26 100644 (file)
@@ -1,7 +1,6 @@
       subroutine etotal(energia,fact)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
 
 #ifndef ISNAN
       external proc_proc
@@ -12,18 +11,17 @@ cMS$ATTRIBUTES C ::  proc_proc
 
       include 'COMMON.IOUNITS'
       double precision energia(0:max_ene),energia1(0:max_ene+1)
-#ifdef MPL
-      include 'COMMON.INFO'
-      external d_vadd
-      integer ready
-#endif
       include 'COMMON.FFIELD'
       include 'COMMON.DERIV'
       include 'COMMON.INTERACT'
       include 'COMMON.SBRIDGE'
       include 'COMMON.CHAIN'
+      include 'COMMON.SHIELD'
+      include 'COMMON.CONTROL'
+      include 'COMMON.TORCNSTR'
       double precision fact(6)
-cd      write(iout, '(a,i2)')'Calling etotal ipot=',ipot
+c      write(iout, '(a,i2)')'Calling etotal ipot=',ipot
+c      call flush(iout)
 cd    print *,'nnt=',nnt,' nct=',nct
 C
 C Compute the side-chain and electrostatic interaction energy
@@ -47,8 +45,19 @@ C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence).
 C
 C Calculate electrostatic (H-bonding) energy of the main chain.
 C
-  106 call eelec(ees,evdw1,eel_loc,eello_turn3,eello_turn4)
-C
+  106 continue
+c      write (iout,*) "Sidechain"
+      call flush(iout)
+      call vec_and_deriv
+      if (shield_mode.eq.1) then
+       call set_shield_fac
+      else if  (shield_mode.eq.2) then
+       call set_shield_fac2
+      endif
+      call eelec(ees,evdw1,eel_loc,eello_turn3,eello_turn4)
+c            write(iout,*) 'po eelec'
+c      call flush(iout)
+
 C Calculate excluded-volume interaction energy between peptide groups
 C and side chains.
 C
@@ -56,8 +65,9 @@ C
 c
 c Calculate the bond-stretching energy
 c
+
       call ebond(estr)
-c      write (iout,*) "estr",estr
+C       write (iout,*) "estr",estr
 C 
 C Calculate the disulfide-bridge and other energy and the contributions
 C from other distance constraints.
@@ -67,26 +77,60 @@ cd    print *,'EHPB exitted succesfully.'
 C
 C Calculate the virtual-bond-angle energy.
 C
-      call ebend(ebe)
+C      print *,'Bend energy finished.'
+      if (wang.gt.0d0) then
+       if (tor_mode.eq.0) then
+         call ebend(ebe)
+       else
+C ebend kcc is Kubo cumulant clustered rigorous attemp to derive the
+C energy function
+         call ebend_kcc(ebe)
+       endif
+      else
+        ebe=0.0d0
+      endif
+      ethetacnstr=0.0d0
+      if (with_theta_constr) call etheta_constr(ethetacnstr)
+c      call ebend(ebe,ethetacnstr)
 cd    print *,'Bend energy finished.'
 C
 C Calculate the SC local energy.
 C
       call esc(escloc)
-cd    print *,'SCLOC energy finished.'
+C       print *,'SCLOC energy finished.'
 C
 C Calculate the virtual-bond torsional energy.
 C
-cd    print *,'nterm=',nterm
-      call etor(etors,edihcnstr,fact(1))
+      if (wtor.gt.0.0d0) then
+         if (tor_mode.eq.0) then
+           call etor(etors,fact(1))
+         else
+C etor kcc is Kubo cumulant clustered rigorous attemp to derive the
+C energy function
+           call etor_kcc(etors,fact(1))
+         endif
+      else
+        etors=0.0d0
+      endif
+      edihcnstr=0.0d0
+      if (ndih_constr.gt.0) call etor_constr(edihcnstr)
+c      print *,"Processor",myrank," computed Utor"
 C
 C 6/23/01 Calculate double-torsional energy
 C
-      call etor_d(etors_d,fact(2))
-C
-C 21/5/07 Calculate local sicdechain correlation energy
+      if ((wtor_d.gt.0.0d0).and.(tor_mode.eq.0)) then
+        call etor_d(etors_d,fact(2))
+      else
+        etors_d=0
+      endif
+c      print *,"Processor",myrank," computed Utord"
 C
       call eback_sc_corr(esccor)
+
+      if (wliptran.gt.0) then
+        call Eliptransfer(eliptran)
+      endif
+
 C 
 C 12/1/95 Multi-body terms
 C
@@ -94,37 +138,69 @@ C
       n_corr1=0
       if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 
      &    .or. wturn6.gt.0.0d0) then
-c         print *,"calling multibody_eello"
+c         write(iout,*)"calling multibody_eello"
          call multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr,n_corr1)
-c         write (*,*) 'n_corr=',n_corr,' n_corr1=',n_corr1
-c         print *,ecorr,ecorr5,ecorr6,eturn6
+c         write (iout,*) 'n_corr=',n_corr,' n_corr1=',n_corr1
+c         write (iout,*) ecorr,ecorr5,ecorr6,eturn6
+      else
+         ecorr=0.0d0
+         ecorr5=0.0d0
+         ecorr6=0.0d0
+         eturn6=0.0d0
       endif
       if (wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) then
+c         write (iout,*) "Calling multibody_hbond"
          call multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1)
       endif
 c      write (iout,*) "ft(6)",fact(6)," evdw",evdw," evdw_t",evdw_t
 #ifdef SPLITELE
+      if (shield_mode.gt.0) then
+      etot=fact(1)*wsc*(evdw+fact(6)*evdw_t)+fact(1)*wscp*evdw2
+     & +welec*fact(1)*ees
+     & +fact(1)*wvdwpp*evdw1
+     & +wang*ebe+wtor*fact(1)*etors+wscloc*escloc
+     & +wstrain*ehpb+wcorr*fact(3)*ecorr+wcorr5*fact(4)*ecorr5
+     & +wcorr6*fact(5)*ecorr6+wturn4*fact(3)*eello_turn4
+     & +wturn3*fact(2)*eello_turn3+wturn6*fact(5)*eturn6
+     & +wel_loc*fact(2)*eel_loc+edihcnstr+wtor_d*fact(2)*etors_d
+     & +wbond*estr+wsccor*fact(1)*esccor+ethetacnstr
+     & +wliptran*eliptran
+      else
       etot=wsc*(evdw+fact(6)*evdw_t)+wscp*evdw2+welec*fact(1)*ees
      & +wvdwpp*evdw1
      & +wang*ebe+wtor*fact(1)*etors+wscloc*escloc
-     & +wstrain*ehpb+nss*ebr+wcorr*fact(3)*ecorr+wcorr5*fact(4)*ecorr5
+     & +wstrain*ehpb+wcorr*fact(3)*ecorr+wcorr5*fact(4)*ecorr5
      & +wcorr6*fact(5)*ecorr6+wturn4*fact(3)*eello_turn4
      & +wturn3*fact(2)*eello_turn3+wturn6*fact(5)*eturn6
      & +wel_loc*fact(2)*eel_loc+edihcnstr+wtor_d*fact(2)*etors_d
-     & +wbond*estr+wsccor*fact(1)*esccor
+     & +wbond*estr+wsccor*fact(1)*esccor+ethetacnstr
+     & +wliptran*eliptran
+      endif
 #else
+      if (shield_mode.gt.0) then
+      etot=fact(1)wsc*(evdw+fact(6)*evdw_t)+fact(1)*wscp*evdw2
+     & +welec*fact(1)*(ees+evdw1)
+     & +wang*ebe+wtor*fact(1)*etors+wscloc*escloc
+     & +wstrain*ehpb+wcorr*fact(3)*ecorr+wcorr5*fact(4)*ecorr5
+     & +wcorr6*fact(5)*ecorr6+wturn4*fact(3)*eello_turn4
+     & +wturn3*fact(2)*eello_turn3+wturn6*fact(5)*eturn6
+     & +wel_loc*fact(2)*eel_loc+edihcnstr+wtor_d*fact(2)*etors_d
+     & +wbond*estr+wsccor*fact(1)*esccor+ethetacnstr
+     & +wliptran*eliptran
+      else
       etot=wsc*(evdw+fact(6)*evdw_t)+wscp*evdw2
      & +welec*fact(1)*(ees+evdw1)
      & +wang*ebe+wtor*fact(1)*etors+wscloc*escloc
-     & +wstrain*ehpb+nss*ebr+wcorr*fact(3)*ecorr+wcorr5*fact(4)*ecorr5
+     & +wstrain*ehpb+wcorr*fact(3)*ecorr+wcorr5*fact(4)*ecorr5
      & +wcorr6*fact(5)*ecorr6+wturn4*fact(3)*eello_turn4
      & +wturn3*fact(2)*eello_turn3+wturn6*fact(5)*eturn6
      & +wel_loc*fact(2)*eel_loc+edihcnstr+wtor_d*fact(2)*etors_d
-     & +wbond*estr+wsccor*fact(1)*esccor
+     & +wbond*estr+wsccor*fact(1)*esccor+ethetacnstr
+     & +wliptran*eliptran
+      endif
 #endif
       energia(0)=etot
       energia(1)=evdw
-c      call enerprint(energia(0),frac)
 #ifdef SCP14
       energia(2)=evdw2-evdw2_14
       energia(17)=evdw2_14
@@ -155,6 +231,8 @@ c      call enerprint(energia(0),frac)
       energia(19)=esccor
       energia(20)=edihcnstr
       energia(21)=evdw_t
+      energia(24)=ethetacnstr
+      energia(22)=eliptran
 c detecting NaNQ
 #ifdef ISNAN
 #ifdef AIX
@@ -174,6 +252,9 @@ c detecting NaNQ
 #ifdef MPL
 c     endif
 #endif
+#ifdef DEBUG
+      call enerprint(energia,fact)
+#endif
       if (calc_grad) then
 C
 C Sum up the components of the Cartesian gradient.
@@ -181,6 +262,7 @@ C
 #ifdef SPLITELE
       do i=1,nct
         do j=1,3
+      if (shield_mode.eq.0) then
           gradc(j,i,icg)=wsc*gvdwc(j,i)+wscp*gvdwc_scp(j,i)+
      &                welec*fact(1)*gelc(j,i)+wvdwpp*gvdwpp(j,i)+
      &                wbond*gradb(j,i)+
@@ -193,14 +275,57 @@ C
      &                wcorr6*fact(5)*gradcorr6(j,i)+
      &                wturn6*fact(5)*gcorr6_turn(j,i)+
      &                wsccor*fact(2)*gsccorc(j,i)
+     &               +wliptran*gliptranc(j,i)
           gradx(j,i,icg)=wsc*gvdwx(j,i)+wscp*gradx_scp(j,i)+
      &                  wbond*gradbx(j,i)+
      &                  wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+
      &                  wsccor*fact(2)*gsccorx(j,i)
+     &                 +wliptran*gliptranx(j,i)
+        else
+          gradc(j,i,icg)=fact(1)*wsc*gvdwc(j,i)
+     &                +fact(1)*wscp*gvdwc_scp(j,i)+
+     &               welec*fact(1)*gelc(j,i)+fact(1)*wvdwpp*gvdwpp(j,i)+
+     &                wbond*gradb(j,i)+
+     &                wstrain*ghpbc(j,i)+
+     &                wcorr*fact(3)*gradcorr(j,i)+
+     &                wel_loc*fact(2)*gel_loc(j,i)+
+     &                wturn3*fact(2)*gcorr3_turn(j,i)+
+     &                wturn4*fact(3)*gcorr4_turn(j,i)+
+     &                wcorr5*fact(4)*gradcorr5(j,i)+
+     &                wcorr6*fact(5)*gradcorr6(j,i)+
+     &                wturn6*fact(5)*gcorr6_turn(j,i)+
+     &                wsccor*fact(2)*gsccorc(j,i)
+     &               +wliptran*gliptranc(j,i)
+     &                 +welec*gshieldc(j,i)
+     &                 +welec*gshieldc_loc(j,i)
+     &                 +wcorr*gshieldc_ec(j,i)
+     &                 +wcorr*gshieldc_loc_ec(j,i)
+     &                 +wturn3*gshieldc_t3(j,i)
+     &                 +wturn3*gshieldc_loc_t3(j,i)
+     &                 +wturn4*gshieldc_t4(j,i)
+     &                 +wturn4*gshieldc_loc_t4(j,i)
+     &                 +wel_loc*gshieldc_ll(j,i)
+     &                 +wel_loc*gshieldc_loc_ll(j,i)
+
+          gradx(j,i,icg)=fact(1)*wsc*gvdwx(j,i)
+     &                 +fact(1)*wscp*gradx_scp(j,i)+
+     &                  wbond*gradbx(j,i)+
+     &                  wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+
+     &                  wsccor*fact(2)*gsccorx(j,i)
+     &                 +wliptran*gliptranx(j,i)
+     &                 +welec*gshieldx(j,i)
+     &                 +wcorr*gshieldx_ec(j,i)
+     &                 +wturn3*gshieldx_t3(j,i)
+     &                 +wturn4*gshieldx_t4(j,i)
+     &                 +wel_loc*gshieldx_ll(j,i)
+
+
+        endif
         enddo
 #else
       do i=1,nct
         do j=1,3
+                if (shield_mode.eq.0) then
           gradc(j,i,icg)=wsc*gvdwc(j,i)+wscp*gvdwc_scp(j,i)+
      &                welec*fact(1)*gelc(j,i)+wstrain*ghpbc(j,i)+
      &                wbond*gradb(j,i)+
@@ -212,10 +337,50 @@ C
      &                wcorr6*fact(5)*gradcorr6(j,i)+
      &                wturn6*fact(5)*gcorr6_turn(j,i)+
      &                wsccor*fact(2)*gsccorc(j,i)
+     &               +wliptran*gliptranc(j,i)
           gradx(j,i,icg)=wsc*gvdwx(j,i)+wscp*gradx_scp(j,i)+
      &                  wbond*gradbx(j,i)+
      &                  wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+
      &                  wsccor*fact(1)*gsccorx(j,i)
+     &                 +wliptran*gliptranx(j,i)
+              else
+          gradc(j,i,icg)=fact(1)*wsc*gvdwc(j,i)+
+     &                   fact(1)*wscp*gvdwc_scp(j,i)+
+     &                welec*fact(1)*gelc(j,i)+wstrain*ghpbc(j,i)+
+     &                wbond*gradb(j,i)+
+     &                wcorr*fact(3)*gradcorr(j,i)+
+     &                wel_loc*fact(2)*gel_loc(j,i)+
+     &                wturn3*fact(2)*gcorr3_turn(j,i)+
+     &                wturn4*fact(3)*gcorr4_turn(j,i)+
+     &                wcorr5*fact(4)*gradcorr5(j,i)+
+     &                wcorr6*fact(5)*gradcorr6(j,i)+
+     &                wturn6*fact(5)*gcorr6_turn(j,i)+
+     &                wsccor*fact(2)*gsccorc(j,i)
+     &               +wliptran*gliptranc(j,i)
+     &                 +welec*gshieldc(j,i)
+     &                 +welec*gshieldc_loc(j,i)
+     &                 +wcorr*gshieldc_ec(j,i)
+     &                 +wcorr*gshieldc_loc_ec(j,i)
+     &                 +wturn3*gshieldc_t3(j,i)
+     &                 +wturn3*gshieldc_loc_t3(j,i)
+     &                 +wturn4*gshieldc_t4(j,i)
+     &                 +wturn4*gshieldc_loc_t4(j,i)
+     &                 +wel_loc*gshieldc_ll(j,i)
+     &                 +wel_loc*gshieldc_loc_ll(j,i)
+
+          gradx(j,i,icg)=fact(1)*wsc*gvdwx(j,i)+
+     &                  fact(1)*wscp*gradx_scp(j,i)+
+     &                  wbond*gradbx(j,i)+
+     &                  wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+
+     &                  wsccor*fact(1)*gsccorx(j,i)
+     &                 +wliptran*gliptranx(j,i)
+     &                 +welec*gshieldx(j,i)
+     &                 +wcorr*gshieldx_ec(j,i)
+     &                 +wturn3*gshieldx_t3(j,i)
+     &                 +wturn4*gshieldx_t4(j,i)
+     &                 +wel_loc*gshieldx_ll(j,i)
+
+         endif
         enddo
 #endif
       enddo
@@ -229,16 +394,17 @@ C
      &   +wturn3*fact(2)*gel_loc_turn3(i)
      &   +wturn6*fact(5)*gel_loc_turn6(i)
      &   +wel_loc*fact(2)*gel_loc_loc(i)
-     &   +wsccor*fact(1)*gsccor_loc(i)
+c     &   +wsccor*fact(1)*gsccor_loc(i)
+c BYLA ROZNICA Z CLUSTER< OSTATNIA LINIA DODANA
       enddo
       endif
+      if (dyn_ss) call dyn_set_nss
       return
       end
 C------------------------------------------------------------------------
       subroutine enerprint(energia,fact)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.FFIELD'
       include 'COMMON.SBRIDGE'
@@ -269,6 +435,8 @@ C------------------------------------------------------------------------
       esccor=energia(19)
       edihcnstr=energia(20)
       estr=energia(18)
+      ethetacnstr=energia(24)
+      eliptran=energia(22)
 #ifdef SPLITELE
       write (iout,10) evdw,wsc,evdw2,wscp,ees,welec*fact(1),evdw1,
      &  wvdwpp,
@@ -277,7 +445,8 @@ C------------------------------------------------------------------------
      &  ecorr,wcorr*fact(3),ecorr5,wcorr5*fact(4),ecorr6,wcorr6*fact(5),
      &  eel_loc,wel_loc*fact(2),eello_turn3,wturn3*fact(2),
      &  eello_turn4,wturn4*fact(3),eello_turn6,wturn6*fact(5),
-     &  esccor,wsccor*fact(1),edihcnstr,ebr*nss,etot
+     &  esccor,wsccor*fact(1),edihcnstr,ethetacnstr,ebr*nss,
+     & eliptran,wliptran,etot
    10 format (/'Virtual-chain energies:'//
      & 'EVDW=  ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-SC)'/
      & 'EVDW2= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-p)'/
@@ -299,7 +468,9 @@ C------------------------------------------------------------------------
      & 'ETURN6=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 6th order)'/
      & 'ESCCOR=',1pE16.6,' WEIGHT=',1pD16.6,' (backbone-rotamer corr)'/
      & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/
+     & 'ETHETC= ',1pE16.6,' (valence angle constraints)'/
      & 'ESS=   ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ 
+     & 'ELT=',1pE16.6, ' WEIGHT=',1pD16.6,' (Lipid transfer energy)'/
      & 'ETOT=  ',1pE16.6,' (total)')
 #else
       write (iout,10) evdw,wsc,evdw2,wscp,ees,welec*fact(1),estr,wbond,
@@ -308,7 +479,7 @@ C------------------------------------------------------------------------
      &  ecorr6,wcorr6*fact(5),eel_loc,wel_loc*fact(2),
      &  eello_turn3,wturn3*fact(2),eello_turn4,wturn4*fact(3),
      &  eello_turn6,wturn6*fact(5),esccor*fact(1),wsccor,
-     &  edihcnstr,ebr*nss,etot
+     &  edihcnstr,ethetacnstr,ebr*nss,eliptran,wliptran,etot
    10 format (/'Virtual-chain energies:'//
      & 'EVDW=  ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-SC)'/
      & 'EVDW2= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-p)'/
@@ -329,7 +500,9 @@ C------------------------------------------------------------------------
      & 'ETURN6=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 6th order)'/
      & 'ESCCOR=',1pE16.6,' WEIGHT=',1pD16.6,' (backbone-rotamer corr)'/
      & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/
+     & 'ETHETC= ',1pE16.6,' (valence angle constraints)'/
      & 'ESS=   ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ 
+     & 'ELT=',1pE16.6, ' WEIGHT=',1pD16.6,' (Lipid transfer energy)'/
      & 'ETOT=  ',1pE16.6,' (total)')
 #endif
       return
@@ -342,7 +515,6 @@ C assuming the LJ potential of interaction.
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include "DIMENSIONS.COMPAR"
       parameter (accur=1.0d-10)
       include 'COMMON.GEO'
@@ -360,12 +532,20 @@ C
       integer icant
       external icant
 cd    print *,'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon
+c ROZNICA z cluster
+c      do i=1,210
+c        do j=1,2
+c          eneps_temp(j,i)=0.0d0
+c        enddo
+c      enddo
+cROZNICA
+
       evdw=0.0D0
       evdw_t=0.0d0
       do i=iatsc_s,iatsc_e
-        itypi=itype(i)
-        if (itypi.eq.21) cycle
-        itypi1=itype(i+1)
+        itypi=iabs(itype(i))
+        if (itypi.eq.ntyp1) cycle
+        itypi1=iabs(itype(i+1))
         xi=c(1,nres+i)
         yi=c(2,nres+i)
         zi=c(3,nres+i)
@@ -378,8 +558,8 @@ C
 cd        write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint),
 cd   &                  'iend=',iend(i,iint)
           do j=istart(i,iint),iend(i,iint)
-            itypj=itype(j)
-            if (itypj.eq.21) cycle
+            itypj=iabs(itype(j))
+            if (itypj.eq.ntyp1) cycle
             xj=c(1,nres+j)-xi
             yj=c(2,nres+j)-yi
             zj=c(3,nres+j)-zi
@@ -389,17 +569,22 @@ C Change 12/1/95 to calculate four-body interactions
 c           write (iout,*)'i=',i,' j=',j,' itypi=',itypi,' itypj=',itypj
             eps0ij=eps(itypi,itypj)
             fac=rrij**expon2
-            e1=fac*fac*aa(itypi,itypj)
-            e2=fac*bb(itypi,itypj)
+            e1=fac*fac*aa
+            e2=fac*bb
             evdwij=e1+e2
             ij=icant(itypi,itypj)
+c ROZNICA z cluster
+c            eneps_temp(1,ij)=eneps_temp(1,ij)+e1/dabs(eps0ij)
+c            eneps_temp(2,ij)=eneps_temp(2,ij)+e2/eps0ij
+c
+
 cd          sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0)
 cd          epsi=bb(itypi,itypj)**2/aa(itypi,itypj)
 cd          write (iout,'(2(a3,i3,2x),6(1pd12.4)/2(3(1pd12.4),5x)/)')
 cd   &        restyp(itypi),i,restyp(itypj),j,aa(itypi,itypj),
 cd   &        bb(itypi,itypj),1.0D0/dsqrt(rrij),evdwij,epsi,sigm,
 cd   &        (c(k,i),k=1,3),(c(k,j),k=1,3)
-            if (bb(itypi,itypj).gt.0.0d0) then
+            if (bb.gt.0.0d0) then
               evdw=evdw+evdwij
             else
               evdw_t=evdw_t+evdwij
@@ -510,7 +695,6 @@ C assuming the LJK potential of interaction.
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include "DIMENSIONS.COMPAR"
       include 'COMMON.GEO'
       include 'COMMON.VAR'
@@ -525,12 +709,17 @@ C
       integer icant
       external icant
 c     print *,'Entering ELJK nnt=',nnt,' nct=',nct,' expon=',expon
+c      do i=1,210
+c        do j=1,2
+c          eneps_temp(j,i)=0.0d0
+c        enddo
+c      enddo
       evdw=0.0D0
       evdw_t=0.0d0
       do i=iatsc_s,iatsc_e
-        itypi=itype(i)
-        if (itypi.eq.21) cycle
-        itypi1=itype(i+1)
+        itypi=iabs(itype(i))
+        if (itypi.eq.ntyp1) cycle
+        itypi1=iabs(itype(i+1))
         xi=c(1,nres+i)
         yi=c(2,nres+i)
         zi=c(3,nres+i)
@@ -539,8 +728,8 @@ C Calculate SC interaction energy.
 C
         do iint=1,nint_gr(i)
           do j=istart(i,iint),iend(i,iint)
-            itypj=itype(j)
-            if (itypj.eq.21) cycle
+            itypj=iabs(itype(j))
+            if (itypj.eq.ntyp1) cycle
             xj=c(1,nres+j)-xi
             yj=c(2,nres+j)-yi
             zj=c(3,nres+j)-zi
@@ -551,10 +740,13 @@ C
             rij=1.0D0/r_inv_ij 
             r_shift_inv=1.0D0/(rij+r0(itypi,itypj)-sigma(itypi,itypj))
             fac=r_shift_inv**expon
-            e1=fac*fac*aa(itypi,itypj)
-            e2=fac*bb(itypi,itypj)
+            e1=fac*fac*aa
+            e2=fac*bb
             evdwij=e_augm+e1+e2
             ij=icant(itypi,itypj)
+c            eneps_temp(1,ij)=eneps_temp(1,ij)+(e1+a_augm)
+c     &        /dabs(eps(itypi,itypj))
+c            eneps_temp(2,ij)=eneps_temp(2,ij)+e2/eps(itypi,itypj)
 cd          sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0)
 cd          epsi=bb(itypi,itypj)**2/aa(itypi,itypj)
 cd          write (iout,'(2(a3,i3,2x),8(1pd12.4)/2(3(1pd12.4),5x)/)')
@@ -562,7 +754,7 @@ cd   &        restyp(itypi),i,restyp(itypj),j,aa(itypi,itypj),
 cd   &        bb(itypi,itypj),augm(itypi,itypj),epsi,sigm,
 cd   &        sigma(itypi,itypj),1.0D0/dsqrt(rrij),evdwij,
 cd   &        (c(k,i),k=1,3),(c(k,j),k=1,3)
-            if (bb(itypi,itypj).gt.0.0d0) then
+            if (bb.gt.0.0d0) then
               evdw=evdw+evdwij
             else 
               evdw_t=evdw_t+evdwij
@@ -606,7 +798,6 @@ C assuming the Berne-Pechukas potential of interaction.
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include "DIMENSIONS.COMPAR"
       include 'COMMON.GEO'
       include 'COMMON.VAR'
@@ -622,6 +813,11 @@ c     double precision rrsave(maxdim)
       logical lprn
       integer icant
       external icant
+c      do i=1,210
+c        do j=1,2
+c          eneps_temp(j,i)=0.0d0
+c        enddo
+c      enddo
       evdw=0.0D0
       evdw_t=0.0d0
 c     print *,'Entering EBP nnt=',nnt,' nct=',nct,' expon=',expon
@@ -632,9 +828,9 @@ c     else
 c     endif
       ind=0
       do i=iatsc_s,iatsc_e
-        itypi=itype(i)
-        if (itypi.eq.21) cycle
-        itypi1=itype(i+1)
+        itypi=iabs(itype(i))
+        if (itypi.eq.ntyp1) cycle
+        itypi1=iabs(itype(i+1))
         xi=c(1,nres+i)
         yi=c(2,nres+i)
         zi=c(3,nres+i)
@@ -648,8 +844,8 @@ C
         do iint=1,nint_gr(i)
           do j=istart(i,iint),iend(i,iint)
             ind=ind+1
-            itypj=itype(j)
-            if (itypj.eq.21) cycle
+            itypj=iabs(itype(j))
+            if (itypj.eq.ntyp1) cycle
             dscj_inv=vbld_inv(j+nres)
             chi1=chi(itypi,itypj)
             chi2=chi(itypj,itypi)
@@ -688,29 +884,32 @@ C Calculate the angle-dependent terms of energy & contributions to derivatives.
 C Calculate whole angle-dependent part of epsilon and contributions
 C to its derivatives
             fac=(rrij*sigsq)**expon2
-            e1=fac*fac*aa(itypi,itypj)
-            e2=fac*bb(itypi,itypj)
+            e1=fac*fac*aa
+            e2=fac*bb
             evdwij=eps1*eps2rt*eps3rt*(e1+e2)
             eps2der=evdwij*eps3rt
             eps3der=evdwij*eps2rt
             evdwij=evdwij*eps2rt*eps3rt
             ij=icant(itypi,itypj)
             aux=eps1*eps2rt**2*eps3rt**2
-            if (bb(itypi,itypj).gt.0.0d0) then
+c            eneps_temp(1,ij)=eneps_temp(1,ij)+e1*aux
+c     &        /dabs(eps(itypi,itypj))
+c            eneps_temp(2,ij)=eneps_temp(2,ij)+e2*aux/eps(itypi,itypj)
+            if (bb.gt.0.0d0) then
               evdw=evdw+evdwij
             else
               evdw_t=evdw_t+evdwij
             endif
             if (calc_grad) then
             if (lprn) then
-            sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0)
-            epsi=bb(itypi,itypj)**2/aa(itypi,itypj)
-cd            write (iout,'(2(a3,i3,2x),15(0pf7.3))')
-cd     &        restyp(itypi),i,restyp(itypj),j,
-cd     &        epsi,sigm,chi1,chi2,chip1,chip2,
-cd     &        eps1,eps2rt**2,eps3rt**2,1.0D0/dsqrt(sigsq),
-cd     &        om1,om2,om12,1.0D0/dsqrt(rrij),
-cd     &        evdwij
+            sigm=dabs(aa/bb)**(1.0D0/6.0D0)
+            epsi=bb**2/aa
+            write (iout,'(2(a3,i3,2x),15(0pf7.3))')
+     &        restyp(itypi),i,restyp(itypj),j,
+     &        epsi,sigm,chi1,chi2,chip1,chip2,
+     &        eps1,eps2rt**2,eps3rt**2,1.0D0/dsqrt(sigsq),
+     &        om1,om2,om12,1.0D0/dsqrt(rrij),
+     &        evdwij
             endif
 C Calculate gradient components.
             e1=e1*eps1*eps2rt**2*eps3rt**2
@@ -739,7 +938,6 @@ C assuming the Gay-Berne potential of interaction.
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include "DIMENSIONS.COMPAR"
       include 'COMMON.GEO'
       include 'COMMON.VAR'
@@ -750,10 +948,16 @@ C
       include 'COMMON.INTERACT'
       include 'COMMON.IOUNITS'
       include 'COMMON.CALC'
+      include 'COMMON.SBRIDGE'
       logical lprn
       common /srutu/icall
-      integer icant
+      integer icant,xshift,yshift,zshift
       external icant
+c      do i=1,210
+c        do j=1,2
+c          eneps_temp(j,i)=0.0d0
+c        enddo
+c      enddo
 c     print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon
       evdw=0.0D0
       evdw_t=0.0d0
@@ -761,12 +965,42 @@ c     print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon
 c      if (icall.gt.0) lprn=.true.
       ind=0
       do i=iatsc_s,iatsc_e
-        itypi=itype(i)
-        if (itypi.eq.21) cycle
-        itypi1=itype(i+1)
+        itypi=iabs(itype(i))
+        if (itypi.eq.ntyp1) cycle
+        itypi1=iabs(itype(i+1))
         xi=c(1,nres+i)
         yi=c(2,nres+i)
         zi=c(3,nres+i)
+C returning the ith atom to box
+          xi=mod(xi,boxxsize)
+          if (xi.lt.0) xi=xi+boxxsize
+          yi=mod(yi,boxysize)
+          if (yi.lt.0) yi=yi+boxysize
+          zi=mod(zi,boxzsize)
+          if (zi.lt.0) zi=zi+boxzsize
+       if ((zi.gt.bordlipbot)
+     &.and.(zi.lt.bordliptop)) then
+C the energy transfer exist
+        if (zi.lt.buflipbot) then
+C what fraction I am in
+         fracinbuf=1.0d0-
+     &        ((zi-bordlipbot)/lipbufthick)
+C lipbufthick is thickenes of lipid buffore
+         sslipi=sscalelip(fracinbuf)
+         ssgradlipi=-sscagradlip(fracinbuf)/lipbufthick
+        elseif (zi.gt.bufliptop) then
+         fracinbuf=1.0d0-((bordliptop-zi)/lipbufthick)
+         sslipi=sscalelip(fracinbuf)
+         ssgradlipi=sscagradlip(fracinbuf)/lipbufthick
+        else
+         sslipi=1.0d0
+         ssgradlipi=0.0
+        endif
+       else
+         sslipi=0.0d0
+         ssgradlipi=0.0
+       endif
+
         dxi=dc_norm(1,nres+i)
         dyi=dc_norm(2,nres+i)
         dzi=dc_norm(3,nres+i)
@@ -776,9 +1010,29 @@ C Calculate SC interaction energy.
 C
         do iint=1,nint_gr(i)
           do j=istart(i,iint),iend(i,iint)
+            IF (dyn_ss_mask(i).and.dyn_ss_mask(j)) THEN
+              call dyn_ssbond_ene(i,j,evdwij)
+              evdw=evdw+evdwij
+C            write (iout,'(a6,2i5,0pf7.3,a3,2f10.3)')
+C     &                        'evdw',i,j,evdwij,' ss',evdw,evdw_t
+C triple bond artifac removal
+             do k=j+1,iend(i,iint)
+C search over all next residues
+              if (dyn_ss_mask(k)) then
+C check if they are cysteins
+C              write(iout,*) 'k=',k
+              call triple_ssbond_ene(i,j,k,evdwij)
+C call the energy function that removes the artifical triple disulfide
+C bond the soubroutine is located in ssMD.F
+              evdw=evdw+evdwij
+C             write (iout,'(a6,2i5,0pf7.3,a3,2f10.3)')
+C     &                        'evdw',i,j,evdwij,'tss',evdw,evdw_t
+              endif!dyn_ss_mask(k)
+             enddo! k
+            ELSE
             ind=ind+1
-            itypj=itype(j)
-            if (itypj.eq.21) cycle
+            itypj=iabs(itype(j))
+            if (itypj.eq.ntyp1) cycle
             dscj_inv=vbld_inv(j+nres)
             sig0ij=sigma(itypi,itypj)
             chi1=chi(itypi,itypj)
@@ -800,17 +1054,96 @@ c           chip12=0.0D0
 c           alf1=0.0D0
 c           alf2=0.0D0
 c           alf12=0.0D0
-            xj=c(1,nres+j)-xi
-            yj=c(2,nres+j)-yi
-            zj=c(3,nres+j)-zi
+            xj=c(1,nres+j)
+            yj=c(2,nres+j)
+            zj=c(3,nres+j)
+C returning jth atom to box
+          xj=mod(xj,boxxsize)
+          if (xj.lt.0) xj=xj+boxxsize
+          yj=mod(yj,boxysize)
+          if (yj.lt.0) yj=yj+boxysize
+          zj=mod(zj,boxzsize)
+          if (zj.lt.0) zj=zj+boxzsize
+       if ((zj.gt.bordlipbot)
+     &.and.(zj.lt.bordliptop)) then
+C the energy transfer exist
+        if (zj.lt.buflipbot) then
+C what fraction I am in
+         fracinbuf=1.0d0-
+     &        ((zj-bordlipbot)/lipbufthick)
+C lipbufthick is thickenes of lipid buffore
+         sslipj=sscalelip(fracinbuf)
+         ssgradlipj=-sscagradlip(fracinbuf)/lipbufthick
+        elseif (zj.gt.bufliptop) then
+         fracinbuf=1.0d0-((bordliptop-zj)/lipbufthick)
+         sslipj=sscalelip(fracinbuf)
+         ssgradlipj=sscagradlip(fracinbuf)/lipbufthick
+        else
+         sslipj=1.0d0
+         ssgradlipj=0.0
+        endif
+       else
+         sslipj=0.0d0
+         ssgradlipj=0.0
+       endif
+      aa=aa_lip(itypi,itypj)*(sslipi+sslipj)/2.0d0
+     &  +aa_aq(itypi,itypj)*(2.0d0-sslipi-sslipj)/2.0d0
+      bb=bb_lip(itypi,itypj)*(sslipi+sslipj)/2.0d0
+     &  +bb_aq(itypi,itypj)*(2.0d0-sslipi-sslipj)/2.0d0
+C       if (aa.ne.aa_aq(itypi,itypj)) then
+       
+C      write(iout,*) "tu,", i,j,aa_aq(itypi,itypj)-aa,
+C     & bb_aq(itypi,itypj)-bb,
+C     & sslipi,sslipj
+C         endif
+
+C        write(iout,*),aa,aa_lip(itypi,itypj),aa_aq(itypi,itypj)
+C checking the distance
+      dist_init=(xj-xi)**2+(yj-yi)**2+(zj-zi)**2
+      xj_safe=xj
+      yj_safe=yj
+      zj_safe=zj
+      subchap=0
+C finding the closest
+      do xshift=-1,1
+      do yshift=-1,1
+      do zshift=-1,1
+          xj=xj_safe+xshift*boxxsize
+          yj=yj_safe+yshift*boxysize
+          zj=zj_safe+zshift*boxzsize
+          dist_temp=(xj-xi)**2+(yj-yi)**2+(zj-zi)**2
+          if(dist_temp.lt.dist_init) then
+            dist_init=dist_temp
+            xj_temp=xj
+            yj_temp=yj
+            zj_temp=zj
+            subchap=1
+          endif
+       enddo
+       enddo
+       enddo
+       if (subchap.eq.1) then
+          xj=xj_temp-xi
+          yj=yj_temp-yi
+          zj=zj_temp-zi
+       else
+          xj=xj_safe-xi
+          yj=yj_safe-yi
+          zj=zj_safe-zi
+       endif
+
             dxj=dc_norm(1,nres+j)
             dyj=dc_norm(2,nres+j)
             dzj=dc_norm(3,nres+j)
 c            write (iout,*) i,j,xj,yj,zj
             rrij=1.0D0/(xj*xj+yj*yj+zj*zj)
             rij=dsqrt(rrij)
+            sss=sscale((1.0d0/rij)/sigma(itypi,itypj))
+            sssgrad=sscagrad((1.0d0/rij)/sigma(itypi,itypj))
+            if (sss.le.0.0) cycle
 C Calculate angle-dependent terms of energy and contributions to their
 C derivatives.
+
             call sc_angular
             sigsq=1.0D0/sigsq
             sig=sig0ij*dsqrt(sigsq)
@@ -824,32 +1157,39 @@ C I hate to put IF's in the loops, but here don't have another choice!!!!
 c---------------------------------------------------------------
             rij_shift=1.0D0/rij_shift 
             fac=rij_shift**expon
-            e1=fac*fac*aa(itypi,itypj)
-            e2=fac*bb(itypi,itypj)
+            e1=fac*fac*aa
+            e2=fac*bb
             evdwij=eps1*eps2rt*eps3rt*(e1+e2)
             eps2der=evdwij*eps3rt
             eps3der=evdwij*eps2rt
             evdwij=evdwij*eps2rt*eps3rt
-            if (bb(itypi,itypj).gt.0) then
-              evdw=evdw+evdwij
+            if (bb.gt.0) then
+              evdw=evdw+evdwij*sss
             else
-              evdw_t=evdw_t+evdwij
+              evdw_t=evdw_t+evdwij*sss
             endif
             ij=icant(itypi,itypj)
             aux=eps1*eps2rt**2*eps3rt**2
+c            eneps_temp(1,ij)=eneps_temp(1,ij)+aux*e1
+c     &        /dabs(eps(itypi,itypj))
+c            eneps_temp(2,ij)=eneps_temp(2,ij)+aux*e2/eps(itypi,itypj)
 c            write (iout,*) "i",i," j",j," itypi",itypi," itypj",itypj,
 c     &         " ij",ij," eneps",aux*e1/dabs(eps(itypi,itypj)),
 c     &         aux*e2/eps(itypi,itypj)
 c            if (lprn) then
-            sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0)
-            epsi=bb(itypi,itypj)**2/aa(itypi,itypj)
-c            write (iout,'(2(a3,i3,2x),17(0pf7.3))')
-c     &        restyp(itypi),i,restyp(itypj),j,
-c     &        epsi,sigm,chi1,chi2,chip1,chip2,
-c     &        eps1,eps2rt**2,eps3rt**2,sig,sig0ij,
-c     &        om1,om2,om12,1.0D0/rij,1.0D0/rij_shift,
-c     &        evdwij
-c             write (iout,*) "pratial sum", evdw,evdw_t
+            sigm=dabs(aa/bb)**(1.0D0/6.0D0)
+            epsi=bb**2/aa
+C#define DEBUG
+#ifdef DEBUG
+            write (iout,'(2(a3,i3,2x),17(0pf7.3))')
+     &        restyp(itypi),i,restyp(itypj),j,
+     &        epsi,sigm,chi1,chi2,chip1,chip2,
+     &        eps1,eps2rt**2,eps3rt**2,sig,sig0ij,
+     &        om1,om2,om12,1.0D0/rij,1.0D0/rij_shift,
+     &        evdwij
+             write (iout,*) "partial sum", evdw, evdw_t
+#endif
+C#undef DEBUG
 c            endif
             if (calc_grad) then
 C Calculate gradient components.
@@ -857,6 +1197,7 @@ C Calculate gradient components.
             fac=-expon*(e1+evdwij)*rij_shift
             sigder=fac*sigder
             fac=rij*fac
+            fac=fac+evdwij/sss*sssgrad/sigma(itypi,itypj)*rij
 C Calculate the radial part of the gradient
             gg(1)=xj*fac
             gg(2)=yj*fac
@@ -864,6 +1205,8 @@ C Calculate the radial part of the gradient
 C Calculate angular part of the gradient.
             call sc_grad
             endif
+C            write(iout,*)  "partial sum", evdw, evdw_t
+            ENDIF    ! dyn_ss            
           enddo      ! j
         enddo        ! iint
       enddo          ! i
@@ -877,8 +1220,8 @@ C assuming the Gay-Berne-Vorobjev potential of interaction.
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include "DIMENSIONS.COMPAR"
+      include 'COMMON.CONTROL'
       include 'COMMON.GEO'
       include 'COMMON.VAR'
       include 'COMMON.LOCAL'
@@ -888,10 +1231,16 @@ C
       include 'COMMON.INTERACT'
       include 'COMMON.IOUNITS'
       include 'COMMON.CALC'
+      include 'COMMON.SBRIDGE'
       common /srutu/ icall
       logical lprn
       integer icant
       external icant
+c      do i=1,210
+c        do j=1,2
+c          eneps_temp(j,i)=0.0d0
+c        enddo
+c      enddo
       evdw=0.0D0
       evdw_t=0.0d0
 c     print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon
@@ -900,12 +1249,45 @@ c     print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon
 c      if (icall.gt.0) lprn=.true.
       ind=0
       do i=iatsc_s,iatsc_e
-        itypi=itype(i)
-        if (itypi.eq.21) cycle
-        itypi1=itype(i+1)
+        itypi=iabs(itype(i))
+        if (itypi.eq.ntyp1) cycle
+        itypi1=iabs(itype(i+1))
         xi=c(1,nres+i)
         yi=c(2,nres+i)
         zi=c(3,nres+i)
+C returning the ith atom to box
+        xi=mod(xi,boxxsize)
+        if (xi.lt.0) xi=xi+boxxsize
+        yi=mod(yi,boxysize)
+        if (yi.lt.0) yi=yi+boxysize
+        zi=mod(zi,boxzsize)
+        if (zi.lt.0) zi=zi+boxzsize
+        if ((zi.gt.bordlipbot)
+     &  .and.(zi.lt.bordliptop)) then
+C the energy transfer exist
+          if (zi.lt.buflipbot) then
+C what fraction I am in
+            fracinbuf=1.0d0-
+     &        ((zi-bordlipbot)/lipbufthick)
+C lipbufthick is thickenes of lipid buffore
+            sslipi=sscalelip(fracinbuf)
+            ssgradlipi=-sscagradlip(fracinbuf)/lipbufthick
+          elseif (zi.gt.bufliptop) then
+            fracinbuf=1.0d0-((bordliptop-zi)/lipbufthick)
+            sslipi=sscalelip(fracinbuf)
+            ssgradlipi=sscagradlip(fracinbuf)/lipbufthick
+          else
+            sslipi=1.0d0
+            ssgradlipi=0.0
+          endif
+        else
+          sslipi=0.0d0
+          ssgradlipi=0.0
+        endif
+        dxi=dc_norm(1,nres+i)
+        dyi=dc_norm(2,nres+i)
+        dzi=dc_norm(3,nres+i)
+        dsci_inv=vbld_inv(i+nres)
         dxi=dc_norm(1,nres+i)
         dyi=dc_norm(2,nres+i)
         dzi=dc_norm(3,nres+i)
@@ -915,9 +1297,29 @@ C Calculate SC interaction energy.
 C
         do iint=1,nint_gr(i)
           do j=istart(i,iint),iend(i,iint)
+            IF (dyn_ss_mask(i).and.dyn_ss_mask(j)) THEN
+              call dyn_ssbond_ene(i,j,evdwij)
+              evdw=evdw+evdwij
+              if (energy_dec) write (iout,'(a6,2i5,0pf7.3,a3,2f10.3)')
+     &                        'evdw',i,j,evdwij,' ss',evdw,evdw_t
+C triple bond artifac removal
+             do k=j+1,iend(i,iint)
+C search over all next residues
+              if (dyn_ss_mask(k)) then
+C check if they are cysteins
+C              write(iout,*) 'k=',k
+              call triple_ssbond_ene(i,j,k,evdwij)
+C call the energy function that removes the artifical triple disulfide
+C bond the soubroutine is located in ssMD.F
+              evdw=evdw+evdwij
+             if (energy_dec) write (iout,'(a6,2i5,0pf7.3,a3,2f10.3)')
+     &                        'evdw',i,j,evdwij,'tss',evdw,evdw_t
+              endif!dyn_ss_mask(k)
+             enddo! k
+            ELSE
             ind=ind+1
-            itypj=itype(j)
-            if (itypj.eq.21) cycle
+            itypj=iabs(itype(j))
+            if (itypj.eq.ntyp1) cycle
             dscj_inv=vbld_inv(j+nres)
             sig0ij=sigma(itypi,itypj)
             r0ij=r0(itypi,itypj)
@@ -940,16 +1342,96 @@ c           chip12=0.0D0
 c           alf1=0.0D0
 c           alf2=0.0D0
 c           alf12=0.0D0
-            xj=c(1,nres+j)-xi
-            yj=c(2,nres+j)-yi
-            zj=c(3,nres+j)-zi
+            xj=c(1,nres+j)
+            yj=c(2,nres+j)
+            zj=c(3,nres+j)
+C returning jth atom to box
+            xj=mod(xj,boxxsize)
+            if (xj.lt.0) xj=xj+boxxsize
+            yj=mod(yj,boxysize)
+            if (yj.lt.0) yj=yj+boxysize
+            zj=mod(zj,boxzsize)
+            if (zj.lt.0) zj=zj+boxzsize
+            if ((zj.gt.bordlipbot)
+     &        .and.(zj.lt.bordliptop)) then
+C the energy transfer exist
+              if (zj.lt.buflipbot) then
+C what fraction I am in
+                fracinbuf=1.0d0-
+     &          ((zj-bordlipbot)/lipbufthick)
+C lipbufthick is thickenes of lipid buffore
+                sslipj=sscalelip(fracinbuf)
+                ssgradlipj=-sscagradlip(fracinbuf)/lipbufthick
+              elseif (zj.gt.bufliptop) then
+                fracinbuf=1.0d0-((bordliptop-zj)/lipbufthick)
+                sslipj=sscalelip(fracinbuf)
+                ssgradlipj=sscagradlip(fracinbuf)/lipbufthick
+              else
+                sslipj=1.0d0
+                ssgradlipj=0.0
+              endif
+            else
+              sslipj=0.0d0
+              ssgradlipj=0.0
+            endif
+            aa=aa_lip(itypi,itypj)*(sslipi+sslipj)/2.0d0
+     &        +aa_aq(itypi,itypj)*(2.0d0-sslipi-sslipj)/2.0d0
+            bb=bb_lip(itypi,itypj)*(sslipi+sslipj)/2.0d0
+     &        +bb_aq(itypi,itypj)*(2.0d0-sslipi-sslipj)/2.0d0
+C       if (aa.ne.aa_aq(itypi,itypj)) then
+       
+C      write(iout,*) "tu,", i,j,aa_aq(itypi,itypj)-aa,
+C     & bb_aq(itypi,itypj)-bb,
+C     & sslipi,sslipj
+C         endif
+
+C        write(iout,*),aa,aa_lip(itypi,itypj),aa_aq(itypi,itypj)
+C checking the distance
+            dist_init=(xj-xi)**2+(yj-yi)**2+(zj-zi)**2
+            xj_safe=xj
+            yj_safe=yj
+            zj_safe=zj
+            subchap=0
+C finding the closest
+            do xshift=-1,1
+              do yshift=-1,1
+                do zshift=-1,1
+                  xj=xj_safe+xshift*boxxsize
+                  yj=yj_safe+yshift*boxysize
+                  zj=zj_safe+zshift*boxzsize
+                  dist_temp=(xj-xi)**2+(yj-yi)**2+(zj-zi)**2
+                  if (dist_temp.lt.dist_init) then
+                    dist_init=dist_temp
+                    xj_temp=xj
+                    yj_temp=yj
+                    zj_temp=zj
+                    subchap=1
+                  endif
+                enddo
+              enddo
+            enddo
+            if (subchap.eq.1) then
+              xj=xj_temp-xi
+              yj=yj_temp-yi
+              zj=zj_temp-zi
+            else
+              xj=xj_safe-xi
+              yj=yj_safe-yi
+              zj=zj_safe-zi
+            endif
+
             dxj=dc_norm(1,nres+j)
             dyj=dc_norm(2,nres+j)
             dzj=dc_norm(3,nres+j)
+c            write (iout,*) i,j,xj,yj,zj
             rrij=1.0D0/(xj*xj+yj*yj+zj*zj)
             rij=dsqrt(rrij)
+            sss=sscale((1.0d0/rij)/sigma(itypi,itypj))
+            sssgrad=sscagrad((1.0d0/rij)/sigma(itypi,itypj))
+            if (sss.le.0.0) cycle
 C Calculate angle-dependent terms of energy and contributions to their
 C derivatives.
+
             call sc_angular
             sigsq=1.0D0/sigsq
             sig=sig0ij*dsqrt(sigsq)
@@ -963,38 +1445,53 @@ C I hate to put IF's in the loops, but here don't have another choice!!!!
 c---------------------------------------------------------------
             rij_shift=1.0D0/rij_shift 
             fac=rij_shift**expon
-            e1=fac*fac*aa(itypi,itypj)
-            e2=fac*bb(itypi,itypj)
+            e1=fac*fac*aa
+            e2=fac*bb
             evdwij=eps1*eps2rt*eps3rt*(e1+e2)
             eps2der=evdwij*eps3rt
             eps3der=evdwij*eps2rt
             fac_augm=rrij**expon
             e_augm=augm(itypi,itypj)*fac_augm
             evdwij=evdwij*eps2rt*eps3rt
-            if (bb(itypi,itypj).gt.0.0d0) then
-              evdw=evdw+evdwij+e_augm
+            if (bb.gt.0) then
+              evdw=evdw+evdwij*sss+e_augm
             else
-              evdw_t=evdw_t+evdwij+e_augm
+              evdw_t=evdw_t+evdwij*sss+e_augm
             endif
+c            evdw=evdw+evdwij+e_augm
             ij=icant(itypi,itypj)
             aux=eps1*eps2rt**2*eps3rt**2
+c            eneps_temp(1,ij)=eneps_temp(1,ij)+aux*e1
+c     &        /dabs(eps(itypi,itypj))
+c            eneps_temp(2,ij)=eneps_temp(2,ij)+aux*e2/eps(itypi,itypj)
+c            write (iout,*) "i",i," j",j," itypi",itypi," itypj",itypj,
+c     &         " ij",ij," eneps",aux*e1/dabs(eps(itypi,itypj)),
+c     &         aux*e2/eps(itypi,itypj)
 c            if (lprn) then
-c            sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0)
-c            epsi=bb(itypi,itypj)**2/aa(itypi,itypj)
-c            write (iout,'(2(a3,i3,2x),17(0pf7.3))')
-c     &        restyp(itypi),i,restyp(itypj),j,
-c     &        epsi,sigm,sig,(augm(itypi,itypj)/epsi)**(1.0D0/12.0D0),
-c     &        chi1,chi2,chip1,chip2,
-c     &        eps1,eps2rt**2,eps3rt**2,
-c     &        om1,om2,om12,1.0D0/rij,1.0D0/rij_shift,
-c     &        evdwij+e_augm
+c#define DEBUG
+#ifdef DEBUG
+            sigm=dabs(aa/bb)**(1.0D0/6.0D0)
+            epsi=bb**2/aa
+            write (iout,'(2(a3,i3,2x),17(0pf7.3))')
+     &        restyp(itypi),i,restyp(itypj),j,
+     &        epsi,sigm,sig,(augm(itypi,itypj)/epsi)**(1.0D0/12.0D0),
+     &        chi1,chi2,chip1,chip2,
+     &        eps1,eps2rt**2,eps3rt**2,
+     &        om1,om2,om12,1.0D0/rij,1.0D0/rij_shift,
+     &        evdwij+e_augm
+             write (iout,*) "partial sum", evdw, evdw_t
+#endif
+c#undef DEBUG
 c            endif
+            if (energy_dec) write (iout,'(a6,2i5,0pf7.3)')
+     &                        'evdw',i,j,evdwij
             if (calc_grad) then
 C Calculate gradient components.
             e1=e1*eps1*eps2rt**2*eps3rt**2
             fac=-expon*(e1+evdwij)*rij_shift
             sigder=fac*sigder
-            fac=rij*fac-2*expon*rrij*e_augm
+            fac=rij*fac
+            fac=fac+evdwij/sss*sssgrad/sigma(itypi,itypj)*rij
 C Calculate the radial part of the gradient
             gg(1)=xj*fac
             gg(2)=yj*fac
@@ -1002,6 +1499,7 @@ C Calculate the radial part of the gradient
 C Calculate angular part of the gradient.
             call sc_grad
             endif
+            ENDIF
           enddo      ! j
         enddo        ! iint
       enddo          ! i
@@ -1060,7 +1558,6 @@ C----------------------------------------------------------------------------
       subroutine sc_grad
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
       include 'COMMON.CALC'
@@ -1098,7 +1595,6 @@ c------------------------------------------------------------------------------
       subroutine vec_and_deriv
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.GEO'
       include 'COMMON.VAR'
@@ -1119,6 +1615,8 @@ C Compute the Z-axis
             call vecpr(dc_norm(1,i),dc_norm(1,i-1),uz(1,i))
             costh=dcos(pi-theta(nres))
             fac=1.0d0/dsqrt(1.0d0-costh*costh)
+c            write (iout,*) "i",i," dc_norm",dc_norm(:,i),dc_norm(:,i-1),
+c     &         " uz",uz(:,i)
             do k=1,3
               uz(k,i)=fac*uz(k,i)
             enddo
@@ -1142,7 +1640,7 @@ C Compute the derivatives of uz
             uzder(1,3,2)= dc_norm(2,i)
             uzder(2,3,2)=-dc_norm(1,i)
             uzder(3,3,2)= 0.0d0
-            endif
+            endif ! calc_grad
 C Compute the Y-axis
             facy=fac
             do k=1,3
@@ -1253,288 +1751,24 @@ C Compute the derivatives of uy
       endif
       return
       end
-C-----------------------------------------------------------------------------
-      subroutine vec_and_deriv_test
+C--------------------------------------------------------------------------
+      subroutine set_matrices
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
+#ifdef MPI
+      include "mpif.h"
+      integer IERR
+      integer status(MPI_STATUS_SIZE)
+#endif
       include 'COMMON.IOUNITS'
       include 'COMMON.GEO'
       include 'COMMON.VAR'
       include 'COMMON.LOCAL'
       include 'COMMON.CHAIN'
-      include 'COMMON.VECTORS'
-      dimension uyder(3,3,2),uzder(3,3,2)
-C Compute the local reference systems. For reference system (i), the
-C X-axis points from CA(i) to CA(i+1), the Y axis is in the 
-C CA(i)-CA(i+1)-CA(i+2) plane, and the Z axis is perpendicular to this plane.
-      do i=1,nres-1
-          if (i.eq.nres-1) then
-C Case of the last full residue
-C Compute the Z-axis
-            call vecpr(dc_norm(1,i),dc_norm(1,i-1),uz(1,i))
-            costh=dcos(pi-theta(nres))
-            fac=1.0d0/dsqrt(1.0d0-costh*costh)
-c            write (iout,*) 'fac',fac,
-c     &        1.0d0/dsqrt(scalar(uz(1,i),uz(1,i)))
-            fac=1.0d0/dsqrt(scalar(uz(1,i),uz(1,i)))
-            do k=1,3
-              uz(k,i)=fac*uz(k,i)
-            enddo
-C Compute the derivatives of uz
-            uzder(1,1,1)= 0.0d0
-            uzder(2,1,1)=-dc_norm(3,i-1)
-            uzder(3,1,1)= dc_norm(2,i-1) 
-            uzder(1,2,1)= dc_norm(3,i-1)
-            uzder(2,2,1)= 0.0d0
-            uzder(3,2,1)=-dc_norm(1,i-1)
-            uzder(1,3,1)=-dc_norm(2,i-1)
-            uzder(2,3,1)= dc_norm(1,i-1)
-            uzder(3,3,1)= 0.0d0
-            uzder(1,1,2)= 0.0d0
-            uzder(2,1,2)= dc_norm(3,i)
-            uzder(3,1,2)=-dc_norm(2,i) 
-            uzder(1,2,2)=-dc_norm(3,i)
-            uzder(2,2,2)= 0.0d0
-            uzder(3,2,2)= dc_norm(1,i)
-            uzder(1,3,2)= dc_norm(2,i)
-            uzder(2,3,2)=-dc_norm(1,i)
-            uzder(3,3,2)= 0.0d0
-C Compute the Y-axis
-            do k=1,3
-              uy(k,i)=fac*(dc_norm(k,i-1)-costh*dc_norm(k,i))
-            enddo
-            facy=fac
-            facy=1.0d0/dsqrt(scalar(dc_norm(1,i),dc_norm(1,i))*
-     &       (scalar(dc_norm(1,i-1),dc_norm(1,i-1))**2-
-     &        scalar(dc_norm(1,i),dc_norm(1,i-1))**2))
-            do k=1,3
-c              uy(k,i)=facy*(dc_norm(k,i+1)-costh*dc_norm(k,i))
-              uy(k,i)=
-c     &        facy*(
-     &        dc_norm(k,i-1)*scalar(dc_norm(1,i),dc_norm(1,i))
-     &        -scalar(dc_norm(1,i),dc_norm(1,i-1))*dc_norm(k,i)
-c     &        )
-            enddo
-c            write (iout,*) 'facy',facy,
-c     &       1.0d0/dsqrt(scalar(uy(1,i),uy(1,i)))
-            facy=1.0d0/dsqrt(scalar(uy(1,i),uy(1,i)))
-            do k=1,3
-              uy(k,i)=facy*uy(k,i)
-            enddo
-C Compute the derivatives of uy
-            do j=1,3
-              do k=1,3
-                uyder(k,j,1)=2*dc_norm(k,i-1)*dc_norm(j,i)
-     &                        -dc_norm(k,i)*dc_norm(j,i-1)
-                uyder(k,j,2)=-dc_norm(j,i)*dc_norm(k,i)
-              enddo
-c              uyder(j,j,1)=uyder(j,j,1)-costh
-c              uyder(j,j,2)=1.0d0+uyder(j,j,2)
-              uyder(j,j,1)=uyder(j,j,1)
-     &          -scalar(dc_norm(1,i),dc_norm(1,i-1))
-              uyder(j,j,2)=scalar(dc_norm(1,i),dc_norm(1,i))
-     &          +uyder(j,j,2)
-            enddo
-            do j=1,2
-              do k=1,3
-                do l=1,3
-                  uygrad(l,k,j,i)=uyder(l,k,j)
-                  uzgrad(l,k,j,i)=uzder(l,k,j)
-                enddo
-              enddo
-            enddo 
-            call unormderiv(uy(1,i),uyder(1,1,1),facy,uygrad(1,1,1,i))
-            call unormderiv(uy(1,i),uyder(1,1,2),facy,uygrad(1,1,2,i))
-            call unormderiv(uz(1,i),uzder(1,1,1),fac,uzgrad(1,1,1,i))
-            call unormderiv(uz(1,i),uzder(1,1,2),fac,uzgrad(1,1,2,i))
-          else
-C Other residues
-C Compute the Z-axis
-            call vecpr(dc_norm(1,i),dc_norm(1,i+1),uz(1,i))
-            costh=dcos(pi-theta(i+2))
-            fac=1.0d0/dsqrt(1.0d0-costh*costh)
-            fac=1.0d0/dsqrt(scalar(uz(1,i),uz(1,i)))
-            do k=1,3
-              uz(k,i)=fac*uz(k,i)
-            enddo
-C Compute the derivatives of uz
-            uzder(1,1,1)= 0.0d0
-            uzder(2,1,1)=-dc_norm(3,i+1)
-            uzder(3,1,1)= dc_norm(2,i+1) 
-            uzder(1,2,1)= dc_norm(3,i+1)
-            uzder(2,2,1)= 0.0d0
-            uzder(3,2,1)=-dc_norm(1,i+1)
-            uzder(1,3,1)=-dc_norm(2,i+1)
-            uzder(2,3,1)= dc_norm(1,i+1)
-            uzder(3,3,1)= 0.0d0
-            uzder(1,1,2)= 0.0d0
-            uzder(2,1,2)= dc_norm(3,i)
-            uzder(3,1,2)=-dc_norm(2,i) 
-            uzder(1,2,2)=-dc_norm(3,i)
-            uzder(2,2,2)= 0.0d0
-            uzder(3,2,2)= dc_norm(1,i)
-            uzder(1,3,2)= dc_norm(2,i)
-            uzder(2,3,2)=-dc_norm(1,i)
-            uzder(3,3,2)= 0.0d0
-C Compute the Y-axis
-            facy=fac
-            facy=1.0d0/dsqrt(scalar(dc_norm(1,i),dc_norm(1,i))*
-     &       (scalar(dc_norm(1,i+1),dc_norm(1,i+1))**2-
-     &        scalar(dc_norm(1,i),dc_norm(1,i+1))**2))
-            do k=1,3
-c              uy(k,i)=facy*(dc_norm(k,i+1)-costh*dc_norm(k,i))
-              uy(k,i)=
-c     &        facy*(
-     &        dc_norm(k,i+1)*scalar(dc_norm(1,i),dc_norm(1,i))
-     &        -scalar(dc_norm(1,i),dc_norm(1,i+1))*dc_norm(k,i)
-c     &        )
-            enddo
-c            write (iout,*) 'facy',facy,
-c     &       1.0d0/dsqrt(scalar(uy(1,i),uy(1,i)))
-            facy=1.0d0/dsqrt(scalar(uy(1,i),uy(1,i)))
-            do k=1,3
-              uy(k,i)=facy*uy(k,i)
-            enddo
-C Compute the derivatives of uy
-            do j=1,3
-              do k=1,3
-                uyder(k,j,1)=2*dc_norm(k,i+1)*dc_norm(j,i)
-     &                        -dc_norm(k,i)*dc_norm(j,i+1)
-                uyder(k,j,2)=-dc_norm(j,i)*dc_norm(k,i)
-              enddo
-c              uyder(j,j,1)=uyder(j,j,1)-costh
-c              uyder(j,j,2)=1.0d0+uyder(j,j,2)
-              uyder(j,j,1)=uyder(j,j,1)
-     &          -scalar(dc_norm(1,i),dc_norm(1,i+1))
-              uyder(j,j,2)=scalar(dc_norm(1,i),dc_norm(1,i))
-     &          +uyder(j,j,2)
-            enddo
-            do j=1,2
-              do k=1,3
-                do l=1,3
-                  uygrad(l,k,j,i)=uyder(l,k,j)
-                  uzgrad(l,k,j,i)=uzder(l,k,j)
-                enddo
-              enddo
-            enddo 
-            call unormderiv(uy(1,i),uyder(1,1,1),facy,uygrad(1,1,1,i))
-            call unormderiv(uy(1,i),uyder(1,1,2),facy,uygrad(1,1,2,i))
-            call unormderiv(uz(1,i),uzder(1,1,1),fac,uzgrad(1,1,1,i))
-            call unormderiv(uz(1,i),uzder(1,1,2),fac,uzgrad(1,1,2,i))
-          endif
-      enddo
-      do i=1,nres-1
-        do j=1,2
-          do k=1,3
-            do l=1,3
-              uygrad(l,k,j,i)=vblinv*uygrad(l,k,j,i)
-              uzgrad(l,k,j,i)=vblinv*uzgrad(l,k,j,i)
-            enddo
-          enddo
-        enddo
-      enddo
-      return
-      end
-C-----------------------------------------------------------------------------
-      subroutine check_vecgrad
-      implicit real*8 (a-h,o-z)
-      include 'DIMENSIONS'
-      include 'sizesclu.dat'
-      include 'COMMON.IOUNITS'
-      include 'COMMON.GEO'
-      include 'COMMON.VAR'
-      include 'COMMON.LOCAL'
-      include 'COMMON.CHAIN'
-      include 'COMMON.VECTORS'
-      dimension uygradt(3,3,2,maxres),uzgradt(3,3,2,maxres)
-      dimension uyt(3,maxres),uzt(3,maxres)
-      dimension uygradn(3,3,2),uzgradn(3,3,2),erij(3)
-      double precision delta /1.0d-7/
-      call vec_and_deriv
-cd      do i=1,nres
-crc          write(iout,'(2i5,2(3f10.5,5x))') i,1,dc_norm(:,i)
-crc          write(iout,'(2i5,2(3f10.5,5x))') i,2,uy(:,i)
-crc          write(iout,'(2i5,2(3f10.5,5x)/)')i,3,uz(:,i)
-cd          write(iout,'(2i5,2(3f10.5,5x))') i,1,
-cd     &     (dc_norm(if90,i),if90=1,3)
-cd          write(iout,'(2i5,2(3f10.5,5x))') i,2,(uy(if90,i),if90=1,3)
-cd          write(iout,'(2i5,2(3f10.5,5x)/)')i,3,(uz(if90,i),if90=1,3)
-cd          write(iout,'(a)')
-cd      enddo
-      do i=1,nres
-        do j=1,2
-          do k=1,3
-            do l=1,3
-              uygradt(l,k,j,i)=uygrad(l,k,j,i)
-              uzgradt(l,k,j,i)=uzgrad(l,k,j,i)
-            enddo
-          enddo
-        enddo
-      enddo
-      call vec_and_deriv
-      do i=1,nres
-        do j=1,3
-          uyt(j,i)=uy(j,i)
-          uzt(j,i)=uz(j,i)
-        enddo
-      enddo
-      do i=1,nres
-cd        write (iout,*) 'i=',i
-        do k=1,3
-          erij(k)=dc_norm(k,i)
-        enddo
-        do j=1,3
-          do k=1,3
-            dc_norm(k,i)=erij(k)
-          enddo
-          dc_norm(j,i)=dc_norm(j,i)+delta
-c          fac=dsqrt(scalar(dc_norm(1,i),dc_norm(1,i)))
-c          do k=1,3
-c            dc_norm(k,i)=dc_norm(k,i)/fac
-c          enddo
-c          write (iout,*) (dc_norm(k,i),k=1,3)
-c          write (iout,*) (erij(k),k=1,3)
-          call vec_and_deriv
-          do k=1,3
-            uygradn(k,j,1)=(uy(k,i)-uyt(k,i))/delta
-            uygradn(k,j,2)=(uy(k,i-1)-uyt(k,i-1))/delta
-            uzgradn(k,j,1)=(uz(k,i)-uzt(k,i))/delta
-            uzgradn(k,j,2)=(uz(k,i-1)-uzt(k,i-1))/delta
-          enddo 
-c          write (iout,'(i5,3f8.5,3x,3f8.5,5x,3f8.5,3x,3f8.5)') 
-c     &      j,(uzgradt(k,j,1,i),k=1,3),(uzgradn(k,j,1),k=1,3),
-c     &      (uzgradt(k,j,2,i-1),k=1,3),(uzgradn(k,j,2),k=1,3)
-        enddo
-        do k=1,3
-          dc_norm(k,i)=erij(k)
-        enddo
-cd        do k=1,3
-cd          write (iout,'(i5,3f8.5,3x,3f8.5,5x,3f8.5,3x,3f8.5)') 
-cd     &      k,(uygradt(k,l,1,i),l=1,3),(uygradn(k,l,1),l=1,3),
-cd     &      (uygradt(k,l,2,i-1),l=1,3),(uygradn(k,l,2),l=1,3)
-cd          write (iout,'(i5,3f8.5,3x,3f8.5,5x,3f8.5,3x,3f8.5)') 
-cd     &      k,(uzgradt(k,l,1,i),l=1,3),(uzgradn(k,l,1),l=1,3),
-cd     &      (uzgradt(k,l,2,i-1),l=1,3),(uzgradn(k,l,2),l=1,3)
-cd          write (iout,'(a)')
-cd        enddo
-      enddo
-      return
-      end
-C--------------------------------------------------------------------------
-      subroutine set_matrices
-      implicit real*8 (a-h,o-z)
-      include 'DIMENSIONS'
-      include 'sizesclu.dat'
-      include 'COMMON.IOUNITS'
-      include 'COMMON.GEO'
-      include 'COMMON.VAR'
-      include 'COMMON.LOCAL'
-      include 'COMMON.CHAIN'
-      include 'COMMON.DERIV'
-      include 'COMMON.INTERACT'
-      include 'COMMON.CONTACTS'
-      include 'COMMON.TORSION'
+      include 'COMMON.DERIV'
+      include 'COMMON.INTERACT'
+      include 'COMMON.CONTACTS'
+      include 'COMMON.TORSION'
       include 'COMMON.VECTORS'
       include 'COMMON.FFIELD'
       double precision auxvec(2),auxmat(2,2)
 C Compute the virtual-bond-torsional-angle dependent quantities needed
 C to calculate the el-loc multibody terms of various order.
 C
+c      write(iout,*) 'SET_MATRICES nphi=',nphi,nres
+      do i=3,nres+1
+        if (i.gt. nnt+2 .and. i.lt.nct+2) then
+          iti = itype2loc(itype(i-2))
+        else
+          iti=nloctyp
+        endif
+c        if (i.gt. iatel_s+1 .and. i.lt.iatel_e+4) then
+        if (i.gt. nnt+1 .and. i.lt.nct+1) then
+          iti1 = itype2loc(itype(i-1))
+        else
+          iti1=nloctyp
+        endif
+#ifdef NEWCORR
+        cost1=dcos(theta(i-1))
+        sint1=dsin(theta(i-1))
+        sint1sq=sint1*sint1
+        sint1cub=sint1sq*sint1
+        sint1cost1=2*sint1*cost1
+#ifdef DEBUG
+        write (iout,*) "bnew1",i,iti
+        write (iout,*) (bnew1(k,1,iti),k=1,3)
+        write (iout,*) (bnew1(k,2,iti),k=1,3)
+        write (iout,*) "bnew2",i,iti
+        write (iout,*) (bnew2(k,1,iti),k=1,3)
+        write (iout,*) (bnew2(k,2,iti),k=1,3)
+#endif
+        do k=1,2
+          b1k=bnew1(1,k,iti)+(bnew1(2,k,iti)+bnew1(3,k,iti)*cost1)*cost1
+          b1(k,i-2)=sint1*b1k
+          gtb1(k,i-2)=cost1*b1k-sint1sq*
+     &              (bnew1(2,k,iti)+2*bnew1(3,k,iti)*cost1)
+          b2k=bnew2(1,k,iti)+(bnew2(2,k,iti)+bnew2(3,k,iti)*cost1)*cost1
+          b2(k,i-2)=sint1*b2k
+          if (calc_grad) gtb2(k,i-2)=cost1*b2k-sint1sq*
+     &              (bnew2(2,k,iti)+2*bnew2(3,k,iti)*cost1)
+        enddo
+        do k=1,2
+          aux=ccnew(1,k,iti)+(ccnew(2,k,iti)+ccnew(3,k,iti)*cost1)*cost1
+          cc(1,k,i-2)=sint1sq*aux
+          if (calc_grad) gtcc(1,k,i-2)=sint1cost1*aux-sint1cub*
+     &              (ccnew(2,k,iti)+2*ccnew(3,k,iti)*cost1)
+          aux=ddnew(1,k,iti)+(ddnew(2,k,iti)+ddnew(3,k,iti)*cost1)*cost1
+          dd(1,k,i-2)=sint1sq*aux
+          if (calc_grad) gtdd(1,k,i-2)=sint1cost1*aux-sint1cub*
+     &              (ddnew(2,k,iti)+2*ddnew(3,k,iti)*cost1)
+        enddo
+        cc(2,1,i-2)=cc(1,2,i-2)
+        cc(2,2,i-2)=-cc(1,1,i-2)
+        gtcc(2,1,i-2)=gtcc(1,2,i-2)
+        gtcc(2,2,i-2)=-gtcc(1,1,i-2)
+        dd(2,1,i-2)=dd(1,2,i-2)
+        dd(2,2,i-2)=-dd(1,1,i-2)
+        gtdd(2,1,i-2)=gtdd(1,2,i-2)
+        gtdd(2,2,i-2)=-gtdd(1,1,i-2)
+        do k=1,2
+          do l=1,2
+            aux=eenew(1,l,k,iti)+eenew(2,l,k,iti)*cost1
+            EE(l,k,i-2)=sint1sq*aux
+            if (calc_grad) 
+     &        gtEE(l,k,i-2)=sint1cost1*aux-sint1cub*eenew(2,l,k,iti)
+          enddo
+        enddo
+        EE(1,1,i-2)=EE(1,1,i-2)+e0new(1,iti)*cost1
+        EE(1,2,i-2)=EE(1,2,i-2)+e0new(2,iti)+e0new(3,iti)*cost1
+        EE(2,1,i-2)=EE(2,1,i-2)+e0new(2,iti)*cost1+e0new(3,iti)
+        EE(2,2,i-2)=EE(2,2,i-2)-e0new(1,iti)
+        if (calc_grad) then
+        gtEE(1,1,i-2)=gtEE(1,1,i-2)-e0new(1,iti)*sint1
+        gtEE(1,2,i-2)=gtEE(1,2,i-2)-e0new(3,iti)*sint1
+        gtEE(2,1,i-2)=gtEE(2,1,i-2)-e0new(2,iti)*sint1
+        endif
+c        b1tilde(1,i-2)=b1(1,i-2)
+c        b1tilde(2,i-2)=-b1(2,i-2)
+c        b2tilde(1,i-2)=b2(1,i-2)
+c        b2tilde(2,i-2)=-b2(2,i-2)
+#ifdef DEBUG
+        write (iout,*) 'i=',i-2,gtb1(2,i-2),gtb1(1,i-2)
+        write(iout,*)  'b1=',(b1(k,i-2),k=1,2)
+        write(iout,*)  'b2=',(b2(k,i-2),k=1,2)
+        write (iout,*) 'theta=', theta(i-1)
+#endif
+#else
+c        if (i.gt. nnt+2 .and. i.lt.nct+2) then
+c          iti = itype2loc(itype(i-2))
+c        else
+c          iti=nloctyp
+c        endif
+c        if (i.gt. iatel_s+1 .and. i.lt.iatel_e+4) then
+c        if (i.gt. nnt+1 .and. i.lt.nct+1) then
+c          iti1 = itype2loc(itype(i-1))
+c        else
+c          iti1=nloctyp
+c        endif
+        b1(1,i-2)=b(3,iti)
+        b1(2,i-2)=b(5,iti)
+        b2(1,i-2)=b(2,iti)
+        b2(2,i-2)=b(4,iti)
+        do k=1,2
+          do l=1,2
+           CC(k,l,i-2)=ccold(k,l,iti)
+           DD(k,l,i-2)=ddold(k,l,iti)
+           EE(k,l,i-2)=eeold(k,l,iti)
+          enddo
+        enddo
+#endif
+        b1tilde(1,i-2)= b1(1,i-2)
+        b1tilde(2,i-2)=-b1(2,i-2)
+        b2tilde(1,i-2)= b2(1,i-2)
+        b2tilde(2,i-2)=-b2(2,i-2)
+c
+        Ctilde(1,1,i-2)= CC(1,1,i-2)
+        Ctilde(1,2,i-2)= CC(1,2,i-2)
+        Ctilde(2,1,i-2)=-CC(2,1,i-2)
+        Ctilde(2,2,i-2)=-CC(2,2,i-2)
+c
+        Dtilde(1,1,i-2)= DD(1,1,i-2)
+        Dtilde(1,2,i-2)= DD(1,2,i-2)
+        Dtilde(2,1,i-2)=-DD(2,1,i-2)
+        Dtilde(2,2,i-2)=-DD(2,2,i-2)
+c        write(iout,*) "i",i," iti",iti
+c        write(iout,*)  'b1=',(b1(k,i-2),k=1,2)
+c        write(iout,*)  'b2=',(b2(k,i-2),k=1,2)
+      enddo
       do i=3,nres+1
         if (i .lt. nres+1) then
           sin1=dsin(phi(i))
           Ug2der(2,1,i-2)=0.0d0
           Ug2der(2,2,i-2)=0.0d0
         endif
+c        if (i.gt. iatel_s+2 .and. i.lt.iatel_e+5) then
         if (i.gt. nnt+2 .and. i.lt.nct+2) then
-          if (itype(i-2).le.ntyp) then
-            iti = itortyp(itype(i-2))
-          else 
-            iti=ntortyp+1
-          endif
+          iti = itype2loc(itype(i-2))
         else
-          iti=ntortyp+1
+          iti=nloctyp
         endif
+c        if (i.gt. iatel_s+1 .and. i.lt.iatel_e+4) then
         if (i.gt. nnt+1 .and. i.lt.nct+1) then
-          if (itype(i-1).le.ntyp) then
-            iti1 = itortyp(itype(i-1))
-          else
-            iti1=ntortyp+1
-          endif
+          iti1 = itype2loc(itype(i-1))
         else
-          iti1=ntortyp+1
+          iti1=nloctyp
         endif
 cd        write (iout,*) '*******i',i,' iti1',iti
 cd        write (iout,*) 'b1',b1(:,iti)
 cd        write (iout,*) 'b2',b2(:,iti)
 cd        write (iout,*) 'Ug',Ug(:,:,i-2)
-c        print *,"itilde1 i iti iti1",i,iti,iti1
-        if (i .gt. iatel_s+2) then
-          call matvec2(Ug(1,1,i-2),b2(1,iti),Ub2(1,i-2))
-          call matmat2(EE(1,1,iti),Ug(1,1,i-2),EUg(1,1,i-2))
-          call matmat2(CC(1,1,iti),Ug(1,1,i-2),CUg(1,1,i-2))
-          call matmat2(DD(1,1,iti),Ug(1,1,i-2),DUg(1,1,i-2))
-          call matmat2(Dtilde(1,1,iti),Ug2(1,1,i-2),DtUg2(1,1,i-2))
-          call matvec2(Ctilde(1,1,iti1),obrot(1,i-2),Ctobr(1,i-2))
-          call matvec2(Dtilde(1,1,iti),obrot2(1,i-2),Dtobr2(1,i-2))
+c        if (i .gt. iatel_s+2) then
+        if (i .gt. nnt+2) then
+          call matvec2(Ug(1,1,i-2),b2(1,i-2),Ub2(1,i-2))
+#ifdef NEWCORR
+          call matvec2(Ug(1,1,i-2),gtb2(1,i-2),gUb2(1,i-2))
+c          write (iout,*) Ug(1,1,i-2),gtb2(1,i-2),gUb2(1,i-2),"chuj"
+#endif
+c          write(iout,*) "co jest kurwa", iti, EE(1,1,i),EE(2,1,i),
+c     &    EE(1,2,iti),EE(2,2,i)
+          call matmat2(EE(1,1,i-2),Ug(1,1,i-2),EUg(1,1,i-2))
+          call matmat2(gtEE(1,1,i-2),Ug(1,1,i-2),gtEUg(1,1,i-2))
+c          write(iout,*) "Macierz EUG",
+c     &    eug(1,1,i-2),eug(1,2,i-2),eug(2,1,i-2),
+c     &    eug(2,2,i-2)
+          if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) 
+     &    then
+          call matmat2(CC(1,1,i-2),Ug(1,1,i-2),CUg(1,1,i-2))
+          call matmat2(DD(1,1,i-2),Ug(1,1,i-2),DUg(1,1,i-2))
+          call matmat2(Dtilde(1,1,i-2),Ug2(1,1,i-2),DtUg2(1,1,i-2))
+          call matvec2(Ctilde(1,1,i-1),obrot(1,i-2),Ctobr(1,i-2))
+          call matvec2(Dtilde(1,1,i-2),obrot2(1,i-2),Dtobr2(1,i-2))
+          endif
         else
           do k=1,2
             Ub2(k,i-2)=0.0d0
@@ -1653,63 +2018,76 @@ c        print *,"itilde1 i iti iti1",i,iti,iti1
             enddo
           enddo
         endif
-c        print *,"itilde2 i iti iti1",i,iti,iti1
-        call matvec2(Ugder(1,1,i-2),b2(1,iti),Ub2der(1,i-2))
-        call matmat2(EE(1,1,iti),Ugder(1,1,i-2),EUgder(1,1,i-2))
-        call matmat2(CC(1,1,iti1),Ugder(1,1,i-2),CUgder(1,1,i-2))
-        call matmat2(DD(1,1,iti),Ugder(1,1,i-2),DUgder(1,1,i-2))
-        call matmat2(Dtilde(1,1,iti),Ug2der(1,1,i-2),DtUg2der(1,1,i-2))
-        call matvec2(Ctilde(1,1,iti1),obrot_der(1,i-2),Ctobrder(1,i-2))
-        call matvec2(Dtilde(1,1,iti),obrot2_der(1,i-2),Dtobr2der(1,i-2))
-c        print *,"itilde3 i iti iti1",i,iti,iti1
+        call matvec2(Ugder(1,1,i-2),b2(1,i-2),Ub2der(1,i-2))
+        call matmat2(EE(1,1,i-2),Ugder(1,1,i-2),EUgder(1,1,i-2))
         do k=1,2
           muder(k,i-2)=Ub2der(k,i-2)
         enddo
+c        if (i.gt. iatel_s+1 .and. i.lt.iatel_e+4) then
         if (i.gt. nnt+1 .and. i.lt.nct+1) then
           if (itype(i-1).le.ntyp) then
-            iti1 = itortyp(itype(i-1))
+            iti1 = itype2loc(itype(i-1))
           else
-            iti1=ntortyp+1
+            iti1=nloctyp
           endif
         else
-          iti1=ntortyp+1
+          iti1=nloctyp
         endif
         do k=1,2
-          mu(k,i-2)=Ub2(k,i-2)+b1(k,iti1)
+          mu(k,i-2)=Ub2(k,i-2)+b1(k,i-1)
         enddo
+#ifdef MUOUT
+        write (iout,'(2hmu,i3,3f8.1,12f10.5)') i-2,rad2deg*theta(i-1),
+     &     rad2deg*theta(i),rad2deg*phi(i),mu(1,i-2),mu(2,i-2),
+     &       -b2(1,i-2),b2(2,i-2),b1(1,i-2),b1(2,i-2),
+     &       dsqrt(b2(1,i-1)**2+b2(2,i-1)**2)
+     &      +dsqrt(b1(1,i-1)**2+b1(2,i-1)**2),
+     &      ((ee(l,k,i-2),l=1,2),k=1,2)
+#endif
+cd        write (iout,*) 'mu1',mu1(:,i-2)
+cd        write (iout,*) 'mu2',mu2(:,i-2)
+        if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or.wcorr6.gt.0.0d0)
+     &  then  
+        if (calc_grad) then
+        call matmat2(CC(1,1,i-1),Ugder(1,1,i-2),CUgder(1,1,i-2))
+        call matmat2(DD(1,1,i-2),Ugder(1,1,i-2),DUgder(1,1,i-2))
+        call matmat2(Dtilde(1,1,i-2),Ug2der(1,1,i-2),DtUg2der(1,1,i-2))
+        call matvec2(Ctilde(1,1,i-1),obrot_der(1,i-2),Ctobrder(1,i-2))
+        call matvec2(Dtilde(1,1,i-2),obrot2_der(1,i-2),Dtobr2der(1,i-2))
+        endif
 C Vectors and matrices dependent on a single virtual-bond dihedral.
-        call matvec2(DD(1,1,iti),b1tilde(1,iti1),auxvec(1))
+        call matvec2(DD(1,1,i-2),b1tilde(1,i-1),auxvec(1))
         call matvec2(Ug2(1,1,i-2),auxvec(1),Ug2Db1t(1,i-2)) 
+        call matvec2(CC(1,1,i-1),Ub2(1,i-2),CUgb2(1,i-2))
+        call matmat2(EUg(1,1,i-2),CC(1,1,i-1),EUgC(1,1,i-2))
+        call matmat2(EUg(1,1,i-2),DD(1,1,i-1),EUgD(1,1,i-2))
+        if (calc_grad) then
         call matvec2(Ug2der(1,1,i-2),auxvec(1),Ug2Db1tder(1,i-2)) 
-        call matvec2(CC(1,1,iti1),Ub2(1,i-2),CUgb2(1,i-2))
-        call matvec2(CC(1,1,iti1),Ub2der(1,i-2),CUgb2der(1,i-2))
-        call matmat2(EUg(1,1,i-2),CC(1,1,iti1),EUgC(1,1,i-2))
-        call matmat2(EUgder(1,1,i-2),CC(1,1,iti1),EUgCder(1,1,i-2))
-        call matmat2(EUg(1,1,i-2),DD(1,1,iti1),EUgD(1,1,i-2))
-        call matmat2(EUgder(1,1,i-2),DD(1,1,iti1),EUgDder(1,1,i-2))
-cd        write (iout,*) 'i',i,' mu ',(mu(k,i-2),k=1,2),
-cd     &  ' mu1',(b1(k,i-2),k=1,2),' mu2',(Ub2(k,i-2),k=1,2)
+        call matvec2(CC(1,1,i-1),Ub2der(1,i-2),CUgb2der(1,i-2))
+        call matmat2(EUgder(1,1,i-2),CC(1,1,i-1),EUgCder(1,1,i-2))
+        call matmat2(EUgder(1,1,i-2),DD(1,1,i-1),EUgDder(1,1,i-2))
+        endif
+        endif
       enddo
 C Matrices dependent on two consecutive virtual-bond dihedrals.
 C The order of matrices is from left to right.
+      if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or.wcorr6.gt.0.0d0)
+     &then
       do i=2,nres-1
         call matmat2(DtUg2(1,1,i-1),EUg(1,1,i),DtUg2EUg(1,1,i))
+        if (calc_grad) then
         call matmat2(DtUg2der(1,1,i-1),EUg(1,1,i),DtUg2EUgder(1,1,1,i))
         call matmat2(DtUg2(1,1,i-1),EUgder(1,1,i),DtUg2EUgder(1,1,2,i))
+        endif
         call transpose2(DtUg2(1,1,i-1),auxmat(1,1))
         call matmat2(auxmat(1,1),EUg(1,1,i),Ug2DtEUg(1,1,i))
+        if (calc_grad) then
         call matmat2(auxmat(1,1),EUgder(1,1,i),Ug2DtEUgder(1,1,2,i))
         call transpose2(DtUg2der(1,1,i-1),auxmat(1,1))
         call matmat2(auxmat(1,1),EUg(1,1,i),Ug2DtEUgder(1,1,1,i))
+        endif
       enddo
-cd      do i=1,nres
-cd        iti = itortyp(itype(i))
-cd        write (iout,*) i
-cd        do j=1,2
-cd        write (iout,'(2f10.5,5x,2f10.5,5x,2f10.5)') 
-cd     &  (EE(j,k,iti),k=1,2),(Ug(j,k,i),k=1,2),(EUg(j,k,i),k=1,2)
-cd        enddo
-cd      enddo
+      endif
       return
       end
 C--------------------------------------------------------------------------
@@ -1722,8 +2100,10 @@ C The potential depends both on the distance of peptide-group centers and on
 C the orientation of the CA-CA virtual bonds.
 C 
       implicit real*8 (a-h,o-z)
+#ifdef MPI
+      include 'mpif.h'
+#endif
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.CONTROL'
       include 'COMMON.IOUNITS'
       include 'COMMON.GEO'
       include 'COMMON.TORSION'
       include 'COMMON.VECTORS'
       include 'COMMON.FFIELD'
+      include 'COMMON.TIME1'
+      include 'COMMON.SPLITELE'
       dimension ggg(3),gggp(3),gggm(3),erij(3),dcosb(3),dcosg(3),
      &          erder(3,3),uryg(3,3),urzg(3,3),vryg(3,3),vrzg(3,3)
       double precision acipa(2,2),agg(3,4),aggi(3,4),aggi1(3,4),
-     &    aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4)
-      common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,j1
+     &    aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4),gmuij(4)
+      common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33,
+     &    dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi,
+     &    num_conti,j1,j2
 c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions
+#ifdef MOMENT
+      double precision scal_el /1.0d0/
+#else
       double precision scal_el /0.5d0/
+#endif
 C 12/13/98 
 C 13-go grudnia roku pamietnego... 
       double precision unmat(3,3) /1.0d0,0.0d0,0.0d0,
@@ -1771,25 +2159,26 @@ c          write (iout,*) 'i',i,' fac',fac
       if (wel_loc.gt.0.0d0 .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 
      &    .or. wcorr6.gt.0.0d0 .or. wturn3.gt.0.0d0 .or. 
      &    wturn4.gt.0.0d0 .or. wturn6.gt.0.0d0) then
-cd      if (wel_loc.gt.0.0d0) then
-        if (icheckgrad.eq.1) then
-        call vec_and_deriv_test
-        else
-        call vec_and_deriv
-        endif
+c        call vec_and_deriv
+#ifdef TIMING
+        time01=MPI_Wtime()
+#endif
         call set_matrices
+#ifdef TIMING
+        time_mat=time_mat+MPI_Wtime()-time01
+#endif
       endif
 cd      do i=1,nres-1
 cd        write (iout,*) 'i=',i
 cd        do k=1,3
-cd          write (iout,'(i5,2f10.5)') k,uy(k,i),uz(k,i)
+cd        write (iout,'(i5,2f10.5)') k,uy(k,i),uz(k,i)
 cd        enddo
 cd        do k=1,3
 cd          write (iout,'(f10.5,2x,3f10.5,2x,3f10.5)') 
 cd     &     uz(k,i),(uzgrad(k,l,1,i),l=1,3),(uzgrad(k,l,2,i),l=1,3)
 cd        enddo
 cd      enddo
-      num_conti_hb=0
+      t_eelecij=0.0d0
       ees=0.0D0
       evdw1=0.0D0
       eel_loc=0.0d0 
@@ -1800,14 +2189,38 @@ cd      enddo
         num_cont_hb(i)=0
       enddo
 cd      print '(a)','Enter EELEC'
-cd      write (iout,*) 'iatel_s=',iatel_s,' iatel_e=',iatel_e
+c      write (iout,*) 'iatel_s=',iatel_s,' iatel_e=',iatel_e
+c      call flush(iout)
       do i=1,nres
         gel_loc_loc(i)=0.0d0
         gcorr_loc(i)=0.0d0
       enddo
-      do i=iatel_s,iatel_e
-        if (itype(i).eq.21 .or. itype(i+1).eq.21) cycle
-        if (itel(i).eq.0) goto 1215
+c
+c
+c 9/27/08 AL Split the interaction loop to ensure load balancing of turn terms
+C
+C Loop over i,i+2 and i,i+3 pairs of the peptide groups
+C
+C 14/01/2014 TURN3,TUNR4 does no go under periodic boundry condition
+      do i=iturn3_start,iturn3_end
+c        if (i.le.1) cycle
+C        write(iout,*) "tu jest i",i
+        if (itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1
+C changes suggested by Ana to avoid out of bounds
+C Adam: Unnecessary: handled by iturn3_end and iturn3_start
+c     & .or.((i+4).gt.nres)
+c     & .or.((i-1).le.0)
+C end of changes by Ana
+C dobra zmiana wycofana
+     &  .or. itype(i+2).eq.ntyp1
+     &  .or. itype(i+3).eq.ntyp1) cycle
+C Adam: Instructions below will switch off existing interactions
+c        if(i.gt.1)then
+c          if(itype(i-1).eq.ntyp1)cycle
+c        end if
+c        if(i.LT.nres-3)then
+c          if (itype(i+4).eq.ntyp1) cycle
+c        end if
         dxi=dc(1,i)
         dyi=dc(2,i)
         dzi=dc(3,i)
@@ -1817,23 +2230,225 @@ cd      write (iout,*) 'iatel_s=',iatel_s,' iatel_e=',iatel_e
         xmedi=c(1,i)+0.5d0*dxi
         ymedi=c(2,i)+0.5d0*dyi
         zmedi=c(3,i)+0.5d0*dzi
+          xmedi=mod(xmedi,boxxsize)
+          if (xmedi.lt.0) xmedi=xmedi+boxxsize
+          ymedi=mod(ymedi,boxysize)
+          if (ymedi.lt.0) ymedi=ymedi+boxysize
+          zmedi=mod(zmedi,boxzsize)
+          if (zmedi.lt.0) zmedi=zmedi+boxzsize
         num_conti=0
+        call eelecij(i,i+2,ees,evdw1,eel_loc)
+        if (wturn3.gt.0.0d0) call eturn3(i,eello_turn3)
+        num_cont_hb(i)=num_conti
+      enddo
+      do i=iturn4_start,iturn4_end
+        if (i.lt.1) cycle
+        if (itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1
+C changes suggested by Ana to avoid out of bounds
+c     & .or.((i+5).gt.nres)
+c     & .or.((i-1).le.0)
+C end of changes suggested by Ana
+     &    .or. itype(i+3).eq.ntyp1
+     &    .or. itype(i+4).eq.ntyp1
+c     &    .or. itype(i+5).eq.ntyp1
+c     &    .or. itype(i).eq.ntyp1
+c     &    .or. itype(i-1).eq.ntyp1
+     &                             ) cycle
+        dxi=dc(1,i)
+        dyi=dc(2,i)
+        dzi=dc(3,i)
+        dx_normi=dc_norm(1,i)
+        dy_normi=dc_norm(2,i)
+        dz_normi=dc_norm(3,i)
+        xmedi=c(1,i)+0.5d0*dxi
+        ymedi=c(2,i)+0.5d0*dyi
+        zmedi=c(3,i)+0.5d0*dzi
+C Return atom into box, boxxsize is size of box in x dimension
+c  194   continue
+c        if (xmedi.gt.((0.5d0)*boxxsize)) xmedi=xmedi-boxxsize
+c        if (xmedi.lt.((-0.5d0)*boxxsize)) xmedi=xmedi+boxxsize
+C Condition for being inside the proper box
+c        if ((xmedi.gt.((0.5d0)*boxxsize)).or.
+c     &       (xmedi.lt.((-0.5d0)*boxxsize))) then
+c        go to 194
+c        endif
+c  195   continue
+c        if (ymedi.gt.((0.5d0)*boxysize)) ymedi=ymedi-boxysize
+c        if (ymedi.lt.((-0.5d0)*boxysize)) ymedi=ymedi+boxysize
+C Condition for being inside the proper box
+c        if ((ymedi.gt.((0.5d0)*boxysize)).or.
+c     &       (ymedi.lt.((-0.5d0)*boxysize))) then
+c        go to 195
+c        endif
+c  196   continue
+c        if (zmedi.gt.((0.5d0)*boxzsize)) zmedi=zmedi-boxzsize
+c        if (zmedi.lt.((-0.5d0)*boxzsize)) zmedi=zmedi+boxzsize
+C Condition for being inside the proper box
+c        if ((zmedi.gt.((0.5d0)*boxzsize)).or.
+c     &       (zmedi.lt.((-0.5d0)*boxzsize))) then
+c        go to 196
+c        endif
+          xmedi=mod(xmedi,boxxsize)
+          if (xmedi.lt.0) xmedi=xmedi+boxxsize
+          ymedi=mod(ymedi,boxysize)
+          if (ymedi.lt.0) ymedi=ymedi+boxysize
+          zmedi=mod(zmedi,boxzsize)
+          if (zmedi.lt.0) zmedi=zmedi+boxzsize
+
+        num_conti=num_cont_hb(i)
+c        write(iout,*) "JESTEM W PETLI"
+        call eelecij(i,i+3,ees,evdw1,eel_loc)
+        if (wturn4.gt.0.0d0 .and. itype(i+2).ne.ntyp1) 
+     &   call eturn4(i,eello_turn4)
+        num_cont_hb(i)=num_conti
+      enddo   ! i
+C Loop over all neighbouring boxes
+C      do xshift=-1,1
+C      do yshift=-1,1
+C      do zshift=-1,1
+c
+c Loop over all pairs of interacting peptide groups except i,i+2 and i,i+3
+c
+CTU KURWA
+      do i=iatel_s,iatel_e
+C        do i=75,75
+c        if (i.le.1) cycle
+        if (itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1
+C changes suggested by Ana to avoid out of bounds
+c     & .or.((i+2).gt.nres)
+c     & .or.((i-1).le.0)
+C end of changes by Ana
+c     &  .or. itype(i+2).eq.ntyp1
+c     &  .or. itype(i-1).eq.ntyp1
+     &                ) cycle
+        dxi=dc(1,i)
+        dyi=dc(2,i)
+        dzi=dc(3,i)
+        dx_normi=dc_norm(1,i)
+        dy_normi=dc_norm(2,i)
+        dz_normi=dc_norm(3,i)
+        xmedi=c(1,i)+0.5d0*dxi
+        ymedi=c(2,i)+0.5d0*dyi
+        zmedi=c(3,i)+0.5d0*dzi
+          xmedi=mod(xmedi,boxxsize)
+          if (xmedi.lt.0) xmedi=xmedi+boxxsize
+          ymedi=mod(ymedi,boxysize)
+          if (ymedi.lt.0) ymedi=ymedi+boxysize
+          zmedi=mod(zmedi,boxzsize)
+          if (zmedi.lt.0) zmedi=zmedi+boxzsize
+C          xmedi=xmedi+xshift*boxxsize
+C          ymedi=ymedi+yshift*boxysize
+C          zmedi=zmedi+zshift*boxzsize
+
+C Return tom into box, boxxsize is size of box in x dimension
+c  164   continue
+c        if (xmedi.gt.((xshift+0.5d0)*boxxsize)) xmedi=xmedi-boxxsize
+c        if (xmedi.lt.((xshift-0.5d0)*boxxsize)) xmedi=xmedi+boxxsize
+C Condition for being inside the proper box
+c        if ((xmedi.gt.((xshift+0.5d0)*boxxsize)).or.
+c     &       (xmedi.lt.((xshift-0.5d0)*boxxsize))) then
+c        go to 164
+c        endif
+c  165   continue
+c        if (ymedi.gt.((yshift+0.5d0)*boxysize)) ymedi=ymedi-boxysize
+c        if (ymedi.lt.((yshift-0.5d0)*boxysize)) ymedi=ymedi+boxysize
+C Condition for being inside the proper box
+c        if ((ymedi.gt.((yshift+0.5d0)*boxysize)).or.
+c     &       (ymedi.lt.((yshift-0.5d0)*boxysize))) then
+c        go to 165
+c        endif
+c  166   continue
+c        if (zmedi.gt.((zshift+0.5d0)*boxzsize)) zmedi=zmedi-boxzsize
+c        if (zmedi.lt.((zshift-0.5d0)*boxzsize)) zmedi=zmedi+boxzsize
+cC Condition for being inside the proper box
+c        if ((zmedi.gt.((zshift+0.5d0)*boxzsize)).or.
+c     &       (zmedi.lt.((zshift-0.5d0)*boxzsize))) then
+c        go to 166
+c        endif
+
 c        write (iout,*) 'i',i,' ielstart',ielstart(i),' ielend',ielend(i)
+        num_conti=num_cont_hb(i)
+C I TU KURWA
         do j=ielstart(i),ielend(i)
-          if (itype(j).eq.21 .or. itype(j+1).eq.21) cycle
-          if (itel(j).eq.0) goto 1216
-          ind=ind+1
+C          do j=16,17
+C          write (iout,*) i,j
+C         if (j.le.1) cycle
+          if (itype(j).eq.ntyp1.or. itype(j+1).eq.ntyp1
+C changes suggested by Ana to avoid out of bounds
+c     & .or.((j+2).gt.nres)
+c     & .or.((j-1).le.0)
+C end of changes by Ana
+c     & .or.itype(j+2).eq.ntyp1
+c     & .or.itype(j-1).eq.ntyp1
+     &) cycle
+          call eelecij(i,j,ees,evdw1,eel_loc)
+        enddo ! j
+        num_cont_hb(i)=num_conti
+      enddo   ! i
+C     enddo   ! zshift
+C      enddo   ! yshift
+C      enddo   ! xshift
+
+c      write (iout,*) "Number of loop steps in EELEC:",ind
+cd      do i=1,nres
+cd        write (iout,'(i3,3f10.5,5x,3f10.5)') 
+cd     &     i,(gel_loc(k,i),k=1,3),gel_loc_loc(i)
+cd      enddo
+c 12/7/99 Adam eello_turn3 will be considered as a separate energy term
+ccc      eel_loc=eel_loc+eello_turn3
+cd      print *,"Processor",fg_rank," t_eelecij",t_eelecij
+      return
+      end
+C-------------------------------------------------------------------------------
+      subroutine eelecij(i,j,ees,evdw1,eel_loc)
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+#ifdef MPI
+      include "mpif.h"
+#endif
+      include 'COMMON.CONTROL'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.GEO'
+      include 'COMMON.VAR'
+      include 'COMMON.LOCAL'
+      include 'COMMON.CHAIN'
+      include 'COMMON.DERIV'
+      include 'COMMON.INTERACT'
+      include 'COMMON.CONTACTS'
+      include 'COMMON.TORSION'
+      include 'COMMON.VECTORS'
+      include 'COMMON.FFIELD'
+      include 'COMMON.TIME1'
+      include 'COMMON.SPLITELE'
+      include 'COMMON.SHIELD'
+      dimension ggg(3),gggp(3),gggm(3),erij(3),dcosb(3),dcosg(3),
+     &          erder(3,3),uryg(3,3),urzg(3,3),vryg(3,3),vrzg(3,3)
+      double precision acipa(2,2),agg(3,4),aggi(3,4),aggi1(3,4),
+     &    aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4),gmuij1(4),gmuji1(4),
+     &    gmuij2(4),gmuji2(4)
+      common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33,
+     &    dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi,
+     &    num_conti,j1,j2
+c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions
+#ifdef MOMENT
+      double precision scal_el /1.0d0/
+#else
+      double precision scal_el /0.5d0/
+#endif
+C 12/13/98 
+C 13-go grudnia roku pamietnego... 
+      double precision unmat(3,3) /1.0d0,0.0d0,0.0d0,
+     &                   0.0d0,1.0d0,0.0d0,
+     &                   0.0d0,0.0d0,1.0d0/
+       integer xshift,yshift,zshift
+c          time00=MPI_Wtime()
+cd      write (iout,*) "eelecij",i,j
+c          ind=ind+1
           iteli=itel(i)
           itelj=itel(j)
           if (j.eq.i+2 .and. itelj.eq.2) iteli=2
           aaa=app(iteli,itelj)
           bbb=bpp(iteli,itelj)
-C Diagnostics only!!!
-c         aaa=0.0D0
-c         bbb=0.0D0
-c         ael6i=0.0D0
-c         ael3i=0.0D0
-C End diagnostics
           ael6i=ael6(iteli,itelj)
           ael3i=ael3(iteli,itelj) 
           dxj=dc(1,j)
@@ -1842,10 +2457,86 @@ C End diagnostics
           dx_normj=dc_norm(1,j)
           dy_normj=dc_norm(2,j)
           dz_normj=dc_norm(3,j)
-          xj=c(1,j)+0.5D0*dxj-xmedi
-          yj=c(2,j)+0.5D0*dyj-ymedi
-          zj=c(3,j)+0.5D0*dzj-zmedi
+C          xj=c(1,j)+0.5D0*dxj-xmedi
+C          yj=c(2,j)+0.5D0*dyj-ymedi
+C          zj=c(3,j)+0.5D0*dzj-zmedi
+          xj=c(1,j)+0.5D0*dxj
+          yj=c(2,j)+0.5D0*dyj
+          zj=c(3,j)+0.5D0*dzj
+          xj=mod(xj,boxxsize)
+          if (xj.lt.0) xj=xj+boxxsize
+          yj=mod(yj,boxysize)
+          if (yj.lt.0) yj=yj+boxysize
+          zj=mod(zj,boxzsize)
+          if (zj.lt.0) zj=zj+boxzsize
+          if ((zj.lt.0).or.(xj.lt.0).or.(yj.lt.0)) write (*,*) "CHUJ"
+      dist_init=(xj-xmedi)**2+(yj-ymedi)**2+(zj-zmedi)**2
+      xj_safe=xj
+      yj_safe=yj
+      zj_safe=zj
+      isubchap=0
+      do xshift=-1,1
+      do yshift=-1,1
+      do zshift=-1,1
+          xj=xj_safe+xshift*boxxsize
+          yj=yj_safe+yshift*boxysize
+          zj=zj_safe+zshift*boxzsize
+          dist_temp=(xj-xmedi)**2+(yj-ymedi)**2+(zj-zmedi)**2
+          if(dist_temp.lt.dist_init) then
+            dist_init=dist_temp
+            xj_temp=xj
+            yj_temp=yj
+            zj_temp=zj
+            isubchap=1
+          endif
+       enddo
+       enddo
+       enddo
+       if (isubchap.eq.1) then
+          xj=xj_temp-xmedi
+          yj=yj_temp-ymedi
+          zj=zj_temp-zmedi
+       else
+          xj=xj_safe-xmedi
+          yj=yj_safe-ymedi
+          zj=zj_safe-zmedi
+       endif
+C        if ((i+3).lt.j) then !this condition keeps for turn3 and turn4 not subject to PBC
+c  174   continue
+c        if (xj.gt.((0.5d0)*boxxsize)) xj=xj-boxxsize
+c        if (xj.lt.((-0.5d0)*boxxsize)) xj=xj+boxxsize
+C Condition for being inside the proper box
+c        if ((xj.gt.((0.5d0)*boxxsize)).or.
+c     &       (xj.lt.((-0.5d0)*boxxsize))) then
+c        go to 174
+c        endif
+c  175   continue
+c        if (yj.gt.((0.5d0)*boxysize)) yj=yj-boxysize
+c        if (yj.lt.((-0.5d0)*boxysize)) yj=yj+boxysize
+C Condition for being inside the proper box
+c        if ((yj.gt.((0.5d0)*boxysize)).or.
+c     &       (yj.lt.((-0.5d0)*boxysize))) then
+c        go to 175
+c        endif
+c  176   continue
+c        if (zj.gt.((0.5d0)*boxzsize)) zj=zj-boxzsize
+c        if (zj.lt.((-0.5d0)*boxzsize)) zj=zj+boxzsize
+C Condition for being inside the proper box
+c        if ((zj.gt.((0.5d0)*boxzsize)).or.
+c     &       (zj.lt.((-0.5d0)*boxzsize))) then
+c        go to 176
+c        endif
+C        endif !endPBC condintion
+C        xj=xj-xmedi
+C        yj=yj-ymedi
+C        zj=zj-zmedi
           rij=xj*xj+yj*yj+zj*zj
+
+            sss=sscale(sqrt(rij))
+            sssgrad=sscagrad(sqrt(rij))
+c            write (iout,*) "ij",i,j," rij",sqrt(rij)," r_cut",r_cut,
+c     &       " rlamb",rlamb," sss",sss
+c            if (sss.gt.0.0d0) then  
           rrmij=1.0D0/rij
           rij=dsqrt(rij)
           rmij=1.0D0/rij
@@ -1861,97 +2552,233 @@ c 4/26/02 - AL scaling down 1,4 repulsive VDW interactions
           ev2=bbb*r6ij
           fac3=ael6i*r6ij
           fac4=ael3i*r3ij
-          evdwij=ev1+ev2
+          evdwij=(ev1+ev2)
           el1=fac3*(4.0D0+fac*fac-3.0D0*(cosb*cosb+cosg*cosg))
           el2=fac4*fac       
-          eesij=el1+el2
-c          write (iout,*) "i",i,iteli," j",j,itelj," eesij",eesij
+C MARYSIA
+C          eesij=(el1+el2)
 C 12/26/95 - for the evaluation of multi-body H-bonding interactions
           ees0ij=4.0D0+fac*fac-3.0D0*(cosb*cosb+cosg*cosg)
+          if (shield_mode.gt.0) then
+C          fac_shield(i)=0.4
+C          fac_shield(j)=0.6
+          el1=el1*fac_shield(i)**2*fac_shield(j)**2
+          el2=el2*fac_shield(i)**2*fac_shield(j)**2
+          eesij=(el1+el2)
           ees=ees+eesij
-          evdw1=evdw1+evdwij
+          else
+          fac_shield(i)=1.0
+          fac_shield(j)=1.0
+          eesij=(el1+el2)
+          ees=ees+eesij
+          endif
+          evdw1=evdw1+evdwij*sss
 cd          write(iout,'(2(2i3,2x),7(1pd12.4)/2(3(1pd12.4),5x)/)')
 cd     &      iteli,i,itelj,j,aaa,bbb,ael6i,ael3i,
 cd     &      1.0D0/dsqrt(rrmij),evdwij,eesij,
 cd     &      xmedi,ymedi,zmedi,xj,yj,zj
+
+          if (energy_dec) then 
+              write (iout,'(a6,2i5,0pf7.3,2i5,3e11.3)') 
+     &'evdw1',i,j,evdwij
+     &,iteli,itelj,aaa,evdw1,sss
+              write (iout,'(a6,2i5,0pf7.3,2f8.3)') 'ees',i,j,eesij,
+     &fac_shield(i),fac_shield(j)
+          endif
+
 C
 C Calculate contributions to the Cartesian gradient.
 C
 #ifdef SPLITELE
-          facvdw=-6*rrmij*(ev1+evdwij) 
+          facvdw=-6*rrmij*(ev1+evdwij)*sss
           facel=-3*rrmij*(el1+eesij)
           fac1=fac
           erij(1)=xj*rmij
           erij(2)=yj*rmij
           erij(3)=zj*rmij
-          if (calc_grad) then
+
 *
 * Radial derivatives. First process both termini of the fragment (i,j)
-* 
+*
+          if (calc_grad) then
           ggg(1)=facel*xj
           ggg(2)=facel*yj
           ggg(3)=facel*zj
+          if ((fac_shield(i).gt.0).and.(fac_shield(j).gt.0).and.
+     &  (shield_mode.gt.0)) then
+C          print *,i,j     
+          do ilist=1,ishield_list(i)
+           iresshield=shield_list(ilist,i)
+           do k=1,3
+           rlocshield=grad_shield_side(k,ilist,i)*eesij/fac_shield(i)
+     &      *2.0
+           gshieldx(k,iresshield)=gshieldx(k,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(k,ilist,i)*eesij/fac_shield(i)*2.0
+            gshieldc(k,iresshield-1)=gshieldc(k,iresshield-1)+rlocshield
+C           gshieldc_loc(k,iresshield)=gshieldc_loc(k,iresshield)
+C     & +grad_shield_loc(k,ilist,i)*eesij/fac_shield(i)
+C             if (iresshield.gt.i) then
+C               do ishi=i+1,iresshield-1
+C                gshieldc(k,ishi)=gshieldc(k,ishi)+rlocshield
+C     & +grad_shield_loc(k,ilist,i)*eesij/fac_shield(i)
+C
+C              enddo
+C             else
+C               do ishi=iresshield,i
+C                gshieldc(k,ishi)=gshieldc(k,ishi)-rlocshield
+C     & -grad_shield_loc(k,ilist,i)*eesij/fac_shield(i)
+C
+C               enddo
+C              endif
+           enddo
+          enddo
+          do ilist=1,ishield_list(j)
+           iresshield=shield_list(ilist,j)
+           do k=1,3
+           rlocshield=grad_shield_side(k,ilist,j)*eesij/fac_shield(j)
+     &     *2.0
+           gshieldx(k,iresshield)=gshieldx(k,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(k,ilist,j)*eesij/fac_shield(j)*2.0
+           gshieldc(k,iresshield-1)=gshieldc(k,iresshield-1)+rlocshield
+
+C     & +grad_shield_loc(k,ilist,j)*eesij/fac_shield(j)
+C           gshieldc_loc(k,iresshield)=gshieldc_loc(k,iresshield)
+C     & +grad_shield_loc(k,ilist,j)*eesij/fac_shield(j)
+C             if (iresshield.gt.j) then
+C               do ishi=j+1,iresshield-1
+C                gshieldc(k,ishi)=gshieldc(k,ishi)+rlocshield
+C     & +grad_shield_loc(k,ilist,j)*eesij/fac_shield(j)
+C
+C               enddo
+C            else
+C               do ishi=iresshield,j
+C                gshieldc(k,ishi)=gshieldc(k,ishi)-rlocshield
+C     & -grad_shield_loc(k,ilist,j)*eesij/fac_shield(j)
+C               enddo
+C              endif
+           enddo
+          enddo
+
           do k=1,3
-            ghalf=0.5D0*ggg(k)
-            gelc(k,i)=gelc(k,i)+ghalf
-            gelc(k,j)=gelc(k,j)+ghalf
+            gshieldc(k,i)=gshieldc(k,i)+
+     &              grad_shield(k,i)*eesij/fac_shield(i)*2.0
+            gshieldc(k,j)=gshieldc(k,j)+
+     &              grad_shield(k,j)*eesij/fac_shield(j)*2.0
+            gshieldc(k,i-1)=gshieldc(k,i-1)+
+     &              grad_shield(k,i)*eesij/fac_shield(i)*2.0
+            gshieldc(k,j-1)=gshieldc(k,j-1)+
+     &              grad_shield(k,j)*eesij/fac_shield(j)*2.0
+
+           enddo
+           endif
+c          do k=1,3
+c            ghalf=0.5D0*ggg(k)
+c            gelc(k,i)=gelc(k,i)+ghalf
+c            gelc(k,j)=gelc(k,j)+ghalf
+c          enddo
+c 9/28/08 AL Gradient compotents will be summed only at the end
+C           print *,"before", gelc_long(1,i), gelc_long(1,j)
+          do k=1,3
+            gelc_long(k,j)=gelc_long(k,j)+ggg(k)
+C     &                    +grad_shield(k,j)*eesij/fac_shield(j)
+            gelc_long(k,i)=gelc_long(k,i)-ggg(k)
+C     &                    +grad_shield(k,i)*eesij/fac_shield(i)
+C            gelc_long(k,i-1)=gelc_long(k,i-1)
+C     &                    +grad_shield(k,i)*eesij/fac_shield(i)
+C            gelc_long(k,j-1)=gelc_long(k,j-1)
+C     &                    +grad_shield(k,j)*eesij/fac_shield(j)
           enddo
+C           print *,"bafter", gelc_long(1,i), gelc_long(1,j)
+
 *
 * Loop over residues i+1 thru j-1.
 *
-          do k=i+1,j-1
-            do l=1,3
-              gelc(l,k)=gelc(l,k)+ggg(l)
-            enddo
-          enddo
-          ggg(1)=facvdw*xj
-          ggg(2)=facvdw*yj
-          ggg(3)=facvdw*zj
+cgrad          do k=i+1,j-1
+cgrad            do l=1,3
+cgrad              gelc(l,k)=gelc(l,k)+ggg(l)
+cgrad            enddo
+cgrad          enddo
+          if (sss.gt.0.0) then
+          ggg(1)=facvdw*xj+sssgrad*rmij*evdwij*xj
+          ggg(2)=facvdw*yj+sssgrad*rmij*evdwij*yj
+          ggg(3)=facvdw*zj+sssgrad*rmij*evdwij*zj
+          else
+          ggg(1)=0.0
+          ggg(2)=0.0
+          ggg(3)=0.0
+          endif
+c          do k=1,3
+c            ghalf=0.5D0*ggg(k)
+c            gvdwpp(k,i)=gvdwpp(k,i)+ghalf
+c            gvdwpp(k,j)=gvdwpp(k,j)+ghalf
+c          enddo
+c 9/28/08 AL Gradient compotents will be summed only at the end
           do k=1,3
-            ghalf=0.5D0*ggg(k)
-            gvdwpp(k,i)=gvdwpp(k,i)+ghalf
-            gvdwpp(k,j)=gvdwpp(k,j)+ghalf
+            gvdwpp(k,j)=gvdwpp(k,j)+ggg(k)
+            gvdwpp(k,i)=gvdwpp(k,i)-ggg(k)
           enddo
 *
 * Loop over residues i+1 thru j-1.
 *
-          do k=i+1,j-1
-            do l=1,3
-              gvdwpp(l,k)=gvdwpp(l,k)+ggg(l)
-            enddo
-          enddo
+cgrad          do k=i+1,j-1
+cgrad            do l=1,3
+cgrad              gvdwpp(l,k)=gvdwpp(l,k)+ggg(l)
+cgrad            enddo
+cgrad          enddo
+          endif ! calc_grad
 #else
-          facvdw=ev1+evdwij 
-          facel=el1+eesij  
+C MARYSIA
+          facvdw=(ev1+evdwij)*sss
+          facel=(el1+eesij)
           fac1=fac
           fac=-3*rrmij*(facvdw+facvdw+facel)
           erij(1)=xj*rmij
           erij(2)=yj*rmij
           erij(3)=zj*rmij
-          if (calc_grad) then
 *
 * Radial derivatives. First process both termini of the fragment (i,j)
 * 
+          if (calc_grad) then
           ggg(1)=fac*xj
+C+eesij*grad_shield(1,i)+eesij*grad_shield(1,j)
           ggg(2)=fac*yj
+C+eesij*grad_shield(2,i)+eesij*grad_shield(2,j)
           ggg(3)=fac*zj
+C+eesij*grad_shield(3,i)+eesij*grad_shield(3,j)
+c          do k=1,3
+c            ghalf=0.5D0*ggg(k)
+c            gelc(k,i)=gelc(k,i)+ghalf
+c            gelc(k,j)=gelc(k,j)+ghalf
+c          enddo
+c 9/28/08 AL Gradient compotents will be summed only at the end
           do k=1,3
-            ghalf=0.5D0*ggg(k)
-            gelc(k,i)=gelc(k,i)+ghalf
-            gelc(k,j)=gelc(k,j)+ghalf
+            gelc_long(k,j)=gelc(k,j)+ggg(k)
+            gelc_long(k,i)=gelc(k,i)-ggg(k)
           enddo
 *
 * Loop over residues i+1 thru j-1.
 *
-          do k=i+1,j-1
-            do l=1,3
-              gelc(l,k)=gelc(l,k)+ggg(l)
-            enddo
+cgrad          do k=i+1,j-1
+cgrad            do l=1,3
+cgrad              gelc(l,k)=gelc(l,k)+ggg(l)
+cgrad            enddo
+cgrad          enddo
+c 9/28/08 AL Gradient compotents will be summed only at the end
+          ggg(1)=facvdw*xj+sssgrad*rmij*evdwij*xj
+          ggg(2)=facvdw*yj+sssgrad*rmij*evdwij*yj
+          ggg(3)=facvdw*zj+sssgrad*rmij*evdwij*zj
+          do k=1,3
+            gvdwpp(k,j)=gvdwpp(k,j)+ggg(k)
+            gvdwpp(k,i)=gvdwpp(k,i)-ggg(k)
           enddo
+          endif ! calc_grad
 #endif
 *
 * Angular part
 *          
+          if (calc_grad) then
           ecosa=2.0D0*fac3*fac1+fac4
           fac4=-3.0D0*fac4
           fac3=-6.0D0*fac3
 cd        print '(2i3,2(3(1pd14.5),3x))',i,j,(dcosb(k),k=1,3),
 cd   &          (dcosg(k),k=1,3)
           do k=1,3
-            ggg(k)=ecosb*dcosb(k)+ecosg*dcosg(k) 
+            ggg(k)=(ecosb*dcosb(k)+ecosg*dcosg(k))*
+     &      fac_shield(i)**2*fac_shield(j)**2
           enddo
+c          do k=1,3
+c            ghalf=0.5D0*ggg(k)
+c            gelc(k,i)=gelc(k,i)+ghalf
+c     &               +(ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i))
+c     &               + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1)
+c            gelc(k,j)=gelc(k,j)+ghalf
+c     &               +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j))
+c     &               + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1)
+c          enddo
+cgrad          do k=i+1,j-1
+cgrad            do l=1,3
+cgrad              gelc(l,k)=gelc(l,k)+ggg(l)
+cgrad            enddo
+cgrad          enddo
+C                     print *,"before22", gelc_long(1,i), gelc_long(1,j)
           do k=1,3
-            ghalf=0.5D0*ggg(k)
-            gelc(k,i)=gelc(k,i)+ghalf
-     &               +(ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i))
-     &               + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1)
-            gelc(k,j)=gelc(k,j)+ghalf
-     &               +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j))
-     &               + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1)
+            gelc(k,i)=gelc(k,i)
+     &           +((ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i))
+     &           + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1))
+     &           *fac_shield(i)**2*fac_shield(j)**2   
+            gelc(k,j)=gelc(k,j)
+     &           +((ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j))
+     &           + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1))
+     &           *fac_shield(i)**2*fac_shield(j)**2
+            gelc_long(k,j)=gelc_long(k,j)+ggg(k)
+            gelc_long(k,i)=gelc_long(k,i)-ggg(k)
           enddo
-          do k=i+1,j-1
-            do l=1,3
-              gelc(l,k)=gelc(l,k)+ggg(l)
-            enddo
-          enddo
-          endif
+C           print *,"before33", gelc_long(1,i), gelc_long(1,j)
 
+C MARYSIA
+c          endif !sscale
+          endif ! calc_grad
           IF (wel_loc.gt.0.0d0 .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0
      &        .or. wcorr6.gt.0.0d0 .or. wturn3.gt.0.0d0 
      &        .or. wturn4.gt.0.0d0 .or. wturn6.gt.0.0d0) THEN
@@ -1992,6 +2836,7 @@ C   Fourier series in the angles lambda1 and lambda2 (see Nishikawa et al.
 C   Macromolecules, 1974, 7, 797-806 for definition). This correlation terms
 C   are computed for EVERY pair of non-contiguous peptide groups.
 C
+
           if (j.lt.nres-1) then
             j1=j+1
             j2=j-1
             j2=j-2
           endif
           kkk=0
+          lll=0
           do k=1,2
             do l=1,2
               kkk=kkk+1
               muij(kkk)=mu(k,i)*mu(l,j)
+c              write(iout,*) 'mumu=', mu(k,i),mu(l,j),i,j,k,l
+#ifdef NEWCORR
+             if (calc_grad) then
+             gmuij1(kkk)=gtb1(k,i+1)*mu(l,j)
+c             write(iout,*) 'k=',k,i,gtb1(k,i+1),gtb1(k,i+1)*mu(l,j)
+             gmuij2(kkk)=gUb2(k,i)*mu(l,j)
+             gmuji1(kkk)=mu(k,i)*gtb1(l,j+1)
+c             write(iout,*) 'l=',l,j,gtb1(l,j+1),gtb1(l,j+1)*mu(k,i)
+             gmuji2(kkk)=mu(k,i)*gUb2(l,j)
+             endif
+#endif
             enddo
           enddo  
-cd         write (iout,*) 'EELEC: i',i,' j',j
-cd          write (iout,*) 'j',j,' j1',j1,' j2',j2
-cd          write(iout,*) 'muij',muij
+#ifdef DEBUG
+          write (iout,*) 'EELEC: i',i,' j',j
+          write (iout,*) 'j',j,' j1',j1,' j2',j2
+          write(iout,*) 'muij',muij
+          write (iout,*) "uy",uy(:,i)
+          write (iout,*) "uz",uz(:,j)
+          write (iout,*) "erij",erij
+#endif
           ury=scalar(uy(1,i),erij)
           urz=scalar(uz(1,i),erij)
           vry=scalar(uy(1,j),erij)
@@ -2017,15 +2879,7 @@ cd          write(iout,*) 'muij',muij
           a23=scalar(uy(1,i),uz(1,j))-3*ury*vrz
           a32=scalar(uz(1,i),uy(1,j))-3*urz*vry
           a33=scalar(uz(1,i),uz(1,j))-3*urz*vrz
-C For diagnostics only
-cd          a22=1.0d0
-cd          a23=1.0d0
-cd          a32=1.0d0
-cd          a33=1.0d0
           fac=dsqrt(-ael6i)*r3ij
-cd          write (2,*) 'fac=',fac
-C For diagnostics only
-cd          fac=1.0d0
           a22=a22*fac
           a23=a23*fac
           a32=a32*fac
@@ -2033,22 +2887,17 @@ cd          fac=1.0d0
 cd          write (iout,'(4i5,4f10.5)')
 cd     &     i,itortyp(itype(i)),j,itortyp(itype(j)),a22,a23,a32,a33
 cd          write (iout,'(6f10.5)') (muij(k),k=1,4),fac,eel_loc_ij
-cd          write (iout,'(2(3f10.5,5x)/2(3f10.5,5x))') (uy(k,i),k=1,3),
-cd     &      (uz(k,i),k=1,3),(uy(k,j),k=1,3),(uz(k,j),k=1,3)
+cd          write (iout,'(2(3f10.5,5x)/2(3f10.5,5x))') uy(:,i),uz(:,i),
+cd     &      uy(:,j),uz(:,j)
 cd          write (iout,'(4f10.5)') 
 cd     &      scalar(uy(1,i),uy(1,j)),scalar(uy(1,i),uz(1,j)),
 cd     &      scalar(uz(1,i),uy(1,j)),scalar(uz(1,i),uz(1,j))
 cd          write (iout,'(4f10.5)') ury,urz,vry,vrz
-cd           write (iout,'(2i3,9f10.5/)') i,j,
+cd           write (iout,'(9f10.5/)') 
 cd     &      fac22,a22,fac23,a23,fac32,a32,fac33,a33,eel_loc_ij
-          if (calc_grad) then
 C Derivatives of the elements of A in virtual-bond vectors
+          if (calc_grad) then
           call unormderiv(erij(1),unmat(1,1),rmij,erder(1,1))
-cd          do k=1,3
-cd            do l=1,3
-cd              erder(k,l)=0.0d0
-cd            enddo
-cd          enddo
           do k=1,3
             uryg(k,1)=scalar(erder(1,k),uy(1,i))
             uryg(k,2)=scalar(uygrad(1,k,1,i),erij(1))
@@ -2063,24 +2912,12 @@ cd          enddo
             vrzg(k,2)=scalar(uzgrad(1,k,1,j),erij(1))
             vrzg(k,3)=scalar(uzgrad(1,k,2,j),erij(1))
           enddo
-cd          do k=1,3
-cd            do l=1,3
-cd              uryg(k,l)=0.0d0
-cd              urzg(k,l)=0.0d0
-cd              vryg(k,l)=0.0d0
-cd              vrzg(k,l)=0.0d0
-cd            enddo
-cd          enddo
 C Compute radial contributions to the gradient
           facr=-3.0d0*rrmij
           a22der=a22*facr
           a23der=a23*facr
           a32der=a32*facr
           a33der=a33*facr
-cd          a22der=0.0d0
-cd          a23der=0.0d0
-cd          a32der=0.0d0
-cd          a33der=0.0d0
           agg(1,1)=a22der*xj
           agg(2,1)=a22der*yj
           agg(3,1)=a22der*zj
@@ -2103,36 +2940,36 @@ C Add the contributions coming from er
           enddo
           do k=1,3
 C Derivatives in DC(i) 
-            ghalf1=0.5d0*agg(k,1)
-            ghalf2=0.5d0*agg(k,2)
-            ghalf3=0.5d0*agg(k,3)
-            ghalf4=0.5d0*agg(k,4)
+cgrad            ghalf1=0.5d0*agg(k,1)
+cgrad            ghalf2=0.5d0*agg(k,2)
+cgrad            ghalf3=0.5d0*agg(k,3)
+cgrad            ghalf4=0.5d0*agg(k,4)
             aggi(k,1)=fac*(scalar(uygrad(1,k,1,i),uy(1,j))
-     &      -3.0d0*uryg(k,2)*vry)+ghalf1
+     &      -3.0d0*uryg(k,2)*vry)!+ghalf1
             aggi(k,2)=fac*(scalar(uygrad(1,k,1,i),uz(1,j))
-     &      -3.0d0*uryg(k,2)*vrz)+ghalf2
+     &      -3.0d0*uryg(k,2)*vrz)!+ghalf2
             aggi(k,3)=fac*(scalar(uzgrad(1,k,1,i),uy(1,j))
-     &      -3.0d0*urzg(k,2)*vry)+ghalf3
+     &      -3.0d0*urzg(k,2)*vry)!+ghalf3
             aggi(k,4)=fac*(scalar(uzgrad(1,k,1,i),uz(1,j))
-     &      -3.0d0*urzg(k,2)*vrz)+ghalf4
+     &      -3.0d0*urzg(k,2)*vrz)!+ghalf4
 C Derivatives in DC(i+1)
             aggi1(k,1)=fac*(scalar(uygrad(1,k,2,i),uy(1,j))
-     &      -3.0d0*uryg(k,3)*vry)+agg(k,1)
+     &      -3.0d0*uryg(k,3)*vry)!+agg(k,1)
             aggi1(k,2)=fac*(scalar(uygrad(1,k,2,i),uz(1,j))
-     &      -3.0d0*uryg(k,3)*vrz)+agg(k,2)
+     &      -3.0d0*uryg(k,3)*vrz)!+agg(k,2)
             aggi1(k,3)=fac*(scalar(uzgrad(1,k,2,i),uy(1,j))
-     &      -3.0d0*urzg(k,3)*vry)+agg(k,3)
+     &      -3.0d0*urzg(k,3)*vry)!+agg(k,3)
             aggi1(k,4)=fac*(scalar(uzgrad(1,k,2,i),uz(1,j))
-     &      -3.0d0*urzg(k,3)*vrz)+agg(k,4)
+     &      -3.0d0*urzg(k,3)*vrz)!+agg(k,4)
 C Derivatives in DC(j)
             aggj(k,1)=fac*(scalar(uygrad(1,k,1,j),uy(1,i))
-     &      -3.0d0*vryg(k,2)*ury)+ghalf1
+     &      -3.0d0*vryg(k,2)*ury)!+ghalf1
             aggj(k,2)=fac*(scalar(uzgrad(1,k,1,j),uy(1,i))
-     &      -3.0d0*vrzg(k,2)*ury)+ghalf2
+     &      -3.0d0*vrzg(k,2)*ury)!+ghalf2
             aggj(k,3)=fac*(scalar(uygrad(1,k,1,j),uz(1,i))
-     &      -3.0d0*vryg(k,2)*urz)+ghalf3
+     &      -3.0d0*vryg(k,2)*urz)!+ghalf3
             aggj(k,4)=fac*(scalar(uzgrad(1,k,1,j),uz(1,i)) 
-     &      -3.0d0*vrzg(k,2)*urz)+ghalf4
+     &      -3.0d0*vrzg(k,2)*urz)!+ghalf4
 C Derivatives in DC(j+1) or DC(nres-1)
             aggj1(k,1)=fac*(scalar(uygrad(1,k,2,j),uy(1,i))
      &      -3.0d0*vryg(k,3)*ury)
@@ -2142,41 +2979,20 @@ C Derivatives in DC(j+1) or DC(nres-1)
      &      -3.0d0*vryg(k,3)*urz)
             aggj1(k,4)=fac*(scalar(uzgrad(1,k,2,j),uz(1,i)) 
      &      -3.0d0*vrzg(k,3)*urz)
-cd            aggi(k,1)=ghalf1
-cd            aggi(k,2)=ghalf2
-cd            aggi(k,3)=ghalf3
-cd            aggi(k,4)=ghalf4
-C Derivatives in DC(i+1)
-cd            aggi1(k,1)=agg(k,1)
-cd            aggi1(k,2)=agg(k,2)
-cd            aggi1(k,3)=agg(k,3)
-cd            aggi1(k,4)=agg(k,4)
-C Derivatives in DC(j)
-cd            aggj(k,1)=ghalf1
-cd            aggj(k,2)=ghalf2
-cd            aggj(k,3)=ghalf3
-cd            aggj(k,4)=ghalf4
-C Derivatives in DC(j+1)
-cd            aggj1(k,1)=0.0d0
-cd            aggj1(k,2)=0.0d0
-cd            aggj1(k,3)=0.0d0
-cd            aggj1(k,4)=0.0d0
-            if (j.eq.nres-1 .and. i.lt.j-2) then
-              do l=1,4
-                aggj1(k,l)=aggj1(k,l)+agg(k,l)
-cd                aggj1(k,l)=agg(k,l)
-              enddo
-            endif
+cgrad            if (j.eq.nres-1 .and. i.lt.j-2) then
+cgrad              do l=1,4
+cgrad                aggj1(k,l)=aggj1(k,l)+agg(k,l)
+cgrad              enddo
+cgrad            endif
           enddo
-          endif
-c          goto 11111
-C Check the loc-el terms by numerical integration
+          endif ! calc_grad
           acipa(1,1)=a22
           acipa(1,2)=a23
           acipa(2,1)=a32
           acipa(2,2)=a33
           a22=-a22
           a23=-a23
+          if (calc_grad) then
           do l=1,2
             do k=1,3
               agg(k,l)=-agg(k,l)
@@ -2186,6 +3002,7 @@ C Check the loc-el terms by numerical integration
               aggj1(k,l)=-aggj1(k,l)
             enddo
           enddo
+          endif ! calc_grad
           if (j.lt.nres-1) then
             a22=-a22
             a32=-a32
@@ -2214,63 +3031,188 @@ C Check the loc-el terms by numerical integration
             enddo 
           endif    
           ENDIF ! WCORR
-11111     continue
           IF (wel_loc.gt.0.0d0) THEN
 C Contribution to the local-electrostatic energy coming from the i-j pair
           eel_loc_ij=a22*muij(1)+a23*muij(2)+a32*muij(3)
      &     +a33*muij(4)
-cd          write (iout,*) 'i',i,' j',j,' eel_loc_ij',eel_loc_ij
-cd          write (iout,*) a22,muij(1),a23,muij(2),a32,muij(3)
+#ifdef DEBUG
+          write (iout,*) "muij",muij," a22",a22," a23",a23," a32",a32,
+     &     " a33",a33
+          write (iout,*) "ij",i,j," eel_loc_ij",eel_loc_ij,
+     &     " wel_loc",wel_loc
+#endif
+          if (shield_mode.eq.0) then 
+           fac_shield(i)=1.0
+           fac_shield(j)=1.0
+C          else
+C           fac_shield(i)=0.4
+C           fac_shield(j)=0.6
+          endif
+          eel_loc_ij=eel_loc_ij
+     &    *fac_shield(i)*fac_shield(j)
+          if (energy_dec) write (iout,'(a6,2i5,0pf7.3)')
+     &            'eelloc',i,j,eel_loc_ij
+c           if (eel_loc_ij.ne.0)
+c     &      write (iout,'(a4,2i4,8f9.5)')'chuj',
+c     &     i,j,a22,muij(1),a23,muij(2),a32,muij(3),a33,muij(4)
+
           eel_loc=eel_loc+eel_loc_ij
-C Partial derivatives in virtual-bond dihedral angles gamma
+C Now derivative over eel_loc
           if (calc_grad) then
+          if ((fac_shield(i).gt.0).and.(fac_shield(j).gt.0).and.
+     &  (shield_mode.gt.0)) then
+C          print *,i,j     
+
+          do ilist=1,ishield_list(i)
+           iresshield=shield_list(ilist,i)
+           do k=1,3
+           rlocshield=grad_shield_side(k,ilist,i)*eel_loc_ij
+     &                                          /fac_shield(i)
+C     &      *2.0
+           gshieldx_ll(k,iresshield)=gshieldx_ll(k,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(k,ilist,i)*eel_loc_ij/fac_shield(i)
+            gshieldc_ll(k,iresshield-1)=gshieldc_ll(k,iresshield-1)
+     &      +rlocshield
+           enddo
+          enddo
+          do ilist=1,ishield_list(j)
+           iresshield=shield_list(ilist,j)
+           do k=1,3
+           rlocshield=grad_shield_side(k,ilist,j)*eel_loc_ij
+     &                                       /fac_shield(j)
+C     &     *2.0
+           gshieldx_ll(k,iresshield)=gshieldx_ll(k,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(k,ilist,j)*eel_loc_ij/fac_shield(j)
+           gshieldc_ll(k,iresshield-1)=gshieldc_ll(k,iresshield-1)
+     &             +rlocshield
+
+           enddo
+          enddo
+
+          do k=1,3
+            gshieldc_ll(k,i)=gshieldc_ll(k,i)+
+     &              grad_shield(k,i)*eel_loc_ij/fac_shield(i)
+            gshieldc_ll(k,j)=gshieldc_ll(k,j)+
+     &              grad_shield(k,j)*eel_loc_ij/fac_shield(j)
+            gshieldc_ll(k,i-1)=gshieldc_ll(k,i-1)+
+     &              grad_shield(k,i)*eel_loc_ij/fac_shield(i)
+            gshieldc_ll(k,j-1)=gshieldc_ll(k,j-1)+
+     &              grad_shield(k,j)*eel_loc_ij/fac_shield(j)
+           enddo
+           endif
+
+
+c          write (iout,*) 'i',i,' j',j,itype(i),itype(j),
+c     &                     ' eel_loc_ij',eel_loc_ij
+C          write(iout,*) 'muije=',i,j,muij(1),muij(2),muij(3),muij(4)
+C Calculate patrial derivative for theta angle
+#ifdef NEWCORR
+         geel_loc_ij=(a22*gmuij1(1)
+     &     +a23*gmuij1(2)
+     &     +a32*gmuij1(3)
+     &     +a33*gmuij1(4))
+     &    *fac_shield(i)*fac_shield(j)
+c         write(iout,*) "derivative over thatai"
+c         write(iout,*) a22*gmuij1(1), a23*gmuij1(2) ,a32*gmuij1(3),
+c     &   a33*gmuij1(4) 
+         gloc(nphi+i,icg)=gloc(nphi+i,icg)+
+     &      geel_loc_ij*wel_loc
+c         write(iout,*) "derivative over thatai-1" 
+c         write(iout,*) a22*gmuij2(1), a23*gmuij2(2) ,a32*gmuij2(3),
+c     &   a33*gmuij2(4)
+         geel_loc_ij=
+     &     a22*gmuij2(1)
+     &     +a23*gmuij2(2)
+     &     +a32*gmuij2(3)
+     &     +a33*gmuij2(4)
+         gloc(nphi+i-1,icg)=gloc(nphi+i-1,icg)+
+     &      geel_loc_ij*wel_loc
+     &    *fac_shield(i)*fac_shield(j)
+
+c  Derivative over j residue
+         geel_loc_ji=a22*gmuji1(1)
+     &     +a23*gmuji1(2)
+     &     +a32*gmuji1(3)
+     &     +a33*gmuji1(4)
+c         write(iout,*) "derivative over thataj" 
+c         write(iout,*) a22*gmuji1(1), a23*gmuji1(2) ,a32*gmuji1(3),
+c     &   a33*gmuji1(4)
+
+        gloc(nphi+j,icg)=gloc(nphi+j,icg)+
+     &      geel_loc_ji*wel_loc
+     &    *fac_shield(i)*fac_shield(j)
+
+         geel_loc_ji=
+     &     +a22*gmuji2(1)
+     &     +a23*gmuji2(2)
+     &     +a32*gmuji2(3)
+     &     +a33*gmuji2(4)
+c         write(iout,*) "derivative over thataj-1"
+c         write(iout,*) a22*gmuji2(1), a23*gmuji2(2) ,a32*gmuji2(3),
+c     &   a33*gmuji2(4)
+         gloc(nphi+j-1,icg)=gloc(nphi+j-1,icg)+
+     &      geel_loc_ji*wel_loc
+     &    *fac_shield(i)*fac_shield(j)
+#endif
+cd          write (iout,*) 'i',i,' j',j,' eel_loc_ij',eel_loc_ij
+
+C Partial derivatives in virtual-bond dihedral angles gamma
           if (i.gt.1)
      &    gel_loc_loc(i-1)=gel_loc_loc(i-1)+ 
-     &            a22*muder(1,i)*mu(1,j)+a23*muder(1,i)*mu(2,j)
-     &           +a32*muder(2,i)*mu(1,j)+a33*muder(2,i)*mu(2,j)
-          gel_loc_loc(j-1)=gel_loc_loc(j-1)+ 
-     &            a22*mu(1,i)*muder(1,j)+a23*mu(1,i)*muder(2,j)
-     &           +a32*mu(2,i)*muder(1,j)+a33*mu(2,i)*muder(2,j)
-cd          call checkint3(i,j,mu1,mu2,a22,a23,a32,a33,acipa,eel_loc_ij)
-cd          write(iout,*) 'agg  ',agg
-cd          write(iout,*) 'aggi ',aggi
-cd          write(iout,*) 'aggi1',aggi1
-cd          write(iout,*) 'aggj ',aggj
-cd          write(iout,*) 'aggj1',aggj1
+     &            (a22*muder(1,i)*mu(1,j)+a23*muder(1,i)*mu(2,j)
+     &           +a32*muder(2,i)*mu(1,j)+a33*muder(2,i)*mu(2,j))
+     &    *fac_shield(i)*fac_shield(j)
 
+          gel_loc_loc(j-1)=gel_loc_loc(j-1)+ 
+     &           (a22*mu(1,i)*muder(1,j)+a23*mu(1,i)*muder(2,j)
+     &           +a32*mu(2,i)*muder(1,j)+a33*mu(2,i)*muder(2,j))
+     &    *fac_shield(i)*fac_shield(j)
 C Derivatives of eello in DC(i+1) thru DC(j-1) or DC(nres-2)
           do l=1,3
-            ggg(l)=agg(l,1)*muij(1)+
-     &          agg(l,2)*muij(2)+agg(l,3)*muij(3)+agg(l,4)*muij(4)
-          enddo
-          do k=i+2,j2
-            do l=1,3
-              gel_loc(l,k)=gel_loc(l,k)+ggg(l)
-            enddo
+            ggg(l)=(agg(l,1)*muij(1)+
+     &          agg(l,2)*muij(2)+agg(l,3)*muij(3)+agg(l,4)*muij(4))
+     &    *fac_shield(i)*fac_shield(j)
+            gel_loc_long(l,j)=gel_loc_long(l,j)+ggg(l)
+            gel_loc_long(l,i)=gel_loc_long(l,i)-ggg(l)
+cgrad            ghalf=0.5d0*ggg(l)
+cgrad            gel_loc(l,i)=gel_loc(l,i)+ghalf
+cgrad            gel_loc(l,j)=gel_loc(l,j)+ghalf
           enddo
+cgrad          do k=i+1,j2
+cgrad            do l=1,3
+cgrad              gel_loc(l,k)=gel_loc(l,k)+ggg(l)
+cgrad            enddo
+cgrad          enddo
 C Remaining derivatives of eello
           do l=1,3
-            gel_loc(l,i)=gel_loc(l,i)+aggi(l,1)*muij(1)+
-     &          aggi(l,2)*muij(2)+aggi(l,3)*muij(3)+aggi(l,4)*muij(4)
-            gel_loc(l,i+1)=gel_loc(l,i+1)+aggi1(l,1)*muij(1)+
-     &          aggi1(l,2)*muij(2)+aggi1(l,3)*muij(3)+aggi1(l,4)*muij(4)
-            gel_loc(l,j)=gel_loc(l,j)+aggj(l,1)*muij(1)+
-     &          aggj(l,2)*muij(2)+aggj(l,3)*muij(3)+aggj(l,4)*muij(4)
-            gel_loc(l,j1)=gel_loc(l,j1)+aggj1(l,1)*muij(1)+
-     &          aggj1(l,2)*muij(2)+aggj1(l,3)*muij(3)+aggj1(l,4)*muij(4)
+            gel_loc(l,i)=gel_loc(l,i)+(aggi(l,1)*muij(1)+
+     &        aggi(l,2)*muij(2)+aggi(l,3)*muij(3)+aggi(l,4)*muij(4))
+     &    *fac_shield(i)*fac_shield(j)
+
+            gel_loc(l,i+1)=gel_loc(l,i+1)+(aggi1(l,1)*muij(1)+
+     &     aggi1(l,2)*muij(2)+aggi1(l,3)*muij(3)+aggi1(l,4)*muij(4))
+     &    *fac_shield(i)*fac_shield(j)
+
+            gel_loc(l,j)=gel_loc(l,j)+(aggj(l,1)*muij(1)+
+     &       aggj(l,2)*muij(2)+aggj(l,3)*muij(3)+aggj(l,4)*muij(4))
+     &    *fac_shield(i)*fac_shield(j)
+
+            gel_loc(l,j1)=gel_loc(l,j1)+(aggj1(l,1)*muij(1)+
+     &     aggj1(l,2)*muij(2)+aggj1(l,3)*muij(3)+aggj1(l,4)*muij(4))
+     &    *fac_shield(i)*fac_shield(j)
+
           enddo
-          endif
+          endif ! calc_grad
           ENDIF
-          if (wturn3.gt.0.0d0 .or. wturn4.gt.0.0d0) then
-C Contributions from turns
-            a_temp(1,1)=a22
-            a_temp(1,2)=a23
-            a_temp(2,1)=a32
-            a_temp(2,2)=a33
-            call eturn34(i,j,eello_turn3,eello_turn4)
-          endif
+
+
 C Change 12/26/95 to calculate four-body contributions to H-bonding energy
-          if (j.gt.i+1 .and. num_conti.le.maxconts) then
+c          if (j.gt.i+1 .and. num_conti.le.maxconts) then
+          if (wcorr+wcorr4+wcorr5+wcorr6.gt.0.0d0
+     &       .and. num_conti.le.maxconts) then
+c            write (iout,*) i,j," entered corr"
 C
 C Calculate the contact function. The ith column of the array JCONT will 
 C contain the numbers of atoms that make contacts with the atom I (of numbers
@@ -2288,6 +3230,8 @@ c           r0ij=1.55D0*rpp(iteli,itelj)
      &                         ' will skip next contacts for this conf.'
               else
                 jcont_hb(num_conti,i)=j
+cd                write (iout,*) "i",i," j",j," num_conti",num_conti,
+cd     &           " jcont_hb",jcont_hb(num_conti,i)
                 IF (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. 
      &          wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0) THEN
 C 9/30/99 (AL) - store components necessary to evaluate higher-order loc-el
@@ -2300,42 +3244,10 @@ C     --- Electrostatic-interaction matrix ---
                 a_chuj(2,1,num_conti,i)=a32
                 a_chuj(2,2,num_conti,i)=a33
 C     --- Gradient of rij
+                if (calc_grad) then
                 do kkk=1,3
                   grij_hb_cont(kkk,num_conti,i)=erij(kkk)
                 enddo
-c             if (i.eq.1) then
-c                a_chuj(1,1,num_conti,i)=-0.61d0
-c                a_chuj(1,2,num_conti,i)= 0.4d0
-c                a_chuj(2,1,num_conti,i)= 0.65d0
-c                a_chuj(2,2,num_conti,i)= 0.50d0
-c             else if (i.eq.2) then
-c                a_chuj(1,1,num_conti,i)= 0.0d0
-c                a_chuj(1,2,num_conti,i)= 0.0d0
-c                a_chuj(2,1,num_conti,i)= 0.0d0
-c                a_chuj(2,2,num_conti,i)= 0.0d0
-c             endif
-C     --- and its gradients
-cd                write (iout,*) 'i',i,' j',j
-cd                do kkk=1,3
-cd                write (iout,*) 'iii 1 kkk',kkk
-cd                write (iout,*) agg(kkk,:)
-cd                enddo
-cd                do kkk=1,3
-cd                write (iout,*) 'iii 2 kkk',kkk
-cd                write (iout,*) aggi(kkk,:)
-cd                enddo
-cd                do kkk=1,3
-cd                write (iout,*) 'iii 3 kkk',kkk
-cd                write (iout,*) aggi1(kkk,:)
-cd                enddo
-cd                do kkk=1,3
-cd                write (iout,*) 'iii 4 kkk',kkk
-cd                write (iout,*) aggj(kkk,:)
-cd                enddo
-cd                do kkk=1,3
-cd                write (iout,*) 'iii 5 kkk',kkk
-cd                write (iout,*) aggj1(kkk,:)
-cd                enddo
                 kkll=0
                 do k=1,2
                   do l=1,2
@@ -2346,12 +3258,10 @@ cd                enddo
                       a_chuj_der(k,l,m,3,num_conti,i)=aggi1(m,kkll)
                       a_chuj_der(k,l,m,4,num_conti,i)=aggj(m,kkll)
                       a_chuj_der(k,l,m,5,num_conti,i)=aggj1(m,kkll)
-c                      do mm=1,5
-c                      a_chuj_der(k,l,m,mm,num_conti,i)=0.0d0
-c                      enddo
                     enddo
                   enddo
                 enddo
+                endif ! calc_grad
                 ENDIF
                 IF (wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) THEN
 C Calculate contact energies
@@ -2361,21 +3271,42 @@ C Calculate contact energies
                 cosbg2=cosb-cosg
 c               fac3=dsqrt(-ael6i)/r0ij**3     
                 fac3=dsqrt(-ael6i)*r3ij
-                ees0pij=dsqrt(4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1)
-                ees0mij=dsqrt(4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2)
+c                 ees0pij=dsqrt(4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1)
+                ees0tmp=4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1
+                if (ees0tmp.gt.0) then
+                  ees0pij=dsqrt(ees0tmp)
+                else
+                  ees0pij=0
+                endif
+c                ees0mij=dsqrt(4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2)
+                ees0tmp=4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2
+                if (ees0tmp.gt.0) then
+                  ees0mij=dsqrt(ees0tmp)
+                else
+                  ees0mij=0
+                endif
 c               ees0mij=0.0D0
+                if (shield_mode.eq.0) then
+                fac_shield(i)=1.0d0
+                fac_shield(j)=1.0d0
+                else
+                ees0plist(num_conti,i)=j
+C                fac_shield(i)=0.4d0
+C                fac_shield(j)=0.6d0
+                endif
                 ees0p(num_conti,i)=0.5D0*fac3*(ees0pij+ees0mij)
+     &          *fac_shield(i)*fac_shield(j) 
                 ees0m(num_conti,i)=0.5D0*fac3*(ees0pij-ees0mij)
+     &          *fac_shield(i)*fac_shield(j)
 C Diagnostics. Comment out or remove after debugging!
 c               ees0p(num_conti,i)=0.5D0*fac3*ees0pij
 c               ees0m(num_conti,i)=0.5D0*fac3*ees0mij
 c               ees0m(num_conti,i)=0.0D0
 C End diagnostics.
-c                write (iout,*) 'i=',i,' j=',j,' rij=',rij,' r0ij=',r0ij,
-c     & ' ees0ij=',ees0p(num_conti,i),ees0m(num_conti,i),' fcont=',fcont
-                facont_hb(num_conti,i)=fcont
-                if (calc_grad) then
+c               write (iout,*) 'i=',i,' j=',j,' rij=',rij,' r0ij=',r0ij,
+c    & ' ees0ij=',ees0p(num_conti,i),ees0m(num_conti,i),' fcont=',fcont
 C Angular derivatives of the contact function
+
                 ees0pij1=fac3/ees0pij 
                 ees0mij1=fac3/ees0mij
                 fac3p=-3.0D0*fac3*rrmij
@@ -2402,6 +3333,9 @@ c               ecosam=0.0D0
 c               ecosbm=0.0D0
 c               ecosgm=0.0D0
 C End diagnostics
+                facont_hb(num_conti,i)=fcont
+
+                if (calc_grad) then
                 fprimcont=fprimcont/rij
 cd              facont_hb(num_conti,i)=1.0D0
 C Following line is for diagnostics.
@@ -2425,24 +3359,39 @@ C Derivatives due to the contact function
                 gacont_hbr(2,num_conti,i)=fprimcont*yj
                 gacont_hbr(3,num_conti,i)=fprimcont*zj
                 do k=1,3
-                  ghalfp=0.5D0*gggp(k)
-                  ghalfm=0.5D0*gggm(k)
-                  gacontp_hb1(k,num_conti,i)=ghalfp
+c
+c 10/24/08 cgrad and ! comments indicate the parts of the code removed 
+c          following the change of gradient-summation algorithm.
+c
+cgrad                  ghalfp=0.5D0*gggp(k)
+cgrad                  ghalfm=0.5D0*gggm(k)
+                  gacontp_hb1(k,num_conti,i)=!ghalfp
      &              +(ecosap*(dc_norm(k,j)-cosa*dc_norm(k,i))
      &              + ecosbp*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1)
-                  gacontp_hb2(k,num_conti,i)=ghalfp
+     &          *fac_shield(i)*fac_shield(j)
+
+                  gacontp_hb2(k,num_conti,i)=!ghalfp
      &              +(ecosap*(dc_norm(k,i)-cosa*dc_norm(k,j))
      &              + ecosgp*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1)
+     &          *fac_shield(i)*fac_shield(j)
+
                   gacontp_hb3(k,num_conti,i)=gggp(k)
-                  gacontm_hb1(k,num_conti,i)=ghalfm
+     &          *fac_shield(i)*fac_shield(j)
+
+                  gacontm_hb1(k,num_conti,i)=!ghalfm
      &              +(ecosam*(dc_norm(k,j)-cosa*dc_norm(k,i))
      &              + ecosbm*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1)
-                  gacontm_hb2(k,num_conti,i)=ghalfm
+     &          *fac_shield(i)*fac_shield(j)
+
+                  gacontm_hb2(k,num_conti,i)=!ghalfm
      &              +(ecosam*(dc_norm(k,i)-cosa*dc_norm(k,j))
      &              + ecosgm*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1)
+     &          *fac_shield(i)*fac_shield(j)
+
                   gacontm_hb3(k,num_conti,i)=gggm(k)
+     &          *fac_shield(i)*fac_shield(j)
+
                 enddo
-                endif
 C Diagnostics. Comment out or remove after debugging!
 cdiag           do k=1,3
 cdiag             gacontp_hb1(k,num_conti,i)=0.0D0
@@ -2452,29 +3401,40 @@ cdiag             gacontm_hb1(k,num_conti,i)=0.0D0
 cdiag             gacontm_hb2(k,num_conti,i)=0.0D0
 cdiag             gacontm_hb3(k,num_conti,i)=0.0D0
 cdiag           enddo
+
+                 endif ! calc_grad
+
               ENDIF ! wcorr
               endif  ! num_conti.le.maxconts
             endif  ! fcont.gt.0
           endif    ! j.gt.i+1
- 1216     continue
-        enddo ! j
-        num_cont_hb(i)=num_conti
- 1215   continue
-      enddo   ! i
-cd      do i=1,nres
-cd        write (iout,'(i3,3f10.5,5x,3f10.5)') 
-cd     &     i,(gel_loc(k,i),k=1,3),gel_loc_loc(i)
-cd      enddo
-c 12/7/99 Adam eello_turn3 will be considered as a separate energy term
-ccc      eel_loc=eel_loc+eello_turn3
+          if (calc_grad) then
+          if (wturn3.gt.0.0d0 .or. wturn4.gt.0.0d0) then
+            do k=1,4
+              do l=1,3
+                ghalf=0.5d0*agg(l,k)
+                aggi(l,k)=aggi(l,k)+ghalf
+                aggi1(l,k)=aggi1(l,k)+agg(l,k)
+                aggj(l,k)=aggj(l,k)+ghalf
+              enddo
+            enddo
+            if (j.eq.nres-1 .and. i.lt.j-2) then
+              do k=1,4
+                do l=1,3
+                  aggj1(l,k)=aggj1(l,k)+agg(l,k)
+                enddo
+              enddo
+            endif
+          endif
+          endif ! calc_grad
+c          t_eelecij=t_eelecij+MPI_Wtime()-time00
       return
       end
 C-----------------------------------------------------------------------------
-      subroutine eturn34(i,j,eello_turn3,eello_turn4)
+      subroutine eturn3(i,eello_turn3)
 C Third- and fourth-order contributions from turns
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.GEO'
       include 'COMMON.VAR'
@@ -2486,14 +3446,25 @@ C Third- and fourth-order contributions from turns
       include 'COMMON.TORSION'
       include 'COMMON.VECTORS'
       include 'COMMON.FFIELD'
+      include 'COMMON.CONTROL'
+      include 'COMMON.SHIELD'
       dimension ggg(3)
       double precision auxmat(2,2),auxmat1(2,2),auxmat2(2,2),pizda(2,2),
      &  e1t(2,2),e2t(2,2),e3t(2,2),e1tder(2,2),e2tder(2,2),e3tder(2,2),
-     &  e1a(2,2),ae3(2,2),ae3e2(2,2),auxvec(2),auxvec1(2)
+     &  e1a(2,2),ae3(2,2),ae3e2(2,2),auxvec(2),auxvec1(2),gpizda1(2,2),
+     &  gpizda2(2,2),auxgmat1(2,2),auxgmatt1(2,2),
+     &  auxgmat2(2,2),auxgmatt2(2,2)
       double precision agg(3,4),aggi(3,4),aggi1(3,4),
-     &    aggj(3,4),aggj1(3,4),a_temp(2,2)
-      common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,j1,j2
-      if (j.eq.i+2) then
+     &    aggj(3,4),aggj1(3,4),a_temp(2,2),auxmat3(2,2)
+      common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33,
+     &    dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi,
+     &    num_conti,j1,j2
+      j=i+2
+c      write (iout,*) "eturn3",i,j,j1,j2
+      a_temp(1,1)=a22
+      a_temp(1,2)=a23
+      a_temp(2,1)=a32
+      a_temp(2,2)=a33
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 C
 C               Third-order contributions
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC   
 cd        call checkint_turn3(i,a_temp,eello_turn3_num)
         call matmat2(EUg(1,1,i+1),EUg(1,1,i+2),auxmat(1,1))
+c auxalary matices for theta gradient
+c auxalary matrix for i+1 and constant i+2
+        call matmat2(gtEUg(1,1,i+1),EUg(1,1,i+2),auxgmat1(1,1))
+c auxalary matrix for i+2 and constant i+1
+        call matmat2(EUg(1,1,i+1),gtEUg(1,1,i+2),auxgmat2(1,1))
         call transpose2(auxmat(1,1),auxmat1(1,1))
+        call transpose2(auxgmat1(1,1),auxgmatt1(1,1))
+        call transpose2(auxgmat2(1,1),auxgmatt2(1,1))
         call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1))
+        call matmat2(a_temp(1,1),auxgmatt1(1,1),gpizda1(1,1))
+        call matmat2(a_temp(1,1),auxgmatt2(1,1),gpizda2(1,1))
+        if (shield_mode.eq.0) then
+        fac_shield(i)=1.0
+        fac_shield(j)=1.0
+C        else
+C        fac_shield(i)=0.4
+C        fac_shield(j)=0.6
+        endif
         eello_turn3=eello_turn3+0.5d0*(pizda(1,1)+pizda(2,2))
+     &  *fac_shield(i)*fac_shield(j)
+        eello_t3=0.5d0*(pizda(1,1)+pizda(2,2))
+     &  *fac_shield(i)*fac_shield(j)
+        if (energy_dec) write (iout,'(6heturn3,2i5,0pf7.3)') i,i+2,
+     &    eello_t3
+        if (calc_grad) then
+C#ifdef NEWCORR
+C Derivatives in theta
+        gloc(nphi+i,icg)=gloc(nphi+i,icg)
+     &  +0.5d0*(gpizda1(1,1)+gpizda1(2,2))*wturn3
+     &   *fac_shield(i)*fac_shield(j)
+        gloc(nphi+i+1,icg)=gloc(nphi+i+1,icg)
+     &  +0.5d0*(gpizda2(1,1)+gpizda2(2,2))*wturn3
+     &   *fac_shield(i)*fac_shield(j)
+C#endif
+
+C Derivatives in shield mode
+          if ((fac_shield(i).gt.0).and.(fac_shield(j).gt.0).and.
+     &  (shield_mode.gt.0)) then
+C          print *,i,j     
+
+          do ilist=1,ishield_list(i)
+           iresshield=shield_list(ilist,i)
+           do k=1,3
+           rlocshield=grad_shield_side(k,ilist,i)*eello_t3/fac_shield(i)
+C     &      *2.0
+           gshieldx_t3(k,iresshield)=gshieldx_t3(k,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(k,ilist,i)*eello_t3/fac_shield(i)
+            gshieldc_t3(k,iresshield-1)=gshieldc_t3(k,iresshield-1)
+     &      +rlocshield
+           enddo
+          enddo
+          do ilist=1,ishield_list(j)
+           iresshield=shield_list(ilist,j)
+           do k=1,3
+           rlocshield=grad_shield_side(k,ilist,j)*eello_t3/fac_shield(j)
+C     &     *2.0
+           gshieldx_t3(k,iresshield)=gshieldx_t3(k,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(k,ilist,j)*eello_t3/fac_shield(j)
+           gshieldc_t3(k,iresshield-1)=gshieldc_t3(k,iresshield-1)
+     &             +rlocshield
+
+           enddo
+          enddo
+
+          do k=1,3
+            gshieldc_t3(k,i)=gshieldc_t3(k,i)+
+     &              grad_shield(k,i)*eello_t3/fac_shield(i)
+            gshieldc_t3(k,j)=gshieldc_t3(k,j)+
+     &              grad_shield(k,j)*eello_t3/fac_shield(j)
+            gshieldc_t3(k,i-1)=gshieldc_t3(k,i-1)+
+     &              grad_shield(k,i)*eello_t3/fac_shield(i)
+            gshieldc_t3(k,j-1)=gshieldc_t3(k,j-1)+
+     &              grad_shield(k,j)*eello_t3/fac_shield(j)
+           enddo
+           endif
+
+C        if (energy_dec) write (iout,'(a6,2i5,0pf7.3)')
 cd        write (2,*) 'i,',i,' j',j,'eello_turn3',
 cd     &    0.5d0*(pizda(1,1)+pizda(2,2)),
 cd     &    ' eello_turn3_num',4*eello_turn3_num
-        if (calc_grad) then
 C Derivatives in gamma(i)
         call matmat2(EUgder(1,1,i+1),EUg(1,1,i+2),auxmat2(1,1))
-        call transpose2(auxmat2(1,1),pizda(1,1))
-        call matmat2(a_temp(1,1),pizda(1,1),pizda(1,1))
+        call transpose2(auxmat2(1,1),auxmat3(1,1))
+        call matmat2(a_temp(1,1),auxmat3(1,1),pizda(1,1))
         gel_loc_turn3(i)=gel_loc_turn3(i)+0.5d0*(pizda(1,1)+pizda(2,2))
+     &   *fac_shield(i)*fac_shield(j)
 C Derivatives in gamma(i+1)
         call matmat2(EUg(1,1,i+1),EUgder(1,1,i+2),auxmat2(1,1))
-        call transpose2(auxmat2(1,1),pizda(1,1))
-        call matmat2(a_temp(1,1),pizda(1,1),pizda(1,1))
+        call transpose2(auxmat2(1,1),auxmat3(1,1))
+        call matmat2(a_temp(1,1),auxmat3(1,1),pizda(1,1))
         gel_loc_turn3(i+1)=gel_loc_turn3(i+1)
      &    +0.5d0*(pizda(1,1)+pizda(2,2))
+     &   *fac_shield(i)*fac_shield(j)
 C Cartesian derivatives
         do l=1,3
-          a_temp(1,1)=aggi(l,1)
-          a_temp(1,2)=aggi(l,2)
-          a_temp(2,1)=aggi(l,3)
-          a_temp(2,2)=aggi(l,4)
+c            ghalf1=0.5d0*agg(l,1)
+c            ghalf2=0.5d0*agg(l,2)
+c            ghalf3=0.5d0*agg(l,3)
+c            ghalf4=0.5d0*agg(l,4)
+          a_temp(1,1)=aggi(l,1)!+ghalf1
+          a_temp(1,2)=aggi(l,2)!+ghalf2
+          a_temp(2,1)=aggi(l,3)!+ghalf3
+          a_temp(2,2)=aggi(l,4)!+ghalf4
           call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1))
           gcorr3_turn(l,i)=gcorr3_turn(l,i)
      &      +0.5d0*(pizda(1,1)+pizda(2,2))
-          a_temp(1,1)=aggi1(l,1)
-          a_temp(1,2)=aggi1(l,2)
-          a_temp(2,1)=aggi1(l,3)
-          a_temp(2,2)=aggi1(l,4)
+     &   *fac_shield(i)*fac_shield(j)
+
+          a_temp(1,1)=aggi1(l,1)!+agg(l,1)
+          a_temp(1,2)=aggi1(l,2)!+agg(l,2)
+          a_temp(2,1)=aggi1(l,3)!+agg(l,3)
+          a_temp(2,2)=aggi1(l,4)!+agg(l,4)
           call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1))
           gcorr3_turn(l,i+1)=gcorr3_turn(l,i+1)
      &      +0.5d0*(pizda(1,1)+pizda(2,2))
-          a_temp(1,1)=aggj(l,1)
-          a_temp(1,2)=aggj(l,2)
-          a_temp(2,1)=aggj(l,3)
-          a_temp(2,2)=aggj(l,4)
+     &   *fac_shield(i)*fac_shield(j)
+          a_temp(1,1)=aggj(l,1)!+ghalf1
+          a_temp(1,2)=aggj(l,2)!+ghalf2
+          a_temp(2,1)=aggj(l,3)!+ghalf3
+          a_temp(2,2)=aggj(l,4)!+ghalf4
           call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1))
           gcorr3_turn(l,j)=gcorr3_turn(l,j)
      &      +0.5d0*(pizda(1,1)+pizda(2,2))
+     &   *fac_shield(i)*fac_shield(j)
           a_temp(1,1)=aggj1(l,1)
           a_temp(1,2)=aggj1(l,2)
           a_temp(2,1)=aggj1(l,3)
@@ -2554,9 +3610,45 @@ C Cartesian derivatives
           call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1))
           gcorr3_turn(l,j1)=gcorr3_turn(l,j1)
      &      +0.5d0*(pizda(1,1)+pizda(2,2))
+     &   *fac_shield(i)*fac_shield(j)
         enddo
-        endif
-      else if (j.eq.i+3 .and. itype(i+2).ne.21) then
+
+        endif ! calc_grad
+
+      return
+      end
+C-------------------------------------------------------------------------------
+      subroutine eturn4(i,eello_turn4)
+C Third- and fourth-order contributions from turns
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.GEO'
+      include 'COMMON.VAR'
+      include 'COMMON.LOCAL'
+      include 'COMMON.CHAIN'
+      include 'COMMON.DERIV'
+      include 'COMMON.INTERACT'
+      include 'COMMON.CONTACTS'
+      include 'COMMON.TORSION'
+      include 'COMMON.VECTORS'
+      include 'COMMON.FFIELD'
+      include 'COMMON.CONTROL'
+      include 'COMMON.SHIELD'
+      dimension ggg(3)
+      double precision auxmat(2,2),auxmat1(2,2),auxmat2(2,2),pizda(2,2),
+     &  e1t(2,2),e2t(2,2),e3t(2,2),e1tder(2,2),e2tder(2,2),e3tder(2,2),
+     &  e1a(2,2),ae3(2,2),ae3e2(2,2),auxvec(2),auxvec1(2),auxgvec(2),
+     &  auxgEvec1(2),auxgEvec2(2),auxgEvec3(2),
+     &  gte1t(2,2),gte2t(2,2),gte3t(2,2),
+     &  gte1a(2,2),gtae3(2,2),gtae3e2(2,2), ae3gte2(2,2),
+     &  gtEpizda1(2,2),gtEpizda2(2,2),gtEpizda3(2,2)
+      double precision agg(3,4),aggi(3,4),aggi1(3,4),
+     &    aggj(3,4),aggj1(3,4),a_temp(2,2),auxmat3(2,2)
+      common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33,
+     &    dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi,
+     &    num_conti,j1,j2
+      j=i+3
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 C
 C               Fourth-order contributions
@@ -2569,52 +3661,188 @@ C                 (i+1)o----i
 C
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC   
 cd        call checkint_turn4(i,a_temp,eello_turn4_num)
-        iti1=itortyp(itype(i+1))
-        iti2=itortyp(itype(i+2))
-        iti3=itortyp(itype(i+3))
+c        write (iout,*) "eturn4 i",i," j",j," j1",j1," j2",j2
+c        write(iout,*)"WCHODZE W PROGRAM"
+        a_temp(1,1)=a22
+        a_temp(1,2)=a23
+        a_temp(2,1)=a32
+        a_temp(2,2)=a33
+        iti1=itype2loc(itype(i+1))
+        iti2=itype2loc(itype(i+2))
+        iti3=itype2loc(itype(i+3))
+c        write(iout,*) "iti1",iti1," iti2",iti2," iti3",iti3
         call transpose2(EUg(1,1,i+1),e1t(1,1))
         call transpose2(Eug(1,1,i+2),e2t(1,1))
         call transpose2(Eug(1,1,i+3),e3t(1,1))
+C Ematrix derivative in theta
+        call transpose2(gtEUg(1,1,i+1),gte1t(1,1))
+        call transpose2(gtEug(1,1,i+2),gte2t(1,1))
+        call transpose2(gtEug(1,1,i+3),gte3t(1,1))
         call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1))
+c       eta1 in derivative theta
+        call matmat2(gte1t(1,1),a_temp(1,1),gte1a(1,1))
         call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1))
-        s1=scalar2(b1(1,iti2),auxvec(1))
+c       auxgvec is derivative of Ub2 so i+3 theta
+        call matvec2(e1a(1,1),gUb2(1,i+3),auxgvec(1)) 
+c       auxalary matrix of E i+1
+        call matvec2(gte1a(1,1),Ub2(1,i+3),auxgEvec1(1))
+c        s1=0.0
+c        gs1=0.0    
+        s1=scalar2(b1(1,i+2),auxvec(1))
+c derivative of theta i+2 with constant i+3
+        gs23=scalar2(gtb1(1,i+2),auxvec(1))
+c derivative of theta i+2 with constant i+2
+        gs32=scalar2(b1(1,i+2),auxgvec(1))
+c derivative of E matix in theta of i+1
+        gsE13=scalar2(b1(1,i+2),auxgEvec1(1))
+
         call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1))
+c       ea31 in derivative theta
+        call matmat2(a_temp(1,1),gte3t(1,1),gtae3(1,1))
         call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) 
-        s2=scalar2(b1(1,iti1),auxvec(1))
+c auxilary matrix auxgvec of Ub2 with constant E matirx
+        call matvec2(ae3(1,1),gUb2(1,i+2),auxgvec(1))
+c auxilary matrix auxgEvec1 of E matix with Ub2 constant
+        call matvec2(gtae3(1,1),Ub2(1,i+2),auxgEvec3(1))
+
+c        s2=0.0
+c        gs2=0.0
+        s2=scalar2(b1(1,i+1),auxvec(1))
+c derivative of theta i+1 with constant i+3
+        gs13=scalar2(gtb1(1,i+1),auxvec(1))
+c derivative of theta i+2 with constant i+1
+        gs21=scalar2(b1(1,i+1),auxgvec(1))
+c derivative of theta i+3 with constant i+1
+        gsE31=scalar2(b1(1,i+1),auxgEvec3(1))
+c        write(iout,*) gs1,gs2,'i=',i,auxgvec(1),gUb2(1,i+2),gtb1(1,i+2),
+c     &  gtb1(1,i+1)
         call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1))
+c two derivatives over diffetent matrices
+c gtae3e2 is derivative over i+3
+        call matmat2(gtae3(1,1),e2t(1,1),gtae3e2(1,1))
+c ae3gte2 is derivative over i+2
+        call matmat2(ae3(1,1),gte2t(1,1),ae3gte2(1,1))
         call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1))
+c three possible derivative over theta E matices
+c i+1
+        call matmat2(ae3e2(1,1),gte1t(1,1),gtEpizda1(1,1))
+c i+2
+        call matmat2(ae3gte2(1,1),e1t(1,1),gtEpizda2(1,1))
+c i+3
+        call matmat2(gtae3e2(1,1),e1t(1,1),gtEpizda3(1,1))
         s3=0.5d0*(pizda(1,1)+pizda(2,2))
+
+        gsEE1=0.5d0*(gtEpizda1(1,1)+gtEpizda1(2,2))
+        gsEE2=0.5d0*(gtEpizda2(1,1)+gtEpizda2(2,2))
+        gsEE3=0.5d0*(gtEpizda3(1,1)+gtEpizda3(2,2))
+        if (shield_mode.eq.0) then
+        fac_shield(i)=1.0
+        fac_shield(j)=1.0
+C        else
+C        fac_shield(i)=0.6
+C        fac_shield(j)=0.4
+        endif
         eello_turn4=eello_turn4-(s1+s2+s3)
+     &  *fac_shield(i)*fac_shield(j)
+        eello_t4=-(s1+s2+s3)
+     &  *fac_shield(i)*fac_shield(j)
+c             write(iout,*)'chujOWO', auxvec(1),b1(1,iti2)
+        if (energy_dec) write (iout,'(a6,2i5,0pf7.3,3f7.3)')
+     &      'eturn4',i,j,-(s1+s2+s3),s1,s2,s3
+C Now derivative over shield:
+          if ((fac_shield(i).gt.0).and.(fac_shield(j).gt.0).and.
+     &  (shield_mode.gt.0)) then
+C          print *,i,j     
+
+          do ilist=1,ishield_list(i)
+           iresshield=shield_list(ilist,i)
+           do k=1,3
+           rlocshield=grad_shield_side(k,ilist,i)*eello_t4/fac_shield(i)
+C     &      *2.0
+           gshieldx_t4(k,iresshield)=gshieldx_t4(k,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(k,ilist,i)*eello_t4/fac_shield(i)
+            gshieldc_t4(k,iresshield-1)=gshieldc_t4(k,iresshield-1)
+     &      +rlocshield
+           enddo
+          enddo
+          do ilist=1,ishield_list(j)
+           iresshield=shield_list(ilist,j)
+           do k=1,3
+           rlocshield=grad_shield_side(k,ilist,j)*eello_t4/fac_shield(j)
+C     &     *2.0
+           gshieldx_t4(k,iresshield)=gshieldx_t4(k,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(k,ilist,j)*eello_t4/fac_shield(j)
+           gshieldc_t4(k,iresshield-1)=gshieldc_t4(k,iresshield-1)
+     &             +rlocshield
+
+           enddo
+          enddo
+
+          do k=1,3
+            gshieldc_t4(k,i)=gshieldc_t4(k,i)+
+     &              grad_shield(k,i)*eello_t4/fac_shield(i)
+            gshieldc_t4(k,j)=gshieldc_t4(k,j)+
+     &              grad_shield(k,j)*eello_t4/fac_shield(j)
+            gshieldc_t4(k,i-1)=gshieldc_t4(k,i-1)+
+     &              grad_shield(k,i)*eello_t4/fac_shield(i)
+            gshieldc_t4(k,j-1)=gshieldc_t4(k,j-1)+
+     &              grad_shield(k,j)*eello_t4/fac_shield(j)
+           enddo
+           endif
 cd        write (2,*) 'i,',i,' j',j,'eello_turn4',-(s1+s2+s3),
 cd     &    ' eello_turn4_num',8*eello_turn4_num
+#ifdef NEWCORR
+        gloc(nphi+i,icg)=gloc(nphi+i,icg)
+     &                  -(gs13+gsE13+gsEE1)*wturn4
+     &  *fac_shield(i)*fac_shield(j)
+        gloc(nphi+i+1,icg)= gloc(nphi+i+1,icg)
+     &                    -(gs23+gs21+gsEE2)*wturn4
+     &  *fac_shield(i)*fac_shield(j)
+
+        gloc(nphi+i+2,icg)= gloc(nphi+i+2,icg)
+     &                    -(gs32+gsE31+gsEE3)*wturn4
+     &  *fac_shield(i)*fac_shield(j)
+
+c         gloc(nphi+i+1,icg)=gloc(nphi+i+1,icg)-
+c     &   gs2
+#endif
+        if (energy_dec) write (iout,'(a6,2i5,0pf7.3)')
+     &      'eturn4',i,j,-(s1+s2+s3)
+c        write (iout,*) 'i,',i,' j',j,'eello_turn4',-(s1+s2+s3),
+c     &    ' eello_turn4_num',8*eello_turn4_num
 C Derivatives in gamma(i)
-        if (calc_grad) then
         call transpose2(EUgder(1,1,i+1),e1tder(1,1))
         call matmat2(e1tder(1,1),a_temp(1,1),auxmat(1,1))
         call matvec2(auxmat(1,1),Ub2(1,i+3),auxvec(1))
-        s1=scalar2(b1(1,iti2),auxvec(1))
+        s1=scalar2(b1(1,i+2),auxvec(1))
         call matmat2(ae3e2(1,1),e1tder(1,1),pizda(1,1))
         s3=0.5d0*(pizda(1,1)+pizda(2,2))
         gel_loc_turn4(i)=gel_loc_turn4(i)-(s1+s3)
+     &  *fac_shield(i)*fac_shield(j)
 C Derivatives in gamma(i+1)
         call transpose2(EUgder(1,1,i+2),e2tder(1,1))
         call matvec2(ae3(1,1),Ub2der(1,i+2),auxvec(1)) 
-        s2=scalar2(b1(1,iti1),auxvec(1))
+        s2=scalar2(b1(1,i+1),auxvec(1))
         call matmat2(ae3(1,1),e2tder(1,1),auxmat(1,1))
         call matmat2(auxmat(1,1),e1t(1,1),pizda(1,1))
         s3=0.5d0*(pizda(1,1)+pizda(2,2))
         gel_loc_turn4(i+1)=gel_loc_turn4(i+1)-(s2+s3)
+     &  *fac_shield(i)*fac_shield(j)
 C Derivatives in gamma(i+2)
         call transpose2(EUgder(1,1,i+3),e3tder(1,1))
         call matvec2(e1a(1,1),Ub2der(1,i+3),auxvec(1))
-        s1=scalar2(b1(1,iti2),auxvec(1))
+        s1=scalar2(b1(1,i+2),auxvec(1))
         call matmat2(a_temp(1,1),e3tder(1,1),auxmat(1,1))
         call matvec2(auxmat(1,1),Ub2(1,i+2),auxvec(1)) 
-        s2=scalar2(b1(1,iti1),auxvec(1))
-        call matmat2(auxmat(1,1),e2t(1,1),auxmat(1,1))
-        call matmat2(auxmat(1,1),e1t(1,1),pizda(1,1))
+        s2=scalar2(b1(1,i+1),auxvec(1))
+        call matmat2(auxmat(1,1),e2t(1,1),auxmat3(1,1))
+        call matmat2(auxmat3(1,1),e1t(1,1),pizda(1,1))
         s3=0.5d0*(pizda(1,1)+pizda(2,2))
         gel_loc_turn4(i+2)=gel_loc_turn4(i+2)-(s1+s2+s3)
+     &  *fac_shield(i)*fac_shield(j)
+        if (calc_grad) then
 C Cartesian derivatives
 C Derivatives of this turn contributions in DC(i+2)
         if (j.lt.nres-1) then
@@ -2625,15 +3853,16 @@ C Derivatives of this turn contributions in DC(i+2)
             a_temp(2,2)=agg(l,4)
             call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1))
             call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1))
-            s1=scalar2(b1(1,iti2),auxvec(1))
+            s1=scalar2(b1(1,i+2),auxvec(1))
             call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1))
             call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) 
-            s2=scalar2(b1(1,iti1),auxvec(1))
+            s2=scalar2(b1(1,i+1),auxvec(1))
             call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1))
             call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1))
             s3=0.5d0*(pizda(1,1)+pizda(2,2))
             ggg(l)=-(s1+s2+s3)
             gcorr4_turn(l,i+2)=gcorr4_turn(l,i+2)-(s1+s2+s3)
+     &  *fac_shield(i)*fac_shield(j)
           enddo
         endif
 C Remaining derivatives of this turn contribution
@@ -2644,59 +3873,65 @@ C Remaining derivatives of this turn contribution
           a_temp(2,2)=aggi(l,4)
           call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1))
           call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1))
-          s1=scalar2(b1(1,iti2),auxvec(1))
+          s1=scalar2(b1(1,i+2),auxvec(1))
           call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1))
           call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) 
-          s2=scalar2(b1(1,iti1),auxvec(1))
+          s2=scalar2(b1(1,i+1),auxvec(1))
           call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1))
           call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1))
           s3=0.5d0*(pizda(1,1)+pizda(2,2))
           gcorr4_turn(l,i)=gcorr4_turn(l,i)-(s1+s2+s3)
+     &  *fac_shield(i)*fac_shield(j)
           a_temp(1,1)=aggi1(l,1)
           a_temp(1,2)=aggi1(l,2)
           a_temp(2,1)=aggi1(l,3)
           a_temp(2,2)=aggi1(l,4)
           call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1))
           call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1))
-          s1=scalar2(b1(1,iti2),auxvec(1))
+          s1=scalar2(b1(1,i+2),auxvec(1))
           call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1))
           call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) 
-          s2=scalar2(b1(1,iti1),auxvec(1))
+          s2=scalar2(b1(1,i+1),auxvec(1))
           call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1))
           call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1))
           s3=0.5d0*(pizda(1,1)+pizda(2,2))
           gcorr4_turn(l,i+1)=gcorr4_turn(l,i+1)-(s1+s2+s3)
+     &  *fac_shield(i)*fac_shield(j)
           a_temp(1,1)=aggj(l,1)
           a_temp(1,2)=aggj(l,2)
           a_temp(2,1)=aggj(l,3)
           a_temp(2,2)=aggj(l,4)
           call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1))
           call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1))
-          s1=scalar2(b1(1,iti2),auxvec(1))
+          s1=scalar2(b1(1,i+2),auxvec(1))
           call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1))
           call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) 
-          s2=scalar2(b1(1,iti1),auxvec(1))
+          s2=scalar2(b1(1,i+1),auxvec(1))
           call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1))
           call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1))
           s3=0.5d0*(pizda(1,1)+pizda(2,2))
           gcorr4_turn(l,j)=gcorr4_turn(l,j)-(s1+s2+s3)
+     &  *fac_shield(i)*fac_shield(j)
           a_temp(1,1)=aggj1(l,1)
           a_temp(1,2)=aggj1(l,2)
           a_temp(2,1)=aggj1(l,3)
           a_temp(2,2)=aggj1(l,4)
           call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1))
           call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1))
-          s1=scalar2(b1(1,iti2),auxvec(1))
+          s1=scalar2(b1(1,i+2),auxvec(1))
           call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1))
           call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) 
-          s2=scalar2(b1(1,iti1),auxvec(1))
+          s2=scalar2(b1(1,i+1),auxvec(1))
           call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1))
           call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1))
           s3=0.5d0*(pizda(1,1)+pizda(2,2))
+c          write (iout,*) "s1",s1," s2",s2," s3",s3," s1+s2+s3",s1+s2+s3
           gcorr4_turn(l,j1)=gcorr4_turn(l,j1)-(s1+s2+s3)
+     &  *fac_shield(i)*fac_shield(j)
         enddo
-        endif
-      endif          
+
+        endif ! calc_grad
+
       return
       end
 C-----------------------------------------------------------------------------
@@ -2741,7 +3976,6 @@ C side-chain vectors.
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.GEO'
       include 'COMMON.VAR'
       include 'COMMON.LOCAL'
@@ -2757,7 +3991,7 @@ cd    print '(a)','Enter ESCP'
 c      write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e,
 c     &  ' scal14',scal14
       do i=iatscp_s,iatscp_e
-        if (itype(i).eq.21 .or. itype(i+1).eq.21) cycle
+        if (itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1) cycle
         iteli=itel(i)
 c        write (iout,*) "i",i," iteli",iteli," nscp_gr",nscp_gr(i),
 c     &   " iscp",(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i))
@@ -2765,37 +3999,90 @@ c     &   " iscp",(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i))
         xi=0.5D0*(c(1,i)+c(1,i+1))
         yi=0.5D0*(c(2,i)+c(2,i+1))
         zi=0.5D0*(c(3,i)+c(3,i+1))
-
+C Returning the ith atom to box
+          xi=mod(xi,boxxsize)
+          if (xi.lt.0) xi=xi+boxxsize
+          yi=mod(yi,boxysize)
+          if (yi.lt.0) yi=yi+boxysize
+          zi=mod(zi,boxzsize)
+          if (zi.lt.0) zi=zi+boxzsize
         do iint=1,nscp_gr(i)
 
         do j=iscpstart(i,iint),iscpend(i,iint)
-          itypj=itype(j)
-          if (itypj.eq.21) cycle
+          itypj=iabs(itype(j))
+          if (itypj.eq.ntyp1) cycle
 C Uncomment following three lines for SC-p interactions
 c         xj=c(1,nres+j)-xi
 c         yj=c(2,nres+j)-yi
 c         zj=c(3,nres+j)-zi
 C Uncomment following three lines for Ca-p interactions
-          xj=c(1,j)-xi
-          yj=c(2,j)-yi
-          zj=c(3,j)-zi
+          xj=c(1,j)
+          yj=c(2,j)
+          zj=c(3,j)
+C returning the jth atom to box
+          xj=mod(xj,boxxsize)
+          if (xj.lt.0) xj=xj+boxxsize
+          yj=mod(yj,boxysize)
+          if (yj.lt.0) yj=yj+boxysize
+          zj=mod(zj,boxzsize)
+          if (zj.lt.0) zj=zj+boxzsize
+      dist_init=(xj-xi)**2+(yj-yi)**2+(zj-zi)**2
+      xj_safe=xj
+      yj_safe=yj
+      zj_safe=zj
+      subchap=0
+C Finding the closest jth atom
+      do xshift=-1,1
+      do yshift=-1,1
+      do zshift=-1,1
+          xj=xj_safe+xshift*boxxsize
+          yj=yj_safe+yshift*boxysize
+          zj=zj_safe+zshift*boxzsize
+          dist_temp=(xj-xi)**2+(yj-yi)**2+(zj-zi)**2
+          if(dist_temp.lt.dist_init) then
+            dist_init=dist_temp
+            xj_temp=xj
+            yj_temp=yj
+            zj_temp=zj
+            subchap=1
+          endif
+       enddo
+       enddo
+       enddo
+       if (subchap.eq.1) then
+          xj=xj_temp-xi
+          yj=yj_temp-yi
+          zj=zj_temp-zi
+       else
+          xj=xj_safe-xi
+          yj=yj_safe-yi
+          zj=zj_safe-zi
+       endif
           rrij=1.0D0/(xj*xj+yj*yj+zj*zj)
+C sss is scaling function for smoothing the cutoff gradient otherwise
+C the gradient would not be continuouse
+          sss=sscale(1.0d0/(dsqrt(rrij)))
+          if (sss.le.0.0d0) cycle
+          sssgrad=sscagrad(1.0d0/(dsqrt(rrij)))
           fac=rrij**expon2
           e1=fac*fac*aad(itypj,iteli)
           e2=fac*bad(itypj,iteli)
           if (iabs(j-i) .le. 2) then
             e1=scal14*e1
             e2=scal14*e2
-            evdw2_14=evdw2_14+e1+e2
+            evdw2_14=evdw2_14+(e1+e2)*sss
           endif
           evdwij=e1+e2
-c          write (iout,*) i,j,evdwij
-          evdw2=evdw2+evdwij
+c          write (iout,'(a6,2i5,0pf7.3,2i3,3e11.3)')
+c     &        'evdw2',i,j,evdwij,iteli,itypj,fac,aad(itypj,iteli),
+c     &       bad(itypj,iteli)
+          evdw2=evdw2+evdwij*sss
           if (calc_grad) then
 C
 C Calculate contributions to the gradient in the virtual-bond and SC vectors.
 C
-          fac=-(evdwij+e1)*rrij
+          fac=-(evdwij+e1)*rrij*sss
+          fac=fac+(evdwij)*sssgrad*dsqrt(rrij)/expon
           ggg(1)=xj*fac
           ggg(2)=yj*fac
           ggg(3)=zj*fac
@@ -2825,7 +4112,7 @@ cd        write (iout,*) ggg(1),ggg(2),ggg(3)
               gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l)
             enddo
           enddo
-          endif
+          endif ! calc_grad
         enddo
         enddo ! iint
  1225   continue
@@ -2854,16 +4141,18 @@ C Evaluate bridge-strain energy and its gradient in virtual-bond and SC vectors.
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.SBRIDGE'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
       include 'COMMON.VAR'
       include 'COMMON.INTERACT'
+      include 'COMMON.CONTROL'
+      include 'COMMON.IOUNITS'
       dimension ggg(3)
       ehpb=0.0D0
-cd    print *,'edis: nhpb=',nhpb,' fbr=',fbr
-cd    print *,'link_start=',link_start,' link_end=',link_end
+c      write(iout,*)'edis: nhpb=',nhpb,' fbr=',fbr
+c      write(iout,*)'link_start=',link_start,' link_end=',link_end
+C      write(iout,*) link_end, "link_end"
       if (link_end.eq.0) return
       do i=link_start,link_end
 C If ihpb(i) and jhpb(i) > NRES, this is a SC-SC distance, otherwise a
@@ -2880,24 +4169,98 @@ C iii and jjj point to the residues for which the distance is assigned.
         endif
 C 24/11/03 AL: SS bridges handled separately because of introducing a specific
 C    distance and angle dependent SS bond potential.
-        if (ii.gt.nres .and. itype(iii).eq.1 .and. itype(jjj).eq.1) then
+C        if (ii.gt.nres .and. iabs(itype(iii)).eq.1 .and. 
+C     & iabs(itype(jjj)).eq.1) then
+C       write(iout,*) constr_dist,"const"
+       if (.not.dyn_ss .and. i.le.nss) then
+         if (ii.gt.nres .and. iabs(itype(iii)).eq.1 .and.
+     & iabs(itype(jjj)).eq.1) then
           call ssbond_ene(iii,jjj,eij)
           ehpb=ehpb+2*eij
-        else
-C Calculate the distance between the two points and its difference from the
-C target distance.
-        dd=dist(ii,jj)
-        rdis=dd-dhpb(i)
+           endif !ii.gt.neres
+        else if (ii.gt.nres .and. jj.gt.nres) then
+c Restraints from contact prediction
+          dd=dist(ii,jj)
+          if (constr_dist.eq.11) then
+C            ehpb=ehpb+fordepth(i)**4.0d0
+C     &          *rlornmr1(dd,dhpb(i),dhpb1(i),forcon(i))
+            ehpb=ehpb+fordepth(i)!**4.0d0
+     &          *rlornmr1(dd,dhpb(i),dhpb1(i),forcon(i))
+            fac=fordepth(i)!**4.0d0
+     &          *rlornmr1prim(dd,dhpb(i),dhpb1(i),forcon(i))/dd
+C          write (iout,'(a6,2i5,3f8.3)') "edisl",ii,jj,
+C     &    ehpb,fordepth(i),dd
+C            write(iout,*) ehpb,"atu?"
+C            ehpb,"tu?"
+C            fac=fordepth(i)**4.0d0
+C     &          *rlornmr1prim(dd,dhpb(i),dhpb1(i),forcon(i))/dd
+           else
+          if (dhpb1(i).gt.0.0d0) then
+            ehpb=ehpb+2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i))
+            fac=forcon(i)*gnmr1prim(dd,dhpb(i),dhpb1(i))/dd
+c            write (iout,*) "beta nmr",
+c     &        dd,2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i))
+          else
+            dd=dist(ii,jj)
+            rdis=dd-dhpb(i)
+C Get the force constant corresponding to this distance.
+            waga=forcon(i)
+C Calculate the contribution to energy.
+            ehpb=ehpb+waga*rdis*rdis
+c            write (iout,*) "beta reg",dd,waga*rdis*rdis
+C
+C Evaluate gradient.
+C
+            fac=waga*rdis/dd
+          endif !end dhpb1(i).gt.0
+          endif !end const_dist=11
+          do j=1,3
+            ggg(j)=fac*(c(j,jj)-c(j,ii))
+          enddo
+          do j=1,3
+            ghpbx(j,iii)=ghpbx(j,iii)-ggg(j)
+            ghpbx(j,jjj)=ghpbx(j,jjj)+ggg(j)
+          enddo
+          do k=1,3
+            ghpbc(k,jjj)=ghpbc(k,jjj)+ggg(k)
+            ghpbc(k,iii)=ghpbc(k,iii)-ggg(k)
+          enddo
+        else !ii.gt.nres
+C          write(iout,*) "before"
+          dd=dist(ii,jj)
+C          write(iout,*) "after",dd
+          if (constr_dist.eq.11) then
+            ehpb=ehpb+fordepth(i)!**4.0d0
+     &          *rlornmr1(dd,dhpb(i),dhpb1(i),forcon(i))
+            fac=fordepth(i)!**4.0d0
+     &          *rlornmr1prim(dd,dhpb(i),dhpb1(i),forcon(i))/dd
+C            ehpb=ehpb+fordepth(i)**4*rlornmr1(dd,dhpb(i),dhpb1(i))
+C            fac=fordepth(i)**4*rlornmr1prim(dd,dhpb(i),dhpb1(i))/dd
+C            print *,ehpb,"tu?"
+C            write(iout,*) ehpb,"btu?",
+C     & dd,dhpb(i),dhpb1(i),fordepth(i),forcon(i)
+C          write (iout,'(a6,2i5,3f8.3)') "edisl",ii,jj,
+C     &    ehpb,fordepth(i),dd
+           else   
+          if (dhpb1(i).gt.0.0d0) then
+            ehpb=ehpb+2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i))
+            fac=forcon(i)*gnmr1prim(dd,dhpb(i),dhpb1(i))/dd
+c            write (iout,*) "alph nmr",
+c     &        dd,2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i))
+          else
+            rdis=dd-dhpb(i)
 C Get the force constant corresponding to this distance.
-        waga=forcon(i)
+            waga=forcon(i)
 C Calculate the contribution to energy.
-        ehpb=ehpb+waga*rdis*rdis
+            ehpb=ehpb+waga*rdis*rdis
+c            write (iout,*) "alpha reg",dd,waga*rdis*rdis
 C
 C Evaluate gradient.
 C
-        fac=waga*rdis/dd
-cd      print *,'i=',i,' ii=',ii,' jj=',jj,' dhpb=',dhpb(i),' dd=',dd,
-cd   &   ' waga=',waga,' fac=',fac
+            fac=waga*rdis/dd
+          endif
+          endif
+
         do j=1,3
           ggg(j)=fac*(c(j,jj)-c(j,ii))
         enddo
@@ -2917,7 +4280,7 @@ C Cartesian gradient in the SC vectors (ghpbx).
         enddo
         endif
       enddo
-      ehpb=0.5D0*ehpb
+      if (constr_dist.ne.11) ehpb=0.5D0*ehpb
       return
       end
 C--------------------------------------------------------------------------
@@ -2931,7 +4294,6 @@ C A. Liwo and U. Kozlowska, 11/24/03
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.SBRIDGE'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
@@ -2940,7 +4302,7 @@ C
       include 'COMMON.VAR'
       include 'COMMON.IOUNITS'
       double precision erij(3),dcosom1(3),dcosom2(3),gg(3)
-      itypi=itype(i)
+      itypi=iabs(itype(i))
       xi=c(1,nres+i)
       yi=c(2,nres+i)
       zi=c(3,nres+i)
@@ -2948,7 +4310,7 @@ C
       dyi=dc_norm(2,nres+i)
       dzi=dc_norm(3,nres+i)
       dsci_inv=dsc_inv(itypi)
-      itypj=itype(j)
+      itypj=iabs(itype(j))
       dscj_inv=dsc_inv(itypj)
       xj=c(1,nres+j)-xi
       yj=c(2,nres+j)-yi
@@ -3012,7 +4374,6 @@ c Evaluate the energy of stretching of the CA-CA and CA-SC virtual bonds
 c
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.LOCAL'
       include 'COMMON.GEO'
       include 'COMMON.INTERACT'
       include 'COMMON.NAMES'
       include 'COMMON.FFIELD'
       include 'COMMON.CONTROL'
-      logical energy_dec /.false./
       double precision u(3),ud(3)
       estr=0.0d0
+      estr1=0.0d0
+c      write (iout,*) "distchainmax",distchainmax
       do i=nnt+1,nct
-        if (itype(i-1).eq.21 .or. itype(i).eq.21) then
-          estr1=estr1+gnmr1(vbld(i),-1.0d0,distchainmax)
-          do j=1,3
-          gradb(j,i-1)=gnmr1prim(vbld(i),-1.0d0,distchainmax)
-     &      *dc(j,i-1)/vbld(i)
-          enddo
-          if (energy_dec) write(iout,*)
-     &       "estr1",i,gnmr1(vbld(i),-1.0d0,distchainmax)
-        else
+        if (itype(i-1).eq.ntyp1 .and. itype(i).eq.ntyp1) cycle
+C          estr1=estr1+gnmr1(vbld(i),-1.0d0,distchainmax)
+C          do j=1,3
+C          gradb(j,i-1)=gnmr1prim(vbld(i),-1.0d0,distchainmax)
+C     &      *dc(j,i-1)/vbld(i)
+C          enddo
+C          if (energy_dec) write(iout,*)
+C     &       "estr1",i,vbld(i),distchainmax,
+C     &       gnmr1(vbld(i),-1.0d0,distchainmax)
+C        else
+         if (itype(i-1).eq.ntyp1 .or. itype(i).eq.ntyp1) then
+        diff = vbld(i)-vbldpDUM
+C         write(iout,*) i,diff
+         else
           diff = vbld(i)-vbldp0
 c          write (iout,*) i,vbld(i),vbldp0,diff,AKP*diff*diff
+         endif
           estr=estr+diff*diff
           do j=1,3
             gradb(j,i-1)=AKP*diff*dc(j,i-1)/vbld(i)
           enddo
-        endif
-
+C        endif
+C        write (iout,'(a7,i5,4f7.3)')
+C     &     "estr bb",i,vbld(i),vbldp0,diff,AKP*diff*diff
       enddo
-      estr=0.5d0*AKP*estr
+      estr=0.5d0*AKP*estr+estr1
 c
 c 09/18/07 AL: multimodal bond potential based on AM1 CA-SC PMF's included
 c
       do i=nnt,nct
-        iti=itype(i)
-        if (iti.ne.10 .and. iti.ne.21) then
+        iti=iabs(itype(i))
+        if (iti.ne.10 .and. iti.ne.ntyp1) then
           nbi=nbondterm(iti)
           if (nbi.eq.1) then
             diff=vbld(i+nres)-vbldsc0(1,iti)
-c            write (iout,*) i,iti,vbld(i+nres),vbldsc0(1,iti),diff,
-c     &      AKSC(1,iti),AKSC(1,iti)*diff*diff
+C            write (iout,*) i,iti,vbld(i+nres),vbldsc0(1,iti),diff,
+C     &      AKSC(1,iti),AKSC(1,iti)*diff*diff
             estr=estr+0.5d0*AKSC(1,iti)*diff*diff
             do j=1,3
               gradbx(j,i)=AKSC(1,iti)*diff*dc(j,i+nres)/vbld(i+nres)
@@ -3098,14 +4467,13 @@ c     &      AKSC(j,iti),abond0(j,iti),u(j),j=1,nbi)
       end
 #ifdef CRYST_THETA
 C--------------------------------------------------------------------------
-      subroutine ebend(etheta)
+      subroutine ebend(etheta,ethetacnstr)
 C
 C Evaluate the virtual-bond-angle energy given the virtual-bond dihedral
 C angles gamma and its derivatives in consecutive thetas and gammas.
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.LOCAL'
       include 'COMMON.GEO'
       include 'COMMON.INTERACT'
       include 'COMMON.IOUNITS'
       include 'COMMON.NAMES'
       include 'COMMON.FFIELD'
+      include 'COMMON.TORCNSTR'
       common /calcthet/ term1,term2,termm,diffak,ratak,
      & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq,
      & delthe0,sig0inv,sigtc,sigsqtc,delthec,it
       double precision y(2),z(2)
       delta=0.02d0*pi
-      time11=dexp(-2*time)
-      time12=1.0d0
+c      time11=dexp(-2*time)
+c      time12=1.0d0
       etheta=0.0D0
 c      write (iout,*) "nres",nres
 c     write (*,'(a,i2)') 'EBEND ICG=',icg
 c      write (iout,*) ithet_start,ithet_end
       do i=ithet_start,ithet_end
-        if (itype(i-1).eq.21) cycle
+C        if (itype(i-1).eq.ntyp1) cycle
+        if (i.le.2) cycle
+        if ((itype(i-1).eq.ntyp1).or.itype(i-2).eq.ntyp1
+     &  .or.itype(i).eq.ntyp1) cycle
 C Zero the energy function and its derivative at 0 or pi.
         call splinthet(theta(i),0.5d0*delta,ss,ssd)
         it=itype(i-1)
-        if (i.gt.3 .and. itype(i-2).ne.21) then
+        ichir1=isign(1,itype(i-2))
+        ichir2=isign(1,itype(i))
+         if (itype(i-2).eq.10) ichir1=isign(1,itype(i-1))
+         if (itype(i).eq.10) ichir2=isign(1,itype(i-1))
+         if (itype(i-1).eq.10) then
+          itype1=isign(10,itype(i-2))
+          ichir11=isign(1,itype(i-2))
+          ichir12=isign(1,itype(i-2))
+          itype2=isign(10,itype(i))
+          ichir21=isign(1,itype(i))
+          ichir22=isign(1,itype(i))
+         endif
+         if (i.eq.3) then
+          y(1)=0.0D0
+          y(2)=0.0D0
+          else
+
+        if (i.gt.3 .and. itype(i-3).ne.ntyp1) then
 #ifdef OSF
           phii=phi(i)
-          icrc=0
-          call proc_proc(phii,icrc)
+c          icrc=0
+c          call proc_proc(phii,icrc)
           if (icrc.eq.1) phii=150.0
 #else
           phii=phi(i)
@@ -3146,11 +4535,12 @@ C Zero the energy function and its derivative at 0 or pi.
           y(1)=0.0D0
           y(2)=0.0D0
         endif
-        if (i.lt.nres .and. itype(i).ne.21) then
+        endif
+        if (i.lt.nres .and. itype(i+1).ne.ntyp1) then
 #ifdef OSF
           phii1=phi(i+1)
-          icrc=0
-          call proc_proc(phii1,icrc)
+c          icrc=0
+c          call proc_proc(phii1,icrc)
           if (icrc.eq.1) phii1=150.0
           phii1=pinorm(phii1)
           z(1)=cos(phii1)
@@ -3168,8 +4558,12 @@ C dependent on the adjacent virtual-bond-valence angles (gamma1 & gamma2).
 C In following comments this theta will be referred to as t_c.
         thet_pred_mean=0.0d0
         do k=1,2
-          athetk=athet(k,it)
-          bthetk=bthet(k,it)
+            athetk=athet(k,it,ichir1,ichir2)
+            bthetk=bthet(k,it,ichir1,ichir2)
+          if (it.eq.10) then
+             athetk=athet(k,itype1,ichir11,ichir12)
+             bthetk=bthet(k,itype2,ichir21,ichir22)
+          endif
           thet_pred_mean=thet_pred_mean+athetk*y(k)+bthetk*z(k)
         enddo
 c        write (iout,*) "thet_pred_mean",thet_pred_mean
@@ -3177,8 +4571,16 @@ c        write (iout,*) "thet_pred_mean",thet_pred_mean
         thet_pred_mean=thet_pred_mean*ss+a0thet(it)
 c        write (iout,*) "thet_pred_mean",thet_pred_mean
 C Derivatives of the "mean" values in gamma1 and gamma2.
-        dthetg1=(-athet(1,it)*y(2)+athet(2,it)*y(1))*ss
-        dthetg2=(-bthet(1,it)*z(2)+bthet(2,it)*z(1))*ss
+        dthetg1=(-athet(1,it,ichir1,ichir2)*y(2)
+     &+athet(2,it,ichir1,ichir2)*y(1))*ss
+         dthetg2=(-bthet(1,it,ichir1,ichir2)*z(2)
+     &          +bthet(2,it,ichir1,ichir2)*z(1))*ss
+         if (it.eq.10) then
+      dthetg1=(-athet(1,itype1,ichir11,ichir12)*y(2)
+     &+athet(2,itype1,ichir11,ichir12)*y(1))*ss
+        dthetg2=(-bthet(1,itype2,ichir21,ichir22)*z(2)
+     &         +bthet(2,itype2,ichir21,ichir22)*z(1))*ss
+         endif
         if (theta(i).gt.pi-delta) then
           call theteng(pi-delta,thet_pred_mean,theta0(it),f0,fprim0,
      &         E_tc0)
@@ -3201,12 +4603,41 @@ C Derivatives of the "mean" values in gamma1 and gamma2.
      &        E_theta,E_tc)
         endif
         etheta=etheta+ethetai
+c         write (iout,'(a6,i5,0pf7.3,f7.3,i5)')
+c     &      'ebend',i,ethetai,theta(i),itype(i)
 c        write (iout,'(2i3,3f8.3,f10.5)') i,it,rad2deg*theta(i),
 c     &    rad2deg*phii,rad2deg*phii1,ethetai
         if (i.gt.3) gloc(i-3,icg)=gloc(i-3,icg)+wang*E_tc*dthetg1
         if (i.lt.nres) gloc(i-2,icg)=gloc(i-2,icg)+wang*E_tc*dthetg2
         gloc(nphi+i-2,icg)=wang*(E_theta+E_tc*dthett)
- 1215   continue
+c 1215   continue
+      enddo
+      ethetacnstr=0.0d0
+C      print *,ithetaconstr_start,ithetaconstr_end,"TU"
+      do i=1,ntheta_constr
+        itheta=itheta_constr(i)
+        thetiii=theta(itheta)
+        difi=pinorm(thetiii-theta_constr0(i))
+        if (difi.gt.theta_drange(i)) then
+          difi=difi-theta_drange(i)
+          ethetacnstr=ethetacnstr+0.25d0*for_thet_constr(i)*difi**4
+          gloc(itheta+nphi-2,icg)=gloc(itheta+nphi-2,icg)
+     &    +for_thet_constr(i)*difi**3
+        else if (difi.lt.-drange(i)) then
+          difi=difi+drange(i)
+          ethetacnstr=ethetacnstr+0.25d0*for_thet_constr(i)*difi**4
+          gloc(itheta+nphi-2,icg)=gloc(itheta+nphi-2,icg)
+     &    +for_thet_constr(i)*difi**3
+        else
+          difi=0.0
+        endif
+C       if (energy_dec) then
+C        write (iout,'(a6,2i5,4f8.3,2e14.5)') "ethetc",
+C     &    i,itheta,rad2deg*thetiii,
+C     &    rad2deg*theta_constr0(i),  rad2deg*theta_drange(i),
+C     &    rad2deg*difi,0.25d0*for_thet_constr(i)*difi**4,
+C     &    gloc(itheta+nphi-2,icg)
+C        endif
       enddo
 C Ufff.... We've done all this!!! 
       return
@@ -3330,7 +4761,6 @@ c Kozlowska et al., J. Phys.: Condens. Matter 19 (2007) 285203
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.LOCAL'
       include 'COMMON.GEO'
       include 'COMMON.INTERACT'
@@ -3341,6 +4771,7 @@ C
       include 'COMMON.NAMES'
       include 'COMMON.FFIELD'
       include 'COMMON.CONTROL'
+      include 'COMMON.TORCNSTR'
       double precision coskt(mmaxtheterm),sinkt(mmaxtheterm),
      & cosph1(maxsingle),sinph1(maxsingle),cosph2(maxsingle),
      & sinph2(maxsingle),cosph1ph2(maxdouble,maxdouble),
       etheta=0.0D0
 c      write (iout,*) "ithetyp",(ithetyp(i),i=1,ntyp1)
       do i=ithet_start,ithet_end
-        if (itype(i-1).eq.21) cycle
+C         if (i.eq.2) cycle
+C        if (itype(i-1).eq.ntyp1) cycle
+        if (i.le.2) cycle
+        if ((itype(i-1).eq.ntyp1).or.itype(i-2).eq.ntyp1
+     &  .or.itype(i).eq.ntyp1) cycle
+        if (iabs(itype(i+1)).eq.20) iblock=2
+        if (iabs(itype(i+1)).ne.20) iblock=1
         dethetai=0.0d0
         dephii=0.0d0
         dephii1=0.0d0
         theti2=0.5d0*theta(i)
-        ityp2=ithetyp(itype(i-1))
+        ityp2=ithetyp((itype(i-1)))
         do k=1,nntheterm
           coskt(k)=dcos(k*theti2)
           sinkt(k)=dsin(k*theti2)
         enddo
-        if (i.gt.3 .and. itype(i-2).ne.21) then
+        if (i.eq.3) then 
+          phii=0.0d0
+          ityp1=nthetyp+1
+          do k=1,nsingle
+            cosph1(k)=0.0d0
+            sinph1(k)=0.0d0
+          enddo
+        else
+        if (i.gt.3 .and. itype(i-3).ne.ntyp1) then
 #ifdef OSF
           phii=phi(i)
           if (phii.ne.phii) phii=150.0
 #else
           phii=phi(i)
 #endif
-          ityp1=ithetyp(itype(i-2))
+          ityp1=ithetyp((itype(i-2)))
           do k=1,nsingle
             cosph1(k)=dcos(k*phii)
             sinph1(k)=dsin(k*phii)
           enddo
         else
           phii=0.0d0
-          ityp1=nthetyp+1
+c          ityp1=nthetyp+1
           do k=1,nsingle
+            ityp1=ithetyp((itype(i-2)))
             cosph1(k)=0.0d0
             sinph1(k)=0.0d0
           enddo 
         endif
-        if (i.lt.nres .and. itype(i).ne.21) then
+        endif
+        if (i.lt.nres .and. itype(i+1).ne.ntyp1) then
 #ifdef OSF
           phii1=phi(i+1)
           if (phii1.ne.phii1) phii1=150.0
@@ -3387,14 +4834,15 @@ c      write (iout,*) "ithetyp",(ithetyp(i),i=1,ntyp1)
 #else
           phii1=phi(i+1)
 #endif
-          ityp3=ithetyp(itype(i))
+          ityp3=ithetyp((itype(i)))
           do k=1,nsingle
             cosph2(k)=dcos(k*phii1)
             sinph2(k)=dsin(k*phii1)
           enddo
         else
           phii1=0.0d0
-          ityp3=nthetyp+1
+c          ityp3=nthetyp+1
+          ityp3=ithetyp((itype(i)))
           do k=1,nsingle
             cosph2(k)=0.0d0
             sinph2(k)=0.0d0
@@ -3403,7 +4851,7 @@ c      write (iout,*) "ithetyp",(ithetyp(i),i=1,ntyp1)
 c        write (iout,*) "i",i," ityp1",itype(i-2),ityp1,
 c     &   " ityp2",itype(i-1),ityp2," ityp3",itype(i),ityp3
 c        call flush(iout)
-        ethetai=aa0thet(ityp1,ityp2,ityp3)
+        ethetai=aa0thet(ityp1,ityp2,ityp3,iblock)
         do k=1,ndouble
           do l=1,k-1
             ccl=cosph1(l)*cosph2(k-l)
@@ -3425,11 +4873,12 @@ c        call flush(iout)
         enddo
         endif
         do k=1,ntheterm
-          ethetai=ethetai+aathet(k,ityp1,ityp2,ityp3)*sinkt(k)
-          dethetai=dethetai+0.5d0*k*aathet(k,ityp1,ityp2,ityp3)
+          ethetai=ethetai+aathet(k,ityp1,ityp2,ityp3,iblock)*sinkt(k)
+          dethetai=dethetai+0.5d0*k*aathet(k,ityp1,ityp2,ityp3,iblock)
      &      *coskt(k)
           if (lprn)
-     &    write (iout,*) "k",k," aathet",aathet(k,ityp1,ityp2,ityp3),
+     &    write (iout,*) "k",k,"
+     &      aathet",aathet(k,ityp1,ityp2,ityp3,iblock),
      &     " ethetai",ethetai
         enddo
         if (lprn) then
@@ -3448,24 +4897,24 @@ c        call flush(iout)
         endif
         do m=1,ntheterm2
           do k=1,nsingle
-            aux=bbthet(k,m,ityp1,ityp2,ityp3)*cosph1(k)
-     &         +ccthet(k,m,ityp1,ityp2,ityp3)*sinph1(k)
-     &         +ddthet(k,m,ityp1,ityp2,ityp3)*cosph2(k)
-     &         +eethet(k,m,ityp1,ityp2,ityp3)*sinph2(k)
+            aux=bbthet(k,m,ityp1,ityp2,ityp3,iblock)*cosph1(k)
+     &         +ccthet(k,m,ityp1,ityp2,ityp3,iblock)*sinph1(k)
+     &         +ddthet(k,m,ityp1,ityp2,ityp3,iblock)*cosph2(k)
+     &         +eethet(k,m,ityp1,ityp2,ityp3,iblock)*sinph2(k)
             ethetai=ethetai+sinkt(m)*aux
             dethetai=dethetai+0.5d0*m*aux*coskt(m)
             dephii=dephii+k*sinkt(m)*(
-     &          ccthet(k,m,ityp1,ityp2,ityp3)*cosph1(k)-
-     &          bbthet(k,m,ityp1,ityp2,ityp3)*sinph1(k))
+     &          ccthet(k,m,ityp1,ityp2,ityp3,iblock)*cosph1(k)-
+     &          bbthet(k,m,ityp1,ityp2,ityp3,iblock)*sinph1(k))
             dephii1=dephii1+k*sinkt(m)*(
-     &          eethet(k,m,ityp1,ityp2,ityp3)*cosph2(k)-
-     &          ddthet(k,m,ityp1,ityp2,ityp3)*sinph2(k))
+     &          eethet(k,m,ityp1,ityp2,ityp3,iblock)*cosph2(k)-
+     &          ddthet(k,m,ityp1,ityp2,ityp3,iblock)*sinph2(k))
             if (lprn)
      &      write (iout,*) "m",m," k",k," bbthet",
-     &         bbthet(k,m,ityp1,ityp2,ityp3)," ccthet",
-     &         ccthet(k,m,ityp1,ityp2,ityp3)," ddthet",
-     &         ddthet(k,m,ityp1,ityp2,ityp3)," eethet",
-     &         eethet(k,m,ityp1,ityp2,ityp3)," ethetai",ethetai
+     &         bbthet(k,m,ityp1,ityp2,ityp3,iblock)," ccthet",
+     &         ccthet(k,m,ityp1,ityp2,ityp3,iblock)," ddthet",
+     &         ddthet(k,m,ityp1,ityp2,ityp3,iblock)," eethet",
+     &         eethet(k,m,ityp1,ityp2,ityp3,iblock)," ethetai",ethetai
           enddo
         enddo
         if (lprn)
@@ -3473,28 +4922,29 @@ c        call flush(iout)
         do m=1,ntheterm3
           do k=2,ndouble
             do l=1,k-1
-              aux=ffthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)+
-     &            ffthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)+
-     &            ggthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)+
-     &            ggthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)
+              aux=ffthet(l,k,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(l,k)+
+     &            ffthet(k,l,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(k,l)+
+     &            ggthet(l,k,m,ityp1,ityp2,ityp3,iblock)*sinph1ph2(l,k)+
+     &            ggthet(k,l,m,ityp1,ityp2,ityp3,iblock)*sinph1ph2(k,l)
               ethetai=ethetai+sinkt(m)*aux
               dethetai=dethetai+0.5d0*m*coskt(m)*aux
               dephii=dephii+l*sinkt(m)*(
-     &           -ffthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)-
-     &            ffthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)+
-     &            ggthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)+
-     &            ggthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l))
+     &           -ffthet(l,k,m,ityp1,ityp2,ityp3,iblock)*sinph1ph2(l,k)-
+     &            ffthet(k,l,m,ityp1,ityp2,ityp3,iblock)*sinph1ph2(k,l)+
+     &            ggthet(l,k,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(l,k)+
+     &            ggthet(k,l,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(k,l))
               dephii1=dephii1+(k-l)*sinkt(m)*(
-     &           -ffthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)+
-     &            ffthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)+
-     &            ggthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)-
-     &            ggthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l))
+     &           -ffthet(l,k,m,ityp1,ityp2,ityp3,iblock)*sinph1ph2(l,k)+
+     &            ffthet(k,l,m,ityp1,ityp2,ityp3,iblock)*sinph1ph2(k,l)+
+     &            ggthet(l,k,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(l,k)-
+     &            ggthet(k,l,m,ityp1,ityp2,ityp3,iblock)*cosph1ph2(k,l))
               if (lprn) then
               write (iout,*) "m",m," k",k," l",l," ffthet",
-     &            ffthet(l,k,m,ityp1,ityp2,ityp3),
-     &            ffthet(k,l,m,ityp1,ityp2,ityp3)," ggthet",
-     &            ggthet(l,k,m,ityp1,ityp2,ityp3),
-     &            ggthet(k,l,m,ityp1,ityp2,ityp3)," ethetai",ethetai
+     &            ffthet(l,k,m,ityp1,ityp2,ityp3,iblock),
+     &            ffthet(k,l,m,ityp1,ityp2,ityp3,iblock)," ggthet",
+     &            ggthet(l,k,m,ityp1,ityp2,ityp3,iblock),
+     &            ggthet(k,l,m,ityp1,ityp2,ityp3,iblock),
+     &            " ethetai",ethetai
               write (iout,*) cosph1ph2(l,k)*sinkt(m),
      &            cosph1ph2(k,l)*sinkt(m),
      &            sinph1ph2(l,k)*sinkt(m),sinph1ph2(k,l)*sinkt(m)
@@ -3509,7 +4959,8 @@ c        call flush(iout)
         etheta=etheta+ethetai
         if (i.gt.3) gloc(i-3,icg)=gloc(i-3,icg)+wang*dephii
         if (i.lt.nres) gloc(i-2,icg)=gloc(i-2,icg)+wang*dephii1
-        gloc(nphi+i-2,icg)=wang*dethetai
+c        gloc(nphi+i-2,icg)=wang*dethetai
+        gloc(nphi+i-2,icg)=gloc(nphi+i-2,icg)+wang*dethetai
       enddo
       return
       end
@@ -3522,7 +4973,6 @@ C corresponding virtual-bond valence angles THETA and the spherical angles
 C ALPHA and OMEGA.
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.GEO'
       include 'COMMON.LOCAL'
       include 'COMMON.VAR'
@@ -3537,14 +4987,14 @@ C ALPHA and OMEGA.
       common /sccalc/ time11,time12,time112,theti,it,nlobit
       delta=0.02d0*pi
       escloc=0.0D0
-c     write (iout,'(a)') 'ESC'
+C      write (iout,*) 'ESC'
       do i=loc_start,loc_end
         it=itype(i)
-        if (it.eq.21) cycle
+        if (it.eq.ntyp1) cycle
         if (it.eq.10) goto 1
-        nlobit=nlob(it)
+        nlobit=nlob(iabs(it))
 c       print *,'i=',i,' it=',it,' nlobit=',nlobit
-c       write (iout,*) 'i=',i,' ssa=',ssa,' ssad=',ssad
+C        write (iout,*) 'i=',i,' ssa=',ssa,' ssad=',ssad
         theti=theta(i+1)-pipol
         x(1)=dtan(theti)
         x(2)=alph(i)
@@ -3580,8 +5030,8 @@ c        write (iout,*) "i",i," x",x(1),x(2),x(3)
             dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k)
           enddo
           dersc(2)=dersc(2)+ssd*(escloci-esclocbi)
-c         write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci,
-c    &             esclocbi,ss,ssd
+          write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci,
+     &             esclocbi,ss,ssd
           escloci=ss*escloci+(1.0d0-ss)*esclocbi
 c         escloci=esclocbi
 c         write (iout,*) escloci
@@ -3615,15 +5065,17 @@ c         write (iout,*) escloci
           enddo
           dersc(2)=dersc(2)+ssd*(escloci-esclocbi)
 c         write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci,
-c    &             esclocbi,ss,ssd
+c     &             esclocbi,ss,ssd
           escloci=ss*escloci+(1.0d0-ss)*esclocbi
-c         write (iout,*) escloci
+C         write (iout,*) 'i=',i, escloci
         else
           call enesc(x,escloci,dersc,ddummy,.false.)
         endif
 
         escloc=escloc+escloci
-c        write (iout,*) 'i=',i,' escloci=',escloci,' dersc=',dersc
+C        write (iout,*) 'i=',i,' escloci=',escloci,' dersc=',dersc
+            write (iout,'(a6,i5,0pf7.3)')
+     &     'escloc',i,escloci
 
         gloc(nphi+i-1,icg)=gloc(nphi+i-1,icg)+
      &   wscloc*dersc(1)
@@ -3697,7 +5149,7 @@ C Compute the contribution to SC energy and derivatives
         do iii=-1,1
 
           do j=1,nlobit
-            expfac=dexp(bsc(j,it)-0.5D0*contr(j,iii)+emin)
+            expfac=dexp(bsc(j,iabs(it))-0.5D0*contr(j,iii)+emin)
 cd          print *,'j=',j,' expfac=',expfac
             escloc_i=escloc_i+expfac
             do k=1,3
@@ -3778,7 +5230,7 @@ C Compute the contribution to SC energy and derivatives
 
       dersc12=0.0d0
       do j=1,nlobit
-        expfac=dexp(bsc(j,it)-0.5D0*contr(j)+emin)
+        expfac=dexp(bsc(j,iabs(it))-0.5D0*contr(j)+emin)
         escloc_i=escloc_i+expfac
         do k=1,2
           dersc(k)=dersc(k)+Ax(k,j)*expfac
@@ -3807,7 +5259,6 @@ C added by Urszula Kozlowska. 07/11/2007
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.GEO'
       include 'COMMON.LOCAL'
       include 'COMMON.VAR'
@@ -3833,7 +5284,7 @@ C
       delta=0.02d0*pi
       escloc=0.0D0
       do i=loc_start,loc_end
-        if (itype(i).eq.21) cycle
+        if (itype(i).eq.ntyp1) 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)))
@@ -3842,7 +5293,7 @@ C
         cosfac=dsqrt(cosfac2)
         sinfac2=0.5d0/(1.0d0-costtab(i+1))
         sinfac=dsqrt(sinfac2)
-        it=itype(i)
+        it=iabs(itype(i))
         if (it.eq.10) goto 1
 c
 C  Compute the axes of tghe local cartesian coordinates system; store in
@@ -3860,7 +5311,7 @@ C     &   dc_norm(3,i+nres)
           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)
+          z_prime(j) = -uz(j,i-1)*dsign(1.0d0,dfloat(itype(i)))
         enddo     
 c       write (2,*) "i",i
 c       write (2,*) "x_prime",(x_prime(j),j=1,3)
@@ -3892,7 +5343,7 @@ C
 C Compute the energy of the ith side cbain
 C
 c        write (2,*) "xx",xx," yy",yy," zz",zz
-        it=itype(i)
+        it=iabs(itype(i))
         do j = 1,65
           x(j) = sc_parmin(j,it) 
         enddo
@@ -3900,7 +5351,7 @@ c        write (2,*) "xx",xx," yy",yy," zz",zz
 Cc diagnostics - remove later
         xx1 = dcos(alph(2))
         yy1 = dsin(alph(2))*dcos(omeg(2))
-        zz1 = -dsin(alph(2))*dsin(omeg(2))
+        zz1 = -dsign(1.0d0,itype(i))*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
@@ -3943,6 +5394,8 @@ c     &   dscp1,dscp2,sumene
 c        sumene = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1))
         escloc = escloc + sumene
 c        write (2,*) "escloc",escloc
+c        write (2,*) "i",i," escloc",sumene,escloc,it,itype(i),
+c     &  zz,xx,yy
         if (.not. calc_grad) goto 1
 #ifdef DEBUG
 C
@@ -4071,8 +5524,10 @@ c     &   (dC_norm(j,i-1),j=1,3)," vbld_inv",vbld_inv(i+1),vbld_inv(i)
          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)
+           dZZ_Ci(k)=dZZ_Ci(k)-uzgrad(j,k,2,i-1)
+     & *dsign(1.0d0,dfloat(itype(i)))*dC_norm(j,i+nres)
+           dZZ_Ci1(k)=dZZ_Ci1(k)-uzgrad(j,k,1,i-1)
+     &  *dsign(1.0d0,dfloat(itype(i)))*dC_norm(j,i+nres)
          enddo
           
          dXX_XYZ(k)=vbld_inv(i+nres)*(x_prime(k)-xx*dC_norm(k,i+nres))
@@ -4158,7 +5613,6 @@ c------------------------------------------------------------------------------
       subroutine splinthet(theti,delta,ss,ssder)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.VAR'
       include 'COMMON.GEO'
       thetup=pi-delta
@@ -4203,10 +5657,9 @@ c------------------------------------------------------------------------------
 C-----------------------------------------------------------------------------
 #ifdef CRYST_TOR
 C-----------------------------------------------------------------------------
-      subroutine etor(etors,edihcnstr,fact)
+      subroutine etor(etors,fact)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.VAR'
       include 'COMMON.GEO'
       include 'COMMON.LOCAL'
@@ -4224,8 +5677,8 @@ C Set lprn=.true. for debugging
 c      lprn=.true.
       etors=0.0D0
       do i=iphi_start,iphi_end
-        if (itype(i-2).eq.21 .or. itype(i-1).eq.21
-     &      .or. itype(i).eq.21) cycle
+        if (itype(i-2).eq.ntyp1 .or. itype(i-1).eq.ntyp1
+     &      .or. itype(i).eq.ntyp1) cycle
        itori=itortyp(itype(i-2))
        itori1=itortyp(itype(i-1))
         phii=phi(i)
@@ -4265,33 +5718,13 @@ C Proline-Proline pair is a special case...
         gloc(i-3,icg)=gloc(i-3,icg)+wtor*fact*gloci
 c       write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg)
       enddo
-! 6/20/98 - dihedral angle constraints
-      edihcnstr=0.0d0
-      do i=1,ndih_constr
-        itori=idih_constr(i)
-        phii=phi(itori)
-        difi=phii-phi0(i)
-        if (difi.gt.drange(i)) then
-          difi=difi-drange(i)
-          edihcnstr=edihcnstr+0.25d0*ftors*difi**4
-          gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3
-        else if (difi.lt.-drange(i)) then
-          difi=difi+drange(i)
-          edihcnstr=edihcnstr+0.25d0*ftors*difi**4
-          gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3
-        endif
-!        write (iout,'(2i5,2f8.3,2e14.5)') i,itori,rad2deg*phii,
-!     &    rad2deg*difi,0.25d0*ftors*difi**4,gloc(itori-3,icg)
-      enddo
-!      write (iout,*) 'edihcnstr',edihcnstr
       return
       end
 c------------------------------------------------------------------------------
 #else
-      subroutine etor(etors,edihcnstr,fact)
+      subroutine etor(etors,fact)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.VAR'
       include 'COMMON.GEO'
       include 'COMMON.LOCAL'
@@ -4309,17 +5742,25 @@ C Set lprn=.true. for debugging
 c      lprn=.true.
       etors=0.0D0
       do i=iphi_start,iphi_end
-        if (itype(i-2).eq.21 .or. itype(i-1).eq.21
-     &       .or. itype(i).eq.21) cycle
+        if (i.le.2) cycle
+        if (itype(i-2).eq.ntyp1.or. itype(i-1).eq.ntyp1
+     &      .or. itype(i).eq.ntyp1 .or. itype(i-3).eq.ntyp1) cycle
+C        if (itype(i-2).eq.ntyp1 .or. itype(i-1).eq.ntyp1
+C     &       .or. itype(i).eq.ntyp1) cycle
         if (itel(i-2).eq.0 .or. itel(i-1).eq.0) goto 1215
+         if (iabs(itype(i)).eq.20) then
+         iblock=2
+         else
+         iblock=1
+         endif
         itori=itortyp(itype(i-2))
         itori1=itortyp(itype(i-1))
         phii=phi(i)
         gloci=0.0D0
 C Regular cosine and sine terms
-        do j=1,nterm(itori,itori1)
-          v1ij=v1(j,itori,itori1)
-          v2ij=v2(j,itori,itori1)
+        do j=1,nterm(itori,itori1,iblock)
+          v1ij=v1(j,itori,itori1,iblock)
+          v2ij=v2(j,itori,itori1,iblock)
           cosphi=dcos(j*phii)
           sinphi=dsin(j*phii)
           etors=etors+v1ij*cosphi+v2ij*sinphi
@@ -4332,52 +5773,28 @@ C          [v2 cos(phi/2)+v3 sin(phi/2)]^2 + 1
 C
         cosphi=dcos(0.5d0*phii)
         sinphi=dsin(0.5d0*phii)
-        do j=1,nlor(itori,itori1)
+        do j=1,nlor(itori,itori1,iblock)
           vl1ij=vlor1(j,itori,itori1)
           vl2ij=vlor2(j,itori,itori1)
           vl3ij=vlor3(j,itori,itori1)
           pom=vl2ij*cosphi+vl3ij*sinphi
           pom1=1.0d0/(pom*pom+1.0d0)
           etors=etors+vl1ij*pom1
+c          if (energy_dec) etors_ii=etors_ii+
+c     &                vl1ij*pom1
           pom=-pom*pom1*pom1
           gloci=gloci+vl1ij*(vl3ij*cosphi-vl2ij*sinphi)*pom
         enddo
 C Subtract the constant term
-        etors=etors-v0(itori,itori1)
+        etors=etors-v0(itori,itori1,iblock)
         if (lprn)
      &  write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)')
      &  restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1,
-     &  (v1(j,itori,itori1),j=1,6),(v2(j,itori,itori1),j=1,6)
+     &  (v1(j,itori,itori1,1),j=1,6),(v2(j,itori,itori1,1),j=1,6)
         gloc(i-3,icg)=gloc(i-3,icg)+wtor*fact*gloci
 c       write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg)
  1215   continue
       enddo
-! 6/20/98 - dihedral angle constraints
-      edihcnstr=0.0d0
-      do i=1,ndih_constr
-        itori=idih_constr(i)
-        phii=phi(itori)
-        difi=pinorm(phii-phi0(i))
-        edihi=0.0d0
-        if (difi.gt.drange(i)) then
-          difi=difi-drange(i)
-          edihcnstr=edihcnstr+0.25d0*ftors*difi**4
-          gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3
-          edihi=0.25d0*ftors*difi**4
-        else if (difi.lt.-drange(i)) then
-          difi=difi+drange(i)
-          edihcnstr=edihcnstr+0.25d0*ftors*difi**4
-          gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3
-          edihi=0.25d0*ftors*difi**4
-        else
-          difi=0.0d0
-        endif
-c        write (iout,'(2i5,4f10.5,e15.5)') i,itori,phii,phi0(i),difi,
-c     &    drange(i),edihi
-!        write (iout,'(2i5,2f8.3,2e14.5)') i,itori,rad2deg*phii,
-!     &    rad2deg*difi,0.25d0*ftors*difi**4,gloc(itori-3,icg)
-      enddo
-!      write (iout,*) 'edihcnstr',edihcnstr
       return
       end
 c----------------------------------------------------------------------------
@@ -4385,7 +5802,6 @@ c----------------------------------------------------------------------------
 C 6/23/01 Compute double torsional energy
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.VAR'
       include 'COMMON.GEO'
       include 'COMMON.LOCAL'
@@ -4403,8 +5819,12 @@ C Set lprn=.true. for debugging
 c     lprn=.true.
       etors_d=0.0D0
       do i=iphi_start,iphi_end-1
-        if (itype(i-2).eq.21 .or. itype(i-1).eq.21
-     &      .or. itype(i).eq.21 .or. itype(i+1).eq.21) cycle
+        if (i.le.3) cycle
+C        if (itype(i-2).eq.ntyp1.or. itype(i-1).eq.ntyp1
+C     &      .or. itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1) cycle
+         if ((itype(i-2).eq.ntyp1).or.itype(i-3).eq.ntyp1.or.
+     &  (itype(i-1).eq.ntyp1).or.(itype(i).eq.ntyp1).or.
+     &  (itype(i+1).eq.ntyp1)) cycle
         if (itel(i-2).eq.0 .or. itel(i-1).eq.0 .or. itel(i).eq.0) 
      &     goto 1215
         itori=itortyp(itype(i-2))
@@ -4414,12 +5834,14 @@ c     lprn=.true.
         phii1=phi(i+1)
         gloci1=0.0D0
         gloci2=0.0D0
+        iblock=1
+        if (iabs(itype(i+1)).eq.20) iblock=2
 C Regular cosine and sine terms
-        do j=1,ntermd_1(itori,itori1,itori2)
-          v1cij=v1c(1,j,itori,itori1,itori2)
-          v1sij=v1s(1,j,itori,itori1,itori2)
-          v2cij=v1c(2,j,itori,itori1,itori2)
-          v2sij=v1s(2,j,itori,itori1,itori2)
+        do j=1,ntermd_1(itori,itori1,itori2,iblock)
+          v1cij=v1c(1,j,itori,itori1,itori2,iblock)
+          v1sij=v1s(1,j,itori,itori1,itori2,iblock)
+          v2cij=v1c(2,j,itori,itori1,itori2,iblock)
+          v2sij=v1s(2,j,itori,itori1,itori2,iblock)
           cosphi1=dcos(j*phii)
           sinphi1=dsin(j*phii)
           cosphi2=dcos(j*phii1)
@@ -4429,12 +5851,12 @@ C Regular cosine and sine terms
           gloci1=gloci1+j*(v1sij*cosphi1-v1cij*sinphi1)
           gloci2=gloci2+j*(v2sij*cosphi2-v2cij*sinphi2)
         enddo
-        do k=2,ntermd_2(itori,itori1,itori2)
+        do k=2,ntermd_2(itori,itori1,itori2,iblock)
           do l=1,k-1
-            v1cdij = v2c(k,l,itori,itori1,itori2)
-            v2cdij = v2c(l,k,itori,itori1,itori2)
-            v1sdij = v2s(k,l,itori,itori1,itori2)
-            v2sdij = v2s(l,k,itori,itori1,itori2)
+            v1cdij = v2c(k,l,itori,itori1,itori2,iblock)
+            v2cdij = v2c(l,k,itori,itori1,itori2,iblock)
+            v1sdij = v2s(k,l,itori,itori1,itori2,iblock)
+            v2sdij = v2s(l,k,itori,itori1,itori2,iblock)
             cosphi1p2=dcos(l*phii+(k-l)*phii1)
             cosphi1m2=dcos(l*phii-(k-l)*phii1)
             sinphi1p2=dsin(l*phii+(k-l)*phii1)
@@ -4444,7 +5866,7 @@ C Regular cosine and sine terms
             gloci1=gloci1+l*(v1sdij*cosphi1p2+v2sdij*cosphi1m2
      &        -v1cdij*sinphi1p2-v2cdij*sinphi1m2)
             gloci2=gloci2+(k-l)*(v1sdij*cosphi1p2-v2sdij*cosphi1m2
-     &        -v1cdij*sinphi1p2+v2cdij*sinphi1m2) 
+     &        -v1cdij*sinphi1p2+v2cdij*sinphi1m2)
           enddo
         enddo
         gloc(i-3,icg)=gloc(i-3,icg)+wtor_d*fact2*gloci1
@@ -4454,6 +5876,286 @@ C Regular cosine and sine terms
       return
       end
 #endif
+c---------------------------------------------------------------------------
+C The rigorous attempt to derive energy function
+      subroutine etor_kcc(etors,fact)
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.VAR'
+      include 'COMMON.GEO'
+      include 'COMMON.LOCAL'
+      include 'COMMON.TORSION'
+      include 'COMMON.INTERACT'
+      include 'COMMON.DERIV'
+      include 'COMMON.CHAIN'
+      include 'COMMON.NAMES'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.FFIELD'
+      include 'COMMON.TORCNSTR'
+      include 'COMMON.CONTROL'
+      double precision c1(0:maxval_kcc),c2(0:maxval_kcc)
+      logical lprn
+c      double precision thybt1(maxtermkcc),thybt2(maxtermkcc)
+C Set lprn=.true. for debugging
+      lprn=energy_dec
+c     lprn=.true.
+C      print *,"wchodze kcc"
+      if (lprn) write (iout,*) "etor_kcc tor_mode",tor_mode
+      etors=0.0D0
+      do i=iphi_start,iphi_end
+C ANY TWO ARE DUMMY ATOMS in row CYCLE
+c        if (((itype(i-3).eq.ntyp1).and.(itype(i-2).eq.ntyp1)).or.
+c     &      ((itype(i-2).eq.ntyp1).and.(itype(i-1).eq.ntyp1))  .or.
+c     &      ((itype(i-1).eq.ntyp1).and.(itype(i).eq.ntyp1))) cycle
+        if (itype(i-2).eq.ntyp1.or. itype(i-1).eq.ntyp1
+     &      .or. itype(i).eq.ntyp1 .or. itype(i-3).eq.ntyp1) cycle
+        itori=itortyp(itype(i-2))
+        itori1=itortyp(itype(i-1))
+        phii=phi(i)
+        glocig=0.0D0
+        glocit1=0.0d0
+        glocit2=0.0d0
+C to avoid multiple devision by 2
+c        theti22=0.5d0*theta(i)
+C theta 12 is the theta_1 /2
+C theta 22 is theta_2 /2
+c        theti12=0.5d0*theta(i-1)
+C and appropriate sinus function
+        sinthet1=dsin(theta(i-1))
+        sinthet2=dsin(theta(i))
+        costhet1=dcos(theta(i-1))
+        costhet2=dcos(theta(i))
+C to speed up lets store its mutliplication
+        sint1t2=sinthet2*sinthet1        
+        sint1t2n=1.0d0
+C \sum_{i=1}^n (sin(theta_1) * sin(theta_2))^n * (c_n* cos(n*gamma)
+C +d_n*sin(n*gamma)) *
+C \sum_{i=1}^m (1+a_m*Tb_m(cos(theta_1 /2))+b_m*Tb_m(cos(theta_2 /2))) 
+C we have two sum 1) Non-Chebyshev which is with n and gamma
+        nval=nterm_kcc_Tb(itori,itori1)
+        c1(0)=0.0d0
+        c2(0)=0.0d0
+        c1(1)=1.0d0
+        c2(1)=1.0d0
+        do j=2,nval
+          c1(j)=c1(j-1)*costhet1
+          c2(j)=c2(j-1)*costhet2
+        enddo
+        etori=0.0d0
+        do j=1,nterm_kcc(itori,itori1)
+          cosphi=dcos(j*phii)
+          sinphi=dsin(j*phii)
+          sint1t2n1=sint1t2n
+          sint1t2n=sint1t2n*sint1t2
+          sumvalc=0.0d0
+          gradvalct1=0.0d0
+          gradvalct2=0.0d0
+          do k=1,nval
+            do l=1,nval
+              sumvalc=sumvalc+v1_kcc(l,k,j,itori1,itori)*c1(k)*c2(l)
+              gradvalct1=gradvalct1+
+     &           (k-1)*v1_kcc(l,k,j,itori1,itori)*c1(k-1)*c2(l)
+              gradvalct2=gradvalct2+
+     &           (l-1)*v1_kcc(l,k,j,itori1,itori)*c1(k)*c2(l-1)
+            enddo
+          enddo
+          gradvalct1=-gradvalct1*sinthet1
+          gradvalct2=-gradvalct2*sinthet2
+          sumvals=0.0d0
+          gradvalst1=0.0d0
+          gradvalst2=0.0d0 
+          do k=1,nval
+            do l=1,nval
+              sumvals=sumvals+v2_kcc(l,k,j,itori1,itori)*c1(k)*c2(l)
+              gradvalst1=gradvalst1+
+     &           (k-1)*v2_kcc(l,k,j,itori1,itori)*c1(k-1)*c2(l)
+              gradvalst2=gradvalst2+
+     &           (l-1)*v2_kcc(l,k,j,itori1,itori)*c1(k)*c2(l-1)
+            enddo
+          enddo
+          gradvalst1=-gradvalst1*sinthet1
+          gradvalst2=-gradvalst2*sinthet2
+          etori=etori+sint1t2n*(sumvalc*cosphi+sumvals*sinphi)
+C glocig is the gradient local i site in gamma
+          glocig=glocig+j*sint1t2n*(sumvals*cosphi-sumvalc*sinphi)
+C now gradient over theta_1
+          glocit1=glocit1+sint1t2n*(gradvalct1*cosphi+gradvalst1*sinphi)
+     &   +j*sint1t2n1*costhet1*sinthet2*(sumvalc*cosphi+sumvals*sinphi)
+          glocit2=glocit2+sint1t2n*(gradvalct2*cosphi+gradvalst2*sinphi)
+     &   +j*sint1t2n1*sinthet1*costhet2*(sumvalc*cosphi+sumvals*sinphi)
+        enddo ! j
+        etors=etors+etori
+C derivative over gamma
+        gloc(i-3,icg)=gloc(i-3,icg)+wtor*glocig
+C derivative over theta1
+        gloc(nphi+i-3,icg)=gloc(nphi+i-3,icg)+wtor*glocit1
+C now derivative over theta2
+        gloc(nphi+i-2,icg)=gloc(nphi+i-2,icg)+wtor*glocit2
+        if (lprn) 
+     &    write (iout,*) i-2,i-1,itype(i-2),itype(i-1),itori,itori1,
+     &       theta(i-1)*rad2deg,theta(i)*rad2deg,phii*rad2deg,etori
+      enddo
+      return
+      end
+c---------------------------------------------------------------------------------------------
+      subroutine etor_constr(edihcnstr)
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.VAR'
+      include 'COMMON.GEO'
+      include 'COMMON.LOCAL'
+      include 'COMMON.TORSION'
+      include 'COMMON.INTERACT'
+      include 'COMMON.DERIV'
+      include 'COMMON.CHAIN'
+      include 'COMMON.NAMES'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.FFIELD'
+      include 'COMMON.TORCNSTR'
+      include 'COMMON.CONTROL'
+! 6/20/98 - dihedral angle constraints
+      edihcnstr=0.0d0
+c      do i=1,ndih_constr
+c      write (iout,*) "idihconstr_start",idihconstr_start,
+c     &  " idihconstr_end",idihconstr_end
+      if (raw_psipred) then
+        do i=idihconstr_start,idihconstr_end
+          itori=idih_constr(i)
+          phii=phi(itori)
+          gaudih_i=vpsipred(1,i)
+          gauder_i=0.0d0
+          do j=1,2
+            s = sdihed(j,i)
+            cos_i=(1.0d0-dcos(phii-phibound(j,i)))/s**2
+            dexpcos_i=dexp(-cos_i*cos_i)
+            gaudih_i=gaudih_i+vpsipred(j+1,i)*dexpcos_i
+            gauder_i=gauder_i-2*vpsipred(j+1,i)*dsin(phii-phibound(j,i))
+     &            *cos_i*dexpcos_i/s**2
+          enddo
+          edihcnstr=edihcnstr-wdihc*dlog(gaudih_i)
+          gloc(itori-3,icg)=gloc(itori-3,icg)-wdihc*gauder_i/gaudih_i
+          if (energy_dec)
+     &     write (iout,'(2i5,f8.3,f8.5,2(f8.5,2f8.3),f10.5)')
+     &     i,itori,phii*rad2deg,vpsipred(1,i),vpsipred(2,i),
+     &     phibound(1,i)*rad2deg,sdihed(1,i)*rad2deg,vpsipred(3,i),
+     &     phibound(2,i)*rad2deg,sdihed(2,i)*rad2deg,
+     &     -wdihc*dlog(gaudih_i)
+        enddo
+      else
+        do i=idihconstr_start,idihconstr_end
+          itori=idih_constr(i)
+          phii=phi(itori)
+          difi=pinorm(phii-phi0(i))
+          if (difi.gt.drange(i)) then
+            difi=difi-drange(i)
+            edihcnstr=edihcnstr+0.25d0*ftors(i)*difi**4
+            gloc(itori-3,icg)=gloc(itori-3,icg)+ftors(i)*difi**3
+          else if (difi.lt.-drange(i)) then
+            difi=difi+drange(i)
+            edihcnstr=edihcnstr+0.25d0*ftors(i)*difi**4
+            gloc(itori-3,icg)=gloc(itori-3,icg)+ftors(i)*difi**3
+          else
+            difi=0.0
+          endif
+        enddo
+      endif
+      return
+      end
+c----------------------------------------------------------------------------
+C The rigorous attempt to derive energy function
+      subroutine ebend_kcc(etheta)
+
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.VAR'
+      include 'COMMON.GEO'
+      include 'COMMON.LOCAL'
+      include 'COMMON.TORSION'
+      include 'COMMON.INTERACT'
+      include 'COMMON.DERIV'
+      include 'COMMON.CHAIN'
+      include 'COMMON.NAMES'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.FFIELD'
+      include 'COMMON.TORCNSTR'
+      include 'COMMON.CONTROL'
+      logical lprn
+      double precision thybt1(maxang_kcc)
+C Set lprn=.true. for debugging
+      lprn=energy_dec
+c     lprn=.true.
+C      print *,"wchodze kcc"
+      if (lprn) write (iout,*) "ebend_kcc tor_mode",tor_mode
+      etheta=0.0D0
+      do i=ithet_start,ithet_end
+c        print *,i,itype(i-1),itype(i),itype(i-2)
+        if ((itype(i-1).eq.ntyp1).or.itype(i-2).eq.ntyp1
+     &  .or.itype(i).eq.ntyp1) cycle
+        iti=iabs(itortyp(itype(i-1)))
+        sinthet=dsin(theta(i))
+        costhet=dcos(theta(i))
+        do j=1,nbend_kcc_Tb(iti)
+          thybt1(j)=v1bend_chyb(j,iti)
+        enddo
+        sumth1thyb=v1bend_chyb(0,iti)+
+     &    tschebyshev(1,nbend_kcc_Tb(iti),thybt1(1),costhet)
+        if (lprn) write (iout,*) i-1,itype(i-1),iti,theta(i)*rad2deg,
+     &    sumth1thyb
+        ihelp=nbend_kcc_Tb(iti)-1
+        gradthybt1=gradtschebyshev(0,ihelp,thybt1(1),costhet)
+        etheta=etheta+sumth1thyb
+C        print *,sumth1thyb,gradthybt1,sinthet*(-0.5d0)
+        gloc(nphi+i-2,icg)=gloc(nphi+i-2,icg)-wang*gradthybt1*sinthet
+      enddo
+      return
+      end
+c-------------------------------------------------------------------------------------
+      subroutine etheta_constr(ethetacnstr)
+
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.VAR'
+      include 'COMMON.GEO'
+      include 'COMMON.LOCAL'
+      include 'COMMON.TORSION'
+      include 'COMMON.INTERACT'
+      include 'COMMON.DERIV'
+      include 'COMMON.CHAIN'
+      include 'COMMON.NAMES'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.FFIELD'
+      include 'COMMON.TORCNSTR'
+      include 'COMMON.CONTROL'
+      ethetacnstr=0.0d0
+C      print *,ithetaconstr_start,ithetaconstr_end,"TU"
+      do i=ithetaconstr_start,ithetaconstr_end
+        itheta=itheta_constr(i)
+        thetiii=theta(itheta)
+        difi=pinorm(thetiii-theta_constr0(i))
+        if (difi.gt.theta_drange(i)) then
+          difi=difi-theta_drange(i)
+          ethetacnstr=ethetacnstr+0.25d0*for_thet_constr(i)*difi**4
+          gloc(itheta+nphi-2,icg)=gloc(itheta+nphi-2,icg)
+     &    +for_thet_constr(i)*difi**3
+        else if (difi.lt.-drange(i)) then
+          difi=difi+drange(i)
+          ethetacnstr=ethetacnstr+0.25d0*for_thet_constr(i)*difi**4
+          gloc(itheta+nphi-2,icg)=gloc(itheta+nphi-2,icg)
+     &    +for_thet_constr(i)*difi**3
+        else
+          difi=0.0
+        endif
+       if (energy_dec) then
+        write (iout,'(a6,2i5,4f8.3,2e14.5)') "ethetc",
+     &    i,itheta,rad2deg*thetiii,
+     &    rad2deg*theta_constr0(i),  rad2deg*theta_drange(i),
+     &    rad2deg*difi,0.25d0*for_thet_constr(i)*difi**4,
+     &    gloc(itheta+nphi-2,icg)
+        endif
+      enddo
+      return
+      end
+c------------------------------------------------------------------------------
 c------------------------------------------------------------------------------
       subroutine eback_sc_corr(esccor)
 c 7/21/2007 Correlations between the backbone-local and side-chain-local
@@ -4464,7 +6166,6 @@ c        of residues computed from AM1 energy surfaces of terminally-blocked
 c        amino-acid residues.
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.VAR'
       include 'COMMON.GEO'
       include 'COMMON.LOCAL'
@@ -4483,26 +6184,50 @@ C Set lprn=.true. for debugging
 c      lprn=.true.
 c      write (iout,*) "EBACK_SC_COR",iphi_start,iphi_end,nterm_sccor
       esccor=0.0D0
-      do i=iphi_start,iphi_end
-        if (itype(i-2).eq.21 .or. itype(i-1).eq.21) cycle
+      do i=itau_start,itau_end
+        if ((itype(i-2).eq.ntyp1).or.(itype(i-1).eq.ntyp1)) cycle
         esccor_ii=0.0D0
-        itori=itype(i-2)
-        itori1=itype(i-1)
+        isccori=isccortyp(itype(i-2))
+        isccori1=isccortyp(itype(i-1))
         phii=phi(i)
+        do intertyp=1,3 !intertyp
+cc Added 09 May 2012 (Adasko)
+cc  Intertyp means interaction type of backbone mainchain correlation: 
+c   1 = SC...Ca...Ca...Ca
+c   2 = Ca...Ca...Ca...SC
+c   3 = SC...Ca...Ca...SCi
         gloci=0.0D0
-        do j=1,nterm_sccor
-          v1ij=v1sccor(j,itori,itori1)
-          v2ij=v2sccor(j,itori,itori1)
-          cosphi=dcos(j*phii)
-          sinphi=dsin(j*phii)
-          esccor=esccor+v1ij*cosphi+v2ij*sinphi
-          gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi)
-        enddo
+        if (((intertyp.eq.3).and.((itype(i-2).eq.10).or.
+     &      (itype(i-1).eq.10).or.(itype(i-2).eq.ntyp1).or.
+     &      (itype(i-1).eq.ntyp1)))
+     &    .or. ((intertyp.eq.1).and.((itype(i-2).eq.10)
+     &     .or.(itype(i-2).eq.ntyp1).or.(itype(i-1).eq.ntyp1)
+     &     .or.(itype(i).eq.ntyp1)))
+     &    .or.((intertyp.eq.2).and.((itype(i-1).eq.10).or.
+     &      (itype(i-1).eq.ntyp1).or.(itype(i-2).eq.ntyp1).or.
+     &      (itype(i-3).eq.ntyp1)))) cycle
+        if ((intertyp.eq.2).and.(i.eq.4).and.(itype(1).eq.ntyp1)) cycle
+        if ((intertyp.eq.1).and.(i.eq.nres).and.(itype(nres).eq.ntyp1))
+     & cycle
+       do j=1,nterm_sccor(isccori,isccori1)
+          v1ij=v1sccor(j,intertyp,isccori,isccori1)
+          v2ij=v2sccor(j,intertyp,isccori,isccori1)
+          cosphi=dcos(j*tauangle(intertyp,i))
+          sinphi=dsin(j*tauangle(intertyp,i))
+           esccor=esccor+v1ij*cosphi+v2ij*sinphi
+           gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi)
+         enddo
+C      write (iout,*)"EBACK_SC_COR",esccor,i
+c      write (iout,*) "EBACK_SC_COR",i,v1ij*cosphi+v2ij*sinphi,intertyp,
+c     & nterm_sccor(isccori,isccori1),isccori,isccori1
+c        gloc_sc(intertyp,i-3,icg)=gloc_sc(intertyp,i-3,icg)+wsccor*gloci
         if (lprn)
      &  write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)')
      &  restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1,
-     &  (v1sccor(j,itori,itori1),j=1,6),(v2sccor(j,itori,itori1),j=1,6)
-        gsccor_loc(i-3)=gloci
+     &  (v1sccor(j,1,itori,itori1),j=1,6)
+     &  ,(v2sccor(j,1,itori,itori1),j=1,6)
+c        gsccor_loc(i-3)=gloci
+       enddo !intertyp
       enddo
       return
       end
@@ -4604,192 +6329,20 @@ cd   & k,l,(gacont(m,kk,k),m=1,3)
       return
       end
 c------------------------------------------------------------------------------
-#ifdef MPL
-      subroutine pack_buffer(dimen1,dimen2,atom,indx,buffer)
-      implicit real*8 (a-h,o-z)
-      include 'DIMENSIONS' 
-      integer dimen1,dimen2,atom,indx
-      double precision buffer(dimen1,dimen2)
-      double precision zapas 
-      common /contacts_hb/ zapas(3,20,maxres,7),
-     &   facont_hb(20,maxres),ees0p(20,maxres),ees0m(20,maxres),
-     &         num_cont_hb(maxres),jcont_hb(20,maxres)
-      num_kont=num_cont_hb(atom)
-      do i=1,num_kont
-        do k=1,7
-          do j=1,3
-            buffer(i,indx+(k-1)*3+j)=zapas(j,i,atom,k)
-          enddo ! j
-        enddo ! k
-        buffer(i,indx+22)=facont_hb(i,atom)
-        buffer(i,indx+23)=ees0p(i,atom)
-        buffer(i,indx+24)=ees0m(i,atom)
-        buffer(i,indx+25)=dfloat(jcont_hb(i,atom))
-      enddo ! i
-      buffer(1,indx+26)=dfloat(num_kont)
-      return
-      end
-c------------------------------------------------------------------------------
-      subroutine unpack_buffer(dimen1,dimen2,atom,indx,buffer)
-      implicit real*8 (a-h,o-z)
-      include 'DIMENSIONS' 
-      integer dimen1,dimen2,atom,indx
-      double precision buffer(dimen1,dimen2)
-      double precision zapas 
-      common /contacts_hb/ zapas(3,20,maxres,7),
-     &         facont_hb(20,maxres),ees0p(20,maxres),ees0m(20,maxres),
-     &         num_cont_hb(maxres),jcont_hb(20,maxres)
-      num_kont=buffer(1,indx+26)
-      num_kont_old=num_cont_hb(atom)
-      num_cont_hb(atom)=num_kont+num_kont_old
-      do i=1,num_kont
-        ii=i+num_kont_old
-        do k=1,7    
-          do j=1,3
-            zapas(j,ii,atom,k)=buffer(i,indx+(k-1)*3+j)
-          enddo ! j 
-        enddo ! k 
-        facont_hb(ii,atom)=buffer(i,indx+22)
-        ees0p(ii,atom)=buffer(i,indx+23)
-        ees0m(ii,atom)=buffer(i,indx+24)
-        jcont_hb(ii,atom)=buffer(i,indx+25)
-      enddo ! i
-      return
-      end
-c------------------------------------------------------------------------------
-#endif
       subroutine multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1)
 C This subroutine calculates multi-body contributions to hydrogen-bonding 
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
-#ifdef MPL
-      include 'COMMON.INFO'
-#endif
       include 'COMMON.FFIELD'
       include 'COMMON.DERIV'
       include 'COMMON.INTERACT'
       include 'COMMON.CONTACTS'
-#ifdef MPL
-      parameter (max_cont=maxconts)
-      parameter (max_dim=2*(8*3+2))
-      parameter (msglen1=max_cont*max_dim*4)
-      parameter (msglen2=2*msglen1)
-      integer source,CorrelType,CorrelID,Error
-      double precision buffer(max_cont,max_dim)
-#endif
       double precision gx(3),gx1(3)
       logical lprn,ldone
 
 C Set lprn=.true. for debugging
       lprn=.false.
-#ifdef MPL
-      n_corr=0
-      n_corr1=0
-      if (fgProcs.le.1) goto 30
-      if (lprn) then
-        write (iout,'(a)') 'Contact function values:'
-        do i=nnt,nct-2
-          write (iout,'(2i3,50(1x,i2,f5.2))') 
-     &    i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i),
-     &    j=1,num_cont_hb(i))
-        enddo
-      endif
-C Caution! Following code assumes that electrostatic interactions concerning
-C a given atom are split among at most two processors!
-      CorrelType=477
-      CorrelID=MyID+1
-      ldone=.false.
-      do i=1,max_cont
-        do j=1,max_dim
-          buffer(i,j)=0.0D0
-        enddo
-      enddo
-      mm=mod(MyRank,2)
-cd    write (iout,*) 'MyRank',MyRank,' mm',mm
-      if (mm) 20,20,10 
-   10 continue
-cd    write (iout,*) 'Sending: MyRank',MyRank,' mm',mm,' ldone',ldone
-      if (MyRank.gt.0) then
-C Send correlation contributions to the preceding processor
-        msglen=msglen1
-        nn=num_cont_hb(iatel_s)
-        call pack_buffer(max_cont,max_dim,iatel_s,0,buffer)
-cd      write (iout,*) 'The BUFFER array:'
-cd      do i=1,nn
-cd        write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,26)
-cd      enddo
-        if (ielstart(iatel_s).gt.iatel_s+ispp) then
-          msglen=msglen2
-            call pack_buffer(max_cont,max_dim,iatel_s+1,26,buffer)
-C Clear the contacts of the atom passed to the neighboring processor
-        nn=num_cont_hb(iatel_s+1)
-cd      do i=1,nn
-cd        write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j+26),j=1,26)
-cd      enddo
-            num_cont_hb(iatel_s)=0
-        endif 
-cd      write (iout,*) 'Processor ',MyID,MyRank,
-cd   & ' is sending correlation contribution to processor',MyID-1,
-cd   & ' msglen=',msglen
-cd      write (*,*) 'Processor ',MyID,MyRank,
-cd   & ' is sending correlation contribution to processor',MyID-1,
-cd   & ' msglen=',msglen,' CorrelType=',CorrelType
-        call mp_bsend(buffer,msglen,MyID-1,CorrelType,CorrelID)
-cd      write (iout,*) 'Processor ',MyID,
-cd   & ' has sent correlation contribution to processor',MyID-1,
-cd   & ' msglen=',msglen,' CorrelID=',CorrelID
-cd      write (*,*) 'Processor ',MyID,
-cd   & ' has sent correlation contribution to processor',MyID-1,
-cd   & ' msglen=',msglen,' CorrelID=',CorrelID
-        msglen=msglen1
-      endif ! (MyRank.gt.0)
-      if (ldone) goto 30
-      ldone=.true.
-   20 continue
-cd    write (iout,*) 'Receiving: MyRank',MyRank,' mm',mm,' ldone',ldone
-      if (MyRank.lt.fgProcs-1) then
-C Receive correlation contributions from the next processor
-        msglen=msglen1
-        if (ielend(iatel_e).lt.nct-1) msglen=msglen2
-cd      write (iout,*) 'Processor',MyID,
-cd   & ' is receiving correlation contribution from processor',MyID+1,
-cd   & ' msglen=',msglen,' CorrelType=',CorrelType
-cd      write (*,*) 'Processor',MyID,
-cd   & ' is receiving correlation contribution from processor',MyID+1,
-cd   & ' msglen=',msglen,' CorrelType=',CorrelType
-        nbytes=-1
-        do while (nbytes.le.0)
-          call mp_probe(MyID+1,CorrelType,nbytes)
-        enddo
-cd      print *,'Processor',MyID,' msglen',msglen,' nbytes',nbytes
-        call mp_brecv(buffer,msglen,MyID+1,CorrelType,nbytes)
-cd      write (iout,*) 'Processor',MyID,
-cd   & ' has received correlation contribution from processor',MyID+1,
-cd   & ' msglen=',msglen,' nbytes=',nbytes
-cd      write (iout,*) 'The received BUFFER array:'
-cd      do i=1,max_cont
-cd        write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,52)
-cd      enddo
-        if (msglen.eq.msglen1) then
-          call unpack_buffer(max_cont,max_dim,iatel_e+1,0,buffer)
-        else if (msglen.eq.msglen2)  then
-          call unpack_buffer(max_cont,max_dim,iatel_e,0,buffer) 
-          call unpack_buffer(max_cont,max_dim,iatel_e+1,26,buffer) 
-        else
-          write (iout,*) 
-     & 'ERROR!!!! message length changed while processing correlations.'
-          write (*,*) 
-     & 'ERROR!!!! message length changed while processing correlations.'
-          call mp_stopall(Error)
-        endif ! msglen.eq.msglen1
-      endif ! MyRank.lt.fgProcs-1
-      if (ldone) goto 30
-      ldone=.true.
-      goto 10
-   30 continue
-#endif
       if (lprn) then
         write (iout,'(a)') 'Contact function values:'
         do i=nnt,nct-2
@@ -4848,141 +6401,32 @@ c------------------------------------------------------------------------------
 C This subroutine calculates multi-body contributions to hydrogen-bonding 
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
-#ifdef MPL
-      include 'COMMON.INFO'
+#ifdef MPI
+      include "mpif.h"
 #endif
       include 'COMMON.FFIELD'
       include 'COMMON.DERIV'
+      include 'COMMON.LOCAL'
       include 'COMMON.INTERACT'
       include 'COMMON.CONTACTS'
-#ifdef MPL
-      parameter (max_cont=maxconts)
-      parameter (max_dim=2*(8*3+2))
-      parameter (msglen1=max_cont*max_dim*4)
-      parameter (msglen2=2*msglen1)
-      integer source,CorrelType,CorrelID,Error
-      double precision buffer(max_cont,max_dim)
-#endif
+      include 'COMMON.CHAIN'
+      include 'COMMON.CONTROL'
+      include 'COMMON.SHIELD'
       double precision gx(3),gx1(3)
+      integer num_cont_hb_old(maxres)
       logical lprn,ldone
-
+      double precision eello4,eello5,eelo6,eello_turn6
+      external eello4,eello5,eello6,eello_turn6
 C Set lprn=.true. for debugging
       lprn=.false.
       eturn6=0.0d0
-#ifdef MPL
-      n_corr=0
-      n_corr1=0
-      if (fgProcs.le.1) goto 30
-      if (lprn) then
-        write (iout,'(a)') 'Contact function values:'
-        do i=nnt,nct-2
-          write (iout,'(2i3,50(1x,i2,f5.2))') 
-     &    i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i),
-     &    j=1,num_cont_hb(i))
-        enddo
-      endif
-C Caution! Following code assumes that electrostatic interactions concerning
-C a given atom are split among at most two processors!
-      CorrelType=477
-      CorrelID=MyID+1
-      ldone=.false.
-      do i=1,max_cont
-        do j=1,max_dim
-          buffer(i,j)=0.0D0
-        enddo
-      enddo
-      mm=mod(MyRank,2)
-cd    write (iout,*) 'MyRank',MyRank,' mm',mm
-      if (mm) 20,20,10 
-   10 continue
-cd    write (iout,*) 'Sending: MyRank',MyRank,' mm',mm,' ldone',ldone
-      if (MyRank.gt.0) then
-C Send correlation contributions to the preceding processor
-        msglen=msglen1
-        nn=num_cont_hb(iatel_s)
-        call pack_buffer(max_cont,max_dim,iatel_s,0,buffer)
-cd      write (iout,*) 'The BUFFER array:'
-cd      do i=1,nn
-cd        write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,26)
-cd      enddo
-        if (ielstart(iatel_s).gt.iatel_s+ispp) then
-          msglen=msglen2
-            call pack_buffer(max_cont,max_dim,iatel_s+1,26,buffer)
-C Clear the contacts of the atom passed to the neighboring processor
-        nn=num_cont_hb(iatel_s+1)
-cd      do i=1,nn
-cd        write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j+26),j=1,26)
-cd      enddo
-            num_cont_hb(iatel_s)=0
-        endif 
-cd      write (iout,*) 'Processor ',MyID,MyRank,
-cd   & ' is sending correlation contribution to processor',MyID-1,
-cd   & ' msglen=',msglen
-cd      write (*,*) 'Processor ',MyID,MyRank,
-cd   & ' is sending correlation contribution to processor',MyID-1,
-cd   & ' msglen=',msglen,' CorrelType=',CorrelType
-        call mp_bsend(buffer,msglen,MyID-1,CorrelType,CorrelID)
-cd      write (iout,*) 'Processor ',MyID,
-cd   & ' has sent correlation contribution to processor',MyID-1,
-cd   & ' msglen=',msglen,' CorrelID=',CorrelID
-cd      write (*,*) 'Processor ',MyID,
-cd   & ' has sent correlation contribution to processor',MyID-1,
-cd   & ' msglen=',msglen,' CorrelID=',CorrelID
-        msglen=msglen1
-      endif ! (MyRank.gt.0)
-      if (ldone) goto 30
-      ldone=.true.
-   20 continue
-cd    write (iout,*) 'Receiving: MyRank',MyRank,' mm',mm,' ldone',ldone
-      if (MyRank.lt.fgProcs-1) then
-C Receive correlation contributions from the next processor
-        msglen=msglen1
-        if (ielend(iatel_e).lt.nct-1) msglen=msglen2
-cd      write (iout,*) 'Processor',MyID,
-cd   & ' is receiving correlation contribution from processor',MyID+1,
-cd   & ' msglen=',msglen,' CorrelType=',CorrelType
-cd      write (*,*) 'Processor',MyID,
-cd   & ' is receiving correlation contribution from processor',MyID+1,
-cd   & ' msglen=',msglen,' CorrelType=',CorrelType
-        nbytes=-1
-        do while (nbytes.le.0)
-          call mp_probe(MyID+1,CorrelType,nbytes)
-        enddo
-cd      print *,'Processor',MyID,' msglen',msglen,' nbytes',nbytes
-        call mp_brecv(buffer,msglen,MyID+1,CorrelType,nbytes)
-cd      write (iout,*) 'Processor',MyID,
-cd   & ' has received correlation contribution from processor',MyID+1,
-cd   & ' msglen=',msglen,' nbytes=',nbytes
-cd      write (iout,*) 'The received BUFFER array:'
-cd      do i=1,max_cont
-cd        write (iout,'(i2,9(3f8.3,2x))') i,(buffer(i,j),j=1,52)
-cd      enddo
-        if (msglen.eq.msglen1) then
-          call unpack_buffer(max_cont,max_dim,iatel_e+1,0,buffer)
-        else if (msglen.eq.msglen2)  then
-          call unpack_buffer(max_cont,max_dim,iatel_e,0,buffer) 
-          call unpack_buffer(max_cont,max_dim,iatel_e+1,26,buffer) 
-        else
-          write (iout,*) 
-     & 'ERROR!!!! message length changed while processing correlations.'
-          write (*,*) 
-     & 'ERROR!!!! message length changed while processing correlations.'
-          call mp_stopall(Error)
-        endif ! msglen.eq.msglen1
-      endif ! MyRank.lt.fgProcs-1
-      if (ldone) goto 30
-      ldone=.true.
-      goto 10
-   30 continue
-#endif
       if (lprn) then
         write (iout,'(a)') 'Contact function values:'
         do i=nnt,nct-2
-          write (iout,'(2i3,50(1x,i2,f5.2))') 
-     &    i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i),
-     &    j=1,num_cont_hb(i))
+          write (iout,'(2i3,50(1x,i2,5f6.3))') 
+     &    i,num_cont_hb(i),(jcont_hb(j,i),d_cont(j,i),
+     &    ((a_chuj(ll,kk,j,i),ll=1,2),kk=1,2),j=1,num_cont_hb(i))
         enddo
       endif
       ecorr=0.0D0
@@ -5001,22 +6445,35 @@ C Calculate the dipole-dipole interaction energies
         num_conti=num_cont_hb(i)
         do jj=1,num_conti
           j=jcont_hb(jj,i)
+#ifdef MOMENT
           call dipole(i,j,jj)
+#endif
         enddo
       enddo
       endif
 C Calculate the local-electrostatic correlation terms
-      do i=iatel_s,iatel_e+1
+c                write (iout,*) "gradcorr5 in eello5 before loop"
+c                do iii=1,nres
+c                  write (iout,'(i5,3f10.5)') 
+c     &             iii,(gradcorr5(jjj,iii),jjj=1,3)
+c                enddo
+      do i=min0(iatel_s,iturn4_start),max0(iatel_e+1,iturn3_end+1)
+c        write (iout,*) "corr loop i",i
         i1=i+1
         num_conti=num_cont_hb(i)
         num_conti1=num_cont_hb(i+1)
         do jj=1,num_conti
           j=jcont_hb(jj,i)
+          jp=iabs(j)
           do kk=1,num_conti1
             j1=jcont_hb(kk,i1)
-c            write (*,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1,
+            jp1=iabs(j1)
+c            write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1,
 c     &         ' jj=',jj,' kk=',kk
-            if (j1.eq.j+1 .or. j1.eq.j-1) then
+c            if (j1.eq.j+1 .or. j1.eq.j-1) then
+            if ((j.gt.0 .and. j1.gt.0 .or. j.gt.0 .and. j1.lt.0 
+     &          .or. j.lt.0 .and. j1.gt.0) .and.
+     &         (jp1.eq.jp+1 .or. jp1.eq.jp-1)) then
 C Contacts I-J and (I+1)-(J+1) or (I+1)-(J-1) occur simultaneously. 
 C The system gains extra energy.
               n_corr=n_corr+1
@@ -5026,8 +6483,8 @@ C The system gains extra energy.
               IF (sred_geom.lt.cutoff_corr) THEN
                 call gcont(sred_geom,r0_corr,1.0D0,delt_corr,
      &            ekont,fprimcont)
-c               write (*,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1,
-c     &         ' jj=',jj,' kk=',kk
+cd               write (iout,*) 'i=',i,' j=',jp,' i1=',i1,' j1=',jp1,
+cd     &         ' jj=',jj,' kk=',kk
                 fac_prim1=0.5d0*sqd2/sqd1*fprimcont
                 fac_prim2=0.5d0*sqd1/sqd2*fprimcont
                 do l=1,3
@@ -5036,51 +6493,69 @@ c     &         ' jj=',jj,' kk=',kk
                 enddo
                 n_corr1=n_corr1+1
 cd               write (iout,*) 'sred_geom=',sred_geom,
-cd     &          ' ekont=',ekont,' fprim=',fprimcont
-                call calc_eello(i,j,i+1,j1,jj,kk)
+cd     &          ' ekont=',ekont,' fprim=',fprimcont,
+cd     &          ' fac_prim1',fac_prim1,' fac_prim2',fac_prim2
+cd               write (iout,*) "g_contij",g_contij
+cd               write (iout,*) "grij_hb_cont i",grij_hb_cont(:,jj,i)
+cd               write (iout,*) "grij_hb_cont i1",grij_hb_cont(:,jj,i1)
+                call calc_eello(i,jp,i+1,jp1,jj,kk)
                 if (wcorr4.gt.0.0d0) 
-     &            ecorr=ecorr+eello4(i,j,i+1,j1,jj,kk)
+     &            ecorr=ecorr+eello4(i,jp,i+1,jp1,jj,kk)
+CC     &            *fac_shield(i)**2*fac_shield(j)**2
+                  if (energy_dec.and.wcorr4.gt.0.0d0) 
+     1                 write (iout,'(a6,4i5,0pf7.3)')
+     2                'ecorr4',i,j,i+1,j1,eello4(i,jp,i+1,jp1,jj,kk)
+c                write (iout,*) "gradcorr5 before eello5"
+c                do iii=1,nres
+c                  write (iout,'(i5,3f10.5)') 
+c     &             iii,(gradcorr5(jjj,iii),jjj=1,3)
+c                enddo
                 if (wcorr5.gt.0.0d0)
-     &            ecorr5=ecorr5+eello5(i,j,i+1,j1,jj,kk)
-c                print *,"wcorr5",ecorr5
+     &            ecorr5=ecorr5+eello5(i,jp,i+1,jp1,jj,kk)
+c                write (iout,*) "gradcorr5 after eello5"
+c                do iii=1,nres
+c                  write (iout,'(i5,3f10.5)') 
+c     &             iii,(gradcorr5(jjj,iii),jjj=1,3)
+c                enddo
+                  if (energy_dec.and.wcorr5.gt.0.0d0) 
+     1                 write (iout,'(a6,4i5,0pf7.3)')
+     2                'ecorr5',i,j,i+1,j1,eello5(i,jp,i+1,jp1,jj,kk)
 cd                write(2,*)'wcorr6',wcorr6,' wturn6',wturn6
-cd                write(2,*)'ijkl',i,j,i+1,j1 
-                if (wcorr6.gt.0.0d0 .and. (j.ne.i+4 .or. j1.ne.i+3
+cd                write(2,*)'ijkl',i,jp,i+1,jp1 
+                if (wcorr6.gt.0.0d0 .and. (jp.ne.i+4 .or. jp1.ne.i+3
      &               .or. wturn6.eq.0.0d0))then
 cd                  write (iout,*) '******ecorr6: i,j,i+1,j1',i,j,i+1,j1
-                  ecorr6=ecorr6+eello6(i,j,i+1,j1,jj,kk)
+                  ecorr6=ecorr6+eello6(i,jp,i+1,jp1,jj,kk)
+                  if (energy_dec) write (iout,'(a6,4i5,0pf7.3)')
+     1                'ecorr6',i,j,i+1,j1,eello6(i,jp,i+1,jp1,jj,kk)
 cd                write (iout,*) 'ecorr',ecorr,' ecorr5=',ecorr5,
 cd     &            'ecorr6=',ecorr6
 cd                write (iout,'(4e15.5)') sred_geom,
-cd     &          dabs(eello4(i,j,i+1,j1,jj,kk)),
-cd     &          dabs(eello5(i,j,i+1,j1,jj,kk)),
-cd     &          dabs(eello6(i,j,i+1,j1,jj,kk))
+cd     &          dabs(eello4(i,jp,i+1,jp1,jj,kk)),
+cd     &          dabs(eello5(i,jp,i+1,jp1,jj,kk)),
+cd     &          dabs(eello6(i,jp,i+1,jp1,jj,kk))
                 else if (wturn6.gt.0.0d0
-     &            .and. (j.eq.i+4 .and. j1.eq.i+3)) then
-cd                  write (iout,*) '******eturn6: i,j,i+1,j1',i,j,i+1,j1
+     &            .and. (jp.eq.i+4 .and. jp1.eq.i+3)) then
+cd                  write (iout,*) '******eturn6: i,j,i+1,j1',i,jip,i+1,jp1
                   eturn6=eturn6+eello_turn6(i,jj,kk)
+                  if (energy_dec) write (iout,'(a6,4i5,0pf7.3)')
+     1                 'eturn6',i,j,i+1,j1,eello_turn6(i,jj,kk)
 cd                  write (2,*) 'multibody_eello:eturn6',eturn6
                 endif
               ENDIF
-1111          continue
-            else if (j1.eq.j) then
-C Contacts I-J and I-(J+1) occur simultaneously. 
-C The system loses extra energy.
-c             ecorr=ecorr+ehbcorr(i,j,i+1,j,jj,kk,0.60D0,-0.40D0) 
+1111          continue
             endif
           enddo ! kk
-          do kk=1,num_conti
-            j1=jcont_hb(kk,i)
-c           write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1,
-c    &         ' jj=',jj,' kk=',kk
-            if (j1.eq.j+1) then
-C Contacts I-J and (I+1)-J occur simultaneously. 
-C The system loses extra energy.
-c             ecorr=ecorr+ehbcorr(i,j,i,j+1,jj,kk,0.60D0,-0.40D0)
-            endif ! j1==j+1
-          enddo ! kk
         enddo ! jj
       enddo ! i
+      do i=1,nres
+        num_cont_hb(i)=num_cont_hb_old(i)
+      enddo
+c                write (iout,*) "gradcorr5 in eello5"
+c                do iii=1,nres
+c                  write (iout,'(i5,3f10.5)') 
+c     &             iii,(gradcorr5(jjj,iii),jjj=1,3)
+c                enddo
       return
       end
 c------------------------------------------------------------------------------
@@ -5091,9 +6566,12 @@ c------------------------------------------------------------------------------
       include 'COMMON.DERIV'
       include 'COMMON.INTERACT'
       include 'COMMON.CONTACTS'
+      include 'COMMON.SHIELD'
+      include 'COMMON.CONTROL'
       double precision gx(3),gx1(3)
       logical lprn
       lprn=.false.
+C      print *,"wchodze",fac_shield(i),shield_mode
       eij=facont_hb(jj,i)
       ekl=facont_hb(kk,k)
       ees0pij=ees0p(jj,i)
@@ -5102,62 +6580,161 @@ c------------------------------------------------------------------------------
       ees0mkl=ees0m(kk,k)
       ekont=eij*ekl
       ees=-(coeffp*ees0pij*ees0pkl+coeffm*ees0mij*ees0mkl)
+C*
+C     & fac_shield(i)**2*fac_shield(j)**2
 cd    ees=-(coeffp*ees0pkl+coeffm*ees0mkl)
 C Following 4 lines for diagnostics.
 cd    ees0pkl=0.0D0
 cd    ees0pij=1.0D0
 cd    ees0mkl=0.0D0
 cd    ees0mij=1.0D0
-c     write (iout,*)'Contacts have occurred for peptide groups',i,j,
-c    &   ' and',k,l
-c     write (iout,*)'Contacts have occurred for peptide groups',
-c    &  i,j,' fcont:',eij,' eij',' eesij',ees0pij,ees0mij,' and ',k,l
-c    & ,' fcont ',ekl,' eeskl',ees0pkl,ees0mkl,' ees=',ees
+c      write (iout,'(2(a,2i3,a,f10.5,a,2f10.5),a,f10.5,a,$)')
+c     & 'Contacts ',i,j,
+c     & ' eij',eij,' eesij',ees0pij,ees0mij,' and ',k,l
+c     & ,' fcont ',ekl,' eeskl',ees0pkl,ees0mkl,' energy=',ekont*ees,
+c     & 'gradcorr_long'
 C Calculate the multi-body contribution to energy.
-      ecorr=ecorr+ekont*ees
-      if (calc_grad) then
+C      ecorr=ecorr+ekont*ees
 C Calculate multi-body contributions to the gradient.
+      coeffpees0pij=coeffp*ees0pij
+      coeffmees0mij=coeffm*ees0mij
+      coeffpees0pkl=coeffp*ees0pkl
+      coeffmees0mkl=coeffm*ees0mkl
       do ll=1,3
-        ghalf=0.5D0*ees*ekl*gacont_hbr(ll,jj,i)
-        gradcorr(ll,i)=gradcorr(ll,i)+ghalf
-     &  -ekont*(coeffp*ees0pkl*gacontp_hb1(ll,jj,i)+
-     &  coeffm*ees0mkl*gacontm_hb1(ll,jj,i))
-        gradcorr(ll,j)=gradcorr(ll,j)+ghalf
-     &  -ekont*(coeffp*ees0pkl*gacontp_hb2(ll,jj,i)+
-     &  coeffm*ees0mkl*gacontm_hb2(ll,jj,i))
-        ghalf=0.5D0*ees*eij*gacont_hbr(ll,kk,k)
-        gradcorr(ll,k)=gradcorr(ll,k)+ghalf
-     &  -ekont*(coeffp*ees0pij*gacontp_hb1(ll,kk,k)+
-     &  coeffm*ees0mij*gacontm_hb1(ll,kk,k))
-        gradcorr(ll,l)=gradcorr(ll,l)+ghalf
-     &  -ekont*(coeffp*ees0pij*gacontp_hb2(ll,kk,k)+
-     &  coeffm*ees0mij*gacontm_hb2(ll,kk,k))
-      enddo
-      do m=i+1,j-1
-        do ll=1,3
-          gradcorr(ll,m)=gradcorr(ll,m)+
-     &     ees*ekl*gacont_hbr(ll,jj,i)-
-     &     ekont*(coeffp*ees0pkl*gacontp_hb3(ll,jj,i)+
-     &     coeffm*ees0mkl*gacontm_hb3(ll,jj,i))
-        enddo
+cgrad        ghalfi=ees*ekl*gacont_hbr(ll,jj,i)
+        gradcorr(ll,i)=gradcorr(ll,i)!+0.5d0*ghalfi
+     &  -ekont*(coeffpees0pkl*gacontp_hb1(ll,jj,i)+
+     &  coeffmees0mkl*gacontm_hb1(ll,jj,i))
+        gradcorr(ll,j)=gradcorr(ll,j)!+0.5d0*ghalfi
+     &  -ekont*(coeffpees0pkl*gacontp_hb2(ll,jj,i)+
+     &  coeffmees0mkl*gacontm_hb2(ll,jj,i))
+cgrad        ghalfk=ees*eij*gacont_hbr(ll,kk,k)
+        gradcorr(ll,k)=gradcorr(ll,k)!+0.5d0*ghalfk
+     &  -ekont*(coeffpees0pij*gacontp_hb1(ll,kk,k)+
+     &  coeffmees0mij*gacontm_hb1(ll,kk,k))
+        gradcorr(ll,l)=gradcorr(ll,l)!+0.5d0*ghalfk
+     &  -ekont*(coeffpees0pij*gacontp_hb2(ll,kk,k)+
+     &  coeffmees0mij*gacontm_hb2(ll,kk,k))
+        gradlongij=ees*ekl*gacont_hbr(ll,jj,i)-
+     &     ekont*(coeffpees0pkl*gacontp_hb3(ll,jj,i)+
+     &     coeffmees0mkl*gacontm_hb3(ll,jj,i))
+        gradcorr_long(ll,j)=gradcorr_long(ll,j)+gradlongij
+        gradcorr_long(ll,i)=gradcorr_long(ll,i)-gradlongij
+        gradlongkl=ees*eij*gacont_hbr(ll,kk,k)-
+     &     ekont*(coeffpees0pij*gacontp_hb3(ll,kk,k)+
+     &     coeffmees0mij*gacontm_hb3(ll,kk,k))
+        gradcorr_long(ll,l)=gradcorr_long(ll,l)+gradlongkl
+        gradcorr_long(ll,k)=gradcorr_long(ll,k)-gradlongkl
+c        write (iout,'(2f10.5,2x,$)') gradlongij,gradlongkl
       enddo
-      do m=k+1,l-1
-        do ll=1,3
-          gradcorr(ll,m)=gradcorr(ll,m)+
-     &     ees*eij*gacont_hbr(ll,kk,k)-
-     &     ekont*(coeffp*ees0pij*gacontp_hb3(ll,kk,k)+
-     &     coeffm*ees0mij*gacontm_hb3(ll,kk,k))
-        enddo
-      enddo 
-      endif
+c      write (iout,*)
+cgrad      do m=i+1,j-1
+cgrad        do ll=1,3
+cgrad          gradcorr(ll,m)=gradcorr(ll,m)+
+cgrad     &     ees*ekl*gacont_hbr(ll,jj,i)-
+cgrad     &     ekont*(coeffp*ees0pkl*gacontp_hb3(ll,jj,i)+
+cgrad     &     coeffm*ees0mkl*gacontm_hb3(ll,jj,i))
+cgrad        enddo
+cgrad      enddo
+cgrad      do m=k+1,l-1
+cgrad        do ll=1,3
+cgrad          gradcorr(ll,m)=gradcorr(ll,m)+
+cgrad     &     ees*eij*gacont_hbr(ll,kk,k)-
+cgrad     &     ekont*(coeffp*ees0pij*gacontp_hb3(ll,kk,k)+
+cgrad     &     coeffm*ees0mij*gacontm_hb3(ll,kk,k))
+cgrad        enddo
+cgrad      enddo 
+c      write (iout,*) "ehbcorr",ekont*ees
+C      print *,ekont,ees,i,k
       ehbcorr=ekont*ees
+C now gradient over shielding
+C      return
+      if (shield_mode.gt.0) then
+       j=ees0plist(jj,i)
+       l=ees0plist(kk,k)
+C        print *,i,j,fac_shield(i),fac_shield(j),
+C     &fac_shield(k),fac_shield(l)
+        if ((fac_shield(i).gt.0).and.(fac_shield(j).gt.0).and.
+     &      (fac_shield(k).gt.0).and.(fac_shield(l).gt.0)) then
+          do ilist=1,ishield_list(i)
+           iresshield=shield_list(ilist,i)
+           do m=1,3
+           rlocshield=grad_shield_side(m,ilist,i)*ehbcorr/fac_shield(i)
+C     &      *2.0
+           gshieldx_ec(m,iresshield)=gshieldx_ec(m,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(m,ilist,i)*ehbcorr/fac_shield(i)
+            gshieldc_ec(m,iresshield-1)=gshieldc_ec(m,iresshield-1)
+     &+rlocshield
+           enddo
+          enddo
+          do ilist=1,ishield_list(j)
+           iresshield=shield_list(ilist,j)
+           do m=1,3
+           rlocshield=grad_shield_side(m,ilist,j)*ehbcorr/fac_shield(j)
+C     &     *2.0
+           gshieldx_ec(m,iresshield)=gshieldx_ec(m,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(m,ilist,j)*ehbcorr/fac_shield(j)
+           gshieldc_ec(m,iresshield-1)=gshieldc_ec(m,iresshield-1)
+     &     +rlocshield
+           enddo
+          enddo
+
+          do ilist=1,ishield_list(k)
+           iresshield=shield_list(ilist,k)
+           do m=1,3
+           rlocshield=grad_shield_side(m,ilist,k)*ehbcorr/fac_shield(k)
+C     &     *2.0
+           gshieldx_ec(m,iresshield)=gshieldx_ec(m,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(m,ilist,k)*ehbcorr/fac_shield(k)
+           gshieldc_ec(m,iresshield-1)=gshieldc_ec(m,iresshield-1)
+     &     +rlocshield
+           enddo
+          enddo
+          do ilist=1,ishield_list(l)
+           iresshield=shield_list(ilist,l)
+           do m=1,3
+           rlocshield=grad_shield_side(m,ilist,l)*ehbcorr/fac_shield(l)
+C     &     *2.0
+           gshieldx_ec(m,iresshield)=gshieldx_ec(m,iresshield)+
+     &              rlocshield
+     & +grad_shield_loc(m,ilist,l)*ehbcorr/fac_shield(l)
+           gshieldc_ec(m,iresshield-1)=gshieldc_ec(m,iresshield-1)
+     &     +rlocshield
+           enddo
+          enddo
+C          print *,gshieldx(m,iresshield)
+          do m=1,3
+            gshieldc_ec(m,i)=gshieldc_ec(m,i)+
+     &              grad_shield(m,i)*ehbcorr/fac_shield(i)
+            gshieldc_ec(m,j)=gshieldc_ec(m,j)+
+     &              grad_shield(m,j)*ehbcorr/fac_shield(j)
+            gshieldc_ec(m,i-1)=gshieldc_ec(m,i-1)+
+     &              grad_shield(m,i)*ehbcorr/fac_shield(i)
+            gshieldc_ec(m,j-1)=gshieldc_ec(m,j-1)+
+     &              grad_shield(m,j)*ehbcorr/fac_shield(j)
+
+            gshieldc_ec(m,k)=gshieldc_ec(m,k)+
+     &              grad_shield(m,k)*ehbcorr/fac_shield(k)
+            gshieldc_ec(m,l)=gshieldc_ec(m,l)+
+     &              grad_shield(m,l)*ehbcorr/fac_shield(l)
+            gshieldc_ec(m,k-1)=gshieldc_ec(m,k-1)+
+     &              grad_shield(m,k)*ehbcorr/fac_shield(k)
+            gshieldc_ec(m,l-1)=gshieldc_ec(m,l-1)+
+     &              grad_shield(m,l)*ehbcorr/fac_shield(l)
+
+           enddo       
+      endif
+      endif
       return
       end
+#ifdef MOMENT
 C---------------------------------------------------------------------------
       subroutine dipole(i,j,jj)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.CHAIN'
       include 'COMMON.FFIELD'
@@ -5171,17 +6748,17 @@ C---------------------------------------------------------------------------
      &  auxmat(2,2)
       iti1 = itortyp(itype(i+1))
       if (j.lt.nres-1) then
-        itj1 = itortyp(itype(j+1))
+        itj1 = itype2loc(itype(j+1))
       else
-        itj1=ntortyp+1
+        itj1=nloctyp
       endif
       do iii=1,2
         dipi(iii,1)=Ub2(iii,i)
         dipderi(iii)=Ub2der(iii,i)
-        dipi(iii,2)=b1(iii,iti1)
+        dipi(iii,2)=b1(iii,i+1)
         dipj(iii,1)=Ub2(iii,j)
         dipderj(iii)=Ub2der(iii,j)
-        dipj(iii,2)=b1(iii,itj1)
+        dipj(iii,2)=b1(iii,j+1)
       enddo
       kkk=0
       do iii=1,2
@@ -5191,7 +6768,6 @@ C---------------------------------------------------------------------------
           dip(kkk,jj,i)=scalar2(dipi(1,jjj),auxvec(1))
         enddo
       enddo
-      if (.not.calc_grad) return
       do kkk=1,5
         do lll=1,3
           mmm=0
@@ -5216,6 +6792,7 @@ C---------------------------------------------------------------------------
       enddo
       return
       end
+#endif
 C---------------------------------------------------------------------------
       subroutine calc_eello(i,j,k,l,jj,kk)
 C 
@@ -5224,7 +6801,6 @@ C the fourth-, fifth-, and sixth-order local-electrostatic terms.
 C
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
@@ -5241,6 +6817,8 @@ C
 cd      write (iout,*) 'calc_eello: i=',i,' j=',j,' k=',k,' l=',l,
 cd     & ' jj=',jj,' kk=',kk
 cd      if (i.ne.2 .or. j.ne.4 .or. k.ne.3 .or. l.ne.5) return
+cd      write (iout,*) "a_chujij",((a_chuj(iii,jjj,jj,i),iii=1,2),jjj=1,2)
+cd      write (iout,*) "a_chujkl",((a_chuj(iii,jjj,kk,k),iii=1,2),jjj=1,2)
       do iii=1,2
         do jjj=1,2
           aa1(iii,jjj)=a_chuj(iii,jjj,jj,i)
@@ -5260,16 +6838,16 @@ cd      if (i.ne.2 .or. j.ne.4 .or. k.ne.3 .or. l.ne.5) return
       if (l.eq.j+1) then
 C parallel orientation of the two CA-CA-CA frames.
         if (i.gt.1) then
-          iti=itortyp(itype(i))
+          iti=itype2loc(itype(i))
         else
-          iti=ntortyp+1
+          iti=nloctyp
         endif
-        itk1=itortyp(itype(k+1))
-        itj=itortyp(itype(j))
+        itk1=itype2loc(itype(k+1))
+        itj=itype2loc(itype(j))
         if (l.lt.nres-1) then
-          itl1=itortyp(itype(l+1))
+          itl1=itype2loc(itype(l+1))
         else
-          itl1=ntortyp+1
+          itl1=nloctyp
         endif
 C A1 kernel(j+1) A2T
 cd        do iii=1,2
@@ -5360,26 +6938,26 @@ C They are needed only when the fifth- or the sixth-order cumulants are
 C indluded.
         IF (wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) THEN
         call transpose2(AEA(1,1,1),auxmat(1,1))
-        call matvec2(auxmat(1,1),b1(1,iti),AEAb1(1,1,1))
+        call matvec2(auxmat(1,1),b1(1,i),AEAb1(1,1,1))
         call matvec2(auxmat(1,1),Ub2(1,i),AEAb2(1,1,1))
         call matvec2(auxmat(1,1),Ub2der(1,i),AEAb2derg(1,2,1,1))
         call transpose2(AEAderg(1,1,1),auxmat(1,1))
-        call matvec2(auxmat(1,1),b1(1,iti),AEAb1derg(1,1,1))
+        call matvec2(auxmat(1,1),b1(1,i),AEAb1derg(1,1,1))
         call matvec2(auxmat(1,1),Ub2(1,i),AEAb2derg(1,1,1,1))
-        call matvec2(AEA(1,1,1),b1(1,itk1),AEAb1(1,2,1))
-        call matvec2(AEAderg(1,1,1),b1(1,itk1),AEAb1derg(1,2,1))
+        call matvec2(AEA(1,1,1),b1(1,k+1),AEAb1(1,2,1))
+        call matvec2(AEAderg(1,1,1),b1(1,k+1),AEAb1derg(1,2,1))
         call matvec2(AEA(1,1,1),Ub2(1,k+1),AEAb2(1,2,1))
         call matvec2(AEAderg(1,1,1),Ub2(1,k+1),AEAb2derg(1,1,2,1))
         call matvec2(AEA(1,1,1),Ub2der(1,k+1),AEAb2derg(1,2,2,1))
         call transpose2(AEA(1,1,2),auxmat(1,1))
-        call matvec2(auxmat(1,1),b1(1,itj),AEAb1(1,1,2))
+        call matvec2(auxmat(1,1),b1(1,j),AEAb1(1,1,2))
         call matvec2(auxmat(1,1),Ub2(1,j),AEAb2(1,1,2))
         call matvec2(auxmat(1,1),Ub2der(1,j),AEAb2derg(1,2,1,2))
         call transpose2(AEAderg(1,1,2),auxmat(1,1))
-        call matvec2(auxmat(1,1),b1(1,itj),AEAb1derg(1,1,2))
+        call matvec2(auxmat(1,1),b1(1,j),AEAb1derg(1,1,2))
         call matvec2(auxmat(1,1),Ub2(1,j),AEAb2derg(1,1,1,2))
-        call matvec2(AEA(1,1,2),b1(1,itl1),AEAb1(1,2,2))
-        call matvec2(AEAderg(1,1,2),b1(1,itl1),AEAb1derg(1,2,2))
+        call matvec2(AEA(1,1,2),b1(1,l+1),AEAb1(1,2,2))
+        call matvec2(AEAderg(1,1,2),b1(1,l+1),AEAb1derg(1,2,2))
         call matvec2(AEA(1,1,2),Ub2(1,l+1),AEAb2(1,2,2))
         call matvec2(AEAderg(1,1,2),Ub2(1,l+1),AEAb2derg(1,1,2,2))
         call matvec2(AEA(1,1,2),Ub2der(1,l+1),AEAb2derg(1,2,2,2))
@@ -5388,20 +6966,20 @@ C Calculate the Cartesian derivatives of the vectors.
           do kkk=1,5
             do lll=1,3
               call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1))
-              call matvec2(auxmat(1,1),b1(1,iti),
+              call matvec2(auxmat(1,1),b1(1,i),
      &          AEAb1derx(1,lll,kkk,iii,1,1))
               call matvec2(auxmat(1,1),Ub2(1,i),
      &          AEAb2derx(1,lll,kkk,iii,1,1))
-              call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,itk1),
+              call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,k+1),
      &          AEAb1derx(1,lll,kkk,iii,2,1))
               call matvec2(AEAderx(1,1,lll,kkk,iii,1),Ub2(1,k+1),
      &          AEAb2derx(1,lll,kkk,iii,2,1))
               call transpose2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1))
-              call matvec2(auxmat(1,1),b1(1,itj),
+              call matvec2(auxmat(1,1),b1(1,j),
      &          AEAb1derx(1,lll,kkk,iii,1,2))
               call matvec2(auxmat(1,1),Ub2(1,j),
      &          AEAb2derx(1,lll,kkk,iii,1,2))
-              call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,itl1),
+              call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,l+1),
      &          AEAb1derx(1,lll,kkk,iii,2,2))
               call matvec2(AEAderx(1,1,lll,kkk,iii,2),Ub2(1,l+1),
      &          AEAb2derx(1,lll,kkk,iii,2,2))
@@ -5413,17 +6991,17 @@ C End vectors
       else
 C Antiparallel orientation of the two CA-CA-CA frames.
         if (i.gt.1) then
-          iti=itortyp(itype(i))
+          iti=itype2loc(itype(i))
         else
-          iti=ntortyp+1
+          iti=nloctyp
         endif
-        itk1=itortyp(itype(k+1))
-        itl=itortyp(itype(l))
-        itj=itortyp(itype(j))
+        itk1=itype2loc(itype(k+1))
+        itl=itype2loc(itype(l))
+        itj=itype2loc(itype(j))
         if (j.lt.nres-1) then
-          itj1=itortyp(itype(j+1))
+          itj1=itype2loc(itype(j+1))
         else 
-          itj1=ntortyp+1
+          itj1=nloctyp
         endif
 C A2 kernel(j-1)T A1T
         call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i),
@@ -5498,26 +7076,26 @@ C indluded.
         IF (wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 .or.
      &    (wturn6.gt.0.0d0 .and. j.eq.i+4 .and. l.eq.i+3)) THEN
         call transpose2(AEA(1,1,1),auxmat(1,1))
-        call matvec2(auxmat(1,1),b1(1,iti),AEAb1(1,1,1))
+        call matvec2(auxmat(1,1),b1(1,i),AEAb1(1,1,1))
         call matvec2(auxmat(1,1),Ub2(1,i),AEAb2(1,1,1))
         call matvec2(auxmat(1,1),Ub2der(1,i),AEAb2derg(1,2,1,1))
         call transpose2(AEAderg(1,1,1),auxmat(1,1))
-        call matvec2(auxmat(1,1),b1(1,iti),AEAb1derg(1,1,1))
+        call matvec2(auxmat(1,1),b1(1,i),AEAb1derg(1,1,1))
         call matvec2(auxmat(1,1),Ub2(1,i),AEAb2derg(1,1,1,1))
-        call matvec2(AEA(1,1,1),b1(1,itk1),AEAb1(1,2,1))
-        call matvec2(AEAderg(1,1,1),b1(1,itk1),AEAb1derg(1,2,1))
+        call matvec2(AEA(1,1,1),b1(1,k+1),AEAb1(1,2,1))
+        call matvec2(AEAderg(1,1,1),b1(1,k+1),AEAb1derg(1,2,1))
         call matvec2(AEA(1,1,1),Ub2(1,k+1),AEAb2(1,2,1))
         call matvec2(AEAderg(1,1,1),Ub2(1,k+1),AEAb2derg(1,1,2,1))
         call matvec2(AEA(1,1,1),Ub2der(1,k+1),AEAb2derg(1,2,2,1))
         call transpose2(AEA(1,1,2),auxmat(1,1))
-        call matvec2(auxmat(1,1),b1(1,itj1),AEAb1(1,1,2))
+        call matvec2(auxmat(1,1),b1(1,j+1),AEAb1(1,1,2))
         call matvec2(auxmat(1,1),Ub2(1,l),AEAb2(1,1,2))
         call matvec2(auxmat(1,1),Ub2der(1,l),AEAb2derg(1,2,1,2))
         call transpose2(AEAderg(1,1,2),auxmat(1,1))
-        call matvec2(auxmat(1,1),b1(1,itl),AEAb1(1,1,2))
+        call matvec2(auxmat(1,1),b1(1,l),AEAb1(1,1,2))
         call matvec2(auxmat(1,1),Ub2(1,l),AEAb2derg(1,1,1,2))
-        call matvec2(AEA(1,1,2),b1(1,itj1),AEAb1(1,2,2))
-        call matvec2(AEAderg(1,1,2),b1(1,itj1),AEAb1derg(1,2,2))
+        call matvec2(AEA(1,1,2),b1(1,j+1),AEAb1(1,2,2))
+        call matvec2(AEAderg(1,1,2),b1(1,j+1),AEAb1derg(1,2,2))
         call matvec2(AEA(1,1,2),Ub2(1,j),AEAb2(1,2,2))
         call matvec2(AEAderg(1,1,2),Ub2(1,j),AEAb2derg(1,1,2,2))
         call matvec2(AEA(1,1,2),Ub2der(1,j),AEAb2derg(1,2,2,2))
@@ -5526,20 +7104,20 @@ C Calculate the Cartesian derivatives of the vectors.
           do kkk=1,5
             do lll=1,3
               call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1))
-              call matvec2(auxmat(1,1),b1(1,iti),
+              call matvec2(auxmat(1,1),b1(1,i),
      &          AEAb1derx(1,lll,kkk,iii,1,1))
               call matvec2(auxmat(1,1),Ub2(1,i),
      &          AEAb2derx(1,lll,kkk,iii,1,1))
-              call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,itk1),
+              call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,k+1),
      &          AEAb1derx(1,lll,kkk,iii,2,1))
               call matvec2(AEAderx(1,1,lll,kkk,iii,1),Ub2(1,k+1),
      &          AEAb2derx(1,lll,kkk,iii,2,1))
               call transpose2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1))
-              call matvec2(auxmat(1,1),b1(1,itl),
+              call matvec2(auxmat(1,1),b1(1,l),
      &          AEAb1derx(1,lll,kkk,iii,1,2))
               call matvec2(auxmat(1,1),Ub2(1,l),
      &          AEAb2derx(1,lll,kkk,iii,1,2))
-              call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,itj1),
+              call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,j+1),
      &          AEAb1derx(1,lll,kkk,iii,2,2))
               call matvec2(AEAderx(1,1,lll,kkk,iii,2),Ub2(1,j),
      &          AEAb2derx(1,lll,kkk,iii,2,2))
@@ -5601,7 +7179,6 @@ C---------------------------------------------------------------------------
       double precision function eello4(i,j,k,l,jj,kk)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
@@ -5664,51 +7241,49 @@ cd     &  ' fcont ',ekl,' eel4=',eel4,' eel4_num',16*eel4_num
         l2=l-2
       endif
       do ll=1,3
-cold        ghalf=0.5d0*eel4*ekl*gacont_hbr(ll,jj,i)
-        ggg1(ll)=eel4*g_contij(ll,1)
-        ggg2(ll)=eel4*g_contij(ll,2)
-        ghalf=0.5d0*ggg1(ll)
-cd        ghalf=0.0d0
-        gradcorr(ll,i)=gradcorr(ll,i)+ghalf+ekont*derx(ll,2,1)
+cgrad        ggg1(ll)=eel4*g_contij(ll,1)
+cgrad        ggg2(ll)=eel4*g_contij(ll,2)
+        glongij=eel4*g_contij(ll,1)+ekont*derx(ll,1,1)
+        glongkl=eel4*g_contij(ll,2)+ekont*derx(ll,1,2)
+cgrad        ghalf=0.5d0*ggg1(ll)
+        gradcorr(ll,i)=gradcorr(ll,i)+ekont*derx(ll,2,1)
         gradcorr(ll,i+1)=gradcorr(ll,i+1)+ekont*derx(ll,3,1)
-        gradcorr(ll,j)=gradcorr(ll,j)+ghalf+ekont*derx(ll,4,1)
+        gradcorr(ll,j)=gradcorr(ll,j)+ekont*derx(ll,4,1)
         gradcorr(ll,j1)=gradcorr(ll,j1)+ekont*derx(ll,5,1)
-cold        ghalf=0.5d0*eel4*eij*gacont_hbr(ll,kk,k)
-        ghalf=0.5d0*ggg2(ll)
-cd        ghalf=0.0d0
-        gradcorr(ll,k)=gradcorr(ll,k)+ghalf+ekont*derx(ll,2,2)
+        gradcorr_long(ll,j)=gradcorr_long(ll,j)+glongij
+        gradcorr_long(ll,i)=gradcorr_long(ll,i)-glongij
+cgrad        ghalf=0.5d0*ggg2(ll)
+        gradcorr(ll,k)=gradcorr(ll,k)+ekont*derx(ll,2,2)
         gradcorr(ll,k+1)=gradcorr(ll,k+1)+ekont*derx(ll,3,2)
-        gradcorr(ll,l)=gradcorr(ll,l)+ghalf+ekont*derx(ll,4,2)
+        gradcorr(ll,l)=gradcorr(ll,l)+ekont*derx(ll,4,2)
         gradcorr(ll,l1)=gradcorr(ll,l1)+ekont*derx(ll,5,2)
+        gradcorr_long(ll,l)=gradcorr_long(ll,l)+glongkl
+        gradcorr_long(ll,k)=gradcorr_long(ll,k)-glongkl
       enddo
-cd      goto 1112
-      do m=i+1,j-1
-        do ll=1,3
-cold          gradcorr(ll,m)=gradcorr(ll,m)+eel4*ekl*gacont_hbr(ll,jj,i)
-          gradcorr(ll,m)=gradcorr(ll,m)+ggg1(ll)
-        enddo
-      enddo
-      do m=k+1,l-1
-        do ll=1,3
-cold          gradcorr(ll,m)=gradcorr(ll,m)+eel4*eij*gacont_hbr(ll,kk,k)
-          gradcorr(ll,m)=gradcorr(ll,m)+ggg2(ll)
-        enddo
-      enddo
-1112  continue
-      do m=i+2,j2
-        do ll=1,3
-          gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,1)
-        enddo
-      enddo
-      do m=k+2,l2
-        do ll=1,3
-          gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,2)
-        enddo
-      enddo 
+cgrad      do m=i+1,j-1
+cgrad        do ll=1,3
+cgrad          gradcorr(ll,m)=gradcorr(ll,m)+ggg1(ll)
+cgrad        enddo
+cgrad      enddo
+cgrad      do m=k+1,l-1
+cgrad        do ll=1,3
+cgrad          gradcorr(ll,m)=gradcorr(ll,m)+ggg2(ll)
+cgrad        enddo
+cgrad      enddo
+cgrad      do m=i+2,j2
+cgrad        do ll=1,3
+cgrad          gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,1)
+cgrad        enddo
+cgrad      enddo
+cgrad      do m=k+2,l2
+cgrad        do ll=1,3
+cgrad          gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,2)
+cgrad        enddo
+cgrad      enddo 
 cd      do iii=1,nres-3
 cd        write (2,*) iii,gcorr_loc(iii)
 cd      enddo
-      endif
+      endif ! calc_grad
       eello4=ekont*eel4
 cd      write (2,*) 'ekont',ekont
 cd      write (iout,*) 'eello4',ekont*eel4
@@ -5718,7 +7293,6 @@ C---------------------------------------------------------------------------
       double precision function eello5(i,j,k,l,jj,kk)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
@@ -5767,9 +7341,9 @@ cd      endif
 cd      write (iout,*)
 cd     &   'EELLO5: Contacts have occurred for peptide groups',i,j,
 cd     &   ' and',k,l
-      itk=itortyp(itype(k))
-      itl=itortyp(itype(l))
-      itj=itortyp(itype(j))
+      itk=itype2loc(itype(k))
+      itl=itype2loc(itype(l))
+      itj=itype2loc(itype(j))
       eello5_1=0.0d0
       eello5_2=0.0d0
       eello5_3=0.0d0
@@ -5798,7 +7372,7 @@ cd      write (2,*) 'AEAb2',AEAb2(1,1,1),AEAb2(2,1,1)
       vv(2)=pizda(1,2)+pizda(2,1)
       eello5_1=scalar2(AEAb2(1,1,1),Ub2(1,k))
      & +0.5d0*scalar2(vv(1),Dtobr2(1,i))
-      if (calc_grad) then
+      if (calc_grad) then 
 C Explicit gradient in virtual-dihedral angles.
       if (i.gt.1) g_corr5_loc(i-1)=g_corr5_loc(i-1)
      & +ekont*(scalar2(AEAb2derg(1,2,1,1),Ub2(1,k))
@@ -5836,15 +7410,15 @@ C Cartesian gradient
           enddo
         enddo
       enddo
+      endif ! calc_grad 
 c      goto 1112
-      endif
 c1111  continue
 C Contribution from graph II 
-      call transpose2(EE(1,1,itk),auxmat(1,1))
+      call transpose2(EE(1,1,k),auxmat(1,1))
       call matmat2(auxmat(1,1),AEA(1,1,1),pizda(1,1))
       vv(1)=pizda(1,1)+pizda(2,2)
       vv(2)=pizda(2,1)-pizda(1,2)
-      eello5_2=scalar2(AEAb1(1,2,1),b1(1,itk))
+      eello5_2=scalar2(AEAb1(1,2,1),b1(1,k))
      & -0.5d0*scalar2(vv(1),Ctobr(1,k))
       if (calc_grad) then
 C Explicit gradient in virtual-dihedral angles.
@@ -5855,11 +7429,11 @@ C Explicit gradient in virtual-dihedral angles.
       vv(2)=pizda(2,1)-pizda(1,2)
       if (l.eq.j+1) then
         g_corr5_loc(l-1)=g_corr5_loc(l-1)
-     &   +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,itk))
+     &   +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,k))
      &   -0.5d0*scalar2(vv(1),Ctobr(1,k)))
       else
         g_corr5_loc(j-1)=g_corr5_loc(j-1)
-     &   +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,itk))
+     &   +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,k))
      &   -0.5d0*scalar2(vv(1),Ctobr(1,k)))
       endif
 C Cartesian gradient
@@ -5871,13 +7445,13 @@ C Cartesian gradient
             vv(1)=pizda(1,1)+pizda(2,2)
             vv(2)=pizda(2,1)-pizda(1,2)
             derx(lll,kkk,iii)=derx(lll,kkk,iii)
-     &       +scalar2(AEAb1derx(1,lll,kkk,iii,2,1),b1(1,itk))
+     &       +scalar2(AEAb1derx(1,lll,kkk,iii,2,1),b1(1,k))
      &       -0.5d0*scalar2(vv(1),Ctobr(1,k))
           enddo
         enddo
       enddo
+      endif ! calc_grad
 cd      goto 1112
-      endif
 cd1111  continue
       if (l.eq.j+1) then
 cd        goto 1110
@@ -5922,16 +7496,14 @@ C Cartesian gradient
           enddo
         enddo
 cd        goto 1112
-        endif
 C Contribution from graph IV
 cd1110    continue
-        call transpose2(EE(1,1,itl),auxmat(1,1))
+        call transpose2(EE(1,1,l),auxmat(1,1))
         call matmat2(auxmat(1,1),AEA(1,1,2),pizda(1,1))
         vv(1)=pizda(1,1)+pizda(2,2)
         vv(2)=pizda(2,1)-pizda(1,2)
-        eello5_4=scalar2(AEAb1(1,2,2),b1(1,itl))
+        eello5_4=scalar2(AEAb1(1,2,2),b1(1,l))
      &   -0.5d0*scalar2(vv(1),Ctobr(1,l))
-        if (calc_grad) then
 C Explicit gradient in virtual-dihedral angles.
         g_corr5_loc(l-1)=g_corr5_loc(l-1)
      &   -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,l))
@@ -5939,7 +7511,7 @@ C Explicit gradient in virtual-dihedral angles.
         vv(1)=pizda(1,1)+pizda(2,2)
         vv(2)=pizda(2,1)-pizda(1,2)
         g_corr5_loc(k-1)=g_corr5_loc(k-1)
-     &   +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,itl))
+     &   +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,l))
      &   -0.5d0*scalar2(vv(1),Ctobr(1,l)))
 C Cartesian gradient
         do iii=1,2
@@ -5950,12 +7522,12 @@ C Cartesian gradient
               vv(1)=pizda(1,1)+pizda(2,2)
               vv(2)=pizda(2,1)-pizda(1,2)
               derx(lll,kkk,iii)=derx(lll,kkk,iii)
-     &         +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,itl))
+     &         +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,l))
      &         -0.5d0*scalar2(vv(1),Ctobr(1,l))
             enddo
           enddo
         enddo
-        endif
+        endif ! calc_grad
       else
 C Antiparallel orientation
 C Contribution from graph III
@@ -5998,15 +7570,15 @@ C Cartesian gradient
             enddo
           enddo
         enddo
+        endif ! calc_grad
 cd        goto 1112
-        endif
 C Contribution from graph IV
 1110    continue
-        call transpose2(EE(1,1,itj),auxmat(1,1))
+        call transpose2(EE(1,1,j),auxmat(1,1))
         call matmat2(auxmat(1,1),AEA(1,1,2),pizda(1,1))
         vv(1)=pizda(1,1)+pizda(2,2)
         vv(2)=pizda(2,1)-pizda(1,2)
-        eello5_4=scalar2(AEAb1(1,2,2),b1(1,itj))
+        eello5_4=scalar2(AEAb1(1,2,2),b1(1,j))
      &   -0.5d0*scalar2(vv(1),Ctobr(1,j))
         if (calc_grad) then
 C Explicit gradient in virtual-dihedral angles.
@@ -6016,7 +7588,7 @@ C Explicit gradient in virtual-dihedral angles.
         vv(1)=pizda(1,1)+pizda(2,2)
         vv(2)=pizda(2,1)-pizda(1,2)
         g_corr5_loc(k-1)=g_corr5_loc(k-1)
-     &   +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,itj))
+     &   +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,j))
      &   -0.5d0*scalar2(vv(1),Ctobr(1,j)))
 C Cartesian gradient
         do iii=1,2
@@ -6027,12 +7599,12 @@ C Cartesian gradient
               vv(1)=pizda(1,1)+pizda(2,2)
               vv(2)=pizda(2,1)-pizda(1,2)
               derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)
-     &         +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,itj))
+     &         +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,j))
      &         -0.5d0*scalar2(vv(1),Ctobr(1,j))
             enddo
           enddo
         enddo
-      endif
+        endif ! calc_grad
       endif
 1112  continue
       eel5=eello5_1+eello5_2+eello5_3+eello5_4
@@ -6064,52 +7636,70 @@ cd      eij=1.0d0
 cd      ekl=1.0d0
 cd      ekont=1.0d0
 cd      write (2,*) 'eij',eij,' ekl',ekl,' ekont',ekont
+C 2/11/08 AL Gradients over DC's connecting interacting sites will be
+C        summed up outside the subrouine as for the other subroutines 
+C        handling long-range interactions. The old code is commented out
+C        with "cgrad" to keep track of changes.
       do ll=1,3
-        ggg1(ll)=eel5*g_contij(ll,1)
-        ggg2(ll)=eel5*g_contij(ll,2)
+cgrad        ggg1(ll)=eel5*g_contij(ll,1)
+cgrad        ggg2(ll)=eel5*g_contij(ll,2)
+        gradcorr5ij=eel5*g_contij(ll,1)+ekont*derx(ll,1,1)
+        gradcorr5kl=eel5*g_contij(ll,2)+ekont*derx(ll,1,2)
+c        write (iout,'(a,3i3,a,5f8.3,2i3,a,5f8.3,a,f8.3)') 
+c     &   "ecorr5",ll,i,j," derx",derx(ll,2,1),derx(ll,3,1),derx(ll,4,1),
+c     &   derx(ll,5,1),k,l," derx",derx(ll,2,2),derx(ll,3,2),
+c     &   derx(ll,4,2),derx(ll,5,2)," ekont",ekont
+c        write (iout,'(a,3i3,a,3f8.3,2i3,a,3f8.3)') 
+c     &   "ecorr5",ll,i,j," gradcorr5",g_contij(ll,1),derx(ll,1,1),
+c     &   gradcorr5ij,
+c     &   k,l," gradcorr5",g_contij(ll,2),derx(ll,1,2),gradcorr5kl
 cold        ghalf=0.5d0*eel5*ekl*gacont_hbr(ll,jj,i)
-        ghalf=0.5d0*ggg1(ll)
+cgrad        ghalf=0.5d0*ggg1(ll)
 cd        ghalf=0.0d0
-        gradcorr5(ll,i)=gradcorr5(ll,i)+ghalf+ekont*derx(ll,2,1)
+        gradcorr5(ll,i)=gradcorr5(ll,i)+ekont*derx(ll,2,1)
         gradcorr5(ll,i+1)=gradcorr5(ll,i+1)+ekont*derx(ll,3,1)
-        gradcorr5(ll,j)=gradcorr5(ll,j)+ghalf+ekont*derx(ll,4,1)
+        gradcorr5(ll,j)=gradcorr5(ll,j)+ekont*derx(ll,4,1)
         gradcorr5(ll,j1)=gradcorr5(ll,j1)+ekont*derx(ll,5,1)
+        gradcorr5_long(ll,j)=gradcorr5_long(ll,j)+gradcorr5ij
+        gradcorr5_long(ll,i)=gradcorr5_long(ll,i)-gradcorr5ij
 cold        ghalf=0.5d0*eel5*eij*gacont_hbr(ll,kk,k)
-        ghalf=0.5d0*ggg2(ll)
+cgrad        ghalf=0.5d0*ggg2(ll)
 cd        ghalf=0.0d0
-        gradcorr5(ll,k)=gradcorr5(ll,k)+ghalf+ekont*derx(ll,2,2)
+        gradcorr5(ll,k)=gradcorr5(ll,k)+ekont*derx(ll,2,2)
         gradcorr5(ll,k+1)=gradcorr5(ll,k+1)+ekont*derx(ll,3,2)
-        gradcorr5(ll,l)=gradcorr5(ll,l)+ghalf+ekont*derx(ll,4,2)
+        gradcorr5(ll,l)=gradcorr5(ll,l)+ekont*derx(ll,4,2)
         gradcorr5(ll,l1)=gradcorr5(ll,l1)+ekont*derx(ll,5,2)
+        gradcorr5_long(ll,l)=gradcorr5_long(ll,l)+gradcorr5kl
+        gradcorr5_long(ll,k)=gradcorr5_long(ll,k)-gradcorr5kl
       enddo
+      endif ! calc_grad
 cd      goto 1112
-      do m=i+1,j-1
-        do ll=1,3
+cgrad      do m=i+1,j-1
+cgrad        do ll=1,3
 cold          gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*ekl*gacont_hbr(ll,jj,i)
-          gradcorr5(ll,m)=gradcorr5(ll,m)+ggg1(ll)
-        enddo
-      enddo
-      do m=k+1,l-1
-        do ll=1,3
+cgrad          gradcorr5(ll,m)=gradcorr5(ll,m)+ggg1(ll)
+cgrad        enddo
+cgrad      enddo
+cgrad      do m=k+1,l-1
+cgrad        do ll=1,3
 cold          gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*eij*gacont_hbr(ll,kk,k)
-          gradcorr5(ll,m)=gradcorr5(ll,m)+ggg2(ll)
-        enddo
-      enddo
+cgrad          gradcorr5(ll,m)=gradcorr5(ll,m)+ggg2(ll)
+cgrad        enddo
+cgrad      enddo
 c1112  continue
-      do m=i+2,j2
-        do ll=1,3
-          gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,1)
-        enddo
-      enddo
-      do m=k+2,l2
-        do ll=1,3
-          gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,2)
-        enddo
-      enddo 
+cgrad      do m=i+2,j2
+cgrad        do ll=1,3
+cgrad          gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,1)
+cgrad        enddo
+cgrad      enddo
+cgrad      do m=k+2,l2
+cgrad        do ll=1,3
+cgrad          gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,2)
+cgrad        enddo
+cgrad      enddo 
 cd      do iii=1,nres-3
 cd        write (2,*) iii,g_corr5_loc(iii)
 cd      enddo
-      endif
       eello5=ekont*eel5
 cd      write (2,*) 'ekont',ekont
 cd      write (iout,*) 'eello5',ekont*eel5
@@ -6119,7 +7709,6 @@ c--------------------------------------------------------------------------
       double precision function eello6(i,j,k,l,jj,kk)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
@@ -6179,12 +7768,12 @@ cd      ekont=1.0d0
       endif
 C If turn contributions are considered, they will be handled separately.
       eel6=eello6_1+eello6_2+eello6_3+eello6_4+eello6_5+eello6_6
-cd      write(iout,*) 'eello6_1',eello6_1,' eel6_1_num',16*eel6_1_num
-cd      write(iout,*) 'eello6_2',eello6_2,' eel6_2_num',16*eel6_2_num
-cd      write(iout,*) 'eello6_3',eello6_3,' eel6_3_num',16*eel6_3_num
-cd      write(iout,*) 'eello6_4',eello6_4,' eel6_4_num',16*eel6_4_num
-cd      write(iout,*) 'eello6_5',eello6_5,' eel6_5_num',16*eel6_5_num
-cd      write(iout,*) 'eello6_6',eello6_6,' eel6_6_num',16*eel6_6_num
+cd      write(iout,*) 'eello6_1',eello6_1!,' eel6_1_num',16*eel6_1_num
+cd      write(iout,*) 'eello6_2',eello6_2!,' eel6_2_num',16*eel6_2_num
+cd      write(iout,*) 'eello6_3',eello6_3!,' eel6_3_num',16*eel6_3_num
+cd      write(iout,*) 'eello6_4',eello6_4!,' eel6_4_num',16*eel6_4_num
+cd      write(iout,*) 'eello6_5',eello6_5!,' eel6_5_num',16*eel6_5_num
+cd      write(iout,*) 'eello6_6',eello6_6!,' eel6_6_num',16*eel6_6_num
 cd      goto 1112
       if (calc_grad) then
       if (j.lt.nres-1) then
@@ -6202,51 +7791,57 @@ cd      goto 1112
         l2=l-2
       endif
       do ll=1,3
-        ggg1(ll)=eel6*g_contij(ll,1)
-        ggg2(ll)=eel6*g_contij(ll,2)
+cgrad        ggg1(ll)=eel6*g_contij(ll,1)
+cgrad        ggg2(ll)=eel6*g_contij(ll,2)
 cold        ghalf=0.5d0*eel6*ekl*gacont_hbr(ll,jj,i)
-        ghalf=0.5d0*ggg1(ll)
+cgrad        ghalf=0.5d0*ggg1(ll)
 cd        ghalf=0.0d0
-        gradcorr6(ll,i)=gradcorr6(ll,i)+ghalf+ekont*derx(ll,2,1)
+        gradcorr6ij=eel6*g_contij(ll,1)+ekont*derx(ll,1,1)
+        gradcorr6kl=eel6*g_contij(ll,2)+ekont*derx(ll,1,2)
+        gradcorr6(ll,i)=gradcorr6(ll,i)+ekont*derx(ll,2,1)
         gradcorr6(ll,i+1)=gradcorr6(ll,i+1)+ekont*derx(ll,3,1)
-        gradcorr6(ll,j)=gradcorr6(ll,j)+ghalf+ekont*derx(ll,4,1)
+        gradcorr6(ll,j)=gradcorr6(ll,j)+ekont*derx(ll,4,1)
         gradcorr6(ll,j1)=gradcorr6(ll,j1)+ekont*derx(ll,5,1)
-        ghalf=0.5d0*ggg2(ll)
+        gradcorr6_long(ll,j)=gradcorr6_long(ll,j)+gradcorr6ij
+        gradcorr6_long(ll,i)=gradcorr6_long(ll,i)-gradcorr6ij
+cgrad        ghalf=0.5d0*ggg2(ll)
 cold        ghalf=0.5d0*eel6*eij*gacont_hbr(ll,kk,k)
 cd        ghalf=0.0d0
-        gradcorr6(ll,k)=gradcorr6(ll,k)+ghalf+ekont*derx(ll,2,2)
+        gradcorr6(ll,k)=gradcorr6(ll,k)+ekont*derx(ll,2,2)
         gradcorr6(ll,k+1)=gradcorr6(ll,k+1)+ekont*derx(ll,3,2)
-        gradcorr6(ll,l)=gradcorr6(ll,l)+ghalf+ekont*derx(ll,4,2)
+        gradcorr6(ll,l)=gradcorr6(ll,l)+ekont*derx(ll,4,2)
         gradcorr6(ll,l1)=gradcorr6(ll,l1)+ekont*derx(ll,5,2)
+        gradcorr6_long(ll,l)=gradcorr6_long(ll,l)+gradcorr6kl
+        gradcorr6_long(ll,k)=gradcorr6_long(ll,k)-gradcorr6kl
       enddo
+      endif ! calc_grad
 cd      goto 1112
-      do m=i+1,j-1
-        do ll=1,3
+cgrad      do m=i+1,j-1
+cgrad        do ll=1,3
 cold          gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*ekl*gacont_hbr(ll,jj,i)
-          gradcorr6(ll,m)=gradcorr6(ll,m)+ggg1(ll)
-        enddo
-      enddo
-      do m=k+1,l-1
-        do ll=1,3
+cgrad          gradcorr6(ll,m)=gradcorr6(ll,m)+ggg1(ll)
+cgrad        enddo
+cgrad      enddo
+cgrad      do m=k+1,l-1
+cgrad        do ll=1,3
 cold          gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*eij*gacont_hbr(ll,kk,k)
-          gradcorr6(ll,m)=gradcorr6(ll,m)+ggg2(ll)
-        enddo
-      enddo
-1112  continue
-      do m=i+2,j2
-        do ll=1,3
-          gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,1)
-        enddo
-      enddo
-      do m=k+2,l2
-        do ll=1,3
-          gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,2)
-        enddo
-      enddo 
+cgrad          gradcorr6(ll,m)=gradcorr6(ll,m)+ggg2(ll)
+cgrad        enddo
+cgrad      enddo
+cgrad1112  continue
+cgrad      do m=i+2,j2
+cgrad        do ll=1,3
+cgrad          gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,1)
+cgrad        enddo
+cgrad      enddo
+cgrad      do m=k+2,l2
+cgrad        do ll=1,3
+cgrad          gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,2)
+cgrad        enddo
+cgrad      enddo 
 cd      do iii=1,nres-3
 cd        write (2,*) iii,g_corr6_loc(iii)
 cd      enddo
-      endif
       eello6=ekont*eel6
 cd      write (2,*) 'ekont',ekont
 cd      write (iout,*) 'eello6',ekont*eel6
@@ -6256,7 +7851,6 @@ c--------------------------------------------------------------------------
       double precision function eello6_graph1(i,j,k,l,imat,swap)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
@@ -6270,7 +7864,7 @@ c--------------------------------------------------------------------------
       logical lprn
       common /kutas/ lprn
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-C                                                                              C 
+C                                                                              C
 C      Parallel       Antiparallel                                             C
 C                                                                              C
 C          o             o                                                     C
@@ -6283,7 +7877,7 @@ C       o     o       o     o                                                  C
 C       i             i                                                        C
 C                                                                              C
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-      itk=itortyp(itype(k))
+      itk=itype2loc(itype(k))
       s1= scalar2(AEAb1(1,2,imat),CUgb2(1,i))
       s2=-scalar2(AEAb2(1,1,imat),Ug2Db1t(1,k))
       s3= scalar2(AEAb2(1,1,imat),CUgb2(1,k))
@@ -6292,12 +7886,12 @@ CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
       vv1(1)=pizda1(1,1)-pizda1(2,2)
       vv1(2)=pizda1(1,2)+pizda1(2,1)
       s4=0.5d0*scalar2(vv1(1),Dtobr2(1,i))
-      vv(1)=AEAb1(1,2,imat)*b1(1,itk)-AEAb1(2,2,imat)*b1(2,itk)
-      vv(2)=AEAb1(1,2,imat)*b1(2,itk)+AEAb1(2,2,imat)*b1(1,itk)
+      vv(1)=AEAb1(1,2,imat)*b1(1,k)-AEAb1(2,2,imat)*b1(2,k)
+      vv(2)=AEAb1(1,2,imat)*b1(2,k)+AEAb1(2,2,imat)*b1(1,k)
       s5=scalar2(vv(1),Dtobr2(1,i))
 cd      write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4', s4,' s5',s5
       eello6_graph1=-0.5d0*(s1+s2+s3+s4+s5)
-      if (.not. calc_grad) return
+      if (calc_grad) then
       if (i.gt.1) g_corr6_loc(i-1)=g_corr6_loc(i-1)
      & -0.5d0*ekont*(scalar2(AEAb1(1,2,imat),CUgb2der(1,i))
      & -scalar2(AEAb2derg(1,2,1,imat),Ug2Db1t(1,k))
@@ -6307,8 +7901,8 @@ cd      write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4', s4,' s5',s5
       call matmat2(AEAderg(1,1,imat),auxmat(1,1),pizda1(1,1))
       vv1(1)=pizda1(1,1)-pizda1(2,2)
       vv1(2)=pizda1(1,2)+pizda1(2,1)
-      vv(1)=AEAb1derg(1,2,imat)*b1(1,itk)-AEAb1derg(2,2,imat)*b1(2,itk)
-      vv(2)=AEAb1derg(1,2,imat)*b1(2,itk)+AEAb1derg(2,2,imat)*b1(1,itk)
+      vv(1)=AEAb1derg(1,2,imat)*b1(1,k)-AEAb1derg(2,2,imat)*b1(2,k)
+      vv(2)=AEAb1derg(1,2,imat)*b1(2,k)+AEAb1derg(2,2,imat)*b1(1,k)
       if (l.eq.j+1) then
         g_corr6_loc(l-1)=g_corr6_loc(l-1)
      & +ekont*(-0.5d0*(scalar2(AEAb1derg(1,2,imat),CUgb2(1,i))
@@ -6347,22 +7941,22 @@ cd      write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4', s4,' s5',s5
             vv1(1)=pizda1(1,1)-pizda1(2,2)
             vv1(2)=pizda1(1,2)+pizda1(2,1)
             s4=0.5d0*scalar2(vv1(1),Dtobr2(1,i))
-            vv(1)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(1,itk)
-     &       -AEAb1derx(2,lll,kkk,iii,2,imat)*b1(2,itk)
-            vv(2)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(2,itk)
-     &       +AEAb1derx(2,lll,kkk,iii,2,imat)*b1(1,itk)
+            vv(1)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(1,k)
+     &       -AEAb1derx(2,lll,kkk,iii,2,imat)*b1(2,k)
+            vv(2)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(2,k)
+     &       +AEAb1derx(2,lll,kkk,iii,2,imat)*b1(1,k)
             s5=scalar2(vv(1),Dtobr2(1,i))
             derx(lll,kkk,ind)=derx(lll,kkk,ind)-0.5d0*(s1+s2+s3+s4+s5)
           enddo
         enddo
       enddo
+      endif ! calc_grad
       return
       end
 c----------------------------------------------------------------------------
       double precision function eello6_graph2(i,j,k,l,jj,kk,swap)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
@@ -6373,22 +7967,22 @@ c----------------------------------------------------------------------------
       include 'COMMON.GEO'
       logical swap
       double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2),
-     & auxvec1(2),auxvec2(1),auxmat1(2,2)
+     & auxvec1(2),auxvec2(2),auxmat1(2,2)
       logical lprn
       common /kutas/ lprn
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-C                                                                              C 
+C                                                                              C
 C      Parallel       Antiparallel                                             C
 C                                                                              C
 C          o             o                                                     C
 C     \   /l\           /j\   /                                                C
 C      \ /   \         /   \ /                                                 C
-C       o| o |         | o |o                                                  C
+C       o| o |         | o |o                                                  C                
 C     \ j|/k\|      \  |/k\|l                                                  C
 C      \ /   \       \ /   \                                                   C
 C       o             o                                                        C
-C       i             i                                                        C
-C                                                                              C
+C       i             i                                                        C 
+C                                                                              C           
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 cd      write (2,*) 'eello6_graph2: i,',i,' j',j,' k',k,' l',l
 C AL 7/4/01 s1 would occur in the sixth-order moment, 
@@ -6412,8 +8006,8 @@ cd      write (2,*) 'eello6_graph2:','s1',s1,' s2',s2,' s3',s3,' s4',s4
       eello6_graph2=-(s2+s3+s4)
 #endif
 c      eello6_graph2=-s3
-      if (.not. calc_grad) return
 C Derivatives in gamma(i-1)
+      if (calc_grad) then
       if (i.gt.1) then
 #ifdef MOMENT
         s1=dipderg(1,jj,i)*dip(1,kk,k)
@@ -6543,13 +8137,13 @@ cd            write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4',s4
           enddo
         enddo
       enddo
+      endif ! calc_grad
       return
       end
 c----------------------------------------------------------------------------
       double precision function eello6_graph3(i,j,k,l,jj,kk,swap)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
@@ -6561,11 +8155,11 @@ c----------------------------------------------------------------------------
       double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2)
       logical swap
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-C                                                                              C
+C                                                                              C 
 C      Parallel       Antiparallel                                             C
 C                                                                              C
-C          o             o                                                     C
-C         /l\   /   \   /j\                                                    C
+C          o             o                                                     C 
+C         /l\   /   \   /j\                                                    C 
 C        /   \ /     \ /   \                                                   C
 C       /| o |o       o| o |\                                                  C
 C       j|/k\|  /      |/k\|l /                                                C
@@ -6579,45 +8173,46 @@ C 4/7/01 AL Component s1 was removed, because it pertains to the respective
 C           energy moment and not to the cluster cumulant.
       iti=itortyp(itype(i))
       if (j.lt.nres-1) then
-        itj1=itortyp(itype(j+1))
+        itj1=itype2loc(itype(j+1))
       else
-        itj1=ntortyp+1
+        itj1=nloctyp
       endif
-      itk=itortyp(itype(k))
-      itk1=itortyp(itype(k+1))
+      itk=itype2loc(itype(k))
+      itk1=itype2loc(itype(k+1))
       if (l.lt.nres-1) then
-        itl1=itortyp(itype(l+1))
+        itl1=itype2loc(itype(l+1))
       else
-        itl1=ntortyp+1
+        itl1=nloctyp
       endif
 #ifdef MOMENT
       s1=dip(4,jj,i)*dip(4,kk,k)
 #endif
-      call matvec2(AECA(1,1,1),b1(1,itk1),auxvec(1))
-      s2=0.5d0*scalar2(b1(1,itk),auxvec(1))
-      call matvec2(AECA(1,1,2),b1(1,itl1),auxvec(1))
-      s3=0.5d0*scalar2(b1(1,itj1),auxvec(1))
-      call transpose2(EE(1,1,itk),auxmat(1,1))
+      call matvec2(AECA(1,1,1),b1(1,k+1),auxvec(1))
+      s2=0.5d0*scalar2(b1(1,k),auxvec(1))
+      call matvec2(AECA(1,1,2),b1(1,l+1),auxvec(1))
+      s3=0.5d0*scalar2(b1(1,j+1),auxvec(1))
+      call transpose2(EE(1,1,k),auxmat(1,1))
       call matmat2(auxmat(1,1),AECA(1,1,1),pizda(1,1))
       vv(1)=pizda(1,1)+pizda(2,2)
       vv(2)=pizda(2,1)-pizda(1,2)
       s4=-0.25d0*scalar2(vv(1),Ctobr(1,k))
-cd      write (2,*) 'eello6_graph3:','s1',s1,' s2',s2,' s3',s3,' s4',s4
+cd      write (2,*) 'eello6_graph3:','s1',s1,' s2',s2,' s3',s3,' s4',s4,
+cd     & "sum",-(s2+s3+s4)
 #ifdef MOMENT
       eello6_graph3=-(s1+s2+s3+s4)
 #else
       eello6_graph3=-(s2+s3+s4)
 #endif
 c      eello6_graph3=-s4
-      if (.not. calc_grad) return
 C Derivatives in gamma(k-1)
-      call matvec2(AECAderg(1,1,2),b1(1,itl1),auxvec(1))
-      s3=0.5d0*scalar2(b1(1,itj1),auxvec(1))
+      if (calc_grad) then
+      call matvec2(AECAderg(1,1,2),b1(1,l+1),auxvec(1))
+      s3=0.5d0*scalar2(b1(1,j+1),auxvec(1))
       s4=-0.25d0*scalar2(vv(1),Ctobrder(1,k))
       g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s3+s4)
 C Derivatives in gamma(l-1)
-      call matvec2(AECAderg(1,1,1),b1(1,itk1),auxvec(1))
-      s2=0.5d0*scalar2(b1(1,itk),auxvec(1))
+      call matvec2(AECAderg(1,1,1),b1(1,k+1),auxvec(1))
+      s2=0.5d0*scalar2(b1(1,k),auxvec(1))
       call matmat2(auxmat(1,1),AECAderg(1,1,1),pizda(1,1))
       vv(1)=pizda(1,1)+pizda(2,2)
       vv(2)=pizda(2,1)-pizda(1,2)
@@ -6634,12 +8229,12 @@ C Cartesian derivatives.
               s1=dip(4,jj,i)*dipderx(lll,kkk,4,kk,k)
             endif
 #endif
-            call matvec2(AECAderx(1,1,lll,kkk,iii,1),b1(1,itk1),
+            call matvec2(AECAderx(1,1,lll,kkk,iii,1),b1(1,k+1),
      &        auxvec(1))
-            s2=0.5d0*scalar2(b1(1,itk),auxvec(1))
-            call matvec2(AECAderx(1,1,lll,kkk,iii,2),b1(1,itl1),
+            s2=0.5d0*scalar2(b1(1,k),auxvec(1))
+            call matvec2(AECAderx(1,1,lll,kkk,iii,2),b1(1,l+1),
      &        auxvec(1))
-            s3=0.5d0*scalar2(b1(1,itj1),auxvec(1))
+            s3=0.5d0*scalar2(b1(1,j+1),auxvec(1))
             call matmat2(auxmat(1,1),AECAderx(1,1,lll,kkk,iii,1),
      &        pizda(1,1))
             vv(1)=pizda(1,1)+pizda(2,2)
@@ -6659,13 +8254,13 @@ c            derx(lll,kkk,iii)=derx(lll,kkk,iii)-s4
           enddo
         enddo
       enddo
+      endif ! calc_grad
       return
       end
 c----------------------------------------------------------------------------
       double precision function eello6_graph4(i,j,k,l,jj,kk,imat,swap)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
@@ -6679,7 +8274,7 @@ c----------------------------------------------------------------------------
      & auxvec1(2),auxmat1(2,2)
       logical swap
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-C                                                                              C
+C                                                                              C                       
 C      Parallel       Antiparallel                                             C
 C                                                                              C
 C          o             o                                                     C
@@ -6687,33 +8282,33 @@ C         /l\   /   \   /j\                                                    C
 C        /   \ /     \ /   \                                                   C
 C       /| o |o       o| o |\                                                  C
 C     \ j|/k\|      \  |/k\|l                                                  C
-C      \ /   \       \ /   \                                                   C
+C      \ /   \       \ /   \                                                   C 
 C       o     \       o     \                                                  C
 C       i             i                                                        C
-C                                                                              C
+C                                                                              C 
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 C
 C 4/7/01 AL Component s1 was removed, because it pertains to the respective 
 C           energy moment and not to the cluster cumulant.
 cd      write (2,*) 'eello_graph4: wturn6',wturn6
-      iti=itortyp(itype(i))
-      itj=itortyp(itype(j))
+      iti=itype2loc(itype(i))
+      itj=itype2loc(itype(j))
       if (j.lt.nres-1) then
-        itj1=itortyp(itype(j+1))
+        itj1=itype2loc(itype(j+1))
       else
-        itj1=ntortyp+1
+        itj1=nloctyp
       endif
-      itk=itortyp(itype(k))
+      itk=itype2loc(itype(k))
       if (k.lt.nres-1) then
-        itk1=itortyp(itype(k+1))
+        itk1=itype2loc(itype(k+1))
       else
-        itk1=ntortyp+1
+        itk1=nloctyp
       endif
-      itl=itortyp(itype(l))
+      itl=itype2loc(itype(l))
       if (l.lt.nres-1) then
-        itl1=itortyp(itype(l+1))
+        itl1=itype2loc(itype(l+1))
       else
-        itl1=ntortyp+1
+        itl1=nloctyp
       endif
 cd      write (2,*) 'eello6_graph4:','i',i,' j',j,' k',k,' l',l
 cd      write (2,*) 'iti',iti,' itj',itj,' itj1',itj1,' itk',itk,
@@ -6728,11 +8323,11 @@ cd     & ' itl',itl,' itl1',itl1
       call matvec2(AECA(1,1,imat),Ub2(1,k),auxvec(1))
       s2=0.5d0*scalar2(Ub2(1,i),auxvec(1))
       if (j.eq.l+1) then
-        call matvec2(ADtEA1(1,1,3-imat),b1(1,itj1),auxvec1(1))
-        s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1))
+        call matvec2(ADtEA1(1,1,3-imat),b1(1,j+1),auxvec1(1))
+        s3=-0.5d0*scalar2(b1(1,j),auxvec1(1))
       else
-        call matvec2(ADtEA1(1,1,3-imat),b1(1,itl1),auxvec1(1))
-        s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1))
+        call matvec2(ADtEA1(1,1,3-imat),b1(1,l+1),auxvec1(1))
+        s3=-0.5d0*scalar2(b1(1,l),auxvec1(1))
       endif
       call transpose2(EUg(1,1,k),auxmat(1,1))
       call matmat2(AECA(1,1,imat),auxmat(1,1),pizda(1,1))
@@ -6745,8 +8340,8 @@ cd      write (2,*) 'eello6_graph4:','s1',s1,' s2',s2,' s3',s3,' s4',s4
 #else
       eello6_graph4=-(s2+s3+s4)
 #endif
-      if (.not. calc_grad) return
 C Derivatives in gamma(i-1)
+      if (calc_grad) then
       if (i.gt.1) then
 #ifdef MOMENT
         if (imat.eq.1) then
@@ -6757,11 +8352,11 @@ C Derivatives in gamma(i-1)
 #endif
         s2=0.5d0*scalar2(Ub2der(1,i),auxvec(1))
         if (j.eq.l+1) then
-          call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,itj1),auxvec1(1))
-          s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1))
+          call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,j+1),auxvec1(1))
+          s3=-0.5d0*scalar2(b1(1,j),auxvec1(1))
         else
-          call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,itl1),auxvec1(1))
-          s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1))
+          call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,l+1),auxvec1(1))
+          s3=-0.5d0*scalar2(b1(1,l),auxvec1(1))
         endif
         s4=0.25d0*scalar2(vv(1),Dtobr2der(1,i))
         if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then
@@ -6790,11 +8385,11 @@ C Derivatives in gamma(k-1)
       call matvec2(AECA(1,1,imat),Ub2der(1,k),auxvec1(1))
       s2=0.5d0*scalar2(Ub2(1,i),auxvec1(1))
       if (j.eq.l+1) then
-        call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,itj1),auxvec1(1))
-        s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1))
+        call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,j+1),auxvec1(1))
+        s3=-0.5d0*scalar2(b1(1,j),auxvec1(1))
       else
-        call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,itl1),auxvec1(1))
-        s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1))
+        call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,l+1),auxvec1(1))
+        s3=-0.5d0*scalar2(b1(1,l),auxvec1(1))
       endif
       call transpose2(EUgder(1,1,k),auxmat1(1,1))
       call matmat2(AECA(1,1,imat),auxmat1(1,1),pizda(1,1))
@@ -6860,12 +8455,12 @@ C Cartesian derivatives.
             s2=0.5d0*scalar2(Ub2(1,i),auxvec(1))
             if (j.eq.l+1) then
               call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat),
-     &          b1(1,itj1),auxvec(1))
-              s3=-0.5d0*scalar2(b1(1,itj),auxvec(1))
+     &          b1(1,j+1),auxvec(1))
+              s3=-0.5d0*scalar2(b1(1,j),auxvec(1))
             else
               call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat),
-     &          b1(1,itl1),auxvec(1))
-              s3=-0.5d0*scalar2(b1(1,itl),auxvec(1))
+     &          b1(1,l+1),auxvec(1))
+              s3=-0.5d0*scalar2(b1(1,l),auxvec(1))
             endif
             call matmat2(AECAderx(1,1,lll,kkk,iii,imat),auxmat(1,1),
      &        pizda(1,1))
@@ -6905,13 +8500,13 @@ C Cartesian derivatives.
           enddo
         enddo
       enddo
+      endif ! calc_grad
       return
       end
 c----------------------------------------------------------------------------
       double precision function eello_turn6(i,jj,kk)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
-      include 'sizesclu.dat'
       include 'COMMON.IOUNITS'
       include 'COMMON.CHAIN'
       include 'COMMON.DERIV'
@@ -6927,15 +8522,19 @@ c----------------------------------------------------------------------------
      &  atempd(2,2),auxmatd(2,2),achuj_tempd(2,2),gtempd(2,2),gvecd(2)
 C 4/7/01 AL Components s1, s8, and s13 were removed, because they pertain to
 C           the respective energy moment and not to the cluster cumulant.
+      s1=0.0d0
+      s8=0.0d0
+      s13=0.0d0
+c
       eello_turn6=0.0d0
       j=i+4
       k=i+1
       l=i+3
-      iti=itortyp(itype(i))
-      itk=itortyp(itype(k))
-      itk1=itortyp(itype(k+1))
-      itl=itortyp(itype(l))
-      itj=itortyp(itype(j))
+      iti=itype2loc(itype(i))
+      itk=itype2loc(itype(k))
+      itk1=itype2loc(itype(k+1))
+      itl=itype2loc(itype(l))
+      itj=itype2loc(itype(j))
 cd      write (2,*) 'itk',itk,' itk1',itk1,' itl',itl,' itj',itj
 cd      write (2,*) 'i',i,' k',k,' j',j,' l',l
 cd      if (i.ne.1 .or. j.ne.3 .or. k.ne.2 .or. l.ne.4) then
@@ -6962,21 +8561,17 @@ cd      write (2,*) 'eello6_5',eello6_5
 #ifdef MOMENT
       call transpose2(AEA(1,1,1),auxmat(1,1))
       call matmat2(EUg(1,1,i+1),auxmat(1,1),auxmat(1,1))
-      ss1=scalar2(Ub2(1,i+2),b1(1,itl))
+      ss1=scalar2(Ub2(1,i+2),b1(1,l))
       s1 = (auxmat(1,1)+auxmat(2,2))*ss1
-#else
-      s1 = 0.0d0
 #endif
-      call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1(1))
+      call matvec2(EUg(1,1,i+2),b1(1,l),vtemp1(1))
       call matvec2(AEA(1,1,1),vtemp1(1),vtemp1(1))
-      s2 = scalar2(b1(1,itk),vtemp1(1))
+      s2 = scalar2(b1(1,k),vtemp1(1))
 #ifdef MOMENT
       call transpose2(AEA(1,1,2),atemp(1,1))
       call matmat2(atemp(1,1),EUg(1,1,i+4),atemp(1,1))
-      call matvec2(Ug2(1,1,i+2),dd(1,1,itk1),vtemp2(1))
-      s8 = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,itl),vtemp2(1))
-#else
-      s8=0.0d0
+      call matvec2(Ug2(1,1,i+2),dd(1,1,k+1),vtemp2(1))
+      s8 = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,l),vtemp2(1))
 #endif
       call matmat2(EUg(1,1,i+3),AEA(1,1,2),auxmat(1,1))
       call matvec2(auxmat(1,1),Ub2(1,i+4),vtemp3(1))
@@ -6986,10 +8581,8 @@ cd      write (2,*) 'eello6_5',eello6_5
       call matmat2(achuj_temp(1,1),EUg(1,1,i+2),gtemp(1,1))
       call matmat2(gtemp(1,1),EUg(1,1,i+3),gtemp(1,1)) 
       call matvec2(a_chuj(1,1,jj,i),Ub2(1,i+4),vtemp4(1)) 
-      ss13 = scalar2(b1(1,itk),vtemp4(1))
+      ss13 = scalar2(b1(1,k),vtemp4(1))
       s13 = (gtemp(1,1)+gtemp(2,2))*ss13
-#else
-      s13=0.0d0
 #endif
 c      write (2,*) 's1,s2,s8,s12,s13',s1,s2,s8,s12,s13
 c      s1=0.0d0
@@ -6998,17 +8591,17 @@ c      s8=0.0d0
 c      s12=0.0d0
 c      s13=0.0d0
       eel_turn6 = eello6_5 - 0.5d0*(s1+s2+s12+s8+s13)
-      if (calc_grad) then
 C Derivatives in gamma(i+2)
+      if (calc_grad) then
+      s1d =0.0d0
+      s8d =0.0d0
 #ifdef MOMENT
       call transpose2(AEA(1,1,1),auxmatd(1,1))
       call matmat2(EUgder(1,1,i+1),auxmatd(1,1),auxmatd(1,1))
       s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1
       call transpose2(AEAderg(1,1,2),atempd(1,1))
       call matmat2(atempd(1,1),EUg(1,1,i+4),atempd(1,1))
-      s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,itl),vtemp2(1))
-#else
-      s8d=0.0d0
+      s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,l),vtemp2(1))
 #endif
       call matmat2(EUg(1,1,i+3),AEAderg(1,1,2),auxmatd(1,1))
       call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1))
@@ -7023,25 +8616,21 @@ C Derivatives in gamma(i+3)
 #ifdef MOMENT
       call transpose2(AEA(1,1,1),auxmatd(1,1))
       call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1))
-      ss1d=scalar2(Ub2der(1,i+2),b1(1,itl))
+      ss1d=scalar2(Ub2der(1,i+2),b1(1,l))
       s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1d
-#else
-      s1d=0.0d0
 #endif
-      call matvec2(EUgder(1,1,i+2),b1(1,itl),vtemp1d(1))
+      call matvec2(EUgder(1,1,i+2),b1(1,l),vtemp1d(1))
       call matvec2(AEA(1,1,1),vtemp1d(1),vtemp1d(1))
-      s2d = scalar2(b1(1,itk),vtemp1d(1))
+      s2d = scalar2(b1(1,k),vtemp1d(1))
 #ifdef MOMENT
-      call matvec2(Ug2der(1,1,i+2),dd(1,1,itk1),vtemp2d(1))
-      s8d = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,itl),vtemp2d(1))
+      call matvec2(Ug2der(1,1,i+2),dd(1,1,k+1),vtemp2d(1))
+      s8d = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,l),vtemp2d(1))
 #endif
       s12d = scalar2(Ub2der(1,i+2),vtemp3(1))
 #ifdef MOMENT
       call matmat2(achuj_temp(1,1),EUgder(1,1,i+2),gtempd(1,1))
       call matmat2(gtempd(1,1),EUg(1,1,i+3),gtempd(1,1)) 
       s13d = (gtempd(1,1)+gtempd(2,2))*ss13
-#else
-      s13d=0.0d0
 #endif
 c      s1d=0.0d0
 c      s2d=0.0d0
@@ -7063,8 +8652,6 @@ C Derivatives in gamma(i+4)
       call matmat2(achuj_temp(1,1),EUg(1,1,i+2),gtempd(1,1))
       call matmat2(gtempd(1,1),EUgder(1,1,i+3),gtempd(1,1)) 
       s13d = (gtempd(1,1)+gtempd(2,2))*ss13
-#else
-      s13d = 0.0d0
 #endif
 c      s1d=0.0d0
 c      s2d=0.0d0
@@ -7081,27 +8668,21 @@ C Derivatives in gamma(i+5)
       call transpose2(AEAderg(1,1,1),auxmatd(1,1))
       call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1))
       s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1
-#else
-      s1d = 0.0d0
 #endif
-      call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1d(1))
+      call matvec2(EUg(1,1,i+2),b1(1,l),vtemp1d(1))
       call matvec2(AEAderg(1,1,1),vtemp1d(1),vtemp1d(1))
-      s2d = scalar2(b1(1,itk),vtemp1d(1))
+      s2d = scalar2(b1(1,k),vtemp1d(1))
 #ifdef MOMENT
       call transpose2(AEA(1,1,2),atempd(1,1))
       call matmat2(atempd(1,1),EUgder(1,1,i+4),atempd(1,1))
-      s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,itl),vtemp2(1))
-#else
-      s8d = 0.0d0
+      s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,l),vtemp2(1))
 #endif
       call matvec2(auxmat(1,1),Ub2der(1,i+4),vtemp3d(1))
       s12d = scalar2(Ub2(1,i+2),vtemp3d(1))
 #ifdef MOMENT
       call matvec2(a_chuj(1,1,jj,i),Ub2der(1,i+4),vtemp4d(1)) 
-      ss13d = scalar2(b1(1,itk),vtemp4d(1))
+      ss13d = scalar2(b1(1,k),vtemp4d(1))
       s13d = (gtemp(1,1)+gtemp(2,2))*ss13d
-#else
-      s13d = 0.0d0
 #endif
 c      s1d=0.0d0
 c      s2d=0.0d0
@@ -7123,20 +8704,16 @@ C Cartesian derivatives
             call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmatd(1,1))
             call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1))
             s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1
-#else
-            s1d = 0.0d0
 #endif
-            call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1(1))
+            call matvec2(EUg(1,1,i+2),b1(1,l),vtemp1(1))
             call matvec2(AEAderx(1,1,lll,kkk,iii,1),vtemp1(1),
      &          vtemp1d(1))
-            s2d = scalar2(b1(1,itk),vtemp1d(1))
+            s2d = scalar2(b1(1,k),vtemp1d(1))
 #ifdef MOMENT
             call transpose2(AEAderx(1,1,lll,kkk,iii,2),atempd(1,1))
             call matmat2(atempd(1,1),EUg(1,1,i+4),atempd(1,1))
             s8d = -(atempd(1,1)+atempd(2,2))*
-     &           scalar2(cc(1,1,itl),vtemp2(1))
-#else
-            s8d = 0.0d0
+     &           scalar2(cc(1,1,l),vtemp2(1))
 #endif
             call matmat2(EUg(1,1,i+3),AEAderx(1,1,lll,kkk,iii,2),
      &           auxmatd(1,1))
@@ -7175,7 +8752,7 @@ c      s13d=0.0d0
           derx_turn(lll,kkk,2) = derx_turn(lll,kkk,2)-0.5d0*s13d
           call matvec2(a_chuj_der(1,1,lll,kkk,jj,i),Ub2(1,i+4),
      &      vtemp4d(1)) 
-          ss13d = scalar2(b1(1,itk),vtemp4d(1))
+          ss13d = scalar2(b1(1,k),vtemp4d(1))
           s13d = (gtemp(1,1)+gtemp(2,2))*ss13d
           derx_turn(lll,kkk,1) = derx_turn(lll,kkk,1)-0.5d0*s13d
         enddo
@@ -7199,57 +8776,183 @@ cd      goto 1112
         l2=l-2
       endif
       do ll=1,3
-        ggg1(ll)=eel_turn6*g_contij(ll,1)
-        ggg2(ll)=eel_turn6*g_contij(ll,2)
-        ghalf=0.5d0*ggg1(ll)
+cgrad        ggg1(ll)=eel_turn6*g_contij(ll,1)
+cgrad        ggg2(ll)=eel_turn6*g_contij(ll,2)
+cgrad        ghalf=0.5d0*ggg1(ll)
 cd        ghalf=0.0d0
-        gcorr6_turn(ll,i)=gcorr6_turn(ll,i)+ghalf
+        gturn6ij=eel_turn6*g_contij(ll,1)+ekont*derx_turn(ll,1,1)
+        gturn6kl=eel_turn6*g_contij(ll,2)+ekont*derx_turn(ll,1,2)
+        gcorr6_turn(ll,i)=gcorr6_turn(ll,i)!+ghalf
      &    +ekont*derx_turn(ll,2,1)
         gcorr6_turn(ll,i+1)=gcorr6_turn(ll,i+1)+ekont*derx_turn(ll,3,1)
-        gcorr6_turn(ll,j)=gcorr6_turn(ll,j)+ghalf
+        gcorr6_turn(ll,j)=gcorr6_turn(ll,j)!+ghalf
      &    +ekont*derx_turn(ll,4,1)
         gcorr6_turn(ll,j1)=gcorr6_turn(ll,j1)+ekont*derx_turn(ll,5,1)
-        ghalf=0.5d0*ggg2(ll)
+        gcorr6_turn_long(ll,j)=gcorr6_turn_long(ll,j)+gturn6ij
+        gcorr6_turn_long(ll,i)=gcorr6_turn_long(ll,i)-gturn6ij
+cgrad        ghalf=0.5d0*ggg2(ll)
 cd        ghalf=0.0d0
-        gcorr6_turn(ll,k)=gcorr6_turn(ll,k)+ghalf
+        gcorr6_turn(ll,k)=gcorr6_turn(ll,k)!+ghalf
      &    +ekont*derx_turn(ll,2,2)
         gcorr6_turn(ll,k+1)=gcorr6_turn(ll,k+1)+ekont*derx_turn(ll,3,2)
-        gcorr6_turn(ll,l)=gcorr6_turn(ll,l)+ghalf
+        gcorr6_turn(ll,l)=gcorr6_turn(ll,l)!+ghalf
      &    +ekont*derx_turn(ll,4,2)
         gcorr6_turn(ll,l1)=gcorr6_turn(ll,l1)+ekont*derx_turn(ll,5,2)
+        gcorr6_turn_long(ll,l)=gcorr6_turn_long(ll,l)+gturn6kl
+        gcorr6_turn_long(ll,k)=gcorr6_turn_long(ll,k)-gturn6kl
       enddo
 cd      goto 1112
-      do m=i+1,j-1
-        do ll=1,3
-          gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg1(ll)
-        enddo
-      enddo
-      do m=k+1,l-1
-        do ll=1,3
-          gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg2(ll)
-        enddo
-      enddo
-1112  continue
-      do m=i+2,j2
-        do ll=1,3
-          gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,1)
-        enddo
-      enddo
-      do m=k+2,l2
-        do ll=1,3
-          gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,2)
-        enddo
-      enddo 
+cgrad      do m=i+1,j-1
+cgrad        do ll=1,3
+cgrad          gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg1(ll)
+cgrad        enddo
+cgrad      enddo
+cgrad      do m=k+1,l-1
+cgrad        do ll=1,3
+cgrad          gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg2(ll)
+cgrad        enddo
+cgrad      enddo
+cgrad1112  continue
+cgrad      do m=i+2,j2
+cgrad        do ll=1,3
+cgrad          gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,1)
+cgrad        enddo
+cgrad      enddo
+cgrad      do m=k+2,l2
+cgrad        do ll=1,3
+cgrad          gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,2)
+cgrad        enddo
+cgrad      enddo 
 cd      do iii=1,nres-3
 cd        write (2,*) iii,g_corr6_loc(iii)
 cd      enddo
-      endif
+      endif ! calc_grad
       eello_turn6=ekont*eel_turn6
 cd      write (2,*) 'ekont',ekont
 cd      write (2,*) 'eel_turn6',ekont*eel_turn6
       return
       end
+
 crc-------------------------------------------------
+CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+      subroutine Eliptransfer(eliptran)
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.GEO'
+      include 'COMMON.VAR'
+      include 'COMMON.LOCAL'
+      include 'COMMON.CHAIN'
+      include 'COMMON.DERIV'
+      include 'COMMON.INTERACT'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.CALC'
+      include 'COMMON.CONTROL'
+      include 'COMMON.SPLITELE'
+      include 'COMMON.SBRIDGE'
+C this is done by Adasko
+C      print *,"wchodze"
+C structure of box:
+C      water
+C--bordliptop-- buffore starts
+C--bufliptop--- here true lipid starts
+C      lipid
+C--buflipbot--- lipid ends buffore starts
+C--bordlipbot--buffore ends
+      eliptran=0.0
+      do i=1,nres
+C       do i=1,1
+        if (itype(i).eq.ntyp1) cycle
+
+        positi=(mod(((c(3,i)+c(3,i+1))/2.0d0),boxzsize))
+        if (positi.le.0) positi=positi+boxzsize
+C        print *,i
+C first for peptide groups
+c for each residue check if it is in lipid or lipid water border area
+       if ((positi.gt.bordlipbot)
+     &.and.(positi.lt.bordliptop)) then
+C the energy transfer exist
+        if (positi.lt.buflipbot) then
+C what fraction I am in
+         fracinbuf=1.0d0-
+     &        ((positi-bordlipbot)/lipbufthick)
+C lipbufthick is thickenes of lipid buffore
+         sslip=sscalelip(fracinbuf)
+         ssgradlip=-sscagradlip(fracinbuf)/lipbufthick
+         eliptran=eliptran+sslip*pepliptran
+         gliptranc(3,i)=gliptranc(3,i)+ssgradlip*pepliptran/2.0d0
+         gliptranc(3,i-1)=gliptranc(3,i-1)+ssgradlip*pepliptran/2.0d0
+C         gliptranc(3,i-2)=gliptranc(3,i)+ssgradlip*pepliptran
+        elseif (positi.gt.bufliptop) then
+         fracinbuf=1.0d0-((bordliptop-positi)/lipbufthick)
+         sslip=sscalelip(fracinbuf)
+         ssgradlip=sscagradlip(fracinbuf)/lipbufthick
+         eliptran=eliptran+sslip*pepliptran
+         gliptranc(3,i)=gliptranc(3,i)+ssgradlip*pepliptran/2.0d0
+         gliptranc(3,i-1)=gliptranc(3,i-1)+ssgradlip*pepliptran/2.0d0
+C         gliptranc(3,i-2)=gliptranc(3,i)+ssgradlip*pepliptran
+C          print *, "doing sscalefor top part"
+C         print *,i,sslip,fracinbuf,ssgradlip
+        else
+         eliptran=eliptran+pepliptran
+C         print *,"I am in true lipid"
+        endif
+C       else
+C       eliptran=elpitran+0.0 ! I am in water
+       endif
+       enddo
+C       print *, "nic nie bylo w lipidzie?"
+C now multiply all by the peptide group transfer factor
+C       eliptran=eliptran*pepliptran
+C now the same for side chains
+CV       do i=1,1
+       do i=1,nres
+        if (itype(i).eq.ntyp1) cycle
+        positi=(mod(c(3,i+nres),boxzsize))
+        if (positi.le.0) positi=positi+boxzsize
+C       print *,mod(c(3,i+nres),boxzsize),bordlipbot,bordliptop
+c for each residue check if it is in lipid or lipid water border area
+C       respos=mod(c(3,i+nres),boxzsize)
+C       print *,positi,bordlipbot,buflipbot
+       if ((positi.gt.bordlipbot)
+     & .and.(positi.lt.bordliptop)) then
+C the energy transfer exist
+        if (positi.lt.buflipbot) then
+         fracinbuf=1.0d0-
+     &     ((positi-bordlipbot)/lipbufthick)
+C lipbufthick is thickenes of lipid buffore
+         sslip=sscalelip(fracinbuf)
+         ssgradlip=-sscagradlip(fracinbuf)/lipbufthick
+         eliptran=eliptran+sslip*liptranene(itype(i))
+         gliptranx(3,i)=gliptranx(3,i)
+     &+ssgradlip*liptranene(itype(i))
+         gliptranc(3,i-1)= gliptranc(3,i-1)
+     &+ssgradlip*liptranene(itype(i))
+C         print *,"doing sccale for lower part"
+        elseif (positi.gt.bufliptop) then
+         fracinbuf=1.0d0-
+     &((bordliptop-positi)/lipbufthick)
+         sslip=sscalelip(fracinbuf)
+         ssgradlip=sscagradlip(fracinbuf)/lipbufthick
+         eliptran=eliptran+sslip*liptranene(itype(i))
+         gliptranx(3,i)=gliptranx(3,i)
+     &+ssgradlip*liptranene(itype(i))
+         gliptranc(3,i-1)= gliptranc(3,i-1)
+     &+ssgradlip*liptranene(itype(i))
+C          print *, "doing sscalefor top part",sslip,fracinbuf
+        else
+         eliptran=eliptran+liptranene(itype(i))
+C         print *,"I am in true lipid"
+        endif
+        endif ! if in lipid or buffor
+C       else
+C       eliptran=elpitran+0.0 ! I am in water
+       enddo
+       return
+       end
+
+
+CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
+
       SUBROUTINE MATVEC2(A1,V1,V2)
       implicit real*8 (a-h,o-z)
       include 'DIMENSIONS'
@@ -7383,4 +9086,443 @@ C-----------------------------------------------------------------------------
       scalar=sc
       return
       end
+C-----------------------------------------------------------------------
+      double precision function sscale(r)
+      double precision r,gamm
+      include "COMMON.SPLITELE"
+      if(r.lt.r_cut-rlamb) then
+        sscale=1.0d0
+      else if(r.le.r_cut.and.r.ge.r_cut-rlamb) then
+        gamm=(r-(r_cut-rlamb))/rlamb
+        sscale=1.0d0+gamm*gamm*(2*gamm-3.0d0)
+      else
+        sscale=0d0
+      endif
+      return
+      end
+C-----------------------------------------------------------------------
+C-----------------------------------------------------------------------
+      double precision function sscagrad(r)
+      double precision r,gamm
+      include "COMMON.SPLITELE"
+      if(r.lt.r_cut-rlamb) then
+        sscagrad=0.0d0
+      else if(r.le.r_cut.and.r.ge.r_cut-rlamb) then
+        gamm=(r-(r_cut-rlamb))/rlamb
+        sscagrad=gamm*(6*gamm-6.0d0)/rlamb
+      else
+        sscagrad=0.0d0
+      endif
+      return
+      end
+C-----------------------------------------------------------------------
+C-----------------------------------------------------------------------
+      double precision function sscalelip(r)
+      double precision r,gamm
+      include "COMMON.SPLITELE"
+C      if(r.lt.r_cut-rlamb) then
+C        sscale=1.0d0
+C      else if(r.le.r_cut.and.r.ge.r_cut-rlamb) then
+C        gamm=(r-(r_cut-rlamb))/rlamb
+        sscalelip=1.0d0+r*r*(2*r-3.0d0)
+C      else
+C        sscale=0d0
+C      endif
+      return
+      end
+C-----------------------------------------------------------------------
+      double precision function sscagradlip(r)
+      double precision r,gamm
+      include "COMMON.SPLITELE"
+C     if(r.lt.r_cut-rlamb) then
+C        sscagrad=0.0d0
+C      else if(r.le.r_cut.and.r.ge.r_cut-rlamb) then
+C        gamm=(r-(r_cut-rlamb))/rlamb
+        sscagradlip=r*(6*r-6.0d0)
+C      else
+C        sscagrad=0.0d0
+C      endif
+      return
+      end
+
+C-----------------------------------------------------------------------
+       subroutine set_shield_fac
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.CHAIN'
+      include 'COMMON.DERIV'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.SHIELD'
+      include 'COMMON.INTERACT'
+C this is the squar root 77 devided by 81 the epislion in lipid (in protein)
+      double precision div77_81/0.974996043d0/,
+     &div4_81/0.2222222222d0/,sh_frac_dist_grad(3)
+
+C the vector between center of side_chain and peptide group
+       double precision pep_side(3),long,side_calf(3),
+     &pept_group(3),costhet_grad(3),cosphi_grad_long(3),
+     &cosphi_grad_loc(3),pep_side_norm(3),side_calf_norm(3)
+C the line belowe needs to be changed for FGPROC>1
+      do i=1,nres-1
+      if ((itype(i).eq.ntyp1).and.itype(i+1).eq.ntyp1) cycle
+      ishield_list(i)=0
+Cif there two consequtive dummy atoms there is no peptide group between them
+C the line below has to be changed for FGPROC>1
+      VolumeTotal=0.0
+      do k=1,nres
+       if ((itype(k).eq.ntyp1).or.(itype(k).eq.10)) cycle
+       dist_pep_side=0.0
+       dist_side_calf=0.0
+       do j=1,3
+C first lets set vector conecting the ithe side-chain with kth side-chain
+      pep_side(j)=c(j,k+nres)-(c(j,i)+c(j,i+1))/2.0d0
+C      pep_side(j)=2.0d0
+C and vector conecting the side-chain with its proper calfa
+      side_calf(j)=c(j,k+nres)-c(j,k)
+C      side_calf(j)=2.0d0
+      pept_group(j)=c(j,i)-c(j,i+1)
+C lets have their lenght
+      dist_pep_side=pep_side(j)**2+dist_pep_side
+      dist_side_calf=dist_side_calf+side_calf(j)**2
+      dist_pept_group=dist_pept_group+pept_group(j)**2
+      enddo
+       dist_pep_side=dsqrt(dist_pep_side)
+       dist_pept_group=dsqrt(dist_pept_group)
+       dist_side_calf=dsqrt(dist_side_calf)
+      do j=1,3
+        pep_side_norm(j)=pep_side(j)/dist_pep_side
+        side_calf_norm(j)=dist_side_calf
+      enddo
+C now sscale fraction
+       sh_frac_dist=-(dist_pep_side-rpp(1,1)-buff_shield)/buff_shield
+C       print *,buff_shield,"buff"
+C now sscale
+        if (sh_frac_dist.le.0.0) cycle
+C If we reach here it means that this side chain reaches the shielding sphere
+C Lets add him to the list for gradient       
+        ishield_list(i)=ishield_list(i)+1
+C ishield_list is a list of non 0 side-chain that contribute to factor gradient
+C this list is essential otherwise problem would be O3
+        shield_list(ishield_list(i),i)=k
+C Lets have the sscale value
+        if (sh_frac_dist.gt.1.0) then
+         scale_fac_dist=1.0d0
+         do j=1,3
+         sh_frac_dist_grad(j)=0.0d0
+         enddo
+        else
+         scale_fac_dist=-sh_frac_dist*sh_frac_dist
+     &                   *(2.0*sh_frac_dist-3.0d0)
+         fac_help_scale=6.0*(sh_frac_dist-sh_frac_dist**2)
+     &                  /dist_pep_side/buff_shield*0.5
+C remember for the final gradient multiply sh_frac_dist_grad(j) 
+C for side_chain by factor -2 ! 
+         do j=1,3
+         sh_frac_dist_grad(j)=fac_help_scale*pep_side(j)
+C         print *,"jestem",scale_fac_dist,fac_help_scale,
+C     &                    sh_frac_dist_grad(j)
+         enddo
+        endif
+C        if ((i.eq.3).and.(k.eq.2)) then
+C        print *,i,sh_frac_dist,dist_pep,fac_help_scale,scale_fac_dist
+C     & ,"TU"
+C        endif
+
+C this is what is now we have the distance scaling now volume...
+      short=short_r_sidechain(itype(k))
+      long=long_r_sidechain(itype(k))
+      costhet=1.0d0/dsqrt(1.0+short**2/dist_pep_side**2)
+C now costhet_grad
+C       costhet=0.0d0
+       costhet_fac=costhet**3*short**2*(-0.5)/dist_pep_side**4
+C       costhet_fac=0.0d0
+       do j=1,3
+         costhet_grad(j)=costhet_fac*pep_side(j)
+       enddo
+C remember for the final gradient multiply costhet_grad(j) 
+C for side_chain by factor -2 !
+C fac alfa is angle between CB_k,CA_k, CA_i,CA_i+1
+C pep_side0pept_group is vector multiplication  
+      pep_side0pept_group=0.0
+      do j=1,3
+      pep_side0pept_group=pep_side0pept_group+pep_side(j)*side_calf(j)
+      enddo
+      cosalfa=(pep_side0pept_group/
+     & (dist_pep_side*dist_side_calf))
+      fac_alfa_sin=1.0-cosalfa**2
+      fac_alfa_sin=dsqrt(fac_alfa_sin)
+      rkprim=fac_alfa_sin*(long-short)+short
+C now costhet_grad
+       cosphi=1.0d0/dsqrt(1.0+rkprim**2/dist_pep_side**2)
+       cosphi_fac=cosphi**3*rkprim**2*(-0.5)/dist_pep_side**4
+
+       do j=1,3
+         cosphi_grad_long(j)=cosphi_fac*pep_side(j)
+     &+cosphi**3*0.5/dist_pep_side**2*(-rkprim)
+     &*(long-short)/fac_alfa_sin*cosalfa/
+     &((dist_pep_side*dist_side_calf))*
+     &((side_calf(j))-cosalfa*
+     &((pep_side(j)/dist_pep_side)*dist_side_calf))
+
+        cosphi_grad_loc(j)=cosphi**3*0.5/dist_pep_side**2*(-rkprim)
+     &*(long-short)/fac_alfa_sin*cosalfa
+     &/((dist_pep_side*dist_side_calf))*
+     &(pep_side(j)-
+     &cosalfa*side_calf(j)/dist_side_calf*dist_pep_side)
+       enddo
+
+      VofOverlap=VSolvSphere/2.0d0*(1.0-costhet)*(1.0-cosphi)
+     &                    /VSolvSphere_div
+     &                    *wshield
+C now the gradient...
+C grad_shield is gradient of Calfa for peptide groups
+C      write(iout,*) "shield_compon",i,k,VSolvSphere,scale_fac_dist,
+C     &               costhet,cosphi
+C       write(iout,*) "cosphi_compon",i,k,pep_side0pept_group,
+C     & dist_pep_side,dist_side_calf,c(1,k+nres),c(1,k),itype(k)
+      do j=1,3
+      grad_shield(j,i)=grad_shield(j,i)
+C gradient po skalowaniu
+     &                +(sh_frac_dist_grad(j)
+C  gradient po costhet
+     &-scale_fac_dist*costhet_grad(j)/(1.0-costhet)
+     &-scale_fac_dist*(cosphi_grad_long(j))
+     &/(1.0-cosphi) )*div77_81
+     &*VofOverlap
+C grad_shield_side is Cbeta sidechain gradient
+      grad_shield_side(j,ishield_list(i),i)=
+     &        (sh_frac_dist_grad(j)*(-2.0d0)
+     &       +scale_fac_dist*costhet_grad(j)*2.0d0/(1.0-costhet)
+     &       +scale_fac_dist*(cosphi_grad_long(j))
+     &        *2.0d0/(1.0-cosphi))
+     &        *div77_81*VofOverlap
+
+       grad_shield_loc(j,ishield_list(i),i)=
+     &   scale_fac_dist*cosphi_grad_loc(j)
+     &        *2.0d0/(1.0-cosphi)
+     &        *div77_81*VofOverlap
+      enddo
+      VolumeTotal=VolumeTotal+VofOverlap*scale_fac_dist
+      enddo
+      fac_shield(i)=VolumeTotal*div77_81+div4_81
+C      write(2,*) "TOTAL VOLUME",i,VolumeTotal,fac_shield(i)
+      enddo
+      return
+      end
+C--------------------------------------------------------------------------
+C first for shielding is setting of function of side-chains
+       subroutine set_shield_fac2
+      implicit real*8 (a-h,o-z)
+      include 'DIMENSIONS'
+      include 'COMMON.CHAIN'
+      include 'COMMON.DERIV'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.SHIELD'
+      include 'COMMON.INTERACT'
+C this is the squar root 77 devided by 81 the epislion in lipid (in protein)
+      double precision div77_81/0.974996043d0/,
+     &div4_81/0.2222222222d0/,sh_frac_dist_grad(3)
+
+C the vector between center of side_chain and peptide group
+       double precision pep_side(3),long,side_calf(3),
+     &pept_group(3),costhet_grad(3),cosphi_grad_long(3),
+     &cosphi_grad_loc(3),pep_side_norm(3),side_calf_norm(3)
+C the line belowe needs to be changed for FGPROC>1
+      do i=1,nres-1
+      if ((itype(i).eq.ntyp1).and.itype(i+1).eq.ntyp1) cycle
+      ishield_list(i)=0
+Cif there two consequtive dummy atoms there is no peptide group between them
+C the line below has to be changed for FGPROC>1
+      VolumeTotal=0.0
+      do k=1,nres
+       if ((itype(k).eq.ntyp1).or.(itype(k).eq.10)) cycle
+       dist_pep_side=0.0
+       dist_side_calf=0.0
+       do j=1,3
+C first lets set vector conecting the ithe side-chain with kth side-chain
+      pep_side(j)=c(j,k+nres)-(c(j,i)+c(j,i+1))/2.0d0
+C      pep_side(j)=2.0d0
+C and vector conecting the side-chain with its proper calfa
+      side_calf(j)=c(j,k+nres)-c(j,k)
+C      side_calf(j)=2.0d0
+      pept_group(j)=c(j,i)-c(j,i+1)
+C lets have their lenght
+      dist_pep_side=pep_side(j)**2+dist_pep_side
+      dist_side_calf=dist_side_calf+side_calf(j)**2
+      dist_pept_group=dist_pept_group+pept_group(j)**2
+      enddo
+       dist_pep_side=dsqrt(dist_pep_side)
+       dist_pept_group=dsqrt(dist_pept_group)
+       dist_side_calf=dsqrt(dist_side_calf)
+      do j=1,3
+        pep_side_norm(j)=pep_side(j)/dist_pep_side
+        side_calf_norm(j)=dist_side_calf
+      enddo
+C now sscale fraction
+       sh_frac_dist=-(dist_pep_side-rpp(1,1)-buff_shield)/buff_shield
+C       print *,buff_shield,"buff"
+C now sscale
+        if (sh_frac_dist.le.0.0) cycle
+C If we reach here it means that this side chain reaches the shielding sphere
+C Lets add him to the list for gradient       
+        ishield_list(i)=ishield_list(i)+1
+C ishield_list is a list of non 0 side-chain that contribute to factor gradient
+C this list is essential otherwise problem would be O3
+        shield_list(ishield_list(i),i)=k
+C Lets have the sscale value
+        if (sh_frac_dist.gt.1.0) then
+         scale_fac_dist=1.0d0
+         do j=1,3
+         sh_frac_dist_grad(j)=0.0d0
+         enddo
+        else
+         scale_fac_dist=-sh_frac_dist*sh_frac_dist
+     &                   *(2.0d0*sh_frac_dist-3.0d0)
+         fac_help_scale=6.0d0*(sh_frac_dist-sh_frac_dist**2)
+     &                  /dist_pep_side/buff_shield*0.5d0
+C remember for the final gradient multiply sh_frac_dist_grad(j) 
+C for side_chain by factor -2 ! 
+         do j=1,3
+         sh_frac_dist_grad(j)=fac_help_scale*pep_side(j)
+C         sh_frac_dist_grad(j)=0.0d0
+C         scale_fac_dist=1.0d0
+C         print *,"jestem",scale_fac_dist,fac_help_scale,
+C     &                    sh_frac_dist_grad(j)
+         enddo
+        endif
+C this is what is now we have the distance scaling now volume...
+      short=short_r_sidechain(itype(k))
+      long=long_r_sidechain(itype(k))
+      costhet=1.0d0/dsqrt(1.0d0+short**2/dist_pep_side**2)
+      sinthet=short/dist_pep_side*costhet
+C now costhet_grad
+C       costhet=0.6d0
+C       sinthet=0.8
+       costhet_fac=costhet**3*short**2*(-0.5d0)/dist_pep_side**4
+C       sinthet_fac=costhet**2*0.5d0*(short**3/dist_pep_side**4*costhet
+C     &             -short/dist_pep_side**2/costhet)
+C       costhet_fac=0.0d0
+       do j=1,3
+         costhet_grad(j)=costhet_fac*pep_side(j)
+       enddo
+C remember for the final gradient multiply costhet_grad(j) 
+C for side_chain by factor -2 !
+C fac alfa is angle between CB_k,CA_k, CA_i,CA_i+1
+C pep_side0pept_group is vector multiplication  
+      pep_side0pept_group=0.0d0
+      do j=1,3
+      pep_side0pept_group=pep_side0pept_group+pep_side(j)*side_calf(j)
+      enddo
+      cosalfa=(pep_side0pept_group/
+     & (dist_pep_side*dist_side_calf))
+      fac_alfa_sin=1.0d0-cosalfa**2
+      fac_alfa_sin=dsqrt(fac_alfa_sin)
+      rkprim=fac_alfa_sin*(long-short)+short
+C      rkprim=short
+
+C now costhet_grad
+       cosphi=1.0d0/dsqrt(1.0d0+rkprim**2/dist_pep_side**2)
+C       cosphi=0.6
+       cosphi_fac=cosphi**3*rkprim**2*(-0.5d0)/dist_pep_side**4
+       sinphi=rkprim/dist_pep_side/dsqrt(1.0d0+rkprim**2/
+     &      dist_pep_side**2)
+C       sinphi=0.8
+       do j=1,3
+         cosphi_grad_long(j)=cosphi_fac*pep_side(j)
+     &+cosphi**3*0.5d0/dist_pep_side**2*(-rkprim)
+     &*(long-short)/fac_alfa_sin*cosalfa/
+     &((dist_pep_side*dist_side_calf))*
+     &((side_calf(j))-cosalfa*
+     &((pep_side(j)/dist_pep_side)*dist_side_calf))
+C       cosphi_grad_long(j)=0.0d0
+        cosphi_grad_loc(j)=cosphi**3*0.5d0/dist_pep_side**2*(-rkprim)
+     &*(long-short)/fac_alfa_sin*cosalfa
+     &/((dist_pep_side*dist_side_calf))*
+     &(pep_side(j)-
+     &cosalfa*side_calf(j)/dist_side_calf*dist_pep_side)
+C       cosphi_grad_loc(j)=0.0d0
+       enddo
+C      print *,sinphi,sinthet
+      VofOverlap=VSolvSphere/2.0d0*(1.0d0-dsqrt(1.0d0-sinphi*sinthet))
+     &                    /VSolvSphere_div
+C     &                    *wshield
+C now the gradient...
+      do j=1,3
+      grad_shield(j,i)=grad_shield(j,i)
+C gradient po skalowaniu
+     &                +(sh_frac_dist_grad(j)*VofOverlap
+C  gradient po costhet
+     &       +scale_fac_dist*VSolvSphere/VSolvSphere_div/4.0d0*
+     &(1.0d0/(-dsqrt(1.0d0-sinphi*sinthet))*(
+     &       sinphi/sinthet*costhet*costhet_grad(j)
+     &      +sinthet/sinphi*cosphi*cosphi_grad_long(j)))
+     & )*wshield
+C grad_shield_side is Cbeta sidechain gradient
+      grad_shield_side(j,ishield_list(i),i)=
+     &        (sh_frac_dist_grad(j)*(-2.0d0)
+     &        *VofOverlap
+     &       -scale_fac_dist*VSolvSphere/VSolvSphere_div/2.0d0*
+     &(1.0d0/(-dsqrt(1.0d0-sinphi*sinthet))*(
+     &       sinphi/sinthet*costhet*costhet_grad(j)
+     &      +sinthet/sinphi*cosphi*cosphi_grad_long(j)))
+     &       )*wshield
+
+       grad_shield_loc(j,ishield_list(i),i)=
+     &       scale_fac_dist*VSolvSphere/VSolvSphere_div/2.0d0*
+     &(1.0d0/(dsqrt(1.0d0-sinphi*sinthet))*(
+     &       sinthet/sinphi*cosphi*cosphi_grad_loc(j)
+     &        ))
+     &        *wshield
+      enddo
+      VolumeTotal=VolumeTotal+VofOverlap*scale_fac_dist
+      enddo
+      fac_shield(i)=VolumeTotal*wshield+(1.0d0-wshield)
+C      write(2,*) "TOTAL VOLUME",i,VolumeTotal,fac_shield(i)
+C      write(2,*) "TU",rpp(1,1),short,long,buff_shield
+      enddo
+      return
+      end
+C--------------------------------------------------------------------------
+      double precision function tschebyshev(m,n,x,y)
+      implicit none
+      include "DIMENSIONS"
+      integer i,m,n
+      double precision x(n),y,yy(0:maxvar),aux
+c Tschebyshev polynomial. Note that the first term is omitted
+c m=0: the constant term is included
+c m=1: the constant term is not included
+      yy(0)=1.0d0
+      yy(1)=y
+      do i=2,n
+        yy(i)=2*yy(1)*yy(i-1)-yy(i-2)
+      enddo
+      aux=0.0d0
+      do i=m,n
+        aux=aux+x(i)*yy(i)
+      enddo
+      tschebyshev=aux
+      return
+      end
+C--------------------------------------------------------------------------
+      double precision function gradtschebyshev(m,n,x,y)
+      implicit none
+      include "DIMENSIONS"
+      integer i,m,n
+      double precision x(n+1),y,yy(0:maxvar),aux
+c Tschebyshev polynomial. Note that the first term is omitted
+c m=0: the constant term is included
+c m=1: the constant term is not included
+      yy(0)=1.0d0
+      yy(1)=2.0d0*y
+      do i=2,n
+        yy(i)=2*y*yy(i-1)-yy(i-2)
+      enddo
+      aux=0.0d0
+      do i=m,n
+        aux=aux+x(i+1)*yy(i)*(i+1)
+C        print *, x(i+1),yy(i),i
+      enddo
+      gradtschebyshev=aux
+      return
+      end