Water micro and bere and lang with gly working with D lang not
[unres4.git] / source / wham / wham_calc.F90
index d1ed2f7..8a25261 100644 (file)
 !el      real(kind=8) :: energia(0:max_ene)
 #ifdef MPI
       integer :: tmax_t,upindE_p
-      real(kind=8) :: fi_p(MaxR,MaxT_h,nParmSet) !(MaxR,MaxT_h,Max_Parm)
+      real(kind=8) :: fi_p(MaxR,MaxT_h,nParmSet), &
+                     fi_p_min(MaxR,MaxT_h,nParmSet) !(MaxR,MaxT_h,Max_Parm)
       real(kind=8),dimension(0:nGridT,nParmSet) :: sumW_p,sumE_p,&
               sumEbis_p,sumEsq_p !(0:nGridT,Max_Parm) 
       real(kind=8),dimension(MaxQ1,0:nGridT,nParmSet) :: sumQ_p,&
               sumQsq_p,sumEQ_p,sumEprim_p !(MaxQ1,0:nGridT,Max_Parm) 
       real(kind=8) :: hfin_p(0:MaxHdim,maxT_h),&
               hfin_ent_p(0:MaxHdim),histE_p(0:maxindE),sumH,&
-              hrmsrgy_p(0:MaxBinRgy,0:MaxBinRms,maxT_h)
+              hrmsrgy_p(0:MaxBinRgy,0:MaxBinRms,maxT_h),weimax_(0:ngridT)
       real(kind=8) :: rgymin_t,rmsmin_t,rgymax_t,rmsmax_t
-      real(kind=8) :: potEmin_t!,entmin_p,entmax_p
+      real(kind=8) :: potEmin_t,potEmin_t_all(maxT_h,Max_Parm)!,entmin_p,entmax_p
 !      integer :: histent_p(0:2000)
       logical :: lprint=.true.
 #endif
               hfin(0:MaxHdim,maxT_h),histE(0:maxindE),&
               hrmsrgy(0:MaxBinRgy,0:MaxBinRms,maxT_h),&
               potEmin,ent,&
-              hfin_ent(0:MaxHdim),vmax,aux
+              hfin_ent(0:MaxHdim),vmax,aux,fi_min(MaxR,maxT_h,nParmSet), &
+              potEmin_all(maxT_h,Max_Parm),potEmin_min,entfac_min,&
+              weimax(0:nGridT,Max_Parm)
       real(kind=8) :: fT(6),fTprim(6),fTbis(6),quot,quotl1,quotl,kfacl,&
         eprim,ebis,temper,kfac=2.4d0,T0=300.0d0,startGridT=200.0d0,&
         eplus,eminus,logfac,tanhT,tt
       real(kind=8) :: etot,evdw,evdw_t,evdw2,ees,evdw1,ebe,etors,&
         escloc,ehpb,ecorr,ecorr5,ecorr6,eello_turn4,eello_turn3,&
         eello_turn6,eel_loc,edihcnstr,etors_d,estr,evdw2_14,esccor, &
-        ecationcation,ecation_prot
+        ecationcation,ecation_prot, evdwpp,eespp ,evdwpsb,eelpsb, &
+        evdwsb, eelsb, estr_nucl,ebe_nucl,esbloc,etors_nucl,etors_d_nucl,&
+        ecorr_nucl, ecorr3_nucl,epeppho, escpho, epepbase,escbase,ecation_nucl,&
+        elipbond,elipang,eliplj,elipelec,ecat_prottran,ecation_protang,eliptran,&
+        ehomology_constr
+
 
       integer :: ind_point(maxpoint),upindE,indE
       character(len=16) :: plik
       dmin=0.0d0
       tmax=0
       potEmin=1.0d10
+      do i=1,nParmset
+        do j=1,nT_h(i)
+          potEmin_all(j,i)=1.0d15
+        enddo
+      enddo
+      entfac_min=1.0d10
       rgymin=1.0d10
       rmsmin=1.0d10
       rgymax=0.0d0
       call MPI_AllReduce(tmax,tmax_t,1,MPI_INTEGER,MPI_MAX,&
         WHAM_COMM,IERROR)
       tmax=tmax_t
-      call MPI_AllReduce(potEmin,potEmin_t,1,MPI_DOUBLE_PRECISION,&
-        MPI_MIN,WHAM_COMM,IERROR)
+!      call MPI_AllReduce(potEmin,potEmin_t,1,MPI_DOUBLE_PRECISION,&
+!        MPI_MIN,WHAM_COMM,IERROR) !????
       call MPI_AllReduce(rmsmin,rmsmin_t,1,MPI_DOUBLE_PRECISION,&
         MPI_MIN,WHAM_COMM,IERROR)
       call MPI_AllReduce(rmsmax,rmsmax_t,1,MPI_DOUBLE_PRECISION,&
         MPI_MIN,WHAM_COMM,IERROR)
       call MPI_AllReduce(rgymax,rgymax_t,1,MPI_DOUBLE_PRECISION,&
         MPI_MAX,WHAM_COMM,IERROR)
-      potEmin=potEmin_t !/2 try now??
+!      potEmin=potEmin_t !/2 try now??
       rgymin=rgymin_t
       rgymax=rgymax_t
       rmsmin=rmsmin_t
 #endif
 !        write (9,'(3i5,f10.5)') i,(iparm,potE(i,iparm),iparm=1,nParmSet)
         do iparm=1,nParmSet
-!#ifdef DEBUG
+#ifdef DEBUG
           write (iout,'(2i5,21f8.2)') i,iparm,&
            (enetb(k,i,iparm),k=1,21)
-!#endif
+#endif
           call restore_parm(iparm)
-!#ifdef DEBUG
+#ifdef DEBUG
           write (iout,*) wsc,wscp,welec,wvdwpp,wang,wtor,wscloc,&
             wcorr,wcorr5,wcorr6,wturn4,wturn3,wturn6,wel_loc,&
             wtor_d,wsccor,wbond,wcatcat
-!#endif
+#endif
           do ib=1,nT_h(iparm)
 !el old rascale weights
 !
             edihcnstr=enetb(19,i,iparm)
           ecationcation=enetb(41,i,iparm)
           ecation_prot=enetb(42,i,iparm)
+            evdwpp =      enetb(26,i,iparm)
+            eespp =      enetb(27,i,iparm)
+            evdwpsb =      enetb(28,i,iparm)
+            eelpsb =      enetb(29,i,iparm)
+            evdwsb =      enetb(30,i,iparm)
+            eelsb =      enetb(31,i,iparm)
+            estr_nucl =      enetb(32,i,iparm)
+            ebe_nucl =      enetb(33,i,iparm)
+            esbloc =      enetb(34,i,iparm)
+            etors_nucl =      enetb(35,i,iparm)
+            etors_d_nucl =      enetb(36,i,iparm)
+            ecorr_nucl =      enetb(37,i,iparm)
+            ecorr3_nucl =      enetb(38,i,iparm)
+            epeppho=   enetb(49,i,iparm)
+            escpho=    enetb(48,i,iparm)
+            epepbase=  enetb(47,i,iparm)
+            escbase=   enetb(46,i,iparm)
+            ecation_nucl= enetb(50,i,iparm)
+            elipbond=enetb(52,i,iparm)
+            elipang=enetb(53,i,iparm)
+            eliplj=enetb(54,i,iparm)
+            elipelec=enetb(55,i,iparm)
+            ecat_prottran=enetb(56,i,iparm)
+            ecation_protang=enetb(57,i,iparm)
+            eliptran=enetb(22,i,iparm)
+            ehomology_constr=enetb(51,i,iparm)
 #ifdef DEBUG
             write (iout,'(3i5,6f5.2,15f12.3)') i,ib,iparm,(ft(l),l=1,6),&
              evdw+evdw_t,evdw2,ees,evdw1,ecorr,eel_loc,estr,ebe,escloc,&
-             etors,etors_d,eello_turn3,eello_turn4,esccor,ecationcation
+             etors,etors_d,eello_turn3,eello_turn4,esccor,ecationcation,&
+             ehomology_constr
 #endif
 
 !#ifdef SPLITELE
 !            +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
 !            +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
 !            +ft(2)*wturn3*eello_turn3 &
-!            +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc &
+!            +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc &
 !            +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
 !            +wbond*estr
 !#else
 !            +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
 !            +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
 !            +ft(2)*wturn3*eello_turn3 &
