rename
[unres4.git] / source / wham / wham_calc.f90
diff --git a/source/wham/wham_calc.f90 b/source/wham/wham_calc.f90
deleted file mode 100644 (file)
index 08e166c..0000000
+++ /dev/null
@@ -1,1259 +0,0 @@
-      module wham_calc
-!-----------------------------------------------------------------------------
-      use io_units
-      use wham_data
-!
-      use ene_calc
-#ifdef MPI
-      use MPI_data
-!      include "COMMON.MPI"
-#endif
-      implicit none
-!-----------------------------------------------------------------------------
-!
-!
-!-----------------------------------------------------------------------------
-      contains
-!-----------------------------------------------------------------------------
-
-      subroutine WHAMCALC(islice,*)
-! Weighed Histogram Analysis Method (WHAM) code
-! Written by A. Liwo based on the work of Kumar et al., 
-! J.Comput.Chem., 13, 1011 (1992)
-!
-! 2/1/05 Multiple temperatures allowed.
-! 2/2/05 Free energies calculated directly from data points
-!  acc. to Eq. (21) of Kumar et al.; final histograms also
-!  constructed based on this equation.
-! 2/12/05 Multiple parameter sets included
-!
-! 2/2/05 Parallel version
-!      use wham_data
-!      use io_units
-      use names
-      use io_base, only:ilen
-      use energy_data
-#ifdef MPI
-      include "mpif.h"
-#endif
-!      include "DIMENSIONS"
-!      include "DIMENSIONS.ZSCOPT"
-!      include "DIMENSIONS.FREE"
-      integer,parameter :: NGridT=400
-      integer,parameter :: MaxBinRms=100,MaxBinRgy=100
-      integer,parameter :: MaxHdim=200
-!      parameter (MaxHdim=200000)
-      integer,parameter :: maxinde=200
-#ifdef MPI
-      integer :: ierror,errcode,status(MPI_STATUS_SIZE) 
-#endif
-!      include "COMMON.CONTROL"
-!      include "COMMON.IOUNITS"
-!      include "COMMON.FREE"
-!      include "COMMON.ENERGIES"
-!      include "COMMON.FFIELD"
-!      include "COMMON.SBRIDGE"
-!      include "COMMON.PROT"
-!      include "COMMON.ENEPS"
-      integer,parameter :: MaxPoint=MaxStr,&
-              MaxPointProc=MaxStr_Proc
-      real(kind=8),parameter :: finorm_max=1.0d0
-      real(kind=8) :: potfac,entmin,entmax,expfac,vf
-      integer :: islice
-      integer :: i,ii,j,jj,k,kk,l,m,ind,iter,t,tmax,ient,ientmax,iln
-      integer :: start,end,iharm,ib,iib,nbin1,nbin,nbin_rms,nbin_rgy,&
-              nbin_rmsrgy,liczbaW,iparm,nFi,indrgy,indrms
-      integer :: htot(0:MaxHdim),histent(0:2000)
-      real(kind=8) :: v(MaxPointProc,MaxR,MaxT_h,nParmSet)  !(MaxPointProc,MaxR,MaxT_h,Max_Parm)
-      real(kind=8) :: energia(0:n_ene)
-!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),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)
-      real(kind=8) :: rgymin_t,rmsmin_t,rgymax_t,rmsmax_t
-      real(kind=8) :: potEmin_t,entmin_p,entmax_p
-      integer :: histent_p(0:2000)
-      logical :: lprint=.true.
-#endif
-      real(kind=8) :: delta_T=1.0d0,iientmax
-      real(kind=8) :: rgymin,rmsmin,rgymax,rmsmax
-      real(kind=8),dimension(0:nGridT,nParmSet) :: sumW,sumE,&
-              sumEsq,sumEprim,sumEbis !(0:NGridT,Max_Parm)
-      real(kind=8),dimension(MaxQ1,0:nGridT,nParmSet) :: sumQ,&
-              sumQsq,sumEQ !(MaxQ1,0:NGridT,Max_Parm)
-      real(kind=8) :: betaT,weight,econstr
-      real(kind=8) :: fi(MaxR,MaxT_h,nParmSet),& !(MaxR,maxT_h,Max_Parm)
-              ddW,dd1,dd2,hh,dmin,denom,finorm,avefi,pom,&
-              hfin(0:MaxHdim,maxT_h),histE(0:maxindE),&
-              hrmsrgy(0:MaxBinRgy,0:MaxBinRms,maxT_h),&
-              potEmin,ent,&
-              hfin_ent(0:MaxHdim),vmax,aux
-      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
-
-      integer :: ind_point(maxpoint),upindE,indE
-      character(len=16) :: plik
-      character(len=1) :: licz1
-      character(len=2) :: licz2
-      character(len=3) :: licz3
-      character(len=128) :: nazwa
-!      integer ilen
-!      external ilen
-!el      ientmax=0
-!el      ent=0.0d0 
-      write(licz2,'(bz,i2.2)') islice
-      nbin1 = 1.0d0/delta
-      write (iout,'(//80(1h-)/"Solving WHAM equations for slice",&
-        i2/80(1h-)//)') islice
-      write (iout,*) "delta",delta," nbin1",nbin1
-      write (iout,*) "MaxN",MaxN," MaxQ",MaxQ," MaHdim",MaxHdim
-      call flush(iout)
-      dmin=0.0d0
-      tmax=0
-      potEmin=1.0d10
-      rgymin=1.0d10
-      rmsmin=1.0d10
-      rgymax=0.0d0
-      rmsmax=0.0d0
-      do t=0,MaxN
-        htot(t)=0
-      enddo
-#ifdef MPI
-      do i=1,scount(me1)
-#else
-      do i=1,ntot(islice)
-#endif
-        do j=1,nParmSet
-          if (potE(i,j).le.potEmin) potEmin=potE(i,j)
-        enddo
-        if (q(nQ+1,i).lt.rmsmin) rmsmin=q(nQ+1,i)
-        if (q(nQ+1,i).gt.rmsmax) rmsmax=q(nQ+1,i)
-        if (q(nQ+2,i).lt.rgymin) rgymin=q(nQ+2,i)
-        if (q(nQ+2,i).gt.rgymax) rgymax=q(nQ+2,i)
-        ind_point(i)=0
-        do j=nQ,1,-1
-          ind=(q(j,i)-dmin+1.0d-8)/delta
-          if (j.eq.1) then
-            ind_point(i)=ind_point(i)+ind
-          else 
-            ind_point(i)=ind_point(i)+nbin1**(j-1)*ind
-          endif
-!          write (iout,*) "i",i," j",j," q",q(j,i)," ind_point",
-!     &      ind_point(i)
-          call flush(iout)
-          if (ind_point(i).lt.0 .or. ind_point(i).gt.MaxHdim) then
-            write (iout,*) "Error - index exceeds range for point",i,&
-            " q=",q(j,i)," ind",ind_point(i)
-#ifdef MPI 
-            write (iout,*) "Processor",me1
-            call flush(iout)
-            call MPI_Abort(MPI_COMM_WORLD, Ierror, Errcode )
-#endif
-            stop
-          endif
-        enddo ! j
-        if (ind_point(i).gt.tmax) tmax=ind_point(i)
-        htot(ind_point(i))=htot(ind_point(i))+1
-#ifdef DEBUG
-        write (iout,*) "i",i,"q",(q(j,i),j=1,nQ)," ind",ind_point(i),&
-         " htot",htot(ind_point(i))
-        call flush(iout)
-#endif
-      enddo ! i
-      call flush(iout)
-
-      nbin=nbin1**nQ-1
-      write (iout,'(a)') "Numbers of counts in Q bins"
-      do t=0,tmax
-        if (htot(t).gt.0) then
-        write (iout,'(i15,$)') t
-        liczbaW=t
-        do j=1,nQ
-          jj = mod(liczbaW,nbin1)
-          liczbaW=liczbaW/nbin1
-          write (iout,'(i5,$)') jj
-        enddo
-        write (iout,'(i8)') htot(t)
-        endif
-      enddo
-      do iparm=1,nParmSet
-      write (iout,'(a,i3)') "Number of data points for parameter set",&
-       iparm
-      write (iout,'(i7,$)') ((snk(m,ib,iparm,islice),m=1,nr(ib,iparm)),&
-       ib=1,nT_h(iparm))
-      write (iout,'(i8)') stot(islice)
-      write (iout,'(a)')
-      enddo
-      call flush(iout)
-
-#ifdef MPI
-      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(rmsmin,rmsmin_t,1,MPI_DOUBLE_PRECISION,&
-        MPI_MIN,WHAM_COMM,IERROR)
-      call MPI_AllReduce(rmsmax,rmsmax_t,1,MPI_DOUBLE_PRECISION,&
-        MPI_MAX,WHAM_COMM,IERROR)
-      call MPI_AllReduce(rgymin,rgymin_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
-      rgymin=rgymin_t
-      rgymax=rgymax_t
-      rmsmin=rmsmin_t
-      rmsmax=rmsmax_t
-      write (iout,*) "potEmin",potEmin
-#endif
-      rmsmin=deltrms*dint(rmsmin/deltrms)
-      rmsmax=deltrms*dint(rmsmax/deltrms)
-      rgymin=deltrms*dint(rgymin/deltrgy)
-      rgymax=deltrms*dint(rgymax/deltrgy)
-      nbin_rms=(rmsmax-rmsmin)/deltrms
-      nbin_rgy=(rgymax-rgymin)/deltrgy
-      write (iout,*) "rmsmin",rmsmin," rmsmax",rmsmax," rgymin",rgymin,&
-       " rgymax",rgymax," nbin_rms",nbin_rms," nbin_rgy",nbin_rgy
-      nFi=0
-      do i=1,nParmSet
-        do j=1,nT_h(i)
-          nFi=nFi+nR(j,i)
-        enddo
-      enddo
-      write (iout,*) "nFi",nFi
-! Compute the Boltzmann factor corresponing to restrain potentials in different
-! simulations.
-#ifdef MPI
-      do i=1,scount(me1)
-#else
-      do i=1,ntot(islice)
-#endif
-!        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,21)
-!#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)
-!el old rascale weights
-!
-!            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
-!              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_modeW
-!              call flush(iout)
-!              return 1
-!            endif
-! el end old rescale weights
-            call rescale_weights(1.0d0/(beta_h(ib,iparm)*1.987D-3))
-  
-!            call etot(enetb(0,i,iparm)) 
-            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)
-#ifdef DEBUG
-            write (iout,'(3i5,6f5.2,14f12.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
-#endif
-
-!#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+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(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
-!            +wbond*estr
-!#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 &
-!            +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(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
-!            +wbond*estr
-!#endif
-
-#ifdef SPLITELE
-            etot=wsc*evdw+wscp*evdw2+welec*ees &
-            +wvdwpp*evdw1 &
-            +wang*ebe+wtor*etors+wscloc*escloc &
-            +wstrain*ehpb+nss*ebr+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
-#else
-            etot=wsc*evdw+wscp*evdw2 &
-            +welec*(ees+evdw1) &
-            +wang*ebe+wtor*etors+wscloc*escloc &
-            +wstrain*ehpb+nss*ebr+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
-#endif
-
-#ifdef DEBUG
-            write (iout,*) i,iparm,1.0d0/(beta_h(ib,iparm)*1.987D-3),&
-              etot,potEmin
-#endif
-#ifdef DEBUG
-            if (iparm.eq.1 .and. ib.eq.1) then
-            write (iout,*)"Conformation",i
-            energia(0)=etot
-            do k=1,max_ene
-              energia(k)=enetb(k,i,iparm)
-            enddo
-!            call enerprint(energia(0),fT)
-            call enerprint(energia(0))
-            endif
-#endif
-            do kk=1,nR(ib,iparm)
-              Econstr=0.0d0
-              do j=1,nQ
-                ddW = q(j,i)
-                Econstr=Econstr+Kh(j,kk,ib,iparm) &
-                 *(ddW-q0(j,kk,ib,iparm))**2
-              enddo
-              v(i,kk,ib,iparm)= &
-                -beta_h(ib,iparm)*(etot-potEmin+Econstr)
-#ifdef DEBUG
-              write (iout,'(4i5,4e15.5)') i,kk,ib,iparm,&
-               etot,potEmin,etot-potEmin,v(i,kk,ib,iparm)
-#endif
-            enddo ! kk
-          enddo   ! ib
-        enddo     ! iparm
-      enddo       ! i
-! Simple iteration to calculate free energies corresponding to all simulation
-! runs.
-      do iter=1,maxit 
-        
-! Compute new free-energy values corresponding to the righ-hand side of the 
-! equation and their derivatives.
-        write (iout,*) "------------------------fi"
-#ifdef MPI
-        do t=1,scount(me1)
-#else
-        do t=1,ntot(islice)
-#endif
-          vmax=-1.0d+20
-          do i=1,nParmSet
-            do k=1,nT_h(i)
-              do l=1,nR(k,i)
-                vf=v(t,l,k,i)+f(l,k,i)
-                if (vf.gt.vmax) vmax=vf
-              enddo
-            enddo
-          enddo        
-          denom=0.0d0
-          do i=1,nParmSet
-            do k=1,nT_h(i)
-              do l=1,nR(k,i)
-                aux=f(l,k,i)+v(t,l,k,i)-vmax
-                if (aux.gt.-200.0d0) &
-                denom=denom+snk(l,k,i,islice)*dexp(aux)
-              enddo
-            enddo
-          enddo
-          entfac(t)=-dlog(denom)-vmax
-#ifdef DEBUG
-          write (iout,*) t,"vmax",vmax," denom",denom,"entfac",entfac(t)
-#endif
-        enddo
-        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))
-#ifdef DEBUG
-              write (iout,'(4i5,3e15.5)') t,ii,iib,iparm,&
-               v(t,ii,iib,iparm),entfac(t),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))
-              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))
-          enddo
-        enddo
-#endif
-        write (iout,*) "REDUCE size",maxR,MaxT_h,nParmSet,&
-         maxR*MaxT_h*nParmSet
-        write (iout,*) "MPI_COMM_WORLD",MPI_COMM_WORLD,&
-         " WHAM_COMM",WHAM_COMM
-        call MPI_Reduce(fi_p(1,1,1),fi(1,1,1),maxR*MaxT_h*nParmSet,&
-         MPI_DOUBLE_PRECISION,&
-         MPI_SUM,Master,WHAM_COMM,IERROR)
-#ifdef DEBUG
-        write (iout,*) "fi after MPI_Reduce nparmset",nparmset
-        do iparm=1,nParmSet
-          write (iout,*) "iparm",iparm
-          do ib=1,nT_h(iparm)
-            write (iout,*) "beta=",beta_h(ib,iparm)
-            write (iout,'(8e15.5)') (fi(i,ib,iparm),i=1,nR(ib,iparm))
-          enddo
-        enddo
-#endif
-        if (me1.eq.Master) then
-#endif
-        avefi=0.0d0
-        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))
-              avefi=avefi+fi(i,ib,iparm)
-            enddo
-          enddo
-        enddo
-        avefi=avefi/nFi
-        do iparm=1,nParmSet
-          write (iout,*) "Parameter set",iparm
-          do ib =1,nT_h(iparm)
-            write (iout,*) "beta=",beta_h(ib,iparm)
-            do i=1,nR(ib,iparm)
-              fi(i,ib,iparm)=fi(i,ib,iparm)-avefi
-            enddo
-            write (iout,'(8f10.5)') (fi(i,ib,iparm),i=1,nR(ib,iparm))
-            write (iout,'(8f10.5)') (f(i,ib,iparm),i=1,nR(ib,iparm))
-          enddo
-        enddo
-
-! Compute the norm of free-energy increments.
-        finorm=0.0d0
-        do iparm=1,nParmSet
-          do ib=1,nT_h(iparm)
-            do i=1,nR(ib,iparm)
-              finorm=finorm+dabs(fi(i,ib,iparm)-f(i,ib,iparm))
-              f(i,ib,iparm)=fi(i,ib,iparm)
-            enddo  
-          enddo
-        enddo
-
-        write (iout,*) 'Iteration',iter,' finorm',finorm
-
-#ifdef MPI
-        endif
-        call MPI_Bcast(f(1,1,1),MaxR*MaxT_h*nParmSet,&
-         MPI_DOUBLE_PRECISION,Master,&
-         WHAM_COMM,IERROR)
-        call MPI_Bcast(finorm,1,MPI_DOUBLE_PRECISION,Master,&
-         WHAM_COMM,IERROR)
-#endif
-! Exit, if the increment norm is smaller than pre-assigned tolerance.
-        if (finorm.lt.fimin) then
-          write (iout,*) 'Iteration converged'
-          goto 20
-        endif
-
-      enddo ! iter
-
-   20 continue
-! Now, put together the histograms from all simulations, in order to get the
-! unbiased total histogram.
-#ifdef MPI
-      do t=0,tmax
-        hfin_ent_p(t)=0.0d0
-      enddo
-#else
-      do t=0,tmax
-        hfin_ent(t)=0.0d0
-      enddo
-#endif
-      write (iout,*) "--------------hist"
-#ifdef MPI
-      do iparm=1,nParmSet
-        do i=0,nGridT
-          sumW_p(i,iparm)=0.0d0
-          sumE_p(i,iparm)=0.0d0
-          sumEbis_p(i,iparm)=0.0d0
-          sumEsq_p(i,iparm)=0.0d0
-          do j=1,nQ+2
-            sumQ_p(j,i,iparm)=0.0d0
-            sumQsq_p(j,i,iparm)=0.0d0
-            sumEQ_p(j,i,iparm)=0.0d0
-          enddo
-        enddo
-      enddo
-      upindE_p=0
-#else
-      do iparm=1,nParmSet
-        do i=0,nGridT
-          sumW(i,iparm)=0.0d0
-          sumE(i,iparm)=0.0d0
-          sumEbis(i,iparm)=0.0d0
-          sumEsq(i,iparm)=0.0d0
-          do j=1,nQ+2
-            sumQ(j,i,iparm)=0.0d0
-            sumQsq(j,i,iparm)=0.0d0
-            sumEQ(j,i,iparm)=0.0d0
-          enddo
-        enddo
-      enddo
-      upindE=0
-#endif
-! 8/26/05 entropy distribution
-#ifdef MPI
-      entmin_p=1.0d10
-      entmax_p=-1.0d10
-      do t=1,scount(me1)
-!        ent=-dlog(entfac(t))
-        ent=entfac(t)
-        if (ent.lt.entmin_p) entmin_p=ent
-        if (ent.gt.entmax_p) entmax_p=ent
-      enddo
-      write (iout,*) "entmin",entmin_p," entmax",entmax_p
-!      write (iout,*) "entmin_p",entmin_p," entmax_p",entmax_p
-      call flush(iout)
-      call MPI_Allreduce(entmin_p,entmin,1,MPI_DOUBLE_PRECISION,MPI_MIN,&
-        WHAM_COMM,IERROR)
-      call MPI_Allreduce(entmax_p,entmax,1,MPI_DOUBLE_PRECISION,MPI_MAX,&
-        WHAM_COMM,IERROR)
-      write (iout,*) "entmin",entmin_p," entmax",entmax_p
-!      write (iout,*) "entmin_p",entmin_p," entmax_p",entmax_p
-      ientmax=entmax-entmin 
-!iientmax=entmax-entmin !el
-!write (iout,*) "ientmax",ientmax,entmax,entmin 
-!write (iout,*) "iientmax",iientmax
-      if (ientmax.gt.2000) ientmax=2000
-      write (iout,*) "entmin",entmin," entmax",entmax," ientmax",ientmax
-      call flush(iout)
-      do t=1,scount(me1)
-!        ient=-dlog(entfac(t))-entmin
-        ient=entfac(t)-entmin
-        if (ient.le.2000) histent_p(ient)=histent_p(ient)+1
-      enddo
-      call MPI_Allreduce(histent_p(0),histent(0),ientmax+1,MPI_INTEGER,&
-        MPI_SUM,WHAM_COMM,IERROR)
-      if (me1.eq.Master) then
-        write (iout,*) "Entropy histogram"
-        do i=0,ientmax
-          write(iout,'(f15.4,i10)') entmin+i,histent(i)
-        enddo
-      endif
-#else
-      entmin=1.0d10
-      entmax=-1.0d10
-      do t=1,ntot(islice)
-        ent=entfac(t)
-        if (ent.lt.entmin) entmin=ent
-        if (ent.gt.entmax) entmax=ent
-      enddo
-      ientmax=-dlog(entmax)-entmin
-      if (ientmax.gt.2000) ientmax=2000
-      do t=1,ntot(islice)
-        ient=entfac(t)-entmin
-        if (ient.le.2000) histent(ient)=histent(ient)+1
-      enddo
-      write (iout,*) "Entropy histogram"
-      do i=0,ientmax
-        write(iout,'(2f15.4)') entmin+i,histent(i)
-      enddo
-#endif
-      
-#ifdef MPI
-      write (iout,*) "me1",me1," scount",scount(me1) !d
-
-      do iparm=1,nParmSet
-
-#ifdef MPI
-        do ib=1,nT_h(iparm)
-          do t=0,tmax
-            hfin_p(t,ib)=0.0d0
-          enddo
-        enddo
-        do i=1,maxindE
-          histE_p(i)=0.0d0
-        enddo
-#else
-        do ib=1,nT_h(iparm)
-          do t=0,tmax
-            hfin(t,ib)=0.0d0
-          enddo
-        enddo
-        do i=1,maxindE
-          histE(i)=0.0d0
-        enddo
-#endif
-        do ib=1,nT_h(iparm)
-          do i=0,MaxBinRms
-            do j=0,MaxBinRgy
-              hrmsrgy(j,i,ib)=0.0d0
-#ifdef MPI
-              hrmsrgy_p(j,i,ib)=0.0d0
-#endif
-            enddo
-          enddo
-        enddo
-
-        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)') "debug",t,t,(enetb(k,t,iparm),k=1,21)
-          call restore_parm(iparm)
-!          evdw=enetb(21,t,iparm)
-          evdw=enetb(20,t,iparm)
-          evdw_t=enetb(1,t,iparm)
-#ifdef SCP14
-!          evdw2_14=enetb(17,t,iparm)
-          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(18,t,iparm)
-          estr=enetb(17,t,iparm)
-!          esccor=enetb(19,t,iparm)
-          esccor=enetb(21,t,iparm)
-!          edihcnstr=enetb(20,t,iparm)
-          edihcnstr=enetb(19,t,iparm)
-          edihcnstr=0.0d0
-          do k=0,nGridT
-            betaT=startGridT+k*delta_T
-            temper=betaT
-!write(iout,*)"kkkkkkkk",betaT,startGridT,k,delta_T
-!d            fT=T0/betaT
-!d            ft=2*T0/(T0+betaT)
-            if (rescale_modeW.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_modeW.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_modeW.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_modeW
-              call flush(iout)
-              return 1
-            endif
-!            write (iout,*) "ftprim",ftprim
-!            write (iout,*) "ftbis",ftbis
-            betaT=1.0d0/(1.987D-3*betaT)
-#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+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*eello_turn6+ft(2)*wel_loc*eel_loc &
-            +edihcnstr+ft(2)*wtor_d*etors_d+ft(1)*wsccor*esccor &
-            +wbond*estr
-            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
-#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 &
-            +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
-            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
-            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
-            if (indE.gt.upindE_p) upindE_p=indE
-            histE_p(indE)=histE_p(indE)+dexp(-entfac(t))
-          endif
-#ifdef MPI
-          do ib=1,nT_h(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))
-             if (rmsrgymap) then
-               indrgy=dint((q(nQ+2,t)-rgymin)/deltrgy) 
-               indrms=dint((q(nQ+1,t)-rmsmin)/deltrms)
-               hrmsrgy_p(indrgy,indrms,ib)= &
-                 hrmsrgy_p(indrgy,indrms,ib)+expfac
-             endif
-          enddo
-#else
-          do ib=1,nT_h(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))
-             if (rmsrgymap) then
-               indrgy=dint((q(nQ+2,t)-rgymin)/deltrgy)
-               indrms=dint((q(nQ+1,t)-rmsmin)/deltrms)
-               hrmsrgy(indrgy,indrms,ib)= &
-                 hrmsrgy(indrgy,indrms,ib)+expfac
-             endif
-          enddo
-#endif
-        enddo ! t
-        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)
-          if (rmsrgymap) then
-          call MPI_Reduce(hrmsrgy_p(0,0,ib),hrmsrgy(0,0,ib),&
-         (MaxBinRgy+1)*(nbin_rms+1),MPI_DOUBLE_PRECISION,MPI_SUM,Master,&
-             WHAM_COMM,IERROR)
-          endif
-        enddo
-        call MPI_Reduce(upindE_p,upindE,1,&
-          MPI_INTEGER,MPI_MAX,Master,WHAM_COMM,IERROR)
-        call MPI_Reduce(histE_p(0),histE(0),maxindE,&
-          MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
-
-        if (me1.eq.master) then
-
-        if (histout) then
-
-        write (iout,'(6x,$)')
-        write (iout,'(f20.2,$)') (1.0d0/(1.987D-3*beta_h(ib,iparm)),&
-         ib=1,nT_h(iparm))
-        write (iout,*)
-
-        write (iout,'(/a)') 'Final histograms'
-        if (histfile) then
-          if (nslice.eq.1) then
-            if (separate_parset) then
-              write(licz3,"(bz,i3.3)") myparm
-              histname=prefix(:ilen(prefix))//'_par'//licz3//'.hist'
-            else
-              histname=prefix(:ilen(prefix))//'.hist'
-            endif
-          else
-            if (separate_parset) then
-              write(licz3,"(bz,i3.3)") myparm
-              histname=prefix(:ilen(prefix))//'_par'//licz3// &
-               '_slice_'//licz2//'.hist'
-            else
-              histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.hist'
-            endif
-          endif
-#if defined(AIX) || defined(PGI)
-          open (ihist,file=histname,position='append')
-#else
-          open (ihist,file=histname,access='append')
-#endif
-        endif
-
-        do t=0,tmax
-          liczbaW=t
-          sumH=0.0d0
-          do ib=1,nT_h(iparm)
-            sumH=sumH+hfin(t,ib)
-          enddo
-          if (sumH.gt.0.0d0) then
-            do j=1,nQ
-              jj = mod(liczbaW,nbin1)
-              liczbaW=liczbaW/nbin1
-              write (iout,'(f6.3,$)') dmin+(jj+0.5d0)*delta
-              if (histfile) &
-                 write (ihist,'(f6.3,$)') dmin+(jj+0.5d0)*delta
-            enddo
-            do ib=1,nT_h(iparm)
-              write (iout,'(e20.10,$)') hfin(t,ib)
-              if (histfile) write (ihist,'(e20.10,$)') hfin(t,ib)
-            enddo
-            write (iout,'(i5)') iparm
-            if (histfile) write (ihist,'(i5)') iparm
-          endif
-        enddo
-
-        endif
-
-        if (entfile) then
-          if (nslice.eq.1) then
-            if (separate_parset) then
-              write(licz3,"(bz,i3.3)") myparm
-              histname=prefix(:ilen(prefix))//"_par"//licz3//'.ent'
-            else
-              histname=prefix(:ilen(prefix))//'.ent'
-            endif
-          else
-            if (separate_parset) then
-              write(licz3,"(bz,i3.3)") myparm
-              histname=prefix(:ilen(prefix))//'par_'//licz3// &
-                 '_slice_'//licz2//'.ent'
-            else
-              histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.ent'
-            endif
-          endif
-#if defined(AIX) || defined(PGI)
-          open (ihist,file=histname,position='append')
-#else
-          open (ihist,file=histname,access='append')
-#endif
-          write (ihist,'(a)') "# Microcanonical entropy"
-          do i=0,upindE
-            write (ihist,'(f8.0,$)') dint(potEmin)+i
-            if (histE(i).gt.0.0e0) then
-              write (ihist,'(f15.5,$)') dlog(histE(i))
-            else
-              write (ihist,'(f15.5,$)') 0.0d0
-            endif
-          enddo
-          write (ihist,*)
-          close(ihist)
-        endif
-        write (iout,*) "Microcanonical entropy"
-        do i=0,upindE
-          write (iout,'(f8.0,$)') dint(potEmin)+i
-          if (histE(i).gt.0.0e0) then
-            write (iout,'(f15.5,$)') dlog(histE(i))
-          else
-            write (iout,'(f15.5,$)') 0.0d0
-          endif
-          write (iout,*)
-        enddo
-        if (rmsrgymap) then
-          if (nslice.eq.1) then
-            if (separate_parset) then
-              write(licz3,"(bz,i3.3)") myparm
-              histname=prefix(:ilen(prefix))//'_par'//licz3//'.rmsrgy'
-            else
-              histname=prefix(:ilen(prefix))//'.rmsrgy'
-            endif
-          else
-            if (separate_parset) then
-              write(licz3,"(bz,i3.3)") myparm
-              histname=prefix(:ilen(prefix))//'_par'//licz3// &
-               '_slice_'//licz2//'.rmsrgy'
-            else
-             histname=prefix(:ilen(prefix))//'_slice_'//licz2//'.rmsrgy'
-            endif
-          endif
-#if defined(AIX) || defined(PGI)
-          open (ihist,file=histname,position='append')
-#else
-          open (ihist,file=histname,access='append')
-#endif
-          do i=0,nbin_rms
-            do j=0,nbin_rgy
-              write(ihist,'(2f8.2,$)') &
-                rgymin+deltrgy*j,rmsmin+deltrms*i
-              do ib=1,nT_h(iparm)
-                if (hrmsrgy(j,i,ib).gt.0.0d0) then
-                  write(ihist,'(e14.5,$)') &
-                    -dlog(hrmsrgy(j,i,ib))/beta_h(ib,iparm) &
-                    +potEmin
-                else
-                  write(ihist,'(e14.5,$)') 1.0d6
-                endif
-              enddo
-              write (ihist,'(i2)') iparm
-            enddo
-          enddo
-          close(ihist)
-        endif
-        endif
-      enddo ! iparm
-#ifdef MPI
-      call MPI_Reduce(hfin_ent_p(0),hfin_ent(0),nbin,&
-         MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
-      call MPI_Reduce(sumW_p(0,1),sumW(0,1),(nGridT+1)*nParmSet,&
-         MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
-      call MPI_Reduce(sumE_p(0,1),sumE(0,1),(nGridT+1)*nParmSet,&
-         MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
-      call MPI_Reduce(sumEbis_p(0,1),sumEbis(0,1),(nGridT+1)*nParmSet,&
-         MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
-      call MPI_Reduce(sumEsq_p(0,1),sumEsq(0,1),(nGridT+1)*nParmSet,&
-         MPI_DOUBLE_PRECISION,MPI_SUM,Master,WHAM_COMM,IERROR)
-      call MPI_Reduce(sumQ_p(1,0,1),sumQ(1,0,1),&
-         MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master,&
-         WHAM_COMM,IERROR)
-      call MPI_Reduce(sumQsq_p(1,0,1),sumQsq(1,0,1),&
-         MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master,&
-         WHAM_COMM,IERROR)
-      call MPI_Reduce(sumEQ_p(1,0,1),sumEQ(1,0,1),&
-         MaxQ1*(nGridT+1)*nParmSet,MPI_DOUBLE_PRECISION,MPI_SUM,Master,&
-         WHAM_COMM,IERROR)
-      if (me.eq.master) then
-#endif
-      write (iout,'(/a)') 'Thermal characteristics of folding'
-      if (nslice.eq.1) then
-        nazwa=prefix
-      else
-        nazwa=prefix(:ilen(prefix))//"_slice_"//licz2
-      endif
-      iln=ilen(nazwa)
-      if (nparmset.eq.1 .and. .not.separate_parset) then
-        nazwa=nazwa(:iln)//".thermal"
-      else if (nparmset.eq.1 .and. separate_parset) then
-        write(licz3,"(bz,i3.3)") myparm
-        nazwa=nazwa(:iln)//"_par_"//licz3//".thermal"
-      endif
-      do iparm=1,nParmSet
-      if (nparmset.gt.1) then
-        write(licz3,"(bz,i3.3)") iparm
-        nazwa=nazwa(:iln)//"_par_"//licz3//".thermal"
-      endif
-      open(34,file=nazwa)
-      if (separate_parset) then
-        write (iout,'(a,i3)') "Parameter set",myparm
-      else
-        write (iout,'(a,i3)') "Parameter set",iparm
-      endif
-      do i=0,NGridT
-        sumE(i,iparm)=sumE(i,iparm)/sumW(i,iparm)
-        sumEbis(i,iparm)=(startGridT+i*delta_T)*sumEbis(i,iparm)/ &
-          sumW(i,iparm)
-        sumEsq(i,iparm)=(sumEsq(i,iparm)/sumW(i,iparm) &
-          -sumE(i,iparm)**2)/(1.987D-3*(startGridT+i*delta_T)**2)
-        do j=1,nQ+2
-          sumQ(j,i,iparm)=sumQ(j,i,iparm)/sumW(i,iparm)
-          sumQsq(j,i,iparm)=sumQsq(j,i,iparm)/sumW(i,iparm) &
-           -sumQ(j,i,iparm)**2
-          sumEQ(j,i,iparm)=sumEQ(j,i,iparm)/sumW(i,iparm) &
-           -sumQ(j,i,iparm)*sumE(i,iparm)
-        enddo
-        sumW(i,iparm)=-dlog(sumW(i,iparm))*(1.987D-3* &
-         (startGridT+i*delta_T))+potEmin
-        write (iout,'(f7.1,2f15.5,$)') startGridT+i*delta_T,&
-         sumW(i,iparm),sumE(i,iparm)
-        write (iout,'(f10.5,$)') (sumQ(j,i,iparm),j=1,nQ+2)
-        write (iout,'(e15.5,$)') sumEsq(i,iparm)-sumEbis(i,iparm),&
-         (sumQsq(j,i,iparm),j=1,nQ+2),(sumEQ(j,i,iparm),j=1,nQ+2)
-        write (iout,*) 
-        write (34,'(f7.1,2f15.5,$)') startGridT+i*delta_T,&
-         sumW(i,iparm),sumE(i,iparm)
-        write (34,'(f10.5,$)') (sumQ(j,i,iparm),j=1,nQ+2)
-        write (34,'(e15.5,$)') sumEsq(i,iparm)-sumEbis(i,iparm),&
-         (sumQsq(j,i,iparm),j=1,nQ+2),(sumEQ(j,i,iparm),j=1,nQ+2)
-        write (34,*) 
-        call flush(34)
-      enddo
-      close(34)
-      enddo
-      if (histout) then
-      do t=0,tmax
-        if (hfin_ent(t).gt.0.0d0) then
-          liczbaW=t
-          jj = mod(liczbaW,nbin1)
-          write (iout,'(f6.3,e20.10," ent")') dmin+(jj+0.5d0)*delta,&
-           hfin_ent(t)
-          if (histfile) write (ihist,'(f6.3,e20.10," ent")') &
-            dmin+(jj+0.5d0)*delta,&
-           hfin_ent(t)
-        endif
-      enddo
-      if (histfile) close(ihist)
-      endif
-
-#ifdef ZSCORE
-! Write data for zscore
-      if (nslice.eq.1) then
-        zscname=prefix(:ilen(prefix))//".zsc"
-      else
-        zscname=prefix(:ilen(prefix))//"_slice_"//licz2//".zsc"
-      endif
-#if defined(AIX) || defined(PGI)
-      open (izsc,file=prefix(:ilen(prefix))//'.zsc',position='append')
-#else
-      open (izsc,file=prefix(:ilen(prefix))//'.zsc',access='append')
-#endif
-      write (izsc,'("NQ=",i1," NPARM=",i1)') nQ,nParmSet
-      do iparm=1,nParmSet
-        write (izsc,'("NT=",i1)') nT_h(iparm)
-      do ib=1,nT_h(iparm)
-        write (izsc,'("TEMP=",f6.1," NR=",i2," SNK=",$)') & 
-          1.0d0/(beta_h(ib,iparm)*1.987D-3),nR(ib,iparm)
-        jj = min0(nR(ib,iparm),7)
-        write (izsc,'(i8,$)') (snk(i,ib,iparm,islice),i=1,jj)
-        write (izsc,'(a1,$)') (" ",i=22+8*jj+1,79)
-        write (izsc,'("&")')
-        if (nR(ib,iparm).gt.7) then
-          do ii=8,nR(ib,iparm),9
-            jj = min0(nR(ib,iparm),ii+8)
-            write (izsc,'(i8,$)') (snk(i,ib,iparm,islice),i=ii,jj) 
-            write (izsc,'(a1,$') (" ",i=(jj-ii+1)*8+1,79)
-            write (izsc,'("&")')
-          enddo
-        endif
-        write (izsc,'("FI=",$)')
-        jj=min0(nR(ib,iparm),7)
-        write (izsc,'(f10.5,$)') (fi(i,ib,iparm),i=1,jj)
-        write (izsc,'(a1,$)') (" ",i=3+10*jj+1,79)
-        write (izsc,'("&")')
-        if (nR(ib,iparm).gt.7) then
-          do ii=8,nR(ib,iparm),9
-            jj = min0(nR(ib,iparm),ii+8)
-            write (izsc,'(f10.5,$)') (fi(i,ib,iparm),i=ii,jj) 
-            if (jj.eq.nR(ib,iparm)) then
-              write (izsc,*) 
-            else
-              write (izsc,'(a1,$)') (" ",i=10*(jj-ii+1)+1,79)
-              write (izsc,'(t80,"&")')
-            endif
-          enddo
-        endif
-        do i=1,nR(ib,iparm)
-          write (izsc,'("KH=",$)') 
-          write (izsc,'(f7.2,$)') (Kh(j,i,ib,iparm),j=1,nQ)
-          write (izsc,'(" Q0=",$)')
-          write (izsc,'(f7.5,$)') (q0(j,i,ib,iparm),j=1,nQ)
-          write (izsc,*)
-        enddo
-      enddo
-      enddo
-      close(izsc)
-#endif
-#ifdef MPI
-      endif
-#endif
-      return
-      end subroutine WHAMCALC
-!-----------------------------------------------------------------------------
-      end module wham_calc
-