-!            +ft(5)*wturn6*eturn6+ft(2)*wel_loc*eel_loc+edihcnstr &
+!            +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc+edihcnstr &
 !            +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
 !            +wbond*estr
 !#endif
             etot=wsc*evdw+wscp*evdw2+welec*ees &
             +wvdwpp*evdw1 &
             +wang*ebe+wtor*etors+wscloc*escloc &
-            +wstrain*ehpb+nss*ebr+wcorr*ecorr+wcorr5*ecorr5 &
+            +wstrain*ehpb+wcorr*ecorr+wcorr5*ecorr5 &
             +wcorr6*ecorr6+wturn4*eello_turn4 &
             +wturn3*eello_turn3 &
             +wturn6*eello_turn6+wel_loc*eel_loc &
             +edihcnstr+wtor_d*etors_d+wsccor*esccor &
-            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation&
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            +wtor_d_nucl*etors_d_nucl+wcorr_nucl*ecorr_nucl+wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho+wcatnucl*ecation_nucl&
+            +elipbond+elipang+eliplj+elipelec+wcat_tran*ecat_prottran+ecation_protang&
+            +wliptran*eliptran
+
+
 #else
             etot=wsc*evdw+wscp*evdw2 &
             +welec*(ees+evdw1) &
             +wang*ebe+wtor*etors+wscloc*escloc &
-            +wstrain*ehpb+nss*ebr+wcorr*ecorr+wcorr5*ecorr5 &
+            +wstrain*ehpb+wcorr*ecorr+wcorr5*ecorr5 &
             +wcorr6*ecorr6+wturn4*eello_turn4 &
             +wturn3*eello_turn3 &
             +wturn6*eello_turn6+wel_loc*eel_loc+edihcnstr &
             +wtor_d*etors_d+wsccor*esccor &
-            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation&
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            +wtor_d_nucl*etors_d_nucl+wcorr_nucl*ecorr_nucl+wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho+wcatnucl*ecation_nucl&
+            +elipbond+elipang+eliplj+elipelec+wcat_tran*ecat_prottran+ecation_protang&
+            +wliptran*eliptran
+
+
+
+
 #endif
 
 #ifdef DEBUG
             call enerprint(energia(0))
             endif
 #endif
+            write (iout,*) "homol_nset",homol_nset,nR(ib,iparm)
+            write (iout,*) "waga_homology", waga_homology
+#ifdef DEBUG
+            write (iout,*) "homol_nset",homol_nset,nR(ib,iparm)
+#endif
+            if (homol_nset.gt.1) then
+
+              do kk=1,nR(ib,iparm)
+                Econstr=waga_homology(kk)*ehomology_constr
+                v(i,kk,ib,iparm)= &
+                 -beta_h(ib,iparm)*(etot+Econstr)
+#ifdef DEBUG
+                write (iout,'(4i5,4e15.5)') i,kk,ib,iparm, &
+                etot,Econstr,v(i,kk,ib,iparm)
+#endif
+              enddo ! kk
+
+            else
+
+              etot=etot+ehomology_constr
+
+
             do kk=1,nR(ib,iparm)
               Econstr=0.0d0
               do j=1,nQ
                etot,potEmin,etot-potEmin,v(i,kk,ib,iparm)
 #endif
             enddo ! kk
+           endif
           enddo   ! ib
         enddo     ! iparm
       enddo       ! i
             enddo
           enddo
           entfac(t)=-dlog(denom)-vmax
+          if (entfac(t).lt.entfac_min) entfac_min=entfac(t)
 #ifdef DEBUG
           write (iout,*) t,"vmax",vmax," denom",denom,"entfac",entfac(t)
 #endif
           do iib=1,nT_h(iparm)
             do ii=1,nR(iib,iparm)
 #ifdef MPI
+              fi_p_min(ii,iib,iparm)=-1.0d5
+              do t=1,scount(me)
+!                fi_p(ii,iib,iparm)=fi_p(ii,iib,iparm) &
+!                  +dexp(v(t,ii,iib,iparm)+entfac(t))
+                aux=v(t,ii,iib,iparm)+entfac(t)
+                if (aux.gt.fi_p_min(ii,iib,iparm))   fi_p_min(ii,iib,iparm)=aux
+
+!#define DEBUG
+#ifdef DEBUG
+              write (iout,'(4i5,4e15.5)') t,ii,iib,iparm,&
+               v(t,ii,iib,iparm),entfac(t),fi_p(ii,iib,iparm),fi_p_min(ii,iib,iparm)
+#endif
+!#undef DEBUG
+              enddo
+#else
+!              fi(ii,iib,iparm)=0.0d0
+              do t=1,ntot(islice)
+!                fi(ii,iib,iparm)=fi(ii,iib,iparm) &
+!                  +dexp(v(t,ii,iib,iparm)+entfac(t))
+                aux=v(t,ii,iib,iparm)+entfac(t)
+                if (aux.gt.fi_min(ii,iib,iparm))
+     &                                     fi_min(ii,iib,iparm)=aux
+
+              enddo
+#endif
+            enddo ! ii
+          enddo ! iib
+        enddo ! iparm
+
+#ifdef MPI
+#ifdef DEBUG
+        write (iout,*) "fi before MPI_Reduce me",me,' master',master
+        do iparm=1,nParmSet
+          do ib=1,nT_h(nparmset)
+            write (iout,*) "iparm",iparm," ib",ib
+            write (iout,*) "beta=",beta_h(ib,iparm)
+            write (iout,'(8e15.5)') (fi_p(i,ib,iparm),i=1,nR(ib,iparm))
+            write (iout,'(8e15.5)') (fi_p_min(i,ib,iparm),i=1,nR(ib,iparm))
+          enddo
+        enddo
+#endif
+        call MPI_AllReduce(fi_p_min,fi_min,MaxR*MaxT_h*nParmSet, &
+              MPI_DOUBLE_PRECISION,MPI_MAX,WHAM_COMM,IERROR)
+
+#ifdef DEBUG
+        write (iout,*) "fi_min after AllReduce"
+        do i=1,nParmSet
+          do j=1,nT_h(i)
+            write (iout,*) (i,j,k,fi_min(k,j,i),k=1,nR(j,i))
+          enddo
+        enddo
+#endif
+!#undef DEBUG
+#endif
+        do iparm=1,nParmSet
+          do iib=1,nT_h(iparm)
+            do ii=1,nR(iib,iparm)
+#ifdef MPI
               fi_p(ii,iib,iparm)=0.0d0
               do t=1,scount(me)
                 fi_p(ii,iib,iparm)=fi_p(ii,iib,iparm) &
-                  +dexp(v(t,ii,iib,iparm)+entfac(t))
+                +dexp(v(t,ii,iib,iparm)+entfac(t)-fi_min(ii,iib,iparm))
 #ifdef DEBUG
-              write (iout,'(4i5,3e15.5)') t,ii,iib,iparm,&
-               v(t,ii,iib,iparm),entfac(t),fi_p(ii,iib,iparm)
+              write (iout,'(4i5,4e15.5)') t,ii,iib,iparm, &
+              v(t,ii,iib,iparm),entfac(t),fi_min(ii,iib,iparm), &
+              fi_p(ii,iib,iparm)
 #endif
               enddo
 #else
               fi(ii,iib,iparm)=0.0d0
               do t=1,ntot(islice)
                 fi(ii,iib,iparm)=fi(ii,iib,iparm) &
-                  +dexp(v(t,ii,iib,iparm)+entfac(t))
+                +dexp(v(t,ii,iib,iparm)+entfac(t)-fi_min(ii,iib,iparm))
               enddo
 #endif
             enddo ! ii
           enddo
         enddo
 #endif
+#ifdef DEBUG
+        write (iout,*) "REDUCE size",maxR,MaxT_h,nParmSet, &
+        maxR*MaxT_h*nParmSet
+        write (iout,*) "MPI_COMM_WORLD",MPI_COMM_WORLD, &
+        " WHAM_COMM",WHAM_COMM
+#endif
+
         write (iout,*) "REDUCE size",maxR,MaxT_h,nParmSet,&
          maxR*MaxT_h*nParmSet
         write (iout,*) "MPI_COMM_WORLD",MPI_COMM_WORLD,&
         do iparm=1,nParmSet
           do ib=1,nT_h(iparm)
             do i=1,nR(ib,iparm)
-              fi(i,ib,iparm)=-dlog(fi(i,ib,iparm))
+              fi(i,ib,iparm)=-dlog(fi(i,ib,iparm))-fi_min(i,ib,iparm)
               avefi=avefi+fi(i,ib,iparm)
             enddo
           enddo
    20 continue
 ! Now, put together the histograms from all simulations, in order to get the
 ! unbiased total histogram.
+!C Determine the minimum free energies
+#ifdef MPI
+      do i=1,scount(me1)
+#else
+      do i=1,ntot(islice)
+#endif
+!c        write (9,'(3i5,f10.5)') i,(iparm,potE(i,iparm),iparm=1,nParmSet)
+        do iparm=1,nParmSet
+#ifdef DEBUG
+          write (iout,'(2i5,21f8.2)') i,iparm, &
+          (enetb(k,i,iparm),k=1,26)
+#endif
+          call restore_parm(iparm)
+#ifdef DEBUG
+          write (iout,*) wsc,wscp,welec,wvdwpp,wang,wtor,wscloc, &
+           wcorr,wcorr5,wcorr6,wturn4,wturn3,wturn6,wel_loc, &
+           wtor_d,wsccor,wbond
+#endif
+          do ib=1,nT_h(iparm)
+            if (rescale_modeW.eq.1) then
+              quot=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0)
+              quotl=1.0d0
+              kfacl=1.0d0
+              do l=1,5
+                quotl1=quotl
+                quotl=quotl*quot
+                kfacl=kfacl*kfac
+                fT(l)=kfacl/(kfacl-1.0d0+quotl)
+              enddo
+#if defined(FUNCTH)
+              tt = 1.0d0/(beta_h(ib,iparm)*1.987D-3)
+              ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0
+#elif defined(FUNCT)
+              ft(6)=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0)
+#else
+              ft(6)=1.0d0
+#endif
+            else if (rescale_modeW.eq.2) then
+              quot=1.0d0/(T0*beta_h(ib,iparm)*1.987D-3)
+              quotl=1.0d0
+              do l=1,5
+                quotl=quotl*quot
+                fT(l)=1.12692801104297249644d0/ &
+                  dlog(dexp(quotl)+dexp(-quotl))
+               enddo
+#if defined(FUNCTH)
+              tt = 1.0d0/(beta_h(ib,iparm)*1.987D-3)
+              ft(6)=(320.0d0+80.0d0*dtanh((tt-320.0d0)/80.0d0))/320.0d0
+#elif defined(FUNCT)
+              ft(6)=1.0d0/(beta_h(ib,iparm)*1.987D-3*T0)
+#else
+              ft(6)=1.0d0
+#endif
+!c              write (iout,*) 1.0d0/(beta_h(ib,iparm)*1.987D-3),ft
+            else if (rescale_modeW.eq.0) then
+              do l=1,6
+                fT(l)=1.0d0
+              enddo
+            else
+              write (iout,*) "Error in WHAM_CALC: wrong RESCALE_MODE", &
+               rescale_mode
+              call flush(iout)
+              return 1
+            endif
+            evdw=enetb(1,i,iparm)
+!            evdw_t=enetb(21,i,iparm)
+            evdw_t=enetb(20,i,iparm)
+#ifdef SCP14
+!            evdw2_14=enetb(17,i,iparm)
+            evdw2_14=enetb(18,i,iparm)
+            evdw2=enetb(2,i,iparm)+evdw2_14
+#else
+            evdw2=enetb(2,i,iparm)
+            evdw2_14=0.0d0
+#endif
+#ifdef SPLITELE
+            ees=enetb(3,i,iparm)
+            evdw1=enetb(16,i,iparm)
+#else
+            ees=enetb(3,i,iparm)
+            evdw1=0.0d0
+#endif
+            ecorr=enetb(4,i,iparm)
+            ecorr5=enetb(5,i,iparm)
+            ecorr6=enetb(6,i,iparm)
+            eel_loc=enetb(7,i,iparm)
+            eello_turn3=enetb(8,i,iparm)
+            eello_turn4=enetb(9,i,iparm)
+            eello_turn6=enetb(10,i,iparm)
+            ebe=enetb(11,i,iparm)
+            escloc=enetb(12,i,iparm)
+            etors=enetb(13,i,iparm)
+            etors_d=enetb(14,i,iparm)
+            ehpb=enetb(15,i,iparm)
+!            estr=enetb(18,i,iparm)
+            estr=enetb(17,i,iparm)
+!            esccor=enetb(19,i,iparm)
+            esccor=enetb(21,i,iparm)
+!            edihcnstr=enetb(20,i,iparm)
+            edihcnstr=enetb(19,i,iparm)
+!            ehomology_constr=enetb(22,i,iparm)
+!            esaxs=enetb(26,i,iparm)
+          ecationcation=enetb(41,i,iparm)
+          ecation_prot=enetb(42,i,iparm)
+            evdwpp =      enetb(26,i,iparm)
+            eespp =      enetb(27,i,iparm)
+            evdwpsb =      enetb(28,i,iparm)
+            eelpsb =      enetb(29,i,iparm)
+            evdwsb =      enetb(30,i,iparm)
+            eelsb =      enetb(31,i,iparm)
+            estr_nucl =      enetb(32,i,iparm)
+            ebe_nucl =      enetb(33,i,iparm)
+            esbloc =      enetb(34,i,iparm)
+            etors_nucl =      enetb(35,i,iparm)
+            etors_d_nucl =      enetb(36,i,iparm)
+            ecorr_nucl =      enetb(37,i,iparm)
+            ecorr3_nucl =      enetb(38,i,iparm)
+            epeppho=   enetb(49,i,iparm)
+            escpho=    enetb(48,i,iparm)
+            epepbase=  enetb(47,i,iparm)
+            escbase=   enetb(46,i,iparm)
+            ecation_nucl=enetb(50,i,iparm)
+            elipbond=enetb(52,i,iparm)
+            elipang=enetb(53,i,iparm)
+            eliplj=enetb(54,i,iparm)
+            elipelec=enetb(55,i,iparm)
+            ecat_prottran=enetb(56,i,iparm)
+            ecation_protang=enetb(57,i,iparm)
+            eliptran=enetb(22,i,iparm)
+            ehomology_constr=enetb(51,i,iparm)
+#ifdef SPLITELE
+            etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees &
+            +wvdwpp*evdw1 &
+            +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+            +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+            +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+            +ft(2)*wturn3*eello_turn3 &
+            +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc &
+            +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho+ wcatnucl*ecation_nucl&
+            +elipbond+elipang+eliplj+elipelec+wcat_tran*ecat_prottran+ecation_protang&
+            +wliptran*eliptran
+
+
+#else
+            etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 &
+            +ft(1)*welec*(ees+evdw1) &
+            +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+            +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+            +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+            +ft(2)*wturn3*eello_turn3 &
+            +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc+edihcnstr &
+            +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation&
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho+ wcatnucl*ecation_nucl&
+            +elipbond+elipang+eliplj+elipelec+wcat_tran*ecat_prottran+ecation_protang&
+            +wliptran*eliptran
+
+
+
+#endif
+            write (iout,*) "WTF,",etot,potEmin_all(ib,iparm),entfac(i)/beta_h(ib,iparm)
+            etot=etot-entfac(i)/beta_h(ib,iparm)
+            if(etot.lt.potEmin_all(ib,iparm)) potEmin_all(ib,iparm)=etot
+
+          enddo   ! ib
+        enddo     ! iparm
+      enddo       ! i
+#ifdef DEBUG
+      write (iout,*) "The potEmin array before reduction"
+      do i=1,nParmSet
+        write (iout,*) "Parameter set",i
+        do j=1,nT_h(i)
+          write (iout,*) j,PotEmin_all(j,i)
+        enddo
+      enddo
+      write (iout,*) "potEmin_min",potEmin_min
+#endif
+#ifdef MPI
+!C Determine the minimum energes for all parameter sets and temperatures
+      call MPI_AllReduce(potEmin_all(1,1),potEmin_t_all(1,1), &
+       maxT_h*nParmSet,MPI_DOUBLE_PRECISION,MPI_MIN,WHAM_COMM,IERROR)
+      do i=1,nParmSet
+        do j=1,nT_h(i)
+          potEmin_all(j,i)=potEmin_t_all(j,i)
+        enddo
+      enddo
+#endif
+      potEmin_min=potEmin_all(1,1)
+      do i=1,nParmSet
+        do j=1,nT_h(i)
+          if (potEmin_all(j,i).lt.potEmin_min) &
+                  potEmin_min=potEmin_all(j,i)
+        enddo
+      enddo
+#ifdef DEBUG
+      write (iout,*) "The potEmin array"
+      do i=1,nParmSet
+        write (iout,*) "Parameter set",i
+        do j=1,nT_h(i)
+          write (iout,*) j,1.0d0/(1.987d-3*beta_h(j,i)), &
+           PotEmin_all(j,i)
+        enddo
+      enddo
+      write (iout,*) "potEmin_min",potEmin_min
+#endif
+
 #ifdef MPI
       do t=0,tmax
         hfin_ent_p(t)=0.0d0
           edihcnstr=0.0d0
           ecationcation=enetb(41,t,iparm)
           ecation_prot=enetb(42,t,iparm)
+            evdwpp =      enetb(26,t,iparm)
+            eespp =      enetb(27,t,iparm)
+            evdwpsb =      enetb(28,t,iparm)
+            eelpsb =      enetb(29,t,iparm)
+            evdwsb =      enetb(30,t,iparm)
+            eelsb =      enetb(31,t,iparm)
+            estr_nucl =      enetb(32,t,iparm)
+            ebe_nucl =      enetb(33,t,iparm)
+            esbloc =      enetb(34,t,iparm)
+            etors_nucl =      enetb(35,t,iparm)
+            etors_d_nucl =      enetb(36,t,iparm)
+            ecorr_nucl =      enetb(37,t,iparm)
+            ecorr3_nucl =      enetb(38,t,iparm)
+            epeppho=   enetb(49,t,iparm)
+            escpho=    enetb(48,t,iparm)
+            epepbase=  enetb(47,t,iparm)
+            escbase=   enetb(46,t,iparm)
+            ecation_nucl=enetb(50,t,iparm)
+            elipbond=enetb(52,t,iparm)
+            elipang=enetb(53,t,iparm)
+            eliplj=enetb(54,t,iparm)
+            elipelec=enetb(55,t,iparm)
+            ecat_prottran=enetb(56,t,iparm)
+            ecation_protang=enetb(57,t,iparm)
+            eliptran=enetb(22,t,iparm)
+            ehomology_constr=enetb(51,t,iparm)
 
           do k=0,nGridT
             betaT=startGridT+k*delta_T
             etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees &
             +wvdwpp*evdw1 &
             +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
-            +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+            +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
             +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
             +ft(2)*wturn3*eello_turn3 &
             +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc &
             +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
-            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho &
+            + wcatnucl*ecation_nucl&
+            +elipbond+elipang+eliplj+elipelec+wcat_tran*ecat_prottran+ecation_protang&
+            +wliptran*eliptran
+
+
+
             eprim=ftprim(6)*evdw_t+ftprim(1)*welec*ees &
                  +ftprim(1)*wtor*etors+ &
                  ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+ &
                  ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+ &
                  ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eello_turn6+ &
                  ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+ &
-                 ftprim(1)*wsccor*esccor
+                 ftprim(1)*wsccor*esccor +ftprim(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftprim(2)*etors_d_nucl+ftprim(1)*wpepbase*epepbase
             ebis=ftbis(1)*welec*ees+ftbis(1)*wtor*etors+ &
                  ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+ &
                  ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+ &
                  ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eello_turn6+ &
                  ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+ &
-                 ftbis(1)*wsccor*esccor
+                 ftbis(1)*wsccor*esccor+ftbis(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftbis(2)*etors_d_nucl+ftbis(1)*wpepbase*epepbase
 #else
             etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 &
             +ft(1)*welec*(ees+evdw1) &
             +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
-            +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+            +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
             +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
             +ft(2)*wturn3*eello_turn3 &
             +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc+edihcnstr &
             +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
-            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation&
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho&
+            + wcatnucl*ecation_nucl&
+            +elipbond+elipang+eliplj+elipelec+wcat_tran*ecat_prottran+ecation_protang&
+            +wliptran*eliptran
+
+
+
             eprim=ftprim(6)*evdw_t+ftprim(1)*welec*(ees+evdw1) &
                 +ftprim(1)*wtor*etors+ &
                  ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+ &
                  ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+ &
                  ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eello_turn6+ &
                  ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+ &
-                 ftprim(1)*wsccor*esccor
+                 ftprim(1)*wsccor*esccor+ftprim(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftprim(2)*etors_d_nucl+ftprim(1)*wpepbase*epepbase
             ebis=ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+ &
                  ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+ &
                  ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+ &
                  ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eello_turn6+ &
                  ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+ &
-                 ftprim(1)*wsccor*esccor
-#endif
-            weight=dexp(-betaT*(etot-potEmin)+entfac(t))
-#ifdef DEBUG
-            write (iout,*) "iparm",iparm," t",t," betaT",betaT,&
-              " etot",etot," entfac",entfac(t),&
-              " weight",weight," ebis",ebis
-#endif
-            etot=etot-temper*eprim
-#ifdef MPI
-            sumW_p(k,iparm)=sumW_p(k,iparm)+weight
-            sumE_p(k,iparm)=sumE_p(k,iparm)+etot*weight
-            sumEbis_p(k,iparm)=sumEbis_p(k,iparm)+ebis*weight
-            sumEsq_p(k,iparm)=sumEsq_p(k,iparm)+etot**2*weight
-            do j=1,nQ+2
-              sumQ_p(j,k,iparm)=sumQ_p(j,k,iparm)+q(j,t)*weight
-              sumQsq_p(j,k,iparm)=sumQsq_p(j,k,iparm)+q(j,t)**2*weight
-              sumEQ_p(j,k,iparm)=sumEQ_p(j,k,iparm) &
-               +etot*q(j,t)*weight
-            enddo
-#else
-            sumW(k,iparm)=sumW(k,iparm)+weight
-            sumE(k,iparm)=sumE(k,iparm)+etot*weight
-            sumEbis(k,iparm)=sumEbis(k,iparm)+ebis*weight
-            sumEsq(k,iparm)=sumEsq(k,iparm)+etot**2*weight
-            do j=1,nQ+2
-              sumQ(j,k,iparm)=sumQ(j,k,iparm)+q(j,t)*weight
-              sumQsq(j,k,iparm)=sumQsq(j,k,iparm)+q(j,t)**2*weight
-              sumEQ(j,k,iparm)=sumEQ(j,k,iparm) &
-               +etot*q(j,t)*weight
-            enddo
+                 ftbis(1)*wsccor*esccor+ftbis(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftbis(2)*etors_d_nucl*ftbis(1)*wpepbase*epepbase
+
 #endif
+!            weight=dexp(-betaT*(etot-potEmin)+entfac(t))
+!#ifdef DEBUG
+!            write (iout,*) "iparm",iparm," t",t," betaT",betaT,&
+!              " etot",etot," entfac",entfac(t),&
+!              " weight",weight," ebis",ebis
+!#endif
+!            etot=etot-temper*eprim
+!#ifdef MPI
+!            sumW_p(k,iparm)=sumW_p(k,iparm)+weight
+!            sumE_p(k,iparm)=sumE_p(k,iparm)+etot*weight
+!            sumEbis_p(k,iparm)=sumEbis_p(k,iparm)+ebis*weight
+!            sumEsq_p(k,iparm)=sumEsq_p(k,iparm)+etot**2*weight
+!            do j=1,nQ+2
+!              sumQ_p(j,k,iparm)=sumQ_p(j,k,iparm)+q(j,t)*weight
+!              sumQsq_p(j,k,iparm)=sumQsq_p(j,k,iparm)+q(j,t)**2*weight
+!              sumEQ_p(j,k,iparm)=sumEQ_p(j,k,iparm) &
+!               +etot*q(j,t)*weight
+!            enddo
+!#else
+!            sumW(k,iparm)=sumW(k,iparm)+weight
+!            sumE(k,iparm)=sumE(k,iparm)+etot*weight
+!            sumEbis(k,iparm)=sumEbis(k,iparm)+ebis*weight
+!            sumEsq(k,iparm)=sumEsq(k,iparm)+etot**2*weight
+!            do j=1,nQ+2
+!              sumQ(j,k,iparm)=sumQ(j,k,iparm)+q(j,t)*weight
+!              sumQsq(j,k,iparm)=sumQsq(j,k,iparm)+q(j,t)**2*weight
+!              sumEQ(j,k,iparm)=sumEQ(j,k,iparm) &
+!               +etot*q(j,t)*weight
+!            enddo
+!#endif
           enddo
           indE = aint(potE(t,iparm)-aint(potEmin))
           if (indE.ge.0 .and. indE.le.maxinde) then
           endif
 #ifdef MPI
           do ib=1,nT_h(iparm)
+            potEmin=potEmin_all(ib,iparm)
             expfac=dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t))
             hfin_p(ind,ib)=hfin_p(ind,ib)+ &
              dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t))
           enddo
 #else
           do ib=1,nT_h(iparm)
+            potEmin=potEmin_all(ib,iparm)
             expfac=dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t))
             hfin(ind,ib)=hfin(ind,ib)+ &
              dexp(-beta_h(ib,iparm)*(etot-potEmin)+entfac(t))
           enddo
 #endif
         enddo ! t
+!
+! Thermo and ensemble averages
+!
+        do k=0,nGridT
+          betaT=startGridT+k*delta_T
+!          call temp_scalfac(betaT,ft,ftprim,ftbis,*10)
+      if (rescale_mode.eq.1) then
+        quot=betaT/T0
+        quotl=1.0d0
+        kfacl=1.0d0
+        do l=1,5
+          quotl1=quotl
+          quotl=quotl*quot
+          kfacl=kfacl*kfac
+          denom=kfacl-1.0d0+quotl
+          fT(l)=kfacl/denom
+          ftprim(l)=-l*ft(l)*quotl1/(T0*denom)
+          ftbis(l)=l*kfacl*quotl1* &
+          (2*l*quotl-(l-1)*denom)/(quot*t0*t0*denom**3)
+        enddo
+#if defined(FUNCTH)
+        ft(6)=(320.0d0+80.0d0*dtanh((betaT-320.0d0)/80.0d0))/ &
+                 320.0d0
+        ftprim(6)=1.0d0/(320.0d0*dcosh((betaT-320.0d0)/80.0d0)**2)
+        ftbis(6)=-2.0d0*dtanh((betaT-320.0d0)/80.0d0) &
+               /(320.0d0*80.0d0*dcosh((betaT-320.0d0)/80.0d0)**3)
+#elif defined(FUNCT)
+        fT(6)=betaT/T0
+        ftprim(6)=1.0d0/T0
+        ftbis(6)=0.0d0
+#else
+        fT(6)=1.0d0
+        ftprim(6)=0.0d0
+        ftbis(6)=0.0d0
+#endif
+      else if (rescale_mode.eq.2) then
+        quot=betaT/T0
+        quotl=1.0d0
+        do l=1,5
+          quotl1=quotl
+          quotl=quotl*quot
+          eplus=dexp(quotl)
+          eminus=dexp(-quotl)
+          logfac=1.0d0/dlog(eplus+eminus)
+          tanhT=(eplus-eminus)/(eplus+eminus)
+          fT(l)=1.12692801104297249644d0*logfac
+          ftprim(l)=-l*quotl1*ft(l)*tanhT*logfac/T0
+          ftbis(l)=(l-1)*ftprim(l)/(quot*T0)- &
+         2*l*quotl1/T0*logfac* &
+         (2*l*quotl1*ft(l)/(T0*(eplus+eminus)**2) &
+         +ftprim(l)*tanhT) 
+        enddo
+#if defined(FUNCTH)
+        ft(6)=(320.0d0+80.0d0*dtanh((betaT-320.0d0)/80.0d0))/ &
+                320.0d0
+        ftprim(6)=1.0d0/(320.0d0*dcosh((betaT-320.0d0)/80.0d0)**2)
+        ftbis(6)=-2.0d0*dtanh((betaT-320.0d0)/80.0d0) &
+              /(320.0d0*80.0d0*dcosh((betaT-320.0d0)/80.0d0)**3)
+#elif defined(FUNCT)
+        fT(6)=betaT/T0
+        ftprim(6)=1.0d0/T0
+        ftbis(6)=0.0d0
+#else
+        fT(6)=1.0d0
+        ftprim(6)=0.0d0
+        ftbis(6)=0.0d0
+#endif
+      else if (rescale_mode.eq.0) then
+        do l=1,5
+          fT(l)=1.0d0
+          ftprim(l)=0.0d0
+        enddo
+      else
+        write (iout,*) "Error in WHAM_CALC: wrong RESCALE_MODE", &
+         rescale_mode
+        call flush(iout)
+!        return1
+      endif
+
+!            write (iout,*) "ftprim",ftprim
+!            write (iout,*) "ftbis",ftbis
+          betaT=1.0d0/(1.987D-3*betaT)
+! 7/10/18 AL Determine the max Botzmann weights for each temerature
+!          call sum_ene(1,iparm,ft,etot)
+      evdw=enetb(1,1,iparm)
+      evdw_t=enetb(20,1,iparm)
+#ifdef SCP14
+      evdw2_14=enetb(18,1,iparm)
+      evdw2=enetb(2,1,iparm)+evdw2_14
+#else
+      evdw2=enetb(2,1,iparm)
+      evdw2_14=0.0d0
+#endif
+#ifdef SPLITELE
+      ees=enetb(3,1,iparm)
+      evdw1=enetb(16,1,iparm)
+#else
+      ees=enetb(3,1,iparm)
+      evdw1=0.0d0
+#endif
+      ecorr=enetb(4,1,iparm)
+      ecorr5=enetb(5,1,iparm)
+      ecorr6=enetb(6,1,iparm)
+      eel_loc=enetb(7,1,iparm)
+      eello_turn3=enetb(8,1,iparm)
+      eello_turn4=enetb(9,1,iparm)
+      eello_turn6=enetb(10,1,iparm)
+      ebe=enetb(11,1,iparm)
+      escloc=enetb(12,1,iparm)
+      etors=enetb(13,1,iparm)
+      etors_d=enetb(14,1,iparm)
+      ehpb=enetb(15,1,iparm)
+      estr=enetb(17,1,iparm)
+      esccor=enetb(21,1,iparm)
+      edihcnstr=enetb(19,1,iparm)
+!      eliptran=enetb(22,1,iparm)
+!      esaxs=enetb(26,1,iparm)
+      ecationcation=enetb(41,1,iparm)
+      ecation_prot=enetb(42,1,iparm)
+      evdwpp =      enetb(26,1,iparm)
+      eespp =      enetb(27,1,iparm)
+      evdwpsb =      enetb(28,1,iparm)
+      eelpsb =      enetb(29,1,iparm)
+      evdwsb =      enetb(30,1,iparm)
+      eelsb =      enetb(31,1,iparm)
+      estr_nucl =      enetb(32,1,iparm)
+      ebe_nucl =      enetb(33,1,iparm)
+      esbloc =      enetb(34,1,iparm)
+      etors_nucl =      enetb(35,1,iparm)
+      etors_d_nucl =      enetb(36,1,iparm)
+      ecorr_nucl =      enetb(37,1,iparm)
+      ecorr3_nucl =      enetb(38,1,iparm)
+      epeppho=   enetb(49,1,iparm)
+      escpho=    enetb(48,1,iparm)
+      epepbase=  enetb(47,1,iparm)
+      escbase=   enetb(46,1,iparm)
+      ecation_nucl= enetb(50,1,iparm)
+      ehomology_constr=enetb(51,1,iparm)
+
+#ifdef SPLITELE
+      if (shield_mode.gt.0) then
+        etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2 &
+          +ft(1)*welec*ees &
+          +ft(1)*wvdwpp*evdw1 &
+          +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!     &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+          +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+          +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+          +ft(2)*wturn3*eello_turn3 &
+          +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc &
+          +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho &
+            + wcatnucl*ecation_nucl
+
+          
+      else
+        etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees &
+          +wvdwpp*evdw1 &
+          +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!     &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+          +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+          +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+          +ft(2)*wturn3*eello_turn3 &
+          +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc &
+          +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho &
+            + wcatnucl*ecation_nucl
+
+      endif
+#else
+      if (shield_mode.gt.0) then
+        etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2 &
+          +ft(1)*welec*(ees+evdw1) &
+          +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!     &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+          +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+          +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+          +ft(2)*wturn3*eello_turn3 &
+          +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc+edihcnstr &
+          +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho &
+            + wcatnucl*ecation_nucl
+
+      else
+        etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 &
+          +ft(1)*welec*(ees+evdw1) &
+          +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!     &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+          +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+          +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+          +ft(2)*wturn3*eello_turn3 &
+          +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc+edihcnstr &
+          +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho &
+            + wcatnucl*ecation_nucl
+
+      endif
+#endif
+
+          weimax(k,iparm)=-betaT*(etot-potEmin)+entfac(1)
+!          write (iout,*) "k",k," t",1," weight",weimax(k,iparm)
+#ifdef MPI
+          do t=2,scount(me1)
+#else
+          do t=2,ntot(islice)
+#endif
+!           call sum_ene(t,iparm,ft,etot)
+      evdw=enetb(1,t,iparm)
+      evdw_t=enetb(20,t,iparm)
+#ifdef SCP14
+      evdw2_14=enetb(18,t,iparm)
+      evdw2=enetb(2,t,iparm)+evdw2_14
+#else
+      evdw2=enetb(2,t,iparm)
+      evdw2_14=0.0d0
+#endif
+#ifdef SPLITELE
+      ees=enetb(3,t,iparm)
+      evdw1=enetb(16,t,iparm)
+#else
+      ees=enetb(3,t,iparm)
+      evdw1=0.0d0
+#endif
+      ecorr=enetb(4,t,iparm)
+      ecorr5=enetb(5,t,iparm)
+      ecorr6=enetb(6,t,iparm)
+      eel_loc=enetb(7,t,iparm)
+      eello_turn3=enetb(8,t,iparm)
+      eello_turn4=enetb(9,t,iparm)
+      eello_turn6=enetb(10,t,iparm)
+      ebe=enetb(11,t,iparm)
+      escloc=enetb(12,t,iparm)
+      etors=enetb(13,t,iparm)
+      etors_d=enetb(14,t,iparm)
+      ehpb=enetb(15,t,iparm)
+      estr=enetb(17,t,iparm)
+      esccor=enetb(21,t,iparm)
+      edihcnstr=enetb(19,t,iparm)
+!      eliptran=enetb(22,t,iparm)
+!      esaxs=enetb(26,t,iparm)
+      ecationcation=enetb(41,t,iparm)
+      ecation_prot=enetb(42,t,iparm)
+      evdwpp =      enetb(26,t,iparm)
+      eespp =      enetb(27,t,iparm)
+      evdwpsb =      enetb(28,t,iparm)
+      eelpsb =      enetb(29,t,iparm)
+      evdwsb =      enetb(30,t,iparm)
+      eelsb =      enetb(31,t,iparm)
+      estr_nucl =      enetb(32,t,iparm)
+      ebe_nucl =      enetb(33,t,iparm)
+      esbloc =      enetb(34,t,iparm)
+      etors_nucl =      enetb(35,t,iparm)
+      etors_d_nucl =      enetb(36,t,iparm)
+      ecorr_nucl =      enetb(37,t,iparm)
+      ecorr3_nucl =      enetb(38,t,iparm)
+      epeppho=   enetb(49,t,iparm)
+      escpho=    enetb(48,t,iparm)
+      epepbase=  enetb(47,t,iparm)
+      escbase=   enetb(46,t,iparm)
+      ecation_nucl=enetb(50,t,iparm)
+      ehomology_constr=enetb(51,t,iparm)
+
+#ifdef SPLITELE
+      if (shield_mode.gt.0) then
+        etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2 &
+          +ft(1)*welec*ees & 
+          +ft(1)*wvdwpp*evdw1 &
+          +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!     &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+          +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+          +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+          +ft(2)*wturn3*eello_turn3 &
+          +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc &
+          +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho &
+            + wcatnucl*ecation_nucl
+
+      else
+        etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees &
+          +wvdwpp*evdw1 &
+          +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!     &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+          +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+          +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+          +ft(2)*wturn3*eello_turn3 &
+          +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc &
+          +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho &
+            + wcatnucl*ecation_nucl
+      endif
+#else
+      if (shield_mode.gt.0) then
+        etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2 &
+          +ft(1)*welec*(ees+evdw1) &
+          +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!     &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+          +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+          +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+          +ft(2)*wturn3*eello_turn3 &
+          +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc+edihcnstr &
+          +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho &
+            + wcatnucl*ecation_nucl
+      else
+        etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 &
+          +ft(1)*welec*(ees+evdw1) &
+          +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!     &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+          +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+          +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+          +ft(2)*wturn3*eello_turn3 &
+          +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc+edihcnstr &
+          +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+            +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho &
+            + wcatnucl*ecation_nucl
+      endif
+#endif
+
+            weight=-betaT*(etot-potEmin)+entfac(t)
+!            write (iout,*) "k",k," t",t," weight",weight
+            if (weight.gt.weimax(k,iparm)) weimax(k,iparm)=weight
+          enddo
+#ifdef MPI
+        enddo
+#ifdef DEBUG
+        write (iout,*) "weimax before REDUCE"
+        write (iout,*) (weimax(k,iparm),k=0,ngridt)
+#endif
+        do k=0,nGridT
+          weimax_(k)=weimax(k,iparm)
+        enddo
+        call MPI_Allreduce(weimax_(0),weimax(0,iparm),nGridT+1, &
+        MPI_DOUBLE_PRECISION,MPI_MAX,WHAM_COMM,IERROR)
+#ifdef DEBUG
+        write (iout,*) "weimax"
+        write (iout,*) (weimax(k,iparm),k=0,ngridt)
+#endif
+        do k=0,nGridT
+          weimax_(k)=weimax(k,iparm)
+        enddo
+        call MPI_Allreduce(weimax_(0),weimax(0,iparm),nGridT+1, &
+        MPI_DOUBLE_PRECISION,MPI_MAX,WHAM_COMM,IERROR)
+#ifdef DEBUG
+        write (iout,*) "weimax"
+        write (iout,*) (weimax(k,iparm),k=0,ngridt)
+#endif
+        do k=0,nGridT
+          temper=startGridT+k*delta_T
+          betaT=1.0d0/(1.987D-3*temper)
+!          call temp_scalfac(temper,ft,ftprim,ftbis,*10)
+      if (rescale_mode.eq.1) then
+        quot=temper/T0
+        quotl=1.0d0
+        kfacl=1.0d0
+        do l=1,5
+          quotl1=quotl
+          quotl=quotl*quot
+          kfacl=kfacl*kfac
+          denom=kfacl-1.0d0+quotl
+          fT(l)=kfacl/denom
+          ftprim(l)=-l*ft(l)*quotl1/(T0*denom)
+          ftbis(l)=l*kfacl*quotl1*&
+          (2*l*quotl-(l-1)*denom)/(quot*t0*t0*denom**3)
+        enddo
+#if defined(FUNCTH)
+        ft(6)=(320.0d0+80.0d0*dtanh((temper-320.0d0)/80.0d0))/ &
+                 320.0d0
+        ftprim(6)=1.0d0/(320.0d0*dcosh((temper-320.0d0)/80.0d0)**2)
+        ftbis(6)=-2.0d0*dtanh((temper-320.0d0)/80.0d0) &
+               /(320.0d0*80.0d0*dcosh((temper-320.0d0)/80.0d0)**3)
+#elif defined(FUNCT)
+        fT(6)=temper/T0
+        ftprim(6)=1.0d0/T0
+        ftbis(6)=0.0d0
+#else
+        fT(6)=1.0d0
+        ftprim(6)=0.0d0
+        ftbis(6)=0.0d0
+#endif
+      else if (rescale_mode.eq.2) then
+        quot=temper/T0
+        quotl=1.0d0
+        do l=1,5
+          quotl1=quotl
+          quotl=quotl*quot
+          eplus=dexp(quotl)
+          eminus=dexp(-quotl)
+          logfac=1.0d0/dlog(eplus+eminus)
+          tanhT=(eplus-eminus)/(eplus+eminus)
+          fT(l)=1.12692801104297249644d0*logfac
+          ftprim(l)=-l*quotl1*ft(l)*tanhT*logfac/T0
+          ftbis(l)=(l-1)*ftprim(l)/(quot*T0)- &
+         2*l*quotl1/T0*logfac* &
+         (2*l*quotl1*ft(l)/(T0*(eplus+eminus)**2) &
+         +ftprim(l)*tanhT) 
+        enddo
+#if defined(FUNCTH)
+        ft(6)=(320.0d0+80.0d0*dtanh((temper-320.0d0)/80.0d0))/ &
+                320.0d0
+        ftprim(6)=1.0d0/(320.0d0*dcosh((temper-320.0d0)/80.0d0)**2)
+        ftbis(6)=-2.0d0*dtanh((temper-320.0d0)/80.0d0) &
+              /(320.0d0*80.0d0*dcosh((temper-320.0d0)/80.0d0)**3)
+#elif defined(FUNCT)
+        fT(6)=temper/T0
+        ftprim(6)=1.0d0/T0
+        ftbis(6)=0.0d0
+#else
+        fT(6)=1.0d0
+        ftprim(6)=0.0d0
+        ftbis(6)=0.0d0
+#endif
+      else if (rescale_mode.eq.0) then
+        do l=1,5
+          fT(l)=1.0d0
+          ftprim(l)=0.0d0
+        enddo
+      else
+        write (iout,*) "Error in WHAM_CALC: wrong RESCALE_MODE", &
+         rescale_mode
+        call flush(iout)
+!        return1
+      endif
+
+
+
+          do t=1,scount(me1)
+#else
+          do t=1,ntot(islice)
+#endif
+            ind = ind_point(t)
+#ifdef MPI
+            hfin_ent_p(ind)=hfin_ent_p(ind)+dexp(entfac(t))
+#else
+            hfin_ent(ind)=hfin_ent(ind)+dexp(entfac(t))
+#endif
+!          write (iout,'(2i5,20f8.2)') t,t,(enetb(k,t,iparm),k=1,18)
+!          call restore_parm(iparm)
+!            call sum_ene_deriv(t,iparm,ft,ftprim,ftbis,etot,eprim,ebis)
+      evdw=enetb(1,t,iparm)
+      evdw_t=enetb(20,t,iparm)
+#ifdef SCP14
+      evdw2_14=enetb(18,t,iparm)
+      evdw2=enetb(2,t,iparm)+evdw2_14
+#else
+      evdw2=enetb(2,t,iparm)
+      evdw2_14=0.0d0
+#endif
+#ifdef SPLITELE
+      ees=enetb(3,t,iparm)
+      evdw1=enetb(16,t,iparm)
+#else
+      ees=enetb(3,t,iparm)
+      evdw1=0.0d0
+#endif
+      ecorr=enetb(4,t,iparm)
+      ecorr5=enetb(5,t,iparm)
+      ecorr6=enetb(6,t,iparm)
+      eel_loc=enetb(7,t,iparm)
+      eello_turn3=enetb(8,t,iparm)
+      eello_turn4=enetb(9,t,iparm)
+      eello_turn6=enetb(10,t,iparm)
+      ebe=enetb(11,t,iparm)
+      escloc=enetb(12,t,iparm)
+      etors=enetb(13,t,iparm)
+      etors_d=enetb(14,t,iparm)
+      ehpb=enetb(15,t,iparm)
+      estr=enetb(17,t,iparm)
+      esccor=enetb(21,t,iparm)
+      edihcnstr=enetb(19,t,iparm)
+!      eliptran=enetb(22,t,iparm)
+!      esaxs=enetb(26,t,iparm)
+!      ehomology_constr=enetb(27,t,iparm)
+!      edfadis=enetb(28,t,iparm)
+!      edfator=enetb(29,t,iparm)
+!      edfanei=enetb(30,t,iparm)
+!      edfabet=enetb(31,t,iparm)
+          ecationcation=enetb(41,i,iparm)
+          ecation_prot=enetb(42,i,iparm)
+            evdwpp =      enetb(26,i,iparm)
+            eespp =      enetb(27,i,iparm)
+            evdwpsb =      enetb(28,i,iparm)
+            eelpsb =      enetb(29,i,iparm)
+            evdwsb =      enetb(30,i,iparm)
+            eelsb =      enetb(31,i,iparm)
+            estr_nucl =      enetb(32,i,iparm)
+            ebe_nucl =      enetb(33,i,iparm)
+            esbloc =      enetb(34,i,iparm)
+            etors_nucl =      enetb(35,i,iparm)
+            etors_d_nucl =      enetb(36,i,iparm)
+            ecorr_nucl =      enetb(37,i,iparm)
+            ecorr3_nucl =      enetb(38,i,iparm)
+            epeppho=   enetb(49,i,iparm)
+            escpho=    enetb(48,i,iparm)
+            epepbase=  enetb(47,i,iparm)
+            escbase=   enetb(46,i,iparm)
+            ecation_nucl= enetb(50,i,iparm)
+            ehomology_constr=enetb(51,i,iparm)
+
+#ifdef SPLITELE
+      if (shield_mode.gt.0) then
+        etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2 &
+         +ft(1)*welec*ees &
+         +ft(1)*wvdwpp*evdw1 &
+         +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!     &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+         +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+         +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+         +ft(2)*wturn3*eello_turn3 &
+         +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc &
+         +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+         +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation &
+         +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+         +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+         +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+         *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+         +wcorr3_nucl*ecorr3_nucl&
+         +wscbase*escbase&
+         +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho &
+         + wcatnucl*ecation_nucl
+
+!        eprim=ftprim(1)*(ft(6)*evdw_t+evdw)
+!!     &            +ftprim(6)*evdw_t
+!     &    +ftprim(1)*wscp*evdw2
+!     &    +ftprim(1)*welec*ees
+!     &    +ftprim(1)*wvdwpp*evdw1
+!     &    +ftprim(1)*wtor*etors+
+!     &    ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+
+!     &    ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+
+!     &    ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eello_turn6+
+!     &    ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+
+!     &    ftprim(1)*wsccor*esccor
+
+!        ebis=ftbis(1)*wsc*(evdw+ft(6)*evdw_t)
+!     &    +ftbis(1)*wscp*evdw2+
+!     &    ftbis(1)*welec*ees
+!     &    +ftbis(1)*wvdwpp*evdw
+!     &    +ftbis(1)*wtor*etors+
+!     &    ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+
+!     &    ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+
+!     &    ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eello_turn6+
+!     &    ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+
+!     &    ftbis(1)*wsccor*esccor
+
+            eprim=ftprim(6)*evdw_t+ftprim(1)*welec*(ees+evdw1) &
+                +ftprim(1)*wtor*etors+ &
+                 ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+ &
+                 ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+ &
+                 ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eello_turn6+ &
+                 ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+ &
+                 ftprim(1)*wsccor*esccor+ftprim(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftprim(2)*etors_d_nucl+ftprim(1)*wpepbase*epepbase
+            ebis=ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+ &
+                 ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+ &
+                 ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+ &
+                 ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eello_turn6+ &
+                 ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+ &
+                 ftbis(1)*wsccor*esccor+ftbis(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftbis(2)*etors_d_nucl*ftbis(1)*wpepbase*epepbase
+
+
+
+      else
+        etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2+ft(1)*welec*ees &
+         +wvdwpp*evdw1 &
+         +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!c    &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+         +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+         +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+         +ft(2)*wturn3*eello_turn3 &
+         +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc &
+         +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+         +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation&
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho&
+            + wcatnucl*ecation_nucl
+
+
+            eprim=ftprim(6)*evdw_t+ftprim(1)*welec*(ees+evdw1) &
+                +ftprim(1)*wtor*etors+ &
+                 ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+ &
+                 ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+ &
+                 ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eello_turn6+ &
+                 ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+ &
+                 ftprim(1)*wsccor*esccor+ftprim(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftprim(2)*etors_d_nucl+ftprim(1)*wpepbase*epepbase
+            ebis=ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+ &
+                 ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+ &
+                 ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+ &
+                 ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eello_turn6+ &
+                 ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+ &
+                 ftbis(1)*wsccor*esccor+ftbis(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftbis(2)*etors_d_nucl*ftbis(1)*wpepbase*epepbase
+
+
+
+!       eprim=ftprim(6)*evdw_t+ftprim(1)*welec*ees
+!    &    +ftprim(1)*wtor*etors+
+!    &    ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+
+!    &    ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+
+!    &    ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eello_turn6+
+!    &    ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+
+!    &    ftprim(1)*wsccor*esccor
+!       ebis=ftbis(1)*welec*ees+ftbis(1)*wtor*etors+
+!    &    ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+
+!    &    ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+
+!    &    ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eello_turn6+
+!    &    ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+
+!    &    ftbis(1)*wsccor*esccor
+      endif
+#else
+      if (shield_mode.gt.0) then
+        etot=ft(1)*wsc*(evdw+ft(6)*evdw_t)+ft(1)*wscp*evdw2 &
+         +ft(1)*welec*(ees+evdw1) &
+         +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!c    &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+         +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+         +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+         +ft(2)*wturn3*eello_turn3 &
+         +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc+edihcnstr &
+         +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+         +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation&
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho&
+            + wcatnucl*ecation_nucl
+
+
+            eprim=ftprim(6)*evdw_t+ftprim(1)*welec*(ees+evdw1) &
+                +ftprim(1)*wtor*etors+ &
+                 ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+ &
+                 ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+ &
+                 ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eello_turn6+ &
+                 ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+ &
+                 ftprim(1)*wsccor*esccor+ftprim(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftprim(2)*etors_d_nucl+ftprim(1)*wpepbase*epepbase
+            ebis=ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+ &
+                 ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+ &
+                 ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+ &
+                 ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eello_turn6+ &
+                 ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+ &
+                 ftbis(1)*wsccor*esccor+ftbis(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftbis(2)*etors_d_nucl*ftbis(1)*wpepbase*epepbase
+
+
+
+
+!       eprim=ftprim(1)*(evdw+ft(6)*evdw_t)
+!    &    +ftprim(1)*welec*(ees+evdw1)
+!    &    +ftprim(1)*wtor*etors+
+!    &     ftprim(1)*wscp*evdw2+
+!    &     ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+
+!    &     ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+
+!    &     ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eello_turn6+
+!    &     ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+
+!    &     ftprim(1)*wsccor*esccor
+!      ebis= ftbis(1)*(evdw+ft(6)*evdw_t)
+!    &    +ftbis(1)*wscp*evdw2
+!    &    +ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+
+!    &     ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+
+!    &     ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+
+!    &     ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eello_turn6+
+!    &     ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+
+!    &     ftprim(1)*wsccor*esccor
+      else
+        etot=wsc*(evdw+ft(6)*evdw_t)+wscp*evdw2 &
+         +ft(1)*welec*(ees+evdw1) &
+         +wang*ebe+ft(1)*wtor*etors+wscloc*escloc &
+!c    &    +wstrain*ehpb+nss*ebr+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5
+         +wstrain*ehpb+ft(3)*wcorr*ecorr+ft(4)*wcorr5*ecorr5 &
+         +ft(5)*wcorr6*ecorr6+ft(3)*wturn4*eello_turn4 &
+         +ft(2)*wturn3*eello_turn3 &
+         +ft(5)*wturn6*eello_turn6+ft(2)*wel_loc*eel_loc+edihcnstr &
+         +ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
+         +wbond*estr+wcatprot*ecation_prot+wcatcat*ecationcation& 
+            +wbond_nucl*estr_nucl+wang_nucl*ebe_nucl&
+            +wvdwpp_nucl*evdwpp+welpp*eespp+wvdwpsb*evdwpsb+welpsb*eelpsb&
+            +wvdwsb*evdwsb+welsb*eelsb+wsbloc*esbloc+wtor_nucl*etors_nucl&
+            *ft(1)+wtor_d_nucl*ft(2)*etors_d_nucl+wcorr_nucl*ecorr_nucl &
+            +wcorr3_nucl*ecorr3_nucl&
+            +wscbase*escbase&
+            +ft(1)*wpepbase*epepbase+wscpho*escpho+wpeppho*epeppho&
+            + wcatnucl*ecation_nucl
+
+
+            eprim=ftprim(6)*evdw_t+ftprim(1)*welec*(ees+evdw1) &
+                +ftprim(1)*wtor*etors+ &
+                 ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+ &
+                 ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+ &
+                 ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eello_turn6+ &
+                 ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+ &
+                 ftprim(1)*wsccor*esccor+ftprim(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftprim(2)*etors_d_nucl+ftprim(1)*wpepbase*epepbase
+            ebis=ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+ &
+                 ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+ &
+                 ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+ &
+                 ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eello_turn6+ &
+                 ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+ &
+                 ftbis(1)*wsccor*esccor+ftbis(1)*wtor_nucl*etors_nucl&
+                 +wtor_d_nucl*ftbis(2)*etors_d_nucl*ftbis(1)*wpepbase*epepbase
+
+
+
+
+
+!       eprim=ftprim(6)*evdw_t+ftprim(1)*welec*(ees+evdw1)
+!    &    +ftprim(1)*wtor*etors+
+!    &     ftprim(3)*wcorr*ecorr+ftprim(4)*wcorr5*ecorr5+
+!    &     ftprim(5)*wcorr6*ecorr6+ftprim(3)*wturn4*eello_turn4+
+!    &     ftprim(2)*wturn3*eello_turn3+ftprim(5)*wturn6*eello_turn6+
+!    &     ftprim(2)*wel_loc*eel_loc+ftprim(2)*wtor_d*etors_d+
+!    &     ftprim(1)*wsccor*esccor
+!       ebis=ftbis(1)*welec*(ees+evdw1)+ftbis(1)*wtor*etors+
+!    &     ftbis(3)*wcorr*ecorr+ftbis(4)*wcorr5*ecorr5+
+!    &     ftbis(5)*wcorr6*ecorr6+ftbis(3)*wturn4*eello_turn4+
+!    &     ftbis(2)*wturn3*eello_turn3+ftbis(5)*wturn6*eello_turn6+
+!    &     ftbis(2)*wel_loc*eel_loc+ftbis(2)*wtor_d*etors_d+
+!    &     ftprim(1)*wsccor*esccor
+      endif
+#endif
+
+            weight=dexp(-betaT*(etot-potEmin)+entfac(t)-weimax(k,iparm))
+#ifdef DEBUG
+            write (iout,*) "iparm",iparm," t",t," betaT",betaT, &
+             " etot",etot," entfac",entfac(t)," boltz", &
+             -betaT*(etot-potEmin)+entfac(t)," weimax",weimax(k,iparm), &
+             " weight",weight," ebis",ebis
+#endif
+            etot=etot-temper*eprim
+#ifdef MPI
+            sumW_p(k,iparm)=sumW_p(k,iparm)+weight
+            sumE_p(k,iparm)=sumE_p(k,iparm)+etot*weight
+            sumEbis_p(k,iparm)=sumEbis_p(k,iparm)+ebis*weight
+            sumEsq_p(k,iparm)=sumEsq_p(k,iparm)+etot**2*weight
+            do j=1,nQ+2
+              sumQ_p(j,k,iparm)=sumQ_p(j,k,iparm)+q(j,t)*weight
+              sumQsq_p(j,k,iparm)=sumQsq_p(j,k,iparm)+q(j,t)**2*weight
+              sumEQ_p(j,k,iparm)=sumEQ_p(j,k,iparm) &
+              +etot*q(j,t)*weight
+            enddo
+#else
+            sumW(k,iparm)=sumW(k,iparm)+weight
+            sumE(k,iparm)=sumE(k,iparm)+etot*weight
+            sumEbis(k,iparm)=sumEbis(k,iparm)+ebis*weight
+            sumEsq(k,iparm)=sumEsq(k,iparm)+etot**2*weight
+            do j=1,nQ+2
+              sumQ(j,k,iparm)=sumQ(j,k,iparm)+q(j,t)*weight
+              sumQsq(j,k,iparm)=sumQsq(j,k,iparm)+q(j,t)**2*weight
+              sumEQ(j,k,iparm)=sumEQ(j,k,iparm) &
+              +etot*q(j,t)*weight
+            enddo
+#endif
+          enddo ! t
+        enddo ! k
+
         do ib=1,nT_h(iparm)
           if (histout) call MPI_Reduce(hfin_p(0,ib),hfin(0,ib),nbin,&
           MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
         write (iout,'(a,i3)') "Parameter set",iparm
       endif
       do i=0,NGridT
+        betaT=1.0d0/(1.987D-3*(startGridT+i*delta_T))
+        if (betaT.ge.beta_h(1,iparm)) then
+          potEmin=potEmin_all(1,iparm)
+        else if (betaT.lt.beta_h(nT_h(iparm),iparm)) then
+          potEmin=potEmin_all(nT_h(iparm),iparm)
+        else
+          do l=1,nT_h(iparm)-1
+            if (betaT.le.beta_h(l,iparm) .and. &
+               betaT.gt.beta_h(l+1,iparm)) then
+              potEmin=potEmin_all(l,iparm)
+              exit
+            endif
+          enddo
+        endif
+
         sumE(i,iparm)=sumE(i,iparm)/sumW(i,iparm)
         sumEbis(i,iparm)=(startGridT+i*delta_T)*sumEbis(i,iparm)/ &
           sumW(i,iparm)